@intlayer/cli 9.0.0-canary.8 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (331) hide show
  1. package/dist/cjs/IntlayerEventListener.cjs +1 -1
  2. package/dist/cjs/IntlayerEventListener.cjs.map +1 -1
  3. package/dist/cjs/_virtual/_utils_asset.cjs +4 -3
  4. package/dist/cjs/auth/login.cjs +2 -2
  5. package/dist/cjs/auth/login.cjs.map +1 -1
  6. package/dist/cjs/auth/sessionToken.cjs +0 -1
  7. package/dist/cjs/auth/sessionToken.cjs.map +1 -1
  8. package/dist/cjs/build.cjs +6 -7
  9. package/dist/cjs/build.cjs.map +1 -1
  10. package/dist/cjs/bundle.cjs +32 -1
  11. package/dist/cjs/bundle.cjs.map +1 -1
  12. package/dist/cjs/ci.cjs +96 -29
  13. package/dist/cjs/ci.cjs.map +1 -1
  14. package/dist/cjs/cli.cjs +163 -129
  15. package/dist/cjs/cli.cjs.map +1 -1
  16. package/dist/cjs/config.cjs +2 -3
  17. package/dist/cjs/config.cjs.map +1 -1
  18. package/dist/cjs/editor.cjs +0 -1
  19. package/dist/cjs/editor.cjs.map +1 -1
  20. package/dist/cjs/extract.cjs +7 -7
  21. package/dist/cjs/extract.cjs.map +1 -1
  22. package/dist/cjs/fill/deepMergeContent.cjs.map +1 -1
  23. package/dist/cjs/fill/extractTranslatableContent.cjs.map +1 -1
  24. package/dist/cjs/fill/fill.cjs +11 -11
  25. package/dist/cjs/fill/fill.cjs.map +1 -1
  26. package/dist/cjs/fill/formatAutoFilledFilePath.cjs +2 -3
  27. package/dist/cjs/fill/formatAutoFilledFilePath.cjs.map +1 -1
  28. package/dist/cjs/fill/formatFillData.cjs +3 -4
  29. package/dist/cjs/fill/formatFillData.cjs.map +1 -1
  30. package/dist/cjs/fill/getAvailableLocalesInDictionary.cjs.map +1 -1
  31. package/dist/cjs/fill/getFilterMissingContentPerLocale.cjs.map +1 -1
  32. package/dist/cjs/fill/listTranslationsTasks.cjs +2 -2
  33. package/dist/cjs/fill/listTranslationsTasks.cjs.map +1 -1
  34. package/dist/cjs/fill/translateDictionary.cjs +7 -7
  35. package/dist/cjs/fill/translateDictionary.cjs.map +1 -1
  36. package/dist/cjs/fill/writeFill.cjs +5 -6
  37. package/dist/cjs/fill/writeFill.cjs.map +1 -1
  38. package/dist/cjs/getTargetDictionary.cjs +2 -3
  39. package/dist/cjs/getTargetDictionary.cjs.map +1 -1
  40. package/dist/cjs/index.cjs +3 -3
  41. package/dist/cjs/init.cjs +171 -6
  42. package/dist/cjs/init.cjs.map +1 -1
  43. package/dist/cjs/initBuildOptimization.cjs +6 -6
  44. package/dist/cjs/initBuildOptimization.cjs.map +1 -1
  45. package/dist/cjs/initCompiler.cjs +3 -3
  46. package/dist/cjs/initCompiler.cjs.map +1 -1
  47. package/dist/cjs/initMCP.cjs +3 -3
  48. package/dist/cjs/initMCP.cjs.map +1 -1
  49. package/dist/cjs/initSkills.cjs +11 -11
  50. package/dist/cjs/initSkills.cjs.map +1 -1
  51. package/dist/cjs/listContentDeclaration.cjs +4 -5
  52. package/dist/cjs/listContentDeclaration.cjs.map +1 -1
  53. package/dist/cjs/listProjects.cjs +2 -3
  54. package/dist/cjs/listProjects.cjs.map +1 -1
  55. package/dist/cjs/liveSync.cjs +4 -4
  56. package/dist/cjs/liveSync.cjs.map +1 -1
  57. package/dist/cjs/pull.cjs +7 -7
  58. package/dist/cjs/pull.cjs.map +1 -1
  59. package/dist/cjs/push/pullLog.cjs +2 -2
  60. package/dist/cjs/push/pullLog.cjs.map +1 -1
  61. package/dist/cjs/push/push.cjs +13 -13
  62. package/dist/cjs/push/push.cjs.map +1 -1
  63. package/dist/cjs/pushConfig.cjs +2 -3
  64. package/dist/cjs/pushConfig.cjs.map +1 -1
  65. package/dist/cjs/pushLog.cjs.map +1 -1
  66. package/dist/cjs/reviewDoc/reviewDoc.cjs +16 -16
  67. package/dist/cjs/reviewDoc/reviewDoc.cjs.map +1 -1
  68. package/dist/cjs/reviewDoc/reviewDocBlockAware.cjs +11 -11
  69. package/dist/cjs/reviewDoc/reviewDocBlockAware.cjs.map +1 -1
  70. package/dist/cjs/reviewDoc/reviewDocLog.cjs +7 -8
  71. package/dist/cjs/reviewDoc/reviewDocLog.cjs.map +1 -1
  72. package/dist/cjs/scan.cjs +5 -5
  73. package/dist/cjs/scan.cjs.map +1 -1
  74. package/dist/cjs/searchDoc.cjs +2 -3
  75. package/dist/cjs/searchDoc.cjs.map +1 -1
  76. package/dist/cjs/test/listMissingTranslations.cjs +3 -4
  77. package/dist/cjs/test/listMissingTranslations.cjs.map +1 -1
  78. package/dist/cjs/test/test.cjs +11 -11
  79. package/dist/cjs/test/test.cjs.map +1 -1
  80. package/dist/cjs/translateDoc/translateDoc.cjs +6 -6
  81. package/dist/cjs/translateDoc/translateDoc.cjs.map +1 -1
  82. package/dist/cjs/translateDoc/translateFile.cjs +5 -5
  83. package/dist/cjs/translateDoc/translateFile.cjs.map +1 -1
  84. package/dist/cjs/translateDoc/validation.cjs.map +1 -1
  85. package/dist/cjs/utils/calculateChunks.cjs +4 -5
  86. package/dist/cjs/utils/calculateChunks.cjs.map +1 -1
  87. package/dist/cjs/utils/checkAccess.cjs.map +1 -1
  88. package/dist/cjs/utils/checkConfigConsistency.cjs.map +1 -1
  89. package/dist/cjs/utils/checkFileModifiedRange.cjs.map +1 -1
  90. package/dist/cjs/utils/checkLastUpdateTime.cjs +0 -1
  91. package/dist/cjs/utils/checkLastUpdateTime.cjs.map +1 -1
  92. package/dist/cjs/utils/chunkInference.cjs +0 -1
  93. package/dist/cjs/utils/chunkInference.cjs.map +1 -1
  94. package/dist/cjs/utils/fixChunkStartEndChars.cjs.map +1 -1
  95. package/dist/cjs/utils/formatLineRanges.cjs.map +1 -1
  96. package/dist/cjs/utils/formatTimeDiff.cjs.map +1 -1
  97. package/dist/cjs/utils/getIsFileUpdatedRecently.cjs +1 -2
  98. package/dist/cjs/utils/getIsFileUpdatedRecently.cjs.map +1 -1
  99. package/dist/cjs/utils/getOutputFilePath.cjs +2 -3
  100. package/dist/cjs/utils/getOutputFilePath.cjs.map +1 -1
  101. package/dist/cjs/utils/getParentPackageJSON.cjs +0 -1
  102. package/dist/cjs/utils/getParentPackageJSON.cjs.map +1 -1
  103. package/dist/cjs/utils/listSpecialChars.cjs.map +1 -1
  104. package/dist/cjs/utils/mapChunksBetweenFiles.cjs +4 -5
  105. package/dist/cjs/utils/mapChunksBetweenFiles.cjs.map +1 -1
  106. package/dist/cjs/utils/openBrowser.cjs +0 -1
  107. package/dist/cjs/utils/openBrowser.cjs.map +1 -1
  108. package/dist/cjs/utils/reorderParagraphs.cjs.map +1 -1
  109. package/dist/cjs/utils/selectCmsEnvironment.cjs.map +1 -1
  110. package/dist/cjs/utils/setupAI.cjs.map +1 -1
  111. package/dist/cjs/watch.cjs +28 -9
  112. package/dist/cjs/watch.cjs.map +1 -1
  113. package/dist/esm/IntlayerEventListener.mjs +1 -0
  114. package/dist/esm/IntlayerEventListener.mjs.map +1 -1
  115. package/dist/esm/_virtual/_utils_asset.mjs +4 -2
  116. package/dist/esm/auth/login.mjs +1 -1
  117. package/dist/esm/auth/login.mjs.map +1 -1
  118. package/dist/esm/auth/sessionToken.mjs.map +1 -1
  119. package/dist/esm/build.mjs +3 -3
  120. package/dist/esm/build.mjs.map +1 -1
  121. package/dist/esm/bundle.mjs +32 -1
  122. package/dist/esm/bundle.mjs.map +1 -1
  123. package/dist/esm/ci.mjs +95 -30
  124. package/dist/esm/ci.mjs.map +1 -1
  125. package/dist/esm/cli.mjs +141 -106
  126. package/dist/esm/cli.mjs.map +1 -1
  127. package/dist/esm/config.mjs +1 -1
  128. package/dist/esm/config.mjs.map +1 -1
  129. package/dist/esm/editor.mjs.map +1 -1
  130. package/dist/esm/extract.mjs +3 -3
  131. package/dist/esm/extract.mjs.map +1 -1
  132. package/dist/esm/fill/deepMergeContent.mjs.map +1 -1
  133. package/dist/esm/fill/extractTranslatableContent.mjs.map +1 -1
  134. package/dist/esm/fill/fill.mjs +3 -3
  135. package/dist/esm/fill/fill.mjs.map +1 -1
  136. package/dist/esm/fill/formatAutoFilledFilePath.mjs +1 -1
  137. package/dist/esm/fill/formatAutoFilledFilePath.mjs.map +1 -1
  138. package/dist/esm/fill/formatFillData.mjs +1 -1
  139. package/dist/esm/fill/formatFillData.mjs.map +1 -1
  140. package/dist/esm/fill/getAvailableLocalesInDictionary.mjs.map +1 -1
  141. package/dist/esm/fill/getFilterMissingContentPerLocale.mjs.map +1 -1
  142. package/dist/esm/fill/listTranslationsTasks.mjs +1 -1
  143. package/dist/esm/fill/listTranslationsTasks.mjs.map +1 -1
  144. package/dist/esm/fill/translateDictionary.mjs +1 -1
  145. package/dist/esm/fill/translateDictionary.mjs.map +1 -1
  146. package/dist/esm/fill/writeFill.mjs +2 -2
  147. package/dist/esm/fill/writeFill.mjs.map +1 -1
  148. package/dist/esm/getTargetDictionary.mjs +1 -1
  149. package/dist/esm/getTargetDictionary.mjs.map +1 -1
  150. package/dist/esm/index.mjs +3 -3
  151. package/dist/esm/init.mjs +167 -2
  152. package/dist/esm/init.mjs.map +1 -1
  153. package/dist/esm/initBuildOptimization.mjs +1 -1
  154. package/dist/esm/initBuildOptimization.mjs.map +1 -1
  155. package/dist/esm/initCompiler.mjs +1 -1
  156. package/dist/esm/initCompiler.mjs.map +1 -1
  157. package/dist/esm/initMCP.mjs +1 -1
  158. package/dist/esm/initMCP.mjs.map +1 -1
  159. package/dist/esm/initSkills.mjs +1 -1
  160. package/dist/esm/initSkills.mjs.map +1 -1
  161. package/dist/esm/listContentDeclaration.mjs +2 -2
  162. package/dist/esm/listContentDeclaration.mjs.map +1 -1
  163. package/dist/esm/listProjects.mjs +1 -1
  164. package/dist/esm/listProjects.mjs.map +1 -1
  165. package/dist/esm/liveSync.mjs +2 -2
  166. package/dist/esm/liveSync.mjs.map +1 -1
  167. package/dist/esm/pull.mjs +4 -4
  168. package/dist/esm/pull.mjs.map +1 -1
  169. package/dist/esm/push/pullLog.mjs +2 -2
  170. package/dist/esm/push/pullLog.mjs.map +1 -1
  171. package/dist/esm/push/push.mjs +3 -3
  172. package/dist/esm/push/push.mjs.map +1 -1
  173. package/dist/esm/pushConfig.mjs +1 -1
  174. package/dist/esm/pushConfig.mjs.map +1 -1
  175. package/dist/esm/pushLog.mjs.map +1 -1
  176. package/dist/esm/reviewDoc/reviewDoc.mjs +3 -3
  177. package/dist/esm/reviewDoc/reviewDoc.mjs.map +1 -1
  178. package/dist/esm/reviewDoc/reviewDocBlockAware.mjs +2 -2
  179. package/dist/esm/reviewDoc/reviewDocBlockAware.mjs.map +1 -1
  180. package/dist/esm/reviewDoc/reviewDocLog.mjs +2 -2
  181. package/dist/esm/reviewDoc/reviewDocLog.mjs.map +1 -1
  182. package/dist/esm/scan.mjs +1 -1
  183. package/dist/esm/scan.mjs.map +1 -1
  184. package/dist/esm/searchDoc.mjs +1 -1
  185. package/dist/esm/searchDoc.mjs.map +1 -1
  186. package/dist/esm/test/listMissingTranslations.mjs +2 -2
  187. package/dist/esm/test/listMissingTranslations.mjs.map +1 -1
  188. package/dist/esm/test/test.mjs +2 -2
  189. package/dist/esm/test/test.mjs.map +1 -1
  190. package/dist/esm/translateDoc/translateDoc.mjs +2 -2
  191. package/dist/esm/translateDoc/translateDoc.mjs.map +1 -1
  192. package/dist/esm/translateDoc/translateFile.mjs +1 -1
  193. package/dist/esm/translateDoc/translateFile.mjs.map +1 -1
  194. package/dist/esm/translateDoc/validation.mjs.map +1 -1
  195. package/dist/esm/utils/calculateChunks.mjs +1 -1
  196. package/dist/esm/utils/calculateChunks.mjs.map +1 -1
  197. package/dist/esm/utils/checkAccess.mjs.map +1 -1
  198. package/dist/esm/utils/checkConfigConsistency.mjs.map +1 -1
  199. package/dist/esm/utils/checkFileModifiedRange.mjs.map +1 -1
  200. package/dist/esm/utils/checkLastUpdateTime.mjs.map +1 -1
  201. package/dist/esm/utils/chunkInference.mjs.map +1 -1
  202. package/dist/esm/utils/fixChunkStartEndChars.mjs.map +1 -1
  203. package/dist/esm/utils/formatLineRanges.mjs.map +1 -1
  204. package/dist/esm/utils/formatTimeDiff.mjs.map +1 -1
  205. package/dist/esm/utils/getIsFileUpdatedRecently.mjs +1 -1
  206. package/dist/esm/utils/getIsFileUpdatedRecently.mjs.map +1 -1
  207. package/dist/esm/utils/getOutputFilePath.mjs +1 -1
  208. package/dist/esm/utils/getOutputFilePath.mjs.map +1 -1
  209. package/dist/esm/utils/getParentPackageJSON.mjs.map +1 -1
  210. package/dist/esm/utils/listSpecialChars.mjs.map +1 -1
  211. package/dist/esm/utils/mapChunksBetweenFiles.mjs +1 -1
  212. package/dist/esm/utils/mapChunksBetweenFiles.mjs.map +1 -1
  213. package/dist/esm/utils/openBrowser.mjs.map +1 -1
  214. package/dist/esm/utils/reorderParagraphs.mjs.map +1 -1
  215. package/dist/esm/utils/selectCmsEnvironment.mjs.map +1 -1
  216. package/dist/esm/utils/setupAI.mjs.map +1 -1
  217. package/dist/esm/watch.mjs +25 -5
  218. package/dist/esm/watch.mjs.map +1 -1
  219. package/dist/types/IntlayerEventListener.d.ts +0 -1
  220. package/dist/types/IntlayerEventListener.d.ts.map +1 -1
  221. package/dist/types/auth/login.d.ts +0 -1
  222. package/dist/types/auth/login.d.ts.map +1 -1
  223. package/dist/types/auth/sessionToken.d.ts +0 -1
  224. package/dist/types/auth/sessionToken.d.ts.map +1 -1
  225. package/dist/types/build.d.ts +0 -1
  226. package/dist/types/build.d.ts.map +1 -1
  227. package/dist/types/bundle.d.ts +0 -1
  228. package/dist/types/bundle.d.ts.map +1 -1
  229. package/dist/types/ci.d.ts +40 -1
  230. package/dist/types/ci.d.ts.map +1 -1
  231. package/dist/types/cli.d.ts +0 -1
  232. package/dist/types/cli.d.ts.map +1 -1
  233. package/dist/types/config.d.ts +0 -1
  234. package/dist/types/config.d.ts.map +1 -1
  235. package/dist/types/editor.d.ts.map +1 -1
  236. package/dist/types/extract.d.ts +0 -1
  237. package/dist/types/extract.d.ts.map +1 -1
  238. package/dist/types/fill/deepMergeContent.d.ts.map +1 -1
  239. package/dist/types/fill/extractTranslatableContent.d.ts.map +1 -1
  240. package/dist/types/fill/fill.d.ts +1 -2
  241. package/dist/types/fill/fill.d.ts.map +1 -1
  242. package/dist/types/fill/formatAutoFilledFilePath.d.ts +0 -1
  243. package/dist/types/fill/formatAutoFilledFilePath.d.ts.map +1 -1
  244. package/dist/types/fill/formatFillData.d.ts +0 -1
  245. package/dist/types/fill/formatFillData.d.ts.map +1 -1
  246. package/dist/types/fill/getAvailableLocalesInDictionary.d.ts +0 -1
  247. package/dist/types/fill/getAvailableLocalesInDictionary.d.ts.map +1 -1
  248. package/dist/types/fill/getFilterMissingContentPerLocale.d.ts +0 -1
  249. package/dist/types/fill/getFilterMissingContentPerLocale.d.ts.map +1 -1
  250. package/dist/types/fill/listTranslationsTasks.d.ts +1 -2
  251. package/dist/types/fill/listTranslationsTasks.d.ts.map +1 -1
  252. package/dist/types/fill/translateDictionary.d.ts +1 -3
  253. package/dist/types/fill/translateDictionary.d.ts.map +1 -1
  254. package/dist/types/fill/writeFill.d.ts +0 -1
  255. package/dist/types/fill/writeFill.d.ts.map +1 -1
  256. package/dist/types/getTargetDictionary.d.ts +1 -2
  257. package/dist/types/getTargetDictionary.d.ts.map +1 -1
  258. package/dist/types/index.d.ts +5 -4
  259. package/dist/types/init.d.ts +1 -2
  260. package/dist/types/init.d.ts.map +1 -1
  261. package/dist/types/initBuildOptimization.d.ts.map +1 -1
  262. package/dist/types/initCompiler.d.ts.map +1 -1
  263. package/dist/types/initMCP.d.ts +1 -2
  264. package/dist/types/initMCP.d.ts.map +1 -1
  265. package/dist/types/initSkills.d.ts +1 -2
  266. package/dist/types/initSkills.d.ts.map +1 -1
  267. package/dist/types/listContentDeclaration.d.ts +0 -1
  268. package/dist/types/listContentDeclaration.d.ts.map +1 -1
  269. package/dist/types/listProjects.d.ts +1 -2
  270. package/dist/types/listProjects.d.ts.map +1 -1
  271. package/dist/types/liveSync.d.ts +0 -1
  272. package/dist/types/liveSync.d.ts.map +1 -1
  273. package/dist/types/pull.d.ts +0 -1
  274. package/dist/types/pull.d.ts.map +1 -1
  275. package/dist/types/push/pullLog.d.ts +1 -2
  276. package/dist/types/push/pullLog.d.ts.map +1 -1
  277. package/dist/types/push/push.d.ts +1 -2
  278. package/dist/types/push/push.d.ts.map +1 -1
  279. package/dist/types/pushConfig.d.ts +0 -1
  280. package/dist/types/pushConfig.d.ts.map +1 -1
  281. package/dist/types/pushLog.d.ts.map +1 -1
  282. package/dist/types/reviewDoc/reviewDoc.d.ts +2 -17
  283. package/dist/types/reviewDoc/reviewDoc.d.ts.map +1 -1
  284. package/dist/types/reviewDoc/reviewDocBlockAware.d.ts +0 -1
  285. package/dist/types/reviewDoc/reviewDocBlockAware.d.ts.map +1 -1
  286. package/dist/types/reviewDoc/reviewDocLog.d.ts +1 -2
  287. package/dist/types/reviewDoc/reviewDocLog.d.ts.map +1 -1
  288. package/dist/types/scan.d.ts +3 -2
  289. package/dist/types/scan.d.ts.map +1 -1
  290. package/dist/types/searchDoc.d.ts +1 -6
  291. package/dist/types/searchDoc.d.ts.map +1 -1
  292. package/dist/types/test/listMissingTranslations.d.ts +0 -1
  293. package/dist/types/test/listMissingTranslations.d.ts.map +1 -1
  294. package/dist/types/test/test.d.ts +0 -1
  295. package/dist/types/test/test.d.ts.map +1 -1
  296. package/dist/types/translateDoc/translateDoc.d.ts +1 -16
  297. package/dist/types/translateDoc/translateDoc.d.ts.map +1 -1
  298. package/dist/types/translateDoc/translateFile.d.ts +1 -16
  299. package/dist/types/translateDoc/translateFile.d.ts.map +1 -1
  300. package/dist/types/translateDoc/types.d.ts +1 -2
  301. package/dist/types/translateDoc/types.d.ts.map +1 -1
  302. package/dist/types/translateDoc/validation.d.ts +0 -1
  303. package/dist/types/translateDoc/validation.d.ts.map +1 -1
  304. package/dist/types/utils/calculateChunks.d.ts.map +1 -1
  305. package/dist/types/utils/checkAccess.d.ts +0 -1
  306. package/dist/types/utils/checkAccess.d.ts.map +1 -1
  307. package/dist/types/utils/checkConfigConsistency.d.ts.map +1 -1
  308. package/dist/types/utils/checkFileModifiedRange.d.ts.map +1 -1
  309. package/dist/types/utils/checkLastUpdateTime.d.ts.map +1 -1
  310. package/dist/types/utils/chunkInference.d.ts +0 -1
  311. package/dist/types/utils/chunkInference.d.ts.map +1 -1
  312. package/dist/types/utils/fixChunkStartEndChars.d.ts.map +1 -1
  313. package/dist/types/utils/formatLineRanges.d.ts.map +1 -1
  314. package/dist/types/utils/formatTimeDiff.d.ts.map +1 -1
  315. package/dist/types/utils/getIsFileUpdatedRecently.d.ts.map +1 -1
  316. package/dist/types/utils/getOutputFilePath.d.ts +0 -1
  317. package/dist/types/utils/getOutputFilePath.d.ts.map +1 -1
  318. package/dist/types/utils/getParentPackageJSON.d.ts.map +1 -1
  319. package/dist/types/utils/listSpecialChars.d.ts +4 -2
  320. package/dist/types/utils/listSpecialChars.d.ts.map +1 -1
  321. package/dist/types/utils/mapChunksBetweenFiles.d.ts +0 -1
  322. package/dist/types/utils/mapChunksBetweenFiles.d.ts.map +1 -1
  323. package/dist/types/utils/openBrowser.d.ts.map +1 -1
  324. package/dist/types/utils/reorderParagraphs.d.ts.map +1 -1
  325. package/dist/types/utils/selectCmsEnvironment.d.ts +0 -1
  326. package/dist/types/utils/selectCmsEnvironment.d.ts.map +1 -1
  327. package/dist/types/utils/setupAI.d.ts +1 -3
  328. package/dist/types/utils/setupAI.d.ts.map +1 -1
  329. package/dist/types/watch.d.ts +0 -1
  330. package/dist/types/watch.d.ts.map +1 -1
  331. package/package.json +17 -17
package/dist/esm/ci.mjs CHANGED
@@ -1,28 +1,87 @@
1
- import { normalize, resolve } from "node:path";
2
- import { listProjects } from "@intlayer/chokidar/cli";
1
+ import { resolve, sep } from "node:path";
3
2
  import { logger } from "@intlayer/config/logger";
3
+ import { detectPackageManager, listProjects } from "@intlayer/engine/cli";
4
4
  import { spawnSync } from "node:child_process";
5
5
 
6
6
  //#region src/ci.ts
7
- const getPackageManagerCommand = () => {
7
+ /**
8
+ * Detects the command used to run the local `intlayer` binary. Prefers the
9
+ * package manager that launched the current process (`npm_config_user_agent`),
10
+ * and falls back to lock file detection when the CLI was not started through a
11
+ * package manager (e.g. a global install or a bare CI runner).
12
+ */
13
+ const getPackageManagerCommand = (lockFileSearchDir) => {
8
14
  const userAgent = process.env.npm_config_user_agent;
9
- if (userAgent?.startsWith("bun")) return {
10
- command: "bun",
11
- args: ["intlayer"]
12
- };
13
- if (userAgent?.startsWith("pnpm")) return {
14
- command: "pnpm",
15
- args: ["exec", "intlayer"]
15
+ const commandByPackageManager = {
16
+ bun: {
17
+ command: "bun",
18
+ args: ["intlayer"]
19
+ },
20
+ pnpm: {
21
+ command: "pnpm",
22
+ args: ["exec", "intlayer"]
23
+ },
24
+ yarn: {
25
+ command: "yarn",
26
+ args: ["run", "intlayer"]
27
+ },
28
+ npm: {
29
+ command: "npx",
30
+ args: ["intlayer"]
31
+ }
16
32
  };
17
- if (userAgent?.startsWith("yarn")) return {
18
- command: "yarn",
19
- args: ["run", "intlayer"]
33
+ const userAgentPackageManager = Object.keys(commandByPackageManager).find((packageManager) => userAgent?.startsWith(packageManager));
34
+ if (userAgentPackageManager) return commandByPackageManager[userAgentPackageManager];
35
+ return commandByPackageManager[detectPackageManager(lockFileSearchDir)];
36
+ };
37
+ /**
38
+ * Splits a path into segments, accepting both posix and windows separators so
39
+ * credential keys written on any OS compare equal to local project paths.
40
+ */
41
+ const toPathSegments = (path) => path.split(/[\\/]+/).filter((segment) => segment !== "" && segment !== ".");
42
+ /**
43
+ * Returns true when a credentials key designates the given project directory.
44
+ * A key matches when it is:
45
+ * - the absolute path of the project,
46
+ * - a path relative to `searchDir` (the repository root), or
47
+ * - a trailing sequence of full path segments of the project path (so the key
48
+ * `"apps/web"` matches `/repo/apps/web`, but `"app"` never matches
49
+ * `/repo/my-app`).
50
+ */
51
+ const credentialsKeyMatchesProject = (key, projectPath, searchDir) => {
52
+ if (resolve(key) === projectPath) return true;
53
+ if (resolve(searchDir, key) === projectPath) return true;
54
+ const keySegments = toPathSegments(key);
55
+ const projectSegments = toPathSegments(projectPath);
56
+ if (keySegments.length === 0 || keySegments.length > projectSegments.length) return false;
57
+ const trailingProjectSegments = projectSegments.slice(-keySegments.length);
58
+ return keySegments.every((segment, index) => trailingProjectSegments[index] === segment);
59
+ };
60
+ /**
61
+ * Selects the projects the CI command must run in:
62
+ * - run from the repository root → every discovered project (monorepo mode);
63
+ * - run from inside a project directory (or any of its subdirectories) → that
64
+ * project only, the deepest match winning when projects are nested;
65
+ * - run anywhere else → every discovered project.
66
+ */
67
+ const selectProjectsToRun = (currentWorkingDir, searchDir, projectsPath) => {
68
+ const cwd = resolve(currentWorkingDir);
69
+ if (cwd === resolve(searchDir)) return {
70
+ projectsToRun: projectsPath,
71
+ currentProject: void 0
20
72
  };
73
+ const currentProject = projectsPath.filter((projectPath) => cwd === projectPath || cwd.startsWith(projectPath + sep)).sort((a, b) => b.length - a.length)[0];
21
74
  return {
22
- command: "npx",
23
- args: ["intlayer"]
75
+ projectsToRun: currentProject ? [currentProject] : projectsPath,
76
+ currentProject
24
77
  };
25
78
  };
79
+ /**
80
+ * Runs an intlayer command in every Intlayer project of the repository (or
81
+ * only in the current one when invoked from inside a project directory),
82
+ * injecting per-project CMS credentials from `INTLAYER_PROJECT_CREDENTIALS`.
83
+ * Exits with code 1 when the command fails in at least one project.
84
+ */
26
85
  const runCI = async (commands) => {
27
86
  const credentialsEnv = process.env.INTLAYER_PROJECT_CREDENTIALS;
28
87
  let credentials = {};
@@ -31,15 +90,14 @@ const runCI = async (commands) => {
31
90
  } catch {
32
91
  logger("INTLAYER_PROJECT_CREDENTIALS is not valid JSON. Proceeding without credentials.", { level: "warn" });
33
92
  }
34
- const cwd = process.cwd();
35
- const { projectsPath } = await listProjects();
36
- if (projectsPath.length === 0) {
93
+ const { searchDir, projectsPath } = await listProjects({ gitRoot: true });
94
+ const normalizedProjectsPath = projectsPath.map((projectPath) => resolve(projectPath));
95
+ if (normalizedProjectsPath.length === 0) {
37
96
  logger("No Intlayer projects found.", { level: "warn" });
38
97
  return;
39
98
  }
40
- const currentProject = projectsPath.find((p) => cwd === p);
41
- const projectsToRun = currentProject ? [currentProject] : projectsPath;
42
- const { command, args: pmArgs } = getPackageManagerCommand();
99
+ const { projectsToRun, currentProject } = selectProjectsToRun(process.cwd(), searchDir, normalizedProjectsPath);
100
+ const { command, args: pmArgs } = getPackageManagerCommand(searchDir);
43
101
  const finalArgs = [...pmArgs, ...commands];
44
102
  logger(`CI: Using package manager: ${command}`, {
45
103
  level: "info",
@@ -47,29 +105,36 @@ const runCI = async (commands) => {
47
105
  });
48
106
  if (currentProject) logger(`CI: Detected project context: ${currentProject}`, { level: "info" });
49
107
  else logger(`CI: No specific project context detected. Iterating over ${projectsToRun.length} discovered projects...`, { level: "info" });
50
- let hasError = false;
108
+ const failedProjects = [];
51
109
  for (const projectPath of projectsToRun) {
52
- const creds = Object.entries(credentials).find(([key]) => {
53
- return resolve(key) === projectPath || projectPath.endsWith(normalize(key));
54
- })?.[1];
110
+ const creds = Object.entries(credentials).find(([key]) => credentialsKeyMatchesProject(key, projectPath, searchDir))?.[1];
55
111
  logger(`\nCI: Executing for ${projectPath}...`, { level: "info" });
56
112
  const envVars = { ...process.env };
57
113
  if (creds) {
58
114
  envVars.INTLAYER_CLIENT_ID = creds.clientId;
59
115
  envVars.INTLAYER_CLIENT_SECRET = creds.clientSecret;
60
116
  } else if (credentialsEnv) logger(`CI: No matching credentials found for ${projectPath} in INTLAYER_PROJECT_CREDENTIALS.`, { isVerbose: true });
61
- if (spawnSync(command, finalArgs, {
117
+ const result = spawnSync(command, finalArgs, {
62
118
  cwd: projectPath,
63
119
  stdio: "inherit",
64
120
  env: envVars
65
- }).status !== 0) {
121
+ });
122
+ if (result.error) {
123
+ logger(`CI: Failed to launch "${command}" for ${projectPath}: ${result.error.message}`, { level: "error" });
124
+ failedProjects.push(projectPath);
125
+ continue;
126
+ }
127
+ if (result.status !== 0) {
66
128
  logger(`CI: Failed for ${projectPath}`, { level: "error" });
67
- hasError = true;
129
+ failedProjects.push(projectPath);
68
130
  }
69
131
  }
70
- if (hasError) process.exit(1);
132
+ if (failedProjects.length > 0) {
133
+ logger(`\nCI: ${failedProjects.length}/${projectsToRun.length} project(s) failed:\n${failedProjects.map((projectPath) => ` - ${projectPath}`).join("\n")}`, { level: "error" });
134
+ process.exit(1);
135
+ }
71
136
  };
72
137
 
73
138
  //#endregion
74
- export { runCI };
139
+ export { credentialsKeyMatchesProject, getPackageManagerCommand, runCI, selectProjectsToRun };
75
140
  //# sourceMappingURL=ci.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ci.mjs","names":[],"sources":["../../src/ci.ts"],"sourcesContent":["import { spawnSync } from 'node:child_process';\nimport { normalize, resolve } from 'node:path';\nimport { listProjects } from '@intlayer/chokidar/cli';\nimport { logger } from '@intlayer/config/logger';\n\n// Helper to detect the package manager used to run the command\nconst getPackageManagerCommand = () => {\n const userAgent = process.env.npm_config_user_agent;\n\n if (userAgent?.startsWith('bun')) {\n return { command: 'bun', args: ['intlayer'] }; // Bun runs local bins natively\n }\n if (userAgent?.startsWith('pnpm')) {\n return { command: 'pnpm', args: ['exec', 'intlayer'] }; // pnpm requires 'exec'\n }\n if (userAgent?.startsWith('yarn')) {\n return { command: 'yarn', args: ['run', 'intlayer'] }; // yarn requires 'run' or 'exec'\n }\n\n // Default fallback\n return { command: 'npx', args: ['intlayer'] };\n};\n\nexport const runCI = async (commands: string[]) => {\n const credentialsEnv = process.env.INTLAYER_PROJECT_CREDENTIALS;\n let credentials: Record<string, { clientId: string; clientSecret: string }> =\n {};\n\n // Parse Credentials (Optional now)\n if (credentialsEnv) {\n try {\n credentials = JSON.parse(credentialsEnv);\n } catch {\n logger(\n 'INTLAYER_PROJECT_CREDENTIALS is not valid JSON. Proceeding without credentials.',\n {\n level: 'warn',\n }\n );\n }\n }\n\n const cwd = process.cwd();\n\n // Discover Projects\n const { projectsPath } = await listProjects();\n\n if (projectsPath.length === 0) {\n logger('No Intlayer projects found.', { level: 'warn' });\n return;\n }\n\n // 3. Determine Context: Single Project vs All Projects\n // Check if the current directory matches one of the discovered project paths\n const currentProject = projectsPath.find((p) => cwd === p);\n const projectsToRun = currentProject ? [currentProject] : projectsPath;\n\n const { command, args: pmArgs } = getPackageManagerCommand();\n const finalArgs = [...pmArgs, ...commands];\n\n logger(`CI: Using package manager: ${command}`, {\n level: 'info',\n isVerbose: true,\n });\n\n if (currentProject) {\n logger(`CI: Detected project context: ${currentProject}`, {\n level: 'info',\n });\n } else {\n logger(\n `CI: No specific project context detected. Iterating over ${projectsToRun.length} discovered projects...`,\n {\n level: 'info',\n }\n );\n }\n\n let hasError = false;\n\n // Iterate and Execute\n for (const projectPath of projectsToRun) {\n // Attempt to match credentials to the project path\n // We check if the key (relative or absolute) matches the resolved project path\n const credsEntry = Object.entries(credentials).find(([key]) => {\n const absKey = resolve(key);\n return absKey === projectPath || projectPath.endsWith(normalize(key));\n });\n\n const creds = credsEntry?.[1];\n\n logger(`\\nCI: Executing for ${projectPath}...`, {\n level: 'info',\n });\n\n const envVars = { ...process.env };\n\n if (creds) {\n envVars.INTLAYER_CLIENT_ID = creds.clientId;\n envVars.INTLAYER_CLIENT_SECRET = creds.clientSecret;\n } else if (credentialsEnv) {\n logger(\n `CI: No matching credentials found for ${projectPath} in INTLAYER_PROJECT_CREDENTIALS.`,\n { isVerbose: true }\n );\n }\n\n const result = spawnSync(command, finalArgs, {\n cwd: projectPath,\n stdio: 'inherit',\n env: envVars,\n });\n\n if (result.status !== 0) {\n logger(`CI: Failed for ${projectPath}`, {\n level: 'error',\n });\n hasError = true;\n }\n }\n\n if (hasError) process.exit(1);\n};\n"],"mappings":";;;;;;AAMA,MAAM,iCAAiC;CACrC,MAAM,YAAY,QAAQ,IAAI;AAE9B,KAAI,WAAW,WAAW,MAAM,CAC9B,QAAO;EAAE,SAAS;EAAO,MAAM,CAAC,WAAW;EAAE;AAE/C,KAAI,WAAW,WAAW,OAAO,CAC/B,QAAO;EAAE,SAAS;EAAQ,MAAM,CAAC,QAAQ,WAAW;EAAE;AAExD,KAAI,WAAW,WAAW,OAAO,CAC/B,QAAO;EAAE,SAAS;EAAQ,MAAM,CAAC,OAAO,WAAW;EAAE;AAIvD,QAAO;EAAE,SAAS;EAAO,MAAM,CAAC,WAAW;EAAE;;AAG/C,MAAa,QAAQ,OAAO,aAAuB;CACjD,MAAM,iBAAiB,QAAQ,IAAI;CACnC,IAAI,cACF,EAAE;AAGJ,KAAI,eACF,KAAI;AACF,gBAAc,KAAK,MAAM,eAAe;SAClC;AACN,SACE,mFACA,EACE,OAAO,QACR,CACF;;CAIL,MAAM,MAAM,QAAQ,KAAK;CAGzB,MAAM,EAAE,iBAAiB,MAAM,cAAc;AAE7C,KAAI,aAAa,WAAW,GAAG;AAC7B,SAAO,+BAA+B,EAAE,OAAO,QAAQ,CAAC;AACxD;;CAKF,MAAM,iBAAiB,aAAa,MAAM,MAAM,QAAQ,EAAE;CAC1D,MAAM,gBAAgB,iBAAiB,CAAC,eAAe,GAAG;CAE1D,MAAM,EAAE,SAAS,MAAM,WAAW,0BAA0B;CAC5D,MAAM,YAAY,CAAC,GAAG,QAAQ,GAAG,SAAS;AAE1C,QAAO,8BAA8B,WAAW;EAC9C,OAAO;EACP,WAAW;EACZ,CAAC;AAEF,KAAI,eACF,QAAO,iCAAiC,kBAAkB,EACxD,OAAO,QACR,CAAC;KAEF,QACE,4DAA4D,cAAc,OAAO,0BACjF,EACE,OAAO,QACR,CACF;CAGH,IAAI,WAAW;AAGf,MAAK,MAAM,eAAe,eAAe;EAQvC,MAAM,QALa,OAAO,QAAQ,YAAY,CAAC,MAAM,CAAC,SAAS;AAE7D,UADe,QAAQ,IACV,KAAK,eAAe,YAAY,SAAS,UAAU,IAAI,CAAC;IAG/C,GAAG;AAE3B,SAAO,uBAAuB,YAAY,MAAM,EAC9C,OAAO,QACR,CAAC;EAEF,MAAM,UAAU,EAAE,GAAG,QAAQ,KAAK;AAElC,MAAI,OAAO;AACT,WAAQ,qBAAqB,MAAM;AACnC,WAAQ,yBAAyB,MAAM;aAC9B,eACT,QACE,yCAAyC,YAAY,oCACrD,EAAE,WAAW,MAAM,CACpB;AASH,MANe,UAAU,SAAS,WAAW;GAC3C,KAAK;GACL,OAAO;GACP,KAAK;GACN,CAES,CAAC,WAAW,GAAG;AACvB,UAAO,kBAAkB,eAAe,EACtC,OAAO,SACR,CAAC;AACF,cAAW;;;AAIf,KAAI,SAAU,SAAQ,KAAK,EAAE"}
1
+ {"version":3,"file":"ci.mjs","names":[],"sources":["../../src/ci.ts"],"sourcesContent":["import { spawnSync } from 'node:child_process';\nimport { resolve, sep } from 'node:path';\nimport { logger } from '@intlayer/config/logger';\nimport {\n detectPackageManager,\n listProjects,\n type PackageManager,\n} from '@intlayer/engine/cli';\n\n/** CMS access keys of a single project. */\ntype ProjectCredentials = {\n clientId: string;\n clientSecret: string;\n};\n\n/**\n * Shape of the `INTLAYER_PROJECT_CREDENTIALS` environment variable: a JSON map\n * of project path (absolute, or relative to the repository root) to its CMS\n * access keys.\n */\ntype CredentialsMap = Record<string, ProjectCredentials>;\n\n/** Command used to run the locally installed `intlayer` binary. */\ntype PackageManagerCommand = {\n command: string;\n args: string[];\n};\n\n/**\n * Detects the command used to run the local `intlayer` binary. Prefers the\n * package manager that launched the current process (`npm_config_user_agent`),\n * and falls back to lock file detection when the CLI was not started through a\n * package manager (e.g. a global install or a bare CI runner).\n */\nexport const getPackageManagerCommand = (\n lockFileSearchDir: string\n): PackageManagerCommand => {\n const userAgent = process.env.npm_config_user_agent;\n\n const commandByPackageManager: Record<PackageManager, PackageManagerCommand> =\n {\n bun: { command: 'bun', args: ['intlayer'] }, // Bun runs local bins natively\n pnpm: { command: 'pnpm', args: ['exec', 'intlayer'] }, // pnpm requires 'exec'\n yarn: { command: 'yarn', args: ['run', 'intlayer'] }, // yarn requires 'run' or 'exec'\n npm: { command: 'npx', args: ['intlayer'] },\n };\n\n const userAgentPackageManager = (\n Object.keys(commandByPackageManager) as PackageManager[]\n ).find((packageManager) => userAgent?.startsWith(packageManager));\n\n if (userAgentPackageManager) {\n return commandByPackageManager[userAgentPackageManager];\n }\n\n // No user agent — infer the package manager from the repository lock file.\n return commandByPackageManager[detectPackageManager(lockFileSearchDir)];\n};\n\n/**\n * Splits a path into segments, accepting both posix and windows separators so\n * credential keys written on any OS compare equal to local project paths.\n */\nconst toPathSegments = (path: string): string[] =>\n path.split(/[\\\\/]+/).filter((segment) => segment !== '' && segment !== '.');\n\n/**\n * Returns true when a credentials key designates the given project directory.\n * A key matches when it is:\n * - the absolute path of the project,\n * - a path relative to `searchDir` (the repository root), or\n * - a trailing sequence of full path segments of the project path (so the key\n * `\"apps/web\"` matches `/repo/apps/web`, but `\"app\"` never matches\n * `/repo/my-app`).\n */\nexport const credentialsKeyMatchesProject = (\n key: string,\n projectPath: string,\n searchDir: string\n): boolean => {\n if (resolve(key) === projectPath) return true;\n if (resolve(searchDir, key) === projectPath) return true;\n\n const keySegments = toPathSegments(key);\n const projectSegments = toPathSegments(projectPath);\n\n if (keySegments.length === 0 || keySegments.length > projectSegments.length) {\n return false;\n }\n\n const trailingProjectSegments = projectSegments.slice(-keySegments.length);\n\n return keySegments.every(\n (segment, index) => trailingProjectSegments[index] === segment\n );\n};\n\n/**\n * Selects the projects the CI command must run in:\n * - run from the repository root → every discovered project (monorepo mode);\n * - run from inside a project directory (or any of its subdirectories) → that\n * project only, the deepest match winning when projects are nested;\n * - run anywhere else → every discovered project.\n */\nexport const selectProjectsToRun = (\n currentWorkingDir: string,\n searchDir: string,\n projectsPath: string[]\n): { projectsToRun: string[]; currentProject: string | undefined } => {\n const cwd = resolve(currentWorkingDir);\n\n if (cwd === resolve(searchDir)) {\n return { projectsToRun: projectsPath, currentProject: undefined };\n }\n\n const currentProject = projectsPath\n .filter(\n (projectPath) => cwd === projectPath || cwd.startsWith(projectPath + sep)\n )\n .sort((a, b) => b.length - a.length)[0];\n\n return {\n projectsToRun: currentProject ? [currentProject] : projectsPath,\n currentProject,\n };\n};\n\n/**\n * Runs an intlayer command in every Intlayer project of the repository (or\n * only in the current one when invoked from inside a project directory),\n * injecting per-project CMS credentials from `INTLAYER_PROJECT_CREDENTIALS`.\n * Exits with code 1 when the command fails in at least one project.\n */\nexport const runCI = async (commands: string[]) => {\n const credentialsEnv = process.env.INTLAYER_PROJECT_CREDENTIALS;\n let credentials: CredentialsMap = {};\n\n // Parse Credentials (Optional now)\n if (credentialsEnv) {\n try {\n credentials = JSON.parse(credentialsEnv);\n } catch {\n logger(\n 'INTLAYER_PROJECT_CREDENTIALS is not valid JSON. Proceeding without credentials.',\n {\n level: 'warn',\n }\n );\n }\n }\n\n // Discover projects from the git root so every project of the repository is\n // found regardless of the directory the command is launched from.\n const { searchDir, projectsPath } = await listProjects({ gitRoot: true });\n const normalizedProjectsPath = projectsPath.map((projectPath) =>\n resolve(projectPath)\n );\n\n if (normalizedProjectsPath.length === 0) {\n logger('No Intlayer projects found.', { level: 'warn' });\n return;\n }\n\n // Determine Context: Single Project vs All Projects\n const { projectsToRun, currentProject } = selectProjectsToRun(\n process.cwd(),\n searchDir,\n normalizedProjectsPath\n );\n\n const { command, args: pmArgs } = getPackageManagerCommand(searchDir);\n const finalArgs = [...pmArgs, ...commands];\n\n logger(`CI: Using package manager: ${command}`, {\n level: 'info',\n isVerbose: true,\n });\n\n if (currentProject) {\n logger(`CI: Detected project context: ${currentProject}`, {\n level: 'info',\n });\n } else {\n logger(\n `CI: No specific project context detected. Iterating over ${projectsToRun.length} discovered projects...`,\n {\n level: 'info',\n }\n );\n }\n\n const failedProjects: string[] = [];\n\n // Iterate and Execute\n for (const projectPath of projectsToRun) {\n // Attempt to match credentials to the project path\n const credsEntry = Object.entries(credentials).find(([key]) =>\n credentialsKeyMatchesProject(key, projectPath, searchDir)\n );\n\n const creds = credsEntry?.[1];\n\n logger(`\\nCI: Executing for ${projectPath}...`, {\n level: 'info',\n });\n\n const envVars = { ...process.env };\n\n if (creds) {\n envVars.INTLAYER_CLIENT_ID = creds.clientId;\n envVars.INTLAYER_CLIENT_SECRET = creds.clientSecret;\n } else if (credentialsEnv) {\n logger(\n `CI: No matching credentials found for ${projectPath} in INTLAYER_PROJECT_CREDENTIALS.`,\n { isVerbose: true }\n );\n }\n\n const result = spawnSync(command, finalArgs, {\n cwd: projectPath,\n stdio: 'inherit',\n env: envVars,\n });\n\n if (result.error) {\n logger(\n `CI: Failed to launch \"${command}\" for ${projectPath}: ${result.error.message}`,\n { level: 'error' }\n );\n failedProjects.push(projectPath);\n continue;\n }\n\n if (result.status !== 0) {\n logger(`CI: Failed for ${projectPath}`, {\n level: 'error',\n });\n failedProjects.push(projectPath);\n }\n }\n\n if (failedProjects.length > 0) {\n logger(\n `\\nCI: ${failedProjects.length}/${projectsToRun.length} project(s) failed:\\n${failedProjects\n .map((projectPath) => ` - ${projectPath}`)\n .join('\\n')}`,\n { level: 'error' }\n );\n process.exit(1);\n }\n};\n"],"mappings":"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"}