const { getEmbeddingLevels, getReorderSegments, getMirroredCharacter } = require("bidi-js")()
const str = 'ימין hashem (עושה) חיל'
function logical2visual(str, dir) {
const embeddingLevels = getEmbeddingLevels(str, dir)
const arr = str.split('').map((c, i) => embeddingLevels.levels[i] & 1 ? getMirroredCharacter(c) || c : c)
for (const [start, end] of getReorderSegments(str, embeddingLevels)) {
const tempArr = arr.slice(start, end + 1)
tempArr.reverse()
for (let i = start; i <= end; i++) {
arr[i] = tempArr[i - start]
}
}
return arr.join('')
}
console.log(logical2visual(str, 'rtl')) // "ליח (השוע) hashem ןימי"