@intlayer/cli 8.1.2 → 8.1.3-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. package/dist/cjs/IntlayerEventListener.cjs +1 -186
  2. package/dist/cjs/IntlayerEventListener.cjs.map +1 -1
  3. package/dist/cjs/_virtual/_rolldown/runtime.cjs +1 -29
  4. package/dist/cjs/_virtual/_utils_asset.cjs +2 -98
  5. package/dist/cjs/auth/login.cjs +2 -85
  6. package/dist/cjs/auth/login.cjs.map +1 -1
  7. package/dist/cjs/build.cjs +1 -27
  8. package/dist/cjs/build.cjs.map +1 -1
  9. package/dist/cjs/ci.cjs +1 -73
  10. package/dist/cjs/ci.cjs.map +1 -1
  11. package/dist/cjs/cli.cjs +1 -476
  12. package/dist/cjs/cli.cjs.map +1 -1
  13. package/dist/cjs/config.cjs +1 -12
  14. package/dist/cjs/config.cjs.map +1 -1
  15. package/dist/cjs/editor.cjs +1 -50
  16. package/dist/cjs/editor.cjs.map +1 -1
  17. package/dist/cjs/extract.cjs +1 -96
  18. package/dist/cjs/extract.cjs.map +1 -1
  19. package/dist/cjs/fill/deepMergeContent.cjs +1 -27
  20. package/dist/cjs/fill/deepMergeContent.cjs.map +1 -1
  21. package/dist/cjs/fill/fill.cjs +1 -78
  22. package/dist/cjs/fill/fill.cjs.map +1 -1
  23. package/dist/cjs/fill/formatAutoFilledFilePath.cjs +1 -29
  24. package/dist/cjs/fill/formatAutoFilledFilePath.cjs.map +1 -1
  25. package/dist/cjs/fill/formatFillData.cjs +1 -50
  26. package/dist/cjs/fill/formatFillData.cjs.map +1 -1
  27. package/dist/cjs/fill/getAvailableLocalesInDictionary.cjs +1 -26
  28. package/dist/cjs/fill/getAvailableLocalesInDictionary.cjs.map +1 -1
  29. package/dist/cjs/fill/getFilterMissingContentPerLocale.cjs +1 -50
  30. package/dist/cjs/fill/getFilterMissingContentPerLocale.cjs.map +1 -1
  31. package/dist/cjs/fill/index.cjs +1 -6
  32. package/dist/cjs/fill/listTranslationsTasks.cjs +1 -70
  33. package/dist/cjs/fill/listTranslationsTasks.cjs.map +1 -1
  34. package/dist/cjs/fill/mergeChunks.cjs +1 -28
  35. package/dist/cjs/fill/mergeChunks.cjs.map +1 -1
  36. package/dist/cjs/fill/translateDictionary.cjs +1 -205
  37. package/dist/cjs/fill/translateDictionary.cjs.map +1 -1
  38. package/dist/cjs/fill/writeFill.cjs +1 -54
  39. package/dist/cjs/fill/writeFill.cjs.map +1 -1
  40. package/dist/cjs/getTargetDictionary.cjs +1 -36
  41. package/dist/cjs/getTargetDictionary.cjs.map +1 -1
  42. package/dist/cjs/index.cjs +1 -39
  43. package/dist/cjs/init.cjs +1 -322
  44. package/dist/cjs/init.cjs.map +1 -1
  45. package/dist/cjs/listContentDeclaration.cjs +1 -41
  46. package/dist/cjs/listContentDeclaration.cjs.map +1 -1
  47. package/dist/cjs/listProjects.cjs +1 -28
  48. package/dist/cjs/listProjects.cjs.map +1 -1
  49. package/dist/cjs/liveSync.cjs +8 -151
  50. package/dist/cjs/liveSync.cjs.map +1 -1
  51. package/dist/cjs/pull.cjs +1 -146
  52. package/dist/cjs/pull.cjs.map +1 -1
  53. package/dist/cjs/push/pullLog.cjs +3 -102
  54. package/dist/cjs/push/pullLog.cjs.map +1 -1
  55. package/dist/cjs/push/push.cjs +1 -206
  56. package/dist/cjs/push/push.cjs.map +1 -1
  57. package/dist/cjs/pushConfig.cjs +1 -19
  58. package/dist/cjs/pushConfig.cjs.map +1 -1
  59. package/dist/cjs/pushLog.cjs +3 -84
  60. package/dist/cjs/pushLog.cjs.map +1 -1
  61. package/dist/cjs/reviewDoc/reviewDoc.cjs +1 -68
  62. package/dist/cjs/reviewDoc/reviewDoc.cjs.map +1 -1
  63. package/dist/cjs/reviewDoc/reviewDocBlockAware.cjs +1 -94
  64. package/dist/cjs/reviewDoc/reviewDocBlockAware.cjs.map +1 -1
  65. package/dist/cjs/searchDoc.cjs +1 -38
  66. package/dist/cjs/searchDoc.cjs.map +1 -1
  67. package/dist/cjs/test/index.cjs +1 -7
  68. package/dist/cjs/test/listMissingTranslations.cjs +1 -49
  69. package/dist/cjs/test/listMissingTranslations.cjs.map +1 -1
  70. package/dist/cjs/test/test.cjs +1 -53
  71. package/dist/cjs/test/test.cjs.map +1 -1
  72. package/dist/cjs/translateDoc/index.cjs +1 -9
  73. package/dist/cjs/translateDoc/translateDoc.cjs +1 -74
  74. package/dist/cjs/translateDoc/translateDoc.cjs.map +1 -1
  75. package/dist/cjs/translateDoc/translateFile.cjs +2 -103
  76. package/dist/cjs/translateDoc/translateFile.cjs.map +1 -1
  77. package/dist/cjs/translateDoc/validation.cjs +5 -49
  78. package/dist/cjs/translateDoc/validation.cjs.map +1 -1
  79. package/dist/cjs/translation-alignment/alignBlocks.cjs +1 -67
  80. package/dist/cjs/translation-alignment/alignBlocks.cjs.map +1 -1
  81. package/dist/cjs/translation-alignment/computeSimilarity.cjs +1 -25
  82. package/dist/cjs/translation-alignment/computeSimilarity.cjs.map +1 -1
  83. package/dist/cjs/translation-alignment/fingerprintBlock.cjs +1 -23
  84. package/dist/cjs/translation-alignment/fingerprintBlock.cjs.map +1 -1
  85. package/dist/cjs/translation-alignment/index.cjs +1 -22
  86. package/dist/cjs/translation-alignment/mapChangedLinesToBlocks.cjs +1 -18
  87. package/dist/cjs/translation-alignment/mapChangedLinesToBlocks.cjs.map +1 -1
  88. package/dist/cjs/translation-alignment/normalizeBlock.cjs +1 -22
  89. package/dist/cjs/translation-alignment/normalizeBlock.cjs.map +1 -1
  90. package/dist/cjs/translation-alignment/pipeline.cjs +1 -37
  91. package/dist/cjs/translation-alignment/pipeline.cjs.map +1 -1
  92. package/dist/cjs/translation-alignment/planActions.cjs +1 -46
  93. package/dist/cjs/translation-alignment/planActions.cjs.map +1 -1
  94. package/dist/cjs/translation-alignment/rebuildDocument.cjs +2 -49
  95. package/dist/cjs/translation-alignment/rebuildDocument.cjs.map +1 -1
  96. package/dist/cjs/translation-alignment/segmentDocument.cjs +5 -66
  97. package/dist/cjs/translation-alignment/segmentDocument.cjs.map +1 -1
  98. package/dist/cjs/utils/calculateChunks.cjs +2 -89
  99. package/dist/cjs/utils/calculateChunks.cjs.map +1 -1
  100. package/dist/cjs/utils/checkAccess.cjs +1 -81
  101. package/dist/cjs/utils/checkAccess.cjs.map +1 -1
  102. package/dist/cjs/utils/checkConfigConsistency.cjs +1 -16
  103. package/dist/cjs/utils/checkConfigConsistency.cjs.map +1 -1
  104. package/dist/cjs/utils/checkFileModifiedRange.cjs +1 -81
  105. package/dist/cjs/utils/checkFileModifiedRange.cjs.map +1 -1
  106. package/dist/cjs/utils/checkLastUpdateTime.cjs +1 -19
  107. package/dist/cjs/utils/checkLastUpdateTime.cjs.map +1 -1
  108. package/dist/cjs/utils/chunkInference.cjs +1 -45
  109. package/dist/cjs/utils/chunkInference.cjs.map +1 -1
  110. package/dist/cjs/utils/fixChunkStartEndChars.cjs +3 -27
  111. package/dist/cjs/utils/fixChunkStartEndChars.cjs.map +1 -1
  112. package/dist/cjs/utils/formatTimeDiff.cjs +1 -20
  113. package/dist/cjs/utils/formatTimeDiff.cjs.map +1 -1
  114. package/dist/cjs/utils/getIsFileUpdatedRecently.cjs +1 -16
  115. package/dist/cjs/utils/getIsFileUpdatedRecently.cjs.map +1 -1
  116. package/dist/cjs/utils/getOutputFilePath.cjs +1 -74
  117. package/dist/cjs/utils/getOutputFilePath.cjs.map +1 -1
  118. package/dist/cjs/utils/getParentPackageJSON.cjs +1 -20
  119. package/dist/cjs/utils/getParentPackageJSON.cjs.map +1 -1
  120. package/dist/cjs/utils/listSpecialChars.cjs +2 -54
  121. package/dist/cjs/utils/listSpecialChars.cjs.map +1 -1
  122. package/dist/cjs/utils/mapChunksBetweenFiles.cjs +1 -102
  123. package/dist/cjs/utils/mapChunksBetweenFiles.cjs.map +1 -1
  124. package/dist/cjs/utils/openBrowser.cjs +1 -19
  125. package/dist/cjs/utils/openBrowser.cjs.map +1 -1
  126. package/dist/cjs/utils/reorderParagraphs.cjs +3 -91
  127. package/dist/cjs/utils/reorderParagraphs.cjs.map +1 -1
  128. package/dist/cjs/utils/setupAI.cjs +1 -64
  129. package/dist/cjs/utils/setupAI.cjs.map +1 -1
  130. package/dist/cjs/watch.cjs +1 -43
  131. package/dist/cjs/watch.cjs.map +1 -1
  132. package/dist/esm/IntlayerEventListener.mjs +1 -183
  133. package/dist/esm/IntlayerEventListener.mjs.map +1 -1
  134. package/dist/esm/_virtual/_rolldown/runtime.mjs +1 -8
  135. package/dist/esm/_virtual/_utils_asset.mjs +2 -97
  136. package/dist/esm/auth/login.mjs +2 -82
  137. package/dist/esm/auth/login.mjs.map +1 -1
  138. package/dist/esm/build.mjs +1 -25
  139. package/dist/esm/build.mjs.map +1 -1
  140. package/dist/esm/ci.mjs +1 -71
  141. package/dist/esm/ci.mjs.map +1 -1
  142. package/dist/esm/cli.mjs +1 -473
  143. package/dist/esm/cli.mjs.map +1 -1
  144. package/dist/esm/config.mjs +1 -10
  145. package/dist/esm/config.mjs.map +1 -1
  146. package/dist/esm/editor.mjs +1 -49
  147. package/dist/esm/editor.mjs.map +1 -1
  148. package/dist/esm/extract.mjs +1 -93
  149. package/dist/esm/extract.mjs.map +1 -1
  150. package/dist/esm/fill/deepMergeContent.mjs +1 -25
  151. package/dist/esm/fill/deepMergeContent.mjs.map +1 -1
  152. package/dist/esm/fill/fill.mjs +1 -76
  153. package/dist/esm/fill/fill.mjs.map +1 -1
  154. package/dist/esm/fill/formatAutoFilledFilePath.mjs +1 -27
  155. package/dist/esm/fill/formatAutoFilledFilePath.mjs.map +1 -1
  156. package/dist/esm/fill/formatFillData.mjs +1 -49
  157. package/dist/esm/fill/formatFillData.mjs.map +1 -1
  158. package/dist/esm/fill/getAvailableLocalesInDictionary.mjs +1 -24
  159. package/dist/esm/fill/getAvailableLocalesInDictionary.mjs.map +1 -1
  160. package/dist/esm/fill/getFilterMissingContentPerLocale.mjs +1 -48
  161. package/dist/esm/fill/getFilterMissingContentPerLocale.mjs.map +1 -1
  162. package/dist/esm/fill/index.mjs +1 -4
  163. package/dist/esm/fill/listTranslationsTasks.mjs +1 -68
  164. package/dist/esm/fill/listTranslationsTasks.mjs.map +1 -1
  165. package/dist/esm/fill/mergeChunks.mjs +1 -26
  166. package/dist/esm/fill/mergeChunks.mjs.map +1 -1
  167. package/dist/esm/fill/translateDictionary.mjs +1 -203
  168. package/dist/esm/fill/translateDictionary.mjs.map +1 -1
  169. package/dist/esm/fill/writeFill.mjs +1 -52
  170. package/dist/esm/fill/writeFill.mjs.map +1 -1
  171. package/dist/esm/getTargetDictionary.mjs +1 -33
  172. package/dist/esm/getTargetDictionary.mjs.map +1 -1
  173. package/dist/esm/index.mjs +1 -18
  174. package/dist/esm/init.mjs +1 -317
  175. package/dist/esm/init.mjs.map +1 -1
  176. package/dist/esm/listContentDeclaration.mjs +1 -38
  177. package/dist/esm/listContentDeclaration.mjs.map +1 -1
  178. package/dist/esm/listProjects.mjs +1 -26
  179. package/dist/esm/listProjects.mjs.map +1 -1
  180. package/dist/esm/liveSync.mjs +8 -148
  181. package/dist/esm/liveSync.mjs.map +1 -1
  182. package/dist/esm/pull.mjs +1 -144
  183. package/dist/esm/pull.mjs.map +1 -1
  184. package/dist/esm/push/pullLog.mjs +3 -100
  185. package/dist/esm/push/pullLog.mjs.map +1 -1
  186. package/dist/esm/push/push.mjs +1 -203
  187. package/dist/esm/push/push.mjs.map +1 -1
  188. package/dist/esm/pushConfig.mjs +1 -17
  189. package/dist/esm/pushConfig.mjs.map +1 -1
  190. package/dist/esm/pushLog.mjs +3 -82
  191. package/dist/esm/pushLog.mjs.map +1 -1
  192. package/dist/esm/reviewDoc/reviewDoc.mjs +1 -65
  193. package/dist/esm/reviewDoc/reviewDoc.mjs.map +1 -1
  194. package/dist/esm/reviewDoc/reviewDocBlockAware.mjs +1 -92
  195. package/dist/esm/reviewDoc/reviewDocBlockAware.mjs.map +1 -1
  196. package/dist/esm/searchDoc.mjs +1 -36
  197. package/dist/esm/searchDoc.mjs.map +1 -1
  198. package/dist/esm/test/index.mjs +1 -4
  199. package/dist/esm/test/listMissingTranslations.mjs +1 -46
  200. package/dist/esm/test/listMissingTranslations.mjs.map +1 -1
  201. package/dist/esm/test/test.mjs +1 -51
  202. package/dist/esm/test/test.mjs.map +1 -1
  203. package/dist/esm/translateDoc/index.mjs +1 -5
  204. package/dist/esm/translateDoc/translateDoc.mjs +1 -71
  205. package/dist/esm/translateDoc/translateDoc.mjs.map +1 -1
  206. package/dist/esm/translateDoc/translateFile.mjs +2 -101
  207. package/dist/esm/translateDoc/translateFile.mjs.map +1 -1
  208. package/dist/esm/translateDoc/validation.mjs +5 -46
  209. package/dist/esm/translateDoc/validation.mjs.map +1 -1
  210. package/dist/esm/translation-alignment/alignBlocks.mjs +1 -66
  211. package/dist/esm/translation-alignment/alignBlocks.mjs.map +1 -1
  212. package/dist/esm/translation-alignment/computeSimilarity.mjs +1 -22
  213. package/dist/esm/translation-alignment/computeSimilarity.mjs.map +1 -1
  214. package/dist/esm/translation-alignment/fingerprintBlock.mjs +1 -20
  215. package/dist/esm/translation-alignment/fingerprintBlock.mjs.map +1 -1
  216. package/dist/esm/translation-alignment/index.mjs +1 -11
  217. package/dist/esm/translation-alignment/mapChangedLinesToBlocks.mjs +1 -16
  218. package/dist/esm/translation-alignment/mapChangedLinesToBlocks.mjs.map +1 -1
  219. package/dist/esm/translation-alignment/normalizeBlock.mjs +1 -20
  220. package/dist/esm/translation-alignment/normalizeBlock.mjs.map +1 -1
  221. package/dist/esm/translation-alignment/pipeline.mjs +1 -35
  222. package/dist/esm/translation-alignment/pipeline.mjs.map +1 -1
  223. package/dist/esm/translation-alignment/planActions.mjs +1 -44
  224. package/dist/esm/translation-alignment/planActions.mjs.map +1 -1
  225. package/dist/esm/translation-alignment/rebuildDocument.mjs +2 -46
  226. package/dist/esm/translation-alignment/rebuildDocument.mjs.map +1 -1
  227. package/dist/esm/translation-alignment/segmentDocument.mjs +5 -64
  228. package/dist/esm/translation-alignment/segmentDocument.mjs.map +1 -1
  229. package/dist/esm/utils/calculateChunks.mjs +2 -87
  230. package/dist/esm/utils/calculateChunks.mjs.map +1 -1
  231. package/dist/esm/utils/checkAccess.mjs +1 -78
  232. package/dist/esm/utils/checkAccess.mjs.map +1 -1
  233. package/dist/esm/utils/checkConfigConsistency.mjs +1 -14
  234. package/dist/esm/utils/checkConfigConsistency.mjs.map +1 -1
  235. package/dist/esm/utils/checkFileModifiedRange.mjs +1 -80
  236. package/dist/esm/utils/checkFileModifiedRange.mjs.map +1 -1
  237. package/dist/esm/utils/checkLastUpdateTime.mjs +1 -17
  238. package/dist/esm/utils/checkLastUpdateTime.mjs.map +1 -1
  239. package/dist/esm/utils/chunkInference.mjs +1 -43
  240. package/dist/esm/utils/chunkInference.mjs.map +1 -1
  241. package/dist/esm/utils/fixChunkStartEndChars.mjs +3 -25
  242. package/dist/esm/utils/fixChunkStartEndChars.mjs.map +1 -1
  243. package/dist/esm/utils/formatTimeDiff.mjs +1 -18
  244. package/dist/esm/utils/formatTimeDiff.mjs.map +1 -1
  245. package/dist/esm/utils/getIsFileUpdatedRecently.mjs +1 -14
  246. package/dist/esm/utils/getIsFileUpdatedRecently.mjs.map +1 -1
  247. package/dist/esm/utils/getOutputFilePath.mjs +1 -72
  248. package/dist/esm/utils/getOutputFilePath.mjs.map +1 -1
  249. package/dist/esm/utils/getParentPackageJSON.mjs +1 -18
  250. package/dist/esm/utils/getParentPackageJSON.mjs.map +1 -1
  251. package/dist/esm/utils/listSpecialChars.mjs +2 -52
  252. package/dist/esm/utils/listSpecialChars.mjs.map +1 -1
  253. package/dist/esm/utils/mapChunksBetweenFiles.mjs +1 -100
  254. package/dist/esm/utils/mapChunksBetweenFiles.mjs.map +1 -1
  255. package/dist/esm/utils/openBrowser.mjs +1 -17
  256. package/dist/esm/utils/openBrowser.mjs.map +1 -1
  257. package/dist/esm/utils/reorderParagraphs.mjs +3 -90
  258. package/dist/esm/utils/reorderParagraphs.mjs.map +1 -1
  259. package/dist/esm/utils/setupAI.mjs +1 -62
  260. package/dist/esm/utils/setupAI.mjs.map +1 -1
  261. package/dist/esm/watch.mjs +1 -41
  262. package/dist/esm/watch.mjs.map +1 -1
  263. package/dist/types/auth/login.d.ts +1 -1
  264. package/dist/types/auth/login.d.ts.map +1 -1
  265. package/dist/types/build.d.ts +1 -1
  266. package/dist/types/build.d.ts.map +1 -1
  267. package/dist/types/config.d.ts +1 -1
  268. package/dist/types/extract.d.ts +1 -1
  269. package/dist/types/extract.d.ts.map +1 -1
  270. package/dist/types/fill/fill.d.ts +1 -1
  271. package/dist/types/fill/fill.d.ts.map +1 -1
  272. package/dist/types/fill/translateDictionary.d.ts +2 -2
  273. package/dist/types/fill/translateDictionary.d.ts.map +1 -1
  274. package/dist/types/fill/writeFill.d.ts.map +1 -1
  275. package/dist/types/getTargetDictionary.d.ts +2 -2
  276. package/dist/types/index.d.ts +4 -1
  277. package/dist/types/listContentDeclaration.d.ts +1 -1
  278. package/dist/types/listContentDeclaration.d.ts.map +1 -1
  279. package/dist/types/liveSync.d.ts +1 -1
  280. package/dist/types/pull.d.ts +1 -1
  281. package/dist/types/pull.d.ts.map +1 -1
  282. package/dist/types/push/pullLog.d.ts +1 -1
  283. package/dist/types/push/pullLog.d.ts.map +1 -1
  284. package/dist/types/push/push.d.ts +2 -2
  285. package/dist/types/pushConfig.d.ts +1 -1
  286. package/dist/types/reviewDoc/reviewDoc.d.ts +2 -2
  287. package/dist/types/reviewDoc/reviewDoc.d.ts.map +1 -1
  288. package/dist/types/reviewDoc/reviewDocBlockAware.d.ts +1 -1
  289. package/dist/types/reviewDoc/reviewDocBlockAware.d.ts.map +1 -1
  290. package/dist/types/searchDoc.d.ts +1 -1
  291. package/dist/types/searchDoc.d.ts.map +1 -1
  292. package/dist/types/test/listMissingTranslations.d.ts +1 -1
  293. package/dist/types/test/test.d.ts +1 -1
  294. package/dist/types/test/test.d.ts.map +1 -1
  295. package/dist/types/translateDoc/translateDoc.d.ts.map +1 -1
  296. package/dist/types/translateDoc/types.d.ts +2 -2
  297. package/dist/types/translateDoc/validation.d.ts +1 -1
  298. package/dist/types/utils/checkAccess.d.ts.map +1 -1
  299. package/dist/types/watch.d.ts +1 -1
  300. package/dist/types/watch.d.ts.map +1 -1
  301. package/package.json +11 -11
@@ -1,104 +1,3 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
3
- const require__utils_asset = require('../_virtual/_utils_asset.cjs');
4
- const require_translateDoc_validation = require('./validation.cjs');
5
- const require_utils_chunkInference = require('../utils/chunkInference.cjs');
6
- const require_utils_fixChunkStartEndChars = require('../utils/fixChunkStartEndChars.cjs');
7
- const require_utils_calculateChunks = require('../utils/calculateChunks.cjs');
8
- let _intlayer_chokidar = require("@intlayer/chokidar");
9
- let _intlayer_config = require("@intlayer/config");
10
- let node_path = require("node:path");
11
- let node_fs = require("node:fs");
12
- let node_fs_promises = require("node:fs/promises");
13
- let node_perf_hooks = require("node:perf_hooks");
14
-
15
- //#region src/translateDoc/translateFile.ts
16
- const translateFile = async ({ baseFilePath, outputFilePath, locale, baseLocale, configuration, errorState, aiOptions, customInstructions, aiClient, aiConfig, flushStrategy = "incremental", onChunkReceive, limit }) => {
17
- if (errorState.shouldStop) return null;
18
- const appLogger = (0, _intlayer_config.getAppLogger)(configuration, { config: { prefix: "" } });
19
- const fileStartTime = node_perf_hooks.performance.now();
20
- try {
21
- const chunks = require_utils_calculateChunks.chunkText(await (0, node_fs_promises.readFile)(baseFilePath, "utf-8"));
22
- const totalChunks = chunks.length;
23
- const filePrefix = `${(0, _intlayer_config.colon)(`${_intlayer_config.ANSIColors.GREY_DARK}[${(0, _intlayer_chokidar.formatPath)(baseFilePath)}${_intlayer_config.ANSIColors.GREY_DARK}] `, { colSize: 40 })}${_intlayer_config.ANSIColors.RESET}`;
24
- const prefix = `${(0, _intlayer_config.colon)(`${_intlayer_config.ANSIColors.GREY_DARK}[${(0, _intlayer_chokidar.formatPath)(baseFilePath)}${_intlayer_config.ANSIColors.GREY_DARK}][${(0, _intlayer_chokidar.formatLocale)(locale)}${_intlayer_config.ANSIColors.GREY_DARK}] `, { colSize: 40 })}${_intlayer_config.ANSIColors.RESET}`;
25
- appLogger(`${filePrefix}Split into ${(0, _intlayer_config.colorizeNumber)(totalChunks)} chunks. Queuing...`);
26
- const basePrompt = require__utils_asset.readAsset("./prompts/TRANSLATE_PROMPT.md", "utf-8").replaceAll("{{localeName}}", `${(0, _intlayer_chokidar.formatLocale)(locale, false)}`).replaceAll("{{baseLocaleName}}", `${(0, _intlayer_chokidar.formatLocale)(baseLocale, false)}`).replace("{{applicationContext}}", aiOptions?.applicationContext ?? "-").replace("{{customInstructions}}", customInstructions ?? "-");
27
- const translatedParts = new Array(totalChunks).fill("");
28
- const runTask = limit ?? ((fn) => fn());
29
- const tasks = chunks.map((chunk, i) => runTask(async () => {
30
- if (errorState.shouldStop) return null;
31
- const chunkLogger = (0, _intlayer_config.getAppLogger)(configuration, { config: { prefix: `${prefix} ${_intlayer_config.ANSIColors.GREY_DARK}[${i + 1}/${totalChunks}] ${_intlayer_config.ANSIColors.RESET}` } });
32
- const chunkStartTime = node_perf_hooks.performance.now();
33
- const isFirstChunk = i === 0;
34
- const fileToTranslateCurrentChunk = chunk.content;
35
- const getPrevChunkPrompt = () => `>>> CONTEXT: PREVIOUS SOURCE CONTENT <<<\n\`\`\`\n` + (chunks[i - 1]?.content ?? "") + `\n\`\`\`\n>>> END PREVIOUS CONTEXT <<<`;
36
- const getBaseChunkContextPrompt = () => `>>> CONTEXT: NEXT CONTENT <<<\n\`\`\`\n` + (chunks[i + 1]?.content ?? "") + `\n\`\`\`\n>>> END NEXT CONTEXT <<<`;
37
- chunkLogger("Process started");
38
- const { content: translatedChunk, tokens } = await (0, _intlayer_config.retryManager)(async () => {
39
- const result = await require_utils_chunkInference.chunkInference([
40
- {
41
- role: "system",
42
- content: basePrompt
43
- },
44
- ...chunks[i + 1] ? [{
45
- role: "system",
46
- content: getBaseChunkContextPrompt()
47
- }] : [],
48
- ...isFirstChunk ? [] : [{
49
- role: "system",
50
- content: getPrevChunkPrompt()
51
- }],
52
- {
53
- role: "system",
54
- content: [`You are translating TARGET CHUNK (${i + 1}/${totalChunks}).`, `Translate ONLY the target chunk. Preserve frontmatter/code exactly.`].join("\n")
55
- },
56
- {
57
- role: "user",
58
- content: `>>> TARGET CHUNK START <<<\n${fileToTranslateCurrentChunk}\n>>> TARGET CHUNK END <<<`
59
- }
60
- ], aiOptions, configuration, aiClient, aiConfig);
61
- let processedChunk = require_translateDoc_validation.sanitizeChunk(result?.fileContent, fileToTranslateCurrentChunk);
62
- processedChunk = require_utils_fixChunkStartEndChars.fixChunkStartEndChars(processedChunk, fileToTranslateCurrentChunk);
63
- if (!require_translateDoc_validation.validateTranslation(fileToTranslateCurrentChunk, processedChunk, chunkLogger)) throw new Error(`Validation failed for chunk ${i + 1}/${totalChunks}`);
64
- return {
65
- content: processedChunk,
66
- tokens: result.tokenUsed
67
- };
68
- })();
69
- const chunkDuration = (node_perf_hooks.performance.now() - chunkStartTime).toFixed(0);
70
- translatedParts[i] = translatedChunk;
71
- if (onChunkReceive) onChunkReceive(translatedChunk, i, totalChunks);
72
- if (flushStrategy === "incremental") {
73
- if (translatedParts.slice(0, i + 1).every((p) => p && p !== "")) {
74
- let endIdx = 0;
75
- while (endIdx < totalChunks && translatedParts[endIdx] && translatedParts[endIdx] !== "") endIdx++;
76
- const currentContent = translatedParts.slice(0, endIdx).join("");
77
- (0, node_fs.mkdirSync)((0, node_path.dirname)(outputFilePath), { recursive: true });
78
- (0, node_fs.writeFileSync)(outputFilePath, currentContent);
79
- }
80
- }
81
- chunkLogger([`${(0, _intlayer_config.colorizeNumber)(tokens)} tokens used `, `${_intlayer_config.ANSIColors.GREY_DARK}in ${(0, _intlayer_config.colorizeNumber)(chunkDuration)}ms${_intlayer_config.ANSIColors.RESET}`].join(""));
82
- }));
83
- await Promise.all(tasks);
84
- const fullContent = translatedParts.join("");
85
- if (flushStrategy === "end" || flushStrategy === "incremental") {
86
- (0, node_fs.mkdirSync)((0, node_path.dirname)(outputFilePath), { recursive: true });
87
- (0, node_fs.writeFileSync)(outputFilePath, fullContent);
88
- }
89
- const totalDuration = ((node_perf_hooks.performance.now() - fileStartTime) / 1e3).toFixed(2);
90
- const relativePath = (0, node_path.relative)(configuration.content.baseDir, outputFilePath);
91
- appLogger(`${(0, _intlayer_config.colorize)("✔", _intlayer_config.ANSIColors.GREEN)} File ${(0, _intlayer_chokidar.formatPath)(relativePath)} completed in ${(0, _intlayer_config.colorizeNumber)(totalDuration)}s.`);
92
- return fullContent;
93
- } catch (error) {
94
- errorState.count++;
95
- const errorMessage = error?.message ?? JSON.stringify(error);
96
- appLogger(`${(0, _intlayer_config.colorize)("✖", _intlayer_config.ANSIColors.RED)} Error: ${errorMessage}`);
97
- if (errorState.count >= errorState.maxErrors) errorState.shouldStop = true;
98
- return null;
99
- }
100
- };
101
-
102
- //#endregion
103
- exports.translateFile = translateFile;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../_virtual/_utils_asset.cjs`),t=require(`./validation.cjs`),n=require(`../utils/chunkInference.cjs`),r=require(`../utils/fixChunkStartEndChars.cjs`),i=require(`../utils/calculateChunks.cjs`);let a=require(`@intlayer/chokidar/utils`),o=require(`node:path`),s=require(`@intlayer/config/logger`),c=require(`@intlayer/config/utils`),l=require(`node:fs`),u=require(`node:fs/promises`),d=require(`node:perf_hooks`);const f=async({baseFilePath:f,outputFilePath:p,locale:m,baseLocale:h,configuration:g,errorState:_,aiOptions:v,customInstructions:y,aiClient:b,aiConfig:x,flushStrategy:S=`incremental`,onChunkReceive:C,limit:w})=>{if(_.shouldStop)return null;let T=(0,s.getAppLogger)(g,{config:{prefix:``}}),E=d.performance.now();try{let D=i.chunkText(await(0,u.readFile)(f,`utf-8`)),O=D.length,k=`${(0,s.colon)(`${s.ANSIColors.GREY_DARK}[${(0,a.formatPath)(f)}${s.ANSIColors.GREY_DARK}] `,{colSize:40})}${s.ANSIColors.RESET}`,A=`${(0,s.colon)(`${s.ANSIColors.GREY_DARK}[${(0,a.formatPath)(f)}${s.ANSIColors.GREY_DARK}][${(0,a.formatLocale)(m)}${s.ANSIColors.GREY_DARK}] `,{colSize:40})}${s.ANSIColors.RESET}`;T(`${k}Split into ${(0,s.colorizeNumber)(O)} chunks. Queuing...`);let j=e.readAsset(`./prompts/TRANSLATE_PROMPT.md`,`utf-8`).replaceAll(`{{localeName}}`,`${(0,a.formatLocale)(m,!1)}`).replaceAll(`{{baseLocaleName}}`,`${(0,a.formatLocale)(h,!1)}`).replace(`{{applicationContext}}`,v?.applicationContext??`-`).replace(`{{customInstructions}}`,y??`-`),M=Array(O).fill(``),N=w??(e=>e()),P=D.map((e,i)=>N(async()=>{if(_.shouldStop)return null;let a=(0,s.getAppLogger)(g,{config:{prefix:`${A} ${s.ANSIColors.GREY_DARK}[${i+1}/${O}] ${s.ANSIColors.RESET}`}}),u=d.performance.now(),f=i===0,m=e.content,h=()=>">>> CONTEXT: PREVIOUS SOURCE CONTENT <<<\n```\n"+(D[i-1]?.content??``)+"\n```\n>>> END PREVIOUS CONTEXT <<<",y=()=>">>> CONTEXT: NEXT CONTENT <<<\n```\n"+(D[i+1]?.content??``)+"\n```\n>>> END NEXT CONTEXT <<<";a(`Process started`);let{content:w,tokens:T}=await(0,c.retryManager)(async()=>{let e=await n.chunkInference([{role:`system`,content:j},...D[i+1]?[{role:`system`,content:y()}]:[],...f?[]:[{role:`system`,content:h()}],{role:`system`,content:[`You are translating TARGET CHUNK (${i+1}/${O}).`,`Translate ONLY the target chunk. Preserve frontmatter/code exactly.`].join(`
2
+ `)},{role:`user`,content:`>>> TARGET CHUNK START <<<\n${m}\n>>> TARGET CHUNK END <<<`}],v,g,b,x),o=t.sanitizeChunk(e?.fileContent,m);if(o=r.fixChunkStartEndChars(o,m),!t.validateTranslation(m,o,a))throw Error(`Validation failed for chunk ${i+1}/${O}`);return{content:o,tokens:e.tokenUsed}})(),E=(d.performance.now()-u).toFixed(0);if(M[i]=w,C&&C(w,i,O),S===`incremental`&&M.slice(0,i+1).every(e=>e&&e!==``)){let e=0;for(;e<O&&M[e]&&M[e]!==``;)e++;let t=M.slice(0,e).join(``);(0,l.mkdirSync)((0,o.dirname)(p),{recursive:!0}),(0,l.writeFileSync)(p,t)}a([`${(0,s.colorizeNumber)(T)} tokens used `,`${s.ANSIColors.GREY_DARK}in ${(0,s.colorizeNumber)(E)}ms${s.ANSIColors.RESET}`].join(``))}));await Promise.all(P);let F=M.join(``);(S===`end`||S===`incremental`)&&((0,l.mkdirSync)((0,o.dirname)(p),{recursive:!0}),(0,l.writeFileSync)(p,F));let I=((d.performance.now()-E)/1e3).toFixed(2),L=(0,o.relative)(g.content.baseDir,p);return T(`${(0,s.colorize)(`✔`,s.ANSIColors.GREEN)} File ${(0,a.formatPath)(L)} completed in ${(0,s.colorizeNumber)(I)}s.`),F}catch(e){_.count++;let t=e?.message??JSON.stringify(e);return T(`${(0,s.colorize)(`✖`,s.ANSIColors.RED)} Error: ${t}`),_.count>=_.maxErrors&&(_.shouldStop=!0),null}};exports.translateFile=f;
104
3
  //# sourceMappingURL=translateFile.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"translateFile.cjs","names":["performance","chunkText","ANSIColors","readAsset","chunkInference","sanitizeChunk","fixChunkStartEndChars","validateTranslation"],"sources":["../../../src/translateDoc/translateFile.ts"],"sourcesContent":["import { mkdirSync, writeFileSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { dirname, relative } from 'node:path';\nimport { performance } from 'node:perf_hooks';\nimport { readAsset } from 'utils:asset';\nimport { formatLocale, formatPath } from '@intlayer/chokidar';\nimport {\n ANSIColors,\n colon,\n colorize,\n colorizeNumber,\n getAppLogger,\n retryManager,\n} from '@intlayer/config';\nimport { chunkText } from '../utils/calculateChunks';\nimport { chunkInference } from '../utils/chunkInference';\nimport { fixChunkStartEndChars } from '../utils/fixChunkStartEndChars';\nimport type { TranslateFileOptions } from './types';\nimport { sanitizeChunk, validateTranslation } from './validation';\n\nexport const translateFile = async ({\n baseFilePath,\n outputFilePath,\n locale,\n baseLocale,\n configuration,\n errorState,\n aiOptions,\n customInstructions,\n aiClient,\n aiConfig,\n flushStrategy = 'incremental',\n onChunkReceive,\n limit, // The Global Limiter\n}: TranslateFileOptions): Promise<string | null> => {\n if (errorState.shouldStop) return null;\n\n const appLogger = getAppLogger(configuration, { config: { prefix: '' } });\n const fileStartTime = performance.now();\n\n try {\n const fileContent = await readFile(baseFilePath, 'utf-8');\n const chunks = chunkText(fileContent);\n const totalChunks = chunks.length;\n\n const filePrefixText = `${ANSIColors.GREY_DARK}[${formatPath(baseFilePath)}${ANSIColors.GREY_DARK}] `;\n const filePrefix = `${colon(filePrefixText, { colSize: 40 })}${ANSIColors.RESET}`;\n const prefixText = `${ANSIColors.GREY_DARK}[${formatPath(baseFilePath)}${ANSIColors.GREY_DARK}][${formatLocale(locale)}${ANSIColors.GREY_DARK}] `;\n const prefix = `${colon(prefixText, { colSize: 40 })}${ANSIColors.RESET}`;\n\n appLogger(\n `${filePrefix}Split into ${colorizeNumber(totalChunks)} chunks. Queuing...`\n );\n\n const basePrompt = readAsset('./prompts/TRANSLATE_PROMPT.md', 'utf-8')\n .replaceAll('{{localeName}}', `${formatLocale(locale, false)}`)\n .replaceAll('{{baseLocaleName}}', `${formatLocale(baseLocale, false)}`)\n .replace('{{applicationContext}}', aiOptions?.applicationContext ?? '-')\n .replace('{{customInstructions}}', customInstructions ?? '-');\n\n const translatedParts: string[] = new Array(totalChunks).fill('');\n\n // Fallback if no limiter is provided (runs immediately)\n const runTask = limit ?? ((fn) => fn());\n\n // MAP CHUNKS TO GLOBAL TASKS\n // This pushes ALL chunks for this file into the Global Queue immediately.\n // They will execute whenever the global concurrency slots open up.\n const tasks = chunks.map((chunk, i) =>\n runTask(async () => {\n if (errorState.shouldStop) return null;\n\n const chunkLogger = getAppLogger(configuration, {\n config: {\n prefix: `${prefix} ${ANSIColors.GREY_DARK}[${i + 1}/${totalChunks}] ${ANSIColors.RESET}`,\n },\n });\n\n const chunkStartTime = performance.now();\n const isFirstChunk = i === 0;\n const fileToTranslateCurrentChunk = chunk.content;\n\n // Context Preparation\n const getPrevChunkPrompt = () =>\n `>>> CONTEXT: PREVIOUS SOURCE CONTENT <<<\\n\\`\\`\\`\\n` +\n (chunks[i - 1]?.content ?? '') +\n `\\n\\`\\`\\`\\n>>> END PREVIOUS CONTEXT <<<`;\n\n const getBaseChunkContextPrompt = () =>\n `>>> CONTEXT: NEXT CONTENT <<<\\n\\`\\`\\`\\n` +\n (chunks[i + 1]?.content ?? '') +\n `\\n\\`\\`\\`\\n>>> END NEXT CONTEXT <<<`;\n\n chunkLogger('Process started');\n\n const chunkTranslation = retryManager(async () => {\n const result = await chunkInference(\n [\n { role: 'system', content: basePrompt },\n ...(chunks[i + 1]\n ? [\n {\n role: 'system',\n content: getBaseChunkContextPrompt(),\n } as const,\n ]\n : []),\n ...(isFirstChunk\n ? []\n : [{ role: 'system', content: getPrevChunkPrompt() } as const]),\n {\n role: 'system',\n content: [\n `You are translating TARGET CHUNK (${i + 1}/${totalChunks}).`,\n `Translate ONLY the target chunk. Preserve frontmatter/code exactly.`,\n ].join('\\n'),\n },\n {\n role: 'user',\n content: `>>> TARGET CHUNK START <<<\\n${fileToTranslateCurrentChunk}\\n>>> TARGET CHUNK END <<<`,\n },\n ],\n aiOptions,\n configuration,\n aiClient,\n aiConfig\n );\n\n let processedChunk = sanitizeChunk(\n result?.fileContent,\n fileToTranslateCurrentChunk\n );\n processedChunk = fixChunkStartEndChars(\n processedChunk,\n fileToTranslateCurrentChunk\n );\n\n const isValid = validateTranslation(\n fileToTranslateCurrentChunk,\n processedChunk,\n chunkLogger\n );\n\n if (!isValid) {\n // Throwing an error here signals retryManager to try again\n throw new Error(\n `Validation failed for chunk ${i + 1}/${totalChunks}`\n );\n }\n\n return { content: processedChunk, tokens: result.tokenUsed };\n });\n\n const { content: translatedChunk, tokens } = await chunkTranslation();\n const chunkEndTime = performance.now();\n const chunkDuration = (chunkEndTime - chunkStartTime).toFixed(0);\n\n // Store Result\n translatedParts[i] = translatedChunk;\n\n if (onChunkReceive) {\n onChunkReceive(translatedChunk, i, totalChunks);\n }\n\n // Incremental Flush Strategy\n if (flushStrategy === 'incremental') {\n const isContiguous = translatedParts\n .slice(0, i + 1)\n .every((p) => p && p !== '');\n\n if (isContiguous) {\n let endIdx = 0;\n while (\n endIdx < totalChunks &&\n translatedParts[endIdx] &&\n translatedParts[endIdx] !== ''\n ) {\n endIdx++;\n }\n const currentContent = translatedParts.slice(0, endIdx).join('');\n // Write asynchronously/sync is fine here as node handles file locks reasonably well for single process\n mkdirSync(dirname(outputFilePath), { recursive: true });\n writeFileSync(outputFilePath, currentContent);\n }\n }\n\n chunkLogger(\n [\n `${colorizeNumber(tokens)} tokens used `,\n `${ANSIColors.GREY_DARK}in ${colorizeNumber(chunkDuration)}ms${ANSIColors.RESET}`,\n ].join('')\n );\n })\n );\n\n // Wait for all chunks for this specific file/locale to finish\n await Promise.all(tasks);\n\n // Final Flush\n const fullContent = translatedParts.join('');\n if (flushStrategy === 'end' || flushStrategy === 'incremental') {\n mkdirSync(dirname(outputFilePath), { recursive: true });\n writeFileSync(outputFilePath, fullContent);\n }\n\n const fileEndTime = performance.now();\n const totalDuration = ((fileEndTime - fileStartTime) / 1000).toFixed(2);\n const relativePath = relative(\n configuration.content.baseDir,\n outputFilePath\n );\n\n appLogger(\n `${colorize('✔', ANSIColors.GREEN)} File ${formatPath(relativePath)} completed in ${colorizeNumber(totalDuration)}s.`\n );\n\n return fullContent;\n } catch (error: any) {\n errorState.count++;\n const errorMessage = error?.message ?? JSON.stringify(error);\n appLogger(`${colorize('✖', ANSIColors.RED)} Error: ${errorMessage}`);\n if (errorState.count >= errorState.maxErrors) errorState.shouldStop = true;\n return null;\n }\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"translateFile.cjs","names":["performance","chunkText","ANSIColors","readAsset","chunkInference","sanitizeChunk","fixChunkStartEndChars","validateTranslation"],"sources":["../../../src/translateDoc/translateFile.ts"],"sourcesContent":["import { mkdirSync, writeFileSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { dirname, relative } from 'node:path';\nimport { performance } from 'node:perf_hooks';\nimport { readAsset } from 'utils:asset';\nimport { formatLocale, formatPath } from '@intlayer/chokidar/utils';\nimport {\n ANSIColors,\n colon,\n colorize,\n colorizeNumber,\n getAppLogger,\n} from '@intlayer/config/logger';\nimport { retryManager } from '@intlayer/config/utils';\nimport { chunkText } from '../utils/calculateChunks';\nimport { chunkInference } from '../utils/chunkInference';\nimport { fixChunkStartEndChars } from '../utils/fixChunkStartEndChars';\nimport type { TranslateFileOptions } from './types';\nimport { sanitizeChunk, validateTranslation } from './validation';\n\nexport const translateFile = async ({\n baseFilePath,\n outputFilePath,\n locale,\n baseLocale,\n configuration,\n errorState,\n aiOptions,\n customInstructions,\n aiClient,\n aiConfig,\n flushStrategy = 'incremental',\n onChunkReceive,\n limit, // The Global Limiter\n}: TranslateFileOptions): Promise<string | null> => {\n if (errorState.shouldStop) return null;\n\n const appLogger = getAppLogger(configuration, { config: { prefix: '' } });\n const fileStartTime = performance.now();\n\n try {\n const fileContent = await readFile(baseFilePath, 'utf-8');\n const chunks = chunkText(fileContent);\n const totalChunks = chunks.length;\n\n const filePrefixText = `${ANSIColors.GREY_DARK}[${formatPath(baseFilePath)}${ANSIColors.GREY_DARK}] `;\n const filePrefix = `${colon(filePrefixText, { colSize: 40 })}${ANSIColors.RESET}`;\n const prefixText = `${ANSIColors.GREY_DARK}[${formatPath(baseFilePath)}${ANSIColors.GREY_DARK}][${formatLocale(locale)}${ANSIColors.GREY_DARK}] `;\n const prefix = `${colon(prefixText, { colSize: 40 })}${ANSIColors.RESET}`;\n\n appLogger(\n `${filePrefix}Split into ${colorizeNumber(totalChunks)} chunks. Queuing...`\n );\n\n const basePrompt = readAsset('./prompts/TRANSLATE_PROMPT.md', 'utf-8')\n .replaceAll('{{localeName}}', `${formatLocale(locale, false)}`)\n .replaceAll('{{baseLocaleName}}', `${formatLocale(baseLocale, false)}`)\n .replace('{{applicationContext}}', aiOptions?.applicationContext ?? '-')\n .replace('{{customInstructions}}', customInstructions ?? '-');\n\n const translatedParts: string[] = new Array(totalChunks).fill('');\n\n // Fallback if no limiter is provided (runs immediately)\n const runTask = limit ?? ((fn) => fn());\n\n // MAP CHUNKS TO GLOBAL TASKS\n // This pushes ALL chunks for this file into the Global Queue immediately.\n // They will execute whenever the global concurrency slots open up.\n const tasks = chunks.map((chunk, i) =>\n runTask(async () => {\n if (errorState.shouldStop) return null;\n\n const chunkLogger = getAppLogger(configuration, {\n config: {\n prefix: `${prefix} ${ANSIColors.GREY_DARK}[${i + 1}/${totalChunks}] ${ANSIColors.RESET}`,\n },\n });\n\n const chunkStartTime = performance.now();\n const isFirstChunk = i === 0;\n const fileToTranslateCurrentChunk = chunk.content;\n\n // Context Preparation\n const getPrevChunkPrompt = () =>\n `>>> CONTEXT: PREVIOUS SOURCE CONTENT <<<\\n\\`\\`\\`\\n` +\n (chunks[i - 1]?.content ?? '') +\n `\\n\\`\\`\\`\\n>>> END PREVIOUS CONTEXT <<<`;\n\n const getBaseChunkContextPrompt = () =>\n `>>> CONTEXT: NEXT CONTENT <<<\\n\\`\\`\\`\\n` +\n (chunks[i + 1]?.content ?? '') +\n `\\n\\`\\`\\`\\n>>> END NEXT CONTEXT <<<`;\n\n chunkLogger('Process started');\n\n const chunkTranslation = retryManager(async () => {\n const result = await chunkInference(\n [\n { role: 'system', content: basePrompt },\n ...(chunks[i + 1]\n ? [\n {\n role: 'system',\n content: getBaseChunkContextPrompt(),\n } as const,\n ]\n : []),\n ...(isFirstChunk\n ? []\n : [{ role: 'system', content: getPrevChunkPrompt() } as const]),\n {\n role: 'system',\n content: [\n `You are translating TARGET CHUNK (${i + 1}/${totalChunks}).`,\n `Translate ONLY the target chunk. Preserve frontmatter/code exactly.`,\n ].join('\\n'),\n },\n {\n role: 'user',\n content: `>>> TARGET CHUNK START <<<\\n${fileToTranslateCurrentChunk}\\n>>> TARGET CHUNK END <<<`,\n },\n ],\n aiOptions,\n configuration,\n aiClient,\n aiConfig\n );\n\n let processedChunk = sanitizeChunk(\n result?.fileContent,\n fileToTranslateCurrentChunk\n );\n processedChunk = fixChunkStartEndChars(\n processedChunk,\n fileToTranslateCurrentChunk\n );\n\n const isValid = validateTranslation(\n fileToTranslateCurrentChunk,\n processedChunk,\n chunkLogger\n );\n\n if (!isValid) {\n // Throwing an error here signals retryManager to try again\n throw new Error(\n `Validation failed for chunk ${i + 1}/${totalChunks}`\n );\n }\n\n return { content: processedChunk, tokens: result.tokenUsed };\n });\n\n const { content: translatedChunk, tokens } = await chunkTranslation();\n const chunkEndTime = performance.now();\n const chunkDuration = (chunkEndTime - chunkStartTime).toFixed(0);\n\n // Store Result\n translatedParts[i] = translatedChunk;\n\n if (onChunkReceive) {\n onChunkReceive(translatedChunk, i, totalChunks);\n }\n\n // Incremental Flush Strategy\n if (flushStrategy === 'incremental') {\n const isContiguous = translatedParts\n .slice(0, i + 1)\n .every((p) => p && p !== '');\n\n if (isContiguous) {\n let endIdx = 0;\n while (\n endIdx < totalChunks &&\n translatedParts[endIdx] &&\n translatedParts[endIdx] !== ''\n ) {\n endIdx++;\n }\n const currentContent = translatedParts.slice(0, endIdx).join('');\n // Write asynchronously/sync is fine here as node handles file locks reasonably well for single process\n mkdirSync(dirname(outputFilePath), { recursive: true });\n writeFileSync(outputFilePath, currentContent);\n }\n }\n\n chunkLogger(\n [\n `${colorizeNumber(tokens)} tokens used `,\n `${ANSIColors.GREY_DARK}in ${colorizeNumber(chunkDuration)}ms${ANSIColors.RESET}`,\n ].join('')\n );\n })\n );\n\n // Wait for all chunks for this specific file/locale to finish\n await Promise.all(tasks);\n\n // Final Flush\n const fullContent = translatedParts.join('');\n if (flushStrategy === 'end' || flushStrategy === 'incremental') {\n mkdirSync(dirname(outputFilePath), { recursive: true });\n writeFileSync(outputFilePath, fullContent);\n }\n\n const fileEndTime = performance.now();\n const totalDuration = ((fileEndTime - fileStartTime) / 1000).toFixed(2);\n const relativePath = relative(\n configuration.content.baseDir,\n outputFilePath\n );\n\n appLogger(\n `${colorize('✔', ANSIColors.GREEN)} File ${formatPath(relativePath)} completed in ${colorizeNumber(totalDuration)}s.`\n );\n\n return fullContent;\n } catch (error: any) {\n errorState.count++;\n const errorMessage = error?.message ?? JSON.stringify(error);\n appLogger(`${colorize('✖', ANSIColors.RED)} Error: ${errorMessage}`);\n if (errorState.count >= errorState.maxErrors) errorState.shouldStop = true;\n return null;\n }\n};\n"],"mappings":"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"}
@@ -1,50 +1,6 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
-
3
- //#region src/translateDoc/validation.ts
4
- /**
5
- * Validates that the translated content matches the structure of the original.
6
- * Throws an error if a mismatch is found, triggering a retry.
7
- */
8
- const validateTranslation = (original, translated, logger) => {
9
- const errors = [];
10
- if (original.trimStart().startsWith("---")) {
11
- if (!translated.trimStart().startsWith("---")) errors.push("YAML Frontmatter missing: Input starts with \"---\", output does not.");
12
- const originalDashes = (original.match(/^---$/gm) || []).length;
13
- const translatedDashes = (translated.match(/^---$/gm) || []).length;
14
- if (originalDashes >= 2 && translatedDashes < 2) errors.push("YAML Frontmatter unclosed: Input has closing \"---\", output is missing it.");
15
- }
16
- const fenceRegex = /^\s*```/gm;
17
- const originalFences = (original.match(fenceRegex) || []).length;
18
- const translatedFences = (translated.match(fenceRegex) || []).length;
19
- if (originalFences !== translatedFences) errors.push(`Code fence mismatch: Input has ${originalFences}, output has ${translatedFences}`);
20
- const ratio = translated.length / (original.length || 1);
21
- const isTooLong = ratio > 2.5;
22
- const isSignificantLength = original.length > 50;
23
- if (isTooLong && isSignificantLength) errors.push(`Length deviation: Output is ${translated.length} chars vs Input ${original.length} (${ratio.toFixed(1)}x). Likely included context.`);
24
- const originalLines = original.split("\n").length;
25
- const translatedLines = translated.split("\n").length;
26
- if (originalLines > 5) {
27
- if (translatedLines < originalLines * .4) errors.push(`Line count deviation: Output has ${translatedLines} lines, Input has ${originalLines}. Likely content deletion.`);
28
- }
29
- if (errors.length > 0) {
30
- logger(`Validation Failed: ${errors.join(", ")}`);
31
- return false;
32
- }
33
- return true;
34
- };
35
- /**
36
- * Clean common AI artifacts
37
- */
38
- const sanitizeChunk = (translated, original) => {
39
- let cleaned = translated;
40
- const match = cleaned.match(/^```(?:markdown|md|txt)?\n([\s\S]*?)\n```$/i);
41
- if (match) cleaned = match[1];
42
- if (!original.startsWith("\n") && cleaned.startsWith("\n")) cleaned = cleaned.replace(/^\n+/, "");
43
- if (!original.startsWith(" ") && cleaned.startsWith(" ")) cleaned = cleaned.trimStart();
44
- return cleaned;
45
- };
46
-
47
- //#endregion
48
- exports.sanitizeChunk = sanitizeChunk;
49
- exports.validateTranslation = validateTranslation;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=(e,t,n)=>{let r=[];if(e.trimStart().startsWith(`---`)){t.trimStart().startsWith(`---`)||r.push(`YAML Frontmatter missing: Input starts with "---", output does not.`);let n=(e.match(/^---$/gm)||[]).length,i=(t.match(/^---$/gm)||[]).length;n>=2&&i<2&&r.push(`YAML Frontmatter unclosed: Input has closing "---", output is missing it.`)}let i=/^\s*```/gm,a=(e.match(i)||[]).length,o=(t.match(i)||[]).length;a!==o&&r.push(`Code fence mismatch: Input has ${a}, output has ${o}`);let s=t.length/(e.length||1),c=s>2.5,l=e.length>50;c&&l&&r.push(`Length deviation: Output is ${t.length} chars vs Input ${e.length} (${s.toFixed(1)}x). Likely included context.`);let u=e.split(`
2
+ `).length,d=t.split(`
3
+ `).length;return u>5&&d<u*.4&&r.push(`Line count deviation: Output has ${d} lines, Input has ${u}. Likely content deletion.`),r.length>0?(n(`Validation Failed: ${r.join(`, `)}`),!1):!0},t=(e,t)=>{let n=e,r=n.match(/^```(?:markdown|md|txt)?\n([\s\S]*?)\n```$/i);return r&&(n=r[1]),!t.startsWith(`
4
+ `)&&n.startsWith(`
5
+ `)&&(n=n.replace(/^\n+/,``)),!t.startsWith(` `)&&n.startsWith(` `)&&(n=n.trimStart()),n};exports.sanitizeChunk=t,exports.validateTranslation=e;
50
6
  //# sourceMappingURL=validation.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.cjs","names":[],"sources":["../../../src/translateDoc/validation.ts"],"sourcesContent":["import type { Logger } from '@intlayer/config';\n\n/**\n * Validates that the translated content matches the structure of the original.\n * Throws an error if a mismatch is found, triggering a retry.\n */\nexport const validateTranslation = (\n original: string,\n translated: string,\n logger: Logger\n): boolean => {\n const errors: string[] = [];\n\n // YAML Frontmatter Integrity (CRITICAL)\n if (original.trimStart().startsWith('---')) {\n if (!translated.trimStart().startsWith('---')) {\n errors.push(\n 'YAML Frontmatter missing: Input starts with \"---\", output does not.'\n );\n }\n const originalDashes = (original.match(/^---$/gm) || []).length;\n const translatedDashes = (translated.match(/^---$/gm) || []).length;\n if (originalDashes >= 2 && translatedDashes < 2) {\n errors.push(\n 'YAML Frontmatter unclosed: Input has closing \"---\", output is missing it.'\n );\n }\n }\n\n // Code Fence Check\n const fenceRegex = /^\\s*```/gm;\n const originalFences = (original.match(fenceRegex) || []).length;\n const translatedFences = (translated.match(fenceRegex) || []).length;\n\n if (originalFences !== translatedFences) {\n errors.push(\n `Code fence mismatch: Input has ${originalFences}, output has ${translatedFences}`\n );\n }\n\n // Length/Duplication Check\n const ratio = translated.length / (original.length || 1);\n const isTooLong = ratio > 2.5;\n const isSignificantLength = original.length > 50;\n\n if (isTooLong && isSignificantLength) {\n errors.push(\n `Length deviation: Output is ${translated.length} chars vs Input ${original.length} (${ratio.toFixed(1)}x). Likely included context.`\n );\n }\n\n // Line Count Heuristic\n const originalLines = original.split('\\n').length;\n const translatedLines = translated.split('\\n').length;\n\n if (originalLines > 5) {\n if (translatedLines < originalLines * 0.4) {\n errors.push(\n `Line count deviation: Output has ${translatedLines} lines, Input has ${originalLines}. Likely content deletion.`\n );\n }\n }\n\n if (errors.length > 0) {\n logger(`Validation Failed: ${errors.join(', ')}`);\n return false;\n }\n\n return true;\n};\n\n/**\n * Clean common AI artifacts\n */\nexport const sanitizeChunk = (translated: string, original: string): string => {\n let cleaned = translated;\n const wrapRegex = /^```(?:markdown|md|txt)?\\n([\\s\\S]*?)\\n```$/i;\n const match = cleaned.match(wrapRegex);\n if (match) cleaned = match[1];\n\n if (!original.startsWith('\\n') && cleaned.startsWith('\\n')) {\n cleaned = cleaned.replace(/^\\n+/, '');\n }\n if (!original.startsWith(' ') && cleaned.startsWith(' ')) {\n cleaned = cleaned.trimStart();\n }\n return cleaned;\n};\n"],"mappings":";;;;;;;AAMA,MAAa,uBACX,UACA,YACA,WACY;CACZ,MAAM,SAAmB,EAAE;AAG3B,KAAI,SAAS,WAAW,CAAC,WAAW,MAAM,EAAE;AAC1C,MAAI,CAAC,WAAW,WAAW,CAAC,WAAW,MAAM,CAC3C,QAAO,KACL,wEACD;EAEH,MAAM,kBAAkB,SAAS,MAAM,UAAU,IAAI,EAAE,EAAE;EACzD,MAAM,oBAAoB,WAAW,MAAM,UAAU,IAAI,EAAE,EAAE;AAC7D,MAAI,kBAAkB,KAAK,mBAAmB,EAC5C,QAAO,KACL,8EACD;;CAKL,MAAM,aAAa;CACnB,MAAM,kBAAkB,SAAS,MAAM,WAAW,IAAI,EAAE,EAAE;CAC1D,MAAM,oBAAoB,WAAW,MAAM,WAAW,IAAI,EAAE,EAAE;AAE9D,KAAI,mBAAmB,iBACrB,QAAO,KACL,kCAAkC,eAAe,eAAe,mBACjE;CAIH,MAAM,QAAQ,WAAW,UAAU,SAAS,UAAU;CACtD,MAAM,YAAY,QAAQ;CAC1B,MAAM,sBAAsB,SAAS,SAAS;AAE9C,KAAI,aAAa,oBACf,QAAO,KACL,+BAA+B,WAAW,OAAO,kBAAkB,SAAS,OAAO,IAAI,MAAM,QAAQ,EAAE,CAAC,8BACzG;CAIH,MAAM,gBAAgB,SAAS,MAAM,KAAK,CAAC;CAC3C,MAAM,kBAAkB,WAAW,MAAM,KAAK,CAAC;AAE/C,KAAI,gBAAgB,GAClB;MAAI,kBAAkB,gBAAgB,GACpC,QAAO,KACL,oCAAoC,gBAAgB,oBAAoB,cAAc,4BACvF;;AAIL,KAAI,OAAO,SAAS,GAAG;AACrB,SAAO,sBAAsB,OAAO,KAAK,KAAK,GAAG;AACjD,SAAO;;AAGT,QAAO;;;;;AAMT,MAAa,iBAAiB,YAAoB,aAA6B;CAC7E,IAAI,UAAU;CAEd,MAAM,QAAQ,QAAQ,MADJ,8CACoB;AACtC,KAAI,MAAO,WAAU,MAAM;AAE3B,KAAI,CAAC,SAAS,WAAW,KAAK,IAAI,QAAQ,WAAW,KAAK,CACxD,WAAU,QAAQ,QAAQ,QAAQ,GAAG;AAEvC,KAAI,CAAC,SAAS,WAAW,IAAI,IAAI,QAAQ,WAAW,IAAI,CACtD,WAAU,QAAQ,WAAW;AAE/B,QAAO"}
1
+ {"version":3,"file":"validation.cjs","names":[],"sources":["../../../src/translateDoc/validation.ts"],"sourcesContent":["import type { Logger } from '@intlayer/config/logger';\n\n/**\n * Validates that the translated content matches the structure of the original.\n * Throws an error if a mismatch is found, triggering a retry.\n */\nexport const validateTranslation = (\n original: string,\n translated: string,\n logger: Logger\n): boolean => {\n const errors: string[] = [];\n\n // YAML Frontmatter Integrity (CRITICAL)\n if (original.trimStart().startsWith('---')) {\n if (!translated.trimStart().startsWith('---')) {\n errors.push(\n 'YAML Frontmatter missing: Input starts with \"---\", output does not.'\n );\n }\n const originalDashes = (original.match(/^---$/gm) || []).length;\n const translatedDashes = (translated.match(/^---$/gm) || []).length;\n if (originalDashes >= 2 && translatedDashes < 2) {\n errors.push(\n 'YAML Frontmatter unclosed: Input has closing \"---\", output is missing it.'\n );\n }\n }\n\n // Code Fence Check\n const fenceRegex = /^\\s*```/gm;\n const originalFences = (original.match(fenceRegex) || []).length;\n const translatedFences = (translated.match(fenceRegex) || []).length;\n\n if (originalFences !== translatedFences) {\n errors.push(\n `Code fence mismatch: Input has ${originalFences}, output has ${translatedFences}`\n );\n }\n\n // Length/Duplication Check\n const ratio = translated.length / (original.length || 1);\n const isTooLong = ratio > 2.5;\n const isSignificantLength = original.length > 50;\n\n if (isTooLong && isSignificantLength) {\n errors.push(\n `Length deviation: Output is ${translated.length} chars vs Input ${original.length} (${ratio.toFixed(1)}x). Likely included context.`\n );\n }\n\n // Line Count Heuristic\n const originalLines = original.split('\\n').length;\n const translatedLines = translated.split('\\n').length;\n\n if (originalLines > 5) {\n if (translatedLines < originalLines * 0.4) {\n errors.push(\n `Line count deviation: Output has ${translatedLines} lines, Input has ${originalLines}. Likely content deletion.`\n );\n }\n }\n\n if (errors.length > 0) {\n logger(`Validation Failed: ${errors.join(', ')}`);\n return false;\n }\n\n return true;\n};\n\n/**\n * Clean common AI artifacts\n */\nexport const sanitizeChunk = (translated: string, original: string): string => {\n let cleaned = translated;\n const wrapRegex = /^```(?:markdown|md|txt)?\\n([\\s\\S]*?)\\n```$/i;\n const match = cleaned.match(wrapRegex);\n if (match) cleaned = match[1];\n\n if (!original.startsWith('\\n') && cleaned.startsWith('\\n')) {\n cleaned = cleaned.replace(/^\\n+/, '');\n }\n if (!original.startsWith(' ') && cleaned.startsWith(' ')) {\n cleaned = cleaned.trimStart();\n }\n return cleaned;\n};\n"],"mappings":"mEAMA,MAAa,GACX,EACA,EACA,IACY,CACZ,IAAM,EAAmB,EAAE,CAG3B,GAAI,EAAS,WAAW,CAAC,WAAW,MAAM,CAAE,CACrC,EAAW,WAAW,CAAC,WAAW,MAAM,EAC3C,EAAO,KACL,sEACD,CAEH,IAAM,GAAkB,EAAS,MAAM,UAAU,EAAI,EAAE,EAAE,OACnD,GAAoB,EAAW,MAAM,UAAU,EAAI,EAAE,EAAE,OACzD,GAAkB,GAAK,EAAmB,GAC5C,EAAO,KACL,4EACD,CAKL,IAAM,EAAa,YACb,GAAkB,EAAS,MAAM,EAAW,EAAI,EAAE,EAAE,OACpD,GAAoB,EAAW,MAAM,EAAW,EAAI,EAAE,EAAE,OAE1D,IAAmB,GACrB,EAAO,KACL,kCAAkC,EAAe,eAAe,IACjE,CAIH,IAAM,EAAQ,EAAW,QAAU,EAAS,QAAU,GAChD,EAAY,EAAQ,IACpB,EAAsB,EAAS,OAAS,GAE1C,GAAa,GACf,EAAO,KACL,+BAA+B,EAAW,OAAO,kBAAkB,EAAS,OAAO,IAAI,EAAM,QAAQ,EAAE,CAAC,8BACzG,CAIH,IAAM,EAAgB,EAAS,MAAM;EAAK,CAAC,OACrC,EAAkB,EAAW,MAAM;EAAK,CAAC,OAe/C,OAbI,EAAgB,GACd,EAAkB,EAAgB,IACpC,EAAO,KACL,oCAAoC,EAAgB,oBAAoB,EAAc,4BACvF,CAID,EAAO,OAAS,GAClB,EAAO,sBAAsB,EAAO,KAAK,KAAK,GAAG,CAC1C,IAGF,IAMI,GAAiB,EAAoB,IAA6B,CAC7E,IAAI,EAAU,EAER,EAAQ,EAAQ,MADJ,8CACoB,CAStC,OARI,IAAO,EAAU,EAAM,IAEvB,CAAC,EAAS,WAAW;EAAK,EAAI,EAAQ,WAAW;EAAK,GACxD,EAAU,EAAQ,QAAQ,OAAQ,GAAG,EAEnC,CAAC,EAAS,WAAW,IAAI,EAAI,EAAQ,WAAW,IAAI,GACtD,EAAU,EAAQ,WAAW,EAExB"}
@@ -1,68 +1,2 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_translation_alignment_computeSimilarity = require('./computeSimilarity.cjs');
3
-
4
- //#region src/translation-alignment/alignBlocks.ts
5
- const alignEnglishAndFrenchBlocks = (defaultBlocks, secondaryBlocks) => {
6
- const defaultLength = defaultBlocks.length;
7
- const secondaryLength = secondaryBlocks.length;
8
- const scoreMatrix = Array.from({ length: defaultLength + 1 }, () => Array.from({ length: secondaryLength + 1 }, () => 0));
9
- const traceMatrix = Array.from({ length: defaultLength + 1 }, () => Array.from({ length: secondaryLength + 1 }, () => "diagonal"));
10
- const gapPenalty = -2;
11
- const computeMatchScore = (defaultIndex, secondaryIndex) => {
12
- const defaultBlock = defaultBlocks[defaultIndex];
13
- const secondaryBlock = secondaryBlocks[secondaryIndex];
14
- const typeBonus = defaultBlock.type === secondaryBlock.type ? 2 : 0;
15
- const anchorSimilarity = require_translation_alignment_computeSimilarity.computeJaccardSimilarity(defaultBlock.anchorText, secondaryBlock.anchorText, 3);
16
- return typeBonus + (Math.min(defaultBlock.content.length, secondaryBlock.content.length) / Math.max(defaultBlock.content.length, secondaryBlock.content.length) > .75 ? 1 : 0) + anchorSimilarity * 8;
17
- };
18
- for (let i = 1; i <= defaultLength; i += 1) {
19
- scoreMatrix[i][0] = scoreMatrix[i - 1][0] + gapPenalty;
20
- traceMatrix[i][0] = "up";
21
- }
22
- for (let j = 1; j <= secondaryLength; j += 1) {
23
- scoreMatrix[0][j] = scoreMatrix[0][j - 1] + gapPenalty;
24
- traceMatrix[0][j] = "left";
25
- }
26
- for (let i = 1; i <= defaultLength; i += 1) for (let j = 1; j <= secondaryLength; j += 1) {
27
- const match = scoreMatrix[i - 1][j - 1] + computeMatchScore(i - 1, j - 1);
28
- const deleteGap = scoreMatrix[i - 1][j] + gapPenalty;
29
- const insertGap = scoreMatrix[i][j - 1] + gapPenalty;
30
- const best = Math.max(match, deleteGap, insertGap);
31
- scoreMatrix[i][j] = best;
32
- traceMatrix[i][j] = best === match ? "diagonal" : best === deleteGap ? "up" : "left";
33
- }
34
- const result = [];
35
- let i = defaultLength;
36
- let j = secondaryLength;
37
- while (i > 0 || j > 0) if (i > 0 && j > 0 && traceMatrix[i][j] === "diagonal") {
38
- const englishIndex = i - 1;
39
- const frenchIndex = j - 1;
40
- const similarityScore = require_translation_alignment_computeSimilarity.computeJaccardSimilarity(defaultBlocks[englishIndex].anchorText, secondaryBlocks[frenchIndex].anchorText, 3);
41
- result.unshift({
42
- englishIndex,
43
- frenchIndex,
44
- similarityScore
45
- });
46
- i -= 1;
47
- j -= 1;
48
- } else if (i > 0 && (j === 0 || traceMatrix[i][j] === "up")) {
49
- result.unshift({
50
- englishIndex: i - 1,
51
- frenchIndex: null,
52
- similarityScore: 0
53
- });
54
- i -= 1;
55
- } else if (j > 0 && (i === 0 || traceMatrix[i][j] === "left")) {
56
- result.unshift({
57
- englishIndex: -1,
58
- frenchIndex: j - 1,
59
- similarityScore: 0
60
- });
61
- j -= 1;
62
- }
63
- return result;
64
- };
65
-
66
- //#endregion
67
- exports.alignEnglishAndFrenchBlocks = alignEnglishAndFrenchBlocks;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./computeSimilarity.cjs`),t=(t,n)=>{let r=t.length,i=n.length,a=Array.from({length:r+1},()=>Array.from({length:i+1},()=>0)),o=Array.from({length:r+1},()=>Array.from({length:i+1},()=>`diagonal`)),s=(r,i)=>{let a=t[r],o=n[i],s=a.type===o.type?2:0,c=e.computeJaccardSimilarity(a.anchorText,o.anchorText,3);return s+(Math.min(a.content.length,o.content.length)/Math.max(a.content.length,o.content.length)>.75?1:0)+c*8};for(let e=1;e<=r;e+=1)a[e][0]=a[e-1][0]+-2,o[e][0]=`up`;for(let e=1;e<=i;e+=1)a[0][e]=a[0][e-1]+-2,o[0][e]=`left`;for(let e=1;e<=r;e+=1)for(let t=1;t<=i;t+=1){let n=a[e-1][t-1]+s(e-1,t-1),r=a[e-1][t]+-2,i=a[e][t-1]+-2,c=Math.max(n,r,i);a[e][t]=c,o[e][t]=c===n?`diagonal`:c===r?`up`:`left`}let c=[],l=r,u=i;for(;l>0||u>0;)if(l>0&&u>0&&o[l][u]===`diagonal`){let r=l-1,i=u-1,a=e.computeJaccardSimilarity(t[r].anchorText,n[i].anchorText,3);c.unshift({englishIndex:r,frenchIndex:i,similarityScore:a}),--l,--u}else l>0&&(u===0||o[l][u]===`up`)?(c.unshift({englishIndex:l-1,frenchIndex:null,similarityScore:0}),--l):u>0&&(l===0||o[l][u]===`left`)&&(c.unshift({englishIndex:-1,frenchIndex:u-1,similarityScore:0}),--u);return c};exports.alignEnglishAndFrenchBlocks=t;
68
2
  //# sourceMappingURL=alignBlocks.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"alignBlocks.cjs","names":["computeJaccardSimilarity"],"sources":["../../../src/translation-alignment/alignBlocks.ts"],"sourcesContent":["import { computeJaccardSimilarity } from './computeSimilarity';\nimport type { AlignmentPair, FingerprintedBlock } from './types';\n\nexport const alignEnglishAndFrenchBlocks = (\n defaultBlocks: FingerprintedBlock[],\n secondaryBlocks: FingerprintedBlock[]\n): AlignmentPair[] => {\n // Needleman–Wunsch style global alignment using anchor similarity and type equality\n const defaultLength = defaultBlocks.length;\n const secondaryLength = secondaryBlocks.length;\n\n const scoreMatrix: number[][] = Array.from(\n { length: defaultLength + 1 },\n () => Array.from({ length: secondaryLength + 1 }, () => 0)\n );\n const traceMatrix: ('diagonal' | 'up' | 'left')[][] = Array.from(\n { length: defaultLength + 1 },\n () => Array.from({ length: secondaryLength + 1 }, () => 'diagonal')\n );\n\n const gapPenalty = -2;\n\n const computeMatchScore = (\n defaultIndex: number,\n secondaryIndex: number\n ): number => {\n const defaultBlock = defaultBlocks[defaultIndex];\n const secondaryBlock = secondaryBlocks[secondaryIndex];\n const typeBonus = defaultBlock.type === secondaryBlock.type ? 2 : 0;\n const anchorSimilarity = computeJaccardSimilarity(\n defaultBlock.anchorText,\n secondaryBlock.anchorText,\n 3\n );\n const lengthRatio =\n Math.min(defaultBlock.content.length, secondaryBlock.content.length) /\n Math.max(defaultBlock.content.length, secondaryBlock.content.length);\n const lengthBonus = lengthRatio > 0.75 ? 1 : 0;\n return typeBonus + lengthBonus + anchorSimilarity * 8; // weighted toward anchor similarity\n };\n\n // initialize first row and column\n for (let i = 1; i <= defaultLength; i += 1) {\n scoreMatrix[i][0] = scoreMatrix[i - 1][0] + gapPenalty;\n traceMatrix[i][0] = 'up';\n }\n for (let j = 1; j <= secondaryLength; j += 1) {\n scoreMatrix[0][j] = scoreMatrix[0][j - 1] + gapPenalty;\n traceMatrix[0][j] = 'left';\n }\n\n // fill\n for (let i = 1; i <= defaultLength; i += 1) {\n for (let j = 1; j <= secondaryLength; j += 1) {\n const match = scoreMatrix[i - 1][j - 1] + computeMatchScore(i - 1, j - 1);\n const deleteGap = scoreMatrix[i - 1][j] + gapPenalty;\n const insertGap = scoreMatrix[i][j - 1] + gapPenalty;\n\n const best = Math.max(match, deleteGap, insertGap);\n scoreMatrix[i][j] = best;\n traceMatrix[i][j] =\n best === match ? 'diagonal' : best === deleteGap ? 'up' : 'left';\n }\n }\n\n // traceback\n const result: AlignmentPair[] = [];\n let i = defaultLength;\n let j = secondaryLength;\n while (i > 0 || j > 0) {\n if (i > 0 && j > 0 && traceMatrix[i][j] === 'diagonal') {\n const englishIndex = i - 1;\n const frenchIndex = j - 1;\n const similarityScore = computeJaccardSimilarity(\n defaultBlocks[englishIndex].anchorText,\n secondaryBlocks[frenchIndex].anchorText,\n 3\n );\n result.unshift({ englishIndex, frenchIndex, similarityScore });\n i -= 1;\n j -= 1;\n } else if (i > 0 && (j === 0 || traceMatrix[i][j] === 'up')) {\n result.unshift({\n englishIndex: i - 1,\n frenchIndex: null,\n similarityScore: 0,\n });\n i -= 1;\n } else if (j > 0 && (i === 0 || traceMatrix[i][j] === 'left')) {\n // french block has no corresponding english block (deleted)\n result.unshift({\n englishIndex: -1,\n frenchIndex: j - 1,\n similarityScore: 0,\n });\n j -= 1;\n }\n }\n return result;\n};\n"],"mappings":";;;;AAGA,MAAa,+BACX,eACA,oBACoB;CAEpB,MAAM,gBAAgB,cAAc;CACpC,MAAM,kBAAkB,gBAAgB;CAExC,MAAM,cAA0B,MAAM,KACpC,EAAE,QAAQ,gBAAgB,GAAG,QACvB,MAAM,KAAK,EAAE,QAAQ,kBAAkB,GAAG,QAAQ,EAAE,CAC3D;CACD,MAAM,cAAgD,MAAM,KAC1D,EAAE,QAAQ,gBAAgB,GAAG,QACvB,MAAM,KAAK,EAAE,QAAQ,kBAAkB,GAAG,QAAQ,WAAW,CACpE;CAED,MAAM,aAAa;CAEnB,MAAM,qBACJ,cACA,mBACW;EACX,MAAM,eAAe,cAAc;EACnC,MAAM,iBAAiB,gBAAgB;EACvC,MAAM,YAAY,aAAa,SAAS,eAAe,OAAO,IAAI;EAClE,MAAM,mBAAmBA,yEACvB,aAAa,YACb,eAAe,YACf,EACD;AAKD,SAAO,aAHL,KAAK,IAAI,aAAa,QAAQ,QAAQ,eAAe,QAAQ,OAAO,GACpE,KAAK,IAAI,aAAa,QAAQ,QAAQ,eAAe,QAAQ,OAAO,GACpC,MAAO,IAAI,KACZ,mBAAmB;;AAItD,MAAK,IAAI,IAAI,GAAG,KAAK,eAAe,KAAK,GAAG;AAC1C,cAAY,GAAG,KAAK,YAAY,IAAI,GAAG,KAAK;AAC5C,cAAY,GAAG,KAAK;;AAEtB,MAAK,IAAI,IAAI,GAAG,KAAK,iBAAiB,KAAK,GAAG;AAC5C,cAAY,GAAG,KAAK,YAAY,GAAG,IAAI,KAAK;AAC5C,cAAY,GAAG,KAAK;;AAItB,MAAK,IAAI,IAAI,GAAG,KAAK,eAAe,KAAK,EACvC,MAAK,IAAI,IAAI,GAAG,KAAK,iBAAiB,KAAK,GAAG;EAC5C,MAAM,QAAQ,YAAY,IAAI,GAAG,IAAI,KAAK,kBAAkB,IAAI,GAAG,IAAI,EAAE;EACzE,MAAM,YAAY,YAAY,IAAI,GAAG,KAAK;EAC1C,MAAM,YAAY,YAAY,GAAG,IAAI,KAAK;EAE1C,MAAM,OAAO,KAAK,IAAI,OAAO,WAAW,UAAU;AAClD,cAAY,GAAG,KAAK;AACpB,cAAY,GAAG,KACb,SAAS,QAAQ,aAAa,SAAS,YAAY,OAAO;;CAKhE,MAAM,SAA0B,EAAE;CAClC,IAAI,IAAI;CACR,IAAI,IAAI;AACR,QAAO,IAAI,KAAK,IAAI,EAClB,KAAI,IAAI,KAAK,IAAI,KAAK,YAAY,GAAG,OAAO,YAAY;EACtD,MAAM,eAAe,IAAI;EACzB,MAAM,cAAc,IAAI;EACxB,MAAM,kBAAkBA,yEACtB,cAAc,cAAc,YAC5B,gBAAgB,aAAa,YAC7B,EACD;AACD,SAAO,QAAQ;GAAE;GAAc;GAAa;GAAiB,CAAC;AAC9D,OAAK;AACL,OAAK;YACI,IAAI,MAAM,MAAM,KAAK,YAAY,GAAG,OAAO,OAAO;AAC3D,SAAO,QAAQ;GACb,cAAc,IAAI;GAClB,aAAa;GACb,iBAAiB;GAClB,CAAC;AACF,OAAK;YACI,IAAI,MAAM,MAAM,KAAK,YAAY,GAAG,OAAO,SAAS;AAE7D,SAAO,QAAQ;GACb,cAAc;GACd,aAAa,IAAI;GACjB,iBAAiB;GAClB,CAAC;AACF,OAAK;;AAGT,QAAO"}
1
+ {"version":3,"file":"alignBlocks.cjs","names":["computeJaccardSimilarity"],"sources":["../../../src/translation-alignment/alignBlocks.ts"],"sourcesContent":["import { computeJaccardSimilarity } from './computeSimilarity';\nimport type { AlignmentPair, FingerprintedBlock } from './types';\n\nexport const alignEnglishAndFrenchBlocks = (\n defaultBlocks: FingerprintedBlock[],\n secondaryBlocks: FingerprintedBlock[]\n): AlignmentPair[] => {\n // Needleman–Wunsch style global alignment using anchor similarity and type equality\n const defaultLength = defaultBlocks.length;\n const secondaryLength = secondaryBlocks.length;\n\n const scoreMatrix: number[][] = Array.from(\n { length: defaultLength + 1 },\n () => Array.from({ length: secondaryLength + 1 }, () => 0)\n );\n const traceMatrix: ('diagonal' | 'up' | 'left')[][] = Array.from(\n { length: defaultLength + 1 },\n () => Array.from({ length: secondaryLength + 1 }, () => 'diagonal')\n );\n\n const gapPenalty = -2;\n\n const computeMatchScore = (\n defaultIndex: number,\n secondaryIndex: number\n ): number => {\n const defaultBlock = defaultBlocks[defaultIndex];\n const secondaryBlock = secondaryBlocks[secondaryIndex];\n const typeBonus = defaultBlock.type === secondaryBlock.type ? 2 : 0;\n const anchorSimilarity = computeJaccardSimilarity(\n defaultBlock.anchorText,\n secondaryBlock.anchorText,\n 3\n );\n const lengthRatio =\n Math.min(defaultBlock.content.length, secondaryBlock.content.length) /\n Math.max(defaultBlock.content.length, secondaryBlock.content.length);\n const lengthBonus = lengthRatio > 0.75 ? 1 : 0;\n return typeBonus + lengthBonus + anchorSimilarity * 8; // weighted toward anchor similarity\n };\n\n // initialize first row and column\n for (let i = 1; i <= defaultLength; i += 1) {\n scoreMatrix[i][0] = scoreMatrix[i - 1][0] + gapPenalty;\n traceMatrix[i][0] = 'up';\n }\n for (let j = 1; j <= secondaryLength; j += 1) {\n scoreMatrix[0][j] = scoreMatrix[0][j - 1] + gapPenalty;\n traceMatrix[0][j] = 'left';\n }\n\n // fill\n for (let i = 1; i <= defaultLength; i += 1) {\n for (let j = 1; j <= secondaryLength; j += 1) {\n const match = scoreMatrix[i - 1][j - 1] + computeMatchScore(i - 1, j - 1);\n const deleteGap = scoreMatrix[i - 1][j] + gapPenalty;\n const insertGap = scoreMatrix[i][j - 1] + gapPenalty;\n\n const best = Math.max(match, deleteGap, insertGap);\n scoreMatrix[i][j] = best;\n traceMatrix[i][j] =\n best === match ? 'diagonal' : best === deleteGap ? 'up' : 'left';\n }\n }\n\n // traceback\n const result: AlignmentPair[] = [];\n let i = defaultLength;\n let j = secondaryLength;\n while (i > 0 || j > 0) {\n if (i > 0 && j > 0 && traceMatrix[i][j] === 'diagonal') {\n const englishIndex = i - 1;\n const frenchIndex = j - 1;\n const similarityScore = computeJaccardSimilarity(\n defaultBlocks[englishIndex].anchorText,\n secondaryBlocks[frenchIndex].anchorText,\n 3\n );\n result.unshift({ englishIndex, frenchIndex, similarityScore });\n i -= 1;\n j -= 1;\n } else if (i > 0 && (j === 0 || traceMatrix[i][j] === 'up')) {\n result.unshift({\n englishIndex: i - 1,\n frenchIndex: null,\n similarityScore: 0,\n });\n i -= 1;\n } else if (j > 0 && (i === 0 || traceMatrix[i][j] === 'left')) {\n // french block has no corresponding english block (deleted)\n result.unshift({\n englishIndex: -1,\n frenchIndex: j - 1,\n similarityScore: 0,\n });\n j -= 1;\n }\n }\n return result;\n};\n"],"mappings":"8GAGa,GACX,EACA,IACoB,CAEpB,IAAM,EAAgB,EAAc,OAC9B,EAAkB,EAAgB,OAElC,EAA0B,MAAM,KACpC,CAAE,OAAQ,EAAgB,EAAG,KACvB,MAAM,KAAK,CAAE,OAAQ,EAAkB,EAAG,KAAQ,EAAE,CAC3D,CACK,EAAgD,MAAM,KAC1D,CAAE,OAAQ,EAAgB,EAAG,KACvB,MAAM,KAAK,CAAE,OAAQ,EAAkB,EAAG,KAAQ,WAAW,CACpE,CAIK,GACJ,EACA,IACW,CACX,IAAM,EAAe,EAAc,GAC7B,EAAiB,EAAgB,GACjC,EAAY,EAAa,OAAS,EAAe,KAAO,EAAI,EAC5D,EAAmBA,EAAAA,yBACvB,EAAa,WACb,EAAe,WACf,EACD,CAKD,OAAO,GAHL,KAAK,IAAI,EAAa,QAAQ,OAAQ,EAAe,QAAQ,OAAO,CACpE,KAAK,IAAI,EAAa,QAAQ,OAAQ,EAAe,QAAQ,OAAO,CACpC,IAAO,EAAI,GACZ,EAAmB,GAItD,IAAK,IAAI,EAAI,EAAG,GAAK,EAAe,GAAK,EACvC,EAAY,GAAG,GAAK,EAAY,EAAI,GAAG,GAAK,GAC5C,EAAY,GAAG,GAAK,KAEtB,IAAK,IAAI,EAAI,EAAG,GAAK,EAAiB,GAAK,EACzC,EAAY,GAAG,GAAK,EAAY,GAAG,EAAI,GAAK,GAC5C,EAAY,GAAG,GAAK,OAItB,IAAK,IAAI,EAAI,EAAG,GAAK,EAAe,GAAK,EACvC,IAAK,IAAI,EAAI,EAAG,GAAK,EAAiB,GAAK,EAAG,CAC5C,IAAM,EAAQ,EAAY,EAAI,GAAG,EAAI,GAAK,EAAkB,EAAI,EAAG,EAAI,EAAE,CACnE,EAAY,EAAY,EAAI,GAAG,GAAK,GACpC,EAAY,EAAY,GAAG,EAAI,GAAK,GAEpC,EAAO,KAAK,IAAI,EAAO,EAAW,EAAU,CAClD,EAAY,GAAG,GAAK,EACpB,EAAY,GAAG,GACb,IAAS,EAAQ,WAAa,IAAS,EAAY,KAAO,OAKhE,IAAM,EAA0B,EAAE,CAC9B,EAAI,EACJ,EAAI,EACR,KAAO,EAAI,GAAK,EAAI,GAClB,GAAI,EAAI,GAAK,EAAI,GAAK,EAAY,GAAG,KAAO,WAAY,CACtD,IAAM,EAAe,EAAI,EACnB,EAAc,EAAI,EAClB,EAAkBA,EAAAA,yBACtB,EAAc,GAAc,WAC5B,EAAgB,GAAa,WAC7B,EACD,CACD,EAAO,QAAQ,CAAE,eAAc,cAAa,kBAAiB,CAAC,CAC9D,IACA,SACS,EAAI,IAAM,IAAM,GAAK,EAAY,GAAG,KAAO,OACpD,EAAO,QAAQ,CACb,aAAc,EAAI,EAClB,YAAa,KACb,gBAAiB,EAClB,CAAC,CACF,KACS,EAAI,IAAM,IAAM,GAAK,EAAY,GAAG,KAAO,UAEpD,EAAO,QAAQ,CACb,aAAc,GACd,YAAa,EAAI,EACjB,gBAAiB,EAClB,CAAC,CACF,KAGJ,OAAO"}
@@ -1,26 +1,2 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
-
3
- //#region src/translation-alignment/computeSimilarity.ts
4
- const generateCharacterShingles = (text, shingleLength) => {
5
- const normalized = text.replace(/\s+/g, " ").trim();
6
- const set = /* @__PURE__ */ new Set();
7
- if (normalized.length < shingleLength) {
8
- if (normalized.length > 0) set.add(normalized);
9
- return set;
10
- }
11
- for (let index = 0; index <= normalized.length - shingleLength; index += 1) set.add(normalized.slice(index, index + shingleLength));
12
- return set;
13
- };
14
- const computeJaccardSimilarity = (a, b, shingleLength = 3) => {
15
- const setA = generateCharacterShingles(a, shingleLength);
16
- const setB = generateCharacterShingles(b, shingleLength);
17
- if (setA.size === 0 && setB.size === 0) return 1;
18
- const intersectionSize = Array.from(setA).filter((token) => setB.has(token)).length;
19
- const unionSize = new Set([...Array.from(setA), ...Array.from(setB)]).size;
20
- return unionSize === 0 ? 0 : intersectionSize / unionSize;
21
- };
22
-
23
- //#endregion
24
- exports.computeJaccardSimilarity = computeJaccardSimilarity;
25
- exports.generateCharacterShingles = generateCharacterShingles;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=(e,t)=>{let n=e.replace(/\s+/g,` `).trim(),r=new Set;if(n.length<t)return n.length>0&&r.add(n),r;for(let e=0;e<=n.length-t;e+=1)r.add(n.slice(e,e+t));return r},t=(t,n,r=3)=>{let i=e(t,r),a=e(n,r);if(i.size===0&&a.size===0)return 1;let o=Array.from(i).filter(e=>a.has(e)).length,s=new Set([...Array.from(i),...Array.from(a)]).size;return s===0?0:o/s};exports.computeJaccardSimilarity=t,exports.generateCharacterShingles=e;
26
2
  //# sourceMappingURL=computeSimilarity.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"computeSimilarity.cjs","names":[],"sources":["../../../src/translation-alignment/computeSimilarity.ts"],"sourcesContent":["// Character shingle Jaccard similarity (language agnostic)\nexport const generateCharacterShingles = (\n text: string,\n shingleLength: number\n): Set<string> => {\n const normalized = text.replace(/\\s+/g, ' ').trim();\n const set = new Set<string>();\n if (normalized.length < shingleLength) {\n if (normalized.length > 0) {\n set.add(normalized);\n }\n return set;\n }\n for (let index = 0; index <= normalized.length - shingleLength; index += 1) {\n set.add(normalized.slice(index, index + shingleLength));\n }\n return set;\n};\n\nexport const computeJaccardSimilarity = (\n a: string,\n b: string,\n shingleLength: number = 3\n): number => {\n const setA = generateCharacterShingles(a, shingleLength);\n const setB = generateCharacterShingles(b, shingleLength);\n if (setA.size === 0 && setB.size === 0) return 1;\n const intersectionSize = Array.from(setA).filter((token) =>\n setB.has(token)\n ).length;\n const unionSize = new Set([...Array.from(setA), ...Array.from(setB)]).size;\n return unionSize === 0 ? 0 : intersectionSize / unionSize;\n};\n"],"mappings":";;;AACA,MAAa,6BACX,MACA,kBACgB;CAChB,MAAM,aAAa,KAAK,QAAQ,QAAQ,IAAI,CAAC,MAAM;CACnD,MAAM,sBAAM,IAAI,KAAa;AAC7B,KAAI,WAAW,SAAS,eAAe;AACrC,MAAI,WAAW,SAAS,EACtB,KAAI,IAAI,WAAW;AAErB,SAAO;;AAET,MAAK,IAAI,QAAQ,GAAG,SAAS,WAAW,SAAS,eAAe,SAAS,EACvE,KAAI,IAAI,WAAW,MAAM,OAAO,QAAQ,cAAc,CAAC;AAEzD,QAAO;;AAGT,MAAa,4BACX,GACA,GACA,gBAAwB,MACb;CACX,MAAM,OAAO,0BAA0B,GAAG,cAAc;CACxD,MAAM,OAAO,0BAA0B,GAAG,cAAc;AACxD,KAAI,KAAK,SAAS,KAAK,KAAK,SAAS,EAAG,QAAO;CAC/C,MAAM,mBAAmB,MAAM,KAAK,KAAK,CAAC,QAAQ,UAChD,KAAK,IAAI,MAAM,CAChB,CAAC;CACF,MAAM,YAAY,IAAI,IAAI,CAAC,GAAG,MAAM,KAAK,KAAK,EAAE,GAAG,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC;AACtE,QAAO,cAAc,IAAI,IAAI,mBAAmB"}
1
+ {"version":3,"file":"computeSimilarity.cjs","names":[],"sources":["../../../src/translation-alignment/computeSimilarity.ts"],"sourcesContent":["// Character shingle Jaccard similarity (language agnostic)\nexport const generateCharacterShingles = (\n text: string,\n shingleLength: number\n): Set<string> => {\n const normalized = text.replace(/\\s+/g, ' ').trim();\n const set = new Set<string>();\n if (normalized.length < shingleLength) {\n if (normalized.length > 0) {\n set.add(normalized);\n }\n return set;\n }\n for (let index = 0; index <= normalized.length - shingleLength; index += 1) {\n set.add(normalized.slice(index, index + shingleLength));\n }\n return set;\n};\n\nexport const computeJaccardSimilarity = (\n a: string,\n b: string,\n shingleLength: number = 3\n): number => {\n const setA = generateCharacterShingles(a, shingleLength);\n const setB = generateCharacterShingles(b, shingleLength);\n if (setA.size === 0 && setB.size === 0) return 1;\n const intersectionSize = Array.from(setA).filter((token) =>\n setB.has(token)\n ).length;\n const unionSize = new Set([...Array.from(setA), ...Array.from(setB)]).size;\n return unionSize === 0 ? 0 : intersectionSize / unionSize;\n};\n"],"mappings":"mEACA,MAAa,GACX,EACA,IACgB,CAChB,IAAM,EAAa,EAAK,QAAQ,OAAQ,IAAI,CAAC,MAAM,CAC7C,EAAM,IAAI,IAChB,GAAI,EAAW,OAAS,EAItB,OAHI,EAAW,OAAS,GACtB,EAAI,IAAI,EAAW,CAEd,EAET,IAAK,IAAI,EAAQ,EAAG,GAAS,EAAW,OAAS,EAAe,GAAS,EACvE,EAAI,IAAI,EAAW,MAAM,EAAO,EAAQ,EAAc,CAAC,CAEzD,OAAO,GAGI,GACX,EACA,EACA,EAAwB,IACb,CACX,IAAM,EAAO,EAA0B,EAAG,EAAc,CAClD,EAAO,EAA0B,EAAG,EAAc,CACxD,GAAI,EAAK,OAAS,GAAK,EAAK,OAAS,EAAG,MAAO,GAC/C,IAAM,EAAmB,MAAM,KAAK,EAAK,CAAC,OAAQ,GAChD,EAAK,IAAI,EAAM,CAChB,CAAC,OACI,EAAY,IAAI,IAAI,CAAC,GAAG,MAAM,KAAK,EAAK,CAAE,GAAG,MAAM,KAAK,EAAK,CAAC,CAAC,CAAC,KACtE,OAAO,IAAc,EAAI,EAAI,EAAmB"}
@@ -1,24 +1,2 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
3
- let node_crypto = require("node:crypto");
4
- node_crypto = require_runtime.__toESM(node_crypto);
5
-
6
- //#region src/translation-alignment/fingerprintBlock.ts
7
- const computeStringDigest = (text) => node_crypto.default.createHash("sha256").update(text).digest("hex");
8
- const fingerprintBlock = (block, previousBlock, nextBlock) => {
9
- const semanticDigest = computeStringDigest(block.semanticText);
10
- const anchorDigest = computeStringDigest(block.anchorText);
11
- const compositeKey = `${semanticDigest}:${anchorDigest}`;
12
- const contextKey = computeStringDigest(`${computeStringDigest(previousBlock?.semanticText ?? "")}:${computeStringDigest(nextBlock?.semanticText ?? "")}`);
13
- return {
14
- ...block,
15
- semanticDigest,
16
- anchorDigest,
17
- compositeKey,
18
- contextKey
19
- };
20
- };
21
-
22
- //#endregion
23
- exports.fingerprintBlock = fingerprintBlock;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../_virtual/_rolldown/runtime.cjs`);let t=require(`node:crypto`);t=e.__toESM(t);const n=e=>t.default.createHash(`sha256`).update(e).digest(`hex`),r=(e,t,r)=>{let i=n(e.semanticText),a=n(e.anchorText),o=`${i}:${a}`,s=n(`${n(t?.semanticText??``)}:${n(r?.semanticText??``)}`);return{...e,semanticDigest:i,anchorDigest:a,compositeKey:o,contextKey:s}};exports.fingerprintBlock=r;
24
2
  //# sourceMappingURL=fingerprintBlock.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"fingerprintBlock.cjs","names":["crypto"],"sources":["../../../src/translation-alignment/fingerprintBlock.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport type { FingerprintedBlock, NormalizedBlock } from './types';\n\nconst computeStringDigest = (text: string): string =>\n crypto.createHash('sha256').update(text).digest('hex');\n\nexport const fingerprintBlock = (\n block: NormalizedBlock,\n previousBlock: NormalizedBlock | null,\n nextBlock: NormalizedBlock | null\n): FingerprintedBlock => {\n const semanticDigest = computeStringDigest(block.semanticText);\n const anchorDigest = computeStringDigest(block.anchorText);\n const compositeKey = `${semanticDigest}:${anchorDigest}`;\n\n const previousDigest = computeStringDigest(previousBlock?.semanticText ?? '');\n const nextDigest = computeStringDigest(nextBlock?.semanticText ?? '');\n const contextKey = computeStringDigest(`${previousDigest}:${nextDigest}`);\n\n return {\n ...block,\n semanticDigest,\n anchorDigest,\n compositeKey,\n contextKey,\n };\n};\n"],"mappings":";;;;;;AAGA,MAAM,uBAAuB,SAC3BA,oBAAO,WAAW,SAAS,CAAC,OAAO,KAAK,CAAC,OAAO,MAAM;AAExD,MAAa,oBACX,OACA,eACA,cACuB;CACvB,MAAM,iBAAiB,oBAAoB,MAAM,aAAa;CAC9D,MAAM,eAAe,oBAAoB,MAAM,WAAW;CAC1D,MAAM,eAAe,GAAG,eAAe,GAAG;CAI1C,MAAM,aAAa,oBAAoB,GAFhB,oBAAoB,eAAe,gBAAgB,GAAG,CAEpB,GADtC,oBAAoB,WAAW,gBAAgB,GAAG,GACI;AAEzE,QAAO;EACL,GAAG;EACH;EACA;EACA;EACA;EACD"}
1
+ {"version":3,"file":"fingerprintBlock.cjs","names":["crypto"],"sources":["../../../src/translation-alignment/fingerprintBlock.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport type { FingerprintedBlock, NormalizedBlock } from './types';\n\nconst computeStringDigest = (text: string): string =>\n crypto.createHash('sha256').update(text).digest('hex');\n\nexport const fingerprintBlock = (\n block: NormalizedBlock,\n previousBlock: NormalizedBlock | null,\n nextBlock: NormalizedBlock | null\n): FingerprintedBlock => {\n const semanticDigest = computeStringDigest(block.semanticText);\n const anchorDigest = computeStringDigest(block.anchorText);\n const compositeKey = `${semanticDigest}:${anchorDigest}`;\n\n const previousDigest = computeStringDigest(previousBlock?.semanticText ?? '');\n const nextDigest = computeStringDigest(nextBlock?.semanticText ?? '');\n const contextKey = computeStringDigest(`${previousDigest}:${nextDigest}`);\n\n return {\n ...block,\n semanticDigest,\n anchorDigest,\n compositeKey,\n contextKey,\n };\n};\n"],"mappings":"oKAGA,MAAM,EAAuB,GAC3BA,EAAAA,QAAO,WAAW,SAAS,CAAC,OAAO,EAAK,CAAC,OAAO,MAAM,CAE3C,GACX,EACA,EACA,IACuB,CACvB,IAAM,EAAiB,EAAoB,EAAM,aAAa,CACxD,EAAe,EAAoB,EAAM,WAAW,CACpD,EAAe,GAAG,EAAe,GAAG,IAIpC,EAAa,EAAoB,GAFhB,EAAoB,GAAe,cAAgB,GAAG,CAEpB,GADtC,EAAoB,GAAW,cAAgB,GAAG,GACI,CAEzE,MAAO,CACL,GAAG,EACH,iBACA,eACA,eACA,aACD"}
@@ -1,22 +1 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_translation_alignment_computeSimilarity = require('./computeSimilarity.cjs');
3
- const require_translation_alignment_alignBlocks = require('./alignBlocks.cjs');
4
- const require_translation_alignment_fingerprintBlock = require('./fingerprintBlock.cjs');
5
- const require_translation_alignment_mapChangedLinesToBlocks = require('./mapChangedLinesToBlocks.cjs');
6
- const require_translation_alignment_normalizeBlock = require('./normalizeBlock.cjs');
7
- const require_translation_alignment_planActions = require('./planActions.cjs');
8
- const require_translation_alignment_rebuildDocument = require('./rebuildDocument.cjs');
9
- const require_translation_alignment_segmentDocument = require('./segmentDocument.cjs');
10
- const require_translation_alignment_pipeline = require('./pipeline.cjs');
11
-
12
- exports.alignEnglishAndFrenchBlocks = require_translation_alignment_alignBlocks.alignEnglishAndFrenchBlocks;
13
- exports.buildAlignmentPlan = require_translation_alignment_pipeline.buildAlignmentPlan;
14
- exports.computeJaccardSimilarity = require_translation_alignment_computeSimilarity.computeJaccardSimilarity;
15
- exports.fingerprintBlock = require_translation_alignment_fingerprintBlock.fingerprintBlock;
16
- exports.generateCharacterShingles = require_translation_alignment_computeSimilarity.generateCharacterShingles;
17
- exports.identifySegmentsToReview = require_translation_alignment_rebuildDocument.identifySegmentsToReview;
18
- exports.mapChangedLinesToBlocks = require_translation_alignment_mapChangedLinesToBlocks.mapChangedLinesToBlocks;
19
- exports.mergeReviewedSegments = require_translation_alignment_rebuildDocument.mergeReviewedSegments;
20
- exports.normalizeBlock = require_translation_alignment_normalizeBlock.normalizeBlock;
21
- exports.planAlignmentActions = require_translation_alignment_planActions.planAlignmentActions;
22
- exports.segmentDocument = require_translation_alignment_segmentDocument.segmentDocument;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./computeSimilarity.cjs`),t=require(`./alignBlocks.cjs`),n=require(`./fingerprintBlock.cjs`),r=require(`./mapChangedLinesToBlocks.cjs`),i=require(`./normalizeBlock.cjs`),a=require(`./planActions.cjs`),o=require(`./rebuildDocument.cjs`),s=require(`./segmentDocument.cjs`),c=require(`./pipeline.cjs`);exports.alignEnglishAndFrenchBlocks=t.alignEnglishAndFrenchBlocks,exports.buildAlignmentPlan=c.buildAlignmentPlan,exports.computeJaccardSimilarity=e.computeJaccardSimilarity,exports.fingerprintBlock=n.fingerprintBlock,exports.generateCharacterShingles=e.generateCharacterShingles,exports.identifySegmentsToReview=o.identifySegmentsToReview,exports.mapChangedLinesToBlocks=r.mapChangedLinesToBlocks,exports.mergeReviewedSegments=o.mergeReviewedSegments,exports.normalizeBlock=i.normalizeBlock,exports.planAlignmentActions=a.planAlignmentActions,exports.segmentDocument=s.segmentDocument;
@@ -1,19 +1,2 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
-
3
- //#region src/translation-alignment/mapChangedLinesToBlocks.ts
4
- const mapChangedLinesToBlocks = (blocks, changedLines) => {
5
- const changedSet = /* @__PURE__ */ new Set();
6
- if (!changedLines || changedLines.length === 0) return changedSet;
7
- const changedLookup = new Set(changedLines);
8
- blocks.forEach((block, index) => {
9
- for (let line = block.lineStart; line <= block.lineEnd; line += 1) if (changedLookup.has(line)) {
10
- changedSet.add(index);
11
- break;
12
- }
13
- });
14
- return changedSet;
15
- };
16
-
17
- //#endregion
18
- exports.mapChangedLinesToBlocks = mapChangedLinesToBlocks;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=(e,t)=>{let n=new Set;if(!t||t.length===0)return n;let r=new Set(t);return e.forEach((e,t)=>{for(let i=e.lineStart;i<=e.lineEnd;i+=1)if(r.has(i)){n.add(t);break}}),n};exports.mapChangedLinesToBlocks=e;
19
2
  //# sourceMappingURL=mapChangedLinesToBlocks.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"mapChangedLinesToBlocks.cjs","names":[],"sources":["../../../src/translation-alignment/mapChangedLinesToBlocks.ts"],"sourcesContent":["import type { Block, LineChange } from './types';\n\nexport const mapChangedLinesToBlocks = (\n blocks: Block[],\n changedLines: LineChange[]\n): Set<number> => {\n const changedSet = new Set<number>();\n if (!changedLines || changedLines.length === 0) return changedSet;\n\n const changedLookup = new Set<number>(changedLines);\n\n blocks.forEach((block, index) => {\n for (let line = block.lineStart; line <= block.lineEnd; line += 1) {\n if (changedLookup.has(line)) {\n changedSet.add(index);\n break;\n }\n }\n });\n\n return changedSet;\n};\n"],"mappings":";;;AAEA,MAAa,2BACX,QACA,iBACgB;CAChB,MAAM,6BAAa,IAAI,KAAa;AACpC,KAAI,CAAC,gBAAgB,aAAa,WAAW,EAAG,QAAO;CAEvD,MAAM,gBAAgB,IAAI,IAAY,aAAa;AAEnD,QAAO,SAAS,OAAO,UAAU;AAC/B,OAAK,IAAI,OAAO,MAAM,WAAW,QAAQ,MAAM,SAAS,QAAQ,EAC9D,KAAI,cAAc,IAAI,KAAK,EAAE;AAC3B,cAAW,IAAI,MAAM;AACrB;;GAGJ;AAEF,QAAO"}
1
+ {"version":3,"file":"mapChangedLinesToBlocks.cjs","names":[],"sources":["../../../src/translation-alignment/mapChangedLinesToBlocks.ts"],"sourcesContent":["import type { Block, LineChange } from './types';\n\nexport const mapChangedLinesToBlocks = (\n blocks: Block[],\n changedLines: LineChange[]\n): Set<number> => {\n const changedSet = new Set<number>();\n if (!changedLines || changedLines.length === 0) return changedSet;\n\n const changedLookup = new Set<number>(changedLines);\n\n blocks.forEach((block, index) => {\n for (let line = block.lineStart; line <= block.lineEnd; line += 1) {\n if (changedLookup.has(line)) {\n changedSet.add(index);\n break;\n }\n }\n });\n\n return changedSet;\n};\n"],"mappings":"mEAEA,MAAa,GACX,EACA,IACgB,CAChB,IAAM,EAAa,IAAI,IACvB,GAAI,CAAC,GAAgB,EAAa,SAAW,EAAG,OAAO,EAEvD,IAAM,EAAgB,IAAI,IAAY,EAAa,CAWnD,OATA,EAAO,SAAS,EAAO,IAAU,CAC/B,IAAK,IAAI,EAAO,EAAM,UAAW,GAAQ,EAAM,QAAS,GAAQ,EAC9D,GAAI,EAAc,IAAI,EAAK,CAAE,CAC3B,EAAW,IAAI,EAAM,CACrB,QAGJ,CAEK"}
@@ -1,23 +1,2 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
-
3
- //#region src/translation-alignment/normalizeBlock.ts
4
- const removeMarkdownFormatting = (text) => {
5
- return text.replace(/`{1,3}[^`]*`{1,3}/g, " ").replace(/\*\*([^*]+)\*\*/g, "$1").replace(/\*([^*]+)\*/g, "$1").replace(/_([^_]+)_/g, "$1").replace(/~~([^~]+)~~/g, "$1").replace(/!?\[[^\]]*\]\([^)]*\)/g, " ").replace(/^\s*#{1,6}\s+/gm, "").replace(/^\s*>\s?/gm, "").replace(/^\s*[-*+]\s+/gm, "").replace(/^\s*\d+\.\s+/gm, "");
6
- };
7
- const collapseWhitespace = (text) => text.replace(/\s+/g, " ").trim();
8
- const stripLettersKeepDigitsAndSymbols = (text) => {
9
- return text.replace(/\p{L}+/gu, "");
10
- };
11
- const normalizeBlock = (block) => {
12
- const semanticCollapsed = collapseWhitespace(removeMarkdownFormatting(block.content).toLowerCase());
13
- const anchorCollapsed = collapseWhitespace(stripLettersKeepDigitsAndSymbols(block.content));
14
- return {
15
- ...block,
16
- semanticText: semanticCollapsed,
17
- anchorText: anchorCollapsed
18
- };
19
- };
20
-
21
- //#endregion
22
- exports.normalizeBlock = normalizeBlock;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=e=>e.replace(/`{1,3}[^`]*`{1,3}/g,` `).replace(/\*\*([^*]+)\*\*/g,`$1`).replace(/\*([^*]+)\*/g,`$1`).replace(/_([^_]+)_/g,`$1`).replace(/~~([^~]+)~~/g,`$1`).replace(/!?\[[^\]]*\]\([^)]*\)/g,` `).replace(/^\s*#{1,6}\s+/gm,``).replace(/^\s*>\s?/gm,``).replace(/^\s*[-*+]\s+/gm,``).replace(/^\s*\d+\.\s+/gm,``),t=e=>e.replace(/\s+/g,` `).trim(),n=e=>e.replace(/\p{L}+/gu,``),r=r=>{let i=t(e(r.content).toLowerCase()),a=t(n(r.content));return{...r,semanticText:i,anchorText:a}};exports.normalizeBlock=r;
23
2
  //# sourceMappingURL=normalizeBlock.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"normalizeBlock.cjs","names":[],"sources":["../../../src/translation-alignment/normalizeBlock.ts"],"sourcesContent":["import type { Block, NormalizedBlock } from './types';\n\nconst removeMarkdownFormatting = (text: string): string => {\n return text\n .replace(/`{1,3}[^`]*`{1,3}/g, ' ')\n .replace(/\\*\\*([^*]+)\\*\\*/g, '$1')\n .replace(/\\*([^*]+)\\*/g, '$1')\n .replace(/_([^_]+)_/g, '$1')\n .replace(/~~([^~]+)~~/g, '$1')\n .replace(/!?\\[[^\\]]*\\]\\([^)]*\\)/g, ' ')\n .replace(/^\\s*#{1,6}\\s+/gm, '')\n .replace(/^\\s*>\\s?/gm, '')\n .replace(/^\\s*[-*+]\\s+/gm, '')\n .replace(/^\\s*\\d+\\.\\s+/gm, '');\n};\n\nconst collapseWhitespace = (text: string): string =>\n text.replace(/\\s+/g, ' ').trim();\n\nconst stripLettersKeepDigitsAndSymbols = (text: string): string => {\n // Keep digits and non-letter characters, remove all letters (including accents)\n return text.replace(/\\p{L}+/gu, '');\n};\n\nexport const normalizeBlock = (block: Block): NormalizedBlock => {\n const contentWithoutMarkdown = removeMarkdownFormatting(block.content);\n const semanticLowercased = contentWithoutMarkdown.toLowerCase();\n const semanticCollapsed = collapseWhitespace(semanticLowercased);\n\n const anchorOnlySymbols = stripLettersKeepDigitsAndSymbols(block.content);\n const anchorCollapsed = collapseWhitespace(anchorOnlySymbols);\n\n return {\n ...block,\n semanticText: semanticCollapsed,\n anchorText: anchorCollapsed,\n };\n};\n"],"mappings":";;;AAEA,MAAM,4BAA4B,SAAyB;AACzD,QAAO,KACJ,QAAQ,sBAAsB,IAAI,CAClC,QAAQ,oBAAoB,KAAK,CACjC,QAAQ,gBAAgB,KAAK,CAC7B,QAAQ,cAAc,KAAK,CAC3B,QAAQ,gBAAgB,KAAK,CAC7B,QAAQ,0BAA0B,IAAI,CACtC,QAAQ,mBAAmB,GAAG,CAC9B,QAAQ,cAAc,GAAG,CACzB,QAAQ,kBAAkB,GAAG,CAC7B,QAAQ,kBAAkB,GAAG;;AAGlC,MAAM,sBAAsB,SAC1B,KAAK,QAAQ,QAAQ,IAAI,CAAC,MAAM;AAElC,MAAM,oCAAoC,SAAyB;AAEjE,QAAO,KAAK,QAAQ,YAAY,GAAG;;AAGrC,MAAa,kBAAkB,UAAkC;CAG/D,MAAM,oBAAoB,mBAFK,yBAAyB,MAAM,QAAQ,CACpB,aAAa,CACC;CAGhE,MAAM,kBAAkB,mBADE,iCAAiC,MAAM,QAAQ,CACZ;AAE7D,QAAO;EACL,GAAG;EACH,cAAc;EACd,YAAY;EACb"}
1
+ {"version":3,"file":"normalizeBlock.cjs","names":[],"sources":["../../../src/translation-alignment/normalizeBlock.ts"],"sourcesContent":["import type { Block, NormalizedBlock } from './types';\n\nconst removeMarkdownFormatting = (text: string): string => {\n return text\n .replace(/`{1,3}[^`]*`{1,3}/g, ' ')\n .replace(/\\*\\*([^*]+)\\*\\*/g, '$1')\n .replace(/\\*([^*]+)\\*/g, '$1')\n .replace(/_([^_]+)_/g, '$1')\n .replace(/~~([^~]+)~~/g, '$1')\n .replace(/!?\\[[^\\]]*\\]\\([^)]*\\)/g, ' ')\n .replace(/^\\s*#{1,6}\\s+/gm, '')\n .replace(/^\\s*>\\s?/gm, '')\n .replace(/^\\s*[-*+]\\s+/gm, '')\n .replace(/^\\s*\\d+\\.\\s+/gm, '');\n};\n\nconst collapseWhitespace = (text: string): string =>\n text.replace(/\\s+/g, ' ').trim();\n\nconst stripLettersKeepDigitsAndSymbols = (text: string): string => {\n // Keep digits and non-letter characters, remove all letters (including accents)\n return text.replace(/\\p{L}+/gu, '');\n};\n\nexport const normalizeBlock = (block: Block): NormalizedBlock => {\n const contentWithoutMarkdown = removeMarkdownFormatting(block.content);\n const semanticLowercased = contentWithoutMarkdown.toLowerCase();\n const semanticCollapsed = collapseWhitespace(semanticLowercased);\n\n const anchorOnlySymbols = stripLettersKeepDigitsAndSymbols(block.content);\n const anchorCollapsed = collapseWhitespace(anchorOnlySymbols);\n\n return {\n ...block,\n semanticText: semanticCollapsed,\n anchorText: anchorCollapsed,\n };\n};\n"],"mappings":"mEAEA,MAAM,EAA4B,GACzB,EACJ,QAAQ,qBAAsB,IAAI,CAClC,QAAQ,mBAAoB,KAAK,CACjC,QAAQ,eAAgB,KAAK,CAC7B,QAAQ,aAAc,KAAK,CAC3B,QAAQ,eAAgB,KAAK,CAC7B,QAAQ,yBAA0B,IAAI,CACtC,QAAQ,kBAAmB,GAAG,CAC9B,QAAQ,aAAc,GAAG,CACzB,QAAQ,iBAAkB,GAAG,CAC7B,QAAQ,iBAAkB,GAAG,CAG5B,EAAsB,GAC1B,EAAK,QAAQ,OAAQ,IAAI,CAAC,MAAM,CAE5B,EAAoC,GAEjC,EAAK,QAAQ,WAAY,GAAG,CAGxB,EAAkB,GAAkC,CAG/D,IAAM,EAAoB,EAFK,EAAyB,EAAM,QAAQ,CACpB,aAAa,CACC,CAG1D,EAAkB,EADE,EAAiC,EAAM,QAAQ,CACZ,CAE7D,MAAO,CACL,GAAG,EACH,aAAc,EACd,WAAY,EACb"}
@@ -1,38 +1,2 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_translation_alignment_alignBlocks = require('./alignBlocks.cjs');
3
- const require_translation_alignment_fingerprintBlock = require('./fingerprintBlock.cjs');
4
- const require_translation_alignment_mapChangedLinesToBlocks = require('./mapChangedLinesToBlocks.cjs');
5
- const require_translation_alignment_normalizeBlock = require('./normalizeBlock.cjs');
6
- const require_translation_alignment_planActions = require('./planActions.cjs');
7
- const require_translation_alignment_rebuildDocument = require('./rebuildDocument.cjs');
8
- const require_translation_alignment_segmentDocument = require('./segmentDocument.cjs');
9
-
10
- //#region src/translation-alignment/pipeline.ts
11
- const buildAlignmentPlan = ({ englishText, frenchText, changedLines, similarityOptions }) => {
12
- const englishBlocksRaw = require_translation_alignment_segmentDocument.segmentDocument(englishText);
13
- const frenchBlocksRaw = require_translation_alignment_segmentDocument.segmentDocument(frenchText);
14
- const englishNormalized = englishBlocksRaw.map(require_translation_alignment_normalizeBlock.normalizeBlock);
15
- const frenchNormalized = frenchBlocksRaw.map(require_translation_alignment_normalizeBlock.normalizeBlock);
16
- const englishBlocks = englishNormalized.map((block, index, array) => require_translation_alignment_fingerprintBlock.fingerprintBlock(block, array[index - 1] ?? null, array[index + 1] ?? null));
17
- const frenchBlocks = frenchNormalized.map((block, index, array) => require_translation_alignment_fingerprintBlock.fingerprintBlock(block, array[index - 1] ?? null, array[index + 1] ?? null));
18
- const plan = require_translation_alignment_planActions.planAlignmentActions(require_translation_alignment_alignBlocks.alignEnglishAndFrenchBlocks(englishBlocks, frenchBlocks), require_translation_alignment_mapChangedLinesToBlocks.mapChangedLinesToBlocks(englishBlocks, Array.isArray(changedLines) ? changedLines : []), {
19
- minimumMatchForReuse: similarityOptions?.minimumMatchForReuse ?? .9,
20
- minimumMatchForNearDuplicate: similarityOptions?.minimumMatchForNearDuplicate ?? .8
21
- });
22
- const { segmentsToReview } = require_translation_alignment_rebuildDocument.identifySegmentsToReview({
23
- englishBlocks,
24
- frenchBlocks,
25
- plan
26
- });
27
- return {
28
- englishBlocks,
29
- frenchBlocks,
30
- plan,
31
- segmentsToReview
32
- };
33
- };
34
-
35
- //#endregion
36
- exports.buildAlignmentPlan = buildAlignmentPlan;
37
- exports.mergeReviewedSegments = require_translation_alignment_rebuildDocument.mergeReviewedSegments;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./alignBlocks.cjs`),t=require(`./fingerprintBlock.cjs`),n=require(`./mapChangedLinesToBlocks.cjs`),r=require(`./normalizeBlock.cjs`),i=require(`./planActions.cjs`),a=require(`./rebuildDocument.cjs`),o=require(`./segmentDocument.cjs`),s=({englishText:s,frenchText:c,changedLines:l,similarityOptions:u})=>{let d=o.segmentDocument(s),f=o.segmentDocument(c),p=d.map(r.normalizeBlock),m=f.map(r.normalizeBlock),h=p.map((e,n,r)=>t.fingerprintBlock(e,r[n-1]??null,r[n+1]??null)),g=m.map((e,n,r)=>t.fingerprintBlock(e,r[n-1]??null,r[n+1]??null)),_=i.planAlignmentActions(e.alignEnglishAndFrenchBlocks(h,g),n.mapChangedLinesToBlocks(h,Array.isArray(l)?l:[]),{minimumMatchForReuse:u?.minimumMatchForReuse??.9,minimumMatchForNearDuplicate:u?.minimumMatchForNearDuplicate??.8}),{segmentsToReview:v}=a.identifySegmentsToReview({englishBlocks:h,frenchBlocks:g,plan:_});return{englishBlocks:h,frenchBlocks:g,plan:_,segmentsToReview:v}};exports.buildAlignmentPlan=s,exports.mergeReviewedSegments=a.mergeReviewedSegments;
38
2
  //# sourceMappingURL=pipeline.cjs.map