gt 2.14.35 → 2.14.36

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 (429) hide show
  1. package/CHANGELOG.md +16 -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.js +104 -108
  256. package/dist/react/jsx/utils/resolveImportPath.js.map +1 -0
  257. package/dist/react/jsx/utils/stringParsing/derivation/containsDeriveCall.js +18 -24
  258. package/dist/react/jsx/utils/stringParsing/derivation/containsDeriveCall.js.map +1 -0
  259. package/dist/react/jsx/utils/stringParsing/derivation/handleDerivation.js +412 -579
  260. package/dist/react/jsx/utils/stringParsing/derivation/handleDerivation.js.map +1 -0
  261. package/dist/react/jsx/utils/stringParsing/derivation/index.js +57 -67
  262. package/dist/react/jsx/utils/stringParsing/derivation/index.js.map +1 -0
  263. package/dist/react/jsx/utils/stringParsing/derivation/isDeriveCall.js +26 -36
  264. package/dist/react/jsx/utils/stringParsing/derivation/isDeriveCall.js.map +1 -0
  265. package/dist/react/jsx/utils/stringParsing/processTaggedTemplateCall/handleTaggedTemplateTranslationCall.js +29 -24
  266. package/dist/react/jsx/utils/stringParsing/processTaggedTemplateCall/handleTaggedTemplateTranslationCall.js.map +1 -0
  267. package/dist/react/jsx/utils/stringParsing/processTaggedTemplateCall/index.js +34 -32
  268. package/dist/react/jsx/utils/stringParsing/processTaggedTemplateCall/index.js.map +1 -0
  269. package/dist/react/jsx/utils/stringParsing/processTranslationCall/extractStringEntryMetadata.js +80 -117
  270. package/dist/react/jsx/utils/stringParsing/processTranslationCall/extractStringEntryMetadata.js.map +1 -0
  271. package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleDeriveTranslationCall.js +24 -19
  272. package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleDeriveTranslationCall.js.map +1 -0
  273. package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleInvalidTranslationCall.js +18 -21
  274. package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleInvalidTranslationCall.js.map +1 -0
  275. package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleLiteralTranslationCall.js +45 -50
  276. package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleLiteralTranslationCall.js.map +1 -0
  277. package/dist/react/jsx/utils/stringParsing/processTranslationCall/index.js +54 -59
  278. package/dist/react/jsx/utils/stringParsing/processTranslationCall/index.js.map +1 -0
  279. package/dist/react/jsx/utils/stringParsing/processTranslationCall/routeTranslationCall.js +56 -69
  280. package/dist/react/jsx/utils/stringParsing/processTranslationCall/routeTranslationCall.js.map +1 -0
  281. package/dist/react/jsx/utils/validateStringFunction.js +21 -29
  282. package/dist/react/jsx/utils/validateStringFunction.js.map +1 -0
  283. package/dist/react/jsx/wrapJsx.js +192 -375
  284. package/dist/react/jsx/wrapJsx.js.map +1 -0
  285. package/dist/react/parse/addVitePlugin/index.js +40 -34
  286. package/dist/react/parse/addVitePlugin/index.js.map +1 -0
  287. package/dist/react/parse/addVitePlugin/installCompiler.js +18 -20
  288. package/dist/react/parse/addVitePlugin/installCompiler.js.map +1 -0
  289. package/dist/react/parse/addVitePlugin/updateViteConfig.js +107 -111
  290. package/dist/react/parse/addVitePlugin/updateViteConfig.js.map +1 -0
  291. package/dist/react/parse/addVitePlugin/utils/addCompilerImport.js +23 -26
  292. package/dist/react/parse/addVitePlugin/utils/addCompilerImport.js.map +1 -0
  293. package/dist/react/parse/addVitePlugin/utils/addPluginInvocation.js +29 -43
  294. package/dist/react/parse/addVitePlugin/utils/addPluginInvocation.js.map +1 -0
  295. package/dist/react/parse/addVitePlugin/utils/checkCompilerImport.js +70 -104
  296. package/dist/react/parse/addVitePlugin/utils/checkCompilerImport.js.map +1 -0
  297. package/dist/react/parse/addVitePlugin/utils/checkPluginInvocation.js +23 -29
  298. package/dist/react/parse/addVitePlugin/utils/checkPluginInvocation.js.map +1 -0
  299. package/dist/react/parse/createDictionaryUpdates.js +121 -185
  300. package/dist/react/parse/createDictionaryUpdates.js.map +1 -0
  301. package/dist/react/parse/createInlineUpdates.js +123 -139
  302. package/dist/react/parse/createInlineUpdates.js.map +1 -0
  303. package/dist/react/parse/wrapContent.js +131 -156
  304. package/dist/react/parse/wrapContent.js.map +1 -0
  305. package/dist/react/utils/flattenDictionary.js +55 -70
  306. package/dist/react/utils/flattenDictionary.js.map +1 -0
  307. package/dist/react/utils/getEntryAndMetadata.js +14 -10
  308. package/dist/react/utils/getEntryAndMetadata.js.map +1 -0
  309. package/dist/react/utils/getVariableName.js +36 -33
  310. package/dist/react/utils/getVariableName.js.map +1 -0
  311. package/dist/setup/detectFramework.js +85 -102
  312. package/dist/setup/detectFramework.js.map +1 -0
  313. package/dist/setup/frameworkUtils.js +17 -28
  314. package/dist/setup/frameworkUtils.js.map +1 -0
  315. package/dist/setup/userInput.js +24 -31
  316. package/dist/setup/userInput.js.map +1 -0
  317. package/dist/setup/wizard.js +141 -143
  318. package/dist/setup/wizard.js.map +1 -0
  319. package/dist/state/mintlifyRefMap.js +12 -9
  320. package/dist/state/mintlifyRefMap.js.map +1 -0
  321. package/dist/state/recentDownloads.js +26 -23
  322. package/dist/state/recentDownloads.js.map +1 -0
  323. package/dist/state/translateWarnings.js +17 -8
  324. package/dist/state/translateWarnings.js.map +1 -0
  325. package/dist/translation/parse.js +77 -98
  326. package/dist/translation/parse.js.map +1 -0
  327. package/dist/translation/stage.js +28 -43
  328. package/dist/translation/stage.js.map +1 -0
  329. package/dist/translation/validate.js +68 -91
  330. package/dist/translation/validate.js.map +1 -0
  331. package/dist/types/libraries.js +93 -91
  332. package/dist/types/libraries.js.map +1 -0
  333. package/dist/types/parsing.js +19 -10
  334. package/dist/types/parsing.js.map +1 -0
  335. package/dist/utils/addExplicitAnchorIds.js +270 -389
  336. package/dist/utils/addExplicitAnchorIds.js.map +1 -0
  337. package/dist/utils/calculateTimeoutMs.js +11 -6
  338. package/dist/utils/calculateTimeoutMs.js.map +1 -0
  339. package/dist/utils/constants.js +15 -12
  340. package/dist/utils/constants.js.map +1 -0
  341. package/dist/utils/credentials.js +67 -114
  342. package/dist/utils/credentials.js.map +1 -0
  343. package/dist/utils/fetch.js +22 -20
  344. package/dist/utils/fetch.js.map +1 -0
  345. package/dist/utils/flattenJsonFiles.js +27 -34
  346. package/dist/utils/flattenJsonFiles.js.map +1 -0
  347. package/dist/utils/gitDiff.js +30 -32
  348. package/dist/utils/gitDiff.js.map +1 -0
  349. package/dist/utils/gt.js +7 -2
  350. package/dist/utils/gt.js.map +1 -0
  351. package/dist/utils/hash.js +14 -9
  352. package/dist/utils/hash.js.map +1 -0
  353. package/dist/utils/headers.js +10 -13
  354. package/dist/utils/headers.js.map +1 -0
  355. package/dist/utils/installPackage.js +70 -75
  356. package/dist/utils/installPackage.js.map +1 -0
  357. package/dist/utils/localizeRelativeAssets.js +114 -157
  358. package/dist/utils/localizeRelativeAssets.js.map +1 -0
  359. package/dist/utils/localizeStaticImports.js +229 -371
  360. package/dist/utils/localizeStaticImports.js.map +1 -0
  361. package/dist/utils/localizeStaticUrls.js +241 -424
  362. package/dist/utils/localizeStaticUrls.js.map +1 -0
  363. package/dist/utils/mintlifyTitleFallback.js +64 -72
  364. package/dist/utils/mintlifyTitleFallback.js.map +1 -0
  365. package/dist/utils/monorepoVersionCheck.js +177 -215
  366. package/dist/utils/monorepoVersionCheck.js.map +1 -0
  367. package/dist/utils/packageInfo.js +17 -16
  368. package/dist/utils/packageInfo.js.map +1 -0
  369. package/dist/utils/packageJson.js +51 -66
  370. package/dist/utils/packageJson.js.map +1 -0
  371. package/dist/utils/packageManager.js +237 -260
  372. package/dist/utils/packageManager.js.map +1 -0
  373. package/dist/utils/parse/needsCJS.js +36 -69
  374. package/dist/utils/parse/needsCJS.js.map +1 -0
  375. package/dist/utils/persistPostprocessHashes.js +30 -32
  376. package/dist/utils/persistPostprocessHashes.js.map +1 -0
  377. package/dist/utils/processAnchorIds.js +32 -54
  378. package/dist/utils/processAnchorIds.js.map +1 -0
  379. package/dist/utils/processOpenApi.js +469 -578
  380. package/dist/utils/processOpenApi.js.map +1 -0
  381. package/dist/utils/resolveMintlifyRefs.js +89 -105
  382. package/dist/utils/resolveMintlifyRefs.js.map +1 -0
  383. package/dist/utils/resolvePublish.js +46 -54
  384. package/dist/utils/resolvePublish.js.map +1 -0
  385. package/dist/utils/sanitizeFileContent.js +20 -27
  386. package/dist/utils/sanitizeFileContent.js.map +1 -0
  387. package/dist/utils/sharedStaticAssets.js +248 -366
  388. package/dist/utils/sharedStaticAssets.js.map +1 -0
  389. package/dist/utils/splitMintlifyLanguageRefs.js +208 -282
  390. package/dist/utils/splitMintlifyLanguageRefs.js.map +1 -0
  391. package/dist/utils/validateMdx.js +26 -23
  392. package/dist/utils/validateMdx.js.map +1 -0
  393. package/dist/utils/wrapPlainUrls.js +58 -70
  394. package/dist/utils/wrapPlainUrls.js.map +1 -0
  395. package/dist/workflows/download.js +92 -126
  396. package/dist/workflows/download.js.map +1 -0
  397. package/dist/workflows/enqueue.js +47 -54
  398. package/dist/workflows/enqueue.js.map +1 -0
  399. package/dist/workflows/publish.js +29 -29
  400. package/dist/workflows/publish.js.map +1 -0
  401. package/dist/workflows/setupProject.js +39 -40
  402. package/dist/workflows/setupProject.js.map +1 -0
  403. package/dist/workflows/stage.js +61 -65
  404. package/dist/workflows/stage.js.map +1 -0
  405. package/dist/workflows/steps/BranchStep.js +118 -163
  406. package/dist/workflows/steps/BranchStep.js.map +1 -0
  407. package/dist/workflows/steps/DownloadStep.js +107 -137
  408. package/dist/workflows/steps/DownloadStep.js.map +1 -0
  409. package/dist/workflows/steps/EnqueueStep.js +32 -32
  410. package/dist/workflows/steps/EnqueueStep.js.map +1 -0
  411. package/dist/workflows/steps/PollJobsStep.js +208 -292
  412. package/dist/workflows/steps/PollJobsStep.js.map +1 -0
  413. package/dist/workflows/steps/PublishStep.js +33 -38
  414. package/dist/workflows/steps/PublishStep.js.map +1 -0
  415. package/dist/workflows/steps/SetupStep.js +71 -72
  416. package/dist/workflows/steps/SetupStep.js.map +1 -0
  417. package/dist/workflows/steps/TagStep.js +39 -44
  418. package/dist/workflows/steps/TagStep.js.map +1 -0
  419. package/dist/workflows/steps/UploadSourcesStep.js +108 -140
  420. package/dist/workflows/steps/UploadSourcesStep.js.map +1 -0
  421. package/dist/workflows/steps/UploadTranslationsStep.js +61 -71
  422. package/dist/workflows/steps/UploadTranslationsStep.js.map +1 -0
  423. package/dist/workflows/steps/UserEditDiffsStep.js +32 -34
  424. package/dist/workflows/steps/UserEditDiffsStep.js.map +1 -0
  425. package/dist/workflows/steps/WorkflowStep.js +6 -2
  426. package/dist/workflows/steps/WorkflowStep.js.map +1 -0
  427. package/dist/workflows/upload.js +45 -46
  428. package/dist/workflows/upload.js.map +1 -0
  429. package/package.json +14 -7
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PublishStep.js","names":[],"sources":["../../../src/workflows/steps/PublishStep.ts"],"sourcesContent":["import { WorkflowStep } from './WorkflowStep.js';\nimport { logger } from '../../console/logger.js';\nimport { GT } from 'generaltranslation';\nimport type { PublishFileEntry } from 'generaltranslation/types';\nimport chalk from 'chalk';\n\nexport class PublishStep extends WorkflowStep<PublishFileEntry[], void> {\n private spinner = logger.createSpinner('dots');\n\n constructor(private gt: GT) {\n super();\n }\n\n async run(files: PublishFileEntry[]): Promise<void> {\n if (files.length === 0) return;\n\n this.spinner.start('Updating CDN...');\n\n try {\n const result = await this.gt.publishFiles(files);\n\n const failed = result.results.filter(\n (r: { success: boolean; error?: string }) => !r.success\n );\n if (failed.length > 0) {\n this.spinner.stop(chalk.yellow('CDN updated with errors'));\n for (const f of failed) {\n const file = files.find((p) => p.fileId === f.fileId);\n const name = file?.fileName ?? f.fileId;\n logger.warn(\n `Failed to update ${name}: ${f.error ?? 'unknown error'}`\n );\n }\n } else {\n this.spinner.stop(chalk.green('CDN updated'));\n }\n } catch (err) {\n this.spinner.stop(chalk.red('Failed to update CDN'));\n logger.warn(\n `Publish error: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n }\n\n async wait(): Promise<void> {\n return;\n }\n}\n"],"mappings":";;;;AAMA,IAAa,cAAb,cAAiC,aAAuC;CACtE,UAAkB,OAAO,cAAc,OAAO;CAE9C,YAAY,IAAgB;AAC1B,SAAO;AADW,OAAA,KAAA;;CAIpB,MAAM,IAAI,OAA0C;AAClD,MAAI,MAAM,WAAW,EAAG;AAExB,OAAK,QAAQ,MAAM,kBAAkB;AAErC,MAAI;GAGF,MAAM,UAAS,MAFM,KAAK,GAAG,aAAa,MAAM,EAE1B,QAAQ,QAC3B,MAA4C,CAAC,EAAE,QACjD;AACD,OAAI,OAAO,SAAS,GAAG;AACrB,SAAK,QAAQ,KAAK,MAAM,OAAO,0BAA0B,CAAC;AAC1D,SAAK,MAAM,KAAK,QAAQ;KAEtB,MAAM,OADO,MAAM,MAAM,MAAM,EAAE,WAAW,EAAE,OAC7B,EAAE,YAAY,EAAE;AACjC,YAAO,KACL,oBAAoB,KAAK,IAAI,EAAE,SAAS,kBACzC;;SAGH,MAAK,QAAQ,KAAK,MAAM,MAAM,cAAc,CAAC;WAExC,KAAK;AACZ,QAAK,QAAQ,KAAK,MAAM,IAAI,uBAAuB,CAAC;AACpD,UAAO,KACL,kBAAkB,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GACnE;;;CAIL,MAAM,OAAsB"}
@@ -1,72 +1,71 @@
1
- import { WorkflowStep } from './WorkflowStep.js';
2
- import { logger } from '../../console/logger.js';
3
- import chalk from 'chalk';
4
- export class SetupStep extends WorkflowStep {
5
- gt;
6
- settings;
7
- timeoutMs;
8
- spinner = logger.createSpinner('dots');
9
- setupJobId = null;
10
- files = null;
11
- completed = false;
12
- constructor(gt, settings, timeoutMs) {
13
- super();
14
- this.gt = gt;
15
- this.settings = settings;
16
- this.timeoutMs = timeoutMs;
17
- }
18
- async run(files, force = false) {
19
- this.files = files;
20
- this.spinner.start('Setting up project...');
21
- if (files.length === 0) {
22
- this.completed = true;
23
- return [];
24
- }
25
- const result = await this.gt.setupProject(files, {
26
- locales: this.settings.locales,
27
- force,
28
- });
29
- if (result.status === 'completed') {
30
- this.completed = true;
31
- return files;
32
- }
33
- if (result.status === 'queued') {
34
- this.setupJobId = result.setupJobId;
35
- return files;
36
- }
37
- // Unknown status
38
- this.completed = true;
39
- return files;
40
- }
41
- async wait() {
42
- if (this.completed) {
43
- this.spinner.stop(chalk.green('Setup successfully completed'));
44
- return;
45
- }
46
- if (!this.setupJobId) {
47
- this.spinner.stop(chalk.yellow('Setup status unknown — proceeding without setup'));
48
- return;
49
- }
50
- // Poll for completion
51
- const start = Date.now();
52
- const pollInterval = 5000; // 5 seconds
53
- while (Date.now() - start < this.timeoutMs) {
54
- const status = await this.gt.checkJobStatus([this.setupJobId]);
55
- if (!status[0]) {
56
- this.spinner.stop(chalk.yellow('Setup status unknown — proceeding without setup'));
57
- return;
58
- }
59
- if (status[0].status === 'completed') {
60
- this.spinner.stop(chalk.green('Setup successfully completed'));
61
- return;
62
- }
63
- if (status[0].status === 'failed') {
64
- this.spinner.stop(chalk.yellow(`Setup failed: ${status[0].error?.message || 'Unknown error'} — proceeding without setup`));
65
- return;
66
- }
67
- await new Promise((r) => setTimeout(r, pollInterval));
68
- }
69
- // Timeout
70
- this.spinner.stop(chalk.yellow('Setup timed out — proceeding without setup'));
71
- }
72
- }
1
+ import { logger } from "../../console/logger.js";
2
+ import { WorkflowStep } from "./WorkflowStep.js";
3
+ import chalk from "chalk";
4
+ //#region src/workflows/steps/SetupStep.ts
5
+ var SetupStep = class extends WorkflowStep {
6
+ spinner = logger.createSpinner("dots");
7
+ setupJobId = null;
8
+ files = null;
9
+ completed = false;
10
+ constructor(gt, settings, timeoutMs) {
11
+ super();
12
+ this.gt = gt;
13
+ this.settings = settings;
14
+ this.timeoutMs = timeoutMs;
15
+ }
16
+ async run(files, force = false) {
17
+ this.files = files;
18
+ this.spinner.start("Setting up project...");
19
+ if (files.length === 0) {
20
+ this.completed = true;
21
+ return [];
22
+ }
23
+ const result = await this.gt.setupProject(files, {
24
+ locales: this.settings.locales,
25
+ force
26
+ });
27
+ if (result.status === "completed") {
28
+ this.completed = true;
29
+ return files;
30
+ }
31
+ if (result.status === "queued") {
32
+ this.setupJobId = result.setupJobId;
33
+ return files;
34
+ }
35
+ this.completed = true;
36
+ return files;
37
+ }
38
+ async wait() {
39
+ if (this.completed) {
40
+ this.spinner.stop(chalk.green("Setup successfully completed"));
41
+ return;
42
+ }
43
+ if (!this.setupJobId) {
44
+ this.spinner.stop(chalk.yellow("Setup status unknown — proceeding without setup"));
45
+ return;
46
+ }
47
+ const start = Date.now();
48
+ const pollInterval = 5e3;
49
+ while (Date.now() - start < this.timeoutMs) {
50
+ const status = await this.gt.checkJobStatus([this.setupJobId]);
51
+ if (!status[0]) {
52
+ this.spinner.stop(chalk.yellow("Setup status unknown proceeding without setup"));
53
+ return;
54
+ }
55
+ if (status[0].status === "completed") {
56
+ this.spinner.stop(chalk.green("Setup successfully completed"));
57
+ return;
58
+ }
59
+ if (status[0].status === "failed") {
60
+ this.spinner.stop(chalk.yellow(`Setup failed: ${status[0].error?.message || "Unknown error"} — proceeding without setup`));
61
+ return;
62
+ }
63
+ await new Promise((r) => setTimeout(r, pollInterval));
64
+ }
65
+ this.spinner.stop(chalk.yellow("Setup timed out — proceeding without setup"));
66
+ }
67
+ };
68
+ //#endregion
69
+ export { SetupStep };
70
+
71
+ //# sourceMappingURL=SetupStep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SetupStep.js","names":[],"sources":["../../../src/workflows/steps/SetupStep.ts"],"sourcesContent":["import { FileReference } from 'generaltranslation/types';\nimport { WorkflowStep } from './WorkflowStep.js';\nimport { logger } from '../../console/logger.js';\nimport { GT } from 'generaltranslation';\nimport { Settings } from '../../types/index.js';\nimport chalk from 'chalk';\n\nexport class SetupStep extends WorkflowStep<FileReference[], FileReference[]> {\n private spinner = logger.createSpinner('dots');\n private setupJobId: string | null = null;\n private files: FileReference[] | null = null;\n private completed = false;\n\n constructor(\n private gt: GT,\n private settings: Settings,\n private timeoutMs: number\n ) {\n super();\n }\n\n async run(\n files: FileReference[],\n force: boolean = false\n ): Promise<FileReference[]> {\n this.files = files;\n this.spinner.start('Setting up project...');\n\n if (files.length === 0) {\n this.completed = true;\n return [];\n }\n\n const result = await this.gt.setupProject(files, {\n locales: this.settings.locales,\n force,\n });\n\n if (result.status === 'completed') {\n this.completed = true;\n return files;\n }\n\n if (result.status === 'queued') {\n this.setupJobId = result.setupJobId;\n return files;\n }\n\n // Unknown status\n this.completed = true;\n return files;\n }\n\n async wait(): Promise<void> {\n if (this.completed) {\n this.spinner.stop(chalk.green('Setup successfully completed'));\n return;\n }\n\n if (!this.setupJobId) {\n this.spinner.stop(\n chalk.yellow('Setup status unknown — proceeding without setup')\n );\n return;\n }\n\n // Poll for completion\n const start = Date.now();\n const pollInterval = 5000; // 5 seconds\n\n while (Date.now() - start < this.timeoutMs) {\n const status = await this.gt.checkJobStatus([this.setupJobId]);\n\n if (!status[0]) {\n this.spinner.stop(\n chalk.yellow('Setup status unknown — proceeding without setup')\n );\n return;\n }\n\n if (status[0].status === 'completed') {\n this.spinner.stop(chalk.green('Setup successfully completed'));\n return;\n }\n\n if (status[0].status === 'failed') {\n this.spinner.stop(\n chalk.yellow(\n `Setup failed: ${status[0].error?.message || 'Unknown error'} — proceeding without setup`\n )\n );\n return;\n }\n\n await new Promise((r) => setTimeout(r, pollInterval));\n }\n\n // Timeout\n this.spinner.stop(\n chalk.yellow('Setup timed out — proceeding without setup')\n );\n }\n}\n"],"mappings":";;;;AAOA,IAAa,YAAb,cAA+B,aAA+C;CAC5E,UAAkB,OAAO,cAAc,OAAO;CAC9C,aAAoC;CACpC,QAAwC;CACxC,YAAoB;CAEpB,YACE,IACA,UACA,WACA;AACA,SAAO;AAJC,OAAA,KAAA;AACA,OAAA,WAAA;AACA,OAAA,YAAA;;CAKV,MAAM,IACJ,OACA,QAAiB,OACS;AAC1B,OAAK,QAAQ;AACb,OAAK,QAAQ,MAAM,wBAAwB;AAE3C,MAAI,MAAM,WAAW,GAAG;AACtB,QAAK,YAAY;AACjB,UAAO,EAAE;;EAGX,MAAM,SAAS,MAAM,KAAK,GAAG,aAAa,OAAO;GAC/C,SAAS,KAAK,SAAS;GACvB;GACD,CAAC;AAEF,MAAI,OAAO,WAAW,aAAa;AACjC,QAAK,YAAY;AACjB,UAAO;;AAGT,MAAI,OAAO,WAAW,UAAU;AAC9B,QAAK,aAAa,OAAO;AACzB,UAAO;;AAIT,OAAK,YAAY;AACjB,SAAO;;CAGT,MAAM,OAAsB;AAC1B,MAAI,KAAK,WAAW;AAClB,QAAK,QAAQ,KAAK,MAAM,MAAM,+BAA+B,CAAC;AAC9D;;AAGF,MAAI,CAAC,KAAK,YAAY;AACpB,QAAK,QAAQ,KACX,MAAM,OAAO,kDAAkD,CAChE;AACD;;EAIF,MAAM,QAAQ,KAAK,KAAK;EACxB,MAAM,eAAe;AAErB,SAAO,KAAK,KAAK,GAAG,QAAQ,KAAK,WAAW;GAC1C,MAAM,SAAS,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,WAAW,CAAC;AAE9D,OAAI,CAAC,OAAO,IAAI;AACd,SAAK,QAAQ,KACX,MAAM,OAAO,kDAAkD,CAChE;AACD;;AAGF,OAAI,OAAO,GAAG,WAAW,aAAa;AACpC,SAAK,QAAQ,KAAK,MAAM,MAAM,+BAA+B,CAAC;AAC9D;;AAGF,OAAI,OAAO,GAAG,WAAW,UAAU;AACjC,SAAK,QAAQ,KACX,MAAM,OACJ,iBAAiB,OAAO,GAAG,OAAO,WAAW,gBAAgB,6BAC9D,CACF;AACD;;AAGF,SAAM,IAAI,SAAS,MAAM,WAAW,GAAG,aAAa,CAAC;;AAIvD,OAAK,QAAQ,KACX,MAAM,OAAO,6CAA6C,CAC3D"}
@@ -1,44 +1,39 @@
1
- import { WorkflowStep } from './WorkflowStep.js';
2
- import { logger } from '../../console/logger.js';
3
- import chalk from 'chalk';
4
- export class TagStep extends WorkflowStep {
5
- gt;
6
- settings;
7
- userProvided;
8
- spinner = logger.createSpinner('dots');
9
- result = null;
10
- constructor(gt, settings, userProvided) {
11
- super();
12
- this.gt = gt;
13
- this.settings = settings;
14
- this.userProvided = userProvided;
15
- }
16
- async run(files) {
17
- if (this.userProvided) {
18
- this.spinner.start('Creating translation tag...');
19
- }
20
- try {
21
- this.result = await this.gt.createTag({
22
- tagId: this.settings.tag,
23
- files: files.map((f) => ({
24
- fileId: f.fileId,
25
- versionId: f.versionId,
26
- branchId: f.branchId,
27
- })),
28
- message: this.settings.tagMessage,
29
- });
30
- }
31
- catch (error) {
32
- if (this.userProvided) {
33
- this.spinner.stop(chalk.yellow('Failed to create translation tag'));
34
- }
35
- throw error;
36
- }
37
- return this.result;
38
- }
39
- async wait() {
40
- if (this.result && this.userProvided) {
41
- this.spinner.stop(chalk.green(`Tagged as ${chalk.bold(this.result.tag.tagId)}`));
42
- }
43
- }
44
- }
1
+ import { logger } from "../../console/logger.js";
2
+ import { WorkflowStep } from "./WorkflowStep.js";
3
+ import chalk from "chalk";
4
+ //#region src/workflows/steps/TagStep.ts
5
+ var TagStep = class extends WorkflowStep {
6
+ spinner = logger.createSpinner("dots");
7
+ result = null;
8
+ constructor(gt, settings, userProvided) {
9
+ super();
10
+ this.gt = gt;
11
+ this.settings = settings;
12
+ this.userProvided = userProvided;
13
+ }
14
+ async run(files) {
15
+ if (this.userProvided) this.spinner.start("Creating translation tag...");
16
+ try {
17
+ this.result = await this.gt.createTag({
18
+ tagId: this.settings.tag,
19
+ files: files.map((f) => ({
20
+ fileId: f.fileId,
21
+ versionId: f.versionId,
22
+ branchId: f.branchId
23
+ })),
24
+ message: this.settings.tagMessage
25
+ });
26
+ } catch (error) {
27
+ if (this.userProvided) this.spinner.stop(chalk.yellow("Failed to create translation tag"));
28
+ throw error;
29
+ }
30
+ return this.result;
31
+ }
32
+ async wait() {
33
+ if (this.result && this.userProvided) this.spinner.stop(chalk.green(`Tagged as ${chalk.bold(this.result.tag.tagId)}`));
34
+ }
35
+ };
36
+ //#endregion
37
+ export { TagStep };
38
+
39
+ //# sourceMappingURL=TagStep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TagStep.js","names":[],"sources":["../../../src/workflows/steps/TagStep.ts"],"sourcesContent":["import type { CreateTagResult } from 'generaltranslation/types';\nimport { WorkflowStep } from './WorkflowStep.js';\nimport { logger } from '../../console/logger.js';\nimport { GT } from 'generaltranslation';\nimport { Settings } from '../../types/index.js';\nimport type { FileReference } from 'generaltranslation/types';\nimport chalk from 'chalk';\n\nexport class TagStep extends WorkflowStep<FileReference[], CreateTagResult> {\n private spinner = logger.createSpinner('dots');\n private result: CreateTagResult | null = null;\n\n constructor(\n private gt: GT,\n private settings: Settings,\n private userProvided: boolean\n ) {\n super();\n }\n\n async run(files: FileReference[]): Promise<CreateTagResult> {\n if (this.userProvided) {\n this.spinner.start('Creating translation tag...');\n }\n\n try {\n this.result = await this.gt.createTag({\n tagId: this.settings.tag!,\n files: files.map((f) => ({\n fileId: f.fileId,\n versionId: f.versionId,\n branchId: f.branchId,\n })),\n message: this.settings.tagMessage,\n });\n } catch (error) {\n if (this.userProvided) {\n this.spinner.stop(chalk.yellow('Failed to create translation tag'));\n }\n throw error;\n }\n\n return this.result;\n }\n\n async wait(): Promise<void> {\n if (this.result && this.userProvided) {\n this.spinner.stop(\n chalk.green(`Tagged as ${chalk.bold(this.result.tag.tagId)}`)\n );\n }\n }\n}\n"],"mappings":";;;;AAQA,IAAa,UAAb,cAA6B,aAA+C;CAC1E,UAAkB,OAAO,cAAc,OAAO;CAC9C,SAAyC;CAEzC,YACE,IACA,UACA,cACA;AACA,SAAO;AAJC,OAAA,KAAA;AACA,OAAA,WAAA;AACA,OAAA,eAAA;;CAKV,MAAM,IAAI,OAAkD;AAC1D,MAAI,KAAK,aACP,MAAK,QAAQ,MAAM,8BAA8B;AAGnD,MAAI;AACF,QAAK,SAAS,MAAM,KAAK,GAAG,UAAU;IACpC,OAAO,KAAK,SAAS;IACrB,OAAO,MAAM,KAAK,OAAO;KACvB,QAAQ,EAAE;KACV,WAAW,EAAE;KACb,UAAU,EAAE;KACb,EAAE;IACH,SAAS,KAAK,SAAS;IACxB,CAAC;WACK,OAAO;AACd,OAAI,KAAK,aACP,MAAK,QAAQ,KAAK,MAAM,OAAO,mCAAmC,CAAC;AAErE,SAAM;;AAGR,SAAO,KAAK;;CAGd,MAAM,OAAsB;AAC1B,MAAI,KAAK,UAAU,KAAK,aACtB,MAAK,QAAQ,KACX,MAAM,MAAM,aAAa,MAAM,KAAK,KAAK,OAAO,IAAI,MAAM,GAAG,CAC9D"}
@@ -1,140 +1,108 @@
1
- import { WorkflowStep } from './WorkflowStep.js';
2
- import { logger } from '../../console/logger.js';
3
- import { recordWarning } from '../../state/translateWarnings.js';
4
- import chalk from 'chalk';
5
- export class UploadSourcesStep extends WorkflowStep {
6
- gt;
7
- settings;
8
- spinner = logger.createSpinner('dots');
9
- result = null;
10
- constructor(gt, settings) {
11
- super();
12
- this.gt = gt;
13
- this.settings = settings;
14
- }
15
- /**
16
- * Detects file moves by comparing local files against orphaned files.
17
- * A move is detected when a local file has the same versionId (content hash)
18
- * as an orphaned file but a different fileId (path hash).
19
- */
20
- detectMoves(localFiles, orphanedFiles) {
21
- const moves = [];
22
- // Build a map of versionId -> orphaned file
23
- const orphansByVersionId = new Map();
24
- for (const orphan of orphanedFiles) {
25
- orphansByVersionId.set(orphan.versionId, orphan);
26
- }
27
- // Check each local file against orphaned files
28
- for (const local of localFiles) {
29
- const orphan = orphansByVersionId.get(local.versionId);
30
- if (orphan && orphan.fileId !== local.fileId) {
31
- // Same content, different path = move detected
32
- moves.push({
33
- oldFileId: orphan.fileId,
34
- newFileId: local.fileId,
35
- newFileName: local.fileName,
36
- });
37
- // Remove from map to avoid matching same orphan twice
38
- orphansByVersionId.delete(local.versionId);
39
- }
40
- }
41
- return moves;
42
- }
43
- async run({ files, branchData, }) {
44
- if (files.length === 0) {
45
- logger.info('No files to upload found... skipping upload step');
46
- return [];
47
- }
48
- const currentBranchId = branchData.currentBranch.id;
49
- this.spinner.start(`Syncing ${files.length} file${files.length !== 1 ? 's' : ''} with General Translation API...`);
50
- // Query file data and orphaned files in parallel
51
- const [fileData, orphanedFilesResult] = await Promise.all([
52
- this.gt.queryFileData({
53
- sourceFiles: files.map((f) => ({
54
- fileId: f.fileId,
55
- versionId: f.versionId,
56
- branchId: f.branchId ?? currentBranchId,
57
- })),
58
- }),
59
- this.gt.getOrphanedFiles(currentBranchId, files.map((f) => f.fileId)),
60
- ]);
61
- // Detect file moves
62
- const moves = this.detectMoves(files, orphanedFilesResult.orphanedFiles);
63
- // Track successfully moved files
64
- let successfullyMovedFileIds = new Set();
65
- // Process moves if any were detected
66
- if (moves.length > 0) {
67
- this.spinner.message(`Detected ${moves.length} moved file${moves.length !== 1 ? 's' : ''}, preserving translations...`);
68
- const moveResult = await this.gt.processFileMoves(moves, {
69
- branchId: currentBranchId,
70
- });
71
- // Only track files where the move actually succeeded
72
- successfullyMovedFileIds = new Set(moveResult.results.filter((r) => r.success).map((r) => r.newFileId));
73
- const failed = moveResult.summary.failed;
74
- if (failed > 0) {
75
- logger.warn(`Failed to migrate ${failed} moved file${failed !== 1 ? 's' : ''}`);
76
- for (const r of moveResult.results) {
77
- if (!r.success) {
78
- const move = moves.find((m) => m.newFileId === r.newFileId);
79
- recordWarning('failed_move', move?.newFileName ?? r.newFileId, r.error ?? 'Unknown error');
80
- }
81
- }
82
- }
83
- }
84
- // Build a map of branch:fileId:versionId to fileData
85
- const fileDataMap = new Map();
86
- fileData.sourceFiles?.forEach((f) => {
87
- fileDataMap.set(`${f.branchId}:${f.fileId}:${f.versionId}`, f);
88
- });
89
- // Build a list of files that need to be uploaded
90
- const filesToUpload = [];
91
- const filesToSkipUpload = [];
92
- files.forEach((f) => {
93
- const key = `${f.branchId ?? currentBranchId}:${f.fileId}:${f.versionId}`;
94
- if (fileDataMap.has(key) || successfullyMovedFileIds.has(f.fileId)) {
95
- filesToSkipUpload.push(f);
96
- }
97
- else {
98
- filesToUpload.push(f);
99
- }
100
- });
101
- const response = await this.gt.uploadSourceFiles(filesToUpload.map((f) => ({
102
- source: {
103
- ...f,
104
- branchId: f.branchId ?? currentBranchId,
105
- locale: this.settings.defaultLocale,
106
- incomingBranchId: branchData.incomingBranch?.id,
107
- checkedOutBranchId: branchData.checkedOutBranch?.id,
108
- },
109
- })), {
110
- sourceLocale: this.settings.defaultLocale,
111
- modelProvider: this.settings.modelProvider,
112
- });
113
- // The API may not echo transformFormat, so preserve it from local inputs.
114
- const localFileMap = new Map(files.map((f) => [`${f.fileId}:${f.versionId}`, f]));
115
- this.result = response.uploadedFiles.map((uploadedFile) => {
116
- const localFile = localFileMap.get(`${uploadedFile.fileId}:${uploadedFile.versionId}`);
117
- return {
118
- ...uploadedFile,
119
- transformFormat: localFile?.transformFormat ?? uploadedFile.transformFormat,
120
- };
121
- });
122
- // Merge files that were already uploaded into the result
123
- this.result.push(...filesToSkipUpload.map((f) => ({
124
- fileId: f.fileId,
125
- versionId: f.versionId,
126
- branchId: f.branchId ?? currentBranchId,
127
- fileName: f.fileName,
128
- fileFormat: f.fileFormat,
129
- transformFormat: f.transformFormat,
130
- dataFormat: f.dataFormat,
131
- locale: f.locale,
132
- })));
133
- const moveMsg = moves.length > 0 ? ` (${moves.length} moved)` : '';
134
- this.spinner.stop(chalk.green(`Files uploaded successfully${moveMsg}`));
135
- return this.result;
136
- }
137
- async wait() {
138
- return;
139
- }
140
- }
1
+ import { logger } from "../../console/logger.js";
2
+ import { WorkflowStep } from "./WorkflowStep.js";
3
+ import { recordWarning } from "../../state/translateWarnings.js";
4
+ import chalk from "chalk";
5
+ //#region src/workflows/steps/UploadSourcesStep.ts
6
+ var UploadSourcesStep = class extends WorkflowStep {
7
+ spinner = logger.createSpinner("dots");
8
+ result = null;
9
+ constructor(gt, settings) {
10
+ super();
11
+ this.gt = gt;
12
+ this.settings = settings;
13
+ }
14
+ /**
15
+ * Detects file moves by comparing local files against orphaned files.
16
+ * A move is detected when a local file has the same versionId (content hash)
17
+ * as an orphaned file but a different fileId (path hash).
18
+ */
19
+ detectMoves(localFiles, orphanedFiles) {
20
+ const moves = [];
21
+ const orphansByVersionId = /* @__PURE__ */ new Map();
22
+ for (const orphan of orphanedFiles) orphansByVersionId.set(orphan.versionId, orphan);
23
+ for (const local of localFiles) {
24
+ const orphan = orphansByVersionId.get(local.versionId);
25
+ if (orphan && orphan.fileId !== local.fileId) {
26
+ moves.push({
27
+ oldFileId: orphan.fileId,
28
+ newFileId: local.fileId,
29
+ newFileName: local.fileName
30
+ });
31
+ orphansByVersionId.delete(local.versionId);
32
+ }
33
+ }
34
+ return moves;
35
+ }
36
+ async run({ files, branchData }) {
37
+ if (files.length === 0) {
38
+ logger.info("No files to upload found... skipping upload step");
39
+ return [];
40
+ }
41
+ const currentBranchId = branchData.currentBranch.id;
42
+ this.spinner.start(`Syncing ${files.length} file${files.length !== 1 ? "s" : ""} with General Translation API...`);
43
+ const [fileData, orphanedFilesResult] = await Promise.all([this.gt.queryFileData({ sourceFiles: files.map((f) => ({
44
+ fileId: f.fileId,
45
+ versionId: f.versionId,
46
+ branchId: f.branchId ?? currentBranchId
47
+ })) }), this.gt.getOrphanedFiles(currentBranchId, files.map((f) => f.fileId))]);
48
+ const moves = this.detectMoves(files, orphanedFilesResult.orphanedFiles);
49
+ let successfullyMovedFileIds = /* @__PURE__ */ new Set();
50
+ if (moves.length > 0) {
51
+ this.spinner.message(`Detected ${moves.length} moved file${moves.length !== 1 ? "s" : ""}, preserving translations...`);
52
+ const moveResult = await this.gt.processFileMoves(moves, { branchId: currentBranchId });
53
+ successfullyMovedFileIds = new Set(moveResult.results.filter((r) => r.success).map((r) => r.newFileId));
54
+ const failed = moveResult.summary.failed;
55
+ if (failed > 0) {
56
+ logger.warn(`Failed to migrate ${failed} moved file${failed !== 1 ? "s" : ""}`);
57
+ for (const r of moveResult.results) if (!r.success) recordWarning("failed_move", moves.find((m) => m.newFileId === r.newFileId)?.newFileName ?? r.newFileId, r.error ?? "Unknown error");
58
+ }
59
+ }
60
+ const fileDataMap = /* @__PURE__ */ new Map();
61
+ fileData.sourceFiles?.forEach((f) => {
62
+ fileDataMap.set(`${f.branchId}:${f.fileId}:${f.versionId}`, f);
63
+ });
64
+ const filesToUpload = [];
65
+ const filesToSkipUpload = [];
66
+ files.forEach((f) => {
67
+ const key = `${f.branchId ?? currentBranchId}:${f.fileId}:${f.versionId}`;
68
+ if (fileDataMap.has(key) || successfullyMovedFileIds.has(f.fileId)) filesToSkipUpload.push(f);
69
+ else filesToUpload.push(f);
70
+ });
71
+ const response = await this.gt.uploadSourceFiles(filesToUpload.map((f) => ({ source: {
72
+ ...f,
73
+ branchId: f.branchId ?? currentBranchId,
74
+ locale: this.settings.defaultLocale,
75
+ incomingBranchId: branchData.incomingBranch?.id,
76
+ checkedOutBranchId: branchData.checkedOutBranch?.id
77
+ } })), {
78
+ sourceLocale: this.settings.defaultLocale,
79
+ modelProvider: this.settings.modelProvider
80
+ });
81
+ const localFileMap = new Map(files.map((f) => [`${f.fileId}:${f.versionId}`, f]));
82
+ this.result = response.uploadedFiles.map((uploadedFile) => {
83
+ const localFile = localFileMap.get(`${uploadedFile.fileId}:${uploadedFile.versionId}`);
84
+ return {
85
+ ...uploadedFile,
86
+ transformFormat: localFile?.transformFormat ?? uploadedFile.transformFormat
87
+ };
88
+ });
89
+ this.result.push(...filesToSkipUpload.map((f) => ({
90
+ fileId: f.fileId,
91
+ versionId: f.versionId,
92
+ branchId: f.branchId ?? currentBranchId,
93
+ fileName: f.fileName,
94
+ fileFormat: f.fileFormat,
95
+ transformFormat: f.transformFormat,
96
+ dataFormat: f.dataFormat,
97
+ locale: f.locale
98
+ })));
99
+ const moveMsg = moves.length > 0 ? ` (${moves.length} moved)` : "";
100
+ this.spinner.stop(chalk.green(`Files uploaded successfully${moveMsg}`));
101
+ return this.result;
102
+ }
103
+ async wait() {}
104
+ };
105
+ //#endregion
106
+ export { UploadSourcesStep };
107
+
108
+ //# sourceMappingURL=UploadSourcesStep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UploadSourcesStep.js","names":[],"sources":["../../../src/workflows/steps/UploadSourcesStep.ts"],"sourcesContent":["import type { FileToUpload } from 'generaltranslation/types';\nimport { WorkflowStep } from './WorkflowStep.js';\nimport { logger } from '../../console/logger.js';\nimport { recordWarning } from '../../state/translateWarnings.js';\nimport type { GT } from 'generaltranslation';\nimport type { Settings } from '../../types/index.js';\nimport chalk from 'chalk';\nimport { BranchData } from '../../types/branch.js';\nimport type {\n FileDataResult,\n FileReference,\n OrphanedFile,\n} from 'generaltranslation/types';\n\ntype MoveMapping = {\n oldFileId: string;\n newFileId: string;\n newFileName: string;\n};\n\ntype UploadSourcesClient = Pick<\n GT,\n | 'queryFileData'\n | 'getOrphanedFiles'\n | 'processFileMoves'\n | 'uploadSourceFiles'\n>;\ntype UploadSourcesSettings = Pick<Settings, 'defaultLocale' | 'modelProvider'>;\n\nexport class UploadSourcesStep extends WorkflowStep<\n { files: FileToUpload[]; branchData: BranchData },\n FileReference[]\n> {\n private spinner = logger.createSpinner('dots');\n private result: FileReference[] | null = null;\n\n constructor(\n private gt: UploadSourcesClient,\n private settings: UploadSourcesSettings\n ) {\n super();\n }\n\n /**\n * Detects file moves by comparing local files against orphaned files.\n * A move is detected when a local file has the same versionId (content hash)\n * as an orphaned file but a different fileId (path hash).\n */\n private detectMoves(\n localFiles: FileToUpload[],\n orphanedFiles: OrphanedFile[]\n ): MoveMapping[] {\n const moves: MoveMapping[] = [];\n\n // Build a map of versionId -> orphaned file\n const orphansByVersionId = new Map<string, OrphanedFile>();\n for (const orphan of orphanedFiles) {\n orphansByVersionId.set(orphan.versionId, orphan);\n }\n\n // Check each local file against orphaned files\n for (const local of localFiles) {\n const orphan = orphansByVersionId.get(local.versionId);\n if (orphan && orphan.fileId !== local.fileId) {\n // Same content, different path = move detected\n moves.push({\n oldFileId: orphan.fileId,\n newFileId: local.fileId,\n newFileName: local.fileName,\n });\n // Remove from map to avoid matching same orphan twice\n orphansByVersionId.delete(local.versionId);\n }\n }\n\n return moves;\n }\n\n async run({\n files,\n branchData,\n }: {\n files: FileToUpload[];\n branchData: BranchData;\n }): Promise<FileReference[]> {\n if (files.length === 0) {\n logger.info('No files to upload found... skipping upload step');\n return [];\n }\n\n const currentBranchId = branchData.currentBranch.id;\n\n this.spinner.start(\n `Syncing ${files.length} file${files.length !== 1 ? 's' : ''} with General Translation API...`\n );\n\n // Query file data and orphaned files in parallel\n const [fileData, orphanedFilesResult] = await Promise.all([\n this.gt.queryFileData({\n sourceFiles: files.map((f) => ({\n fileId: f.fileId,\n versionId: f.versionId,\n branchId: f.branchId ?? currentBranchId,\n })),\n }),\n this.gt.getOrphanedFiles(\n currentBranchId,\n files.map((f) => f.fileId)\n ),\n ]);\n\n // Detect file moves\n const moves = this.detectMoves(files, orphanedFilesResult.orphanedFiles);\n\n // Track successfully moved files\n let successfullyMovedFileIds = new Set<string>();\n\n // Process moves if any were detected\n if (moves.length > 0) {\n this.spinner.message(\n `Detected ${moves.length} moved file${moves.length !== 1 ? 's' : ''}, preserving translations...`\n );\n\n const moveResult = await this.gt.processFileMoves(moves, {\n branchId: currentBranchId,\n });\n\n // Only track files where the move actually succeeded\n successfullyMovedFileIds = new Set(\n moveResult.results.filter((r) => r.success).map((r) => r.newFileId)\n );\n\n const failed = moveResult.summary.failed;\n\n if (failed > 0) {\n logger.warn(\n `Failed to migrate ${failed} moved file${failed !== 1 ? 's' : ''}`\n );\n for (const r of moveResult.results) {\n if (!r.success) {\n const move = moves.find((m) => m.newFileId === r.newFileId);\n recordWarning(\n 'failed_move',\n move?.newFileName ?? r.newFileId,\n r.error ?? 'Unknown error'\n );\n }\n }\n }\n }\n\n // Build a map of branch:fileId:versionId to fileData\n const fileDataMap = new Map<\n string,\n NonNullable<FileDataResult['sourceFiles']>[number]\n >();\n fileData.sourceFiles?.forEach((f) => {\n fileDataMap.set(`${f.branchId}:${f.fileId}:${f.versionId}`, f);\n });\n\n // Build a list of files that need to be uploaded\n const filesToUpload: FileToUpload[] = [];\n const filesToSkipUpload: FileToUpload[] = [];\n files.forEach((f) => {\n const key = `${f.branchId ?? currentBranchId}:${f.fileId}:${f.versionId}`;\n if (fileDataMap.has(key) || successfullyMovedFileIds.has(f.fileId)) {\n filesToSkipUpload.push(f);\n } else {\n filesToUpload.push(f);\n }\n });\n\n const response = await this.gt.uploadSourceFiles(\n filesToUpload.map((f) => ({\n source: {\n ...f,\n branchId: f.branchId ?? currentBranchId,\n locale: this.settings.defaultLocale,\n incomingBranchId: branchData.incomingBranch?.id,\n checkedOutBranchId: branchData.checkedOutBranch?.id,\n },\n })),\n {\n sourceLocale: this.settings.defaultLocale,\n modelProvider: this.settings.modelProvider,\n }\n );\n\n // The API may not echo transformFormat, so preserve it from local inputs.\n const localFileMap = new Map(\n files.map((f) => [`${f.fileId}:${f.versionId}`, f])\n );\n\n this.result = response.uploadedFiles.map((uploadedFile) => {\n const localFile = localFileMap.get(\n `${uploadedFile.fileId}:${uploadedFile.versionId}`\n );\n return {\n ...uploadedFile,\n transformFormat:\n localFile?.transformFormat ?? uploadedFile.transformFormat,\n };\n });\n\n // Merge files that were already uploaded into the result\n this.result.push(\n ...filesToSkipUpload.map((f) => ({\n fileId: f.fileId,\n versionId: f.versionId,\n branchId: f.branchId ?? currentBranchId,\n fileName: f.fileName,\n fileFormat: f.fileFormat,\n transformFormat: f.transformFormat,\n dataFormat: f.dataFormat,\n locale: f.locale,\n }))\n );\n\n const moveMsg = moves.length > 0 ? ` (${moves.length} moved)` : '';\n this.spinner.stop(chalk.green(`Files uploaded successfully${moveMsg}`));\n\n return this.result;\n }\n\n async wait(): Promise<void> {\n return;\n }\n}\n"],"mappings":"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"}