@intlayer/engine 9.2.0 → 9.3.1

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 (326) hide show
  1. package/README.md +24 -24
  2. package/dist/assets/initConfig/templates/cjs.txt +1 -1
  3. package/dist/assets/initConfig/templates/mjs.txt +1 -1
  4. package/dist/assets/initConfig/templates/ts.txt +1 -1
  5. package/dist/cjs/_virtual/_rolldown/runtime.cjs +1 -2
  6. package/dist/cjs/_virtual/_utils_asset.cjs +2 -1
  7. package/dist/cjs/buildIntlayerDictionary/buildIntlayerDictionary.cjs +14 -2
  8. package/dist/cjs/buildIntlayerDictionary/buildIntlayerDictionary.cjs.map +1 -1
  9. package/dist/cjs/buildIntlayerDictionary/writeDynamicDictionary.cjs +26 -5
  10. package/dist/cjs/buildIntlayerDictionary/writeDynamicDictionary.cjs.map +1 -1
  11. package/dist/cjs/buildIntlayerDictionary/writeFetchDictionary.cjs +43 -6
  12. package/dist/cjs/buildIntlayerDictionary/writeFetchDictionary.cjs.map +1 -1
  13. package/dist/cjs/buildIntlayerDictionary/writeMergedDictionary.cjs +2 -1
  14. package/dist/cjs/buildIntlayerDictionary/writeMergedDictionary.cjs.map +1 -1
  15. package/dist/cjs/buildIntlayerDictionary/writeNestedDictionary.cjs +96 -0
  16. package/dist/cjs/buildIntlayerDictionary/writeNestedDictionary.cjs.map +1 -0
  17. package/dist/cjs/buildIntlayerDictionary/writeRemoteDictionary.cjs +4 -2
  18. package/dist/cjs/buildIntlayerDictionary/writeRemoteDictionary.cjs.map +1 -1
  19. package/dist/cjs/buildIntlayerDictionary/writeUnmergedDictionary.cjs.map +1 -1
  20. package/dist/cjs/cleanOutputDir.cjs.map +1 -1
  21. package/dist/cjs/cleanRemovedContentDeclaration.cjs +7 -4
  22. package/dist/cjs/cleanRemovedContentDeclaration.cjs.map +1 -1
  23. package/dist/cjs/createDictionaryEntryPoint/createDictionaryEntryPoint.cjs +5 -3
  24. package/dist/cjs/createDictionaryEntryPoint/createDictionaryEntryPoint.cjs.map +1 -1
  25. package/dist/cjs/createDictionaryEntryPoint/generateDictionaryListContent.cjs.map +1 -1
  26. package/dist/cjs/createDictionaryEntryPoint/getBuiltDictionariesPath.cjs.map +1 -1
  27. package/dist/cjs/createDictionaryEntryPoint/getBuiltDynamicDictionariesPath.cjs.map +1 -1
  28. package/dist/cjs/createDictionaryEntryPoint/getBuiltFetchDictionariesPath.cjs.map +1 -1
  29. package/dist/cjs/createDictionaryEntryPoint/getBuiltRemoteDictionariesPath.cjs.map +1 -1
  30. package/dist/cjs/createDictionaryEntryPoint/getBuiltUnmergedDictionariesPath.cjs.map +1 -1
  31. package/dist/cjs/createType/createModuleAugmentation.cjs +2 -1
  32. package/dist/cjs/createType/createModuleAugmentation.cjs.map +1 -1
  33. package/dist/cjs/createType/createType.cjs.map +1 -1
  34. package/dist/cjs/detectFormatCommand.cjs.map +1 -1
  35. package/dist/cjs/docReview/alignBlocks.cjs +1 -1
  36. package/dist/cjs/docReview/alignBlocks.cjs.map +1 -1
  37. package/dist/cjs/docReview/computeSimilarity.cjs +0 -1
  38. package/dist/cjs/docReview/computeSimilarity.cjs.map +1 -1
  39. package/dist/cjs/docReview/mapChangedLinesToBlocks.cjs +0 -1
  40. package/dist/cjs/docReview/mapChangedLinesToBlocks.cjs.map +1 -1
  41. package/dist/cjs/docReview/normalizeBlock.cjs +0 -1
  42. package/dist/cjs/docReview/normalizeBlock.cjs.map +1 -1
  43. package/dist/cjs/docReview/planActions.cjs +0 -1
  44. package/dist/cjs/docReview/planActions.cjs.map +1 -1
  45. package/dist/cjs/docReview/rebuildDocument.cjs +0 -1
  46. package/dist/cjs/docReview/rebuildDocument.cjs.map +1 -1
  47. package/dist/cjs/docReview/reviewReport.cjs +2 -1
  48. package/dist/cjs/docReview/reviewReport.cjs.map +1 -1
  49. package/dist/cjs/docReview/segmentDocument.cjs +0 -1
  50. package/dist/cjs/docReview/segmentDocument.cjs.map +1 -1
  51. package/dist/cjs/fetchDistantDictionaries.cjs +107 -13
  52. package/dist/cjs/fetchDistantDictionaries.cjs.map +1 -1
  53. package/dist/cjs/filterInvalidDictionaries.cjs.map +1 -1
  54. package/dist/cjs/formatDictionary.cjs.map +1 -1
  55. package/dist/cjs/getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.cjs.map +1 -1
  56. package/dist/cjs/handleAdditionalContentDeclarationFile.cjs +4 -2
  57. package/dist/cjs/handleAdditionalContentDeclarationFile.cjs.map +1 -1
  58. package/dist/cjs/handleContentDeclarationFileChange.cjs +6 -2
  59. package/dist/cjs/handleContentDeclarationFileChange.cjs.map +1 -1
  60. package/dist/cjs/handleContentDeclarationFileMoved.cjs.map +1 -1
  61. package/dist/cjs/handleUnlinkedContentDeclarationFile.cjs +4 -2
  62. package/dist/cjs/handleUnlinkedContentDeclarationFile.cjs.map +1 -1
  63. package/dist/cjs/init/cms.cjs.map +1 -1
  64. package/dist/cjs/init/frameworkSetup/nextAppRouter/detect.cjs.map +1 -1
  65. package/dist/cjs/init/frameworkSetup/nextAppRouter/index.cjs +1 -3
  66. package/dist/cjs/init/frameworkSetup/nextAppRouter/index.cjs.map +1 -1
  67. package/dist/cjs/init/frameworkSetup/nextAppRouter/restructure.cjs +2 -1
  68. package/dist/cjs/init/frameworkSetup/nextAppRouter/restructure.cjs.map +1 -1
  69. package/dist/cjs/init/frameworkSetup/nextAppRouter/templates.cjs +0 -1
  70. package/dist/cjs/init/frameworkSetup/nextAppRouter/templates.cjs.map +1 -1
  71. package/dist/cjs/init/frameworkSetup/tanstackStart/detect.cjs.map +1 -1
  72. package/dist/cjs/init/frameworkSetup/tanstackStart/index.cjs +3 -5
  73. package/dist/cjs/init/frameworkSetup/tanstackStart/index.cjs.map +1 -1
  74. package/dist/cjs/init/frameworkSetup/tanstackStart/restructure.cjs +2 -1
  75. package/dist/cjs/init/frameworkSetup/tanstackStart/restructure.cjs.map +1 -1
  76. package/dist/cjs/init/frameworkSetup/tanstackStart/templates.cjs +18 -12
  77. package/dist/cjs/init/frameworkSetup/tanstackStart/templates.cjs.map +1 -1
  78. package/dist/cjs/init/frameworkSetup/tanstackStart/transforms.cjs +58 -15
  79. package/dist/cjs/init/frameworkSetup/tanstackStart/transforms.cjs.map +1 -1
  80. package/dist/cjs/init/index.cjs +66 -38
  81. package/dist/cjs/init/index.cjs.map +1 -1
  82. package/dist/cjs/init/utils/configManipulation.cjs.map +1 -1
  83. package/dist/cjs/init/utils/fileSystem.cjs +3 -1
  84. package/dist/cjs/init/utils/fileSystem.cjs.map +1 -1
  85. package/dist/cjs/init/utils/githubActions.cjs.map +1 -1
  86. package/dist/cjs/init/utils/jsonParser.cjs +0 -1
  87. package/dist/cjs/init/utils/jsonParser.cjs.map +1 -1
  88. package/dist/cjs/init/utils/nextCompilerBabel.cjs.map +1 -1
  89. package/dist/cjs/init/utils/packageManager.cjs +4 -2
  90. package/dist/cjs/init/utils/packageManager.cjs.map +1 -1
  91. package/dist/cjs/init/utils/tsConfig.cjs.map +1 -1
  92. package/dist/cjs/init/utils/version.cjs +0 -1
  93. package/dist/cjs/init/utils/version.cjs.map +1 -1
  94. package/dist/cjs/initConfig/index.cjs +12 -8
  95. package/dist/cjs/initConfig/index.cjs.map +1 -1
  96. package/dist/cjs/installSkills/index.cjs.map +1 -1
  97. package/dist/cjs/listDictionariesPath.cjs +6 -5
  98. package/dist/cjs/listDictionariesPath.cjs.map +1 -1
  99. package/dist/cjs/listGitFiles.cjs.map +1 -1
  100. package/dist/cjs/listProjects.cjs +2 -1
  101. package/dist/cjs/listProjects.cjs.map +1 -1
  102. package/dist/cjs/loadDictionaries/getIntlayerBundle.cjs +2 -1
  103. package/dist/cjs/loadDictionaries/getIntlayerBundle.cjs.map +1 -1
  104. package/dist/cjs/loadDictionaries/loadContentDeclaration.cjs +8 -5
  105. package/dist/cjs/loadDictionaries/loadContentDeclaration.cjs.map +1 -1
  106. package/dist/cjs/loadDictionaries/loadDictionaries.cjs +4 -2
  107. package/dist/cjs/loadDictionaries/loadDictionaries.cjs.map +1 -1
  108. package/dist/cjs/loadDictionaries/loadLocalDictionaries.cjs.map +1 -1
  109. package/dist/cjs/loadDictionaries/loadMarkdownContentDeclaration.cjs.map +1 -1
  110. package/dist/cjs/loadDictionaries/loadRemoteDictionaries.cjs +3 -2
  111. package/dist/cjs/loadDictionaries/loadRemoteDictionaries.cjs.map +1 -1
  112. package/dist/cjs/loadDictionaries/loadYamlContentDeclaration.cjs +2 -1
  113. package/dist/cjs/loadDictionaries/loadYamlContentDeclaration.cjs.map +1 -1
  114. package/dist/cjs/loadDictionaries/log.cjs +38 -11
  115. package/dist/cjs/loadDictionaries/log.cjs.map +1 -1
  116. package/dist/cjs/loadDictionaries/logTypeScriptErrors.cjs.map +1 -1
  117. package/dist/cjs/logConfigDetails.cjs +4 -3
  118. package/dist/cjs/logConfigDetails.cjs.map +1 -1
  119. package/dist/cjs/prepareIntlayer.cjs +5 -3
  120. package/dist/cjs/prepareIntlayer.cjs.map +1 -1
  121. package/dist/cjs/reduceDictionaryContent/applyMask.cjs +0 -1
  122. package/dist/cjs/reduceDictionaryContent/applyMask.cjs.map +1 -1
  123. package/dist/cjs/reduceDictionaryContent/reduceDictionaryContent.cjs +2 -1
  124. package/dist/cjs/reduceDictionaryContent/reduceDictionaryContent.cjs.map +1 -1
  125. package/dist/cjs/scan/calculateScore.cjs +0 -1
  126. package/dist/cjs/scan/calculateScore.cjs.map +1 -1
  127. package/dist/cjs/scan/checks.cjs +1 -1
  128. package/dist/cjs/scan/checks.cjs.map +1 -1
  129. package/dist/cjs/scan/parseHtml.cjs +0 -1
  130. package/dist/cjs/scan/parseHtml.cjs.map +1 -1
  131. package/dist/cjs/scan/scanWebsite.cjs.map +1 -1
  132. package/dist/cjs/syncPluginKit/createFileAdapter.cjs +2 -1
  133. package/dist/cjs/syncPluginKit/createFileAdapter.cjs.map +1 -1
  134. package/dist/cjs/syncPluginKit/createSyncPlugin.cjs +4 -1
  135. package/dist/cjs/syncPluginKit/createSyncPlugin.cjs.map +1 -1
  136. package/dist/cjs/syncPluginKit/extractKeyAndLocaleFromPath.cjs +0 -1
  137. package/dist/cjs/syncPluginKit/extractKeyAndLocaleFromPath.cjs.map +1 -1
  138. package/dist/cjs/syncPluginKit/filePathPatternHelpers.cjs +0 -1
  139. package/dist/cjs/syncPluginKit/filePathPatternHelpers.cjs.map +1 -1
  140. package/dist/cjs/utils/autoDecorateContent.cjs.map +1 -1
  141. package/dist/cjs/utils/babelParser.cjs.map +1 -1
  142. package/dist/cjs/utils/buildComponentFilesList.cjs.map +1 -1
  143. package/dist/cjs/utils/buildFilesList.cjs.map +1 -1
  144. package/dist/cjs/utils/chunkArray.cjs +23 -0
  145. package/dist/cjs/utils/chunkArray.cjs.map +1 -0
  146. package/dist/cjs/utils/formatter.cjs.map +1 -1
  147. package/dist/cjs/utils/getContentExtension.cjs +1 -4
  148. package/dist/cjs/utils/getContentExtension.cjs.map +1 -1
  149. package/dist/cjs/utils/getFormatFromExtension.cjs +0 -1
  150. package/dist/cjs/utils/getFormatFromExtension.cjs.map +1 -1
  151. package/dist/cjs/utils/getPathHash.cjs +0 -1
  152. package/dist/cjs/utils/getPathHash.cjs.map +1 -1
  153. package/dist/cjs/utils/index.cjs +2 -0
  154. package/dist/cjs/utils/mergeChunks.cjs +0 -1
  155. package/dist/cjs/utils/mergeChunks.cjs.map +1 -1
  156. package/dist/cjs/utils/pLimit.cjs +0 -1
  157. package/dist/cjs/utils/pLimit.cjs.map +1 -1
  158. package/dist/cjs/utils/readDictionariesFromDisk.cjs.map +1 -1
  159. package/dist/cjs/utils/reduceObjectFormat.cjs +0 -1
  160. package/dist/cjs/utils/reduceObjectFormat.cjs.map +1 -1
  161. package/dist/cjs/utils/resolveObjectPromises.cjs +0 -1
  162. package/dist/cjs/utils/resolveObjectPromises.cjs.map +1 -1
  163. package/dist/cjs/utils/resolveRelativePath.cjs +4 -1
  164. package/dist/cjs/utils/resolveRelativePath.cjs.map +1 -1
  165. package/dist/cjs/utils/runOnce.cjs +2 -2
  166. package/dist/cjs/utils/runOnce.cjs.map +1 -1
  167. package/dist/cjs/utils/runParallel/bin.cjs.map +1 -1
  168. package/dist/cjs/utils/runParallel/bootstrap.cjs +0 -1
  169. package/dist/cjs/utils/runParallel/bootstrap.cjs.map +1 -1
  170. package/dist/cjs/utils/runParallel/index.cjs.map +1 -1
  171. package/dist/cjs/utils/runParallel/spawnPosix.cjs.map +1 -1
  172. package/dist/cjs/utils/runParallel/spawnWin32.cjs.map +1 -1
  173. package/dist/cjs/utils/sortAlphabetically.cjs +0 -1
  174. package/dist/cjs/utils/sortAlphabetically.cjs.map +1 -1
  175. package/dist/cjs/utils/splitTextByLine.cjs +0 -1
  176. package/dist/cjs/utils/splitTextByLine.cjs.map +1 -1
  177. package/dist/cjs/utils/verifyIdenticObjectFormat.cjs +0 -1
  178. package/dist/cjs/utils/verifyIdenticObjectFormat.cjs.map +1 -1
  179. package/dist/cjs/watcher.cjs +4 -2
  180. package/dist/cjs/watcher.cjs.map +1 -1
  181. package/dist/cjs/writeConfiguration/index.cjs +2 -1
  182. package/dist/cjs/writeConfiguration/index.cjs.map +1 -1
  183. package/dist/cjs/writeContentDeclaration/detectExportedComponentName.cjs +0 -1
  184. package/dist/cjs/writeContentDeclaration/detectExportedComponentName.cjs.map +1 -1
  185. package/dist/cjs/writeContentDeclaration/processContentDeclarationContent.cjs.map +1 -1
  186. package/dist/cjs/writeContentDeclaration/transformJSFile.cjs +173 -109
  187. package/dist/cjs/writeContentDeclaration/transformJSFile.cjs.map +1 -1
  188. package/dist/cjs/writeContentDeclaration/transformJSONFile.cjs +6 -5
  189. package/dist/cjs/writeContentDeclaration/transformJSONFile.cjs.map +1 -1
  190. package/dist/cjs/writeContentDeclaration/writeContentDeclaration.cjs +9 -3
  191. package/dist/cjs/writeContentDeclaration/writeContentDeclaration.cjs.map +1 -1
  192. package/dist/cjs/writeContentDeclaration/writeJSFile.cjs +2 -1
  193. package/dist/cjs/writeContentDeclaration/writeJSFile.cjs.map +1 -1
  194. package/dist/cjs/writeContentDeclaration/writeMarkdownFile.cjs +2 -1
  195. package/dist/cjs/writeContentDeclaration/writeMarkdownFile.cjs.map +1 -1
  196. package/dist/cjs/writeContentDeclaration/writeYamlFile.cjs +4 -2
  197. package/dist/cjs/writeContentDeclaration/writeYamlFile.cjs.map +1 -1
  198. package/dist/cjs/writeFileIfChanged.cjs.map +1 -1
  199. package/dist/esm/_virtual/_utils_asset.mjs +2 -1
  200. package/dist/esm/buildIntlayerDictionary/buildIntlayerDictionary.mjs +15 -3
  201. package/dist/esm/buildIntlayerDictionary/buildIntlayerDictionary.mjs.map +1 -1
  202. package/dist/esm/buildIntlayerDictionary/writeDynamicDictionary.mjs +26 -5
  203. package/dist/esm/buildIntlayerDictionary/writeDynamicDictionary.mjs.map +1 -1
  204. package/dist/esm/buildIntlayerDictionary/writeFetchDictionary.mjs +43 -6
  205. package/dist/esm/buildIntlayerDictionary/writeFetchDictionary.mjs.map +1 -1
  206. package/dist/esm/buildIntlayerDictionary/writeMergedDictionary.mjs +2 -1
  207. package/dist/esm/buildIntlayerDictionary/writeMergedDictionary.mjs.map +1 -1
  208. package/dist/esm/buildIntlayerDictionary/writeNestedDictionary.mjs +92 -0
  209. package/dist/esm/buildIntlayerDictionary/writeNestedDictionary.mjs.map +1 -0
  210. package/dist/esm/buildIntlayerDictionary/writeRemoteDictionary.mjs +4 -2
  211. package/dist/esm/buildIntlayerDictionary/writeRemoteDictionary.mjs.map +1 -1
  212. package/dist/esm/cleanRemovedContentDeclaration.mjs +7 -4
  213. package/dist/esm/cleanRemovedContentDeclaration.mjs.map +1 -1
  214. package/dist/esm/createDictionaryEntryPoint/createDictionaryEntryPoint.mjs +5 -3
  215. package/dist/esm/createDictionaryEntryPoint/createDictionaryEntryPoint.mjs.map +1 -1
  216. package/dist/esm/createType/createModuleAugmentation.mjs +2 -1
  217. package/dist/esm/createType/createModuleAugmentation.mjs.map +1 -1
  218. package/dist/esm/docReview/alignBlocks.mjs +1 -1
  219. package/dist/esm/docReview/alignBlocks.mjs.map +1 -1
  220. package/dist/esm/docReview/reviewReport.mjs +2 -1
  221. package/dist/esm/docReview/reviewReport.mjs.map +1 -1
  222. package/dist/esm/fetchDistantDictionaries.mjs +107 -13
  223. package/dist/esm/fetchDistantDictionaries.mjs.map +1 -1
  224. package/dist/esm/handleAdditionalContentDeclarationFile.mjs +4 -2
  225. package/dist/esm/handleAdditionalContentDeclarationFile.mjs.map +1 -1
  226. package/dist/esm/handleContentDeclarationFileChange.mjs +6 -2
  227. package/dist/esm/handleContentDeclarationFileChange.mjs.map +1 -1
  228. package/dist/esm/handleUnlinkedContentDeclarationFile.mjs +4 -2
  229. package/dist/esm/handleUnlinkedContentDeclarationFile.mjs.map +1 -1
  230. package/dist/esm/init/frameworkSetup/nextAppRouter/index.mjs +1 -3
  231. package/dist/esm/init/frameworkSetup/nextAppRouter/index.mjs.map +1 -1
  232. package/dist/esm/init/frameworkSetup/nextAppRouter/restructure.mjs +2 -1
  233. package/dist/esm/init/frameworkSetup/nextAppRouter/restructure.mjs.map +1 -1
  234. package/dist/esm/init/frameworkSetup/tanstackStart/index.mjs +4 -6
  235. package/dist/esm/init/frameworkSetup/tanstackStart/index.mjs.map +1 -1
  236. package/dist/esm/init/frameworkSetup/tanstackStart/restructure.mjs +2 -1
  237. package/dist/esm/init/frameworkSetup/tanstackStart/restructure.mjs.map +1 -1
  238. package/dist/esm/init/frameworkSetup/tanstackStart/templates.mjs +17 -10
  239. package/dist/esm/init/frameworkSetup/tanstackStart/templates.mjs.map +1 -1
  240. package/dist/esm/init/frameworkSetup/tanstackStart/transforms.mjs +59 -16
  241. package/dist/esm/init/frameworkSetup/tanstackStart/transforms.mjs.map +1 -1
  242. package/dist/esm/init/index.mjs +66 -38
  243. package/dist/esm/init/index.mjs.map +1 -1
  244. package/dist/esm/init/utils/configManipulation.mjs.map +1 -1
  245. package/dist/esm/init/utils/fileSystem.mjs +3 -1
  246. package/dist/esm/init/utils/fileSystem.mjs.map +1 -1
  247. package/dist/esm/init/utils/packageManager.mjs +4 -2
  248. package/dist/esm/init/utils/packageManager.mjs.map +1 -1
  249. package/dist/esm/initConfig/index.mjs +12 -8
  250. package/dist/esm/initConfig/index.mjs.map +1 -1
  251. package/dist/esm/listDictionariesPath.mjs +6 -5
  252. package/dist/esm/listDictionariesPath.mjs.map +1 -1
  253. package/dist/esm/listProjects.mjs +2 -1
  254. package/dist/esm/listProjects.mjs.map +1 -1
  255. package/dist/esm/loadDictionaries/getIntlayerBundle.mjs +2 -1
  256. package/dist/esm/loadDictionaries/getIntlayerBundle.mjs.map +1 -1
  257. package/dist/esm/loadDictionaries/loadContentDeclaration.mjs +8 -5
  258. package/dist/esm/loadDictionaries/loadContentDeclaration.mjs.map +1 -1
  259. package/dist/esm/loadDictionaries/loadDictionaries.mjs +4 -2
  260. package/dist/esm/loadDictionaries/loadDictionaries.mjs.map +1 -1
  261. package/dist/esm/loadDictionaries/loadRemoteDictionaries.mjs +3 -2
  262. package/dist/esm/loadDictionaries/loadRemoteDictionaries.mjs.map +1 -1
  263. package/dist/esm/loadDictionaries/loadYamlContentDeclaration.mjs +2 -1
  264. package/dist/esm/loadDictionaries/loadYamlContentDeclaration.mjs.map +1 -1
  265. package/dist/esm/loadDictionaries/log.mjs +38 -11
  266. package/dist/esm/loadDictionaries/log.mjs.map +1 -1
  267. package/dist/esm/logConfigDetails.mjs +4 -3
  268. package/dist/esm/logConfigDetails.mjs.map +1 -1
  269. package/dist/esm/prepareIntlayer.mjs +5 -3
  270. package/dist/esm/prepareIntlayer.mjs.map +1 -1
  271. package/dist/esm/reduceDictionaryContent/reduceDictionaryContent.mjs +2 -1
  272. package/dist/esm/reduceDictionaryContent/reduceDictionaryContent.mjs.map +1 -1
  273. package/dist/esm/scan/checks.mjs +1 -1
  274. package/dist/esm/scan/checks.mjs.map +1 -1
  275. package/dist/esm/syncPluginKit/createFileAdapter.mjs +2 -1
  276. package/dist/esm/syncPluginKit/createFileAdapter.mjs.map +1 -1
  277. package/dist/esm/syncPluginKit/createSyncPlugin.mjs +4 -1
  278. package/dist/esm/syncPluginKit/createSyncPlugin.mjs.map +1 -1
  279. package/dist/esm/utils/babelParser.mjs.map +1 -1
  280. package/dist/esm/utils/chunkArray.mjs +22 -0
  281. package/dist/esm/utils/chunkArray.mjs.map +1 -0
  282. package/dist/esm/utils/getContentExtension.mjs +1 -3
  283. package/dist/esm/utils/getContentExtension.mjs.map +1 -1
  284. package/dist/esm/utils/index.mjs +2 -1
  285. package/dist/esm/utils/resolveRelativePath.mjs +4 -1
  286. package/dist/esm/utils/resolveRelativePath.mjs.map +1 -1
  287. package/dist/esm/utils/runOnce.mjs +2 -2
  288. package/dist/esm/utils/runOnce.mjs.map +1 -1
  289. package/dist/esm/watcher.mjs +4 -2
  290. package/dist/esm/watcher.mjs.map +1 -1
  291. package/dist/esm/writeConfiguration/index.mjs +2 -1
  292. package/dist/esm/writeConfiguration/index.mjs.map +1 -1
  293. package/dist/esm/writeContentDeclaration/transformJSFile.mjs +173 -109
  294. package/dist/esm/writeContentDeclaration/transformJSFile.mjs.map +1 -1
  295. package/dist/esm/writeContentDeclaration/transformJSONFile.mjs +6 -5
  296. package/dist/esm/writeContentDeclaration/transformJSONFile.mjs.map +1 -1
  297. package/dist/esm/writeContentDeclaration/writeContentDeclaration.mjs +9 -3
  298. package/dist/esm/writeContentDeclaration/writeContentDeclaration.mjs.map +1 -1
  299. package/dist/esm/writeContentDeclaration/writeJSFile.mjs +2 -1
  300. package/dist/esm/writeContentDeclaration/writeJSFile.mjs.map +1 -1
  301. package/dist/esm/writeContentDeclaration/writeMarkdownFile.mjs +2 -1
  302. package/dist/esm/writeContentDeclaration/writeMarkdownFile.mjs.map +1 -1
  303. package/dist/esm/writeContentDeclaration/writeYamlFile.mjs +4 -2
  304. package/dist/esm/writeContentDeclaration/writeYamlFile.mjs.map +1 -1
  305. package/dist/types/buildIntlayerDictionary/buildIntlayerDictionary.d.ts.map +1 -1
  306. package/dist/types/buildIntlayerDictionary/writeDynamicDictionary.d.ts +14 -2
  307. package/dist/types/buildIntlayerDictionary/writeDynamicDictionary.d.ts.map +1 -1
  308. package/dist/types/buildIntlayerDictionary/writeFetchDictionary.d.ts +16 -2
  309. package/dist/types/buildIntlayerDictionary/writeFetchDictionary.d.ts.map +1 -1
  310. package/dist/types/buildIntlayerDictionary/writeNestedDictionary.d.ts +54 -0
  311. package/dist/types/buildIntlayerDictionary/writeNestedDictionary.d.ts.map +1 -0
  312. package/dist/types/fetchDistantDictionaries.d.ts +26 -0
  313. package/dist/types/fetchDistantDictionaries.d.ts.map +1 -1
  314. package/dist/types/formatDictionary.d.ts +2 -0
  315. package/dist/types/formatDictionary.d.ts.map +1 -1
  316. package/dist/types/init/frameworkSetup/tanstackStart/templates.d.ts +9 -4
  317. package/dist/types/init/frameworkSetup/tanstackStart/templates.d.ts.map +1 -1
  318. package/dist/types/init/frameworkSetup/tanstackStart/transforms.d.ts +6 -2
  319. package/dist/types/init/frameworkSetup/tanstackStart/transforms.d.ts.map +1 -1
  320. package/dist/types/loadDictionaries/log.d.ts +16 -1
  321. package/dist/types/loadDictionaries/log.d.ts.map +1 -1
  322. package/dist/types/utils/chunkArray.d.ts +16 -0
  323. package/dist/types/utils/chunkArray.d.ts.map +1 -0
  324. package/dist/types/utils/index.d.ts +2 -1
  325. package/dist/types/writeContentDeclaration/transformJSFile.d.ts.map +1 -1
  326. package/package.json +11 -11
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["ANSIColors","exists","x","readFileFromRoot","detectPackageManager","detectLinguiCatalogPattern","detectMissingIntlayerPackages","v","detectOutdatedIntlayerPackages","writeFileToRoot","resolveGithubWorkflowsContext","getGithubWorkflows","ensureDirectory","parseJSONWithComments","findTsConfigFiles","detectJsonLocalePattern","initConfig","setCompilerOutputInConfig","detectNextIntlMessagesPattern","updateIntlayerConfigWithSyncPlugin","setRoutingModeInConfig","replaceViteConfigPluginImportSource","updateViteConfigForCompatPlugin","hasIntlayerVitePlugin","updateViteConfig","updateNextConfigForNextI18next","updateNextConfigForNextIntl","updateNextConfigForNextTranslate","updateNextConfig","setupNextCompilerBabelConfig","updateAstroConfig","updateNuxtConfigForNuxtjsI18n","updateNuxtConfig","updateMetroConfig","getMetroConfigTemplate","isVersionAtLeast","setupFramework"],"sources":["../../../src/init/index.ts"],"sourcesContent":["import { join } from 'node:path';\nimport * as ANSIColors from '@intlayer/config/colors';\nimport { colorize, colorizePath, logger, v, x } from '@intlayer/config/logger';\nimport { getConfiguration } from '@intlayer/config/node';\nimport { getAlias } from '@intlayer/config/utils';\nimport { initConfig } from '../initConfig';\nimport { setCompilerOutputInConfig, setRoutingModeInConfig } from './cms';\nimport { setupFramework } from './frameworkSetup';\nimport type { CompatSyncConfig, RoutingMode } from './utils';\nimport {\n detectJsonLocalePattern,\n detectLinguiCatalogPattern,\n detectMissingIntlayerPackages,\n detectNextIntlMessagesPattern,\n detectOutdatedIntlayerPackages,\n detectPackageManager,\n ensureDirectory,\n exists,\n findTsConfigFiles,\n getGithubWorkflows,\n getMetroConfigTemplate,\n hasIntlayerVitePlugin,\n installPackages,\n isVersionAtLeast,\n parseJSONWithComments,\n readFileFromRoot,\n replaceViteConfigPluginImportSource,\n resolveGithubWorkflowsContext,\n setupNextCompilerBabelConfig,\n updateAstroConfig,\n updateIntlayerConfigWithSyncPlugin,\n updateMetroConfig,\n updateNextConfig,\n updateNextConfigForNextI18next,\n updateNextConfigForNextIntl,\n updateNextConfigForNextTranslate,\n updateNuxtConfig,\n updateNuxtConfigForNuxtjsI18n,\n updateViteConfig,\n updateViteConfigForCompatPlugin,\n upgradePackages,\n writeFileToRoot,\n} from './utils';\n\n/**\n * Documentation URL Constants\n */\nconst DocumentationRouter = {\n NextJS: 'https://intlayer.org/doc/environment/nextjs.md',\n NextJS_15: 'https://intlayer.org/doc/environment/nextjs/15.md',\n NextJS_14: 'https://intlayer.org/doc/environment/nextjs/14.md',\n CRA: 'https://intlayer.org/doc/environment/create-react-app.md',\n Astro: 'https://intlayer.org/doc/environment/astro.md',\n ViteAndReact: 'https://intlayer.org/doc/environment/vite-and-react.md',\n ViteAndReact_ReactRouterV7:\n 'https://intlayer.org/doc/environment/vite-and-react/react-router-v7.md',\n ViteAndReact_ReactRouterV7_FSRoutes:\n 'https://intlayer.org/doc/environment/vite-and-react/react-router-v7-fs-routes.md',\n ViteAndVue: 'https://intlayer.org/doc/environment/vite-and-vue.md',\n ViteAndSolid: 'https://intlayer.org/doc/environment/vite-and-solid.md',\n ViteAndSvelte: 'https://intlayer.org/doc/environment/vite-and-svelte.md',\n ViteAndPreact: 'https://intlayer.org/doc/environment/vite-and-preact.md',\n TanStackRouter: 'https://intlayer.org/doc/environment/tanstack.md',\n NuxtAndVue: 'https://intlayer.org/doc/environment/nuxt-and-vue.md',\n Angular: 'https://intlayer.org/doc/environment/angular.md',\n SvelteKit: 'https://intlayer.org/doc/environment/sveltekit.md',\n ReactNativeAndExpo:\n 'https://intlayer.org/doc/environment/react-native-and-expo.md',\n Lynx: 'https://intlayer.org/doc/environment/lynx-and-react.md',\n Express: 'https://intlayer.org/doc/environment/express.md',\n NestJS: 'https://intlayer.org/doc/environment/nestjs.md',\n Fastify: 'https://intlayer.org/doc/environment/fastify.md',\n Default: 'https://intlayer.org/doc/get-started',\n\n // Intlayer Language Server (Go-to-Definition from getter keys to .content files)\n LSP: 'https://intlayer.org/doc/lsp.md',\n\n // Check for competitors libs\n NextIntl: 'https://intlayer.org/blog/intlayer-with-next-intl.md',\n ReactI18Next: 'https://intlayer.org/blog/intlayer-with-react-i18next.md',\n ReactIntl: 'https://intlayer.org/blog/intlayer-with-react-intl.md',\n NextI18Next: 'https://intlayer.org/blog/intlayer-with-next-i18next.md',\n VueI18n: 'https://intlayer.org/blog/intlayer-with-vue-i18n.md',\n};\n\n/**\n * Helper: Detects the environment and returns the doc URL\n */\nconst getDocumentationUrl = (packageJson: any): string => {\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n /**\n * Helper to check if a version string matches a specific major version\n * Matches: \"15\", \"^15.0.0\", \"~15.2\", \"15.0.0-beta\"\n */\n const isVersion = (versionString: string, major: number): boolean => {\n if (!versionString || typeof versionString !== 'string') return false;\n const regex = new RegExp(`^[\\\\^~]?${major}(?:\\\\.|$)`);\n return regex.test(versionString);\n };\n\n // Mobile / Cross-platform\n if (deps['@lynx-js/react'] || deps['@lynx-js/core']) {\n return DocumentationRouter.Lynx;\n }\n if (deps['react-native'] || deps.expo) {\n return DocumentationRouter.ReactNativeAndExpo;\n }\n\n // Meta-frameworks (Next, Nuxt, Astro, SvelteKit)\n if (deps.next) {\n const version = deps.next;\n\n if (isVersion(version, 14)) {\n return DocumentationRouter.NextJS_14;\n }\n\n if (isVersion(version, 15)) {\n return DocumentationRouter.NextJS_15;\n }\n\n return DocumentationRouter.NextJS;\n }\n\n if (deps.nuxt) return DocumentationRouter.NuxtAndVue;\n if (deps.astro) return DocumentationRouter.Astro;\n if (deps['@sveltejs/kit']) return DocumentationRouter.SvelteKit;\n\n // Routers (TanStack & React Router v7)\n if (deps['@tanstack/react-router']) {\n return DocumentationRouter.TanStackRouter;\n }\n\n // Check for React Router v7\n const reactRouterVersion = deps['react-router'];\n if (reactRouterVersion && typeof reactRouterVersion === 'string') {\n // Distinguish between standard v7 and v7 with FS routes\n if (deps['@react-router/fs-routes']) {\n return DocumentationRouter.ViteAndReact_ReactRouterV7_FSRoutes;\n }\n\n // Use Regex to ensure it is v7\n if (isVersion(reactRouterVersion, 7)) {\n return DocumentationRouter.ViteAndReact_ReactRouterV7;\n }\n }\n\n // Vite Ecosystem (General)\n if (deps.vite) {\n if (deps.vue) return DocumentationRouter.ViteAndVue;\n if (deps['solid-js']) return DocumentationRouter.ViteAndSolid;\n if (deps.svelte) return DocumentationRouter.ViteAndSvelte;\n if (deps.preact) return DocumentationRouter.ViteAndPreact;\n\n // Default to React if Vite is present but specific other frameworks aren't found\n return DocumentationRouter.ViteAndReact;\n }\n\n // Other Web Frameworks\n if (deps['react-scripts']) return DocumentationRouter.CRA;\n if (deps['@angular/core']) return DocumentationRouter.Angular;\n\n // Backend\n if (deps['@nestjs/core']) return DocumentationRouter.NestJS;\n if (deps.express) return DocumentationRouter.Express;\n if (deps.fastify) return DocumentationRouter.Fastify;\n\n // Competitor Libs (Migration Guides)\n // We check these last as specific environment setup is usually higher priority,\n // but if no specific framework logic matched (or as a fallback), we guide to migration.\n if (deps['next-intl']) return DocumentationRouter.NextIntl;\n if (deps['react-i18next'] || deps.i18next)\n return DocumentationRouter.ReactI18Next;\n if (deps['react-intl']) return DocumentationRouter.ReactIntl;\n if (deps['next-i18next']) return DocumentationRouter.NextI18Next;\n if (deps['vue-i18n']) return DocumentationRouter.VueI18n;\n\n return DocumentationRouter.Default;\n};\n\n/**\n * Resolves the default dev-server URL of the detected framework, used as the\n * `editor.applicationURL` of the generated configuration file. Frameworks that\n * embed Vite (Astro, SvelteKit, …) are checked before the bare Vite fallback so\n * their own dev port wins.\n */\nexport const getDefaultApplicationURL = (\n dependencies: Record<string, string>\n): string => {\n if (dependencies.next) return 'http://localhost:3000';\n if (dependencies.astro) return 'http://localhost:4321';\n if (dependencies['@angular/core']) return 'http://localhost:4200';\n if (dependencies.nuxt) return 'http://localhost:3000';\n if (dependencies['@sveltejs/kit']) return 'http://localhost:5173';\n if (dependencies['react-scripts']) return 'http://localhost:3000';\n if (dependencies.vite) return 'http://localhost:5173';\n\n return 'http://localhost:3000';\n};\n\n/**\n * How the interactive init organizes autogenerated content (compiler output /\n * autofill):\n * - `per-component` — multilingual `.content` files co-located with components\n * (the configuration template default).\n * - `centralized` — per-locale JSON dictionaries under `/locales/{locale}/`.\n * - `json-namespaces` — plain per-locale JSON namespace files kept in sync\n * through `@intlayer/sync-json-plugin`.\n */\nexport type ContentStrategy =\n | 'per-component'\n | 'centralized'\n | 'json-namespaces';\n\n/**\n * OPTIONS\n */\nexport type InitOptions = {\n noGitignore?: boolean;\n /** Skip scaffolding the `fill` and `test` GitHub Actions workflows. */\n noGithubActions?: boolean;\n /**\n * Skip installing missing Intlayer dependencies and upgrading outdated ones.\n */\n noInstallPackages?: boolean;\n /** Skip adding the Intlayer extension to `.vscode/extensions.json`. */\n noVscodeExtension?: boolean;\n /** Skip writing the Intlayer LSP configuration to `.vscode/settings.json`. */\n noLsp?: boolean;\n /**\n * Skip framework-specific scaffolding (middleware/proxy, providers in\n * layout/page, example content). Defaults to enabled.\n */\n noFrameworkSetup?: boolean;\n /**\n * Version that outdated Intlayer packages should be upgraded to (typically the\n * running CLI version). When omitted, installed packages are left untouched and\n * only missing ones are installed.\n */\n upgradeToVersion?: string;\n /**\n * Locale routing strategy to write to `routing.mode` in the generated/existing\n * Intlayer configuration file. When omitted, the configuration default\n * (`prefix-no-default`) is kept.\n */\n routingMode?: RoutingMode;\n /**\n * Extra packages hinted by the interactive init prompt (compat i18n library\n * selections made before those libraries are actually installed). These are\n * merged into the dependency map used by {@link detectMissingIntlayerPackages}\n * so the correct sync plugin and compat adapter are always scheduled.\n */\n hintDependencies?: Record<string, string>;\n /**\n * Content organization strategy chosen by the interactive init prompt. Drives\n * the `compiler.output` template (`centralized`) or the injection of the\n * syncJSON plugin (`json-namespaces`). When omitted (or `per-component`), the\n * configuration template default is kept.\n */\n contentStrategy?: ContentStrategy;\n};\n\n/**\n * MAIN LOGIC\n */\nexport const initIntlayer = async (rootDir: string, options?: InitOptions) => {\n logger(colorize('Checking Intlayer configuration...', ANSIColors.CYAN));\n\n // READ PACKAGE.JSON\n const packageJsonPath = 'package.json';\n if (!(await exists(rootDir, packageJsonPath))) {\n logger(\n `${x} No ${colorizePath('package.json')} found. Please run this script from the project root.`,\n { level: 'error' }\n );\n process.exit(1);\n }\n\n const packageJsonContent = await readFileFromRoot(rootDir, packageJsonPath);\n let packageJson: Record<string, any>;\n try {\n packageJson = JSON.parse(packageJsonContent);\n } catch {\n logger(`${x} Could not parse ${colorizePath('package.json')}.`, {\n level: 'error',\n });\n process.exit(1);\n }\n\n // Determine the correct documentation URL based on dependencies\n const guideUrl = getDocumentationUrl(packageJson);\n\n const allDeps: Record<string, string> = {\n ...(packageJson.dependencies ?? {}),\n ...(packageJson.devDependencies ?? {}),\n };\n\n // Effective deps = real deps + interactive hint-deps (compat library selections\n // from the interactive init prompt that haven't been installed yet).\n const effectiveAllDeps: Record<string, string> = {\n ...allDeps,\n ...(options?.hintDependencies ?? {}),\n };\n\n // INSTALL MISSING INTLAYER DEPENDENCIES\n const packageManager = detectPackageManager(rootDir);\n\n // lingui keeps its catalogs as `.po` (default) or `.json`. Detect which so the\n // matching sync plugin (`syncPO` / `syncJSON`) + dev dependency are chosen.\n // Also respect the `__lingui_json__` sentinel injected by the interactive init\n // prompt when the user explicitly selected \"Lingui (.json catalogs)\".\n const linguiPresent = Boolean(\n effectiveAllDeps['@lingui/core'] ||\n effectiveAllDeps['@lingui/react'] ||\n effectiveAllDeps['@intlayer/lingui']\n );\n\n // Determine format: prefer filesystem scan, then the interactive sentinel.\n const linguiCatalog = linguiPresent\n ? await detectLinguiCatalogPattern(rootDir)\n : null;\n\n const hintLinguiJson = Boolean(\n options?.hintDependencies?.['__lingui_json__']\n );\n // `linguiCatalogFormat` resolution:\n // 1. Filesystem scan result (authoritative when catalogs already exist)\n // 2. Interactive sentinel `__lingui_json__` → 'json'\n // 3. Fallback: 'po' (lingui's default) when lingui is selected but no\n // catalogs have been generated yet and no sentinel was injected.\n const linguiCatalogFormat: 'po' | 'json' | null =\n linguiCatalog?.format ??\n (linguiPresent ? (hintLinguiJson ? 'json' : 'po') : null);\n\n const {\n packagesToInstall,\n devPackagesToInstall,\n compatSyncConfig,\n compatVitePluginConfig,\n } = detectMissingIntlayerPackages(effectiveAllDeps, {\n linguiCatalogFormat,\n });\n\n // The `json-namespaces` content strategy uses the same syncJSON pipeline as\n // the compat libraries: plain per-locale JSON namespace files synced through\n // `@intlayer/sync-json-plugin`. A detected compat library keeps precedence —\n // its own catalog format/template is authoritative.\n const wantsJsonNamespaces =\n options?.contentStrategy === 'json-namespaces' && !compatSyncConfig;\n\n if (\n wantsJsonNamespaces &&\n !effectiveAllDeps['@intlayer/sync-json-plugin'] &&\n !devPackagesToInstall.includes('@intlayer/sync-json-plugin')\n ) {\n devPackagesToInstall.push('@intlayer/sync-json-plugin');\n }\n\n if (!options?.noInstallPackages) {\n const withVersion = (packages: string[]): string[] =>\n options?.upgradeToVersion\n ? packages.map((pkg) => `${pkg}@${options.upgradeToVersion}`)\n : packages;\n\n if (packagesToInstall.length > 0) {\n logger(\n colorize('Installing missing Intlayer dependencies...', ANSIColors.CYAN)\n );\n try {\n installPackages(\n rootDir,\n withVersion(packagesToInstall),\n packageManager\n );\n logger(\n `${v} Installed: ${packagesToInstall.map((pkg) => colorize(pkg, ANSIColors.MAGENTA)).join(', ')}`\n );\n } catch {\n logger(\n `${x} Failed to install packages. Please install manually: ${packagesToInstall.join(' ')}`,\n { level: 'warn' }\n );\n }\n }\n\n if (devPackagesToInstall.length > 0) {\n logger(\n colorize(\n 'Installing missing Intlayer dev dependencies...',\n ANSIColors.CYAN\n )\n );\n try {\n installPackages(\n rootDir,\n withVersion(devPackagesToInstall),\n packageManager,\n true\n );\n logger(\n `${v} Installed: ${devPackagesToInstall.map((pkg) => colorize(pkg, ANSIColors.MAGENTA)).join(', ')}`\n );\n } catch {\n logger(\n `${x} Failed to install dev packages. Please install manually: ${devPackagesToInstall.join(' ')}`,\n { level: 'warn' }\n );\n }\n }\n\n // UPGRADE OUTDATED INTLAYER DEPENDENCIES\n // Only runs when a target version is provided (typically the running CLI\n // version). Already up-to-date packages are skipped. Prod and dev\n // dependencies are upgraded separately so their dependency type is kept.\n if (options?.upgradeToVersion) {\n const outdatedDependencies = detectOutdatedIntlayerPackages(\n rootDir,\n packageJson.dependencies ?? {},\n options.upgradeToVersion\n );\n const outdatedDevDependencies = detectOutdatedIntlayerPackages(\n rootDir,\n packageJson.devDependencies ?? {},\n options.upgradeToVersion\n );\n\n const allOutdated = [...outdatedDependencies, ...outdatedDevDependencies];\n\n if (allOutdated.length > 0) {\n logger(\n colorize(\n `Upgrading outdated Intlayer dependencies to ${options.upgradeToVersion}...`,\n ANSIColors.CYAN\n )\n );\n try {\n upgradePackages(\n rootDir,\n outdatedDependencies,\n packageManager,\n options.upgradeToVersion\n );\n upgradePackages(\n rootDir,\n outdatedDevDependencies,\n packageManager,\n options.upgradeToVersion,\n true\n );\n logger(\n `${v} Upgraded: ${allOutdated.map((pkg) => colorize(pkg, ANSIColors.MAGENTA)).join(', ')}`\n );\n } catch {\n logger(\n `${x} Failed to upgrade packages. Please upgrade manually: ${allOutdated.join(' ')}`,\n { level: 'warn' }\n );\n }\n } else {\n logger(`${v} Intlayer dependencies are up to date`);\n }\n }\n }\n\n // CHECK .GITIGNORE\n const gitignorePath = '.gitignore';\n if (!options?.noGitignore && (await exists(rootDir, gitignorePath))) {\n const gitignoreContent = await readFileFromRoot(rootDir, gitignorePath);\n\n if (!gitignoreContent.includes('intlayer')) {\n const newContent = `${gitignoreContent}\\n# Intlayer\\n.intlayer\\n`;\n await writeFileToRoot(rootDir, gitignorePath, newContent);\n logger(\n `${v} Added ${colorizePath('.intlayer')} to ${colorizePath(gitignorePath)}`\n );\n } else {\n logger(`${v} ${colorizePath(gitignorePath)} already includes .intlayer`);\n }\n }\n\n // SCAFFOLD GITHUB ACTIONS WORKFLOWS (fill + test)\n // Generate two workflows whose commands match the detected package manager:\n // - intlayer-fill.yml: auto-fills missing translations on pull requests\n // - intlayer-test.yml: fails the PR when required locales are missing\n // GitHub only triggers workflows stored at the repository root, so in a\n // monorepo the files are written to the git root and the commands go through\n // `intlayer ci`, which iterates over every Intlayer project of the\n // repository (see resolveGithubWorkflowsContext).\n if (!options?.noGithubActions) {\n const workflowsContext = await resolveGithubWorkflowsContext(\n rootDir,\n packageManager\n );\n const workflows = getGithubWorkflows(\n workflowsContext.packageManager,\n workflowsContext.options\n );\n\n for (const workflow of workflows) {\n if (await exists(workflowsContext.workflowsRootDir, workflow.filePath)) {\n logger(`${v} ${colorizePath(workflow.filePath)} already exists`);\n continue;\n }\n\n try {\n await ensureDirectory(\n workflowsContext.workflowsRootDir,\n join('.github', 'workflows')\n );\n await writeFileToRoot(\n workflowsContext.workflowsRootDir,\n workflow.filePath,\n workflow.content\n );\n logger(\n `${v} Added GitHub Actions workflow ${colorizePath(workflow.filePath)}`\n );\n } catch {\n logger(\n `${x} Could not create ${colorizePath(workflow.filePath)}. You may need to add it manually.`,\n { level: 'warn' }\n );\n }\n }\n }\n\n // CHECK VS CODE EXTENSION RECOMMENDATIONS\n const vscodeDir = '.vscode';\n const extensionsJsonPath = join(vscodeDir, 'extensions.json');\n const extensionId = 'intlayer.intlayer-vs-code-extension';\n\n if (!options?.noVscodeExtension) {\n try {\n let extensionsConfig: { recommendations: string[] } = {\n recommendations: [],\n };\n\n if (await exists(rootDir, extensionsJsonPath)) {\n const content = await readFileFromRoot(rootDir, extensionsJsonPath);\n extensionsConfig = parseJSONWithComments(content);\n } else {\n await ensureDirectory(rootDir, vscodeDir);\n }\n\n if (!extensionsConfig.recommendations) {\n extensionsConfig.recommendations = [];\n }\n\n if (!extensionsConfig.recommendations.includes(extensionId)) {\n extensionsConfig.recommendations.push(extensionId);\n await writeFileToRoot(\n rootDir,\n extensionsJsonPath,\n JSON.stringify(extensionsConfig, null, 2)\n );\n logger(\n `${v} Added ${colorize(extensionId, ANSIColors.MAGENTA)} to ${colorizePath(extensionsJsonPath)}`\n );\n } else {\n logger(\n `${v} ${colorizePath(extensionsJsonPath)} already includes ${colorize(extensionId, ANSIColors.MAGENTA)}`\n );\n }\n } catch {\n logger(\n `${x} Could not update ${colorizePath(extensionsJsonPath)}. You may need to add ${colorize(extensionId, ANSIColors.MAGENTA)} manually.`,\n { level: 'warn' }\n );\n }\n }\n\n // CHECK VS CODE LSP SETTINGS\n const settingsJsonPath = join(vscodeDir, 'settings.json');\n\n if (!options?.noLsp) {\n try {\n let settingsConfig: Record<string, unknown> = {};\n\n if (await exists(rootDir, settingsJsonPath)) {\n const content = await readFileFromRoot(rootDir, settingsJsonPath);\n settingsConfig = parseJSONWithComments(content);\n } else {\n await ensureDirectory(rootDir, vscodeDir);\n }\n\n let settingsUpdated = false;\n\n if (!settingsConfig['intlayer.languageServer.command']) {\n settingsConfig['intlayer.languageServer.command'] = 'npx';\n settingsUpdated = true;\n }\n\n if (!settingsConfig['intlayer.languageServer.args']) {\n settingsConfig['intlayer.languageServer.args'] = ['@intlayer/lsp'];\n settingsUpdated = true;\n }\n\n if (settingsUpdated) {\n await writeFileToRoot(\n rootDir,\n settingsJsonPath,\n JSON.stringify(settingsConfig, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(settingsJsonPath)} with LSP configuration`\n );\n } else {\n logger(\n `${v} ${colorizePath(settingsJsonPath)} already includes LSP configuration`\n );\n }\n } catch {\n logger(\n `${x} Could not update ${colorizePath(settingsJsonPath)}. You may need to add the LSP settings manually.`,\n { level: 'warn' }\n );\n }\n }\n\n // CHECK TSCONFIGS\n const tsConfigFiles = await findTsConfigFiles(rootDir);\n let hasTsConfig = false;\n\n for (const fileName of tsConfigFiles) {\n if (await exists(rootDir, fileName)) {\n hasTsConfig = true;\n try {\n const fileContent = await readFileFromRoot(rootDir, fileName);\n const config = parseJSONWithComments(fileContent);\n const typeDefinition = './.intlayer/**/*.ts';\n\n let updated = false;\n\n if (!config.include) {\n // Skip if no include array (solution-style)\n } else if (\n Array.isArray(config.include) &&\n !(config.include as string[]).some((pattern: string) =>\n pattern.includes('.intlayer')\n )\n ) {\n config.include.push(typeDefinition);\n updated = true;\n } else if (config.include.includes(typeDefinition)) {\n logger(\n `${v} ${colorizePath(fileName)} already includes intlayer types`\n );\n }\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n fileName,\n JSON.stringify(config, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(fileName)} to include intlayer types`\n );\n }\n } catch {\n logger(\n `${x} Could not parse or update ${colorizePath(fileName)}. You may need to add ${colorizePath('.intlayer/types/**/*.ts')} manually.`,\n { level: 'warn' }\n );\n }\n }\n }\n\n // INITIALIZE CONFIG FILE\n const format = hasTsConfig ? 'intlayer.config.ts' : 'intlayer.config.mjs';\n\n // Detect the locale JSON file pattern already in the project so we can\n // insert the matching locales into the config and produce the most\n // accurate source template for compat libraries.\n const detectedPattern = await detectJsonLocalePattern(rootDir);\n\n await initConfig(format, rootDir, {\n locales: detectedPattern?.locales,\n applicationURL: getDefaultApplicationURL(allDeps),\n });\n\n // APPLY CONTENT STRATEGY — CENTRALIZED\n // Point `compiler.output` at per-locale JSON dictionaries under `/locales/`\n // instead of the per-component template default.\n if (options?.contentStrategy === 'centralized') {\n await setCompilerOutputInConfig(\n rootDir,\n '/locales/{{locale}}/{{key}}.content.json'\n );\n }\n\n // INJECT SYNC-JSON PLUGIN FOR COMPAT LIBRARIES / JSON-NAMESPACES STRATEGY\n const syncConfigToInject: CompatSyncConfig | undefined =\n compatSyncConfig ??\n (wantsJsonNamespaces\n ? {\n format: 'i18next',\n sourceTemplate:\n detectedPattern?.template ?? './locales/${locale}/${key}.json',\n }\n : undefined);\n\n if (syncConfigToInject) {\n // For next-intl / use-intl, the messages path is authoritatively declared\n // in `i18n/request.ts` (e.g. `import(`../messages/${locale}.json`)`), so we\n // read it directly. It usually resolves to a single file per locale (no\n // `${key}` segment), whose first-level keys are namespaces — so the compat\n // config carries `splitKeys: true` to emit one dictionary per namespace.\n // Falls back to file-system globbing otherwise.\n const nextIntlMessagesPattern =\n allDeps['next-intl'] ||\n allDeps['@intlayer/next-intl'] ||\n allDeps['use-intl'] ||\n allDeps['@intlayer/use-intl']\n ? await detectNextIntlMessagesPattern(rootDir)\n : null;\n\n // lingui authoritatively resolves to `…/{locale}/messages.{po,json}`, where\n // the `messages` filename becomes the dictionary key. Prefer it so a `.po`\n // project gets `syncPO` (the generic JSON glob only sees `.json`).\n const sourceTemplate =\n linguiCatalog?.template ??\n nextIntlMessagesPattern?.template ??\n detectedPattern?.template;\n\n const resolvedSyncConfig = {\n ...syncConfigToInject,\n ...(sourceTemplate ? { sourceTemplate } : {}),\n };\n\n const syncPluginPackage =\n resolvedSyncConfig.plugin === 'po'\n ? '@intlayer/sync-po-plugin'\n : '@intlayer/sync-json-plugin';\n const syncPluginName =\n resolvedSyncConfig.plugin === 'po' ? 'syncPO' : 'syncJSON';\n\n // `splitKeys` only makes sense for a single file holding several namespaces.\n // If the resolved template addresses one namespace per file (`${key}`\n // segment), each file is already a single namespace — drop the flag so\n // syncJSON keeps one dictionary per file.\n if (\n resolvedSyncConfig.splitKeys &&\n resolvedSyncConfig.sourceTemplate.includes('${key}')\n ) {\n resolvedSyncConfig.splitKeys = false;\n }\n\n const intlayerConfigCandidates = [\n 'intlayer.config.ts',\n 'intlayer.config.mjs',\n 'intlayer.config.js',\n 'intlayer.config.cjs',\n ];\n\n for (const configFile of intlayerConfigCandidates) {\n if (await exists(rootDir, configFile)) {\n const configContent = await readFileFromRoot(rootDir, configFile);\n\n if (!configContent.includes(syncPluginPackage)) {\n const extension = configFile.split('.').pop()!;\n const updatedConfigContent = updateIntlayerConfigWithSyncPlugin(\n configContent,\n extension,\n resolvedSyncConfig\n );\n await writeFileToRoot(rootDir, configFile, updatedConfigContent);\n logger(\n `${v} Updated ${colorizePath(configFile)} with ${syncPluginName} compat plugin`\n );\n } else {\n logger(\n `${v} ${colorizePath(configFile)} already includes ${syncPluginName} plugin`\n );\n }\n break;\n }\n }\n }\n\n // APPLY ROUTING MODE\n // When a routing strategy was chosen (interactive init), write it to\n // `routing.mode` in the configuration file. Idempotent and comment-preserving.\n if (options?.routingMode) {\n await setRoutingModeInConfig(rootDir, options.routingMode);\n }\n\n let hasAliasConfiguration = false;\n\n // CHECK VITE CONFIG\n const viteConfigs = ['vite.config.ts', 'vite.config.js', 'vite.config.mjs'];\n\n for (const file of viteConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n const content = await readFileFromRoot(rootDir, file);\n const extension = file.split('.').pop()!;\n\n if (compatVitePluginConfig) {\n const { replacesVitePlugin } = compatVitePluginConfig;\n\n if (content.includes(compatVitePluginConfig.pluginPackageSource)) {\n logger(\n `${v} ${colorizePath(file)} already includes ${compatVitePluginConfig.pluginPackageSource}`\n );\n } else if (\n replacesVitePlugin &&\n content.includes(replacesVitePlugin.fromPackageSource)\n ) {\n // Drop-in replacement: rewrite the original i18n vite plugin's import\n // source, keeping its binding and call site (e.g. lingui).\n const updatedContent = replaceViteConfigPluginImportSource(\n content,\n replacesVitePlugin.importName,\n replacesVitePlugin.fromPackageSource,\n compatVitePluginConfig.pluginPackageSource\n );\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(\n `${v} Updated ${colorizePath(file)} to import ${replacesVitePlugin.importName} from ${compatVitePluginConfig.pluginPackageSource}`\n );\n } else {\n const updatedContent = updateViteConfigForCompatPlugin(\n content,\n extension,\n compatVitePluginConfig\n );\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(\n `${v} Updated ${colorizePath(file)} to include ${compatVitePluginConfig.pluginFunctionName} compat plugin`\n );\n }\n } else if (hasIntlayerVitePlugin(content)) {\n // A compat adapter plugin (e.g. `reactI18nextVitePlugin`) already wraps\n // `intlayer()` internally, so skip adding a redundant standalone plugin.\n logger(\n `${v} ${colorizePath(file)} already includes an Intlayer plugin`\n );\n } else {\n const updatedContent = updateViteConfig(content, extension);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(`${v} Updated ${colorizePath(file)} to include Intlayer plugin`);\n }\n break;\n }\n }\n\n // CHECK NEXT CONFIG\n const nextConfigs = ['next.config.js', 'next.config.mjs', 'next.config.ts'];\n let isNextJsProject = false;\n\n for (const file of nextConfigs) {\n if (await exists(rootDir, file)) {\n isNextJsProject = true;\n hasAliasConfiguration = true;\n const content = await readFileFromRoot(rootDir, file);\n const extension = file.split('.').pop()!;\n\n if (allDeps['next-i18next']) {\n if (!content.includes('@intlayer/next-i18next')) {\n const updatedContent = updateNextConfigForNextI18next(\n content,\n extension\n );\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(\n `${v} Updated ${colorizePath(file)} to include Intlayer next-i18next compat plugin`\n );\n } else {\n logger(\n `${v} ${colorizePath(file)} already includes @intlayer/next-i18next`\n );\n }\n } else if (allDeps['next-intl']) {\n if (!content.includes('@intlayer/next-intl/plugin')) {\n const updatedContent = updateNextConfigForNextIntl(\n content,\n extension\n );\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(\n `${v} Updated ${colorizePath(file)} to include Intlayer next-intl compat plugin`\n );\n } else {\n logger(\n `${v} ${colorizePath(file)} already includes @intlayer/next-intl/plugin`\n );\n }\n } else if (allDeps['next-translate']) {\n if (!content.includes('@intlayer/next-translate')) {\n const updatedContent = updateNextConfigForNextTranslate(\n content,\n extension\n );\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(\n `${v} Updated ${colorizePath(file)} to include Intlayer next-translate compat plugin`\n );\n } else {\n logger(\n `${v} ${colorizePath(file)} already includes @intlayer/next-translate`\n );\n }\n } else if (!content.includes('next-intlayer')) {\n const updatedContent = updateNextConfig(content, extension);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(`${v} Updated ${colorizePath(file)} to include Intlayer plugin`);\n }\n break;\n }\n }\n\n // CHECK NEXT.JS COMPILER (BABEL)\n // When a Next.js project already uses Babel, install @intlayer/babel and print\n // the compiler + build-optimization plugins (extract, purge, minify, optimize)\n // to add. SWC projects need no setup: withIntlayer injects @intlayer/swc.\n if (isNextJsProject) {\n await setupNextCompilerBabelConfig({\n rootDir,\n packageManager,\n allDeps,\n skipInstall: Boolean(options?.noInstallPackages),\n });\n }\n\n // CHECK OTHER FRAMEWORKS CONFIG\n const astroConfigs = [\n 'astro.config.mjs',\n 'astro.config.js',\n 'astro.config.ts',\n 'astro.config.cjs',\n ];\n\n for (const file of astroConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n\n if (file.startsWith('astro.config.')) {\n const content = await readFileFromRoot(rootDir, file);\n\n if (!content.includes('astro-intlayer')) {\n const extension = file.split('.').pop()!;\n const updatedContent = updateAstroConfig(content, extension);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(\n `${v} Updated ${colorizePath(file)} to include Intlayer integration`\n );\n }\n }\n break;\n }\n }\n\n const nuxtConfigs = ['nuxt.config.js', 'nuxt.config.ts'];\n for (const file of nuxtConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n\n const content = await readFileFromRoot(rootDir, file);\n\n if (allDeps['@nuxtjs/i18n']) {\n if (!content.includes('@intlayer/nuxtjs-i18n')) {\n const updatedContent = updateNuxtConfigForNuxtjsI18n(content);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(\n `${v} Updated ${colorizePath(file)} to include @intlayer/nuxtjs-i18n module`\n );\n } else {\n logger(\n `${v} ${colorizePath(file)} already includes @intlayer/nuxtjs-i18n`\n );\n }\n } else if (!content.includes('nuxt-intlayer')) {\n const updatedContent = updateNuxtConfig(content);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(`${v} Updated ${colorizePath(file)} to include Intlayer module`);\n }\n break;\n }\n }\n\n // CHECK METRO CONFIG (React Native / Expo)\n // Metro is the React Native bundler. The Intlayer Metro plugin\n // (`react-native-intlayer/metro`) handles dictionary aliasing and building.\n // When no config exists we scaffold one; when one exists we safely wrap its\n // exported config with `configMetroIntlayerSync`, leaving custom async\n // (IIFE) configs untouched so existing setups are never broken.\n const isReactNativeProject = Boolean(allDeps['react-native'] || allDeps.expo);\n\n if (isReactNativeProject) {\n // Metro resolves Intlayer aliases itself, so skip the alias fallback below.\n hasAliasConfiguration = true;\n\n const metroConfigs = [\n 'metro.config.js',\n 'metro.config.cjs',\n 'metro.config.mjs',\n 'metro.config.ts',\n ];\n\n let metroConfigFile: string | undefined;\n\n for (const file of metroConfigs) {\n if (await exists(rootDir, file)) {\n metroConfigFile = file;\n break;\n }\n }\n\n if (metroConfigFile) {\n const content = await readFileFromRoot(rootDir, metroConfigFile);\n\n if (content.includes('react-native-intlayer')) {\n logger(\n `${v} ${colorizePath(metroConfigFile)} already includes the Intlayer Metro plugin`\n );\n } else {\n const extension = metroConfigFile.split('.').pop()!;\n const updatedContent = updateMetroConfig(content, extension);\n\n if (updatedContent !== content) {\n await writeFileToRoot(rootDir, metroConfigFile, updatedContent);\n logger(\n `${v} Updated ${colorizePath(metroConfigFile)} to include the Intlayer Metro plugin`\n );\n } else {\n logger(\n `${x} Could not automatically update ${colorizePath(metroConfigFile)}. Wrap your exported config with ${colorize('configMetroIntlayer', ANSIColors.MAGENTA)}: ${colorizePath(DocumentationRouter.ReactNativeAndExpo)}`,\n { level: 'warn' }\n );\n }\n }\n } else {\n const newMetroConfigFile = 'metro.config.js';\n await writeFileToRoot(\n rootDir,\n newMetroConfigFile,\n getMetroConfigTemplate(Boolean(allDeps.expo))\n );\n logger(\n `${v} Created ${colorizePath(newMetroConfigFile)} with the Intlayer Metro plugin`\n );\n }\n }\n\n // UPDATE PACKAGE.JSON DEV SCRIPT\n // Next.js >= 16 uses a bun-specific wrapper; backend frameworks wrap whatever\n // the existing dev script is. Both use `intlayer watch --with`.\n const backendIntlayerPackages = [\n 'express-intlayer',\n 'fastify-intlayer',\n 'adonis-intlayer',\n 'hono-intlayer',\n ];\n\n const devScript = packageJson.scripts?.dev;\n\n let newDevScript: string | undefined;\n\n if (\n devScript &&\n ((isNextJsProject && allDeps.next && isVersionAtLeast(allDeps.next, 16)) ||\n backendIntlayerPackages.some((pkg) => allDeps[pkg])) &&\n !devScript.includes('intlayer watch')\n ) {\n newDevScript = `intlayer watch --with '${devScript}'`;\n }\n\n if (newDevScript) {\n packageJson.scripts.dev = newDevScript;\n\n await writeFileToRoot(\n rootDir,\n packageJsonPath,\n JSON.stringify(packageJson, null, 2)\n );\n\n logger(\n `${v} Updated ${colorizePath('package.json')} dev script to run intlayer watch`\n );\n }\n\n // CHECK WEBPACK CONFIG\n const webpackConfigs = [\n 'webpack.config.js',\n 'webpack.config.ts',\n 'webpack.config.mjs',\n 'webpack.config.cjs',\n ];\n\n for (const file of webpackConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n logger(\n `${v} Found ${colorizePath(\n file\n )}. Make sure to configure aliases manually or use the Intlayer Webpack plugin.`\n );\n break;\n }\n }\n\n const backendConfigPackages = [\n 'express',\n 'fastify',\n '@adonisjs/core',\n 'hono',\n ...backendIntlayerPackages,\n ];\n\n if (backendConfigPackages.some((pkg) => allDeps[pkg])) {\n hasAliasConfiguration = true;\n }\n\n if (!hasAliasConfiguration) {\n const configuration = getConfiguration({ baseDir: rootDir });\n const aliases = getAlias({ configuration });\n\n if (hasTsConfig && tsConfigFiles.length > 0) {\n const tsConfigPath =\n tsConfigFiles.find((file) => file === 'tsconfig.json') ||\n tsConfigFiles[0];\n\n if (tsConfigPath) {\n const tsConfigContent = await readFileFromRoot(rootDir, tsConfigPath);\n const config = parseJSONWithComments(tsConfigContent);\n\n config.compilerOptions ??= {};\n config.compilerOptions.paths ??= {};\n\n let updated = false;\n\n Object.entries(aliases).forEach(([alias, path]) => {\n if (!config.compilerOptions.paths[alias]) {\n config.compilerOptions.paths[alias] = [path];\n updated = true;\n }\n });\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n tsConfigPath,\n JSON.stringify(config, null, 2)\n );\n\n logger(\n `${v} Updated ${colorizePath(\n tsConfigPath\n )} to include Intlayer aliases`\n );\n }\n }\n } else {\n const jsConfigPath = 'jsconfig.json';\n\n if (await exists(rootDir, jsConfigPath)) {\n const jsConfigContent = await readFileFromRoot(rootDir, jsConfigPath);\n const config = parseJSONWithComments(jsConfigContent);\n\n config.compilerOptions ??= {};\n config.compilerOptions.paths ??= {};\n\n let updated = false;\n\n Object.entries(aliases).forEach(([alias, path]) => {\n if (!config.compilerOptions.paths[alias]) {\n config.compilerOptions.paths[alias] = [path];\n updated = true;\n }\n });\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n jsConfigPath,\n JSON.stringify(config, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(\n jsConfigPath\n )} to include Intlayer aliases`\n );\n }\n } else {\n packageJson.imports ??= {};\n\n let updated = false;\n\n Object.entries(aliases).forEach(([alias, path]) => {\n const importAlias = alias.replace('@', '#');\n const importPath = path.startsWith('.') ? path : `./${path}`;\n\n if (!packageJson.imports[importAlias]) {\n packageJson.imports[importAlias] = importPath;\n updated = true;\n }\n });\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n packageJsonPath,\n JSON.stringify(packageJson, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(\n packageJsonPath\n )} to include Intlayer imports`\n );\n }\n }\n }\n }\n\n // FRAMEWORK-SPECIFIC SCAFFOLDING\n // Sets up middleware/proxy and wraps the layout/page with the Intlayer\n // providers for the detected framework (Next.js App Router today). Idempotent\n // and non-destructive: it never overwrites user code it cannot safely\n // transform, skipping with guidance instead.\n //\n // Skipped entirely when a compat i18n library drives the app (i18next,\n // next-intl, vue-i18n, …): the app already owns its routing, providers and\n // layouts, and Intlayer only syncs its catalogs — restructuring routes or\n // injecting providers would break the existing setup.\n const hasCompatLibrary = Boolean(compatSyncConfig || compatVitePluginConfig);\n\n if (!options?.noFrameworkSetup && hasCompatLibrary) {\n logger(\n `${v} Compat i18n library detected — keeping the app structure untouched (no route restructure, no provider injection)`\n );\n }\n\n if (!options?.noFrameworkSetup && !hasCompatLibrary) {\n try {\n // Prefer the user's interactive choice, else the configured routing mode\n // (which itself defaults to `prefix-no-default`). Drives whether the\n // locale path segment is required (`prefix-all`) or optional.\n const routingMode =\n options?.routingMode ??\n getConfiguration({ baseDir: rootDir }).routing.mode;\n\n await setupFramework({\n rootDir,\n allDeps,\n packageManager,\n useTypeScript: hasTsConfig,\n routingMode,\n });\n } catch {\n logger(\n `${x} Framework-specific scaffolding failed. Your existing files were left untouched; follow the documentation to finish the setup.`,\n { level: 'warn' }\n );\n }\n }\n\n // FINAL SUCCESS MESSAGE\n logger(`${v} ${colorize('Intlayer init setup complete.', ANSIColors.GREEN)}`);\n logger([\n colorize('Next →', ANSIColors.MAGENTA),\n colorize(\n `Follow the instructions in the documentation to complete the setup:`,\n ANSIColors.GREY_LIGHT\n ),\n colorizePath(guideUrl),\n ]);\n\n // INTLAYER LSP — instruction for the AI agent running `intlayer init`.\n // The Intlayer Language Server (`@intlayer/lsp`) provides Go-to-Definition\n // from `useIntlayer` / `getIntlayer` keys to their `.content` files, for both\n // IDEs and AI agents. Setup is editor-specific (VS Code, Cursor, Windsurf,\n // Zed, Neovim, Claude Code, …), so we don't scaffold anything here — instead\n // we point to the doc and ask the agent to confirm the target platform.\n logger([\n colorize('Intlayer LSP →', ANSIColors.MAGENTA),\n colorize(\n 'The Intlayer Language Server is available via the `@intlayer/lsp` package. It lets IDEs and AI agents jump from `useIntlayer`/`getIntlayer` keys to their `.content` files.',\n ANSIColors.GREY_LIGHT\n ),\n colorize(\n 'Ask the user which platform/editor they want to enable it on (VS Code, Cursor, Windsurf, Zed, Neovim, Claude Code, …), then follow the matching setup instructions:',\n ANSIColors.GREY_LIGHT\n ),\n colorizePath(DocumentationRouter.LSP),\n ]);\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["colorize","ANSIColors","exists","x","colorizePath","readFileFromRoot","detectPackageManager","detectLinguiCatalogPattern","detectMissingIntlayerPackages","v","detectOutdatedIntlayerPackages","writeFileToRoot","resolveGithubWorkflowsContext","getGithubWorkflows","ensureDirectory","join","parseJSONWithComments","findTsConfigFiles","detectJsonLocalePattern","initConfig","setCompilerOutputInConfig","detectNextIntlMessagesPattern","updateIntlayerConfigWithSyncPlugin","setRoutingModeInConfig","replaceViteConfigPluginImportSource","updateViteConfigForCompatPlugin","hasIntlayerVitePlugin","updateViteConfig","updateNextConfigForNextI18next","updateNextConfigForNextIntl","updateNextConfigForNextTranslate","updateNextConfig","setupNextCompilerBabelConfig","updateAstroConfig","updateNuxtConfigForNuxtjsI18n","updateNuxtConfig","updateMetroConfig","getMetroConfigTemplate","isVersionAtLeast","getConfiguration","getAlias","setupFramework"],"sources":["../../../src/init/index.ts"],"sourcesContent":["import { join } from 'node:path';\nimport * as ANSIColors from '@intlayer/config/colors';\nimport { colorize, colorizePath, logger, v, x } from '@intlayer/config/logger';\nimport { getConfiguration } from '@intlayer/config/node';\nimport { getAlias } from '@intlayer/config/utils';\nimport { initConfig } from '../initConfig';\nimport { setCompilerOutputInConfig, setRoutingModeInConfig } from './cms';\nimport { setupFramework } from './frameworkSetup';\nimport type { CompatSyncConfig, RoutingMode } from './utils';\nimport {\n detectJsonLocalePattern,\n detectLinguiCatalogPattern,\n detectMissingIntlayerPackages,\n detectNextIntlMessagesPattern,\n detectOutdatedIntlayerPackages,\n detectPackageManager,\n ensureDirectory,\n exists,\n findTsConfigFiles,\n getGithubWorkflows,\n getMetroConfigTemplate,\n hasIntlayerVitePlugin,\n installPackages,\n isVersionAtLeast,\n parseJSONWithComments,\n readFileFromRoot,\n replaceViteConfigPluginImportSource,\n resolveGithubWorkflowsContext,\n setupNextCompilerBabelConfig,\n updateAstroConfig,\n updateIntlayerConfigWithSyncPlugin,\n updateMetroConfig,\n updateNextConfig,\n updateNextConfigForNextI18next,\n updateNextConfigForNextIntl,\n updateNextConfigForNextTranslate,\n updateNuxtConfig,\n updateNuxtConfigForNuxtjsI18n,\n updateViteConfig,\n updateViteConfigForCompatPlugin,\n upgradePackages,\n writeFileToRoot,\n} from './utils';\n\n/**\n * Documentation URL Constants\n */\nconst DocumentationRouter = {\n NextJS: 'https://intlayer.org/doc/environment/nextjs.md',\n NextJS_15: 'https://intlayer.org/doc/environment/nextjs/15.md',\n NextJS_14: 'https://intlayer.org/doc/environment/nextjs/14.md',\n CRA: 'https://intlayer.org/doc/environment/create-react-app.md',\n Astro: 'https://intlayer.org/doc/environment/astro.md',\n ViteAndReact: 'https://intlayer.org/doc/environment/vite-and-react.md',\n ViteAndReact_ReactRouterV7:\n 'https://intlayer.org/doc/environment/vite-and-react/react-router-v7.md',\n ViteAndReact_ReactRouterV7_FSRoutes:\n 'https://intlayer.org/doc/environment/vite-and-react/react-router-v7-fs-routes.md',\n ViteAndVue: 'https://intlayer.org/doc/environment/vite-and-vue.md',\n ViteAndSolid: 'https://intlayer.org/doc/environment/vite-and-solid.md',\n ViteAndSvelte: 'https://intlayer.org/doc/environment/vite-and-svelte.md',\n ViteAndPreact: 'https://intlayer.org/doc/environment/vite-and-preact.md',\n TanStackRouter: 'https://intlayer.org/doc/environment/tanstack-start.md',\n NuxtAndVue: 'https://intlayer.org/doc/environment/nuxt-and-vue.md',\n Angular: 'https://intlayer.org/doc/environment/angular.md',\n SvelteKit: 'https://intlayer.org/doc/environment/sveltekit.md',\n ReactNativeAndExpo:\n 'https://intlayer.org/doc/environment/react-native-and-expo.md',\n Lynx: 'https://intlayer.org/doc/environment/lynx-and-react.md',\n Express: 'https://intlayer.org/doc/environment/express.md',\n NestJS: 'https://intlayer.org/doc/environment/nest.md',\n Fastify: 'https://intlayer.org/doc/environment/fastify.md',\n Default: 'https://intlayer.org/doc/get-started',\n\n // Intlayer Language Server (Go-to-Definition from getter keys to .content files)\n LSP: 'https://intlayer.org/doc/lsp.md',\n\n // Check for competitors libs\n NextIntl: 'https://intlayer.org/blog/intlayer-with-next-intl.md',\n ReactI18Next: 'https://intlayer.org/blog/intlayer-with-react-i18next.md',\n ReactIntl: 'https://intlayer.org/blog/intlayer-with-react-intl.md',\n NextI18Next: 'https://intlayer.org/blog/intlayer-with-next-i18next.md',\n VueI18n: 'https://intlayer.org/blog/intlayer-with-vue-i18n.md',\n};\n\n/**\n * Helper: Detects the environment and returns the doc URL\n */\nconst getDocumentationUrl = (packageJson: any): string => {\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n /**\n * Helper to check if a version string matches a specific major version\n * Matches: \"15\", \"^15.0.0\", \"~15.2\", \"15.0.0-beta\"\n */\n const isVersion = (versionString: string, major: number): boolean => {\n if (!versionString || typeof versionString !== 'string') return false;\n const regex = new RegExp(`^[\\\\^~]?${major}(?:\\\\.|$)`);\n return regex.test(versionString);\n };\n\n // Mobile / Cross-platform\n if (deps['@lynx-js/react'] || deps['@lynx-js/core']) {\n return DocumentationRouter.Lynx;\n }\n if (deps['react-native'] || deps.expo) {\n return DocumentationRouter.ReactNativeAndExpo;\n }\n\n // Meta-frameworks (Next, Nuxt, Astro, SvelteKit)\n if (deps.next) {\n const version = deps.next;\n\n if (isVersion(version, 14)) {\n return DocumentationRouter.NextJS_14;\n }\n\n if (isVersion(version, 15)) {\n return DocumentationRouter.NextJS_15;\n }\n\n return DocumentationRouter.NextJS;\n }\n\n if (deps.nuxt) return DocumentationRouter.NuxtAndVue;\n if (deps.astro) return DocumentationRouter.Astro;\n if (deps['@sveltejs/kit']) return DocumentationRouter.SvelteKit;\n\n // Routers (TanStack & React Router v7)\n if (deps['@tanstack/react-router']) {\n return DocumentationRouter.TanStackRouter;\n }\n\n // Check for React Router v7\n const reactRouterVersion = deps['react-router'];\n if (reactRouterVersion && typeof reactRouterVersion === 'string') {\n // Distinguish between standard v7 and v7 with FS routes\n if (deps['@react-router/fs-routes']) {\n return DocumentationRouter.ViteAndReact_ReactRouterV7_FSRoutes;\n }\n\n // Use Regex to ensure it is v7\n if (isVersion(reactRouterVersion, 7)) {\n return DocumentationRouter.ViteAndReact_ReactRouterV7;\n }\n }\n\n // Vite Ecosystem (General)\n if (deps.vite) {\n if (deps.vue) return DocumentationRouter.ViteAndVue;\n if (deps['solid-js']) return DocumentationRouter.ViteAndSolid;\n if (deps.svelte) return DocumentationRouter.ViteAndSvelte;\n if (deps.preact) return DocumentationRouter.ViteAndPreact;\n\n // Default to React if Vite is present but specific other frameworks aren't found\n return DocumentationRouter.ViteAndReact;\n }\n\n // Other Web Frameworks\n if (deps['react-scripts']) return DocumentationRouter.CRA;\n if (deps['@angular/core']) return DocumentationRouter.Angular;\n\n // Backend\n if (deps['@nestjs/core']) return DocumentationRouter.NestJS;\n if (deps.express) return DocumentationRouter.Express;\n if (deps.fastify) return DocumentationRouter.Fastify;\n\n // Competitor Libs (Migration Guides)\n // We check these last as specific environment setup is usually higher priority,\n // but if no specific framework logic matched (or as a fallback), we guide to migration.\n if (deps['next-intl']) return DocumentationRouter.NextIntl;\n if (deps['react-i18next'] || deps.i18next)\n return DocumentationRouter.ReactI18Next;\n if (deps['react-intl']) return DocumentationRouter.ReactIntl;\n if (deps['next-i18next']) return DocumentationRouter.NextI18Next;\n if (deps['vue-i18n']) return DocumentationRouter.VueI18n;\n\n return DocumentationRouter.Default;\n};\n\n/**\n * Resolves the default dev-server URL of the detected framework, used as the\n * `editor.applicationURL` of the generated configuration file. Frameworks that\n * embed Vite (Astro, SvelteKit, …) are checked before the bare Vite fallback so\n * their own dev port wins.\n */\nexport const getDefaultApplicationURL = (\n dependencies: Record<string, string>\n): string => {\n if (dependencies.next) return 'http://localhost:3000';\n if (dependencies.astro) return 'http://localhost:4321';\n if (dependencies['@angular/core']) return 'http://localhost:4200';\n if (dependencies.nuxt) return 'http://localhost:3000';\n if (dependencies['@sveltejs/kit']) return 'http://localhost:5173';\n if (dependencies['react-scripts']) return 'http://localhost:3000';\n if (dependencies.vite) return 'http://localhost:5173';\n\n return 'http://localhost:3000';\n};\n\n/**\n * How the interactive init organizes autogenerated content (compiler output /\n * autofill):\n * - `per-component` — multilingual `.content` files co-located with components\n * (the configuration template default).\n * - `centralized` — per-locale JSON dictionaries under `/locales/{locale}/`.\n * - `json-namespaces` — plain per-locale JSON namespace files kept in sync\n * through `@intlayer/sync-json-plugin`.\n */\nexport type ContentStrategy =\n | 'per-component'\n | 'centralized'\n | 'json-namespaces';\n\n/**\n * OPTIONS\n */\nexport type InitOptions = {\n noGitignore?: boolean;\n /** Skip scaffolding the `fill` and `test` GitHub Actions workflows. */\n noGithubActions?: boolean;\n /**\n * Skip installing missing Intlayer dependencies and upgrading outdated ones.\n */\n noInstallPackages?: boolean;\n /** Skip adding the Intlayer extension to `.vscode/extensions.json`. */\n noVscodeExtension?: boolean;\n /** Skip writing the Intlayer LSP configuration to `.vscode/settings.json`. */\n noLsp?: boolean;\n /**\n * Skip framework-specific scaffolding (middleware/proxy, providers in\n * layout/page, example content). Defaults to enabled.\n */\n noFrameworkSetup?: boolean;\n /**\n * Version that outdated Intlayer packages should be upgraded to (typically the\n * running CLI version). When omitted, installed packages are left untouched and\n * only missing ones are installed.\n */\n upgradeToVersion?: string;\n /**\n * Locale routing strategy to write to `routing.mode` in the generated/existing\n * Intlayer configuration file. When omitted, the configuration default\n * (`prefix-no-default`) is kept.\n */\n routingMode?: RoutingMode;\n /**\n * Extra packages hinted by the interactive init prompt (compat i18n library\n * selections made before those libraries are actually installed). These are\n * merged into the dependency map used by {@link detectMissingIntlayerPackages}\n * so the correct sync plugin and compat adapter are always scheduled.\n */\n hintDependencies?: Record<string, string>;\n /**\n * Content organization strategy chosen by the interactive init prompt. Drives\n * the `compiler.output` template (`centralized`) or the injection of the\n * syncJSON plugin (`json-namespaces`). When omitted (or `per-component`), the\n * configuration template default is kept.\n */\n contentStrategy?: ContentStrategy;\n};\n\n/**\n * MAIN LOGIC\n */\nexport const initIntlayer = async (rootDir: string, options?: InitOptions) => {\n logger(colorize('Checking Intlayer configuration...', ANSIColors.CYAN));\n\n // READ PACKAGE.JSON\n const packageJsonPath = 'package.json';\n if (!(await exists(rootDir, packageJsonPath))) {\n logger(\n `${x} No ${colorizePath('package.json')} found. Please run this script from the project root.`,\n { level: 'error' }\n );\n process.exit(1);\n }\n\n const packageJsonContent = await readFileFromRoot(rootDir, packageJsonPath);\n let packageJson: Record<string, any>;\n try {\n packageJson = JSON.parse(packageJsonContent);\n } catch {\n logger(`${x} Could not parse ${colorizePath('package.json')}.`, {\n level: 'error',\n });\n process.exit(1);\n }\n\n // Determine the correct documentation URL based on dependencies\n const guideUrl = getDocumentationUrl(packageJson);\n\n const allDeps: Record<string, string> = {\n ...(packageJson.dependencies ?? {}),\n ...(packageJson.devDependencies ?? {}),\n };\n\n // Effective deps = real deps + interactive hint-deps (compat library selections\n // from the interactive init prompt that haven't been installed yet).\n const effectiveAllDeps: Record<string, string> = {\n ...allDeps,\n ...(options?.hintDependencies ?? {}),\n };\n\n // INSTALL MISSING INTLAYER DEPENDENCIES\n const packageManager = detectPackageManager(rootDir);\n\n // lingui keeps its catalogs as `.po` (default) or `.json`. Detect which so the\n // matching sync plugin (`syncPO` / `syncJSON`) + dev dependency are chosen.\n // Also respect the `__lingui_json__` sentinel injected by the interactive init\n // prompt when the user explicitly selected \"Lingui (.json catalogs)\".\n const linguiPresent = Boolean(\n effectiveAllDeps['@lingui/core'] ||\n effectiveAllDeps['@lingui/react'] ||\n effectiveAllDeps['@intlayer/lingui']\n );\n\n // Determine format: prefer filesystem scan, then the interactive sentinel.\n const linguiCatalog = linguiPresent\n ? await detectLinguiCatalogPattern(rootDir)\n : null;\n\n const hintLinguiJson = Boolean(\n options?.hintDependencies?.['__lingui_json__']\n );\n // `linguiCatalogFormat` resolution:\n // 1. Filesystem scan result (authoritative when catalogs already exist)\n // 2. Interactive sentinel `__lingui_json__` → 'json'\n // 3. Fallback: 'po' (lingui's default) when lingui is selected but no\n // catalogs have been generated yet and no sentinel was injected.\n const linguiCatalogFormat: 'po' | 'json' | null =\n linguiCatalog?.format ??\n (linguiPresent ? (hintLinguiJson ? 'json' : 'po') : null);\n\n const {\n packagesToInstall,\n devPackagesToInstall,\n compatSyncConfig,\n compatVitePluginConfig,\n } = detectMissingIntlayerPackages(effectiveAllDeps, {\n linguiCatalogFormat,\n });\n\n // The `json-namespaces` content strategy uses the same syncJSON pipeline as\n // the compat libraries: plain per-locale JSON namespace files synced through\n // `@intlayer/sync-json-plugin`. A detected compat library keeps precedence —\n // its own catalog format/template is authoritative.\n const wantsJsonNamespaces =\n options?.contentStrategy === 'json-namespaces' && !compatSyncConfig;\n\n if (\n wantsJsonNamespaces &&\n !effectiveAllDeps['@intlayer/sync-json-plugin'] &&\n !devPackagesToInstall.includes('@intlayer/sync-json-plugin')\n ) {\n devPackagesToInstall.push('@intlayer/sync-json-plugin');\n }\n\n if (!options?.noInstallPackages) {\n const withVersion = (packages: string[]): string[] =>\n options?.upgradeToVersion\n ? packages.map((pkg) => `${pkg}@${options.upgradeToVersion}`)\n : packages;\n\n if (packagesToInstall.length > 0) {\n logger(\n colorize('Installing missing Intlayer dependencies...', ANSIColors.CYAN)\n );\n try {\n installPackages(\n rootDir,\n withVersion(packagesToInstall),\n packageManager\n );\n logger(\n `${v} Installed: ${packagesToInstall.map((pkg) => colorize(pkg, ANSIColors.MAGENTA)).join(', ')}`\n );\n } catch {\n logger(\n `${x} Failed to install packages. Please install manually: ${packagesToInstall.join(' ')}`,\n { level: 'warn' }\n );\n }\n }\n\n if (devPackagesToInstall.length > 0) {\n logger(\n colorize(\n 'Installing missing Intlayer dev dependencies...',\n ANSIColors.CYAN\n )\n );\n try {\n installPackages(\n rootDir,\n withVersion(devPackagesToInstall),\n packageManager,\n true\n );\n logger(\n `${v} Installed: ${devPackagesToInstall.map((pkg) => colorize(pkg, ANSIColors.MAGENTA)).join(', ')}`\n );\n } catch {\n logger(\n `${x} Failed to install dev packages. Please install manually: ${devPackagesToInstall.join(' ')}`,\n { level: 'warn' }\n );\n }\n }\n\n // UPGRADE OUTDATED INTLAYER DEPENDENCIES\n // Only runs when a target version is provided (typically the running CLI\n // version). Already up-to-date packages are skipped. Prod and dev\n // dependencies are upgraded separately so their dependency type is kept.\n if (options?.upgradeToVersion) {\n const outdatedDependencies = detectOutdatedIntlayerPackages(\n rootDir,\n packageJson.dependencies ?? {},\n options.upgradeToVersion\n );\n const outdatedDevDependencies = detectOutdatedIntlayerPackages(\n rootDir,\n packageJson.devDependencies ?? {},\n options.upgradeToVersion\n );\n\n const allOutdated = [...outdatedDependencies, ...outdatedDevDependencies];\n\n if (allOutdated.length > 0) {\n logger(\n colorize(\n `Upgrading outdated Intlayer dependencies to ${options.upgradeToVersion}...`,\n ANSIColors.CYAN\n )\n );\n try {\n upgradePackages(\n rootDir,\n outdatedDependencies,\n packageManager,\n options.upgradeToVersion\n );\n upgradePackages(\n rootDir,\n outdatedDevDependencies,\n packageManager,\n options.upgradeToVersion,\n true\n );\n logger(\n `${v} Upgraded: ${allOutdated.map((pkg) => colorize(pkg, ANSIColors.MAGENTA)).join(', ')}`\n );\n } catch {\n logger(\n `${x} Failed to upgrade packages. Please upgrade manually: ${allOutdated.join(' ')}`,\n { level: 'warn' }\n );\n }\n } else {\n logger(`${v} Intlayer dependencies are up to date`);\n }\n }\n }\n\n // CHECK .GITIGNORE\n const gitignorePath = '.gitignore';\n if (!options?.noGitignore && (await exists(rootDir, gitignorePath))) {\n const gitignoreContent = await readFileFromRoot(rootDir, gitignorePath);\n\n if (!gitignoreContent.includes('intlayer')) {\n const newContent = `${gitignoreContent}\\n# Intlayer\\n.intlayer\\n`;\n await writeFileToRoot(rootDir, gitignorePath, newContent);\n logger(\n `${v} Added ${colorizePath('.intlayer')} to ${colorizePath(gitignorePath)}`\n );\n } else {\n logger(`${v} ${colorizePath(gitignorePath)} already includes .intlayer`);\n }\n }\n\n // SCAFFOLD GITHUB ACTIONS WORKFLOWS (fill + test)\n // Generate two workflows whose commands match the detected package manager:\n // - intlayer-fill.yml: auto-fills missing translations on pull requests\n // - intlayer-test.yml: fails the PR when required locales are missing\n // GitHub only triggers workflows stored at the repository root, so in a\n // monorepo the files are written to the git root and the commands go through\n // `intlayer ci`, which iterates over every Intlayer project of the\n // repository (see resolveGithubWorkflowsContext).\n if (!options?.noGithubActions) {\n const workflowsContext = await resolveGithubWorkflowsContext(\n rootDir,\n packageManager\n );\n const workflows = getGithubWorkflows(\n workflowsContext.packageManager,\n workflowsContext.options\n );\n\n for (const workflow of workflows) {\n if (await exists(workflowsContext.workflowsRootDir, workflow.filePath)) {\n logger(`${v} ${colorizePath(workflow.filePath)} already exists`);\n continue;\n }\n\n try {\n await ensureDirectory(\n workflowsContext.workflowsRootDir,\n join('.github', 'workflows')\n );\n await writeFileToRoot(\n workflowsContext.workflowsRootDir,\n workflow.filePath,\n workflow.content\n );\n logger(\n `${v} Added GitHub Actions workflow ${colorizePath(workflow.filePath)}`\n );\n } catch {\n logger(\n `${x} Could not create ${colorizePath(workflow.filePath)}. You may need to add it manually.`,\n { level: 'warn' }\n );\n }\n }\n }\n\n // CHECK VS CODE EXTENSION RECOMMENDATIONS\n const vscodeDir = '.vscode';\n const extensionsJsonPath = join(vscodeDir, 'extensions.json');\n const extensionId = 'intlayer.intlayer-vs-code-extension';\n\n if (!options?.noVscodeExtension) {\n try {\n let extensionsConfig: { recommendations: string[] } = {\n recommendations: [],\n };\n\n if (await exists(rootDir, extensionsJsonPath)) {\n const content = await readFileFromRoot(rootDir, extensionsJsonPath);\n extensionsConfig = parseJSONWithComments(content);\n } else {\n await ensureDirectory(rootDir, vscodeDir);\n }\n\n if (!extensionsConfig.recommendations) {\n extensionsConfig.recommendations = [];\n }\n\n if (!extensionsConfig.recommendations.includes(extensionId)) {\n extensionsConfig.recommendations.push(extensionId);\n await writeFileToRoot(\n rootDir,\n extensionsJsonPath,\n JSON.stringify(extensionsConfig, null, 2)\n );\n logger(\n `${v} Added ${colorize(extensionId, ANSIColors.MAGENTA)} to ${colorizePath(extensionsJsonPath)}`\n );\n } else {\n logger(\n `${v} ${colorizePath(extensionsJsonPath)} already includes ${colorize(extensionId, ANSIColors.MAGENTA)}`\n );\n }\n } catch {\n logger(\n `${x} Could not update ${colorizePath(extensionsJsonPath)}. You may need to add ${colorize(extensionId, ANSIColors.MAGENTA)} manually.`,\n { level: 'warn' }\n );\n }\n }\n\n // CHECK VS CODE LSP SETTINGS\n const settingsJsonPath = join(vscodeDir, 'settings.json');\n\n if (!options?.noLsp) {\n try {\n let settingsConfig: Record<string, unknown> = {};\n\n if (await exists(rootDir, settingsJsonPath)) {\n const content = await readFileFromRoot(rootDir, settingsJsonPath);\n settingsConfig = parseJSONWithComments(content);\n } else {\n await ensureDirectory(rootDir, vscodeDir);\n }\n\n let settingsUpdated = false;\n\n if (!settingsConfig['intlayer.languageServer.command']) {\n settingsConfig['intlayer.languageServer.command'] = 'npx';\n settingsUpdated = true;\n }\n\n if (!settingsConfig['intlayer.languageServer.args']) {\n settingsConfig['intlayer.languageServer.args'] = ['@intlayer/lsp'];\n settingsUpdated = true;\n }\n\n if (settingsUpdated) {\n await writeFileToRoot(\n rootDir,\n settingsJsonPath,\n JSON.stringify(settingsConfig, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(settingsJsonPath)} with LSP configuration`\n );\n } else {\n logger(\n `${v} ${colorizePath(settingsJsonPath)} already includes LSP configuration`\n );\n }\n } catch {\n logger(\n `${x} Could not update ${colorizePath(settingsJsonPath)}. You may need to add the LSP settings manually.`,\n { level: 'warn' }\n );\n }\n }\n\n // CHECK TSCONFIGS\n const tsConfigFiles = await findTsConfigFiles(rootDir);\n let hasTsConfig = false;\n\n for (const fileName of tsConfigFiles) {\n if (await exists(rootDir, fileName)) {\n hasTsConfig = true;\n try {\n const fileContent = await readFileFromRoot(rootDir, fileName);\n const config = parseJSONWithComments(fileContent);\n const typeDefinition = './.intlayer/**/*.ts';\n\n let updated = false;\n\n if (!config.include) {\n // Skip if no include array (solution-style)\n } else if (\n Array.isArray(config.include) &&\n !(config.include as string[]).some((pattern: string) =>\n pattern.includes('.intlayer')\n )\n ) {\n config.include.push(typeDefinition);\n updated = true;\n } else if (config.include.includes(typeDefinition)) {\n logger(\n `${v} ${colorizePath(fileName)} already includes intlayer types`\n );\n }\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n fileName,\n JSON.stringify(config, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(fileName)} to include intlayer types`\n );\n }\n } catch {\n logger(\n `${x} Could not parse or update ${colorizePath(fileName)}. You may need to add ${colorizePath('.intlayer/types/**/*.ts')} manually.`,\n { level: 'warn' }\n );\n }\n }\n }\n\n // INITIALIZE CONFIG FILE\n const format = hasTsConfig ? 'intlayer.config.ts' : 'intlayer.config.mjs';\n\n // Detect the locale JSON file pattern already in the project so we can\n // insert the matching locales into the config and produce the most\n // accurate source template for compat libraries.\n const detectedPattern = await detectJsonLocalePattern(rootDir);\n\n await initConfig(format, rootDir, {\n locales: detectedPattern?.locales,\n applicationURL: getDefaultApplicationURL(allDeps),\n });\n\n // APPLY CONTENT STRATEGY — CENTRALIZED\n // Point `compiler.output` at per-locale JSON dictionaries under `/locales/`\n // instead of the per-component template default.\n if (options?.contentStrategy === 'centralized') {\n await setCompilerOutputInConfig(\n rootDir,\n '/locales/{{locale}}/{{key}}.content.json'\n );\n }\n\n // INJECT SYNC-JSON PLUGIN FOR COMPAT LIBRARIES / JSON-NAMESPACES STRATEGY\n const syncConfigToInject: CompatSyncConfig | undefined =\n compatSyncConfig ??\n (wantsJsonNamespaces\n ? {\n format: 'i18next',\n sourceTemplate:\n detectedPattern?.template ?? './locales/${locale}/${key}.json',\n }\n : undefined);\n\n if (syncConfigToInject) {\n // For next-intl / use-intl, the messages path is authoritatively declared\n // in `i18n/request.ts` (e.g. `import(`../messages/${locale}.json`)`), so we\n // read it directly. It usually resolves to a single file per locale (no\n // `${key}` segment), whose first-level keys are namespaces — so the compat\n // config carries `splitKeys: true` to emit one dictionary per namespace.\n // Falls back to file-system globbing otherwise.\n const nextIntlMessagesPattern =\n allDeps['next-intl'] ||\n allDeps['@intlayer/next-intl'] ||\n allDeps['use-intl'] ||\n allDeps['@intlayer/use-intl']\n ? await detectNextIntlMessagesPattern(rootDir)\n : null;\n\n // lingui authoritatively resolves to `…/{locale}/messages.{po,json}`, where\n // the `messages` filename becomes the dictionary key. Prefer it so a `.po`\n // project gets `syncPO` (the generic JSON glob only sees `.json`).\n const sourceTemplate =\n linguiCatalog?.template ??\n nextIntlMessagesPattern?.template ??\n detectedPattern?.template;\n\n const resolvedSyncConfig = {\n ...syncConfigToInject,\n ...(sourceTemplate ? { sourceTemplate } : {}),\n };\n\n const syncPluginPackage =\n resolvedSyncConfig.plugin === 'po'\n ? '@intlayer/sync-po-plugin'\n : '@intlayer/sync-json-plugin';\n const syncPluginName =\n resolvedSyncConfig.plugin === 'po' ? 'syncPO' : 'syncJSON';\n\n // `splitKeys` only makes sense for a single file holding several namespaces.\n // If the resolved template addresses one namespace per file (`${key}`\n // segment), each file is already a single namespace — drop the flag so\n // syncJSON keeps one dictionary per file.\n if (\n resolvedSyncConfig.splitKeys &&\n resolvedSyncConfig.sourceTemplate.includes('${key}')\n ) {\n resolvedSyncConfig.splitKeys = false;\n }\n\n const intlayerConfigCandidates = [\n 'intlayer.config.ts',\n 'intlayer.config.mjs',\n 'intlayer.config.js',\n 'intlayer.config.cjs',\n ];\n\n for (const configFile of intlayerConfigCandidates) {\n if (await exists(rootDir, configFile)) {\n const configContent = await readFileFromRoot(rootDir, configFile);\n\n if (!configContent.includes(syncPluginPackage)) {\n const extension = configFile.split('.').pop()!;\n const updatedConfigContent = updateIntlayerConfigWithSyncPlugin(\n configContent,\n extension,\n resolvedSyncConfig\n );\n await writeFileToRoot(rootDir, configFile, updatedConfigContent);\n logger(\n `${v} Updated ${colorizePath(configFile)} with ${syncPluginName} compat plugin`\n );\n } else {\n logger(\n `${v} ${colorizePath(configFile)} already includes ${syncPluginName} plugin`\n );\n }\n break;\n }\n }\n }\n\n // APPLY ROUTING MODE\n // When a routing strategy was chosen (interactive init), write it to\n // `routing.mode` in the configuration file. Idempotent and comment-preserving.\n if (options?.routingMode) {\n await setRoutingModeInConfig(rootDir, options.routingMode);\n }\n\n let hasAliasConfiguration = false;\n\n // CHECK VITE CONFIG\n const viteConfigs = ['vite.config.ts', 'vite.config.js', 'vite.config.mjs'];\n\n for (const file of viteConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n const content = await readFileFromRoot(rootDir, file);\n const extension = file.split('.').pop()!;\n\n if (compatVitePluginConfig) {\n const { replacesVitePlugin } = compatVitePluginConfig;\n\n if (content.includes(compatVitePluginConfig.pluginPackageSource)) {\n logger(\n `${v} ${colorizePath(file)} already includes ${compatVitePluginConfig.pluginPackageSource}`\n );\n } else if (\n replacesVitePlugin &&\n content.includes(replacesVitePlugin.fromPackageSource)\n ) {\n // Drop-in replacement: rewrite the original i18n vite plugin's import\n // source, keeping its binding and call site (e.g. lingui).\n const updatedContent = replaceViteConfigPluginImportSource(\n content,\n replacesVitePlugin.importName,\n replacesVitePlugin.fromPackageSource,\n compatVitePluginConfig.pluginPackageSource\n );\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(\n `${v} Updated ${colorizePath(file)} to import ${replacesVitePlugin.importName} from ${compatVitePluginConfig.pluginPackageSource}`\n );\n } else {\n const updatedContent = updateViteConfigForCompatPlugin(\n content,\n extension,\n compatVitePluginConfig\n );\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(\n `${v} Updated ${colorizePath(file)} to include ${compatVitePluginConfig.pluginFunctionName} compat plugin`\n );\n }\n } else if (hasIntlayerVitePlugin(content)) {\n // A compat adapter plugin (e.g. `reactI18nextVitePlugin`) already wraps\n // `intlayer()` internally, so skip adding a redundant standalone plugin.\n logger(\n `${v} ${colorizePath(file)} already includes an Intlayer plugin`\n );\n } else {\n const updatedContent = updateViteConfig(content, extension);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(`${v} Updated ${colorizePath(file)} to include Intlayer plugin`);\n }\n break;\n }\n }\n\n // CHECK NEXT CONFIG\n const nextConfigs = ['next.config.js', 'next.config.mjs', 'next.config.ts'];\n let isNextJsProject = false;\n\n for (const file of nextConfigs) {\n if (await exists(rootDir, file)) {\n isNextJsProject = true;\n hasAliasConfiguration = true;\n const content = await readFileFromRoot(rootDir, file);\n const extension = file.split('.').pop()!;\n\n if (allDeps['next-i18next']) {\n if (!content.includes('@intlayer/next-i18next')) {\n const updatedContent = updateNextConfigForNextI18next(\n content,\n extension\n );\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(\n `${v} Updated ${colorizePath(file)} to include Intlayer next-i18next compat plugin`\n );\n } else {\n logger(\n `${v} ${colorizePath(file)} already includes @intlayer/next-i18next`\n );\n }\n } else if (allDeps['next-intl']) {\n if (!content.includes('@intlayer/next-intl/plugin')) {\n const updatedContent = updateNextConfigForNextIntl(\n content,\n extension\n );\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(\n `${v} Updated ${colorizePath(file)} to include Intlayer next-intl compat plugin`\n );\n } else {\n logger(\n `${v} ${colorizePath(file)} already includes @intlayer/next-intl/plugin`\n );\n }\n } else if (allDeps['next-translate']) {\n if (!content.includes('@intlayer/next-translate')) {\n const updatedContent = updateNextConfigForNextTranslate(\n content,\n extension\n );\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(\n `${v} Updated ${colorizePath(file)} to include Intlayer next-translate compat plugin`\n );\n } else {\n logger(\n `${v} ${colorizePath(file)} already includes @intlayer/next-translate`\n );\n }\n } else if (!content.includes('next-intlayer')) {\n const updatedContent = updateNextConfig(content, extension);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(`${v} Updated ${colorizePath(file)} to include Intlayer plugin`);\n }\n break;\n }\n }\n\n // CHECK NEXT.JS COMPILER (BABEL)\n // When a Next.js project already uses Babel, install @intlayer/babel and print\n // the compiler + build-optimization plugins (extract, purge, minify, optimize)\n // to add. SWC projects need no setup: withIntlayer injects @intlayer/swc.\n if (isNextJsProject) {\n await setupNextCompilerBabelConfig({\n rootDir,\n packageManager,\n allDeps,\n skipInstall: Boolean(options?.noInstallPackages),\n });\n }\n\n // CHECK OTHER FRAMEWORKS CONFIG\n const astroConfigs = [\n 'astro.config.mjs',\n 'astro.config.js',\n 'astro.config.ts',\n 'astro.config.cjs',\n ];\n\n for (const file of astroConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n\n if (file.startsWith('astro.config.')) {\n const content = await readFileFromRoot(rootDir, file);\n\n if (!content.includes('astro-intlayer')) {\n const extension = file.split('.').pop()!;\n const updatedContent = updateAstroConfig(content, extension);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(\n `${v} Updated ${colorizePath(file)} to include Intlayer integration`\n );\n }\n }\n break;\n }\n }\n\n const nuxtConfigs = ['nuxt.config.js', 'nuxt.config.ts'];\n for (const file of nuxtConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n\n const content = await readFileFromRoot(rootDir, file);\n\n if (allDeps['@nuxtjs/i18n']) {\n if (!content.includes('@intlayer/nuxtjs-i18n')) {\n const updatedContent = updateNuxtConfigForNuxtjsI18n(content);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(\n `${v} Updated ${colorizePath(file)} to include @intlayer/nuxtjs-i18n module`\n );\n } else {\n logger(\n `${v} ${colorizePath(file)} already includes @intlayer/nuxtjs-i18n`\n );\n }\n } else if (!content.includes('nuxt-intlayer')) {\n const updatedContent = updateNuxtConfig(content);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(`${v} Updated ${colorizePath(file)} to include Intlayer module`);\n }\n break;\n }\n }\n\n // CHECK METRO CONFIG (React Native / Expo)\n // Metro is the React Native bundler. The Intlayer Metro plugin\n // (`react-native-intlayer/metro`) handles dictionary aliasing and building.\n // When no config exists we scaffold one; when one exists we safely wrap its\n // exported config with `configMetroIntlayerSync`, leaving custom async\n // (IIFE) configs untouched so existing setups are never broken.\n const isReactNativeProject = Boolean(allDeps['react-native'] || allDeps.expo);\n\n if (isReactNativeProject) {\n // Metro resolves Intlayer aliases itself, so skip the alias fallback below.\n hasAliasConfiguration = true;\n\n const metroConfigs = [\n 'metro.config.js',\n 'metro.config.cjs',\n 'metro.config.mjs',\n 'metro.config.ts',\n ];\n\n let metroConfigFile: string | undefined;\n\n for (const file of metroConfigs) {\n if (await exists(rootDir, file)) {\n metroConfigFile = file;\n break;\n }\n }\n\n if (metroConfigFile) {\n const content = await readFileFromRoot(rootDir, metroConfigFile);\n\n if (content.includes('react-native-intlayer')) {\n logger(\n `${v} ${colorizePath(metroConfigFile)} already includes the Intlayer Metro plugin`\n );\n } else {\n const extension = metroConfigFile.split('.').pop()!;\n const updatedContent = updateMetroConfig(content, extension);\n\n if (updatedContent !== content) {\n await writeFileToRoot(rootDir, metroConfigFile, updatedContent);\n logger(\n `${v} Updated ${colorizePath(metroConfigFile)} to include the Intlayer Metro plugin`\n );\n } else {\n logger(\n `${x} Could not automatically update ${colorizePath(metroConfigFile)}. Wrap your exported config with ${colorize('configMetroIntlayer', ANSIColors.MAGENTA)}: ${colorizePath(DocumentationRouter.ReactNativeAndExpo)}`,\n { level: 'warn' }\n );\n }\n }\n } else {\n const newMetroConfigFile = 'metro.config.js';\n await writeFileToRoot(\n rootDir,\n newMetroConfigFile,\n getMetroConfigTemplate(Boolean(allDeps.expo))\n );\n logger(\n `${v} Created ${colorizePath(newMetroConfigFile)} with the Intlayer Metro plugin`\n );\n }\n }\n\n // UPDATE PACKAGE.JSON DEV SCRIPT\n // Next.js >= 16 uses a bun-specific wrapper; backend frameworks wrap whatever\n // the existing dev script is. Both use `intlayer watch --with`.\n const backendIntlayerPackages = [\n 'express-intlayer',\n 'fastify-intlayer',\n 'adonis-intlayer',\n 'hono-intlayer',\n ];\n\n const devScript = packageJson.scripts?.dev;\n\n let newDevScript: string | undefined;\n\n if (\n devScript &&\n ((isNextJsProject && allDeps.next && isVersionAtLeast(allDeps.next, 16)) ||\n backendIntlayerPackages.some((pkg) => allDeps[pkg])) &&\n !devScript.includes('intlayer watch')\n ) {\n newDevScript = `intlayer watch --with '${devScript}'`;\n }\n\n if (newDevScript) {\n packageJson.scripts.dev = newDevScript;\n\n await writeFileToRoot(\n rootDir,\n packageJsonPath,\n JSON.stringify(packageJson, null, 2)\n );\n\n logger(\n `${v} Updated ${colorizePath('package.json')} dev script to run intlayer watch`\n );\n }\n\n // CHECK WEBPACK CONFIG\n const webpackConfigs = [\n 'webpack.config.js',\n 'webpack.config.ts',\n 'webpack.config.mjs',\n 'webpack.config.cjs',\n ];\n\n for (const file of webpackConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n logger(\n `${v} Found ${colorizePath(\n file\n )}. Make sure to configure aliases manually or use the Intlayer Webpack plugin.`\n );\n break;\n }\n }\n\n const backendConfigPackages = [\n 'express',\n 'fastify',\n '@adonisjs/core',\n 'hono',\n ...backendIntlayerPackages,\n ];\n\n if (backendConfigPackages.some((pkg) => allDeps[pkg])) {\n hasAliasConfiguration = true;\n }\n\n if (!hasAliasConfiguration) {\n const configuration = getConfiguration({ baseDir: rootDir });\n const aliases = getAlias({ configuration });\n\n if (hasTsConfig && tsConfigFiles.length > 0) {\n const tsConfigPath =\n tsConfigFiles.find((file) => file === 'tsconfig.json') ||\n tsConfigFiles[0];\n\n if (tsConfigPath) {\n const tsConfigContent = await readFileFromRoot(rootDir, tsConfigPath);\n const config = parseJSONWithComments(tsConfigContent);\n\n config.compilerOptions ??= {};\n config.compilerOptions.paths ??= {};\n\n let updated = false;\n\n Object.entries(aliases).forEach(([alias, path]) => {\n if (!config.compilerOptions.paths[alias]) {\n config.compilerOptions.paths[alias] = [path];\n updated = true;\n }\n });\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n tsConfigPath,\n JSON.stringify(config, null, 2)\n );\n\n logger(\n `${v} Updated ${colorizePath(\n tsConfigPath\n )} to include Intlayer aliases`\n );\n }\n }\n } else {\n const jsConfigPath = 'jsconfig.json';\n\n if (await exists(rootDir, jsConfigPath)) {\n const jsConfigContent = await readFileFromRoot(rootDir, jsConfigPath);\n const config = parseJSONWithComments(jsConfigContent);\n\n config.compilerOptions ??= {};\n config.compilerOptions.paths ??= {};\n\n let updated = false;\n\n Object.entries(aliases).forEach(([alias, path]) => {\n if (!config.compilerOptions.paths[alias]) {\n config.compilerOptions.paths[alias] = [path];\n updated = true;\n }\n });\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n jsConfigPath,\n JSON.stringify(config, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(\n jsConfigPath\n )} to include Intlayer aliases`\n );\n }\n } else {\n packageJson.imports ??= {};\n\n let updated = false;\n\n Object.entries(aliases).forEach(([alias, path]) => {\n const importAlias = alias.replace('@', '#');\n const importPath = path.startsWith('.') ? path : `./${path}`;\n\n if (!packageJson.imports[importAlias]) {\n packageJson.imports[importAlias] = importPath;\n updated = true;\n }\n });\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n packageJsonPath,\n JSON.stringify(packageJson, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(\n packageJsonPath\n )} to include Intlayer imports`\n );\n }\n }\n }\n }\n\n // FRAMEWORK-SPECIFIC SCAFFOLDING\n // Sets up middleware/proxy and wraps the layout/page with the Intlayer\n // providers for the detected framework (Next.js App Router today). Idempotent\n // and non-destructive: it never overwrites user code it cannot safely\n // transform, skipping with guidance instead.\n //\n // Skipped entirely when a compat i18n library drives the app (i18next,\n // next-intl, vue-i18n, …): the app already owns its routing, providers and\n // layouts, and Intlayer only syncs its catalogs — restructuring routes or\n // injecting providers would break the existing setup.\n const hasCompatLibrary = Boolean(compatSyncConfig || compatVitePluginConfig);\n\n if (!options?.noFrameworkSetup && hasCompatLibrary) {\n logger(\n `${v} Compat i18n library detected — keeping the app structure untouched (no route restructure, no provider injection)`\n );\n }\n\n if (!options?.noFrameworkSetup && !hasCompatLibrary) {\n try {\n // Prefer the user's interactive choice, else the configured routing mode\n // (which itself defaults to `prefix-no-default`). Drives whether the\n // locale path segment is required (`prefix-all`) or optional.\n const routingMode =\n options?.routingMode ??\n getConfiguration({ baseDir: rootDir }).routing.mode;\n\n await setupFramework({\n rootDir,\n allDeps,\n packageManager,\n useTypeScript: hasTsConfig,\n routingMode,\n });\n } catch {\n logger(\n `${x} Framework-specific scaffolding failed. Your existing files were left untouched; follow the documentation to finish the setup.`,\n { level: 'warn' }\n );\n }\n }\n\n // FINAL SUCCESS MESSAGE\n logger(`${v} ${colorize('Intlayer init setup complete.', ANSIColors.GREEN)}`);\n logger([\n colorize('Next →', ANSIColors.MAGENTA),\n colorize(\n `Follow the instructions in the documentation to complete the setup:`,\n ANSIColors.GREY_LIGHT\n ),\n colorizePath(guideUrl),\n ]);\n\n // INTLAYER LSP — instruction for the AI agent running `intlayer init`.\n // The Intlayer Language Server (`@intlayer/lsp`) provides Go-to-Definition\n // from `useIntlayer` / `getIntlayer` keys to their `.content` files, for both\n // IDEs and AI agents. Setup is editor-specific (VS Code, Cursor, Windsurf,\n // Zed, Neovim, Claude Code, …), so we don't scaffold anything here — instead\n // we point to the doc and ask the agent to confirm the target platform.\n logger([\n colorize('Intlayer LSP →', ANSIColors.MAGENTA),\n colorize(\n 'The Intlayer Language Server is available via the `@intlayer/lsp` package. It lets IDEs and AI agents jump from `useIntlayer`/`getIntlayer` keys to their `.content` files.',\n ANSIColors.GREY_LIGHT\n ),\n colorize(\n 'Ask the user which platform/editor they want to enable it on (VS Code, Cursor, Windsurf, Zed, Neovim, Claude Code, …), then follow the matching setup instructions:',\n ANSIColors.GREY_LIGHT\n ),\n colorizePath(DocumentationRouter.LSP),\n ]);\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"configManipulation.cjs","names":["typescriptParser","isModuleScopeBinding"],"sources":["../../../../src/init/utils/configManipulation.ts"],"sourcesContent":["import type { RoutingConfig } from '@intlayer/types/config';\nimport * as recast from 'recast';\nimport { typescriptParser } from '../../utils/babelParser';\nimport { isModuleScopeBinding } from './astImports';\nimport type {\n CompatSyncConfig,\n CompatVitePluginConfig,\n} from './packageManager';\n\nconst { builders: b, namedTypes: n } = recast.types;\n\n/** The locale routing strategies supported by the Intlayer configuration. */\nexport type RoutingMode = RoutingConfig['mode'];\n\n/** Narrows an arbitrary recast node to an object expression. */\nconst isObjectExpression = (node: any): boolean =>\n Boolean(node) &&\n (node.type === 'ObjectExpression' || n.ObjectExpression.check(node));\n\n/**\n * Finds a property by key name on an object expression, creating it with the\n * provided default value node when it is absent. Returns the property node so\n * callers can read or mutate its value while preserving any attached comments.\n */\nconst ensureObjectProperty = (\n objExpr: any,\n key: string,\n defaultValueNode: any\n): any => {\n let property = (objExpr.properties as any[]).find((prop: any) => {\n if (!prop?.key) return false;\n return (prop.key.name ?? prop.key.value) === key;\n });\n\n if (!property) {\n property = b.property('init', b.identifier(key), defaultValueNode);\n (objExpr.properties as any[]).push(property);\n }\n\n return property;\n};\n\n/**\n * Sets (or replaces) a property's value on an object expression. When the\n * property already exists only its value node is swapped, which keeps the\n * leading documentation comment in place.\n */\nconst setObjectPropertyValue = (\n objExpr: any,\n key: string,\n valueNode: any\n): void => {\n const property = (objExpr.properties as any[]).find((prop: any) => {\n if (!prop?.key) return false;\n return (prop.key.name ?? prop.key.value) === key;\n });\n\n if (property) {\n property.value = valueNode;\n return;\n }\n\n (objExpr.properties as any[]).push(\n b.property('init', b.identifier(key), valueNode)\n );\n};\n\n/**\n * Adds a `process.env.<envVar>` reference property to an object expression when\n * the property is not already present. Existing values are left untouched.\n */\nconst addEnvReferenceProperty = (\n objExpr: any,\n key: string,\n envVar: string\n): void => {\n const hasProperty = (objExpr.properties as any[]).some((prop: any) => {\n if (!prop?.key) return false;\n return (prop.key.name ?? prop.key.value) === key;\n });\n\n if (hasProperty) return;\n\n (objExpr.properties as any[]).push(\n b.property(\n 'init',\n b.identifier(key),\n b.memberExpression(\n b.memberExpression(b.identifier('process'), b.identifier('env')),\n b.identifier(envVar)\n )\n )\n );\n};\n\n/**\n * Sets `routing.mode` in an Intlayer configuration file to the requested\n * strategy. Idempotent: re-running with the same mode produces identical\n * output. Supports `.ts`, `.mjs`, `.js` and `.cjs` configs; JSON configs are\n * handled with a scoped string replacement since they cannot be parsed by the\n * TypeScript recast parser.\n */\nexport const setIntlayerConfigRoutingMode = (\n content: string,\n extension: string,\n mode: RoutingMode\n): string => {\n if (extension === 'json') {\n return content.replace(\n /(\"mode\"\\s*:\\s*)\"(?:prefix-no-default|prefix-all|no-prefix|search-params)\"/,\n `$1\"${mode}\"`\n );\n }\n\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n genericRecastVisit(ast, (objExpr) => {\n if (!isObjectExpression(objExpr)) return;\n\n const routingProperty = ensureObjectProperty(\n objExpr,\n 'routing',\n b.objectExpression([])\n );\n\n if (!isObjectExpression(routingProperty.value)) return;\n\n setObjectPropertyValue(\n routingProperty.value,\n 'mode',\n b.stringLiteral(mode)\n );\n });\n\n return recast.print(ast).code;\n};\n\n/**\n * Sets `compiler.output` in an Intlayer configuration file to the given path\n * template (the `{{variable}}` string form, e.g.\n * `/locales/{{locale}}/{{key}}.content.json`). Idempotent: re-running with the\n * same template produces identical output. Supports `.ts`, `.mjs`, `.js` and\n * `.cjs` configs; JSON configs are supported too since the template is a plain\n * string.\n */\nexport const setIntlayerConfigCompilerOutput = (\n content: string,\n extension: string,\n outputTemplate: string\n): string => {\n if (extension === 'json') {\n const parsed = JSON.parse(content);\n parsed.compiler = { ...parsed.compiler, output: outputTemplate };\n return JSON.stringify(parsed, null, 2);\n }\n\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n genericRecastVisit(ast, (objExpr) => {\n if (!isObjectExpression(objExpr)) return;\n\n const compilerProperty = ensureObjectProperty(\n objExpr,\n 'compiler',\n b.objectExpression([])\n );\n\n if (!isObjectExpression(compilerProperty.value)) return;\n\n setObjectPropertyValue(\n compilerProperty.value,\n 'output',\n b.stringLiteral(outputTemplate)\n );\n });\n\n return recast.print(ast).code;\n};\n\n/**\n * Enables the Intlayer visual editor in a configuration file: sets\n * `editor.enabled` to `true` and wires `clientId` / `clientSecret` to the\n * `INTLAYER_CLIENT_ID` / `INTLAYER_CLIENT_SECRET` environment variables.\n * Idempotent and non-destructive — existing `clientId` / `clientSecret` values\n * are preserved. Only `.ts`, `.mjs`, `.js` and `.cjs` configs are supported\n * (JSON cannot reference `process.env`).\n */\nexport const enableIntlayerEditorConfig = (content: string): string => {\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n genericRecastVisit(ast, (objExpr) => {\n if (!isObjectExpression(objExpr)) return;\n\n const editorProperty = ensureObjectProperty(\n objExpr,\n 'editor',\n b.objectExpression([])\n );\n\n if (!isObjectExpression(editorProperty.value)) return;\n\n const editorObject = editorProperty.value;\n\n setObjectPropertyValue(editorObject, 'enabled', b.booleanLiteral(true));\n addEnvReferenceProperty(editorObject, 'clientId', 'INTLAYER_CLIENT_ID');\n addEnvReferenceProperty(\n editorObject,\n 'clientSecret',\n 'INTLAYER_CLIENT_SECRET'\n );\n });\n\n return recast.print(ast).code;\n};\n\nconst injectImport = (\n ast: any,\n isCJS: boolean,\n importName: string,\n source: string\n) => {\n // Never redeclare an identifier already bound at module scope (e.g. imported\n // from another source or declared locally) — that would be a parse error.\n if (!isCJS && isModuleScopeBinding(ast, importName)) return;\n\n const body = ast.program.body;\n const hasImport = body.some((stmt: any) => {\n if (isCJS) {\n return (\n n.VariableDeclaration.check(stmt) &&\n stmt.declarations.some(\n (decl: any) =>\n n.VariableDeclarator.check(decl) &&\n n.CallExpression.check(decl.init) &&\n n.Identifier.check(decl.init.callee) &&\n decl.init.callee.name === 'require' &&\n n.StringLiteral.check(decl.init.arguments[0]) &&\n decl.init.arguments[0].value === source\n )\n );\n }\n return (\n n.ImportDeclaration.check(stmt) &&\n (stmt.source.value === source ||\n stmt.specifiers?.some(\n (spec: any) =>\n (n.ImportSpecifier.check(spec) &&\n spec.imported.name === importName) ||\n (n.ImportDefaultSpecifier.check(spec) &&\n spec.local?.name === importName)\n ))\n );\n });\n\n if (hasImport) return;\n\n const declaration = isCJS\n ? b.variableDeclaration('const', [\n b.variableDeclarator(\n b.identifier(`{ ${importName} }`),\n b.callExpression(b.identifier('require'), [b.stringLiteral(source)])\n ),\n ])\n : b.importDeclaration(\n [b.importSpecifier(b.identifier(importName))],\n b.stringLiteral(source)\n );\n\n ast.program.body.unshift(declaration);\n};\n\nconst updatePluginArray = (\n objExpr: any,\n propertyName: string,\n pluginName: string\n) => {\n if (\n !objExpr ||\n (objExpr.type !== 'ObjectExpression' && !n.ObjectExpression.check(objExpr))\n )\n return;\n\n let prop = objExpr.properties.find((p: any) => {\n if (!p?.key) return false;\n const keyName = p.key.name || p.key.value;\n return keyName === propertyName;\n }) as any;\n\n if (!prop) {\n prop = b.property(\n 'init',\n b.identifier(propertyName),\n b.arrayExpression([])\n );\n objExpr.properties.push(prop);\n }\n\n const arrayValue = prop.value;\n\n if (\n arrayValue &&\n (arrayValue.type === 'ArrayExpression' ||\n n.ArrayExpression.check(arrayValue))\n ) {\n const hasPlugin = arrayValue.elements.some((el: any) => {\n const callee = el?.callee;\n if (!callee) return false;\n const name = callee.name || callee.id?.name;\n return name === pluginName || name === 'il';\n });\n\n if (!hasPlugin) {\n arrayValue.elements.push(b.callExpression(b.identifier(pluginName), []));\n }\n }\n};\n\nconst genericRecastVisit = (\n ast: any,\n updateConfigObject: (obj: any) => void,\n callNames: string[] = ['defineConfig']\n) => {\n /**\n * Resolves an identifier reference (e.g. `export default config` /\n * `module.exports = config`) back to the object expression it was declared\n * with, then runs the updater on it.\n */\n const resolveIdentifierConfig = (name: string) => {\n ast.program.body.forEach((stmt: any) => {\n if (n.VariableDeclaration.check(stmt)) {\n stmt.declarations.forEach((vdecl: any) => {\n if (\n n.VariableDeclarator.check(vdecl) &&\n n.Identifier.check(vdecl.id) &&\n vdecl.id.name === name &&\n n.ObjectExpression.check(vdecl.init)\n ) {\n updateConfigObject(vdecl.init);\n }\n });\n }\n });\n };\n\n recast.visit(ast, {\n visitExportDefaultDeclaration(path) {\n const decl = path.node.declaration;\n\n if (n.ObjectExpression.check(decl)) {\n updateConfigObject(decl);\n } else if (\n n.CallExpression.check(decl) &&\n n.Identifier.check(decl.callee) &&\n callNames.includes(decl.callee.name)\n ) {\n if (n.ObjectExpression.check(decl.arguments[0])) {\n updateConfigObject(decl.arguments[0]);\n }\n } else if (n.Identifier.check(decl)) {\n resolveIdentifierConfig(decl.name);\n }\n return false;\n },\n visitAssignmentExpression(path) {\n const { left, right } = path.node;\n\n if (\n n.MemberExpression.check(left) &&\n recast.print(left).code === 'module.exports'\n ) {\n if (n.ObjectExpression.check(right)) {\n updateConfigObject(right);\n } else if (\n n.CallExpression.check(right) &&\n n.Identifier.check(right.callee) &&\n callNames.includes(right.callee.name)\n ) {\n if (n.ObjectExpression.check(right.arguments[0])) {\n updateConfigObject(right.arguments[0]);\n }\n } else if (n.Identifier.check(right)) {\n resolveIdentifierConfig(right.name);\n }\n }\n return false;\n },\n });\n};\n\n/**\n * Detects whether a Vite config already wires in an Intlayer plugin — either the\n * base `vite-intlayer` plugin or one of the compat adapters (e.g.\n * `reactI18nextVitePlugin` from `@intlayer/react-i18next/plugin`). The compat\n * plugins internally wrap `intlayer()`, so a standalone `intlayer()` must not be\n * appended when one is already present, otherwise the plugin runs twice.\n */\nexport const hasIntlayerVitePlugin = (content: string): boolean =>\n content.includes('vite-intlayer') ||\n /@intlayer\\/[^'\"]+\\/plugin/.test(content);\n\nexport const updateViteConfig = (\n content: string,\n extension: string\n): string => {\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n const isCJSFile =\n extension === 'cjs' ||\n (content.includes('module.exports') && !content.includes('import '));\n\n injectImport(ast, isCJSFile, 'intlayer', 'vite-intlayer');\n\n genericRecastVisit(ast, (obj) =>\n updatePluginArray(obj, 'plugins', 'intlayer')\n );\n\n return recast.print(ast).code;\n};\n\nexport const updateAstroConfig = (\n content: string,\n extension: string\n): string => {\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n const isCJSFile =\n extension === 'cjs' ||\n (content.includes('module.exports') && !content.includes('import '));\n\n injectImport(ast, isCJSFile, 'intlayer', 'astro-intlayer');\n\n genericRecastVisit(ast, (obj) =>\n updatePluginArray(obj, 'integrations', 'intlayer')\n );\n\n return recast.print(ast).code;\n};\n\nexport const updateNextConfig = (\n content: string,\n extension: string\n): string => {\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n const isCJSFile = extension === 'cjs' || content.includes('module.exports');\n\n injectImport(ast, isCJSFile, 'withIntlayer', 'next-intlayer/server');\n\n recast.visit(ast, {\n visitExportDefaultDeclaration(path) {\n const declaration = path.node.declaration;\n if (\n n.Expression.check(declaration) &&\n !(\n n.CallExpression.check(declaration) &&\n n.Identifier.check(declaration.callee) &&\n declaration.callee.name === 'withIntlayer'\n )\n ) {\n path\n .get('declaration')\n .replace(\n b.callExpression(b.identifier('withIntlayer'), [declaration as any])\n );\n }\n return false;\n },\n visitAssignmentExpression(path) {\n const { left, right } = path.node;\n\n if (\n n.MemberExpression.check(left) &&\n recast.print(left).code === 'module.exports' &&\n !(\n n.CallExpression.check(right) &&\n n.Identifier.check(right.callee) &&\n right.callee.name === 'withIntlayer'\n )\n ) {\n path\n .get('right')\n .replace(b.callExpression(b.identifier('withIntlayer'), [right]));\n }\n return false;\n },\n });\n\n return recast.print(ast).code;\n};\n\n/**\n * Returns true when the expression looks like an Immediately Invoked Function\n * Expression (e.g. `(async () => { ... })()`). Such custom async exports cannot\n * be safely wrapped with the synchronous Metro helper, so they are skipped.\n */\nconst isImmediatelyInvokedFunction = (node: any): boolean =>\n n.CallExpression.check(node) &&\n (n.ArrowFunctionExpression.check(node.callee) ||\n n.FunctionExpression.check(node.callee));\n\n/**\n * Wraps a React Native Metro config's exported value with\n * `configMetroIntlayerSync` from `react-native-intlayer/metro`, injecting the\n * import. The synchronous helper is used because it wraps a plain config object\n * and needs no IIFE, making it safe to inject into existing configs without\n * restructuring them.\n *\n * Non-destructive: returns the content unchanged when the export is already\n * wrapped, when the Intlayer Metro plugin is already present, or when the export\n * is a custom async IIFE that cannot be wrapped synchronously. Callers should\n * compare the result with the input to detect the skipped case.\n */\nexport const updateMetroConfig = (\n content: string,\n extension: string\n): string => {\n if (content.includes('react-native-intlayer')) {\n return content;\n }\n\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n const isCJSFile =\n extension === 'cjs' ||\n (content.includes('module.exports') && !content.includes('import '));\n\n const wrapperName = 'configMetroIntlayerSync';\n\n const isWrappable = (node: any): boolean =>\n n.Expression.check(node) &&\n !isImmediatelyInvokedFunction(node) &&\n !(\n n.CallExpression.check(node) &&\n n.Identifier.check(node.callee) &&\n node.callee.name === wrapperName\n );\n\n let wrapped = false;\n\n recast.visit(ast, {\n visitExportDefaultDeclaration(path) {\n const declaration = path.node.declaration;\n if (isWrappable(declaration)) {\n path\n .get('declaration')\n .replace(\n b.callExpression(b.identifier(wrapperName), [declaration as any])\n );\n wrapped = true;\n }\n return false;\n },\n visitAssignmentExpression(path) {\n const { left, right } = path.node;\n\n if (\n n.MemberExpression.check(left) &&\n recast.print(left).code === 'module.exports' &&\n isWrappable(right)\n ) {\n path\n .get('right')\n .replace(b.callExpression(b.identifier(wrapperName), [right]));\n wrapped = true;\n }\n return false;\n },\n });\n\n // Only inject the import when an export was actually wrapped, so an\n // un-wrappable config is left completely untouched.\n if (!wrapped) {\n return content;\n }\n\n injectImport(ast, isCJSFile, wrapperName, 'react-native-intlayer/metro');\n\n return recast.print(ast).code;\n};\n\n/**\n * Builds the contents of a fresh `metro.config.js` wired with the Intlayer\n * Metro plugin. Uses the async `configMetroIntlayer` helper (which can build\n * dictionaries on server start) and picks the default-config source based on\n * whether the project is an Expo app.\n */\nexport const getMetroConfigTemplate = (isExpo: boolean): string => {\n const defaultConfigSource = isExpo\n ? 'expo/metro-config'\n : '@react-native/metro-config';\n\n return `const { getDefaultConfig } = require(\"${defaultConfigSource}\");\nconst { configMetroIntlayer } = require(\"react-native-intlayer/metro\");\n\nmodule.exports = (async () => {\n const defaultConfig = getDefaultConfig(__dirname);\n\n return await configMetroIntlayer(defaultConfig);\n})();\n`;\n};\n\nexport const updateNuxtConfig = (content: string): string => {\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n const updateConfigObject = (objExpr: any) => {\n if (\n !objExpr ||\n (objExpr.type !== 'ObjectExpression' &&\n !n.ObjectExpression.check(objExpr))\n )\n return;\n\n let modulesProp = objExpr.properties.find((p: any) => {\n if (!p?.key) return false;\n const keyName = p.key.name || p.key.value;\n return keyName === 'modules';\n }) as any;\n\n if (!modulesProp) {\n modulesProp = b.property(\n 'init',\n b.identifier('modules'),\n b.arrayExpression([])\n );\n objExpr.properties.push(modulesProp);\n }\n\n const modulesValue = modulesProp.value;\n\n if (\n modulesValue &&\n (modulesValue.type === 'ArrayExpression' ||\n n.ArrayExpression.check(modulesValue))\n ) {\n const hasModule = modulesValue.elements.some((el: any) => {\n if (\n n.StringLiteral.check(el) ||\n el.type === 'StringLiteral' ||\n el.type === 'Literal'\n ) {\n return (el.value || el.extra?.rawValue) === 'nuxt-intlayer';\n }\n return false;\n });\n\n if (!hasModule) {\n modulesValue.elements.push(b.stringLiteral('nuxt-intlayer'));\n }\n }\n };\n\n genericRecastVisit(ast, updateConfigObject, ['defineNuxtConfig']);\n\n return recast.print(ast).code;\n};\n\n/**\n * Updates a Vite config for vue-i18n compat: injects `vueI18nVitePlugin` from\n * `@intlayer/vue-i18n/plugin` into the plugins array.\n */\nexport const updateViteConfigForVueI18n = (\n content: string,\n extension: string\n): string => {\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n const isCJSFile =\n extension === 'cjs' ||\n (content.includes('module.exports') && !content.includes('import '));\n\n injectImport(\n ast,\n isCJSFile,\n 'vueI18nVitePlugin',\n '@intlayer/vue-i18n/plugin'\n );\n\n genericRecastVisit(ast, (obj) =>\n updatePluginArray(obj, 'plugins', 'vueI18nVitePlugin')\n );\n\n return recast.print(ast).code;\n};\n\n/**\n * Generic vite config updater for any compat plugin that uses alias injection.\n * Injects the named import from `pluginPackageSource` and appends the plugin\n * call to the `plugins` array.\n */\nexport const updateViteConfigForCompatPlugin = (\n content: string,\n extension: string,\n pluginConfig: CompatVitePluginConfig\n): string => {\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n const isCJSFile =\n extension === 'cjs' ||\n (content.includes('module.exports') && !content.includes('import '));\n\n injectImport(\n ast,\n isCJSFile,\n pluginConfig.pluginFunctionName,\n pluginConfig.pluginPackageSource\n );\n\n genericRecastVisit(ast, (obj) =>\n updatePluginArray(obj, 'plugins', pluginConfig.pluginFunctionName)\n );\n\n return recast.print(ast).code;\n};\n\n/**\n * Rewrites the module source of an existing named import in a vite config,\n * keeping the imported binding and its call site untouched. Used when a compat\n * plugin is a drop-in replacement for an i18n library's own vite plugin — e.g.\n * lingui: `import { lingui } from \"@lingui/vite-plugin\"` becomes\n * `import { lingui } from \"@intlayer/lingui/plugin\"`, leaving `lingui()` in the\n * `plugins` array as-is. Returns the content unchanged when no matching import\n * is found.\n */\nexport const replaceViteConfigPluginImportSource = (\n content: string,\n importName: string,\n fromPackageSource: string,\n toPackageSource: string\n): string => {\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n let changed = false;\n\n recast.visit(ast, {\n visitImportDeclaration(path) {\n const { source, specifiers } = path.node;\n const importsBinding = (specifiers ?? []).some(\n (specifier) =>\n n.ImportSpecifier.check(specifier) &&\n specifier.imported.name === importName\n );\n\n if (\n n.StringLiteral.check(source) &&\n source.value === fromPackageSource &&\n importsBinding\n ) {\n source.value = toPackageSource;\n changed = true;\n }\n\n return false;\n },\n });\n\n if (!changed) return content;\n return recast.print(ast).code;\n};\n\n/**\n * Generic Next.js config wrapper for compat plugins. Injects the import and\n * wraps the default export / `module.exports` with a HOC call.\n */\nconst wrapNextConfigWithHoc = (\n content: string,\n extension: string,\n hocFunctionName: string,\n pluginPackageSource: string\n): string => {\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n const isCJSFile = extension === 'cjs' || content.includes('module.exports');\n\n injectImport(ast, isCJSFile, hocFunctionName, pluginPackageSource);\n\n recast.visit(ast, {\n visitExportDefaultDeclaration(path) {\n const declaration = path.node.declaration;\n if (\n n.Expression.check(declaration) &&\n !(\n n.CallExpression.check(declaration) &&\n n.Identifier.check(declaration.callee) &&\n declaration.callee.name === hocFunctionName\n )\n ) {\n path\n .get('declaration')\n .replace(\n b.callExpression(b.identifier(hocFunctionName), [\n declaration as any,\n ])\n );\n }\n return false;\n },\n visitAssignmentExpression(path) {\n const { left, right } = path.node;\n\n if (\n n.MemberExpression.check(left) &&\n recast.print(left).code === 'module.exports' &&\n !(\n n.CallExpression.check(right) &&\n n.Identifier.check(right.callee) &&\n right.callee.name === hocFunctionName\n )\n ) {\n path\n .get('right')\n .replace(b.callExpression(b.identifier(hocFunctionName), [right]));\n }\n return false;\n },\n });\n\n return recast.print(ast).code;\n};\n\n/**\n * Updates a Next.js config for next-translate compat: wraps the default export\n * with `withNextTranslate` from `@intlayer/next-translate/plugin`.\n */\nexport const updateNextConfigForNextTranslate = (\n content: string,\n extension: string\n): string =>\n wrapNextConfigWithHoc(\n content,\n extension,\n 'withNextTranslate',\n '@intlayer/next-translate/plugin'\n );\n\n/**\n * Updates a Nuxt config for nuxtjs-i18n compat: adds `@intlayer/nuxtjs-i18n`\n * to the `modules` array.\n */\nexport const updateNuxtConfigForNuxtjsI18n = (content: string): string => {\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n const updateConfigObject = (objExpr: any) => {\n if (\n !objExpr ||\n (objExpr.type !== 'ObjectExpression' &&\n !n.ObjectExpression.check(objExpr))\n )\n return;\n\n let modulesProp = (objExpr.properties as any[]).find((p: any) => {\n if (!p?.key) return false;\n const keyName = p.key.name || p.key.value;\n return keyName === 'modules';\n }) as any;\n\n if (!modulesProp) {\n modulesProp = b.property(\n 'init',\n b.identifier('modules'),\n b.arrayExpression([])\n );\n (objExpr.properties as any[]).push(modulesProp);\n }\n\n const modulesValue = modulesProp.value;\n\n if (\n modulesValue &&\n (modulesValue.type === 'ArrayExpression' ||\n n.ArrayExpression.check(modulesValue))\n ) {\n const hasModule = (modulesValue.elements as any[]).some((el: any) => {\n if (\n n.StringLiteral.check(el) ||\n el.type === 'StringLiteral' ||\n el.type === 'Literal'\n ) {\n return (el.value ?? el.extra?.rawValue) === '@intlayer/nuxtjs-i18n';\n }\n return false;\n });\n\n if (!hasModule) {\n (modulesValue.elements as any[]).push(\n b.stringLiteral('@intlayer/nuxtjs-i18n')\n );\n }\n }\n };\n\n genericRecastVisit(ast, updateConfigObject, ['defineNuxtConfig']);\n\n return recast.print(ast).code;\n};\n\n/**\n * Updates a Next.js config for next-i18next compat: wraps the default export\n * with `withI18next` from `@intlayer/next-i18next/plugin`.\n */\nexport const updateNextConfigForNextI18next = (\n content: string,\n extension: string\n): string =>\n wrapNextConfigWithHoc(\n content,\n extension,\n 'withI18next',\n '@intlayer/next-i18next/plugin'\n );\n\n/**\n * Updates a Next.js config for next-intl compat: replaces any existing\n * `next-intl/plugin` import source with `@intlayer/next-intl/plugin`, or\n * injects `createNextIntlPlugin` with a factory-call wrapper when no such\n * import is present.\n */\nexport const updateNextConfigForNextIntl = (\n content: string,\n extension: string\n): string => {\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n const isCJSFile = extension === 'cjs' || content.includes('module.exports');\n let replacedExistingSource = false;\n\n // Replace 'next-intl/plugin' import source with the compat package.\n recast.visit(ast, {\n visitImportDeclaration(path) {\n if (path.node.source.value === 'next-intl/plugin') {\n path.node.source = b.stringLiteral('@intlayer/next-intl/plugin');\n replacedExistingSource = true;\n }\n return false;\n },\n });\n\n if (replacedExistingSource) {\n return recast.print(ast).code;\n }\n\n // No existing next-intl/plugin import: check whether createNextIntlPlugin is\n // already present from any source before injecting the full factory pattern.\n const hasCreatePlugin = (ast.program.body as any[]).some((stmt: any) => {\n if (!n.ImportDeclaration.check(stmt)) return false;\n return (stmt.specifiers ?? []).some(\n (spec: any) =>\n (n.ImportSpecifier.check(spec) &&\n spec.imported.name === 'createNextIntlPlugin') ||\n (n.ImportDefaultSpecifier.check(spec) &&\n spec.local?.name === 'createNextIntlPlugin')\n );\n });\n\n if (hasCreatePlugin) {\n return recast.print(ast).code;\n }\n\n // Inject the import.\n injectImport(\n ast,\n isCJSFile,\n 'createNextIntlPlugin',\n '@intlayer/next-intl/plugin'\n );\n\n // Insert a factory-call variable declaration after the last import.\n const lastImportIndex = (ast.program.body as any[]).reduce(\n (lastIndex: number, stmt: any, index: number) => {\n if (n.ImportDeclaration.check(stmt)) return index;\n return lastIndex;\n },\n -1\n );\n\n const factoryCallDeclaration = b.variableDeclaration('const', [\n b.variableDeclarator(\n b.identifier('_withNextIntlayer'),\n b.callExpression(b.identifier('createNextIntlPlugin'), [])\n ),\n ]);\n\n (ast.program.body as any[]).splice(\n lastImportIndex + 1,\n 0,\n factoryCallDeclaration\n );\n\n // Wrap the default export with _withNextIntlayer(...).\n recast.visit(ast, {\n visitExportDefaultDeclaration(path) {\n const declaration = path.node.declaration;\n if (\n n.Expression.check(declaration) &&\n !(\n n.CallExpression.check(declaration) &&\n n.Identifier.check(declaration.callee) &&\n declaration.callee.name === '_withNextIntlayer'\n )\n ) {\n path\n .get('declaration')\n .replace(\n b.callExpression(b.identifier('_withNextIntlayer'), [\n declaration as any,\n ])\n );\n }\n return false;\n },\n visitAssignmentExpression(path) {\n const { left, right } = path.node;\n\n if (\n n.MemberExpression.check(left) &&\n recast.print(left).code === 'module.exports' &&\n !(\n n.CallExpression.check(right) &&\n n.Identifier.check(right.callee) &&\n right.callee.name === '_withNextIntlayer'\n )\n ) {\n path\n .get('right')\n .replace(\n b.callExpression(b.identifier('_withNextIntlayer'), [right])\n );\n }\n return false;\n },\n });\n\n return recast.print(ast).code;\n};\n\n/** The sync plugin used to ingest a compat library's catalogs. */\ntype SyncPluginInfo = {\n /** Called function name, e.g. `'syncJSON'`. */\n functionName: string;\n /** Package the function is imported from. */\n packageSource: string;\n};\n\n/** Resolves the sync plugin (function + package) for a compat sync config. */\nconst getSyncPluginInfo = (syncConfig: CompatSyncConfig): SyncPluginInfo =>\n syncConfig.plugin === 'po'\n ? { functionName: 'syncPO', packageSource: '@intlayer/sync-po-plugin' }\n : { functionName: 'syncJSON', packageSource: '@intlayer/sync-json-plugin' };\n\n/**\n * Parses a `syncJSON({ ... })` / `syncPO({ ... })` call expression from a source\n * snippet so it can be injected into a config AST without manually constructing\n * template-literal nodes via builders.\n *\n * The destructuring parameters adapt to whether the source template uses the\n * `key` placeholder (nested pattern) or only `locale` (flat pattern).\n *\n * For `syncJSON` every option is emitted explicitly — `source`, then `format`\n * and `splitKeys` — each preceded by an explanatory JSDoc block, so the\n * generated config self-documents the two knobs a user is most likely to tweak.\n * `syncPO` takes neither `format` (gettext is always the serialization) nor\n * `splitKeys`, so it keeps a bare `source`-only call.\n */\nconst buildSyncCallNode = (syncConfig: CompatSyncConfig): any => {\n const { functionName } = getSyncPluginInfo(syncConfig);\n const usesKey = syncConfig.sourceTemplate.includes('${key}');\n const paramDestructuring = !usesKey\n ? '{ locale }'\n : // `icu` (and PO, which is ICU-dialect) reads `{ key, locale }`; the\n // i18next/vue-i18n JSON dialects keep their established `{ locale, key }`.\n syncConfig.format === 'icu' || syncConfig.plugin === 'po'\n ? '{ key, locale }'\n : '{ locale, key }';\n\n // The sourceTemplate contains ${locale} / ${key} as literal characters;\n // they become proper template expressions once the snippet is parsed by recast.\n const sourceProperty = `source: (${paramDestructuring}) => \\`${syncConfig.sourceTemplate}\\``;\n\n const parseSnippet = (snippet: string): any => {\n const snippetAst = recast.parse(snippet, {\n parser: typescriptParser,\n });\n return (snippetAst.program.body[0] as any).expression;\n };\n\n // `syncPO` always serializes gettext, so it exposes neither `format` nor\n // `splitKeys`: emit a bare `source`-only call.\n if (syncConfig.plugin === 'po') {\n return parseSnippet(`${functionName}({ ${sourceProperty} })`);\n }\n\n // `splitKeys: true` is forced only for the single-file namespace model\n // (next-intl / use-intl); every other library keeps a single dictionary per\n // file. It is now written explicitly (rather than relying on syncJSON's\n // auto-detection) so the generated config documents the choice.\n const splitKeys = Boolean(syncConfig.splitKeys);\n\n // The JSDoc blocks are embedded in the snippet and preserved by recast when\n // the parsed call node is printed back into the config AST.\n const snippet = `${functionName}({\n ${sourceProperty},\n\n /**\n * Parsing of json respecting the syntax\n * Default \\`'intlayer'\\` message format\n */\n format: '${syncConfig.format}',\n\n /**\n * \\`true\\`:\n * \\`en.json\\` -> \\`useTranslation('home')\\` -> \\`t(\"title\")\\`\n *\n * \\`false\\`:\n * \\`en.json\\` -> \\`useTranslation()\\` -> \\`t(\"home.title\")\\`\n */\n splitKeys: ${splitKeys},\n})`;\n\n return parseSnippet(snippet);\n};\n\n/**\n * Injects or ensures `dictionary: { format: '<value>' }` exists in an object\n * expression. Leaves any pre-existing `dictionary` properties untouched —\n * only the `format` sub-property is added when absent.\n */\nconst injectDictionaryFormat = (objExpr: any, format: string): void => {\n if (\n !objExpr ||\n (objExpr.type !== 'ObjectExpression' && !n.ObjectExpression.check(objExpr))\n )\n return;\n\n let dictionaryProp = (objExpr.properties as any[]).find((prop: any) => {\n if (!prop?.key) return false;\n return (prop.key.name ?? prop.key.value) === 'dictionary';\n });\n\n if (!dictionaryProp) {\n dictionaryProp = b.property(\n 'init',\n b.identifier('dictionary'),\n b.objectExpression([])\n );\n (objExpr.properties as any[]).push(dictionaryProp);\n }\n\n const dictionaryObj = dictionaryProp.value;\n if (\n !dictionaryObj ||\n (dictionaryObj.type !== 'ObjectExpression' &&\n !n.ObjectExpression.check(dictionaryObj))\n )\n return;\n\n const hasFormat = (dictionaryObj.properties as any[]).some((prop: any) => {\n if (!prop?.key) return false;\n return (prop.key.name ?? prop.key.value) === 'format';\n });\n\n if (!hasFormat) {\n (dictionaryObj.properties as any[]).push(\n b.property('init', b.identifier('format'), b.stringLiteral(format))\n );\n }\n};\n\n/**\n * Injects the sync plugin import (`syncJSON` / `syncPO`) and a configured\n * `syncJSON(...)` / `syncPO(...)` call into the plugins array of an intlayer\n * config file. Idempotent: skips when the plugin call is already present.\n */\nexport const updateIntlayerConfigWithSyncPlugin = (\n content: string,\n extension: string,\n syncConfig: CompatSyncConfig\n): string => {\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n const isCJSFile = extension === 'cjs' || content.includes('module.exports');\n\n const { functionName, packageSource } = getSyncPluginInfo(syncConfig);\n\n injectImport(ast, isCJSFile, functionName, packageSource);\n\n const callNode = buildSyncCallNode(syncConfig);\n\n // PO catalogs are serialized as gettext; JSON catalogs carry the dialect.\n const dictionaryFormat =\n syncConfig.plugin === 'po' ? 'po' : syncConfig.format;\n\n genericRecastVisit(ast, (objExpr) => {\n if (\n !objExpr ||\n (objExpr.type !== 'ObjectExpression' &&\n !n.ObjectExpression.check(objExpr))\n )\n return;\n\n // Inject dictionary.format alongside the plugin so intlayer knows how to\n // interpret dictionary content at runtime.\n injectDictionaryFormat(objExpr, dictionaryFormat);\n\n let pluginsProp = (objExpr.properties as any[]).find((prop: any) => {\n if (!prop?.key) return false;\n const keyName = prop.key.name ?? prop.key.value;\n return keyName === 'plugins';\n });\n\n if (!pluginsProp) {\n pluginsProp = b.property(\n 'init',\n b.identifier('plugins'),\n b.arrayExpression([])\n );\n (objExpr.properties as any[]).push(pluginsProp);\n }\n\n const arrayValue = pluginsProp.value;\n\n if (\n arrayValue &&\n (arrayValue.type === 'ArrayExpression' ||\n n.ArrayExpression.check(arrayValue))\n ) {\n const hasSyncPlugin = (arrayValue.elements as any[]).some(\n (element: any) => {\n const callee = element?.callee;\n if (!callee) return false;\n const name: string = callee.name ?? callee.id?.name;\n return name === functionName;\n }\n );\n\n if (!hasSyncPlugin) {\n (arrayValue.elements as any[]).push(callNode);\n }\n }\n });\n\n return recast.print(ast).code;\n};\n"],"mappings":";;;;;;;;AASA,MAAM,EAAE,UAAU,GAAG,YAAY,MAAM,OAAO;;AAM9C,MAAM,sBAAsB,SAC1B,QAAQ,IAAI,MACX,KAAK,SAAS,sBAAsB,EAAE,iBAAiB,MAAM,IAAI;;;;;;AAOpE,MAAM,wBACJ,SACA,KACA,qBACQ;CACR,IAAI,WAAY,QAAQ,WAAqB,MAAM,SAAc;EAC/D,IAAI,CAAC,MAAM,KAAK,OAAO;EACvB,QAAQ,KAAK,IAAI,QAAQ,KAAK,IAAI,WAAW;CAC/C,CAAC;CAED,IAAI,CAAC,UAAU;EACb,WAAW,EAAE,SAAS,QAAQ,EAAE,WAAW,GAAG,GAAG,gBAAgB;EACjE,AAAC,QAAQ,WAAqB,KAAK,QAAQ;CAC7C;CAEA,OAAO;AACT;;;;;;AAOA,MAAM,0BACJ,SACA,KACA,cACS;CACT,MAAM,WAAY,QAAQ,WAAqB,MAAM,SAAc;EACjE,IAAI,CAAC,MAAM,KAAK,OAAO;EACvB,QAAQ,KAAK,IAAI,QAAQ,KAAK,IAAI,WAAW;CAC/C,CAAC;CAED,IAAI,UAAU;EACZ,SAAS,QAAQ;EACjB;CACF;CAEA,AAAC,QAAQ,WAAqB,KAC5B,EAAE,SAAS,QAAQ,EAAE,WAAW,GAAG,GAAG,SAAS,CACjD;AACF;;;;;AAMA,MAAM,2BACJ,SACA,KACA,WACS;CAMT,IALqB,QAAQ,WAAqB,MAAM,SAAc;EACpE,IAAI,CAAC,MAAM,KAAK,OAAO;EACvB,QAAQ,KAAK,IAAI,QAAQ,KAAK,IAAI,WAAW;CAC/C,CAEc,GAAG;CAEjB,AAAC,QAAQ,WAAqB,KAC5B,EAAE,SACA,QACA,EAAE,WAAW,GAAG,GAChB,EAAE,iBACA,EAAE,iBAAiB,EAAE,WAAW,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC,GAC/D,EAAE,WAAW,MAAM,CACrB,CACF,CACF;AACF;;;;;;;;AASA,MAAa,gCACX,SACA,WACA,SACW;CACX,IAAI,cAAc,QAChB,OAAO,QAAQ,QACb,6EACA,MAAM,KAAK,EACb;CAGF,MAAM,MAAM,OAAO,MAAM,SAAS,EAChC,QAAQA,2CACV,CAAC;CAED,mBAAmB,MAAM,YAAY;EACnC,IAAI,CAAC,mBAAmB,OAAO,GAAG;EAElC,MAAM,kBAAkB,qBACtB,SACA,WACA,EAAE,iBAAiB,CAAC,CAAC,CACvB;EAEA,IAAI,CAAC,mBAAmB,gBAAgB,KAAK,GAAG;EAEhD,uBACE,gBAAgB,OAChB,QACA,EAAE,cAAc,IAAI,CACtB;CACF,CAAC;CAED,OAAO,OAAO,MAAM,GAAG,CAAC,CAAC;AAC3B;;;;;;;;;AAUA,MAAa,mCACX,SACA,WACA,mBACW;CACX,IAAI,cAAc,QAAQ;EACxB,MAAM,SAAS,KAAK,MAAM,OAAO;EACjC,OAAO,WAAW;GAAE,GAAG,OAAO;GAAU,QAAQ;EAAe;EAC/D,OAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;CACvC;CAEA,MAAM,MAAM,OAAO,MAAM,SAAS,EAChC,QAAQA,2CACV,CAAC;CAED,mBAAmB,MAAM,YAAY;EACnC,IAAI,CAAC,mBAAmB,OAAO,GAAG;EAElC,MAAM,mBAAmB,qBACvB,SACA,YACA,EAAE,iBAAiB,CAAC,CAAC,CACvB;EAEA,IAAI,CAAC,mBAAmB,iBAAiB,KAAK,GAAG;EAEjD,uBACE,iBAAiB,OACjB,UACA,EAAE,cAAc,cAAc,CAChC;CACF,CAAC;CAED,OAAO,OAAO,MAAM,GAAG,CAAC,CAAC;AAC3B;;;;;;;;;AAUA,MAAa,8BAA8B,YAA4B;CACrE,MAAM,MAAM,OAAO,MAAM,SAAS,EAChC,QAAQA,2CACV,CAAC;CAED,mBAAmB,MAAM,YAAY;EACnC,IAAI,CAAC,mBAAmB,OAAO,GAAG;EAElC,MAAM,iBAAiB,qBACrB,SACA,UACA,EAAE,iBAAiB,CAAC,CAAC,CACvB;EAEA,IAAI,CAAC,mBAAmB,eAAe,KAAK,GAAG;EAE/C,MAAM,eAAe,eAAe;EAEpC,uBAAuB,cAAc,WAAW,EAAE,eAAe,IAAI,CAAC;EACtE,wBAAwB,cAAc,YAAY,oBAAoB;EACtE,wBACE,cACA,gBACA,wBACF;CACF,CAAC;CAED,OAAO,OAAO,MAAM,GAAG,CAAC,CAAC;AAC3B;AAEA,MAAM,gBACJ,KACA,OACA,YACA,WACG;CAGH,IAAI,CAAC,SAASC,mDAAqB,KAAK,UAAU,GAAG;CA+BrD,IA7Ba,IAAI,QAAQ,KACF,MAAM,SAAc;EACzC,IAAI,OACF,OACE,EAAE,oBAAoB,MAAM,IAAI,KAChC,KAAK,aAAa,MACf,SACC,EAAE,mBAAmB,MAAM,IAAI,KAC/B,EAAE,eAAe,MAAM,KAAK,IAAI,KAChC,EAAE,WAAW,MAAM,KAAK,KAAK,MAAM,KACnC,KAAK,KAAK,OAAO,SAAS,aAC1B,EAAE,cAAc,MAAM,KAAK,KAAK,UAAU,EAAE,KAC5C,KAAK,KAAK,UAAU,EAAE,CAAC,UAAU,MACrC;EAGJ,OACE,EAAE,kBAAkB,MAAM,IAAI,MAC7B,KAAK,OAAO,UAAU,UACrB,KAAK,YAAY,MACd,SACE,EAAE,gBAAgB,MAAM,IAAI,KAC3B,KAAK,SAAS,SAAS,cACxB,EAAE,uBAAuB,MAAM,IAAI,KAClC,KAAK,OAAO,SAAS,UAC3B;CAEN,CAEY,GAAG;CAEf,MAAM,cAAc,QAChB,EAAE,oBAAoB,SAAS,CAC7B,EAAE,mBACA,EAAE,WAAW,KAAK,WAAW,GAAG,GAChC,EAAE,eAAe,EAAE,WAAW,SAAS,GAAG,CAAC,EAAE,cAAc,MAAM,CAAC,CAAC,CACrE,CACF,CAAC,IACD,EAAE,kBACA,CAAC,EAAE,gBAAgB,EAAE,WAAW,UAAU,CAAC,CAAC,GAC5C,EAAE,cAAc,MAAM,CACxB;CAEJ,IAAI,QAAQ,KAAK,QAAQ,WAAW;AACtC;AAEA,MAAM,qBACJ,SACA,cACA,eACG;CACH,IACE,CAAC,WACA,QAAQ,SAAS,sBAAsB,CAAC,EAAE,iBAAiB,MAAM,OAAO,GAEzE;CAEF,IAAI,OAAO,QAAQ,WAAW,MAAM,MAAW;EAC7C,IAAI,CAAC,GAAG,KAAK,OAAO;EAEpB,QADgB,EAAE,IAAI,QAAQ,EAAE,IAAI,WACjB;CACrB,CAAC;CAED,IAAI,CAAC,MAAM;EACT,OAAO,EAAE,SACP,QACA,EAAE,WAAW,YAAY,GACzB,EAAE,gBAAgB,CAAC,CAAC,CACtB;EACA,QAAQ,WAAW,KAAK,IAAI;CAC9B;CAEA,MAAM,aAAa,KAAK;CAExB,IACE,eACC,WAAW,SAAS,qBACnB,EAAE,gBAAgB,MAAM,UAAU,IASpC;MAAI,CAPc,WAAW,SAAS,MAAM,OAAY;GACtD,MAAM,SAAS,IAAI;GACnB,IAAI,CAAC,QAAQ,OAAO;GACpB,MAAM,OAAO,OAAO,QAAQ,OAAO,IAAI;GACvC,OAAO,SAAS,cAAc,SAAS;EACzC,CAEa,GACX,WAAW,SAAS,KAAK,EAAE,eAAe,EAAE,WAAW,UAAU,GAAG,CAAC,CAAC,CAAC;CACzE;AAEJ;AAEA,MAAM,sBACJ,KACA,oBACA,YAAsB,CAAC,cAAc,MAClC;;;;;;CAMH,MAAM,2BAA2B,SAAiB;EAChD,IAAI,QAAQ,KAAK,SAAS,SAAc;GACtC,IAAI,EAAE,oBAAoB,MAAM,IAAI,GAClC,KAAK,aAAa,SAAS,UAAe;IACxC,IACE,EAAE,mBAAmB,MAAM,KAAK,KAChC,EAAE,WAAW,MAAM,MAAM,EAAE,KAC3B,MAAM,GAAG,SAAS,QAClB,EAAE,iBAAiB,MAAM,MAAM,IAAI,GAEnC,mBAAmB,MAAM,IAAI;GAEjC,CAAC;EAEL,CAAC;CACH;CAEA,OAAO,MAAM,KAAK;EAChB,8BAA8B,MAAM;GAClC,MAAM,OAAO,KAAK,KAAK;GAEvB,IAAI,EAAE,iBAAiB,MAAM,IAAI,GAC/B,mBAAmB,IAAI;QAClB,IACL,EAAE,eAAe,MAAM,IAAI,KAC3B,EAAE,WAAW,MAAM,KAAK,MAAM,KAC9B,UAAU,SAAS,KAAK,OAAO,IAAI,GAEnC;QAAI,EAAE,iBAAiB,MAAM,KAAK,UAAU,EAAE,GAC5C,mBAAmB,KAAK,UAAU,EAAE;GACtC,OACK,IAAI,EAAE,WAAW,MAAM,IAAI,GAChC,wBAAwB,KAAK,IAAI;GAEnC,OAAO;EACT;EACA,0BAA0B,MAAM;GAC9B,MAAM,EAAE,MAAM,UAAU,KAAK;GAE7B,IACE,EAAE,iBAAiB,MAAM,IAAI,KAC7B,OAAO,MAAM,IAAI,CAAC,CAAC,SAAS,kBAE5B;QAAI,EAAE,iBAAiB,MAAM,KAAK,GAChC,mBAAmB,KAAK;SACnB,IACL,EAAE,eAAe,MAAM,KAAK,KAC5B,EAAE,WAAW,MAAM,MAAM,MAAM,KAC/B,UAAU,SAAS,MAAM,OAAO,IAAI,GAEpC;SAAI,EAAE,iBAAiB,MAAM,MAAM,UAAU,EAAE,GAC7C,mBAAmB,MAAM,UAAU,EAAE;IACvC,OACK,IAAI,EAAE,WAAW,MAAM,KAAK,GACjC,wBAAwB,MAAM,IAAI;GACpC;GAEF,OAAO;EACT;CACF,CAAC;AACH;;;;;;;;AASA,MAAa,yBAAyB,YACpC,QAAQ,SAAS,eAAe,KAChC,4BAA4B,KAAK,OAAO;AAE1C,MAAa,oBACX,SACA,cACW;CACX,MAAM,MAAM,OAAO,MAAM,SAAS,EAChC,QAAQD,2CACV,CAAC;CAED,MAAM,YACJ,cAAc,SACb,QAAQ,SAAS,gBAAgB,KAAK,CAAC,QAAQ,SAAS,SAAS;CAEpE,aAAa,KAAK,WAAW,YAAY,eAAe;CAExD,mBAAmB,MAAM,QACvB,kBAAkB,KAAK,WAAW,UAAU,CAC9C;CAEA,OAAO,OAAO,MAAM,GAAG,CAAC,CAAC;AAC3B;AAEA,MAAa,qBACX,SACA,cACW;CACX,MAAM,MAAM,OAAO,MAAM,SAAS,EAChC,QAAQA,2CACV,CAAC;CAED,MAAM,YACJ,cAAc,SACb,QAAQ,SAAS,gBAAgB,KAAK,CAAC,QAAQ,SAAS,SAAS;CAEpE,aAAa,KAAK,WAAW,YAAY,gBAAgB;CAEzD,mBAAmB,MAAM,QACvB,kBAAkB,KAAK,gBAAgB,UAAU,CACnD;CAEA,OAAO,OAAO,MAAM,GAAG,CAAC,CAAC;AAC3B;AAEA,MAAa,oBACX,SACA,cACW;CACX,MAAM,MAAM,OAAO,MAAM,SAAS,EAChC,QAAQA,2CACV,CAAC;CAED,MAAM,YAAY,cAAc,SAAS,QAAQ,SAAS,gBAAgB;CAE1E,aAAa,KAAK,WAAW,gBAAgB,sBAAsB;CAEnE,OAAO,MAAM,KAAK;EAChB,8BAA8B,MAAM;GAClC,MAAM,cAAc,KAAK,KAAK;GAC9B,IACE,EAAE,WAAW,MAAM,WAAW,KAC9B,EACE,EAAE,eAAe,MAAM,WAAW,KAClC,EAAE,WAAW,MAAM,YAAY,MAAM,KACrC,YAAY,OAAO,SAAS,iBAG9B,KACG,IAAI,aAAa,CAAC,CAClB,QACC,EAAE,eAAe,EAAE,WAAW,cAAc,GAAG,CAAC,WAAkB,CAAC,CACrE;GAEJ,OAAO;EACT;EACA,0BAA0B,MAAM;GAC9B,MAAM,EAAE,MAAM,UAAU,KAAK;GAE7B,IACE,EAAE,iBAAiB,MAAM,IAAI,KAC7B,OAAO,MAAM,IAAI,CAAC,CAAC,SAAS,oBAC5B,EACE,EAAE,eAAe,MAAM,KAAK,KAC5B,EAAE,WAAW,MAAM,MAAM,MAAM,KAC/B,MAAM,OAAO,SAAS,iBAGxB,KACG,IAAI,OAAO,CAAC,CACZ,QAAQ,EAAE,eAAe,EAAE,WAAW,cAAc,GAAG,CAAC,KAAK,CAAC,CAAC;GAEpE,OAAO;EACT;CACF,CAAC;CAED,OAAO,OAAO,MAAM,GAAG,CAAC,CAAC;AAC3B;;;;;;AAOA,MAAM,gCAAgC,SACpC,EAAE,eAAe,MAAM,IAAI,MAC1B,EAAE,wBAAwB,MAAM,KAAK,MAAM,KAC1C,EAAE,mBAAmB,MAAM,KAAK,MAAM;;;;;;;;;;;;;AAc1C,MAAa,qBACX,SACA,cACW;CACX,IAAI,QAAQ,SAAS,uBAAuB,GAC1C,OAAO;CAGT,MAAM,MAAM,OAAO,MAAM,SAAS,EAChC,QAAQA,2CACV,CAAC;CAED,MAAM,YACJ,cAAc,SACb,QAAQ,SAAS,gBAAgB,KAAK,CAAC,QAAQ,SAAS,SAAS;CAEpE,MAAM,cAAc;CAEpB,MAAM,eAAe,SACnB,EAAE,WAAW,MAAM,IAAI,KACvB,CAAC,6BAA6B,IAAI,KAClC,EACE,EAAE,eAAe,MAAM,IAAI,KAC3B,EAAE,WAAW,MAAM,KAAK,MAAM,KAC9B,KAAK,OAAO,SAAS;CAGzB,IAAI,UAAU;CAEd,OAAO,MAAM,KAAK;EAChB,8BAA8B,MAAM;GAClC,MAAM,cAAc,KAAK,KAAK;GAC9B,IAAI,YAAY,WAAW,GAAG;IAC5B,KACG,IAAI,aAAa,CAAC,CAClB,QACC,EAAE,eAAe,EAAE,WAAW,WAAW,GAAG,CAAC,WAAkB,CAAC,CAClE;IACF,UAAU;GACZ;GACA,OAAO;EACT;EACA,0BAA0B,MAAM;GAC9B,MAAM,EAAE,MAAM,UAAU,KAAK;GAE7B,IACE,EAAE,iBAAiB,MAAM,IAAI,KAC7B,OAAO,MAAM,IAAI,CAAC,CAAC,SAAS,oBAC5B,YAAY,KAAK,GACjB;IACA,KACG,IAAI,OAAO,CAAC,CACZ,QAAQ,EAAE,eAAe,EAAE,WAAW,WAAW,GAAG,CAAC,KAAK,CAAC,CAAC;IAC/D,UAAU;GACZ;GACA,OAAO;EACT;CACF,CAAC;CAID,IAAI,CAAC,SACH,OAAO;CAGT,aAAa,KAAK,WAAW,aAAa,6BAA6B;CAEvE,OAAO,OAAO,MAAM,GAAG,CAAC,CAAC;AAC3B;;;;;;;AAQA,MAAa,0BAA0B,WAA4B;CAKjE,OAAO,yCAJqB,SACxB,sBACA,6BAEgE;;;;;;;;;AAStE;AAEA,MAAa,oBAAoB,YAA4B;CAC3D,MAAM,MAAM,OAAO,MAAM,SAAS,EAChC,QAAQA,2CACV,CAAC;CAED,MAAM,sBAAsB,YAAiB;EAC3C,IACE,CAAC,WACA,QAAQ,SAAS,sBAChB,CAAC,EAAE,iBAAiB,MAAM,OAAO,GAEnC;EAEF,IAAI,cAAc,QAAQ,WAAW,MAAM,MAAW;GACpD,IAAI,CAAC,GAAG,KAAK,OAAO;GAEpB,QADgB,EAAE,IAAI,QAAQ,EAAE,IAAI,WACjB;EACrB,CAAC;EAED,IAAI,CAAC,aAAa;GAChB,cAAc,EAAE,SACd,QACA,EAAE,WAAW,SAAS,GACtB,EAAE,gBAAgB,CAAC,CAAC,CACtB;GACA,QAAQ,WAAW,KAAK,WAAW;EACrC;EAEA,MAAM,eAAe,YAAY;EAEjC,IACE,iBACC,aAAa,SAAS,qBACrB,EAAE,gBAAgB,MAAM,YAAY,IAatC;OAAI,CAXc,aAAa,SAAS,MAAM,OAAY;IACxD,IACE,EAAE,cAAc,MAAM,EAAE,KACxB,GAAG,SAAS,mBACZ,GAAG,SAAS,WAEZ,QAAQ,GAAG,SAAS,GAAG,OAAO,cAAc;IAE9C,OAAO;GACT,CAEa,GACX,aAAa,SAAS,KAAK,EAAE,cAAc,eAAe,CAAC;EAC7D;CAEJ;CAEA,mBAAmB,KAAK,oBAAoB,CAAC,kBAAkB,CAAC;CAEhE,OAAO,OAAO,MAAM,GAAG,CAAC,CAAC;AAC3B;;;;;AAMA,MAAa,8BACX,SACA,cACW;CACX,MAAM,MAAM,OAAO,MAAM,SAAS,EAChC,QAAQA,2CACV,CAAC;CAED,MAAM,YACJ,cAAc,SACb,QAAQ,SAAS,gBAAgB,KAAK,CAAC,QAAQ,SAAS,SAAS;CAEpE,aACE,KACA,WACA,qBACA,2BACF;CAEA,mBAAmB,MAAM,QACvB,kBAAkB,KAAK,WAAW,mBAAmB,CACvD;CAEA,OAAO,OAAO,MAAM,GAAG,CAAC,CAAC;AAC3B;;;;;;AAOA,MAAa,mCACX,SACA,WACA,iBACW;CACX,MAAM,MAAM,OAAO,MAAM,SAAS,EAChC,QAAQA,2CACV,CAAC;CAED,MAAM,YACJ,cAAc,SACb,QAAQ,SAAS,gBAAgB,KAAK,CAAC,QAAQ,SAAS,SAAS;CAEpE,aACE,KACA,WACA,aAAa,oBACb,aAAa,mBACf;CAEA,mBAAmB,MAAM,QACvB,kBAAkB,KAAK,WAAW,aAAa,kBAAkB,CACnE;CAEA,OAAO,OAAO,MAAM,GAAG,CAAC,CAAC;AAC3B;;;;;;;;;;AAWA,MAAa,uCACX,SACA,YACA,mBACA,oBACW;CACX,MAAM,MAAM,OAAO,MAAM,SAAS,EAChC,QAAQA,2CACV,CAAC;CAED,IAAI,UAAU;CAEd,OAAO,MAAM,KAAK,EAChB,uBAAuB,MAAM;EAC3B,MAAM,EAAE,QAAQ,eAAe,KAAK;EACpC,MAAM,kBAAkB,cAAc,CAAC,EAAC,CAAE,MACvC,cACC,EAAE,gBAAgB,MAAM,SAAS,KACjC,UAAU,SAAS,SAAS,UAChC;EAEA,IACE,EAAE,cAAc,MAAM,MAAM,KAC5B,OAAO,UAAU,qBACjB,gBACA;GACA,OAAO,QAAQ;GACf,UAAU;EACZ;EAEA,OAAO;CACT,EACF,CAAC;CAED,IAAI,CAAC,SAAS,OAAO;CACrB,OAAO,OAAO,MAAM,GAAG,CAAC,CAAC;AAC3B;;;;;AAMA,MAAM,yBACJ,SACA,WACA,iBACA,wBACW;CACX,MAAM,MAAM,OAAO,MAAM,SAAS,EAChC,QAAQA,2CACV,CAAC;CAED,MAAM,YAAY,cAAc,SAAS,QAAQ,SAAS,gBAAgB;CAE1E,aAAa,KAAK,WAAW,iBAAiB,mBAAmB;CAEjE,OAAO,MAAM,KAAK;EAChB,8BAA8B,MAAM;GAClC,MAAM,cAAc,KAAK,KAAK;GAC9B,IACE,EAAE,WAAW,MAAM,WAAW,KAC9B,EACE,EAAE,eAAe,MAAM,WAAW,KAClC,EAAE,WAAW,MAAM,YAAY,MAAM,KACrC,YAAY,OAAO,SAAS,kBAG9B,KACG,IAAI,aAAa,CAAC,CAClB,QACC,EAAE,eAAe,EAAE,WAAW,eAAe,GAAG,CAC9C,WACF,CAAC,CACH;GAEJ,OAAO;EACT;EACA,0BAA0B,MAAM;GAC9B,MAAM,EAAE,MAAM,UAAU,KAAK;GAE7B,IACE,EAAE,iBAAiB,MAAM,IAAI,KAC7B,OAAO,MAAM,IAAI,CAAC,CAAC,SAAS,oBAC5B,EACE,EAAE,eAAe,MAAM,KAAK,KAC5B,EAAE,WAAW,MAAM,MAAM,MAAM,KAC/B,MAAM,OAAO,SAAS,kBAGxB,KACG,IAAI,OAAO,CAAC,CACZ,QAAQ,EAAE,eAAe,EAAE,WAAW,eAAe,GAAG,CAAC,KAAK,CAAC,CAAC;GAErE,OAAO;EACT;CACF,CAAC;CAED,OAAO,OAAO,MAAM,GAAG,CAAC,CAAC;AAC3B;;;;;AAMA,MAAa,oCACX,SACA,cAEA,sBACE,SACA,WACA,qBACA,iCACF;;;;;AAMF,MAAa,iCAAiC,YAA4B;CACxE,MAAM,MAAM,OAAO,MAAM,SAAS,EAChC,QAAQA,2CACV,CAAC;CAED,MAAM,sBAAsB,YAAiB;EAC3C,IACE,CAAC,WACA,QAAQ,SAAS,sBAChB,CAAC,EAAE,iBAAiB,MAAM,OAAO,GAEnC;EAEF,IAAI,cAAe,QAAQ,WAAqB,MAAM,MAAW;GAC/D,IAAI,CAAC,GAAG,KAAK,OAAO;GAEpB,QADgB,EAAE,IAAI,QAAQ,EAAE,IAAI,WACjB;EACrB,CAAC;EAED,IAAI,CAAC,aAAa;GAChB,cAAc,EAAE,SACd,QACA,EAAE,WAAW,SAAS,GACtB,EAAE,gBAAgB,CAAC,CAAC,CACtB;GACA,AAAC,QAAQ,WAAqB,KAAK,WAAW;EAChD;EAEA,MAAM,eAAe,YAAY;EAEjC,IACE,iBACC,aAAa,SAAS,qBACrB,EAAE,gBAAgB,MAAM,YAAY,IAatC;OAAI,CAXe,aAAa,SAAmB,MAAM,OAAY;IACnE,IACE,EAAE,cAAc,MAAM,EAAE,KACxB,GAAG,SAAS,mBACZ,GAAG,SAAS,WAEZ,QAAQ,GAAG,SAAS,GAAG,OAAO,cAAc;IAE9C,OAAO;GACT,CAEa,GACX,AAAC,aAAa,SAAmB,KAC/B,EAAE,cAAc,uBAAuB,CACzC;EACF;CAEJ;CAEA,mBAAmB,KAAK,oBAAoB,CAAC,kBAAkB,CAAC;CAEhE,OAAO,OAAO,MAAM,GAAG,CAAC,CAAC;AAC3B;;;;;AAMA,MAAa,kCACX,SACA,cAEA,sBACE,SACA,WACA,eACA,+BACF;;;;;;;AAQF,MAAa,+BACX,SACA,cACW;CACX,MAAM,MAAM,OAAO,MAAM,SAAS,EAChC,QAAQA,2CACV,CAAC;CAED,MAAM,YAAY,cAAc,SAAS,QAAQ,SAAS,gBAAgB;CAC1E,IAAI,yBAAyB;CAG7B,OAAO,MAAM,KAAK,EAChB,uBAAuB,MAAM;EAC3B,IAAI,KAAK,KAAK,OAAO,UAAU,oBAAoB;GACjD,KAAK,KAAK,SAAS,EAAE,cAAc,4BAA4B;GAC/D,yBAAyB;EAC3B;EACA,OAAO;CACT,EACF,CAAC;CAED,IAAI,wBACF,OAAO,OAAO,MAAM,GAAG,CAAC,CAAC;CAgB3B,IAXyB,IAAI,QAAQ,KAAe,MAAM,SAAc;EACtE,IAAI,CAAC,EAAE,kBAAkB,MAAM,IAAI,GAAG,OAAO;EAC7C,QAAQ,KAAK,cAAc,CAAC,EAAC,CAAE,MAC5B,SACE,EAAE,gBAAgB,MAAM,IAAI,KAC3B,KAAK,SAAS,SAAS,0BACxB,EAAE,uBAAuB,MAAM,IAAI,KAClC,KAAK,OAAO,SAAS,sBAC3B;CACF,CAEkB,GAChB,OAAO,OAAO,MAAM,GAAG,CAAC,CAAC;CAI3B,aACE,KACA,WACA,wBACA,4BACF;CAGA,MAAM,kBAAmB,IAAI,QAAQ,KAAe,QACjD,WAAmB,MAAW,UAAkB;EAC/C,IAAI,EAAE,kBAAkB,MAAM,IAAI,GAAG,OAAO;EAC5C,OAAO;CACT,GACA,EACF;CAEA,MAAM,yBAAyB,EAAE,oBAAoB,SAAS,CAC5D,EAAE,mBACA,EAAE,WAAW,mBAAmB,GAChC,EAAE,eAAe,EAAE,WAAW,sBAAsB,GAAG,CAAC,CAAC,CAC3D,CACF,CAAC;CAED,AAAC,IAAI,QAAQ,KAAe,OAC1B,kBAAkB,GAClB,GACA,sBACF;CAGA,OAAO,MAAM,KAAK;EAChB,8BAA8B,MAAM;GAClC,MAAM,cAAc,KAAK,KAAK;GAC9B,IACE,EAAE,WAAW,MAAM,WAAW,KAC9B,EACE,EAAE,eAAe,MAAM,WAAW,KAClC,EAAE,WAAW,MAAM,YAAY,MAAM,KACrC,YAAY,OAAO,SAAS,sBAG9B,KACG,IAAI,aAAa,CAAC,CAClB,QACC,EAAE,eAAe,EAAE,WAAW,mBAAmB,GAAG,CAClD,WACF,CAAC,CACH;GAEJ,OAAO;EACT;EACA,0BAA0B,MAAM;GAC9B,MAAM,EAAE,MAAM,UAAU,KAAK;GAE7B,IACE,EAAE,iBAAiB,MAAM,IAAI,KAC7B,OAAO,MAAM,IAAI,CAAC,CAAC,SAAS,oBAC5B,EACE,EAAE,eAAe,MAAM,KAAK,KAC5B,EAAE,WAAW,MAAM,MAAM,MAAM,KAC/B,MAAM,OAAO,SAAS,sBAGxB,KACG,IAAI,OAAO,CAAC,CACZ,QACC,EAAE,eAAe,EAAE,WAAW,mBAAmB,GAAG,CAAC,KAAK,CAAC,CAC7D;GAEJ,OAAO;EACT;CACF,CAAC;CAED,OAAO,OAAO,MAAM,GAAG,CAAC,CAAC;AAC3B;;AAWA,MAAM,qBAAqB,eACzB,WAAW,WAAW,OAClB;CAAE,cAAc;CAAU,eAAe;AAA2B,IACpE;CAAE,cAAc;CAAY,eAAe;AAA6B;;;;;;;;;;;;;;;AAgB9E,MAAM,qBAAqB,eAAsC;CAC/D,MAAM,EAAE,iBAAiB,kBAAkB,UAAU;CAYrD,MAAM,iBAAiB,YAVI,CADX,WAAW,eAAe,SAAS,QACjB,IAC9B,eAGA,WAAW,WAAW,SAAS,WAAW,WAAW,OACnD,oBACA,kBAIgD,SAAS,WAAW,eAAe;CAEzF,MAAM,gBAAgB,YAAyB;EAI7C,OAHmB,OAAO,MAAM,SAAS,EACvC,QAAQA,2CACV,CACiB,CAAC,CAAC,QAAQ,KAAK,EAAE,CAAS;CAC7C;CAIA,IAAI,WAAW,WAAW,MACxB,OAAO,aAAa,GAAG,aAAa,KAAK,eAAe,IAAI;CAO9D,MAAM,YAAY,QAAQ,WAAW,SAAS;CAuB9C,OAAO,aAAa,GAnBD,aAAa;IAC9B,eAAe;;;;;;aAMN,WAAW,OAAO;;;;;;;;;eAShB,UAAU;GAGI;AAC7B;;;;;;AAOA,MAAM,0BAA0B,SAAc,WAAyB;CACrE,IACE,CAAC,WACA,QAAQ,SAAS,sBAAsB,CAAC,EAAE,iBAAiB,MAAM,OAAO,GAEzE;CAEF,IAAI,iBAAkB,QAAQ,WAAqB,MAAM,SAAc;EACrE,IAAI,CAAC,MAAM,KAAK,OAAO;EACvB,QAAQ,KAAK,IAAI,QAAQ,KAAK,IAAI,WAAW;CAC/C,CAAC;CAED,IAAI,CAAC,gBAAgB;EACnB,iBAAiB,EAAE,SACjB,QACA,EAAE,WAAW,YAAY,GACzB,EAAE,iBAAiB,CAAC,CAAC,CACvB;EACA,AAAC,QAAQ,WAAqB,KAAK,cAAc;CACnD;CAEA,MAAM,gBAAgB,eAAe;CACrC,IACE,CAAC,iBACA,cAAc,SAAS,sBACtB,CAAC,EAAE,iBAAiB,MAAM,aAAa,GAEzC;CAOF,IAAI,CALe,cAAc,WAAqB,MAAM,SAAc;EACxE,IAAI,CAAC,MAAM,KAAK,OAAO;EACvB,QAAQ,KAAK,IAAI,QAAQ,KAAK,IAAI,WAAW;CAC/C,CAEa,GACX,AAAC,cAAc,WAAqB,KAClC,EAAE,SAAS,QAAQ,EAAE,WAAW,QAAQ,GAAG,EAAE,cAAc,MAAM,CAAC,CACpE;AAEJ;;;;;;AAOA,MAAa,sCACX,SACA,WACA,eACW;CACX,MAAM,MAAM,OAAO,MAAM,SAAS,EAChC,QAAQA,2CACV,CAAC;CAED,MAAM,YAAY,cAAc,SAAS,QAAQ,SAAS,gBAAgB;CAE1E,MAAM,EAAE,cAAc,kBAAkB,kBAAkB,UAAU;CAEpE,aAAa,KAAK,WAAW,cAAc,aAAa;CAExD,MAAM,WAAW,kBAAkB,UAAU;CAG7C,MAAM,mBACJ,WAAW,WAAW,OAAO,OAAO,WAAW;CAEjD,mBAAmB,MAAM,YAAY;EACnC,IACE,CAAC,WACA,QAAQ,SAAS,sBAChB,CAAC,EAAE,iBAAiB,MAAM,OAAO,GAEnC;EAIF,uBAAuB,SAAS,gBAAgB;EAEhD,IAAI,cAAe,QAAQ,WAAqB,MAAM,SAAc;GAClE,IAAI,CAAC,MAAM,KAAK,OAAO;GAEvB,QADgB,KAAK,IAAI,QAAQ,KAAK,IAAI,WACvB;EACrB,CAAC;EAED,IAAI,CAAC,aAAa;GAChB,cAAc,EAAE,SACd,QACA,EAAE,WAAW,SAAS,GACtB,EAAE,gBAAgB,CAAC,CAAC,CACtB;GACA,AAAC,QAAQ,WAAqB,KAAK,WAAW;EAChD;EAEA,MAAM,aAAa,YAAY;EAE/B,IACE,eACC,WAAW,SAAS,qBACnB,EAAE,gBAAgB,MAAM,UAAU,IAWpC;OAAI,CATmB,WAAW,SAAmB,MAClD,YAAiB;IAChB,MAAM,SAAS,SAAS;IACxB,IAAI,CAAC,QAAQ,OAAO;IAEpB,QADqB,OAAO,QAAQ,OAAO,IAAI,UAC/B;GAClB,CAGe,GACf,AAAC,WAAW,SAAmB,KAAK,QAAQ;EAC9C;CAEJ,CAAC;CAED,OAAO,OAAO,MAAM,GAAG,CAAC,CAAC;AAC3B"}
1
+ {"version":3,"file":"configManipulation.cjs","names":["typescriptParser","isModuleScopeBinding"],"sources":["../../../../src/init/utils/configManipulation.ts"],"sourcesContent":["import type { RoutingConfig } from '@intlayer/types/config';\nimport * as recast from 'recast';\nimport { typescriptParser } from '../../utils/babelParser';\nimport { isModuleScopeBinding } from './astImports';\nimport type {\n CompatSyncConfig,\n CompatVitePluginConfig,\n} from './packageManager';\n\nconst { builders: b, namedTypes: n } = recast.types;\n\n/** The locale routing strategies supported by the Intlayer configuration. */\nexport type RoutingMode = RoutingConfig['mode'];\n\n/** Narrows an arbitrary recast node to an object expression. */\nconst isObjectExpression = (node: any): boolean =>\n Boolean(node) &&\n (node.type === 'ObjectExpression' || n.ObjectExpression.check(node));\n\n/**\n * Finds a property by key name on an object expression, creating it with the\n * provided default value node when it is absent. Returns the property node so\n * callers can read or mutate its value while preserving any attached comments.\n */\nconst ensureObjectProperty = (\n objExpr: any,\n key: string,\n defaultValueNode: any\n): any => {\n let property = (objExpr.properties as any[]).find((prop: any) => {\n if (!prop?.key) return false;\n return (prop.key.name ?? prop.key.value) === key;\n });\n\n if (!property) {\n property = b.property('init', b.identifier(key), defaultValueNode);\n (objExpr.properties as any[]).push(property);\n }\n\n return property;\n};\n\n/**\n * Sets (or replaces) a property's value on an object expression. When the\n * property already exists only its value node is swapped, which keeps the\n * leading documentation comment in place.\n */\nconst setObjectPropertyValue = (\n objExpr: any,\n key: string,\n valueNode: any\n): void => {\n const property = (objExpr.properties as any[]).find((prop: any) => {\n if (!prop?.key) return false;\n return (prop.key.name ?? prop.key.value) === key;\n });\n\n if (property) {\n property.value = valueNode;\n return;\n }\n\n (objExpr.properties as any[]).push(\n b.property('init', b.identifier(key), valueNode)\n );\n};\n\n/**\n * Adds a `process.env.<envVar>` reference property to an object expression when\n * the property is not already present. Existing values are left untouched.\n */\nconst addEnvReferenceProperty = (\n objExpr: any,\n key: string,\n envVar: string\n): void => {\n const hasProperty = (objExpr.properties as any[]).some((prop: any) => {\n if (!prop?.key) return false;\n return (prop.key.name ?? prop.key.value) === key;\n });\n\n if (hasProperty) return;\n\n (objExpr.properties as any[]).push(\n b.property(\n 'init',\n b.identifier(key),\n b.memberExpression(\n b.memberExpression(b.identifier('process'), b.identifier('env')),\n b.identifier(envVar)\n )\n )\n );\n};\n\n/**\n * Sets `routing.mode` in an Intlayer configuration file to the requested\n * strategy. Idempotent: re-running with the same mode produces identical\n * output. Supports `.ts`, `.mjs`, `.js` and `.cjs` configs; JSON configs are\n * handled with a scoped string replacement since they cannot be parsed by the\n * TypeScript recast parser.\n */\nexport const setIntlayerConfigRoutingMode = (\n content: string,\n extension: string,\n mode: RoutingMode\n): string => {\n if (extension === 'json') {\n return content.replace(\n /(\"mode\"\\s*:\\s*)\"(?:prefix-no-default|prefix-all|no-prefix|search-params)\"/,\n `$1\"${mode}\"`\n );\n }\n\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n genericRecastVisit(ast, (objExpr) => {\n if (!isObjectExpression(objExpr)) return;\n\n const routingProperty = ensureObjectProperty(\n objExpr,\n 'routing',\n b.objectExpression([])\n );\n\n if (!isObjectExpression(routingProperty.value)) return;\n\n setObjectPropertyValue(\n routingProperty.value,\n 'mode',\n b.stringLiteral(mode)\n );\n });\n\n return recast.print(ast).code;\n};\n\n/**\n * Sets `compiler.output` in an Intlayer configuration file to the given path\n * template (the `{{variable}}` string form, e.g.\n * `/locales/{{locale}}/{{key}}.content.json`). Idempotent: re-running with the\n * same template produces identical output. Supports `.ts`, `.mjs`, `.js` and\n * `.cjs` configs; JSON configs are supported too since the template is a plain\n * string.\n */\nexport const setIntlayerConfigCompilerOutput = (\n content: string,\n extension: string,\n outputTemplate: string\n): string => {\n if (extension === 'json') {\n const parsed = JSON.parse(content);\n parsed.compiler = { ...parsed.compiler, output: outputTemplate };\n return JSON.stringify(parsed, null, 2);\n }\n\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n genericRecastVisit(ast, (objExpr) => {\n if (!isObjectExpression(objExpr)) return;\n\n const compilerProperty = ensureObjectProperty(\n objExpr,\n 'compiler',\n b.objectExpression([])\n );\n\n if (!isObjectExpression(compilerProperty.value)) return;\n\n setObjectPropertyValue(\n compilerProperty.value,\n 'output',\n b.stringLiteral(outputTemplate)\n );\n });\n\n return recast.print(ast).code;\n};\n\n/**\n * Enables the Intlayer visual editor in a configuration file: sets\n * `editor.enabled` to `true` and wires `clientId` / `clientSecret` to the\n * `INTLAYER_CLIENT_ID` / `INTLAYER_CLIENT_SECRET` environment variables.\n * Idempotent and non-destructive — existing `clientId` / `clientSecret` values\n * are preserved. Only `.ts`, `.mjs`, `.js` and `.cjs` configs are supported\n * (JSON cannot reference `process.env`).\n */\nexport const enableIntlayerEditorConfig = (content: string): string => {\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n genericRecastVisit(ast, (objExpr) => {\n if (!isObjectExpression(objExpr)) return;\n\n const editorProperty = ensureObjectProperty(\n objExpr,\n 'editor',\n b.objectExpression([])\n );\n\n if (!isObjectExpression(editorProperty.value)) return;\n\n const editorObject = editorProperty.value;\n\n setObjectPropertyValue(editorObject, 'enabled', b.booleanLiteral(true));\n addEnvReferenceProperty(editorObject, 'clientId', 'INTLAYER_CLIENT_ID');\n addEnvReferenceProperty(\n editorObject,\n 'clientSecret',\n 'INTLAYER_CLIENT_SECRET'\n );\n });\n\n return recast.print(ast).code;\n};\n\nconst injectImport = (\n ast: any,\n isCJS: boolean,\n importName: string,\n source: string\n) => {\n // Never redeclare an identifier already bound at module scope (e.g. imported\n // from another source or declared locally) — that would be a parse error.\n if (!isCJS && isModuleScopeBinding(ast, importName)) return;\n\n const body = ast.program.body;\n const hasImport = body.some((stmt: any) => {\n if (isCJS) {\n return (\n n.VariableDeclaration.check(stmt) &&\n stmt.declarations.some(\n (decl: any) =>\n n.VariableDeclarator.check(decl) &&\n n.CallExpression.check(decl.init) &&\n n.Identifier.check(decl.init.callee) &&\n decl.init.callee.name === 'require' &&\n n.StringLiteral.check(decl.init.arguments[0]) &&\n decl.init.arguments[0].value === source\n )\n );\n }\n return (\n n.ImportDeclaration.check(stmt) &&\n (stmt.source.value === source ||\n stmt.specifiers?.some(\n (spec: any) =>\n (n.ImportSpecifier.check(spec) &&\n spec.imported.name === importName) ||\n (n.ImportDefaultSpecifier.check(spec) &&\n spec.local?.name === importName)\n ))\n );\n });\n\n if (hasImport) return;\n\n const declaration = isCJS\n ? b.variableDeclaration('const', [\n b.variableDeclarator(\n b.identifier(`{ ${importName} }`),\n b.callExpression(b.identifier('require'), [b.stringLiteral(source)])\n ),\n ])\n : b.importDeclaration(\n [b.importSpecifier(b.identifier(importName))],\n b.stringLiteral(source)\n );\n\n ast.program.body.unshift(declaration);\n};\n\nconst updatePluginArray = (\n objExpr: any,\n propertyName: string,\n pluginName: string\n) => {\n if (\n !objExpr ||\n (objExpr.type !== 'ObjectExpression' && !n.ObjectExpression.check(objExpr))\n )\n return;\n\n let prop = objExpr.properties.find((p: any) => {\n if (!p?.key) return false;\n const keyName = p.key.name || p.key.value;\n return keyName === propertyName;\n }) as any;\n\n if (!prop) {\n prop = b.property(\n 'init',\n b.identifier(propertyName),\n b.arrayExpression([])\n );\n objExpr.properties.push(prop);\n }\n\n const arrayValue = prop.value;\n\n if (\n arrayValue &&\n (arrayValue.type === 'ArrayExpression' ||\n n.ArrayExpression.check(arrayValue))\n ) {\n const hasPlugin = arrayValue.elements.some((el: any) => {\n const callee = el?.callee;\n if (!callee) return false;\n const name = callee.name || callee.id?.name;\n return name === pluginName || name === 'il';\n });\n\n if (!hasPlugin) {\n arrayValue.elements.push(b.callExpression(b.identifier(pluginName), []));\n }\n }\n};\n\nconst genericRecastVisit = (\n ast: any,\n updateConfigObject: (obj: any) => void,\n callNames: string[] = ['defineConfig']\n) => {\n /**\n * Resolves an identifier reference (e.g. `export default config` /\n * `module.exports = config`) back to the object expression it was declared\n * with, then runs the updater on it.\n */\n const resolveIdentifierConfig = (name: string) => {\n ast.program.body.forEach((stmt: any) => {\n if (n.VariableDeclaration.check(stmt)) {\n stmt.declarations.forEach((vdecl: any) => {\n if (\n n.VariableDeclarator.check(vdecl) &&\n n.Identifier.check(vdecl.id) &&\n vdecl.id.name === name &&\n n.ObjectExpression.check(vdecl.init)\n ) {\n updateConfigObject(vdecl.init);\n }\n });\n }\n });\n };\n\n recast.visit(ast, {\n visitExportDefaultDeclaration(path) {\n const decl = path.node.declaration;\n\n if (n.ObjectExpression.check(decl)) {\n updateConfigObject(decl);\n } else if (\n n.CallExpression.check(decl) &&\n n.Identifier.check(decl.callee) &&\n callNames.includes(decl.callee.name)\n ) {\n if (n.ObjectExpression.check(decl.arguments[0])) {\n updateConfigObject(decl.arguments[0]);\n }\n } else if (n.Identifier.check(decl)) {\n resolveIdentifierConfig(decl.name);\n }\n return false;\n },\n visitAssignmentExpression(path) {\n const { left, right } = path.node;\n\n if (\n n.MemberExpression.check(left) &&\n recast.print(left).code === 'module.exports'\n ) {\n if (n.ObjectExpression.check(right)) {\n updateConfigObject(right);\n } else if (\n n.CallExpression.check(right) &&\n n.Identifier.check(right.callee) &&\n callNames.includes(right.callee.name)\n ) {\n if (n.ObjectExpression.check(right.arguments[0])) {\n updateConfigObject(right.arguments[0]);\n }\n } else if (n.Identifier.check(right)) {\n resolveIdentifierConfig(right.name);\n }\n }\n return false;\n },\n });\n};\n\n/**\n * Detects whether a Vite config already wires in an Intlayer plugin — either the\n * base `vite-intlayer` plugin or one of the compat adapters (e.g.\n * `reactI18nextVitePlugin` from `@intlayer/react-i18next/plugin`). The compat\n * plugins internally wrap `intlayer()`, so a standalone `intlayer()` must not be\n * appended when one is already present, otherwise the plugin runs twice.\n */\nexport const hasIntlayerVitePlugin = (content: string): boolean =>\n content.includes('vite-intlayer') ||\n /@intlayer\\/[^'\"]+\\/plugin/.test(content);\n\nexport const updateViteConfig = (\n content: string,\n extension: string\n): string => {\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n const isCJSFile =\n extension === 'cjs' ||\n (content.includes('module.exports') && !content.includes('import '));\n\n injectImport(ast, isCJSFile, 'intlayer', 'vite-intlayer');\n\n genericRecastVisit(ast, (obj) =>\n updatePluginArray(obj, 'plugins', 'intlayer')\n );\n\n return recast.print(ast).code;\n};\n\nexport const updateAstroConfig = (\n content: string,\n extension: string\n): string => {\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n const isCJSFile =\n extension === 'cjs' ||\n (content.includes('module.exports') && !content.includes('import '));\n\n injectImport(ast, isCJSFile, 'intlayer', 'astro-intlayer');\n\n genericRecastVisit(ast, (obj) =>\n updatePluginArray(obj, 'integrations', 'intlayer')\n );\n\n return recast.print(ast).code;\n};\n\nexport const updateNextConfig = (\n content: string,\n extension: string\n): string => {\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n const isCJSFile = extension === 'cjs' || content.includes('module.exports');\n\n injectImport(ast, isCJSFile, 'withIntlayer', 'next-intlayer/server');\n\n recast.visit(ast, {\n visitExportDefaultDeclaration(path) {\n const declaration = path.node.declaration;\n if (\n n.Expression.check(declaration) &&\n !(\n n.CallExpression.check(declaration) &&\n n.Identifier.check(declaration.callee) &&\n declaration.callee.name === 'withIntlayer'\n )\n ) {\n path\n .get('declaration')\n .replace(\n b.callExpression(b.identifier('withIntlayer'), [declaration as any])\n );\n }\n return false;\n },\n visitAssignmentExpression(path) {\n const { left, right } = path.node;\n\n if (\n n.MemberExpression.check(left) &&\n recast.print(left).code === 'module.exports' &&\n !(\n n.CallExpression.check(right) &&\n n.Identifier.check(right.callee) &&\n right.callee.name === 'withIntlayer'\n )\n ) {\n path\n .get('right')\n .replace(b.callExpression(b.identifier('withIntlayer'), [right]));\n }\n return false;\n },\n });\n\n return recast.print(ast).code;\n};\n\n/**\n * Returns true when the expression looks like an Immediately Invoked Function\n * Expression (e.g. `(async () => { ... })()`). Such custom async exports cannot\n * be safely wrapped with the synchronous Metro helper, so they are skipped.\n */\nconst isImmediatelyInvokedFunction = (node: any): boolean =>\n n.CallExpression.check(node) &&\n (n.ArrowFunctionExpression.check(node.callee) ||\n n.FunctionExpression.check(node.callee));\n\n/**\n * Wraps a React Native Metro config's exported value with\n * `configMetroIntlayerSync` from `react-native-intlayer/metro`, injecting the\n * import. The synchronous helper is used because it wraps a plain config object\n * and needs no IIFE, making it safe to inject into existing configs without\n * restructuring them.\n *\n * Non-destructive: returns the content unchanged when the export is already\n * wrapped, when the Intlayer Metro plugin is already present, or when the export\n * is a custom async IIFE that cannot be wrapped synchronously. Callers should\n * compare the result with the input to detect the skipped case.\n */\nexport const updateMetroConfig = (\n content: string,\n extension: string\n): string => {\n if (content.includes('react-native-intlayer')) {\n return content;\n }\n\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n const isCJSFile =\n extension === 'cjs' ||\n (content.includes('module.exports') && !content.includes('import '));\n\n const wrapperName = 'configMetroIntlayerSync';\n\n const isWrappable = (node: any): boolean =>\n n.Expression.check(node) &&\n !isImmediatelyInvokedFunction(node) &&\n !(\n n.CallExpression.check(node) &&\n n.Identifier.check(node.callee) &&\n node.callee.name === wrapperName\n );\n\n let wrapped = false;\n\n recast.visit(ast, {\n visitExportDefaultDeclaration(path) {\n const declaration = path.node.declaration;\n if (isWrappable(declaration)) {\n path\n .get('declaration')\n .replace(\n b.callExpression(b.identifier(wrapperName), [declaration as any])\n );\n wrapped = true;\n }\n return false;\n },\n visitAssignmentExpression(path) {\n const { left, right } = path.node;\n\n if (\n n.MemberExpression.check(left) &&\n recast.print(left).code === 'module.exports' &&\n isWrappable(right)\n ) {\n path\n .get('right')\n .replace(b.callExpression(b.identifier(wrapperName), [right]));\n wrapped = true;\n }\n return false;\n },\n });\n\n // Only inject the import when an export was actually wrapped, so an\n // un-wrappable config is left completely untouched.\n if (!wrapped) {\n return content;\n }\n\n injectImport(ast, isCJSFile, wrapperName, 'react-native-intlayer/metro');\n\n return recast.print(ast).code;\n};\n\n/**\n * Builds the contents of a fresh `metro.config.js` wired with the Intlayer\n * Metro plugin. Uses the async `configMetroIntlayer` helper (which can build\n * dictionaries on server start) and picks the default-config source based on\n * whether the project is an Expo app.\n */\nexport const getMetroConfigTemplate = (isExpo: boolean): string => {\n const defaultConfigSource = isExpo\n ? 'expo/metro-config'\n : '@react-native/metro-config';\n\n return `const { getDefaultConfig } = require(\"${defaultConfigSource}\");\nconst { configMetroIntlayer } = require(\"react-native-intlayer/metro\");\n\nmodule.exports = (async () => {\n const defaultConfig = getDefaultConfig(__dirname);\n\n return await configMetroIntlayer(defaultConfig);\n})();\n`;\n};\n\nexport const updateNuxtConfig = (content: string): string => {\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n const updateConfigObject = (objExpr: any) => {\n if (\n !objExpr ||\n (objExpr.type !== 'ObjectExpression' &&\n !n.ObjectExpression.check(objExpr))\n )\n return;\n\n let modulesProp = objExpr.properties.find((p: any) => {\n if (!p?.key) return false;\n const keyName = p.key.name || p.key.value;\n return keyName === 'modules';\n }) as any;\n\n if (!modulesProp) {\n modulesProp = b.property(\n 'init',\n b.identifier('modules'),\n b.arrayExpression([])\n );\n objExpr.properties.push(modulesProp);\n }\n\n const modulesValue = modulesProp.value;\n\n if (\n modulesValue &&\n (modulesValue.type === 'ArrayExpression' ||\n n.ArrayExpression.check(modulesValue))\n ) {\n const hasModule = modulesValue.elements.some((el: any) => {\n if (\n n.StringLiteral.check(el) ||\n el.type === 'StringLiteral' ||\n el.type === 'Literal'\n ) {\n return (el.value || el.extra?.rawValue) === 'nuxt-intlayer';\n }\n return false;\n });\n\n if (!hasModule) {\n modulesValue.elements.push(b.stringLiteral('nuxt-intlayer'));\n }\n }\n };\n\n genericRecastVisit(ast, updateConfigObject, ['defineNuxtConfig']);\n\n return recast.print(ast).code;\n};\n\n/**\n * Updates a Vite config for vue-i18n compat: injects `vueI18nVitePlugin` from\n * `@intlayer/vue-i18n/plugin` into the plugins array.\n */\nexport const updateViteConfigForVueI18n = (\n content: string,\n extension: string\n): string => {\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n const isCJSFile =\n extension === 'cjs' ||\n (content.includes('module.exports') && !content.includes('import '));\n\n injectImport(\n ast,\n isCJSFile,\n 'vueI18nVitePlugin',\n '@intlayer/vue-i18n/plugin'\n );\n\n genericRecastVisit(ast, (obj) =>\n updatePluginArray(obj, 'plugins', 'vueI18nVitePlugin')\n );\n\n return recast.print(ast).code;\n};\n\n/**\n * Generic vite config updater for any compat plugin that uses alias injection.\n * Injects the named import from `pluginPackageSource` and appends the plugin\n * call to the `plugins` array.\n */\nexport const updateViteConfigForCompatPlugin = (\n content: string,\n extension: string,\n pluginConfig: CompatVitePluginConfig\n): string => {\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n const isCJSFile =\n extension === 'cjs' ||\n (content.includes('module.exports') && !content.includes('import '));\n\n injectImport(\n ast,\n isCJSFile,\n pluginConfig.pluginFunctionName,\n pluginConfig.pluginPackageSource\n );\n\n genericRecastVisit(ast, (obj) =>\n updatePluginArray(obj, 'plugins', pluginConfig.pluginFunctionName)\n );\n\n return recast.print(ast).code;\n};\n\n/**\n * Rewrites the module source of an existing named import in a vite config,\n * keeping the imported binding and its call site untouched. Used when a compat\n * plugin is a drop-in replacement for an i18n library's own vite plugin — e.g.\n * lingui: `import { lingui } from \"@lingui/vite-plugin\"` becomes\n * `import { lingui } from \"@intlayer/lingui/plugin\"`, leaving `lingui()` in the\n * `plugins` array as-is. Returns the content unchanged when no matching import\n * is found.\n */\nexport const replaceViteConfigPluginImportSource = (\n content: string,\n importName: string,\n fromPackageSource: string,\n toPackageSource: string\n): string => {\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n let changed = false;\n\n recast.visit(ast, {\n visitImportDeclaration(path) {\n const { source, specifiers } = path.node;\n const importsBinding = (specifiers ?? []).some(\n (specifier) =>\n n.ImportSpecifier.check(specifier) &&\n specifier.imported.name === importName\n );\n\n if (\n n.StringLiteral.check(source) &&\n source.value === fromPackageSource &&\n importsBinding\n ) {\n source.value = toPackageSource;\n changed = true;\n }\n\n return false;\n },\n });\n\n if (!changed) return content;\n return recast.print(ast).code;\n};\n\n/**\n * Generic Next.js config wrapper for compat plugins. Injects the import and\n * wraps the default export / `module.exports` with a HOC call.\n */\nconst wrapNextConfigWithHoc = (\n content: string,\n extension: string,\n hocFunctionName: string,\n pluginPackageSource: string\n): string => {\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n const isCJSFile = extension === 'cjs' || content.includes('module.exports');\n\n injectImport(ast, isCJSFile, hocFunctionName, pluginPackageSource);\n\n recast.visit(ast, {\n visitExportDefaultDeclaration(path) {\n const declaration = path.node.declaration;\n if (\n n.Expression.check(declaration) &&\n !(\n n.CallExpression.check(declaration) &&\n n.Identifier.check(declaration.callee) &&\n declaration.callee.name === hocFunctionName\n )\n ) {\n path\n .get('declaration')\n .replace(\n b.callExpression(b.identifier(hocFunctionName), [\n declaration as any,\n ])\n );\n }\n return false;\n },\n visitAssignmentExpression(path) {\n const { left, right } = path.node;\n\n if (\n n.MemberExpression.check(left) &&\n recast.print(left).code === 'module.exports' &&\n !(\n n.CallExpression.check(right) &&\n n.Identifier.check(right.callee) &&\n right.callee.name === hocFunctionName\n )\n ) {\n path\n .get('right')\n .replace(b.callExpression(b.identifier(hocFunctionName), [right]));\n }\n return false;\n },\n });\n\n return recast.print(ast).code;\n};\n\n/**\n * Updates a Next.js config for next-translate compat: wraps the default export\n * with `withNextTranslate` from `@intlayer/next-translate/plugin`.\n */\nexport const updateNextConfigForNextTranslate = (\n content: string,\n extension: string\n): string =>\n wrapNextConfigWithHoc(\n content,\n extension,\n 'withNextTranslate',\n '@intlayer/next-translate/plugin'\n );\n\n/**\n * Updates a Nuxt config for nuxtjs-i18n compat: adds `@intlayer/nuxtjs-i18n`\n * to the `modules` array.\n */\nexport const updateNuxtConfigForNuxtjsI18n = (content: string): string => {\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n const updateConfigObject = (objExpr: any) => {\n if (\n !objExpr ||\n (objExpr.type !== 'ObjectExpression' &&\n !n.ObjectExpression.check(objExpr))\n )\n return;\n\n let modulesProp = (objExpr.properties as any[]).find((p: any) => {\n if (!p?.key) return false;\n const keyName = p.key.name || p.key.value;\n return keyName === 'modules';\n }) as any;\n\n if (!modulesProp) {\n modulesProp = b.property(\n 'init',\n b.identifier('modules'),\n b.arrayExpression([])\n );\n (objExpr.properties as any[]).push(modulesProp);\n }\n\n const modulesValue = modulesProp.value;\n\n if (\n modulesValue &&\n (modulesValue.type === 'ArrayExpression' ||\n n.ArrayExpression.check(modulesValue))\n ) {\n const hasModule = (modulesValue.elements as any[]).some((el: any) => {\n if (\n n.StringLiteral.check(el) ||\n el.type === 'StringLiteral' ||\n el.type === 'Literal'\n ) {\n return (el.value ?? el.extra?.rawValue) === '@intlayer/nuxtjs-i18n';\n }\n return false;\n });\n\n if (!hasModule) {\n (modulesValue.elements as any[]).push(\n b.stringLiteral('@intlayer/nuxtjs-i18n')\n );\n }\n }\n };\n\n genericRecastVisit(ast, updateConfigObject, ['defineNuxtConfig']);\n\n return recast.print(ast).code;\n};\n\n/**\n * Updates a Next.js config for next-i18next compat: wraps the default export\n * with `withI18next` from `@intlayer/next-i18next/plugin`.\n */\nexport const updateNextConfigForNextI18next = (\n content: string,\n extension: string\n): string =>\n wrapNextConfigWithHoc(\n content,\n extension,\n 'withI18next',\n '@intlayer/next-i18next/plugin'\n );\n\n/**\n * Updates a Next.js config for next-intl compat: replaces any existing\n * `next-intl/plugin` import source with `@intlayer/next-intl/plugin`, or\n * injects `createNextIntlPlugin` with a factory-call wrapper when no such\n * import is present.\n */\nexport const updateNextConfigForNextIntl = (\n content: string,\n extension: string\n): string => {\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n const isCJSFile = extension === 'cjs' || content.includes('module.exports');\n let replacedExistingSource = false;\n\n // Replace 'next-intl/plugin' import source with the compat package.\n recast.visit(ast, {\n visitImportDeclaration(path) {\n if (path.node.source.value === 'next-intl/plugin') {\n path.node.source = b.stringLiteral('@intlayer/next-intl/plugin');\n replacedExistingSource = true;\n }\n return false;\n },\n });\n\n if (replacedExistingSource) {\n return recast.print(ast).code;\n }\n\n // No existing next-intl/plugin import: check whether createNextIntlPlugin is\n // already present from any source before injecting the full factory pattern.\n const hasCreatePlugin = (ast.program.body as any[]).some((stmt: any) => {\n if (!n.ImportDeclaration.check(stmt)) return false;\n return (stmt.specifiers ?? []).some(\n (spec: any) =>\n (n.ImportSpecifier.check(spec) &&\n spec.imported.name === 'createNextIntlPlugin') ||\n (n.ImportDefaultSpecifier.check(spec) &&\n spec.local?.name === 'createNextIntlPlugin')\n );\n });\n\n if (hasCreatePlugin) {\n return recast.print(ast).code;\n }\n\n // Inject the import.\n injectImport(\n ast,\n isCJSFile,\n 'createNextIntlPlugin',\n '@intlayer/next-intl/plugin'\n );\n\n // Insert a factory-call variable declaration after the last import.\n const lastImportIndex = (ast.program.body as any[]).reduce(\n (lastIndex: number, stmt: any, index: number) => {\n if (n.ImportDeclaration.check(stmt)) return index;\n return lastIndex;\n },\n -1\n );\n\n const factoryCallDeclaration = b.variableDeclaration('const', [\n b.variableDeclarator(\n b.identifier('_withNextIntlayer'),\n b.callExpression(b.identifier('createNextIntlPlugin'), [])\n ),\n ]);\n\n (ast.program.body as any[]).splice(\n lastImportIndex + 1,\n 0,\n factoryCallDeclaration\n );\n\n // Wrap the default export with _withNextIntlayer(...).\n recast.visit(ast, {\n visitExportDefaultDeclaration(path) {\n const declaration = path.node.declaration;\n if (\n n.Expression.check(declaration) &&\n !(\n n.CallExpression.check(declaration) &&\n n.Identifier.check(declaration.callee) &&\n declaration.callee.name === '_withNextIntlayer'\n )\n ) {\n path\n .get('declaration')\n .replace(\n b.callExpression(b.identifier('_withNextIntlayer'), [\n declaration as any,\n ])\n );\n }\n return false;\n },\n visitAssignmentExpression(path) {\n const { left, right } = path.node;\n\n if (\n n.MemberExpression.check(left) &&\n recast.print(left).code === 'module.exports' &&\n !(\n n.CallExpression.check(right) &&\n n.Identifier.check(right.callee) &&\n right.callee.name === '_withNextIntlayer'\n )\n ) {\n path\n .get('right')\n .replace(\n b.callExpression(b.identifier('_withNextIntlayer'), [right])\n );\n }\n return false;\n },\n });\n\n return recast.print(ast).code;\n};\n\n/** The sync plugin used to ingest a compat library's catalogs. */\ntype SyncPluginInfo = {\n /** Called function name, e.g. `'syncJSON'`. */\n functionName: string;\n /** Package the function is imported from. */\n packageSource: string;\n};\n\n/** Resolves the sync plugin (function + package) for a compat sync config. */\nconst getSyncPluginInfo = (syncConfig: CompatSyncConfig): SyncPluginInfo =>\n syncConfig.plugin === 'po'\n ? { functionName: 'syncPO', packageSource: '@intlayer/sync-po-plugin' }\n : { functionName: 'syncJSON', packageSource: '@intlayer/sync-json-plugin' };\n\n/**\n * Parses a `syncJSON({ ... })` / `syncPO({ ... })` call expression from a source\n * snippet so it can be injected into a config AST without manually constructing\n * template-literal nodes via builders.\n *\n * The destructuring parameters adapt to whether the source template uses the\n * `key` placeholder (nested pattern) or only `locale` (flat pattern).\n *\n * For `syncJSON` every option is emitted explicitly — `source`, then `format`\n * and `splitKeys` — each preceded by an explanatory JSDoc block, so the\n * generated config self-documents the two knobs a user is most likely to tweak.\n * `syncPO` takes neither `format` (gettext is always the serialization) nor\n * `splitKeys`, so it keeps a bare `source`-only call.\n */\nconst buildSyncCallNode = (syncConfig: CompatSyncConfig): any => {\n const { functionName } = getSyncPluginInfo(syncConfig);\n const usesKey = syncConfig.sourceTemplate.includes('${key}');\n const paramDestructuring = !usesKey\n ? '{ locale }'\n : // `icu` (and PO, which is ICU-dialect) reads `{ key, locale }`; the\n // i18next/vue-i18n JSON dialects keep their established `{ locale, key }`.\n syncConfig.format === 'icu' || syncConfig.plugin === 'po'\n ? '{ key, locale }'\n : '{ locale, key }';\n\n // The sourceTemplate contains ${locale} / ${key} as literal characters;\n // they become proper template expressions once the snippet is parsed by recast.\n const sourceProperty = `source: (${paramDestructuring}) => \\`${syncConfig.sourceTemplate}\\``;\n\n const parseSnippet = (snippet: string): any => {\n const snippetAst = recast.parse(snippet, {\n parser: typescriptParser,\n });\n return (snippetAst.program.body[0] as any).expression;\n };\n\n // `syncPO` always serializes gettext, so it exposes neither `format` nor\n // `splitKeys`: emit a bare `source`-only call.\n if (syncConfig.plugin === 'po') {\n return parseSnippet(`${functionName}({ ${sourceProperty} })`);\n }\n\n // `splitKeys: true` is forced only for the single-file namespace model\n // (next-intl / use-intl); every other library keeps a single dictionary per\n // file. It is now written explicitly (rather than relying on syncJSON's\n // auto-detection) so the generated config documents the choice.\n const splitKeys = Boolean(syncConfig.splitKeys);\n\n // The JSDoc blocks are embedded in the snippet and preserved by recast when\n // the parsed call node is printed back into the config AST.\n const snippet = `${functionName}({\n ${sourceProperty},\n\n /**\n * Parsing of json respecting the syntax\n * Default \\`'intlayer'\\` message format\n */\n format: '${syncConfig.format}',\n\n /**\n * \\`true\\`:\n * \\`en.json\\` -> \\`useTranslation('home')\\` -> \\`t(\"title\")\\`\n *\n * \\`false\\`:\n * \\`en.json\\` -> \\`useTranslation()\\` -> \\`t(\"home.title\")\\`\n */\n splitKeys: ${splitKeys},\n})`;\n\n return parseSnippet(snippet);\n};\n\n/**\n * Injects or ensures `dictionary: { format: '<value>' }` exists in an object\n * expression. Leaves any pre-existing `dictionary` properties untouched —\n * only the `format` sub-property is added when absent.\n */\nconst injectDictionaryFormat = (objExpr: any, format: string): void => {\n if (\n !objExpr ||\n (objExpr.type !== 'ObjectExpression' && !n.ObjectExpression.check(objExpr))\n )\n return;\n\n let dictionaryProp = (objExpr.properties as any[]).find((prop: any) => {\n if (!prop?.key) return false;\n return (prop.key.name ?? prop.key.value) === 'dictionary';\n });\n\n if (!dictionaryProp) {\n dictionaryProp = b.property(\n 'init',\n b.identifier('dictionary'),\n b.objectExpression([])\n );\n (objExpr.properties as any[]).push(dictionaryProp);\n }\n\n const dictionaryObj = dictionaryProp.value;\n if (\n !dictionaryObj ||\n (dictionaryObj.type !== 'ObjectExpression' &&\n !n.ObjectExpression.check(dictionaryObj))\n )\n return;\n\n const hasFormat = (dictionaryObj.properties as any[]).some((prop: any) => {\n if (!prop?.key) return false;\n return (prop.key.name ?? prop.key.value) === 'format';\n });\n\n if (!hasFormat) {\n (dictionaryObj.properties as any[]).push(\n b.property('init', b.identifier('format'), b.stringLiteral(format))\n );\n }\n};\n\n/**\n * Injects the sync plugin import (`syncJSON` / `syncPO`) and a configured\n * `syncJSON(...)` / `syncPO(...)` call into the plugins array of an intlayer\n * config file. Idempotent: skips when the plugin call is already present.\n */\nexport const updateIntlayerConfigWithSyncPlugin = (\n content: string,\n extension: string,\n syncConfig: CompatSyncConfig\n): string => {\n const ast = recast.parse(content, {\n parser: typescriptParser,\n });\n\n const isCJSFile = extension === 'cjs' || content.includes('module.exports');\n\n const { functionName, packageSource } = getSyncPluginInfo(syncConfig);\n\n injectImport(ast, isCJSFile, functionName, packageSource);\n\n const callNode = buildSyncCallNode(syncConfig);\n\n // PO catalogs are serialized as gettext; JSON catalogs carry the dialect.\n const dictionaryFormat =\n syncConfig.plugin === 'po' ? 'po' : syncConfig.format;\n\n genericRecastVisit(ast, (objExpr) => {\n if (\n !objExpr ||\n (objExpr.type !== 'ObjectExpression' &&\n !n.ObjectExpression.check(objExpr))\n )\n return;\n\n // Inject dictionary.format alongside the plugin so intlayer knows how to\n // interpret dictionary content at runtime.\n injectDictionaryFormat(objExpr, dictionaryFormat);\n\n let pluginsProp = (objExpr.properties as any[]).find((prop: any) => {\n if (!prop?.key) return false;\n const keyName = prop.key.name ?? prop.key.value;\n return keyName === 'plugins';\n });\n\n if (!pluginsProp) {\n pluginsProp = b.property(\n 'init',\n b.identifier('plugins'),\n b.arrayExpression([])\n );\n (objExpr.properties as any[]).push(pluginsProp);\n }\n\n const arrayValue = pluginsProp.value;\n\n if (\n arrayValue &&\n (arrayValue.type === 'ArrayExpression' ||\n n.ArrayExpression.check(arrayValue))\n ) {\n const hasSyncPlugin = (arrayValue.elements as any[]).some(\n (element: any) => {\n const callee = element?.callee;\n if (!callee) return false;\n const name: string = callee.name ?? callee.id?.name;\n return name === functionName;\n }\n );\n\n if (!hasSyncPlugin) {\n (arrayValue.elements as any[]).push(callNode);\n }\n }\n });\n\n return recast.print(ast).code;\n};\n"],"mappings":"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"}
@@ -210,7 +210,9 @@ const detectNextIntlMessagesPattern = async (rootDir) => {
210
210
  const importPath = (await readFileFromRoot(rootDir, requestFile)).match(/import\(\s*`([^`]*\$\{\s*locale\s*\}[^`]*\.json)`/)?.[1];
211
211
  if (!importPath) continue;
212
212
  if (!importPath.startsWith(".")) continue;
213
- const relativeTemplate = (0, node_path.relative)(rootDir, (0, node_path.resolve)((0, node_path.dirname)((0, node_path.resolve)(rootDir, requestFile)), importPath)).split(node_path.sep).join("/");
213
+ const requestDir = (0, node_path.dirname)((0, node_path.resolve)(rootDir, requestFile));
214
+ const absoluteTemplate = (0, node_path.resolve)(requestDir, importPath);
215
+ const relativeTemplate = (0, node_path.relative)(rootDir, absoluteTemplate).split(node_path.sep).join("/");
214
216
  const template = relativeTemplate.startsWith(".") ? relativeTemplate : `./${relativeTemplate}`;
215
217
  return {
216
218
  type: template.includes("${key}") || template.includes("${namespace}") ? "nested" : "flat",