@intlayer/chokidar 6.0.2 → 6.1.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 (292) hide show
  1. package/README.md +249 -66
  2. package/dist/cjs/{transpiler/intlayer_dictionary → buildIntlayerDictionary}/buildIntlayerDictionary.cjs +18 -2
  3. package/dist/cjs/buildIntlayerDictionary/buildIntlayerDictionary.cjs.map +1 -0
  4. package/dist/cjs/{transpiler/intlayer_dictionary → buildIntlayerDictionary}/index.cjs +4 -4
  5. package/dist/cjs/buildIntlayerDictionary/index.cjs.map +1 -0
  6. package/dist/cjs/{transpiler/intlayer_dictionary → buildIntlayerDictionary}/processContentDeclaration.cjs +1 -1
  7. package/dist/cjs/buildIntlayerDictionary/processContentDeclaration.cjs.map +1 -0
  8. package/dist/cjs/{transpiler/intlayer_dictionary → buildIntlayerDictionary}/writeDynamicDictionary.cjs +3 -3
  9. package/dist/cjs/buildIntlayerDictionary/writeDynamicDictionary.cjs.map +1 -0
  10. package/dist/cjs/{transpiler/intlayer_dictionary → buildIntlayerDictionary}/writeFetchDictionary.cjs +2 -2
  11. package/dist/cjs/buildIntlayerDictionary/writeFetchDictionary.cjs.map +1 -0
  12. package/dist/cjs/{transpiler/intlayer_dictionary → buildIntlayerDictionary}/writeMergedDictionary.cjs +4 -4
  13. package/dist/cjs/buildIntlayerDictionary/writeMergedDictionary.cjs.map +1 -0
  14. package/dist/cjs/{transpiler/intlayer_dictionary → buildIntlayerDictionary}/writeRemoteDictionary.cjs +4 -4
  15. package/dist/cjs/buildIntlayerDictionary/writeRemoteDictionary.cjs.map +1 -0
  16. package/dist/cjs/{transpiler/intlayer_dictionary → buildIntlayerDictionary}/writeUnmergedDictionary.cjs +4 -4
  17. package/dist/cjs/buildIntlayerDictionary/writeUnmergedDictionary.cjs.map +1 -0
  18. package/dist/cjs/{transpiler/dictionary_to_main → createDictionaryEntryPoint}/createDictionaryEntryPoint.cjs +7 -7
  19. package/dist/cjs/createDictionaryEntryPoint/createDictionaryEntryPoint.cjs.map +1 -0
  20. package/dist/cjs/{transpiler/dictionary_to_main → createDictionaryEntryPoint}/generateDictionaryListContent.cjs +1 -1
  21. package/dist/cjs/createDictionaryEntryPoint/generateDictionaryListContent.cjs.map +1 -0
  22. package/dist/cjs/createDictionaryEntryPoint/getBuiltDictionariesPath.cjs.map +1 -0
  23. package/dist/cjs/createDictionaryEntryPoint/getBuiltDynamicDictionariesPath.cjs.map +1 -0
  24. package/dist/cjs/createDictionaryEntryPoint/getBuiltFetchDictionariesPath.cjs.map +1 -0
  25. package/dist/cjs/createDictionaryEntryPoint/getBuiltRemoteDictionariesPath.cjs.map +1 -0
  26. package/dist/cjs/createDictionaryEntryPoint/getBuiltUnmergedDictionariesPath.cjs.map +1 -0
  27. package/dist/cjs/createDictionaryEntryPoint/index.cjs +35 -0
  28. package/dist/cjs/createDictionaryEntryPoint/index.cjs.map +1 -0
  29. package/dist/cjs/{transpiler/dictionary_to_type → createType}/createModuleAugmentation.cjs +3 -3
  30. package/dist/cjs/createType/createModuleAugmentation.cjs.map +1 -0
  31. package/dist/cjs/{transpiler/dictionary_to_type → createType}/createType.cjs +1 -1
  32. package/dist/cjs/createType/createType.cjs.map +1 -0
  33. package/dist/cjs/{transpiler/dictionary_to_type → createType}/index.cjs +4 -4
  34. package/dist/cjs/createType/index.cjs.map +1 -0
  35. package/dist/cjs/filterInvalidDictionaries.cjs +32 -40
  36. package/dist/cjs/filterInvalidDictionaries.cjs.map +1 -1
  37. package/dist/cjs/handleAdditionalContentDeclarationFile.cjs +54 -0
  38. package/dist/cjs/handleAdditionalContentDeclarationFile.cjs.map +1 -0
  39. package/dist/cjs/handleContentDeclarationFileChange.cjs +59 -0
  40. package/dist/cjs/handleContentDeclarationFileChange.cjs.map +1 -0
  41. package/dist/cjs/handleUnlikedContentDeclarationFile.cjs +57 -0
  42. package/dist/cjs/handleUnlikedContentDeclarationFile.cjs.map +1 -0
  43. package/dist/cjs/index.cjs +35 -12
  44. package/dist/cjs/index.cjs.map +1 -1
  45. package/dist/cjs/listDictionariesPath.cjs.map +1 -1
  46. package/dist/cjs/loadDictionaries/loadContentDeclaration.cjs +6 -3
  47. package/dist/cjs/loadDictionaries/loadContentDeclaration.cjs.map +1 -1
  48. package/dist/cjs/loadDictionaries/loadLocalDictionaries.cjs +8 -4
  49. package/dist/cjs/loadDictionaries/loadLocalDictionaries.cjs.map +1 -1
  50. package/dist/cjs/prepareIntlayer.cjs +10 -8
  51. package/dist/cjs/prepareIntlayer.cjs.map +1 -1
  52. package/dist/cjs/reduceDictionaryContent/reduceDictionaryContent.cjs +2 -2
  53. package/dist/cjs/reduceDictionaryContent/reduceDictionaryContent.cjs.map +1 -1
  54. package/dist/cjs/utils/extractErrorMessage.cjs +22 -10
  55. package/dist/cjs/utils/extractErrorMessage.cjs.map +1 -1
  56. package/dist/cjs/utils/parallelize.cjs +139 -12
  57. package/dist/cjs/utils/parallelize.cjs.map +1 -1
  58. package/dist/cjs/utils/runParallel.cjs +77 -0
  59. package/dist/cjs/utils/runParallel.cjs.map +1 -0
  60. package/dist/cjs/watcher.cjs +89 -0
  61. package/dist/cjs/watcher.cjs.map +1 -0
  62. package/dist/cjs/writeContentDeclaration/transformJSFile.cjs +770 -0
  63. package/dist/cjs/writeContentDeclaration/transformJSFile.cjs.map +1 -0
  64. package/dist/cjs/writeContentDeclaration/writeContentDeclaration.cjs +46 -55
  65. package/dist/cjs/writeContentDeclaration/writeContentDeclaration.cjs.map +1 -1
  66. package/dist/cjs/writeContentDeclaration/writeJSFile.cjs +12 -288
  67. package/dist/cjs/writeContentDeclaration/writeJSFile.cjs.map +1 -1
  68. package/dist/esm/{transpiler/intlayer_dictionary → buildIntlayerDictionary}/buildIntlayerDictionary.mjs +18 -2
  69. package/dist/esm/buildIntlayerDictionary/buildIntlayerDictionary.mjs.map +1 -0
  70. package/dist/esm/buildIntlayerDictionary/index.mjs.map +1 -0
  71. package/dist/esm/{transpiler/intlayer_dictionary → buildIntlayerDictionary}/processContentDeclaration.mjs +1 -1
  72. package/dist/esm/buildIntlayerDictionary/processContentDeclaration.mjs.map +1 -0
  73. package/dist/esm/{transpiler/intlayer_dictionary → buildIntlayerDictionary}/writeDynamicDictionary.mjs +3 -3
  74. package/dist/esm/buildIntlayerDictionary/writeDynamicDictionary.mjs.map +1 -0
  75. package/dist/esm/{transpiler/intlayer_dictionary → buildIntlayerDictionary}/writeFetchDictionary.mjs +2 -2
  76. package/dist/esm/buildIntlayerDictionary/writeFetchDictionary.mjs.map +1 -0
  77. package/dist/esm/{transpiler/intlayer_dictionary → buildIntlayerDictionary}/writeMergedDictionary.mjs +4 -4
  78. package/dist/esm/buildIntlayerDictionary/writeMergedDictionary.mjs.map +1 -0
  79. package/dist/esm/{transpiler/intlayer_dictionary → buildIntlayerDictionary}/writeRemoteDictionary.mjs +4 -4
  80. package/dist/esm/buildIntlayerDictionary/writeRemoteDictionary.mjs.map +1 -0
  81. package/dist/esm/{transpiler/intlayer_dictionary → buildIntlayerDictionary}/writeUnmergedDictionary.mjs +4 -4
  82. package/dist/esm/buildIntlayerDictionary/writeUnmergedDictionary.mjs.map +1 -0
  83. package/dist/esm/{transpiler/dictionary_to_main → createDictionaryEntryPoint}/createDictionaryEntryPoint.mjs +7 -7
  84. package/dist/esm/createDictionaryEntryPoint/createDictionaryEntryPoint.mjs.map +1 -0
  85. package/dist/esm/{transpiler/dictionary_to_main → createDictionaryEntryPoint}/generateDictionaryListContent.mjs +1 -1
  86. package/dist/esm/createDictionaryEntryPoint/generateDictionaryListContent.mjs.map +1 -0
  87. package/dist/esm/createDictionaryEntryPoint/getBuiltDictionariesPath.mjs.map +1 -0
  88. package/dist/esm/createDictionaryEntryPoint/getBuiltDynamicDictionariesPath.mjs.map +1 -0
  89. package/dist/esm/createDictionaryEntryPoint/getBuiltFetchDictionariesPath.mjs.map +1 -0
  90. package/dist/esm/createDictionaryEntryPoint/getBuiltRemoteDictionariesPath.mjs.map +1 -0
  91. package/dist/esm/createDictionaryEntryPoint/getBuiltUnmergedDictionariesPath.mjs.map +1 -0
  92. package/dist/esm/createDictionaryEntryPoint/index.mjs +8 -0
  93. package/dist/esm/createDictionaryEntryPoint/index.mjs.map +1 -0
  94. package/dist/esm/{transpiler/dictionary_to_type → createType}/createModuleAugmentation.mjs +3 -3
  95. package/dist/esm/createType/createModuleAugmentation.mjs.map +1 -0
  96. package/dist/esm/{transpiler/dictionary_to_type → createType}/createType.mjs +1 -1
  97. package/dist/esm/createType/createType.mjs.map +1 -0
  98. package/dist/esm/createType/index.mjs.map +1 -0
  99. package/dist/esm/filterInvalidDictionaries.mjs +29 -28
  100. package/dist/esm/filterInvalidDictionaries.mjs.map +1 -1
  101. package/dist/esm/handleAdditionalContentDeclarationFile.mjs +30 -0
  102. package/dist/esm/handleAdditionalContentDeclarationFile.mjs.map +1 -0
  103. package/dist/esm/handleContentDeclarationFileChange.mjs +35 -0
  104. package/dist/esm/handleContentDeclarationFileChange.mjs.map +1 -0
  105. package/dist/esm/handleUnlikedContentDeclarationFile.mjs +33 -0
  106. package/dist/esm/handleUnlikedContentDeclarationFile.mjs.map +1 -0
  107. package/dist/esm/index.mjs +29 -14
  108. package/dist/esm/index.mjs.map +1 -1
  109. package/dist/esm/listDictionariesPath.mjs.map +1 -1
  110. package/dist/esm/loadDictionaries/loadContentDeclaration.mjs +10 -4
  111. package/dist/esm/loadDictionaries/loadContentDeclaration.mjs.map +1 -1
  112. package/dist/esm/loadDictionaries/loadLocalDictionaries.mjs +12 -5
  113. package/dist/esm/loadDictionaries/loadLocalDictionaries.mjs.map +1 -1
  114. package/dist/esm/prepareIntlayer.mjs +8 -9
  115. package/dist/esm/prepareIntlayer.mjs.map +1 -1
  116. package/dist/esm/reduceDictionaryContent/reduceDictionaryContent.mjs +2 -2
  117. package/dist/esm/reduceDictionaryContent/reduceDictionaryContent.mjs.map +1 -1
  118. package/dist/esm/utils/extractErrorMessage.mjs +22 -10
  119. package/dist/esm/utils/extractErrorMessage.mjs.map +1 -1
  120. package/dist/esm/utils/parallelize.mjs +137 -1
  121. package/dist/esm/utils/parallelize.mjs.map +1 -1
  122. package/dist/esm/utils/runParallel.mjs +43 -0
  123. package/dist/esm/utils/runParallel.mjs.map +1 -0
  124. package/dist/esm/watcher.mjs +67 -0
  125. package/dist/esm/watcher.mjs.map +1 -0
  126. package/dist/esm/writeContentDeclaration/transformJSFile.mjs +751 -0
  127. package/dist/esm/writeContentDeclaration/transformJSFile.mjs.map +1 -0
  128. package/dist/esm/writeContentDeclaration/writeContentDeclaration.mjs +47 -56
  129. package/dist/esm/writeContentDeclaration/writeContentDeclaration.mjs.map +1 -1
  130. package/dist/esm/writeContentDeclaration/writeJSFile.mjs +15 -279
  131. package/dist/esm/writeContentDeclaration/writeJSFile.mjs.map +1 -1
  132. package/dist/types/{transpiler/intlayer_dictionary → buildIntlayerDictionary}/buildIntlayerDictionary.d.ts +1 -1
  133. package/dist/types/buildIntlayerDictionary/buildIntlayerDictionary.d.ts.map +1 -0
  134. package/dist/types/buildIntlayerDictionary/index.d.ts.map +1 -0
  135. package/dist/types/buildIntlayerDictionary/processContentDeclaration.d.ts.map +1 -0
  136. package/dist/types/buildIntlayerDictionary/writeDynamicDictionary.d.ts.map +1 -0
  137. package/dist/types/buildIntlayerDictionary/writeFetchDictionary.d.ts.map +1 -0
  138. package/dist/types/buildIntlayerDictionary/writeMergedDictionary.d.ts.map +1 -0
  139. package/dist/types/buildIntlayerDictionary/writeRemoteDictionary.d.ts.map +1 -0
  140. package/dist/types/buildIntlayerDictionary/writeUnmergedDictionary.d.ts.map +1 -0
  141. package/dist/types/createDictionaryEntryPoint/createDictionaryEntryPoint.d.ts.map +1 -0
  142. package/dist/types/createDictionaryEntryPoint/generateDictionaryListContent.d.ts.map +1 -0
  143. package/dist/types/createDictionaryEntryPoint/getBuiltDictionariesPath.d.ts.map +1 -0
  144. package/dist/types/createDictionaryEntryPoint/getBuiltDynamicDictionariesPath.d.ts.map +1 -0
  145. package/dist/types/createDictionaryEntryPoint/getBuiltFetchDictionariesPath.d.ts.map +1 -0
  146. package/dist/types/createDictionaryEntryPoint/getBuiltRemoteDictionariesPath.d.ts.map +1 -0
  147. package/dist/types/createDictionaryEntryPoint/getBuiltUnmergedDictionariesPath.d.ts.map +1 -0
  148. package/dist/types/createDictionaryEntryPoint/index.d.ts +8 -0
  149. package/dist/types/createDictionaryEntryPoint/index.d.ts.map +1 -0
  150. package/dist/types/createType/createModuleAugmentation.d.ts.map +1 -0
  151. package/dist/types/createType/createType.d.ts.map +1 -0
  152. package/dist/types/createType/index.d.ts.map +1 -0
  153. package/dist/types/filterInvalidDictionaries.d.ts +3 -1
  154. package/dist/types/filterInvalidDictionaries.d.ts.map +1 -1
  155. package/dist/types/handleAdditionalContentDeclarationFile.d.ts +3 -0
  156. package/dist/types/handleAdditionalContentDeclarationFile.d.ts.map +1 -0
  157. package/dist/types/handleContentDeclarationFileChange.d.ts +3 -0
  158. package/dist/types/handleContentDeclarationFileChange.d.ts.map +1 -0
  159. package/dist/types/handleUnlikedContentDeclarationFile.d.ts +3 -0
  160. package/dist/types/handleUnlikedContentDeclarationFile.d.ts.map +1 -0
  161. package/dist/types/index.d.ts +12 -7
  162. package/dist/types/index.d.ts.map +1 -1
  163. package/dist/types/listDictionariesPath.d.ts +5 -0
  164. package/dist/types/listDictionariesPath.d.ts.map +1 -1
  165. package/dist/types/loadDictionaries/loadContentDeclaration.d.ts +1 -1
  166. package/dist/types/loadDictionaries/loadContentDeclaration.d.ts.map +1 -1
  167. package/dist/types/loadDictionaries/loadLocalDictionaries.d.ts +2 -1
  168. package/dist/types/loadDictionaries/loadLocalDictionaries.d.ts.map +1 -1
  169. package/dist/types/prepareIntlayer.d.ts +1 -1
  170. package/dist/types/prepareIntlayer.d.ts.map +1 -1
  171. package/dist/types/reduceDictionaryContent/reduceDictionaryContent.d.ts +1 -1
  172. package/dist/types/reduceDictionaryContent/reduceDictionaryContent.d.ts.map +1 -1
  173. package/dist/types/utils/extractErrorMessage.d.ts.map +1 -1
  174. package/dist/types/utils/parallelize.d.ts +12 -0
  175. package/dist/types/utils/parallelize.d.ts.map +1 -1
  176. package/dist/types/utils/runParallel.d.ts +11 -0
  177. package/dist/types/utils/runParallel.d.ts.map +1 -0
  178. package/dist/types/watcher.d.ts +12 -0
  179. package/dist/types/watcher.d.ts.map +1 -0
  180. package/dist/types/writeContentDeclaration/transformJSFile.d.ts +9 -0
  181. package/dist/types/writeContentDeclaration/transformJSFile.d.ts.map +1 -0
  182. package/dist/types/writeContentDeclaration/writeContentDeclaration.d.ts.map +1 -1
  183. package/dist/types/writeContentDeclaration/writeJSFile.d.ts +3 -2
  184. package/dist/types/writeContentDeclaration/writeJSFile.d.ts.map +1 -1
  185. package/package.json +22 -27
  186. package/dist/cjs/chokidar/index.cjs +0 -23
  187. package/dist/cjs/chokidar/index.cjs.map +0 -1
  188. package/dist/cjs/chokidar/watcher.cjs +0 -157
  189. package/dist/cjs/chokidar/watcher.cjs.map +0 -1
  190. package/dist/cjs/getBuiltDictionariesPath.cjs.map +0 -1
  191. package/dist/cjs/getBuiltDynamicDictionariesPath.cjs.map +0 -1
  192. package/dist/cjs/getBuiltFetchDictionariesPath.cjs.map +0 -1
  193. package/dist/cjs/getBuiltRemoteDictionariesPath.cjs.map +0 -1
  194. package/dist/cjs/getBuiltUnmergedDictionariesPath.cjs.map +0 -1
  195. package/dist/cjs/reduceDictionaryContent/buildMask.cjs +0 -49
  196. package/dist/cjs/reduceDictionaryContent/buildMask.cjs.map +0 -1
  197. package/dist/cjs/transpiler/dictionary_to_main/createDictionaryEntryPoint.cjs.map +0 -1
  198. package/dist/cjs/transpiler/dictionary_to_main/generateDictionaryListContent.cjs.map +0 -1
  199. package/dist/cjs/transpiler/dictionary_to_main/index.cjs +0 -25
  200. package/dist/cjs/transpiler/dictionary_to_main/index.cjs.map +0 -1
  201. package/dist/cjs/transpiler/dictionary_to_type/createModuleAugmentation.cjs.map +0 -1
  202. package/dist/cjs/transpiler/dictionary_to_type/createType.cjs.map +0 -1
  203. package/dist/cjs/transpiler/dictionary_to_type/index.cjs.map +0 -1
  204. package/dist/cjs/transpiler/intlayer_dictionary/buildIntlayerDictionary.cjs.map +0 -1
  205. package/dist/cjs/transpiler/intlayer_dictionary/index.cjs.map +0 -1
  206. package/dist/cjs/transpiler/intlayer_dictionary/processContentDeclaration.cjs.map +0 -1
  207. package/dist/cjs/transpiler/intlayer_dictionary/writeDynamicDictionary.cjs.map +0 -1
  208. package/dist/cjs/transpiler/intlayer_dictionary/writeFetchDictionary.cjs.map +0 -1
  209. package/dist/cjs/transpiler/intlayer_dictionary/writeMergedDictionary.cjs.map +0 -1
  210. package/dist/cjs/transpiler/intlayer_dictionary/writeRemoteDictionary.cjs.map +0 -1
  211. package/dist/cjs/transpiler/intlayer_dictionary/writeUnmergedDictionary.cjs.map +0 -1
  212. package/dist/esm/chokidar/index.mjs +0 -2
  213. package/dist/esm/chokidar/index.mjs.map +0 -1
  214. package/dist/esm/chokidar/watcher.mjs +0 -135
  215. package/dist/esm/chokidar/watcher.mjs.map +0 -1
  216. package/dist/esm/getBuiltDictionariesPath.mjs.map +0 -1
  217. package/dist/esm/getBuiltDynamicDictionariesPath.mjs.map +0 -1
  218. package/dist/esm/getBuiltFetchDictionariesPath.mjs.map +0 -1
  219. package/dist/esm/getBuiltRemoteDictionariesPath.mjs.map +0 -1
  220. package/dist/esm/getBuiltUnmergedDictionariesPath.mjs.map +0 -1
  221. package/dist/esm/reduceDictionaryContent/buildMask.mjs +0 -24
  222. package/dist/esm/reduceDictionaryContent/buildMask.mjs.map +0 -1
  223. package/dist/esm/transpiler/dictionary_to_main/createDictionaryEntryPoint.mjs.map +0 -1
  224. package/dist/esm/transpiler/dictionary_to_main/generateDictionaryListContent.mjs.map +0 -1
  225. package/dist/esm/transpiler/dictionary_to_main/index.mjs +0 -3
  226. package/dist/esm/transpiler/dictionary_to_main/index.mjs.map +0 -1
  227. package/dist/esm/transpiler/dictionary_to_type/createModuleAugmentation.mjs.map +0 -1
  228. package/dist/esm/transpiler/dictionary_to_type/createType.mjs.map +0 -1
  229. package/dist/esm/transpiler/dictionary_to_type/index.mjs.map +0 -1
  230. package/dist/esm/transpiler/intlayer_dictionary/buildIntlayerDictionary.mjs.map +0 -1
  231. package/dist/esm/transpiler/intlayer_dictionary/index.mjs.map +0 -1
  232. package/dist/esm/transpiler/intlayer_dictionary/processContentDeclaration.mjs.map +0 -1
  233. package/dist/esm/transpiler/intlayer_dictionary/writeDynamicDictionary.mjs.map +0 -1
  234. package/dist/esm/transpiler/intlayer_dictionary/writeFetchDictionary.mjs.map +0 -1
  235. package/dist/esm/transpiler/intlayer_dictionary/writeMergedDictionary.mjs.map +0 -1
  236. package/dist/esm/transpiler/intlayer_dictionary/writeRemoteDictionary.mjs.map +0 -1
  237. package/dist/esm/transpiler/intlayer_dictionary/writeUnmergedDictionary.mjs.map +0 -1
  238. package/dist/types/chokidar/index.d.ts +0 -2
  239. package/dist/types/chokidar/index.d.ts.map +0 -1
  240. package/dist/types/chokidar/watcher.d.ts +0 -14
  241. package/dist/types/chokidar/watcher.d.ts.map +0 -1
  242. package/dist/types/getBuiltDictionariesPath.d.ts.map +0 -1
  243. package/dist/types/getBuiltDynamicDictionariesPath.d.ts.map +0 -1
  244. package/dist/types/getBuiltFetchDictionariesPath.d.ts.map +0 -1
  245. package/dist/types/getBuiltRemoteDictionariesPath.d.ts.map +0 -1
  246. package/dist/types/getBuiltUnmergedDictionariesPath.d.ts.map +0 -1
  247. package/dist/types/reduceDictionaryContent/buildMask.d.ts +0 -5
  248. package/dist/types/reduceDictionaryContent/buildMask.d.ts.map +0 -1
  249. package/dist/types/transpiler/dictionary_to_main/createDictionaryEntryPoint.d.ts.map +0 -1
  250. package/dist/types/transpiler/dictionary_to_main/generateDictionaryListContent.d.ts.map +0 -1
  251. package/dist/types/transpiler/dictionary_to_main/index.d.ts +0 -3
  252. package/dist/types/transpiler/dictionary_to_main/index.d.ts.map +0 -1
  253. package/dist/types/transpiler/dictionary_to_type/createModuleAugmentation.d.ts.map +0 -1
  254. package/dist/types/transpiler/dictionary_to_type/createType.d.ts.map +0 -1
  255. package/dist/types/transpiler/dictionary_to_type/index.d.ts.map +0 -1
  256. package/dist/types/transpiler/intlayer_dictionary/buildIntlayerDictionary.d.ts.map +0 -1
  257. package/dist/types/transpiler/intlayer_dictionary/index.d.ts.map +0 -1
  258. package/dist/types/transpiler/intlayer_dictionary/processContentDeclaration.d.ts.map +0 -1
  259. package/dist/types/transpiler/intlayer_dictionary/writeDynamicDictionary.d.ts.map +0 -1
  260. package/dist/types/transpiler/intlayer_dictionary/writeFetchDictionary.d.ts.map +0 -1
  261. package/dist/types/transpiler/intlayer_dictionary/writeMergedDictionary.d.ts.map +0 -1
  262. package/dist/types/transpiler/intlayer_dictionary/writeRemoteDictionary.d.ts.map +0 -1
  263. package/dist/types/transpiler/intlayer_dictionary/writeUnmergedDictionary.d.ts.map +0 -1
  264. /package/dist/cjs/{getBuiltDictionariesPath.cjs → createDictionaryEntryPoint/getBuiltDictionariesPath.cjs} +0 -0
  265. /package/dist/cjs/{getBuiltDynamicDictionariesPath.cjs → createDictionaryEntryPoint/getBuiltDynamicDictionariesPath.cjs} +0 -0
  266. /package/dist/cjs/{getBuiltFetchDictionariesPath.cjs → createDictionaryEntryPoint/getBuiltFetchDictionariesPath.cjs} +0 -0
  267. /package/dist/cjs/{getBuiltRemoteDictionariesPath.cjs → createDictionaryEntryPoint/getBuiltRemoteDictionariesPath.cjs} +0 -0
  268. /package/dist/cjs/{getBuiltUnmergedDictionariesPath.cjs → createDictionaryEntryPoint/getBuiltUnmergedDictionariesPath.cjs} +0 -0
  269. /package/dist/esm/{transpiler/intlayer_dictionary → buildIntlayerDictionary}/index.mjs +0 -0
  270. /package/dist/esm/{getBuiltDictionariesPath.mjs → createDictionaryEntryPoint/getBuiltDictionariesPath.mjs} +0 -0
  271. /package/dist/esm/{getBuiltDynamicDictionariesPath.mjs → createDictionaryEntryPoint/getBuiltDynamicDictionariesPath.mjs} +0 -0
  272. /package/dist/esm/{getBuiltFetchDictionariesPath.mjs → createDictionaryEntryPoint/getBuiltFetchDictionariesPath.mjs} +0 -0
  273. /package/dist/esm/{getBuiltRemoteDictionariesPath.mjs → createDictionaryEntryPoint/getBuiltRemoteDictionariesPath.mjs} +0 -0
  274. /package/dist/esm/{getBuiltUnmergedDictionariesPath.mjs → createDictionaryEntryPoint/getBuiltUnmergedDictionariesPath.mjs} +0 -0
  275. /package/dist/esm/{transpiler/dictionary_to_type → createType}/index.mjs +0 -0
  276. /package/dist/types/{transpiler/intlayer_dictionary → buildIntlayerDictionary}/index.d.ts +0 -0
  277. /package/dist/types/{transpiler/intlayer_dictionary → buildIntlayerDictionary}/processContentDeclaration.d.ts +0 -0
  278. /package/dist/types/{transpiler/intlayer_dictionary → buildIntlayerDictionary}/writeDynamicDictionary.d.ts +0 -0
  279. /package/dist/types/{transpiler/intlayer_dictionary → buildIntlayerDictionary}/writeFetchDictionary.d.ts +0 -0
  280. /package/dist/types/{transpiler/intlayer_dictionary → buildIntlayerDictionary}/writeMergedDictionary.d.ts +0 -0
  281. /package/dist/types/{transpiler/intlayer_dictionary → buildIntlayerDictionary}/writeRemoteDictionary.d.ts +0 -0
  282. /package/dist/types/{transpiler/intlayer_dictionary → buildIntlayerDictionary}/writeUnmergedDictionary.d.ts +0 -0
  283. /package/dist/types/{transpiler/dictionary_to_main → createDictionaryEntryPoint}/createDictionaryEntryPoint.d.ts +0 -0
  284. /package/dist/types/{transpiler/dictionary_to_main → createDictionaryEntryPoint}/generateDictionaryListContent.d.ts +0 -0
  285. /package/dist/types/{getBuiltDictionariesPath.d.ts → createDictionaryEntryPoint/getBuiltDictionariesPath.d.ts} +0 -0
  286. /package/dist/types/{getBuiltDynamicDictionariesPath.d.ts → createDictionaryEntryPoint/getBuiltDynamicDictionariesPath.d.ts} +0 -0
  287. /package/dist/types/{getBuiltFetchDictionariesPath.d.ts → createDictionaryEntryPoint/getBuiltFetchDictionariesPath.d.ts} +0 -0
  288. /package/dist/types/{getBuiltRemoteDictionariesPath.d.ts → createDictionaryEntryPoint/getBuiltRemoteDictionariesPath.d.ts} +0 -0
  289. /package/dist/types/{getBuiltUnmergedDictionariesPath.d.ts → createDictionaryEntryPoint/getBuiltUnmergedDictionariesPath.d.ts} +0 -0
  290. /package/dist/types/{transpiler/dictionary_to_type → createType}/createModuleAugmentation.d.ts +0 -0
  291. /package/dist/types/{transpiler/dictionary_to_type → createType}/createType.d.ts +0 -0
  292. /package/dist/types/{transpiler/dictionary_to_type → createType}/index.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/writeContentDeclaration/transformJSFile.ts"],"sourcesContent":["import { Dictionary, NodeType } from '@intlayer/core';\nimport {\n Node,\n ObjectLiteralExpression,\n Project,\n SyntaxKind,\n ts,\n} from 'ts-morph';\n\nconst isTranslationNode = (\n value: unknown\n): value is {\n nodeType?: NodeType;\n [NodeType.Translation]?: Record<string, unknown>;\n} => {\n if (!value || typeof value !== 'object') return false;\n const v = value as any;\n const hasNodeTypeTranslation = v.nodeType === NodeType.Translation;\n const hasTranslationObject =\n v[NodeType.Translation] && typeof v[NodeType.Translation] === 'object';\n return Boolean(hasTranslationObject || hasNodeTypeTranslation);\n};\n\nconst isEnumerationNode = (\n value: unknown\n): value is {\n nodeType?: NodeType;\n [NodeType.Enumeration]?: Record<string, unknown>;\n} => {\n if (!value || typeof value !== 'object') return false;\n const v = value as any;\n return (\n v.nodeType === NodeType.Enumeration ||\n (v[NodeType.Enumeration] && typeof v[NodeType.Enumeration] === 'object')\n );\n};\n\nconst isConditionNode = (\n value: unknown\n): value is {\n nodeType?: NodeType;\n [NodeType.Condition]?: Record<string, unknown>;\n} => {\n if (!value || typeof value !== 'object') return false;\n const v = value as any;\n return (\n v.nodeType === NodeType.Condition ||\n (v[NodeType.Condition] && typeof v[NodeType.Condition] === 'object')\n );\n};\n\nconst isGenderNode = (\n value: unknown\n): value is {\n nodeType?: NodeType;\n [NodeType.Gender]?: Record<string, unknown>;\n} => {\n if (!value || typeof value !== 'object') return false;\n const v = value as any;\n return (\n v.nodeType === NodeType.Gender ||\n (v[NodeType.Gender] && typeof v[NodeType.Gender] === 'object')\n );\n};\n\nconst isInsertionNode = (\n value: unknown\n): value is { nodeType?: NodeType; [NodeType.Insertion]?: unknown } => {\n if (!value || typeof value !== 'object') return false;\n const v = value as any;\n return v.nodeType === NodeType.Insertion || NodeType.Insertion in v;\n};\n\nconst isMarkdownNode = (\n value: unknown\n): value is { nodeType?: NodeType; [NodeType.Markdown]?: unknown } => {\n if (!value || typeof value !== 'object') return false;\n const v = value as any;\n return v.nodeType === NodeType.Markdown || NodeType.Markdown in v;\n};\n\nconst isFileNode = (\n value: unknown\n): value is { nodeType?: NodeType; [NodeType.File]?: string } => {\n if (!value || typeof value !== 'object') return false;\n const v = value as any;\n return v.nodeType === NodeType.File || typeof v[NodeType.File] === 'string';\n};\n\nconst isNestedNode = (\n value: unknown\n): value is {\n nodeType?: NodeType;\n [NodeType.Nested]?: { dictionaryKey?: string; path?: string };\n} => {\n if (!value || typeof value !== 'object') return false;\n const v = value as any;\n return v.nodeType === NodeType.Nested || NodeType.Nested in v;\n};\n\nconst buildTranslationInitializer = (\n translationMap: Record<string, unknown>\n): string => {\n const entries = Object.entries(translationMap)\n // Keep stable order: identifiers first (a-z), then others, alphabetically\n .sort(([a], [b]) => a.localeCompare(b));\n\n const parts: string[] = [];\n for (const [lang, val] of entries) {\n const isValidIdentifier = /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(lang);\n const keyText = isValidIdentifier ? lang : JSON.stringify(lang);\n if (typeof val === 'string') {\n parts.push(`${keyText}: ${JSON.stringify(val)}`);\n } else {\n // Fallback to JSON for non-string values to avoid breaking\n parts.push(`${keyText}: ${JSON.stringify(val)}`);\n }\n }\n return `t({ ${parts.join(', ')} })`;\n};\n\nconst stringifyKey = (key: string): string => {\n const isValidIdentifier = /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key);\n if (!isValidIdentifier) return JSON.stringify(key);\n if (key === 'true' || key === 'false') return JSON.stringify(key);\n return key;\n};\n\nconst buildEnumerationInitializer = (map: Record<string, unknown>): string => {\n const parts: string[] = [];\n for (const [k, v] of Object.entries(map)) {\n if (typeof v !== 'string') return ''; // unsupported\n parts.push(`${stringifyKey(k)}: ${JSON.stringify(v)}`);\n }\n return `enu({ ${parts.join(', ')} })`;\n};\n\nconst buildConditionInitializer = (map: Record<string, unknown>): string => {\n const parts: string[] = [];\n for (const [k, v] of Object.entries(map)) {\n if (typeof v !== 'string') return '';\n parts.push(`${stringifyKey(k)}: ${JSON.stringify(v)}`);\n }\n return `cond({ ${parts.join(', ')} })`;\n};\n\nconst buildGenderInitializer = (map: Record<string, unknown>): string => {\n const parts: string[] = [];\n for (const [k, v] of Object.entries(map)) {\n if (typeof v !== 'string') return '';\n parts.push(`${stringifyKey(k)}: ${JSON.stringify(v)}`);\n }\n return `gender({ ${parts.join(', ')} })`;\n};\n\nconst buildInsertionInitializer = (content: unknown): string | undefined => {\n if (typeof content === 'string') return `insert(${JSON.stringify(content)})`;\n if (isTranslationNode(content)) {\n const translations: Record<string, unknown> =\n (content as any).translation ?? (content as any)['translation'] ?? {};\n const allStrings = Object.values(translations).every(\n (v) => typeof v === 'string'\n );\n if (!allStrings) return undefined;\n return `insert(${buildTranslationInitializer(\n translations as Record<string, string>\n )})`;\n }\n return undefined;\n};\n\nconst buildFileInitializer = (path: unknown): string | undefined => {\n if (typeof path === 'string') return `file(${JSON.stringify(path)})`;\n return undefined;\n};\n\nconst buildMarkdownInitializer = (content: unknown): string | undefined => {\n if (typeof content === 'string') return `md(${JSON.stringify(content)})`;\n if (isFileNode(content)) {\n const p = (content as any)[NodeType.File] as string;\n const fileInit = buildFileInitializer(p);\n if (!fileInit) return undefined;\n return `md(${fileInit})`;\n }\n return undefined;\n};\n\nconst buildNestedInitializer = (obj: unknown): string | undefined => {\n const data = (obj as any)?.[NodeType.Nested] as\n | { dictionaryKey?: string; path?: string }\n | undefined;\n if (!data || typeof data.dictionaryKey !== 'string') return undefined;\n if (data.path && typeof data.path === 'string') {\n return `nest(${JSON.stringify(data.dictionaryKey)}, ${JSON.stringify(data.path)})`;\n }\n return `nest(${JSON.stringify(data.dictionaryKey)})`;\n};\n\nconst readExistingTranslationMap = (\n contentObject: ObjectLiteralExpression,\n propName: string\n): Record<string, string> | undefined => {\n const prop = contentObject.getProperty(propName);\n\n if (!prop || !Node.isPropertyAssignment(prop)) return undefined;\n const init = prop.getInitializer();\n if (!init) return undefined;\n if (!Node.isCallExpression(init)) return undefined;\n const exp = init.getExpression();\n if (!Node.isIdentifier(exp) || exp.getText() !== 't') return undefined;\n const arg = init.getArguments()[0];\n if (!arg || !Node.isObjectLiteralExpression(arg)) return undefined;\n\n const map: Record<string, string> = {};\n for (const p of arg.getProperties()) {\n if (!Node.isPropertyAssignment(p)) continue;\n const nameNode = p.getNameNode();\n const rawName = nameNode.getText();\n const name = rawName.replace(/^['\"]|['\"]$/g, '');\n const valueInit = p.getInitializer();\n if (valueInit && Node.isStringLiteral(valueInit)) {\n map[name] = valueInit.getLiteralValue();\n }\n }\n return map;\n};\n\nconst readExistingMapFromCall = (\n contentObject: ObjectLiteralExpression,\n propName: string,\n callee: 'enu' | 'cond' | 'gender'\n): Record<string, string> | undefined => {\n const prop = contentObject.getProperty(propName);\n if (!prop || !Node.isPropertyAssignment(prop)) return undefined;\n const init = prop.getInitializer();\n if (!init || !Node.isCallExpression(init)) return undefined;\n const exp = init.getExpression();\n if (!Node.isIdentifier(exp) || exp.getText() !== callee) return undefined;\n const arg = init.getArguments()[0];\n if (!arg || !Node.isObjectLiteralExpression(arg)) return undefined;\n const map: Record<string, string> = {};\n for (const p of arg.getProperties()) {\n if (!Node.isPropertyAssignment(p)) continue;\n const nameNode = p.getNameNode();\n const rawName = nameNode.getText();\n const name = rawName.replace(/^['\"]|['\"]$/g, '');\n const valueInit = p.getInitializer();\n if (valueInit && Node.isStringLiteral(valueInit)) {\n map[name] = valueInit.getLiteralValue();\n }\n }\n return map;\n};\n\nconst areStringMapsEqual = (\n a: Record<string, unknown>,\n b: Record<string, string> | undefined\n): boolean => {\n if (!b) return false;\n const aEntries = Object.entries(a).filter(\n ([, v]) => typeof v === 'string'\n ) as [string, string][];\n if (aEntries.length !== Object.keys(a).length) return false;\n if (aEntries.length !== Object.keys(b).length) return false;\n for (const [k, v] of aEntries) {\n if (!(k in b)) return false;\n if (b[k] !== v) return false;\n }\n return true;\n};\n\ntype ExistingInsert =\n | { kind: 'string'; value: string }\n | { kind: 'translation'; map: Record<string, string> };\n\nconst readExistingInsertion = (\n contentObject: ObjectLiteralExpression,\n propName: string\n): ExistingInsert | undefined => {\n const prop = contentObject.getProperty(propName);\n if (!prop || !Node.isPropertyAssignment(prop)) return undefined;\n const init = prop.getInitializer();\n if (!init || !Node.isCallExpression(init)) return undefined;\n const exp = init.getExpression();\n if (!Node.isIdentifier(exp) || exp.getText() !== 'insert') return undefined;\n const arg = init.getArguments()[0];\n if (!arg) return undefined;\n if (Node.isStringLiteral(arg)) {\n return { kind: 'string', value: arg.getLiteralValue() };\n }\n if (Node.isCallExpression(arg)) {\n const aexp = arg.getExpression();\n if (Node.isIdentifier(aexp) && aexp.getText() === 't') {\n const tArg = arg.getArguments()[0];\n if (tArg && Node.isObjectLiteralExpression(tArg)) {\n const map: Record<string, string> = {};\n for (const p of tArg.getProperties()) {\n if (!Node.isPropertyAssignment(p)) continue;\n const nameNode = p.getNameNode();\n const rawName = nameNode.getText();\n const name = rawName.replace(/^['\"]|['\"]$/g, '');\n const valueInit = p.getInitializer();\n if (valueInit && Node.isStringLiteral(valueInit)) {\n map[name] = valueInit.getLiteralValue();\n }\n }\n return { kind: 'translation', map };\n }\n }\n }\n return undefined;\n};\n\ntype ExistingMarkdown =\n | { kind: 'string'; value: string }\n | { kind: 'file'; path: string };\n\nconst readExistingMarkdown = (\n contentObject: ObjectLiteralExpression,\n propName: string\n): ExistingMarkdown | undefined => {\n const prop = contentObject.getProperty(propName);\n if (!prop || !Node.isPropertyAssignment(prop)) return undefined;\n const init = prop.getInitializer();\n if (!init || !Node.isCallExpression(init)) return undefined;\n const exp = init.getExpression();\n if (!Node.isIdentifier(exp) || exp.getText() !== 'md') return undefined;\n const arg = init.getArguments()[0];\n if (!arg) return undefined;\n if (Node.isStringLiteral(arg)) {\n return { kind: 'string', value: arg.getLiteralValue() };\n }\n if (Node.isCallExpression(arg)) {\n const aexp = arg.getExpression();\n if (Node.isIdentifier(aexp) && aexp.getText() === 'file') {\n const fArg = arg.getArguments()[0];\n if (fArg && Node.isStringLiteral(fArg)) {\n return { kind: 'file', path: fArg.getLiteralValue() };\n }\n }\n }\n return undefined;\n};\n\nconst readExistingFilePath = (\n contentObject: ObjectLiteralExpression,\n propName: string\n): string | undefined => {\n const prop = contentObject.getProperty(propName);\n if (!prop || !Node.isPropertyAssignment(prop)) return undefined;\n const init = prop.getInitializer();\n if (!init || !Node.isCallExpression(init)) return undefined;\n const exp = init.getExpression();\n if (!Node.isIdentifier(exp) || exp.getText() !== 'file') return undefined;\n const arg = init.getArguments()[0];\n if (arg && Node.isStringLiteral(arg)) return arg.getLiteralValue();\n return undefined;\n};\n\nconst readExistingNest = (\n contentObject: ObjectLiteralExpression,\n propName: string\n): { dictionaryKey: string; path?: string } | undefined => {\n const prop = contentObject.getProperty(propName);\n if (!prop || !Node.isPropertyAssignment(prop)) return undefined;\n let init = prop.getInitializer();\n if (!init) return undefined;\n // Unwrap type assertions and parentheses\n // Keep drilling until we reach a CallExpression or cannot unwrap further\n let safetyCounter = 0;\n while (safetyCounter++ < 5) {\n if (Node.isCallExpression(init)) break;\n // AsExpression, TypeAssertion, ParenthesizedExpression expose getExpression\n const anyInit = init as unknown as { getExpression?: () => unknown };\n const nextExpr = anyInit.getExpression?.();\n if (nextExpr && typeof nextExpr === 'object' && nextExpr !== init) {\n init = nextExpr as any;\n continue;\n }\n break;\n }\n if (!Node.isCallExpression(init)) return undefined;\n const exp = init.getExpression();\n if (!Node.isIdentifier(exp) || exp.getText() !== 'nest') return undefined;\n const [arg1, arg2] = init.getArguments();\n if (!arg1 || !Node.isStringLiteral(arg1)) return undefined;\n const dictionaryKey = arg1.getLiteralValue();\n let path: string | undefined;\n if (arg2 && Node.isStringLiteral(arg2)) path = arg2.getLiteralValue();\n return { dictionaryKey, path };\n};\n\n// Safely unwrap common wrapper nodes (satisfies/as/parenthesized) to reach the underlying ObjectLiteralExpression\nconst unwrapToObjectLiteral = (\n node: unknown\n): ObjectLiteralExpression | undefined => {\n if (!node || typeof node !== 'object') return undefined;\n let current = node as any;\n let safetyCounter = 0;\n while (safetyCounter++ < 8) {\n if (Node.isObjectLiteralExpression(current)) return current;\n const next = current?.getExpression?.();\n if (next && typeof next === 'object' && next !== current) {\n current = next;\n continue;\n }\n break;\n }\n return undefined;\n};\n\nconst readExistingArraySerialized = (\n contentObject: ObjectLiteralExpression,\n propName: string\n): string[] | undefined => {\n const prop = contentObject.getProperty(propName);\n if (!prop || !Node.isPropertyAssignment(prop)) return undefined;\n const init = prop.getInitializer();\n if (!init || !Node.isArrayLiteralExpression(init)) return undefined;\n\n const serialized: string[] = [];\n for (const el of init.getElements()) {\n if (Node.isStringLiteral(el)) {\n serialized.push(JSON.stringify(el.getLiteralValue()));\n continue;\n }\n if (Node.isNumericLiteral(el)) {\n serialized.push(el.getText());\n continue;\n }\n if (\n el.getKind() === SyntaxKind.TrueKeyword ||\n el.getKind() === SyntaxKind.FalseKeyword\n ) {\n serialized.push(el.getText());\n continue;\n }\n if (Node.isNullLiteral(el)) {\n serialized.push('null');\n continue;\n }\n if (Node.isCallExpression(el)) {\n const exp = el.getExpression();\n if (Node.isIdentifier(exp) && exp.getText() === 't') {\n const arg = el.getArguments()[0];\n if (arg && Node.isObjectLiteralExpression(arg)) {\n const map: Record<string, string> = {};\n for (const p of arg.getProperties()) {\n if (!Node.isPropertyAssignment(p)) return undefined;\n const nameNode = p.getNameNode();\n const rawName = nameNode.getText();\n const name = rawName.replace(/^['\"]|['\"]$/g, '');\n const valueInit = p.getInitializer();\n if (valueInit && Node.isStringLiteral(valueInit)) {\n map[name] = valueInit.getLiteralValue();\n } else {\n return undefined;\n }\n }\n serialized.push(buildTranslationInitializer(map));\n continue;\n }\n }\n }\n return undefined;\n }\n return serialized;\n};\n\nconst serializeValue = (value: unknown): string | undefined => {\n if (typeof value === 'string') return JSON.stringify(value);\n if (typeof value === 'number' || typeof value === 'boolean')\n return String(value);\n if (value === null) return 'null';\n if (isTranslationNode(value)) {\n const translations: Record<string, unknown> =\n (value as any).translation ?? (value as any)['translation'] ?? {};\n const allStrings = Object.values(translations).every(\n (v) => typeof v === 'string'\n );\n if (!allStrings) return undefined;\n return buildTranslationInitializer(translations as Record<string, string>);\n }\n if (isEnumerationNode(value)) {\n const map = (value as any)[NodeType.Enumeration] as Record<string, unknown>;\n const init = buildEnumerationInitializer(map);\n return init || undefined;\n }\n if (isConditionNode(value)) {\n const map = (value as any)[NodeType.Condition] as Record<string, unknown>;\n const init = buildConditionInitializer(map);\n return init || undefined;\n }\n if (isGenderNode(value)) {\n const map = (value as any)[NodeType.Gender] as Record<string, unknown>;\n const init = buildGenderInitializer(map);\n return init || undefined;\n }\n if (isInsertionNode(value)) {\n const content = (value as any)[NodeType.Insertion];\n return buildInsertionInitializer(content);\n }\n if (isMarkdownNode(value)) {\n const content = (value as any)[NodeType.Markdown];\n return buildMarkdownInitializer(content);\n }\n if (isFileNode(value)) {\n const path = (value as any)[NodeType.File];\n return buildFileInitializer(path);\n }\n if (isNestedNode(value)) {\n return buildNestedInitializer(value);\n }\n return undefined;\n};\n\n/**\n * Updates a JavaScript/TypeScript file based on the provided JSON instructions.\n * It targets a specific dictionary object within the file (identified by its 'key' property)\n * and updates its 'content' entries. Currently, it focuses on modifying arguments\n * of 't' (translation) function calls.\n */\nexport const transformJSFile = async (\n fileContent: string,\n dictionary: Dictionary\n): Promise<string> => {\n try {\n // If no content provided, nothing to transform\n if (!dictionary || typeof dictionary !== 'object' || !dictionary.content) {\n return fileContent;\n }\n\n const project = new Project({\n useInMemoryFileSystem: true,\n skipAddingFilesFromTsConfig: true,\n skipFileDependencyResolution: true,\n compilerOptions: {\n allowJs: true,\n jsx: ts.JsxEmit.Preserve,\n },\n });\n\n const sourceFile = project.createSourceFile('file.tsx', fileContent, {\n overwrite: true,\n });\n\n // Locate the root dictionary object that is exported as default\n let rootObject: ObjectLiteralExpression | undefined;\n\n const exportAssignment = sourceFile.getExportAssignment((_) => true);\n if (exportAssignment) {\n const expr = exportAssignment.getExpression();\n if (Node.isIdentifier(expr)) {\n // Prefer symbol resolution, but fall back to direct lookup by name\n const declFromSymbol = expr.getSymbol()?.getDeclarations()?.[0];\n const declByName =\n declFromSymbol ?? sourceFile.getVariableDeclaration(expr.getText());\n if (declByName && Node.isVariableDeclaration(declByName)) {\n const initAny = declByName.getInitializer();\n const obj = unwrapToObjectLiteral(initAny);\n if (obj) rootObject = obj;\n }\n } else if (Node.isObjectLiteralExpression(expr)) {\n rootObject = expr;\n }\n }\n\n // Fallback: find a variable of type Dictionary (or named content) initialized with an object\n if (!rootObject) {\n const varDecl = sourceFile.getVariableDeclaration((v) => {\n try {\n const typeText = v.getType().getText();\n return (\n typeText.includes('Dictionary') ||\n v.getName() === 'content' ||\n v.getName().toLowerCase().includes('dictionary')\n );\n } catch {\n return v.getName() === 'content';\n }\n });\n if (varDecl) {\n const obj = unwrapToObjectLiteral(varDecl.getInitializer());\n if (obj) rootObject = obj;\n }\n }\n\n // Fallback: handle CommonJS patterns like `module.exports = { ... }` or `exports.default = { ... }`\n if (!rootObject) {\n for (const stmt of sourceFile.getStatements()) {\n if (!Node.isExpressionStatement(stmt)) continue;\n const expr = stmt.getExpression();\n if (!Node.isBinaryExpression(expr)) continue;\n const operator = expr.getOperatorToken();\n if (operator.getText() !== '=') continue;\n const left = expr.getLeft();\n if (!Node.isPropertyAccessExpression(left)) continue;\n const leftExpr = left.getExpression();\n const leftName = left.getName();\n // module.exports = {...} or exports.default = {...}\n const isModuleExports =\n Node.isIdentifier(leftExpr) &&\n leftExpr.getText() === 'module' &&\n leftName === 'exports';\n const isExportsDefault =\n Node.isIdentifier(leftExpr) &&\n leftExpr.getText() === 'exports' &&\n leftName === 'default';\n if (!isModuleExports && !isExportsDefault) continue;\n\n const right = expr.getRight();\n if (Node.isObjectLiteralExpression(right)) {\n rootObject = right;\n break;\n }\n if (Node.isIdentifier(right)) {\n const decl = right.getSymbol()?.getDeclarations()?.[0];\n if (decl && Node.isVariableDeclaration(decl)) {\n const obj = unwrapToObjectLiteral(decl.getInitializer());\n if (obj) {\n rootObject = obj;\n break;\n }\n }\n }\n }\n }\n\n if (!rootObject) {\n return fileContent;\n }\n\n // Find the `content` property inside the root dictionary object\n const contentProp = rootObject.getProperty('content');\n let contentObject: ObjectLiteralExpression | undefined;\n if (contentProp && Node.isPropertyAssignment(contentProp)) {\n contentObject = contentProp.getInitializerIfKind(\n SyntaxKind.ObjectLiteralExpression\n );\n }\n\n if (!contentObject || !dictionary.content) {\n return fileContent;\n }\n\n // Build a set of existing property names in the content object\n const existingKeys = new Set<string>();\n for (const prop of contentObject.getProperties()) {\n if (Node.isPropertyAssignment(prop)) {\n const name = prop.getName();\n if (name) existingKeys.add(name.replace(/^['\"]|['\"]$/g, ''));\n }\n }\n\n let changed = false;\n const dictContent: Record<string, unknown> =\n (dictionary.content as unknown as Record<string, unknown>) || {};\n\n const areTranslationsEqual = (\n desired: Record<string, unknown>,\n existing: Record<string, string> | undefined\n ): boolean => {\n if (!existing) return false;\n for (const [lang, val] of Object.entries(desired)) {\n if (typeof val !== 'string') return false;\n if (!(lang in existing)) return false;\n if (existing[lang] !== val) return false;\n }\n return true;\n };\n\n for (const [key, value] of Object.entries(dictContent)) {\n // Handle array values (support primitives and translation nodes)\n if (Array.isArray(value)) {\n const serializedElements: string[] = [];\n let unsupported = false;\n for (const el of value as unknown[]) {\n const s = serializeValue(el);\n if (s === undefined) {\n unsupported = true;\n break;\n }\n serializedElements.push(s);\n }\n if (unsupported) {\n continue;\n }\n\n const initializerText = `[ ${serializedElements.join(', ')} ]`;\n\n if (!existingKeys.has(key)) {\n contentObject.addPropertyAssignment({\n name: key,\n initializer: initializerText,\n });\n changed = true;\n continue;\n }\n\n const prop = contentObject.getProperty(key);\n if (prop && Node.isPropertyAssignment(prop)) {\n const existingSerialized = readExistingArraySerialized(\n contentObject,\n key\n );\n const arraysEqual =\n existingSerialized !== undefined &&\n existingSerialized.length === serializedElements.length &&\n existingSerialized.every((v, i) => v === serializedElements[i]);\n if (!arraysEqual) {\n prop.setInitializer(initializerText);\n changed = true;\n }\n }\n continue;\n }\n // Handle primitive values: string, number, boolean, null\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n value === null\n ) {\n if (!existingKeys.has(key)) {\n contentObject.addPropertyAssignment({\n name: key,\n initializer:\n typeof value === 'string' ? JSON.stringify(value) : String(value),\n });\n changed = true;\n continue;\n }\n\n const prop = contentObject.getProperty(key);\n if (prop && Node.isPropertyAssignment(prop)) {\n const init = prop.getInitializer();\n const currentText = init?.getText();\n const desiredText =\n typeof value === 'string' ? JSON.stringify(value) : String(value);\n if (currentText !== desiredText) {\n prop.setInitializer(desiredText);\n changed = true;\n }\n }\n continue;\n }\n\n // Handle translation nodes: { nodeType: 'translation', translation: { ... } }\n if (isTranslationNode(value)) {\n const translations: Record<string, unknown> =\n (value as any).translation ?? (value as any)['translation'] ?? {};\n\n // Only handle translation nodes where all values are plain strings\n const allStrings = Object.values(translations).every(\n (v) => typeof v === 'string'\n );\n if (!allStrings) {\n continue;\n }\n\n const initializerText = buildTranslationInitializer(\n translations as Record<string, string>\n );\n\n if (!existingKeys.has(key)) {\n contentObject.addPropertyAssignment({\n name: key,\n initializer: initializerText,\n });\n changed = true;\n continue;\n }\n\n const existingMap = readExistingTranslationMap(contentObject, key);\n if (!areTranslationsEqual(translations, existingMap)) {\n const prop = contentObject.getProperty(key);\n if (prop && Node.isPropertyAssignment(prop)) {\n prop.setInitializer(initializerText);\n changed = true;\n }\n }\n }\n\n // Handle enumeration nodes\n else if (isEnumerationNode(value)) {\n const map = (value as any)[NodeType.Enumeration] as Record<\n string,\n unknown\n >;\n if (!Object.values(map).every((v) => typeof v === 'string')) continue;\n const initializerText = buildEnumerationInitializer(map);\n if (!initializerText) continue;\n if (!existingKeys.has(key)) {\n contentObject.addPropertyAssignment({\n name: key,\n initializer: initializerText,\n });\n changed = true;\n continue;\n }\n const existingMap = readExistingMapFromCall(contentObject, key, 'enu');\n if (!areStringMapsEqual(map, existingMap)) {\n const prop = contentObject.getProperty(key);\n if (prop && Node.isPropertyAssignment(prop)) {\n prop.setInitializer(initializerText);\n changed = true;\n }\n }\n }\n\n // Handle condition nodes\n else if (isConditionNode(value)) {\n const map = (value as any)[NodeType.Condition] as Record<\n string,\n unknown\n >;\n if (!Object.values(map).every((v) => typeof v === 'string')) continue;\n const initializerText = buildConditionInitializer(map);\n if (!initializerText) continue;\n if (!existingKeys.has(key)) {\n contentObject.addPropertyAssignment({\n name: key,\n initializer: initializerText,\n });\n changed = true;\n continue;\n }\n const existingMap = readExistingMapFromCall(contentObject, key, 'cond');\n if (!areStringMapsEqual(map, existingMap)) {\n const prop = contentObject.getProperty(key);\n if (prop && Node.isPropertyAssignment(prop)) {\n prop.setInitializer(initializerText);\n changed = true;\n }\n }\n }\n\n // Handle gender nodes\n else if (isGenderNode(value)) {\n const map = (value as any)[NodeType.Gender] as Record<string, unknown>;\n if (!Object.values(map).every((v) => typeof v === 'string')) continue;\n const initializerText = buildGenderInitializer(map);\n if (!initializerText) continue;\n if (!existingKeys.has(key)) {\n contentObject.addPropertyAssignment({\n name: key,\n initializer: initializerText,\n });\n changed = true;\n continue;\n }\n const existingMap = readExistingMapFromCall(\n contentObject,\n key,\n 'gender'\n );\n if (!areStringMapsEqual(map, existingMap)) {\n const prop = contentObject.getProperty(key);\n if (prop && Node.isPropertyAssignment(prop)) {\n prop.setInitializer(initializerText);\n changed = true;\n }\n }\n }\n\n // Handle insertion nodes\n else if (isInsertionNode(value)) {\n const desired = (value as any)[NodeType.Insertion];\n const initializerText = buildInsertionInitializer(desired);\n if (!initializerText) continue;\n if (!existingKeys.has(key)) {\n contentObject.addPropertyAssignment({\n name: key,\n initializer: initializerText,\n });\n changed = true;\n continue;\n }\n const existing = readExistingInsertion(contentObject, key);\n const isSame =\n (typeof desired === 'string' &&\n existing?.kind === 'string' &&\n existing.value === desired) ||\n (isTranslationNode(desired) &&\n existing?.kind === 'translation' &&\n areStringMapsEqual(\n (desired as any)[NodeType.Translation] ?? {},\n existing.map\n ));\n if (!isSame) {\n const prop = contentObject.getProperty(key);\n if (prop && Node.isPropertyAssignment(prop)) {\n prop.setInitializer(initializerText);\n changed = true;\n }\n }\n }\n\n // Handle markdown nodes\n else if (isMarkdownNode(value)) {\n const desired = (value as any)[NodeType.Markdown];\n const initializerText = buildMarkdownInitializer(desired);\n if (!initializerText) continue;\n if (!existingKeys.has(key)) {\n contentObject.addPropertyAssignment({\n name: key,\n initializer: initializerText,\n });\n changed = true;\n continue;\n }\n const existing = readExistingMarkdown(contentObject, key);\n const isSame =\n (typeof desired === 'string' &&\n existing?.kind === 'string' &&\n existing.value === desired) ||\n (isFileNode(desired) &&\n existing?.kind === 'file' &&\n existing.path === (desired as any)[NodeType.File]);\n if (!isSame) {\n const prop = contentObject.getProperty(key);\n if (prop && Node.isPropertyAssignment(prop)) {\n prop.setInitializer(initializerText);\n changed = true;\n }\n }\n }\n\n // Handle file nodes\n else if (isFileNode(value)) {\n const desired = (value as any)[NodeType.File];\n const initializerText = buildFileInitializer(desired);\n if (!initializerText) continue;\n if (!existingKeys.has(key)) {\n contentObject.addPropertyAssignment({\n name: key,\n initializer: initializerText,\n });\n changed = true;\n continue;\n }\n const existing = readExistingFilePath(contentObject, key);\n if (existing !== desired) {\n const prop = contentObject.getProperty(key);\n if (prop && Node.isPropertyAssignment(prop)) {\n prop.setInitializer(initializerText);\n changed = true;\n }\n }\n }\n\n // Handle nested nodes\n else if (isNestedNode(value)) {\n const initializerText = buildNestedInitializer(value);\n if (!initializerText) continue;\n if (!existingKeys.has(key)) {\n contentObject.addPropertyAssignment({\n name: key,\n initializer: initializerText,\n });\n changed = true;\n continue;\n }\n const existing = readExistingNest(contentObject, key);\n const desired = (value as any)[NodeType.Nested] as\n | { dictionaryKey?: string; path?: string }\n | undefined;\n const isSame =\n !!desired &&\n existing?.dictionaryKey === desired.dictionaryKey &&\n existing?.path === desired.path;\n if (!isSame) {\n const prop = contentObject.getProperty(key);\n if (prop && Node.isPropertyAssignment(prop)) {\n prop.setInitializer(initializerText);\n changed = true;\n }\n }\n }\n }\n\n if (!changed) return fileContent;\n\n return sourceFile.getFullText();\n } catch {\n // Fail-safe: return original content on any unexpected parsing issue\n return fileContent;\n }\n};\n"],"mappings":"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","names":[]}
@@ -1,9 +1,8 @@
1
- import configuration from "@intlayer/config/built";
2
- import { colorizePath, x } from "@intlayer/config/client";
1
+ import { getConfiguration } from "@intlayer/config";
3
2
  import { getUnmergedDictionaries } from "@intlayer/unmerged-dictionaries-entry";
4
3
  import deepEqual from "deep-equal";
5
4
  import { mkdir, writeFile } from "fs/promises";
6
- import { dirname, extname } from "path";
5
+ import { dirname, extname, join } from "path";
7
6
  import { prepareContentDeclaration } from "../prepareContentDeclaration.mjs";
8
7
  import { writeJSFile } from "./writeJSFile.mjs";
9
8
  const DEFAULT_NEW_DICTIONARY_PATH = "intlayer-dictionaries";
@@ -16,74 +15,66 @@ const formatContentDeclaration = async (dictionary) => {
16
15
  };
17
16
  return formattedContentDeclaration;
18
17
  };
19
- const writeContentDeclaration = async (dictionary, config = configuration, newDictionariesPath) => {
18
+ const writeContentDeclaration = async (dictionary, config = getConfiguration(), newDictionariesPath) => {
20
19
  const { content } = config;
21
20
  const { baseDir } = content;
22
21
  const newDictionaryRelativeLocationPath = newDictionariesPath ?? DEFAULT_NEW_DICTIONARY_PATH;
23
- const newDictionaryLocationPath = `${baseDir}/${newDictionaryRelativeLocationPath}`;
22
+ const newDictionaryLocationPath = join(
23
+ baseDir,
24
+ newDictionaryRelativeLocationPath
25
+ );
24
26
  const unmergedDictionariesRecord = getUnmergedDictionaries(config);
25
- const existingDictionary = unmergedDictionariesRecord[dictionary.key].filter((el) => el.filePath === dictionary.filePath);
26
- const filePath = dictionary.filePath;
27
+ const unmergedDictionaries = unmergedDictionariesRecord[dictionary.key];
28
+ const existingDictionary = unmergedDictionaries.filter(
29
+ (el) => el.localId === dictionary.localId
30
+ );
27
31
  const formattedContentDeclaration = await formatContentDeclaration(dictionary);
28
- if (existingDictionary) {
29
- if (deepEqual(existingDictionary, dictionary)) {
32
+ if (existingDictionary && dictionary.filePath) {
33
+ const filePath = join(config.content.baseDir, dictionary.filePath);
34
+ const isSameFile = deepEqual(existingDictionary, dictionary);
35
+ if (isSameFile) {
30
36
  return {
31
37
  status: "up-to-date",
32
38
  path: filePath
33
39
  };
34
- } else {
35
- if (filePath) {
36
- await writeFileWithDirectories(filePath, formattedContentDeclaration);
37
- return { status: "updated", path: filePath };
38
- } else {
39
- const contentDeclarationPath = `${newDictionaryLocationPath}/${dictionary.key}.content.json`;
40
- await writeFileWithDirectories(
41
- contentDeclarationPath,
42
- formattedContentDeclaration
43
- );
44
- return {
45
- status: "new content file",
46
- path: contentDeclarationPath
47
- };
48
- }
49
40
  }
50
- } else {
51
- const contentDeclarationPath = `${newDictionaryLocationPath}/${dictionary.key}.content.json`;
52
41
  await writeFileWithDirectories(
53
- contentDeclarationPath,
54
- formattedContentDeclaration
42
+ filePath,
43
+ formattedContentDeclaration,
44
+ config
55
45
  );
56
- return {
57
- status: "imported",
58
- path: contentDeclarationPath
59
- };
46
+ return { status: "updated", path: filePath };
60
47
  }
48
+ const contentDeclarationPath = join(
49
+ newDictionaryLocationPath,
50
+ `${dictionary.key}.content.json`
51
+ );
52
+ await writeFileWithDirectories(
53
+ contentDeclarationPath,
54
+ formattedContentDeclaration,
55
+ config
56
+ );
57
+ return {
58
+ status: "imported",
59
+ path: contentDeclarationPath
60
+ };
61
61
  };
62
- const writeFileWithDirectories = async (filePath, data) => {
63
- try {
64
- const dir = dirname(filePath);
65
- await mkdir(dir, { recursive: true });
66
- const extension = extname(filePath);
67
- const acceptedExtensions = configuration.content.fileExtensions.map(
68
- (extension2) => extname(extension2)
69
- );
70
- if (!acceptedExtensions.includes(extension)) {
71
- throw new Error(
72
- `Invalid file extension: ${extension}, file: ${filePath}`
73
- );
74
- }
75
- if (extension === ".json") {
76
- const jsonDictionary = JSON.stringify(data, null, 2);
77
- await writeFile(filePath, jsonDictionary);
78
- } else {
79
- await writeJSFile(filePath, data);
80
- }
81
- } catch (error) {
82
- console.error(data);
83
- throw new Error(
84
- `${x} Error writing file to ${colorizePath(filePath)}: ${error}`
85
- );
62
+ const writeFileWithDirectories = async (filePath, data, configuration) => {
63
+ const dir = dirname(filePath);
64
+ await mkdir(dir, { recursive: true });
65
+ const extension = extname(filePath);
66
+ const acceptedExtensions = configuration.content.fileExtensions.map(
67
+ (extension2) => extname(extension2)
68
+ );
69
+ if (!acceptedExtensions.includes(extension)) {
70
+ throw new Error(`Invalid file extension: ${extension}, file: ${filePath}`);
71
+ }
72
+ if (extension === ".json") {
73
+ const jsonDictionary = JSON.stringify(data, null, 2);
74
+ await writeFile(filePath, jsonDictionary);
75
+ return;
86
76
  }
77
+ await writeJSFile(filePath, data, configuration);
87
78
  };
88
79
  export {
89
80
  writeContentDeclaration
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/writeContentDeclaration/writeContentDeclaration.ts"],"sourcesContent":["import configuration from '@intlayer/config/built';\nimport { colorizePath, x, type IntlayerConfig } from '@intlayer/config/client';\nimport type { Dictionary } from '@intlayer/core';\nimport { getUnmergedDictionaries } from '@intlayer/unmerged-dictionaries-entry';\nimport deepEqual from 'deep-equal';\nimport { mkdir, writeFile } from 'fs/promises';\nimport { dirname, extname } from 'path';\nimport { prepareContentDeclaration } from '../prepareContentDeclaration';\nimport type { DictionaryStatus } from './dictionaryStatus';\nimport { writeJSFile } from './writeJSFile';\n\nconst DEFAULT_NEW_DICTIONARY_PATH = 'intlayer-dictionaries';\n\nconst formatContentDeclaration = async (dictionary: Dictionary) => {\n // Clean Markdown, Insertion, File, etc. node metadata\n const preparedContentDeclaration =\n await prepareContentDeclaration(dictionary);\n\n // Remove the filePath from the dictionary and set $schema\n const { filePath, $schema, ...dictionaryWithoutPath } =\n preparedContentDeclaration;\n\n const formattedContentDeclaration = {\n $schema: 'https://intlayer.org/schema.json',\n ...dictionaryWithoutPath,\n };\n\n return formattedContentDeclaration;\n};\n\nexport const writeContentDeclaration = async (\n dictionary: Dictionary,\n config: IntlayerConfig = configuration,\n newDictionariesPath?: string\n): Promise<{ status: DictionaryStatus; path: string }> => {\n const { content } = config;\n const { baseDir } = content;\n\n const newDictionaryRelativeLocationPath =\n newDictionariesPath ?? DEFAULT_NEW_DICTIONARY_PATH;\n const newDictionaryLocationPath = `${baseDir}/${newDictionaryRelativeLocationPath}`;\n\n const unmergedDictionariesRecord = getUnmergedDictionaries(config);\n const existingDictionary = (\n unmergedDictionariesRecord[dictionary.key] as Dictionary[]\n ).filter((el) => el.filePath === dictionary.filePath);\n\n const filePath = dictionary.filePath;\n const formattedContentDeclaration =\n await formatContentDeclaration(dictionary);\n\n if (existingDictionary) {\n // Compare existing dictionary with distant dictionary\n if (deepEqual(existingDictionary, dictionary)) {\n // Up to date, nothing to do\n return {\n status: 'up-to-date',\n path: filePath!,\n };\n } else {\n if (filePath) {\n await writeFileWithDirectories(filePath, formattedContentDeclaration);\n\n return { status: 'updated', path: filePath };\n } else {\n // Write the dictionary to the intlayer-dictionaries directory\n const contentDeclarationPath = `${newDictionaryLocationPath}/${dictionary.key}.content.json`;\n\n await writeFileWithDirectories(\n contentDeclarationPath,\n formattedContentDeclaration\n );\n\n return {\n status: 'new content file',\n path: contentDeclarationPath,\n };\n }\n }\n } else {\n // No existing dictionary, write to new location\n const contentDeclarationPath = `${newDictionaryLocationPath}/${dictionary.key}.content.json`;\n\n await writeFileWithDirectories(\n contentDeclarationPath,\n formattedContentDeclaration\n );\n\n return {\n status: 'imported',\n path: contentDeclarationPath,\n };\n }\n};\n\nconst writeFileWithDirectories = async (\n filePath: string,\n data: string | Buffer\n): Promise<void> => {\n try {\n // Extract the directory from the file path\n const dir = dirname(filePath);\n\n // Create the directory recursively\n await mkdir(dir, { recursive: true });\n\n const extension = extname(filePath);\n const acceptedExtensions = configuration.content.fileExtensions.map(\n (extension) => extname(extension)\n );\n\n if (!acceptedExtensions.includes(extension)) {\n throw new Error(\n `Invalid file extension: ${extension}, file: ${filePath}`\n );\n }\n\n if (extension === '.json') {\n const jsonDictionary = JSON.stringify(data, null, 2);\n\n // Write the file\n await writeFile(filePath, jsonDictionary);\n } else {\n await writeJSFile(filePath, data as unknown as Dictionary);\n }\n } catch (error) {\n console.error(data);\n\n throw new Error(\n `${x} Error writing file to ${colorizePath(filePath)}: ${error}`\n );\n }\n};\n"],"mappings":"AAAA,OAAO,mBAAmB;AAC1B,SAAS,cAAc,SAA8B;AAErD,SAAS,+BAA+B;AACxC,OAAO,eAAe;AACtB,SAAS,OAAO,iBAAiB;AACjC,SAAS,SAAS,eAAe;AACjC,SAAS,iCAAiC;AAE1C,SAAS,mBAAmB;AAE5B,MAAM,8BAA8B;AAEpC,MAAM,2BAA2B,OAAO,eAA2B;AAEjE,QAAM,6BACJ,MAAM,0BAA0B,UAAU;AAG5C,QAAM,EAAE,UAAU,SAAS,GAAG,sBAAsB,IAClD;AAEF,QAAM,8BAA8B;AAAA,IAClC,SAAS;AAAA,IACT,GAAG;AAAA,EACL;AAEA,SAAO;AACT;AAEO,MAAM,0BAA0B,OACrC,YACA,SAAyB,eACzB,wBACwD;AACxD,QAAM,EAAE,QAAQ,IAAI;AACpB,QAAM,EAAE,QAAQ,IAAI;AAEpB,QAAM,oCACJ,uBAAuB;AACzB,QAAM,4BAA4B,GAAG,OAAO,IAAI,iCAAiC;AAEjF,QAAM,6BAA6B,wBAAwB,MAAM;AACjE,QAAM,qBACJ,2BAA2B,WAAW,GAAG,EACzC,OAAO,CAAC,OAAO,GAAG,aAAa,WAAW,QAAQ;AAEpD,QAAM,WAAW,WAAW;AAC5B,QAAM,8BACJ,MAAM,yBAAyB,UAAU;AAE3C,MAAI,oBAAoB;AAEtB,QAAI,UAAU,oBAAoB,UAAU,GAAG;AAE7C,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM;AAAA,MACR;AAAA,IACF,OAAO;AACL,UAAI,UAAU;AACZ,cAAM,yBAAyB,UAAU,2BAA2B;AAEpE,eAAO,EAAE,QAAQ,WAAW,MAAM,SAAS;AAAA,MAC7C,OAAO;AAEL,cAAM,yBAAyB,GAAG,yBAAyB,IAAI,WAAW,GAAG;AAE7E,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,QACF;AAEA,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AAEL,UAAM,yBAAyB,GAAG,yBAAyB,IAAI,WAAW,GAAG;AAE7E,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,IACF;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,MAAM,2BAA2B,OAC/B,UACA,SACkB;AAClB,MAAI;AAEF,UAAM,MAAM,QAAQ,QAAQ;AAG5B,UAAM,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAEpC,UAAM,YAAY,QAAQ,QAAQ;AAClC,UAAM,qBAAqB,cAAc,QAAQ,eAAe;AAAA,MAC9D,CAACA,eAAc,QAAQA,UAAS;AAAA,IAClC;AAEA,QAAI,CAAC,mBAAmB,SAAS,SAAS,GAAG;AAC3C,YAAM,IAAI;AAAA,QACR,2BAA2B,SAAS,WAAW,QAAQ;AAAA,MACzD;AAAA,IACF;AAEA,QAAI,cAAc,SAAS;AACzB,YAAM,iBAAiB,KAAK,UAAU,MAAM,MAAM,CAAC;AAGnD,YAAM,UAAU,UAAU,cAAc;AAAA,IAC1C,OAAO;AACL,YAAM,YAAY,UAAU,IAA6B;AAAA,IAC3D;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,IAAI;AAElB,UAAM,IAAI;AAAA,MACR,GAAG,CAAC,0BAA0B,aAAa,QAAQ,CAAC,KAAK,KAAK;AAAA,IAChE;AAAA,EACF;AACF;","names":["extension"]}
1
+ {"version":3,"sources":["../../../src/writeContentDeclaration/writeContentDeclaration.ts"],"sourcesContent":["import { getConfiguration } from '@intlayer/config';\nimport { type IntlayerConfig } from '@intlayer/config/client';\nimport type { Dictionary } from '@intlayer/core';\nimport { getUnmergedDictionaries } from '@intlayer/unmerged-dictionaries-entry';\nimport deepEqual from 'deep-equal';\nimport { mkdir, writeFile } from 'fs/promises';\nimport { dirname, extname, join } from 'path';\nimport { prepareContentDeclaration } from '../prepareContentDeclaration';\nimport type { DictionaryStatus } from './dictionaryStatus';\nimport { writeJSFile } from './writeJSFile';\n\nconst DEFAULT_NEW_DICTIONARY_PATH = 'intlayer-dictionaries';\n\nconst formatContentDeclaration = async (dictionary: Dictionary) => {\n // Clean Markdown, Insertion, File, etc. node metadata\n const preparedContentDeclaration =\n await prepareContentDeclaration(dictionary);\n\n // Remove the filePath from the dictionary and set $schema\n const { filePath, $schema, ...dictionaryWithoutPath } =\n preparedContentDeclaration;\n\n const formattedContentDeclaration = {\n $schema: 'https://intlayer.org/schema.json',\n ...dictionaryWithoutPath,\n };\n\n return formattedContentDeclaration;\n};\n\nexport const writeContentDeclaration = async (\n dictionary: Dictionary,\n config: IntlayerConfig = getConfiguration(),\n newDictionariesPath?: string\n): Promise<{ status: DictionaryStatus; path: string }> => {\n const { content } = config;\n const { baseDir } = content;\n\n const newDictionaryRelativeLocationPath =\n newDictionariesPath ?? DEFAULT_NEW_DICTIONARY_PATH;\n const newDictionaryLocationPath = join(\n baseDir,\n newDictionaryRelativeLocationPath\n );\n\n const unmergedDictionariesRecord = getUnmergedDictionaries(config);\n const unmergedDictionaries = unmergedDictionariesRecord[\n dictionary.key\n ] as Dictionary[];\n\n const existingDictionary = unmergedDictionaries.filter(\n (el) => el.localId === dictionary.localId\n );\n\n const formattedContentDeclaration =\n await formatContentDeclaration(dictionary);\n\n if (existingDictionary && dictionary.filePath) {\n const filePath = join(config.content.baseDir, dictionary.filePath);\n\n // Compare existing dictionary with distant dictionary\n const isSameFile = deepEqual(existingDictionary, dictionary);\n\n // Up to date, nothing to do\n if (isSameFile) {\n return {\n status: 'up-to-date',\n path: filePath,\n };\n }\n\n await writeFileWithDirectories(\n filePath,\n formattedContentDeclaration,\n config\n );\n\n return { status: 'updated', path: filePath };\n }\n\n // No existing dictionary, write to new location\n const contentDeclarationPath = join(\n newDictionaryLocationPath,\n `${dictionary.key}.content.json`\n );\n\n await writeFileWithDirectories(\n contentDeclarationPath,\n formattedContentDeclaration,\n config\n );\n\n return {\n status: 'imported',\n path: contentDeclarationPath,\n };\n};\n\nconst writeFileWithDirectories = async (\n filePath: string,\n data: string | Buffer,\n configuration: IntlayerConfig\n): Promise<void> => {\n // Extract the directory from the file path\n const dir = dirname(filePath);\n\n // Create the directory recursively\n await mkdir(dir, { recursive: true });\n\n const extension = extname(filePath);\n const acceptedExtensions = configuration.content.fileExtensions.map(\n (extension) => extname(extension)\n );\n\n if (!acceptedExtensions.includes(extension)) {\n throw new Error(`Invalid file extension: ${extension}, file: ${filePath}`);\n }\n\n if (extension === '.json') {\n const jsonDictionary = JSON.stringify(data, null, 2);\n\n // Write the file\n await writeFile(filePath, jsonDictionary);\n\n return;\n }\n\n await writeJSFile(filePath, data as unknown as Dictionary, configuration);\n};\n"],"mappings":"AAAA,SAAS,wBAAwB;AAGjC,SAAS,+BAA+B;AACxC,OAAO,eAAe;AACtB,SAAS,OAAO,iBAAiB;AACjC,SAAS,SAAS,SAAS,YAAY;AACvC,SAAS,iCAAiC;AAE1C,SAAS,mBAAmB;AAE5B,MAAM,8BAA8B;AAEpC,MAAM,2BAA2B,OAAO,eAA2B;AAEjE,QAAM,6BACJ,MAAM,0BAA0B,UAAU;AAG5C,QAAM,EAAE,UAAU,SAAS,GAAG,sBAAsB,IAClD;AAEF,QAAM,8BAA8B;AAAA,IAClC,SAAS;AAAA,IACT,GAAG;AAAA,EACL;AAEA,SAAO;AACT;AAEO,MAAM,0BAA0B,OACrC,YACA,SAAyB,iBAAiB,GAC1C,wBACwD;AACxD,QAAM,EAAE,QAAQ,IAAI;AACpB,QAAM,EAAE,QAAQ,IAAI;AAEpB,QAAM,oCACJ,uBAAuB;AACzB,QAAM,4BAA4B;AAAA,IAChC;AAAA,IACA;AAAA,EACF;AAEA,QAAM,6BAA6B,wBAAwB,MAAM;AACjE,QAAM,uBAAuB,2BAC3B,WAAW,GACb;AAEA,QAAM,qBAAqB,qBAAqB;AAAA,IAC9C,CAAC,OAAO,GAAG,YAAY,WAAW;AAAA,EACpC;AAEA,QAAM,8BACJ,MAAM,yBAAyB,UAAU;AAE3C,MAAI,sBAAsB,WAAW,UAAU;AAC7C,UAAM,WAAW,KAAK,OAAO,QAAQ,SAAS,WAAW,QAAQ;AAGjE,UAAM,aAAa,UAAU,oBAAoB,UAAU;AAG3D,QAAI,YAAY;AACd,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM;AAAA,MACR;AAAA,IACF;AAEA,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO,EAAE,QAAQ,WAAW,MAAM,SAAS;AAAA,EAC7C;AAGA,QAAM,yBAAyB;AAAA,IAC7B;AAAA,IACA,GAAG,WAAW,GAAG;AAAA,EACnB;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,EACR;AACF;AAEA,MAAM,2BAA2B,OAC/B,UACA,MACA,kBACkB;AAElB,QAAM,MAAM,QAAQ,QAAQ;AAG5B,QAAM,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAEpC,QAAM,YAAY,QAAQ,QAAQ;AAClC,QAAM,qBAAqB,cAAc,QAAQ,eAAe;AAAA,IAC9D,CAACA,eAAc,QAAQA,UAAS;AAAA,EAClC;AAEA,MAAI,CAAC,mBAAmB,SAAS,SAAS,GAAG;AAC3C,UAAM,IAAI,MAAM,2BAA2B,SAAS,WAAW,QAAQ,EAAE;AAAA,EAC3E;AAEA,MAAI,cAAc,SAAS;AACzB,UAAM,iBAAiB,KAAK,UAAU,MAAM,MAAM,CAAC;AAGnD,UAAM,UAAU,UAAU,cAAc;AAExC;AAAA,EACF;AAEA,QAAM,YAAY,UAAU,MAA+B,aAAa;AAC1E;","names":["extension"]}
@@ -1,40 +1,17 @@
1
- import * as generate from "@babel/generator";
2
- import * as babelParser from "@babel/parser";
3
- import * as babelTraverse from "@babel/traverse";
4
- import * as t from "@babel/types";
5
- import { getAppLogger, logger } from "@intlayer/config";
6
- import configuration from "@intlayer/config/built";
7
1
  import {
8
- NodeType
9
- } from "@intlayer/core";
2
+ getAppLogger,
3
+ getConfiguration,
4
+ logger
5
+ } from "@intlayer/config";
10
6
  import { existsSync } from "fs";
11
7
  import { readFile, writeFile } from "fs/promises";
12
8
  import { extname } from "path";
13
9
  import { getContentDeclarationFileTemplate } from "../getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.mjs";
14
10
  import { formatCode } from "./formatCode.mjs";
15
- const writeJSFile = async (filePath, dictionary) => {
16
- const normalizeTraverse = (mod) => {
17
- const candidate = mod;
18
- if (typeof candidate === "function") return candidate;
19
- if (candidate?.default) {
20
- if (typeof candidate.default === "function") return candidate.default;
21
- if (typeof candidate.default?.default === "function")
22
- return candidate.default.default;
23
- if (typeof candidate.default?.traverse === "function")
24
- return candidate.default.traverse;
25
- }
26
- if (typeof candidate?.traverse === "function") return candidate.traverse;
27
- return candidate;
28
- };
29
- const traverse = normalizeTraverse(babelTraverse);
11
+ import { transformJSFile } from "./transformJSFile.mjs";
12
+ const writeJSFile = async (filePath, dictionary, configuration = getConfiguration()) => {
13
+ const { key, locale, autoFilled } = dictionary;
30
14
  const appLogger = getAppLogger(configuration);
31
- const {
32
- key: dictionaryIdentifierKey,
33
- content: updatesToApply,
34
- locale,
35
- autoFilled
36
- } = dictionary;
37
- const isPerLocaleDeclarationFile = typeof locale === "string";
38
15
  if (!existsSync(filePath)) {
39
16
  const fileExtension = extname(filePath);
40
17
  let format = "ts";
@@ -48,258 +25,17 @@ const writeJSFile = async (filePath, dictionary) => {
48
25
  appLogger("File does not exist, creating it", {
49
26
  isVerbose: true
50
27
  });
51
- const template = await getContentDeclarationFileTemplate(
52
- dictionaryIdentifierKey,
53
- format,
54
- { locale, autoFilled }
55
- );
56
- await writeFile(filePath, template, "utf-8");
57
- }
58
- let sourceCode;
59
- try {
60
- sourceCode = await readFile(filePath, "utf-8");
61
- } catch (error) {
62
- const err = error;
63
- appLogger(`Failed to read file: ${filePath}`, {
64
- level: "error"
65
- });
66
- throw new Error(`Failed to read file ${filePath}: ${err.message}`);
67
- }
68
- const ast = babelParser.parse(sourceCode, {
69
- sourceType: "module",
70
- plugins: ["typescript", "jsx"],
71
- tokens: true
72
- });
73
- let dictionaryObjectPath = null;
74
- let dictionaryIdentifier = null;
75
- traverse(ast, {
76
- ObjectExpression(path) {
77
- if (dictionaryObjectPath) return;
78
- const keyProp = path.node.properties.find(
79
- (prop) => {
80
- if (!t.isObjectProperty(prop)) return false;
81
- if (!t.isIdentifier(prop.key) && !t.isStringLiteral(prop.key))
82
- return false;
83
- const keyName = t.isIdentifier(prop.key) ? prop.key.name : prop.key.value;
84
- if (keyName !== "key" || !t.isStringLiteral(prop.value)) return false;
85
- const propValue = prop.value.value;
86
- return propValue === dictionaryIdentifierKey;
87
- }
88
- );
89
- if (keyProp) {
90
- dictionaryObjectPath = path;
91
- path.stop();
92
- }
93
- }
94
- });
95
- if (!dictionaryObjectPath) {
96
- appLogger(`Looking for variable declarations`, {
97
- isVerbose: true
98
- });
99
- const candidateVars = [];
100
- traverse(ast, {
101
- VariableDeclarator(path) {
102
- const { node } = path;
103
- if (!t.isIdentifier(node.id)) return;
104
- let objPath = null;
105
- if (node.init && t.isObjectExpression(node.init)) {
106
- objPath = path.get("init");
107
- } else if (node.init && (t.isTSAsExpression(node.init) || t.isTSTypeAssertion(node.init)) && t.isObjectExpression(node.init.expression)) {
108
- objPath = path.get("init.expression");
109
- }
110
- if (objPath) {
111
- candidateVars.push({ id: node.id.name, path: objPath });
112
- }
113
- }
28
+ const template = await getContentDeclarationFileTemplate(key, format, {
29
+ locale,
30
+ autoFilled
114
31
  });
115
- appLogger(`Found ${candidateVars.length} candidate variables`, {
116
- isVerbose: true
117
- });
118
- for (const { id, path } of candidateVars) {
119
- const keyProp = path.node.properties.find((prop) => {
120
- if (!t.isObjectProperty(prop)) return false;
121
- if (!t.isIdentifier(prop.key) && !t.isStringLiteral(prop.key))
122
- return false;
123
- const keyName = t.isIdentifier(prop.key) ? prop.key.name : prop.key.value;
124
- return keyName === "key" && t.isStringLiteral(prop.value) && prop.value.value === dictionaryIdentifierKey;
125
- });
126
- if (keyProp) {
127
- appLogger(`Found match in variable: ${id}`);
128
- dictionaryObjectPath = path;
129
- dictionaryIdentifier = id;
130
- break;
131
- }
132
- }
133
- if (!dictionaryObjectPath) {
134
- appLogger("Could not find dictionary object. Dumping all objects:", {
135
- isVerbose: true
136
- });
137
- traverse(ast, {
138
- ObjectExpression(path) {
139
- const props = path.node.properties.map(
140
- (prop) => {
141
- if (!t.isObjectProperty(prop)) return "non-object-property";
142
- if (!t.isIdentifier(prop.key) && !t.isStringLiteral(prop.key))
143
- return "complex-key";
144
- const keyName = t.isIdentifier(prop.key) ? prop.key.name : prop.key.value;
145
- let valueDesc = "unknown-value";
146
- if (t.isStringLiteral(prop.value)) {
147
- valueDesc = `"${prop.value.value}"`;
148
- }
149
- return `${keyName}: ${valueDesc}`;
150
- }
151
- ).join(", ");
152
- appLogger(`Object: { ${props} }`);
153
- }
154
- });
155
- }
156
- }
157
- if (!dictionaryObjectPath) {
158
- throw new Error(
159
- `Could not find dictionary object with key '${dictionaryIdentifierKey}' in ${filePath}`
160
- );
161
- }
162
- const contentPropertyPath = dictionaryObjectPath.get("properties").find((propPath) => {
163
- if (!propPath.isObjectProperty()) return false;
164
- const propNode = propPath.node;
165
- const keyName = t.isIdentifier(propNode.key) ? propNode.key.name : t.isStringLiteral(propNode.key) ? propNode.key.value : null;
166
- return keyName === "content";
167
- });
168
- if (!contentPropertyPath || !contentPropertyPath.isObjectProperty() || !contentPropertyPath.get("value").isObjectExpression()) {
169
- throw new Error(
170
- `Could not find 'content' object property, or it's not an object, in dictionary in ${filePath}`
171
- );
172
- }
173
- const contentObjectPath = contentPropertyPath.get(
174
- "value"
175
- );
176
- const buildValueNodeFromData = (data) => {
177
- if (data?.nodeType === NodeType.Translation) {
178
- const translationContent = data;
179
- if (isPerLocaleDeclarationFile && typeof locale === "string" && translationContent?.[NodeType.Translation]?.[locale] !== void 0) {
180
- return buildValueNodeFromData(
181
- translationContent[NodeType.Translation][locale]
182
- );
183
- }
184
- const translationsObj = t.objectExpression(
185
- Object.entries(translationContent?.[NodeType.Translation] ?? {}).map(
186
- ([langKey, langValue]) => {
187
- const keyNode = t.isValidIdentifier(langKey) ? t.identifier(langKey) : t.stringLiteral(langKey);
188
- return t.objectProperty(keyNode, buildValueNodeFromData(langValue));
189
- }
190
- )
191
- );
192
- return t.callExpression(t.identifier("t"), [translationsObj]);
193
- }
194
- if (Array.isArray(data)) {
195
- return t.arrayExpression(data.map((el) => buildValueNodeFromData(el)));
196
- }
197
- if (data && typeof data === "object") {
198
- const props = Object.entries(data).map(([k, v]) => {
199
- const key = t.isValidIdentifier(k) ? t.identifier(k) : t.stringLiteral(k);
200
- return t.objectProperty(key, buildValueNodeFromData(v));
201
- });
202
- return t.objectExpression(props);
203
- }
204
- switch (typeof data) {
205
- case "string":
206
- return t.stringLiteral(data);
207
- case "number":
208
- return t.numericLiteral(data);
209
- case "boolean":
210
- return t.booleanLiteral(data);
211
- default:
212
- return t.nullLiteral();
213
- }
214
- };
215
- const ensureObjectProperty = (objPath, key) => {
216
- const existing = objPath.get("properties").find((propPath) => {
217
- if (!propPath.isObjectProperty()) return false;
218
- const propNode = propPath.node;
219
- const keyName = t.isIdentifier(propNode.key) ? propNode.key.name : t.isStringLiteral(propNode.key) ? propNode.key.value : null;
220
- return keyName === key;
221
- });
222
- if (existing) return existing;
223
- const keyNode = t.isValidIdentifier(key) ? t.identifier(key) : t.stringLiteral(key);
224
- const newProp = t.objectProperty(keyNode, t.objectExpression([]));
225
- objPath.node.properties.push(newProp);
226
- const props = objPath.get("properties");
227
- return props[props.length - 1];
228
- };
229
- const mergeValueIntoProperty = (propPath, value, propKeyForLogs) => {
230
- const valuePath = propPath.get("value");
231
- if (value?.nodeType === NodeType.Translation) {
232
- const translationContent = value;
233
- if (valuePath.isCallExpression() && t.isIdentifier(valuePath.node.callee) && valuePath.node.callee.name === "t") {
234
- const translationsObj = t.objectExpression(
235
- Object.entries(translationContent?.[NodeType.Translation] ?? {}).map(
236
- ([langKey, langValue]) => t.objectProperty(
237
- t.isValidIdentifier(langKey) ? t.identifier(langKey) : t.stringLiteral(langKey),
238
- buildValueNodeFromData(langValue)
239
- )
240
- )
241
- );
242
- if (isPerLocaleDeclarationFile && typeof locale === "string") {
243
- const localized = translationContent?.[NodeType.Translation]?.[locale];
244
- if (localized !== void 0) {
245
- valuePath.replaceWith(buildValueNodeFromData(localized));
246
- return;
247
- }
248
- }
249
- valuePath.node.arguments = [translationsObj];
250
- return;
251
- }
252
- valuePath.replaceWith(buildValueNodeFromData(value));
253
- return;
254
- }
255
- if (Array.isArray(value)) {
256
- valuePath.replaceWith(buildValueNodeFromData(value));
257
- return;
258
- }
259
- if (value && typeof value === "object") {
260
- if (!valuePath.isObjectExpression()) {
261
- valuePath.replaceWith(t.objectExpression([]));
262
- }
263
- const objPath = valuePath;
264
- for (const [k, v] of Object.entries(value)) {
265
- const childProp = ensureObjectProperty(objPath, k);
266
- mergeValueIntoProperty(childProp, v, `${propKeyForLogs}.${k}`);
267
- }
268
- return;
269
- }
270
- valuePath.replaceWith(buildValueNodeFromData(value));
271
- return;
272
- };
273
- for (const [entryKeyToUpdate, newEntryData] of Object.entries(
274
- updatesToApply
275
- )) {
276
- let targetPropertyPath = contentObjectPath.get("properties").find((propPath) => {
277
- if (!propPath.isObjectProperty()) return false;
278
- const propNode = propPath.node;
279
- const keyName = t.isIdentifier(propNode.key) ? propNode.key.name : t.isStringLiteral(propNode.key) ? propNode.key.value : null;
280
- return keyName === entryKeyToUpdate;
281
- });
282
- if (!targetPropertyPath) {
283
- const keyNode = t.isValidIdentifier(entryKeyToUpdate) ? t.identifier(entryKeyToUpdate) : t.stringLiteral(entryKeyToUpdate);
284
- const newProperty = t.objectProperty(keyNode, t.objectExpression([]));
285
- contentObjectPath.node.properties.push(newProperty);
286
- const props = contentObjectPath.get("properties");
287
- targetPropertyPath = props[props.length - 1];
288
- }
289
- mergeValueIntoProperty(targetPropertyPath, newEntryData, entryKeyToUpdate);
32
+ await writeFile(filePath, template, "utf-8");
290
33
  }
291
- const generatedCode = generate.generate(ast, {
292
- retainLines: true,
293
- comments: true,
294
- jsescOption: {
295
- minimal: true
296
- // This ensures Unicode characters are not escaped
297
- }
298
- }).code;
299
- let finalCode = generatedCode;
300
- finalCode = await formatCode(filePath, finalCode);
34
+ const fileContent = await readFile(filePath, "utf-8");
35
+ const finalCode = await transformJSFile(fileContent, dictionary);
36
+ const formattedCode = await formatCode(filePath, finalCode);
301
37
  try {
302
- await writeFile(filePath, finalCode, "utf-8");
38
+ await writeFile(filePath, formattedCode, "utf-8");
303
39
  logger(`Successfully updated ${filePath}`, {
304
40
  level: "info",
305
41
  isVerbose: true