gt 2.14.35 → 2.14.37

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 (430) hide show
  1. package/CHANGELOG.md +22 -1
  2. package/dist/api/collectUserEditDiffs.js +112 -155
  3. package/dist/api/collectUserEditDiffs.js.map +1 -0
  4. package/dist/api/downloadFileBatch.js +164 -241
  5. package/dist/api/downloadFileBatch.js.map +1 -0
  6. package/dist/api/saveLocalEdits.js +37 -41
  7. package/dist/api/saveLocalEdits.js.map +1 -0
  8. package/dist/bin/bin-entry.js +17 -7
  9. package/dist/bin/bin-entry.js.map +1 -0
  10. package/dist/bin/bin-main.js +43 -61
  11. package/dist/bin/bin-main.js.map +1 -0
  12. package/dist/cli/base.js +382 -497
  13. package/dist/cli/base.js.map +1 -0
  14. package/dist/cli/commands/download.js +41 -49
  15. package/dist/cli/commands/download.js.map +1 -0
  16. package/dist/cli/commands/enqueue.js +26 -25
  17. package/dist/cli/commands/enqueue.js.map +1 -0
  18. package/dist/cli/commands/setupProject.js +33 -36
  19. package/dist/cli/commands/setupProject.js.map +1 -0
  20. package/dist/cli/commands/stage.js +53 -61
  21. package/dist/cli/commands/stage.js.map +1 -0
  22. package/dist/cli/commands/translate.js +75 -112
  23. package/dist/cli/commands/translate.js.map +1 -0
  24. package/dist/cli/commands/upload.js +185 -213
  25. package/dist/cli/commands/upload.js.map +1 -0
  26. package/dist/cli/commands/utils/validation.js +39 -34
  27. package/dist/cli/commands/utils/validation.js.map +1 -0
  28. package/dist/cli/flags.js +35 -62
  29. package/dist/cli/flags.js.map +1 -0
  30. package/dist/cli/inline.js +112 -137
  31. package/dist/cli/inline.js.map +1 -0
  32. package/dist/cli/next.js +17 -12
  33. package/dist/cli/next.js.map +1 -0
  34. package/dist/cli/node.js +19 -15
  35. package/dist/cli/node.js.map +1 -0
  36. package/dist/cli/python.js +13 -8
  37. package/dist/cli/python.js.map +1 -0
  38. package/dist/cli/react.js +61 -78
  39. package/dist/cli/react.js.map +1 -0
  40. package/dist/config/defaults.js +16 -11
  41. package/dist/config/defaults.js.map +1 -0
  42. package/dist/config/generateSettings.js +167 -269
  43. package/dist/config/generateSettings.js.map +1 -0
  44. package/dist/config/optionPresets.js +78 -96
  45. package/dist/config/optionPresets.js.map +1 -0
  46. package/dist/config/resolveConfig.js +27 -32
  47. package/dist/config/resolveConfig.js.map +1 -0
  48. package/dist/config/utils.js +7 -3
  49. package/dist/config/utils.js.map +1 -0
  50. package/dist/config/validateSettings.js +19 -30
  51. package/dist/config/validateSettings.js.map +1 -0
  52. package/dist/console/colors.js +18 -13
  53. package/dist/console/colors.js.map +1 -0
  54. package/dist/console/displayTranslateSummary.js +40 -37
  55. package/dist/console/displayTranslateSummary.js.map +1 -0
  56. package/dist/console/formatting.js +8 -5
  57. package/dist/console/formatting.js.map +1 -0
  58. package/dist/console/index.d.ts +11 -9
  59. package/dist/console/index.js +53 -50
  60. package/dist/console/index.js.map +1 -0
  61. package/dist/console/inkFields.d.ts +23 -0
  62. package/dist/console/inkFields.js +87 -0
  63. package/dist/console/inkFields.js.map +1 -0
  64. package/dist/console/inkLayout.d.ts +7 -0
  65. package/dist/console/inkLayout.js +139 -0
  66. package/dist/console/inkLayout.js.map +1 -0
  67. package/dist/console/inkLocaleData.d.ts +4 -0
  68. package/dist/console/inkLocaleData.js +32 -0
  69. package/dist/console/inkLocaleData.js.map +1 -0
  70. package/dist/console/inkPrompts.d.ts +8 -0
  71. package/dist/console/inkPrompts.js +496 -0
  72. package/dist/console/inkPrompts.js.map +1 -0
  73. package/dist/console/inkSession.d.ts +3 -0
  74. package/dist/console/inkSession.js +42 -0
  75. package/dist/console/inkSession.js.map +1 -0
  76. package/dist/console/inkTerminal.d.ts +4 -0
  77. package/dist/console/inkTerminal.js +15 -0
  78. package/dist/console/inkTerminal.js.map +1 -0
  79. package/dist/console/inkTypes.d.ts +66 -0
  80. package/dist/console/inkTypes.js +1 -0
  81. package/dist/console/inkUtils.d.ts +24 -0
  82. package/dist/console/inkUtils.js +87 -0
  83. package/dist/console/inkUtils.js.map +1 -0
  84. package/dist/console/logger.js +209 -249
  85. package/dist/console/logger.js.map +1 -0
  86. package/dist/console/logging.d.ts +14 -0
  87. package/dist/console/logging.js +203 -162
  88. package/dist/console/logging.js.map +1 -0
  89. package/dist/console/promptParsing.d.ts +5 -0
  90. package/dist/console/promptParsing.js +28 -0
  91. package/dist/console/promptParsing.js.map +1 -0
  92. package/dist/console/terminalSession.d.ts +5 -0
  93. package/dist/console/terminalSession.js +38 -0
  94. package/dist/console/terminalSession.js.map +1 -0
  95. package/dist/extraction/index.js +3 -2
  96. package/dist/extraction/mapToUpdates.js +19 -18
  97. package/dist/extraction/mapToUpdates.js.map +1 -0
  98. package/dist/extraction/postProcess.js +68 -86
  99. package/dist/extraction/postProcess.js.map +1 -0
  100. package/dist/formats/files/aggregateFiles.js +223 -304
  101. package/dist/formats/files/aggregateFiles.js.map +1 -0
  102. package/dist/formats/files/collectFiles.js +53 -54
  103. package/dist/formats/files/collectFiles.js.map +1 -0
  104. package/dist/formats/files/convertToFileTranslationData.js +21 -19
  105. package/dist/formats/files/convertToFileTranslationData.js.map +1 -0
  106. package/dist/formats/files/fileMapping.js +82 -119
  107. package/dist/formats/files/fileMapping.js.map +1 -0
  108. package/dist/formats/files/preprocess/mdx.js +15 -12
  109. package/dist/formats/files/preprocess/mdx.js.map +1 -0
  110. package/dist/formats/files/preprocess/mintlify.js +15 -13
  111. package/dist/formats/files/preprocess/mintlify.js.map +1 -0
  112. package/dist/formats/files/preprocessContent.js +20 -21
  113. package/dist/formats/files/preprocessContent.js.map +1 -0
  114. package/dist/formats/files/save.js +18 -15
  115. package/dist/formats/files/save.js.map +1 -0
  116. package/dist/formats/files/supportedFiles.js +27 -22
  117. package/dist/formats/files/supportedFiles.js.map +1 -0
  118. package/dist/formats/files/transformFormat.js +93 -100
  119. package/dist/formats/files/transformFormat.js.map +1 -0
  120. package/dist/formats/json/extractJson.js +83 -110
  121. package/dist/formats/json/extractJson.js.map +1 -0
  122. package/dist/formats/json/flattenJson.js +41 -48
  123. package/dist/formats/json/flattenJson.js.map +1 -0
  124. package/dist/formats/json/jsonPath.js +20 -15
  125. package/dist/formats/json/jsonPath.js.map +1 -0
  126. package/dist/formats/json/jsonPointer.js +17 -17
  127. package/dist/formats/json/jsonPointer.js.map +1 -0
  128. package/dist/formats/json/mergeJson.js +230 -371
  129. package/dist/formats/json/mergeJson.js.map +1 -0
  130. package/dist/formats/json/parseJson.js +74 -111
  131. package/dist/formats/json/parseJson.js.map +1 -0
  132. package/dist/formats/json/transformJson.js +53 -61
  133. package/dist/formats/json/transformJson.js.map +1 -0
  134. package/dist/formats/json/utils.js +158 -187
  135. package/dist/formats/json/utils.js.map +1 -0
  136. package/dist/formats/parseKeyedMetadata.js +85 -106
  137. package/dist/formats/parseKeyedMetadata.js.map +1 -0
  138. package/dist/formats/utils.js +13 -23
  139. package/dist/formats/utils.js.map +1 -0
  140. package/dist/formats/yaml/extractYaml.js +32 -31
  141. package/dist/formats/yaml/extractYaml.js.map +1 -0
  142. package/dist/formats/yaml/mergeYaml.js +43 -60
  143. package/dist/formats/yaml/mergeYaml.js.map +1 -0
  144. package/dist/formats/yaml/parseYaml.js +34 -23
  145. package/dist/formats/yaml/parseYaml.js.map +1 -0
  146. package/dist/formats/yaml/utils.js +19 -21
  147. package/dist/formats/yaml/utils.js.map +1 -0
  148. package/dist/fs/clearLocaleDirs.js +82 -114
  149. package/dist/fs/clearLocaleDirs.js.map +1 -0
  150. package/dist/fs/config/downloadedVersions.js +174 -188
  151. package/dist/fs/config/downloadedVersions.js.map +1 -0
  152. package/dist/fs/config/loadConfig.js +12 -8
  153. package/dist/fs/config/loadConfig.js.map +1 -0
  154. package/dist/fs/config/parseFilesConfig.js +166 -227
  155. package/dist/fs/config/parseFilesConfig.js.map +1 -0
  156. package/dist/fs/config/setupConfig.js +43 -52
  157. package/dist/fs/config/setupConfig.js.map +1 -0
  158. package/dist/fs/config/updateConfig.js +44 -56
  159. package/dist/fs/config/updateConfig.js.map +1 -0
  160. package/dist/fs/config/updateVersions.js +27 -28
  161. package/dist/fs/config/updateVersions.js.map +1 -0
  162. package/dist/fs/copyFile.js +33 -37
  163. package/dist/fs/copyFile.js.map +1 -0
  164. package/dist/fs/createLoadTranslationsFile.js +32 -48
  165. package/dist/fs/createLoadTranslationsFile.js.map +1 -0
  166. package/dist/fs/determineFramework/detectPythonLibrary.js +30 -34
  167. package/dist/fs/determineFramework/detectPythonLibrary.js.map +1 -0
  168. package/dist/fs/determineFramework/index.js +46 -64
  169. package/dist/fs/determineFramework/index.js.map +1 -0
  170. package/dist/fs/determineFramework/matchPyprojectDependency.js +65 -78
  171. package/dist/fs/determineFramework/matchPyprojectDependency.js.map +1 -0
  172. package/dist/fs/determineFramework/matchRequirementsTxtDependency.js +21 -19
  173. package/dist/fs/determineFramework/matchRequirementsTxtDependency.js.map +1 -0
  174. package/dist/fs/determineFramework/matchSetupPyDependency.js +60 -81
  175. package/dist/fs/determineFramework/matchSetupPyDependency.js.map +1 -0
  176. package/dist/fs/determineFramework/resolveGtDependency.js +15 -15
  177. package/dist/fs/determineFramework/resolveGtDependency.js.map +1 -0
  178. package/dist/fs/findFilepath.js +63 -78
  179. package/dist/fs/findFilepath.js.map +1 -0
  180. package/dist/fs/loadJSON.js +18 -15
  181. package/dist/fs/loadJSON.js.map +1 -0
  182. package/dist/fs/matchFiles.js +12 -7
  183. package/dist/fs/matchFiles.js.map +1 -0
  184. package/dist/fs/saveJSON.js +10 -6
  185. package/dist/fs/saveJSON.js.map +1 -0
  186. package/dist/fs/utils.js +19 -15
  187. package/dist/fs/utils.js.map +1 -0
  188. package/dist/functions.d.ts +2 -1
  189. package/dist/functions.js +3 -6
  190. package/dist/generated/version.d.ts +1 -1
  191. package/dist/generated/version.js +6 -2
  192. package/dist/generated/version.js.map +1 -0
  193. package/dist/git/branches.js +77 -83
  194. package/dist/git/branches.js.map +1 -0
  195. package/dist/hooks/postProcess.js +97 -114
  196. package/dist/hooks/postProcess.js.map +1 -0
  197. package/dist/index.js +23 -31
  198. package/dist/index.js.map +1 -0
  199. package/dist/locadex/setupFlow.js +11 -8
  200. package/dist/locadex/setupFlow.js.map +1 -0
  201. package/dist/main.js +17 -7
  202. package/dist/main.js.map +1 -0
  203. package/dist/next/config/parseNextConfig.js +32 -51
  204. package/dist/next/config/parseNextConfig.js.map +1 -0
  205. package/dist/next/jsx/utils.js +25 -37
  206. package/dist/next/jsx/utils.js.map +1 -0
  207. package/dist/next/parse/handleInitGT.js +87 -154
  208. package/dist/next/parse/handleInitGT.js.map +1 -0
  209. package/dist/next/parse/wrapContent.js +136 -158
  210. package/dist/next/parse/wrapContent.js.map +1 -0
  211. package/dist/python/parse/createPythonInlineUpdates.js +36 -33
  212. package/dist/python/parse/createPythonInlineUpdates.js.map +1 -0
  213. package/dist/react/config/createESBuildConfig.js +115 -115
  214. package/dist/react/config/createESBuildConfig.js.map +1 -0
  215. package/dist/react/jsx/evaluateJsx.js +90 -124
  216. package/dist/react/jsx/evaluateJsx.js.map +1 -0
  217. package/dist/react/jsx/utils/buildImportMap.js +24 -28
  218. package/dist/react/jsx/utils/buildImportMap.js.map +1 -0
  219. package/dist/react/jsx/utils/constants.js +79 -87
  220. package/dist/react/jsx/utils/constants.js.map +1 -0
  221. package/dist/react/jsx/utils/extractSourceCode.js +36 -37
  222. package/dist/react/jsx/utils/extractSourceCode.js.map +1 -0
  223. package/dist/react/jsx/utils/getCalleeNameFromExpression.js +30 -30
  224. package/dist/react/jsx/utils/getCalleeNameFromExpression.js.map +1 -0
  225. package/dist/react/jsx/utils/getPathsAndAliases.js +70 -105
  226. package/dist/react/jsx/utils/getPathsAndAliases.js.map +1 -0
  227. package/dist/react/jsx/utils/isNumberLiteral.js +13 -11
  228. package/dist/react/jsx/utils/isNumberLiteral.js.map +1 -0
  229. package/dist/react/jsx/utils/jsxParsing/addGTIdentifierToSyntaxTree.js +103 -148
  230. package/dist/react/jsx/utils/jsxParsing/addGTIdentifierToSyntaxTree.js.map +1 -0
  231. package/dist/react/jsx/utils/jsxParsing/autoInsertion.js +305 -389
  232. package/dist/react/jsx/utils/jsxParsing/autoInsertion.js.map +1 -0
  233. package/dist/react/jsx/utils/jsxParsing/handleChildrenWhitespace.js +122 -193
  234. package/dist/react/jsx/utils/jsxParsing/handleChildrenWhitespace.js.map +1 -0
  235. package/dist/react/jsx/utils/jsxParsing/multiplication/findMultiplicationNode.js +50 -64
  236. package/dist/react/jsx/utils/jsxParsing/multiplication/findMultiplicationNode.js.map +1 -0
  237. package/dist/react/jsx/utils/jsxParsing/multiplication/multiplyJsxTree.js +41 -68
  238. package/dist/react/jsx/utils/jsxParsing/multiplication/multiplyJsxTree.js.map +1 -0
  239. package/dist/react/jsx/utils/jsxParsing/parseJsx.js +760 -1107
  240. package/dist/react/jsx/utils/jsxParsing/parseJsx.js.map +1 -0
  241. package/dist/react/jsx/utils/jsxParsing/parseTProps.js +35 -71
  242. package/dist/react/jsx/utils/jsxParsing/parseTProps.js.map +1 -0
  243. package/dist/react/jsx/utils/jsxParsing/removeNullChildrenFields.js +39 -58
  244. package/dist/react/jsx/utils/jsxParsing/removeNullChildrenFields.js.map +1 -0
  245. package/dist/react/jsx/utils/jsxParsing/types.js +10 -24
  246. package/dist/react/jsx/utils/jsxParsing/types.js.map +1 -0
  247. package/dist/react/jsx/utils/mapAttributeName.js +13 -13
  248. package/dist/react/jsx/utils/mapAttributeName.js.map +1 -0
  249. package/dist/react/jsx/utils/parseAst.js +142 -272
  250. package/dist/react/jsx/utils/parseAst.js.map +1 -0
  251. package/dist/react/jsx/utils/parseString.js +726 -1090
  252. package/dist/react/jsx/utils/parseString.js.map +1 -0
  253. package/dist/react/jsx/utils/parseStringFunction.js +274 -401
  254. package/dist/react/jsx/utils/parseStringFunction.js.map +1 -0
  255. package/dist/react/jsx/utils/resolveImportPath.d.ts +1 -1
  256. package/dist/react/jsx/utils/resolveImportPath.js +125 -108
  257. package/dist/react/jsx/utils/resolveImportPath.js.map +1 -0
  258. package/dist/react/jsx/utils/stringParsing/derivation/containsDeriveCall.js +18 -24
  259. package/dist/react/jsx/utils/stringParsing/derivation/containsDeriveCall.js.map +1 -0
  260. package/dist/react/jsx/utils/stringParsing/derivation/handleDerivation.js +412 -579
  261. package/dist/react/jsx/utils/stringParsing/derivation/handleDerivation.js.map +1 -0
  262. package/dist/react/jsx/utils/stringParsing/derivation/index.js +57 -67
  263. package/dist/react/jsx/utils/stringParsing/derivation/index.js.map +1 -0
  264. package/dist/react/jsx/utils/stringParsing/derivation/isDeriveCall.js +26 -36
  265. package/dist/react/jsx/utils/stringParsing/derivation/isDeriveCall.js.map +1 -0
  266. package/dist/react/jsx/utils/stringParsing/processTaggedTemplateCall/handleTaggedTemplateTranslationCall.js +29 -24
  267. package/dist/react/jsx/utils/stringParsing/processTaggedTemplateCall/handleTaggedTemplateTranslationCall.js.map +1 -0
  268. package/dist/react/jsx/utils/stringParsing/processTaggedTemplateCall/index.js +34 -32
  269. package/dist/react/jsx/utils/stringParsing/processTaggedTemplateCall/index.js.map +1 -0
  270. package/dist/react/jsx/utils/stringParsing/processTranslationCall/extractStringEntryMetadata.js +80 -117
  271. package/dist/react/jsx/utils/stringParsing/processTranslationCall/extractStringEntryMetadata.js.map +1 -0
  272. package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleDeriveTranslationCall.js +24 -19
  273. package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleDeriveTranslationCall.js.map +1 -0
  274. package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleInvalidTranslationCall.js +18 -21
  275. package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleInvalidTranslationCall.js.map +1 -0
  276. package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleLiteralTranslationCall.js +45 -50
  277. package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleLiteralTranslationCall.js.map +1 -0
  278. package/dist/react/jsx/utils/stringParsing/processTranslationCall/index.js +54 -59
  279. package/dist/react/jsx/utils/stringParsing/processTranslationCall/index.js.map +1 -0
  280. package/dist/react/jsx/utils/stringParsing/processTranslationCall/routeTranslationCall.js +56 -69
  281. package/dist/react/jsx/utils/stringParsing/processTranslationCall/routeTranslationCall.js.map +1 -0
  282. package/dist/react/jsx/utils/validateStringFunction.js +21 -29
  283. package/dist/react/jsx/utils/validateStringFunction.js.map +1 -0
  284. package/dist/react/jsx/wrapJsx.js +192 -375
  285. package/dist/react/jsx/wrapJsx.js.map +1 -0
  286. package/dist/react/parse/addVitePlugin/index.js +40 -34
  287. package/dist/react/parse/addVitePlugin/index.js.map +1 -0
  288. package/dist/react/parse/addVitePlugin/installCompiler.js +18 -20
  289. package/dist/react/parse/addVitePlugin/installCompiler.js.map +1 -0
  290. package/dist/react/parse/addVitePlugin/updateViteConfig.js +107 -111
  291. package/dist/react/parse/addVitePlugin/updateViteConfig.js.map +1 -0
  292. package/dist/react/parse/addVitePlugin/utils/addCompilerImport.js +23 -26
  293. package/dist/react/parse/addVitePlugin/utils/addCompilerImport.js.map +1 -0
  294. package/dist/react/parse/addVitePlugin/utils/addPluginInvocation.js +29 -43
  295. package/dist/react/parse/addVitePlugin/utils/addPluginInvocation.js.map +1 -0
  296. package/dist/react/parse/addVitePlugin/utils/checkCompilerImport.js +70 -104
  297. package/dist/react/parse/addVitePlugin/utils/checkCompilerImport.js.map +1 -0
  298. package/dist/react/parse/addVitePlugin/utils/checkPluginInvocation.js +23 -29
  299. package/dist/react/parse/addVitePlugin/utils/checkPluginInvocation.js.map +1 -0
  300. package/dist/react/parse/createDictionaryUpdates.js +121 -185
  301. package/dist/react/parse/createDictionaryUpdates.js.map +1 -0
  302. package/dist/react/parse/createInlineUpdates.js +123 -139
  303. package/dist/react/parse/createInlineUpdates.js.map +1 -0
  304. package/dist/react/parse/wrapContent.js +131 -156
  305. package/dist/react/parse/wrapContent.js.map +1 -0
  306. package/dist/react/utils/flattenDictionary.js +55 -70
  307. package/dist/react/utils/flattenDictionary.js.map +1 -0
  308. package/dist/react/utils/getEntryAndMetadata.js +14 -10
  309. package/dist/react/utils/getEntryAndMetadata.js.map +1 -0
  310. package/dist/react/utils/getVariableName.js +36 -33
  311. package/dist/react/utils/getVariableName.js.map +1 -0
  312. package/dist/setup/detectFramework.js +85 -102
  313. package/dist/setup/detectFramework.js.map +1 -0
  314. package/dist/setup/frameworkUtils.js +17 -28
  315. package/dist/setup/frameworkUtils.js.map +1 -0
  316. package/dist/setup/userInput.js +24 -31
  317. package/dist/setup/userInput.js.map +1 -0
  318. package/dist/setup/wizard.js +141 -143
  319. package/dist/setup/wizard.js.map +1 -0
  320. package/dist/state/mintlifyRefMap.js +12 -9
  321. package/dist/state/mintlifyRefMap.js.map +1 -0
  322. package/dist/state/recentDownloads.js +26 -23
  323. package/dist/state/recentDownloads.js.map +1 -0
  324. package/dist/state/translateWarnings.js +17 -8
  325. package/dist/state/translateWarnings.js.map +1 -0
  326. package/dist/translation/parse.js +77 -98
  327. package/dist/translation/parse.js.map +1 -0
  328. package/dist/translation/stage.js +28 -43
  329. package/dist/translation/stage.js.map +1 -0
  330. package/dist/translation/validate.js +68 -91
  331. package/dist/translation/validate.js.map +1 -0
  332. package/dist/types/libraries.js +93 -91
  333. package/dist/types/libraries.js.map +1 -0
  334. package/dist/types/parsing.js +19 -10
  335. package/dist/types/parsing.js.map +1 -0
  336. package/dist/utils/addExplicitAnchorIds.js +270 -389
  337. package/dist/utils/addExplicitAnchorIds.js.map +1 -0
  338. package/dist/utils/calculateTimeoutMs.js +11 -6
  339. package/dist/utils/calculateTimeoutMs.js.map +1 -0
  340. package/dist/utils/constants.js +15 -12
  341. package/dist/utils/constants.js.map +1 -0
  342. package/dist/utils/credentials.js +67 -114
  343. package/dist/utils/credentials.js.map +1 -0
  344. package/dist/utils/fetch.js +22 -20
  345. package/dist/utils/fetch.js.map +1 -0
  346. package/dist/utils/flattenJsonFiles.js +27 -34
  347. package/dist/utils/flattenJsonFiles.js.map +1 -0
  348. package/dist/utils/gitDiff.js +30 -32
  349. package/dist/utils/gitDiff.js.map +1 -0
  350. package/dist/utils/gt.js +7 -2
  351. package/dist/utils/gt.js.map +1 -0
  352. package/dist/utils/hash.js +14 -9
  353. package/dist/utils/hash.js.map +1 -0
  354. package/dist/utils/headers.js +10 -13
  355. package/dist/utils/headers.js.map +1 -0
  356. package/dist/utils/installPackage.js +70 -75
  357. package/dist/utils/installPackage.js.map +1 -0
  358. package/dist/utils/localizeRelativeAssets.js +114 -157
  359. package/dist/utils/localizeRelativeAssets.js.map +1 -0
  360. package/dist/utils/localizeStaticImports.js +229 -371
  361. package/dist/utils/localizeStaticImports.js.map +1 -0
  362. package/dist/utils/localizeStaticUrls.js +241 -424
  363. package/dist/utils/localizeStaticUrls.js.map +1 -0
  364. package/dist/utils/mintlifyTitleFallback.js +64 -72
  365. package/dist/utils/mintlifyTitleFallback.js.map +1 -0
  366. package/dist/utils/monorepoVersionCheck.js +177 -215
  367. package/dist/utils/monorepoVersionCheck.js.map +1 -0
  368. package/dist/utils/packageInfo.js +17 -16
  369. package/dist/utils/packageInfo.js.map +1 -0
  370. package/dist/utils/packageJson.js +51 -66
  371. package/dist/utils/packageJson.js.map +1 -0
  372. package/dist/utils/packageManager.js +237 -260
  373. package/dist/utils/packageManager.js.map +1 -0
  374. package/dist/utils/parse/needsCJS.js +36 -69
  375. package/dist/utils/parse/needsCJS.js.map +1 -0
  376. package/dist/utils/persistPostprocessHashes.js +30 -32
  377. package/dist/utils/persistPostprocessHashes.js.map +1 -0
  378. package/dist/utils/processAnchorIds.js +32 -54
  379. package/dist/utils/processAnchorIds.js.map +1 -0
  380. package/dist/utils/processOpenApi.js +469 -578
  381. package/dist/utils/processOpenApi.js.map +1 -0
  382. package/dist/utils/resolveMintlifyRefs.js +89 -105
  383. package/dist/utils/resolveMintlifyRefs.js.map +1 -0
  384. package/dist/utils/resolvePublish.js +46 -54
  385. package/dist/utils/resolvePublish.js.map +1 -0
  386. package/dist/utils/sanitizeFileContent.js +20 -27
  387. package/dist/utils/sanitizeFileContent.js.map +1 -0
  388. package/dist/utils/sharedStaticAssets.js +248 -366
  389. package/dist/utils/sharedStaticAssets.js.map +1 -0
  390. package/dist/utils/splitMintlifyLanguageRefs.js +208 -282
  391. package/dist/utils/splitMintlifyLanguageRefs.js.map +1 -0
  392. package/dist/utils/validateMdx.js +26 -23
  393. package/dist/utils/validateMdx.js.map +1 -0
  394. package/dist/utils/wrapPlainUrls.js +58 -70
  395. package/dist/utils/wrapPlainUrls.js.map +1 -0
  396. package/dist/workflows/download.js +92 -126
  397. package/dist/workflows/download.js.map +1 -0
  398. package/dist/workflows/enqueue.js +47 -54
  399. package/dist/workflows/enqueue.js.map +1 -0
  400. package/dist/workflows/publish.js +29 -29
  401. package/dist/workflows/publish.js.map +1 -0
  402. package/dist/workflows/setupProject.js +39 -40
  403. package/dist/workflows/setupProject.js.map +1 -0
  404. package/dist/workflows/stage.js +61 -65
  405. package/dist/workflows/stage.js.map +1 -0
  406. package/dist/workflows/steps/BranchStep.js +118 -163
  407. package/dist/workflows/steps/BranchStep.js.map +1 -0
  408. package/dist/workflows/steps/DownloadStep.js +107 -137
  409. package/dist/workflows/steps/DownloadStep.js.map +1 -0
  410. package/dist/workflows/steps/EnqueueStep.js +32 -32
  411. package/dist/workflows/steps/EnqueueStep.js.map +1 -0
  412. package/dist/workflows/steps/PollJobsStep.js +208 -292
  413. package/dist/workflows/steps/PollJobsStep.js.map +1 -0
  414. package/dist/workflows/steps/PublishStep.js +33 -38
  415. package/dist/workflows/steps/PublishStep.js.map +1 -0
  416. package/dist/workflows/steps/SetupStep.js +71 -72
  417. package/dist/workflows/steps/SetupStep.js.map +1 -0
  418. package/dist/workflows/steps/TagStep.js +39 -44
  419. package/dist/workflows/steps/TagStep.js.map +1 -0
  420. package/dist/workflows/steps/UploadSourcesStep.js +108 -140
  421. package/dist/workflows/steps/UploadSourcesStep.js.map +1 -0
  422. package/dist/workflows/steps/UploadTranslationsStep.js +61 -71
  423. package/dist/workflows/steps/UploadTranslationsStep.js.map +1 -0
  424. package/dist/workflows/steps/UserEditDiffsStep.js +32 -34
  425. package/dist/workflows/steps/UserEditDiffsStep.js.map +1 -0
  426. package/dist/workflows/steps/WorkflowStep.js +6 -2
  427. package/dist/workflows/steps/WorkflowStep.js.map +1 -0
  428. package/dist/workflows/upload.js +45 -46
  429. package/dist/workflows/upload.js.map +1 -0
  430. package/package.json +14 -7
@@ -1,308 +1,227 @@
1
- import { logger } from '../../console/logger.js';
2
- import { recordWarning } from '../../state/translateWarnings.js';
3
- import { getRelative, readFile } from '../../fs/findFilepath.js';
4
- import { SUPPORTED_FILE_EXTENSIONS } from './supportedFiles.js';
5
- import { parseJson } from '../json/parseJson.js';
6
- import { resolveMintlifyRefs, shouldResolveRefs, } from '../../utils/resolveMintlifyRefs.js';
7
- import { storeRefMap } from '../../state/mintlifyRefMap.js';
8
- import parseYaml from '../yaml/parseYaml.js';
9
- import { validateYamlSchema } from '../yaml/utils.js';
10
- import { flattenJson } from '../json/flattenJson.js';
11
- import YAML from 'yaml';
12
- import { determineLibrary } from '../../fs/determineFramework/index.js';
13
- import { hashStringSync } from '../../utils/hash.js';
14
- import { preprocessContent } from './preprocessContent.js';
15
- import { parseKeyedMetadata, } from '../parseKeyedMetadata.js';
16
- import { buildPublishMap } from '../../utils/resolvePublish.js';
17
- import { getTransformFormatProperty } from './transformFormat.js';
1
+ import { logger } from "../../console/logger.js";
2
+ import { hashStringSync } from "../../utils/hash.js";
3
+ import { getRelative, readFile } from "../../fs/findFilepath.js";
4
+ import { SUPPORTED_FILE_EXTENSIONS } from "./supportedFiles.js";
5
+ import { getTransformFormatProperty } from "./transformFormat.js";
6
+ import { determineLibrary } from "../../fs/determineFramework/index.js";
7
+ import { flattenJson } from "../json/flattenJson.js";
8
+ import { parseJson } from "../json/parseJson.js";
9
+ import { resolveMintlifyRefs, shouldResolveRefs } from "../../utils/resolveMintlifyRefs.js";
10
+ import { recordWarning } from "../../state/translateWarnings.js";
11
+ import { validateYamlSchema } from "../yaml/utils.js";
12
+ import parseYaml from "../yaml/parseYaml.js";
13
+ import { buildPublishMap } from "../../utils/resolvePublish.js";
14
+ import { storeRefMap } from "../../state/mintlifyRefMap.js";
15
+ import { preprocessContent } from "./preprocessContent.js";
16
+ import { parseKeyedMetadata } from "../parseKeyedMetadata.js";
17
+ import YAML from "yaml";
18
+ //#region src/formats/files/aggregateFiles.ts
18
19
  /**
19
- * Checks if a file path is a metadata companion file (e.g. foo.metadata.json)
20
- * AND its corresponding source file (e.g. foo.json) exists in the file list.
21
- * If both conditions are true, the metadata file should be skipped as a translation source.
22
- */
20
+ * Checks if a file path is a metadata companion file (e.g. foo.metadata.json)
21
+ * AND its corresponding source file (e.g. foo.json) exists in the file list.
22
+ * If both conditions are true, the metadata file should be skipped as a translation source.
23
+ */
23
24
  function isCompanionMetadataFile(filePath, allFilePaths) {
24
- const metadataPattern = /\.metadata\.(json|yaml|yml)$/;
25
- if (!metadataPattern.test(filePath))
26
- return false;
27
- // Derive the source file path: foo.metadata.json -> foo.json
28
- const sourceFilePath = filePath.replace(/\.metadata\.(json|yaml|yml)$/, '.$1');
29
- return allFilePaths.includes(sourceFilePath);
25
+ if (!/\.metadata\.(json|yaml|yml)$/.test(filePath)) return false;
26
+ const sourceFilePath = filePath.replace(/\.metadata\.(json|yaml|yml)$/, ".$1");
27
+ return allFilePaths.includes(sourceFilePath);
30
28
  }
31
- export const SUPPORTED_DATA_FORMATS = ['JSX', 'ICU', 'I18NEXT'];
32
- export async function aggregateFiles(settings) {
33
- // Aggregate all files to translate
34
- const files = [];
35
- if (!settings.files ||
36
- (Object.keys(settings.files.placeholderPaths).length === 1 &&
37
- settings.files.placeholderPaths.gt)) {
38
- return { files, publishMap: new Map() };
39
- }
40
- const { resolvedPaths: filePaths } = settings.files;
41
- const skipValidation = settings.options?.skipFileValidation;
42
- // Build publish map upfront from resolved paths.
43
- const publishMap = buildPublishMap(filePaths, settings);
44
- // Process JSON files
45
- if (filePaths.json) {
46
- const { library, additionalModules } = determineLibrary();
47
- // Determine dataFormat for JSONs
48
- let dataFormat;
49
- if (library === 'next-intl') {
50
- dataFormat = 'ICU';
51
- }
52
- else if (library === 'i18next') {
53
- if (additionalModules.includes('i18next-icu')) {
54
- dataFormat = 'ICU';
55
- }
56
- else {
57
- dataFormat = 'I18NEXT';
58
- }
59
- }
60
- else {
61
- dataFormat = 'STRING';
62
- }
63
- const jsonFiles = filePaths.json
64
- .filter((filePath) => !isCompanionMetadataFile(filePath, filePaths.json))
65
- .map((filePath) => {
66
- const content = readFile(filePath);
67
- const relativePath = getRelative(filePath);
68
- // Pre-validate JSON parseability
69
- if (!skipValidation?.json) {
70
- try {
71
- JSON.parse(content);
72
- }
73
- catch {
74
- logger.warn(`Skipping ${relativePath}: JSON file is not parsable`);
75
- recordWarning('skipped_file', relativePath, 'JSON file is not parsable');
76
- return null;
77
- }
78
- }
79
- // Resolve $ref before parsing if configured
80
- let contentForParsing = content;
81
- if (shouldResolveRefs(filePath, settings.options)) {
82
- try {
83
- const json = JSON.parse(content);
84
- const { resolved, refMap } = resolveMintlifyRefs(json, filePath);
85
- storeRefMap(refMap);
86
- contentForParsing = JSON.stringify(resolved, null, 2);
87
- }
88
- catch {
89
- // JSON parse errors are handled below by parseJson
90
- }
91
- }
92
- const parsedJson = parseJson(contentForParsing, filePath, settings.options || {}, settings.defaultLocale);
93
- // Detect companion metadata file
94
- let keyedMetadata;
95
- let parsedContent;
96
- try {
97
- parsedContent = JSON.parse(content);
98
- }
99
- catch {
100
- // Content not parsable skip metadata detection
101
- }
102
- if (parsedContent) {
103
- const rawMetadata = parseKeyedMetadata(filePath, parsedContent);
104
- if (rawMetadata) {
105
- // Run metadata through the same include/composite schema as the source
106
- // so key paths align at translation time
107
- const transformed = parseJson(JSON.stringify(rawMetadata), filePath, settings.options || {}, settings.defaultLocale, false);
108
- const transformedMetadata = JSON.parse(transformed);
109
- // Filter metadata to only keep keys that exist in the transformed source
110
- // This prevents misaligned entries from wide JSONPath patterns
111
- const sourceKeys = new Set(Object.keys(JSON.parse(parsedJson)));
112
- const filtered = Object.fromEntries(Object.entries(transformedMetadata).filter(([k]) => sourceKeys.has(k)));
113
- if (Object.keys(filtered).length > 0) {
114
- keyedMetadata = filtered;
115
- }
116
- else {
117
- logger.warn(`Companion metadata found for ${relativePath} but no keys aligned with the JSON schema — metadata was not attached`);
118
- }
119
- }
120
- }
121
- return {
122
- fileId: hashStringSync(relativePath),
123
- versionId: hashStringSync(parsedJson),
124
- content: parsedJson,
125
- fileName: relativePath,
126
- fileFormat: 'JSON',
127
- ...getTransformFormatProperty(settings, 'json'),
128
- dataFormat,
129
- locale: settings.defaultLocale,
130
- ...(keyedMetadata && {
131
- formatMetadata: { keyedMetadata },
132
- }),
133
- };
134
- })
135
- .filter((file) => {
136
- if (!file)
137
- return false;
138
- if (typeof file.content !== 'string' || !file.content.trim()) {
139
- logger.warn(`Skipping ${file.fileName}: JSON file is empty`);
140
- recordWarning('skipped_file', file.fileName, 'JSON file is empty');
141
- return false;
142
- }
143
- return true;
144
- });
145
- files.push(...jsonFiles.filter((file) => file !== null));
146
- }
147
- // Process YAML files
148
- if (filePaths.yaml) {
149
- const yamlFiles = filePaths.yaml
150
- .filter((filePath) => !isCompanionMetadataFile(filePath, filePaths.yaml))
151
- .map((filePath) => {
152
- const content = readFile(filePath);
153
- const relativePath = getRelative(filePath);
154
- // Pre-validate YAML parseability
155
- if (!skipValidation?.yaml) {
156
- try {
157
- YAML.parse(content);
158
- }
159
- catch {
160
- logger.warn(`Skipping ${relativePath}: YAML file is not parsable`);
161
- recordWarning('skipped_file', relativePath, 'YAML file is not parsable');
162
- return null;
163
- }
164
- }
165
- const { content: parsedYaml, fileFormat } = parseYaml(content, filePath, settings.options || {});
166
- // Detect companion metadata file
167
- let keyedMetadata;
168
- try {
169
- const parsedYamlContent = YAML.parse(content);
170
- const rawMetadata = parseKeyedMetadata(filePath, parsedYamlContent);
171
- if (rawMetadata) {
172
- const yamlSchema = validateYamlSchema(settings.options || {}, filePath);
173
- if (yamlSchema?.include) {
174
- // Flatten metadata through the same include schema as the source
175
- const flattened = flattenJson(rawMetadata, yamlSchema.include);
176
- // Filter to only keep keys that exist in the transformed source
177
- const sourceKeys = new Set(Object.keys(JSON.parse(parsedYaml)));
178
- const filtered = Object.fromEntries(Object.entries(flattened).filter(([k]) => sourceKeys.has(k)));
179
- if (Object.keys(filtered).length > 0) {
180
- keyedMetadata = filtered;
181
- }
182
- else {
183
- logger.warn(`Companion metadata found for ${relativePath} but no keys aligned with the YAML schema — metadata was not attached`);
184
- }
185
- }
186
- else {
187
- keyedMetadata = rawMetadata;
188
- }
189
- }
190
- }
191
- catch {
192
- // Content not parsable as YAML — skip metadata detection
193
- }
194
- return {
195
- content: parsedYaml,
196
- fileName: relativePath,
197
- fileFormat,
198
- ...getTransformFormatProperty(settings, 'yaml'),
199
- fileId: hashStringSync(relativePath),
200
- versionId: hashStringSync(parsedYaml),
201
- locale: settings.defaultLocale,
202
- ...(keyedMetadata && {
203
- formatMetadata: { keyedMetadata },
204
- }),
205
- };
206
- })
207
- .filter((file) => {
208
- if (!file || typeof file.content !== 'string' || !file.content.trim()) {
209
- logger.warn(`Skipping ${file?.fileName ?? 'unknown'}: YAML file is empty`);
210
- recordWarning('skipped_file', file?.fileName ?? 'unknown', 'YAML file is empty');
211
- return false;
212
- }
213
- return true;
214
- });
215
- files.push(...yamlFiles.filter((file) => file !== null));
216
- }
217
- // Process Twilio Content JSON files
218
- if (filePaths.twilioContentJson) {
219
- const twilioContentJsonFiles = filePaths.twilioContentJson
220
- .map((filePath) => {
221
- const content = readFile(filePath);
222
- const relativePath = getRelative(filePath);
223
- // Pre-validate JSON parseability
224
- if (!skipValidation?.json) {
225
- try {
226
- JSON.parse(content);
227
- }
228
- catch {
229
- logger.warn(`Skipping ${relativePath}: JSON file is not parsable`);
230
- recordWarning('skipped_file', relativePath, 'JSON file is not parsable');
231
- return null;
232
- }
233
- }
234
- const parsedJson = parseJson(content, filePath, settings.options || {}, settings.defaultLocale);
235
- return {
236
- fileId: hashStringSync(relativePath),
237
- versionId: hashStringSync(parsedJson),
238
- content: parsedJson,
239
- fileName: relativePath,
240
- fileFormat: 'TWILIO_CONTENT_JSON',
241
- ...getTransformFormatProperty(settings, 'twilioContentJson'),
242
- dataFormat: 'STRING',
243
- locale: settings.defaultLocale,
244
- };
245
- })
246
- .filter((file) => {
247
- if (!file)
248
- return false;
249
- if (typeof file.content !== 'string' || !file.content.trim()) {
250
- logger.warn(`Skipping ${file.fileName}: JSON file is empty`);
251
- recordWarning('skipped_file', file.fileName, 'JSON file is empty');
252
- return false;
253
- }
254
- return true;
255
- });
256
- files.push(...twilioContentJsonFiles.filter((file) => file !== null));
257
- }
258
- for (const fileType of SUPPORTED_FILE_EXTENSIONS) {
259
- if (fileType === 'json' ||
260
- fileType === 'yaml' ||
261
- fileType === 'twilioContentJson')
262
- continue;
263
- if (filePaths[fileType]) {
264
- const parsed = filePaths[fileType]
265
- .map((filePath) => {
266
- const content = readFile(filePath);
267
- const relativePath = getRelative(filePath);
268
- const processed = preprocessContent(content, relativePath, fileType, settings);
269
- if (typeof processed !== 'string') {
270
- logger.warn(`Skipping ${relativePath}: ${processed.skip}`);
271
- recordWarning('skipped_file', relativePath, processed.skip);
272
- return null;
273
- }
274
- return {
275
- content: processed,
276
- fileName: relativePath,
277
- fileFormat: fileType.toUpperCase(),
278
- ...getTransformFormatProperty(settings, fileType),
279
- fileId: hashStringSync(relativePath),
280
- versionId: hashStringSync(processed),
281
- locale: settings.defaultLocale,
282
- };
283
- })
284
- .filter((file) => {
285
- if (!file ||
286
- typeof file.content !== 'string' ||
287
- !file.content.trim()) {
288
- logger.warn(`Skipping ${file?.fileName ?? 'unknown'}: File is empty after sanitization`);
289
- recordWarning('skipped_file', file?.fileName ?? 'unknown', 'File is empty after sanitization');
290
- return false;
291
- }
292
- return true;
293
- });
294
- files.push(...parsed.filter((file) => file !== null));
295
- }
296
- }
297
- if (files.length === 0 && !settings.publish) {
298
- logger.error('No files to translate were found. Check your configuration and try again.');
299
- }
300
- // Remove stale entries for files that were skipped during validation
301
- const validFileIds = new Set(files.map((f) => f.fileId));
302
- for (const fileId of publishMap.keys()) {
303
- if (!validFileIds.has(fileId)) {
304
- publishMap.delete(fileId);
305
- }
306
- }
307
- return { files, publishMap };
29
+ const SUPPORTED_DATA_FORMATS = [
30
+ "JSX",
31
+ "ICU",
32
+ "I18NEXT"
33
+ ];
34
+ async function aggregateFiles(settings) {
35
+ const files = [];
36
+ if (!settings.files || Object.keys(settings.files.placeholderPaths).length === 1 && settings.files.placeholderPaths.gt) return {
37
+ files,
38
+ publishMap: /* @__PURE__ */ new Map()
39
+ };
40
+ const { resolvedPaths: filePaths } = settings.files;
41
+ const skipValidation = settings.options?.skipFileValidation;
42
+ const publishMap = buildPublishMap(filePaths, settings);
43
+ if (filePaths.json) {
44
+ const { library, additionalModules } = determineLibrary();
45
+ let dataFormat;
46
+ if (library === "next-intl") dataFormat = "ICU";
47
+ else if (library === "i18next") if (additionalModules.includes("i18next-icu")) dataFormat = "ICU";
48
+ else dataFormat = "I18NEXT";
49
+ else dataFormat = "STRING";
50
+ const jsonFiles = filePaths.json.filter((filePath) => !isCompanionMetadataFile(filePath, filePaths.json)).map((filePath) => {
51
+ const content = readFile(filePath);
52
+ const relativePath = getRelative(filePath);
53
+ if (!skipValidation?.json) try {
54
+ JSON.parse(content);
55
+ } catch {
56
+ logger.warn(`Skipping ${relativePath}: JSON file is not parsable`);
57
+ recordWarning("skipped_file", relativePath, "JSON file is not parsable");
58
+ return null;
59
+ }
60
+ let contentForParsing = content;
61
+ if (shouldResolveRefs(filePath, settings.options)) try {
62
+ const { resolved, refMap } = resolveMintlifyRefs(JSON.parse(content), filePath);
63
+ storeRefMap(refMap);
64
+ contentForParsing = JSON.stringify(resolved, null, 2);
65
+ } catch {}
66
+ const parsedJson = parseJson(contentForParsing, filePath, settings.options || {}, settings.defaultLocale);
67
+ let keyedMetadata;
68
+ let parsedContent;
69
+ try {
70
+ parsedContent = JSON.parse(content);
71
+ } catch {}
72
+ if (parsedContent) {
73
+ const rawMetadata = parseKeyedMetadata(filePath, parsedContent);
74
+ if (rawMetadata) {
75
+ const transformed = parseJson(JSON.stringify(rawMetadata), filePath, settings.options || {}, settings.defaultLocale, false);
76
+ const transformedMetadata = JSON.parse(transformed);
77
+ const sourceKeys = new Set(Object.keys(JSON.parse(parsedJson)));
78
+ const filtered = Object.fromEntries(Object.entries(transformedMetadata).filter(([k]) => sourceKeys.has(k)));
79
+ if (Object.keys(filtered).length > 0) keyedMetadata = filtered;
80
+ else logger.warn(`Companion metadata found for ${relativePath} but no keys aligned with the JSON schema — metadata was not attached`);
81
+ }
82
+ }
83
+ return {
84
+ fileId: hashStringSync(relativePath),
85
+ versionId: hashStringSync(parsedJson),
86
+ content: parsedJson,
87
+ fileName: relativePath,
88
+ fileFormat: "JSON",
89
+ ...getTransformFormatProperty(settings, "json"),
90
+ dataFormat,
91
+ locale: settings.defaultLocale,
92
+ ...keyedMetadata && { formatMetadata: { keyedMetadata } }
93
+ };
94
+ }).filter((file) => {
95
+ if (!file) return false;
96
+ if (typeof file.content !== "string" || !file.content.trim()) {
97
+ logger.warn(`Skipping ${file.fileName}: JSON file is empty`);
98
+ recordWarning("skipped_file", file.fileName, "JSON file is empty");
99
+ return false;
100
+ }
101
+ return true;
102
+ });
103
+ files.push(...jsonFiles.filter((file) => file !== null));
104
+ }
105
+ if (filePaths.yaml) {
106
+ const yamlFiles = filePaths.yaml.filter((filePath) => !isCompanionMetadataFile(filePath, filePaths.yaml)).map((filePath) => {
107
+ const content = readFile(filePath);
108
+ const relativePath = getRelative(filePath);
109
+ if (!skipValidation?.yaml) try {
110
+ YAML.parse(content);
111
+ } catch {
112
+ logger.warn(`Skipping ${relativePath}: YAML file is not parsable`);
113
+ recordWarning("skipped_file", relativePath, "YAML file is not parsable");
114
+ return null;
115
+ }
116
+ const { content: parsedYaml, fileFormat } = parseYaml(content, filePath, settings.options || {});
117
+ let keyedMetadata;
118
+ try {
119
+ const rawMetadata = parseKeyedMetadata(filePath, YAML.parse(content));
120
+ if (rawMetadata) {
121
+ const yamlSchema = validateYamlSchema(settings.options || {}, filePath);
122
+ if (yamlSchema?.include) {
123
+ const flattened = flattenJson(rawMetadata, yamlSchema.include);
124
+ const sourceKeys = new Set(Object.keys(JSON.parse(parsedYaml)));
125
+ const filtered = Object.fromEntries(Object.entries(flattened).filter(([k]) => sourceKeys.has(k)));
126
+ if (Object.keys(filtered).length > 0) keyedMetadata = filtered;
127
+ else logger.warn(`Companion metadata found for ${relativePath} but no keys aligned with the YAML schema — metadata was not attached`);
128
+ } else keyedMetadata = rawMetadata;
129
+ }
130
+ } catch {}
131
+ return {
132
+ content: parsedYaml,
133
+ fileName: relativePath,
134
+ fileFormat,
135
+ ...getTransformFormatProperty(settings, "yaml"),
136
+ fileId: hashStringSync(relativePath),
137
+ versionId: hashStringSync(parsedYaml),
138
+ locale: settings.defaultLocale,
139
+ ...keyedMetadata && { formatMetadata: { keyedMetadata } }
140
+ };
141
+ }).filter((file) => {
142
+ if (!file || typeof file.content !== "string" || !file.content.trim()) {
143
+ logger.warn(`Skipping ${file?.fileName ?? "unknown"}: YAML file is empty`);
144
+ recordWarning("skipped_file", file?.fileName ?? "unknown", "YAML file is empty");
145
+ return false;
146
+ }
147
+ return true;
148
+ });
149
+ files.push(...yamlFiles.filter((file) => file !== null));
150
+ }
151
+ if (filePaths.twilioContentJson) {
152
+ const twilioContentJsonFiles = filePaths.twilioContentJson.map((filePath) => {
153
+ const content = readFile(filePath);
154
+ const relativePath = getRelative(filePath);
155
+ if (!skipValidation?.json) try {
156
+ JSON.parse(content);
157
+ } catch {
158
+ logger.warn(`Skipping ${relativePath}: JSON file is not parsable`);
159
+ recordWarning("skipped_file", relativePath, "JSON file is not parsable");
160
+ return null;
161
+ }
162
+ const parsedJson = parseJson(content, filePath, settings.options || {}, settings.defaultLocale);
163
+ return {
164
+ fileId: hashStringSync(relativePath),
165
+ versionId: hashStringSync(parsedJson),
166
+ content: parsedJson,
167
+ fileName: relativePath,
168
+ fileFormat: "TWILIO_CONTENT_JSON",
169
+ ...getTransformFormatProperty(settings, "twilioContentJson"),
170
+ dataFormat: "STRING",
171
+ locale: settings.defaultLocale
172
+ };
173
+ }).filter((file) => {
174
+ if (!file) return false;
175
+ if (typeof file.content !== "string" || !file.content.trim()) {
176
+ logger.warn(`Skipping ${file.fileName}: JSON file is empty`);
177
+ recordWarning("skipped_file", file.fileName, "JSON file is empty");
178
+ return false;
179
+ }
180
+ return true;
181
+ });
182
+ files.push(...twilioContentJsonFiles.filter((file) => file !== null));
183
+ }
184
+ for (const fileType of SUPPORTED_FILE_EXTENSIONS) {
185
+ if (fileType === "json" || fileType === "yaml" || fileType === "twilioContentJson") continue;
186
+ if (filePaths[fileType]) {
187
+ const parsed = filePaths[fileType].map((filePath) => {
188
+ const content = readFile(filePath);
189
+ const relativePath = getRelative(filePath);
190
+ const processed = preprocessContent(content, relativePath, fileType, settings);
191
+ if (typeof processed !== "string") {
192
+ logger.warn(`Skipping ${relativePath}: ${processed.skip}`);
193
+ recordWarning("skipped_file", relativePath, processed.skip);
194
+ return null;
195
+ }
196
+ return {
197
+ content: processed,
198
+ fileName: relativePath,
199
+ fileFormat: fileType.toUpperCase(),
200
+ ...getTransformFormatProperty(settings, fileType),
201
+ fileId: hashStringSync(relativePath),
202
+ versionId: hashStringSync(processed),
203
+ locale: settings.defaultLocale
204
+ };
205
+ }).filter((file) => {
206
+ if (!file || typeof file.content !== "string" || !file.content.trim()) {
207
+ logger.warn(`Skipping ${file?.fileName ?? "unknown"}: File is empty after sanitization`);
208
+ recordWarning("skipped_file", file?.fileName ?? "unknown", "File is empty after sanitization");
209
+ return false;
210
+ }
211
+ return true;
212
+ });
213
+ files.push(...parsed.filter((file) => file !== null));
214
+ }
215
+ }
216
+ if (files.length === 0 && !settings.publish) logger.error("No files to translate were found. Check your configuration and try again.");
217
+ const validFileIds = new Set(files.map((f) => f.fileId));
218
+ for (const fileId of publishMap.keys()) if (!validFileIds.has(fileId)) publishMap.delete(fileId);
219
+ return {
220
+ files,
221
+ publishMap
222
+ };
308
223
  }
224
+ //#endregion
225
+ export { SUPPORTED_DATA_FORMATS, aggregateFiles };
226
+
227
+ //# sourceMappingURL=aggregateFiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregateFiles.js","names":[],"sources":["../../../src/formats/files/aggregateFiles.ts"],"sourcesContent":["import { logger } from '../../console/logger.js';\nimport { recordWarning } from '../../state/translateWarnings.js';\nimport { getRelative, readFile } from '../../fs/findFilepath.js';\nimport { Settings } from '../../types/index.js';\nimport type { FileFormat, DataFormat, FileToUpload } from '../../types/data.js';\nimport { SUPPORTED_FILE_EXTENSIONS } from './supportedFiles.js';\nimport { parseJson } from '../json/parseJson.js';\nimport {\n resolveMintlifyRefs,\n shouldResolveRefs,\n} from '../../utils/resolveMintlifyRefs.js';\nimport { storeRefMap } from '../../state/mintlifyRefMap.js';\nimport parseYaml from '../yaml/parseYaml.js';\nimport { validateYamlSchema } from '../yaml/utils.js';\nimport { flattenJson } from '../json/flattenJson.js';\nimport type { JSONObject } from '../../types/data/json.js';\nimport YAML from 'yaml';\nimport { determineLibrary } from '../../fs/determineFramework/index.js';\nimport { hashStringSync } from '../../utils/hash.js';\nimport { preprocessContent } from './preprocessContent.js';\nimport {\n parseKeyedMetadata,\n type KeyedMetadata,\n} from '../parseKeyedMetadata.js';\nimport { buildPublishMap } from '../../utils/resolvePublish.js';\nimport { getTransformFormatProperty } from './transformFormat.js';\n\n/**\n * Checks if a file path is a metadata companion file (e.g. foo.metadata.json)\n * AND its corresponding source file (e.g. foo.json) exists in the file list.\n * If both conditions are true, the metadata file should be skipped as a translation source.\n */\nfunction isCompanionMetadataFile(\n filePath: string,\n allFilePaths: string[]\n): boolean {\n const metadataPattern = /\\.metadata\\.(json|yaml|yml)$/;\n if (!metadataPattern.test(filePath)) return false;\n\n // Derive the source file path: foo.metadata.json -> foo.json\n const sourceFilePath = filePath.replace(\n /\\.metadata\\.(json|yaml|yml)$/,\n '.$1'\n );\n return allFilePaths.includes(sourceFilePath);\n}\nexport const SUPPORTED_DATA_FORMATS = ['JSX', 'ICU', 'I18NEXT'];\n\nexport async function aggregateFiles(\n settings: Settings\n): Promise<{ files: FileToUpload[]; publishMap: Map<string, boolean> }> {\n // Aggregate all files to translate\n const files: FileToUpload[] = [];\n if (\n !settings.files ||\n (Object.keys(settings.files.placeholderPaths).length === 1 &&\n settings.files.placeholderPaths.gt)\n ) {\n return { files, publishMap: new Map<string, boolean>() };\n }\n\n const { resolvedPaths: filePaths } = settings.files;\n const skipValidation = settings.options?.skipFileValidation;\n\n // Build publish map upfront from resolved paths.\n const publishMap = buildPublishMap(filePaths, settings);\n\n // Process JSON files\n if (filePaths.json) {\n const { library, additionalModules } = determineLibrary();\n\n // Determine dataFormat for JSONs\n let dataFormat: DataFormat;\n if (library === 'next-intl') {\n dataFormat = 'ICU';\n } else if (library === 'i18next') {\n if (additionalModules.includes('i18next-icu')) {\n dataFormat = 'ICU';\n } else {\n dataFormat = 'I18NEXT';\n }\n } else {\n dataFormat = 'STRING';\n }\n\n const jsonFiles = filePaths.json\n .filter((filePath) => !isCompanionMetadataFile(filePath, filePaths.json!))\n .map((filePath) => {\n const content = readFile(filePath);\n const relativePath = getRelative(filePath);\n\n // Pre-validate JSON parseability\n if (!skipValidation?.json) {\n try {\n JSON.parse(content);\n } catch {\n logger.warn(`Skipping ${relativePath}: JSON file is not parsable`);\n recordWarning(\n 'skipped_file',\n relativePath,\n 'JSON file is not parsable'\n );\n return null;\n }\n }\n\n // Resolve $ref before parsing if configured\n let contentForParsing = content;\n if (shouldResolveRefs(filePath, settings.options)) {\n try {\n const json = JSON.parse(content);\n const { resolved, refMap } = resolveMintlifyRefs(json, filePath);\n storeRefMap(refMap);\n contentForParsing = JSON.stringify(resolved, null, 2);\n } catch {\n // JSON parse errors are handled below by parseJson\n }\n }\n\n const parsedJson = parseJson(\n contentForParsing,\n filePath,\n settings.options || {},\n settings.defaultLocale\n );\n\n // Detect companion metadata file\n let keyedMetadata: KeyedMetadata | undefined;\n let parsedContent: JSONObject | undefined;\n try {\n parsedContent = JSON.parse(content) as JSONObject;\n } catch {\n // Content not parsable — skip metadata detection\n }\n if (parsedContent) {\n const rawMetadata = parseKeyedMetadata(filePath, parsedContent);\n if (rawMetadata) {\n // Run metadata through the same include/composite schema as the source\n // so key paths align at translation time\n const transformed = parseJson(\n JSON.stringify(rawMetadata),\n filePath,\n settings.options || {},\n settings.defaultLocale,\n false\n );\n const transformedMetadata = JSON.parse(transformed);\n\n // Filter metadata to only keep keys that exist in the transformed source\n // This prevents misaligned entries from wide JSONPath patterns\n const sourceKeys = new Set(Object.keys(JSON.parse(parsedJson)));\n const filtered = Object.fromEntries(\n Object.entries(transformedMetadata).filter(([k]) =>\n sourceKeys.has(k)\n )\n ) as KeyedMetadata;\n\n if (Object.keys(filtered).length > 0) {\n keyedMetadata = filtered;\n } else {\n logger.warn(\n `Companion metadata found for ${relativePath} but no keys aligned with the JSON schema — metadata was not attached`\n );\n }\n }\n }\n\n return {\n fileId: hashStringSync(relativePath),\n versionId: hashStringSync(parsedJson),\n content: parsedJson,\n fileName: relativePath,\n fileFormat: 'JSON' as const,\n ...getTransformFormatProperty(settings, 'json'),\n dataFormat,\n locale: settings.defaultLocale,\n ...(keyedMetadata && {\n formatMetadata: { keyedMetadata },\n }),\n } satisfies FileToUpload;\n })\n .filter((file) => {\n if (!file) return false;\n if (typeof file.content !== 'string' || !file.content.trim()) {\n logger.warn(`Skipping ${file.fileName}: JSON file is empty`);\n recordWarning('skipped_file', file.fileName, 'JSON file is empty');\n return false;\n }\n return true;\n });\n files.push(...jsonFiles.filter((file) => file !== null));\n }\n\n // Process YAML files\n if (filePaths.yaml) {\n const yamlFiles = filePaths.yaml\n .filter((filePath) => !isCompanionMetadataFile(filePath, filePaths.yaml!))\n .map((filePath) => {\n const content = readFile(filePath);\n const relativePath = getRelative(filePath);\n\n // Pre-validate YAML parseability\n if (!skipValidation?.yaml) {\n try {\n YAML.parse(content);\n } catch {\n logger.warn(`Skipping ${relativePath}: YAML file is not parsable`);\n recordWarning(\n 'skipped_file',\n relativePath,\n 'YAML file is not parsable'\n );\n return null;\n }\n }\n\n const { content: parsedYaml, fileFormat } = parseYaml(\n content,\n filePath,\n settings.options || {}\n );\n\n // Detect companion metadata file\n let keyedMetadata: KeyedMetadata | undefined;\n try {\n const parsedYamlContent = YAML.parse(content);\n const rawMetadata = parseKeyedMetadata(filePath, parsedYamlContent);\n if (rawMetadata) {\n const yamlSchema = validateYamlSchema(\n settings.options || {},\n filePath\n );\n if (yamlSchema?.include) {\n // Flatten metadata through the same include schema as the source\n const flattened = flattenJson(rawMetadata, yamlSchema.include);\n // Filter to only keep keys that exist in the transformed source\n const sourceKeys = new Set(Object.keys(JSON.parse(parsedYaml)));\n const filtered = Object.fromEntries(\n Object.entries(flattened).filter(([k]) => sourceKeys.has(k))\n ) as KeyedMetadata;\n if (Object.keys(filtered).length > 0) {\n keyedMetadata = filtered;\n } else {\n logger.warn(\n `Companion metadata found for ${relativePath} but no keys aligned with the YAML schema — metadata was not attached`\n );\n }\n } else {\n keyedMetadata = rawMetadata;\n }\n }\n } catch {\n // Content not parsable as YAML — skip metadata detection\n }\n\n return {\n content: parsedYaml,\n fileName: relativePath,\n fileFormat,\n ...getTransformFormatProperty(settings, 'yaml'),\n fileId: hashStringSync(relativePath),\n versionId: hashStringSync(parsedYaml),\n locale: settings.defaultLocale,\n ...(keyedMetadata && {\n formatMetadata: { keyedMetadata },\n }),\n } satisfies FileToUpload;\n })\n .filter((file) => {\n if (!file || typeof file.content !== 'string' || !file.content.trim()) {\n logger.warn(\n `Skipping ${file?.fileName ?? 'unknown'}: YAML file is empty`\n );\n recordWarning(\n 'skipped_file',\n file?.fileName ?? 'unknown',\n 'YAML file is empty'\n );\n return false;\n }\n return true;\n });\n files.push(...yamlFiles.filter((file) => file !== null));\n }\n\n // Process Twilio Content JSON files\n if (filePaths.twilioContentJson) {\n const twilioContentJsonFiles = filePaths.twilioContentJson\n .map((filePath) => {\n const content = readFile(filePath);\n const relativePath = getRelative(filePath);\n\n // Pre-validate JSON parseability\n if (!skipValidation?.json) {\n try {\n JSON.parse(content);\n } catch {\n logger.warn(`Skipping ${relativePath}: JSON file is not parsable`);\n recordWarning(\n 'skipped_file',\n relativePath,\n 'JSON file is not parsable'\n );\n return null;\n }\n }\n\n const parsedJson = parseJson(\n content,\n filePath,\n settings.options || {},\n settings.defaultLocale\n );\n\n return {\n fileId: hashStringSync(relativePath),\n versionId: hashStringSync(parsedJson),\n content: parsedJson,\n fileName: relativePath,\n fileFormat: 'TWILIO_CONTENT_JSON' as const,\n ...getTransformFormatProperty(settings, 'twilioContentJson'),\n dataFormat: 'STRING' as const,\n locale: settings.defaultLocale,\n } satisfies FileToUpload;\n })\n .filter((file) => {\n if (!file) return false;\n if (typeof file.content !== 'string' || !file.content.trim()) {\n logger.warn(`Skipping ${file.fileName}: JSON file is empty`);\n recordWarning('skipped_file', file.fileName, 'JSON file is empty');\n return false;\n }\n return true;\n });\n files.push(...twilioContentJsonFiles.filter((file) => file !== null));\n }\n\n for (const fileType of SUPPORTED_FILE_EXTENSIONS) {\n if (\n fileType === 'json' ||\n fileType === 'yaml' ||\n fileType === 'twilioContentJson'\n )\n continue;\n if (filePaths[fileType]) {\n const parsed = filePaths[fileType]\n .map((filePath) => {\n const content = readFile(filePath);\n const relativePath = getRelative(filePath);\n\n const processed = preprocessContent(\n content,\n relativePath,\n fileType,\n settings\n );\n\n if (typeof processed !== 'string') {\n logger.warn(`Skipping ${relativePath}: ${processed.skip}`);\n recordWarning('skipped_file', relativePath, processed.skip);\n return null;\n }\n\n return {\n content: processed,\n fileName: relativePath,\n fileFormat: fileType.toUpperCase() as FileFormat,\n ...getTransformFormatProperty(settings, fileType),\n fileId: hashStringSync(relativePath),\n versionId: hashStringSync(processed),\n locale: settings.defaultLocale,\n } satisfies FileToUpload;\n })\n .filter((file) => {\n if (\n !file ||\n typeof file.content !== 'string' ||\n !file.content.trim()\n ) {\n logger.warn(\n `Skipping ${file?.fileName ?? 'unknown'}: File is empty after sanitization`\n );\n recordWarning(\n 'skipped_file',\n file?.fileName ?? 'unknown',\n 'File is empty after sanitization'\n );\n return false;\n }\n return true;\n });\n files.push(...parsed.filter((file) => file !== null));\n }\n }\n\n if (files.length === 0 && !settings.publish) {\n logger.error(\n 'No files to translate were found. Check your configuration and try again.'\n );\n }\n\n // Remove stale entries for files that were skipped during validation\n const validFileIds = new Set(files.map((f) => f.fileId));\n for (const fileId of publishMap.keys()) {\n if (!validFileIds.has(fileId)) {\n publishMap.delete(fileId);\n }\n }\n\n return { files, publishMap };\n}\n"],"mappings":"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"}