gt 0.10.0 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (531) hide show
  1. package/CHANGELOG.md +1275 -0
  2. package/LICENSE.md +105 -0
  3. package/README.md +26 -198
  4. package/dist/api/collectUserEditDiffs.d.ts +9 -0
  5. package/dist/api/collectUserEditDiffs.js +159 -0
  6. package/dist/api/downloadFileBatch.d.ts +23 -0
  7. package/dist/api/downloadFileBatch.js +190 -0
  8. package/dist/api/saveLocalEdits.d.ts +6 -0
  9. package/dist/api/saveLocalEdits.js +38 -0
  10. package/dist/bin/bin-entry.d.ts +1 -0
  11. package/dist/bin/bin-entry.js +9 -0
  12. package/dist/bin/bin-main.d.ts +2 -0
  13. package/dist/bin/bin-main.js +67 -0
  14. package/dist/cli/base.d.ts +59 -0
  15. package/dist/cli/base.js +529 -0
  16. package/dist/cli/commands/download.d.ts +8 -0
  17. package/dist/cli/commands/download.js +51 -0
  18. package/dist/cli/commands/enqueue.d.ts +9 -0
  19. package/dist/cli/commands/enqueue.js +27 -0
  20. package/dist/cli/commands/setupProject.d.ts +7 -0
  21. package/dist/cli/commands/setupProject.js +37 -0
  22. package/dist/cli/commands/stage.d.ts +9 -0
  23. package/dist/cli/commands/stage.js +59 -0
  24. package/dist/cli/commands/translate.d.ts +7 -0
  25. package/dist/cli/commands/translate.js +70 -0
  26. package/dist/cli/commands/upload.d.ts +13 -0
  27. package/dist/cli/commands/upload.js +142 -0
  28. package/dist/cli/commands/utils/validation.d.ts +13 -0
  29. package/dist/cli/commands/utils/validation.js +38 -0
  30. package/dist/cli/flags.d.ts +15 -0
  31. package/dist/cli/flags.js +70 -0
  32. package/dist/cli/inline.d.ts +17 -0
  33. package/dist/cli/inline.js +135 -0
  34. package/dist/cli/next.d.ts +10 -0
  35. package/dist/cli/next.js +12 -0
  36. package/dist/cli/node.d.ts +10 -0
  37. package/dist/cli/node.js +9 -0
  38. package/dist/cli/react.d.ts +12 -0
  39. package/dist/cli/react.js +72 -0
  40. package/dist/config/generateSettings.d.ts +9 -0
  41. package/dist/config/generateSettings.js +214 -0
  42. package/dist/config/optionPresets.d.ts +3 -0
  43. package/dist/config/optionPresets.js +65 -0
  44. package/dist/config/resolveConfig.d.ts +4 -0
  45. package/dist/config/resolveConfig.js +33 -0
  46. package/dist/config/utils.d.ts +2 -0
  47. package/dist/config/utils.js +4 -0
  48. package/dist/config/validateSettings.d.ts +3 -0
  49. package/dist/config/validateSettings.js +32 -0
  50. package/dist/console/colors.d.ts +6 -0
  51. package/dist/console/colors.js +19 -0
  52. package/dist/console/displayTranslateSummary.d.ts +1 -0
  53. package/dist/console/displayTranslateSummary.js +42 -0
  54. package/dist/console/formatting.d.ts +1 -0
  55. package/dist/console/formatting.js +7 -0
  56. package/dist/console/index.d.ts +34 -0
  57. package/dist/console/index.js +46 -0
  58. package/dist/console/logger.d.ts +35 -0
  59. package/dist/console/logger.js +250 -0
  60. package/dist/console/logging.d.ts +52 -0
  61. package/dist/console/logging.js +175 -0
  62. package/dist/formats/files/aggregateFiles.d.ts +4 -0
  63. package/dist/formats/files/aggregateFiles.js +156 -0
  64. package/dist/formats/files/collectFiles.d.ts +6 -0
  65. package/dist/formats/files/collectFiles.js +49 -0
  66. package/dist/formats/files/convertToFileTranslationData.d.ts +15 -0
  67. package/dist/formats/files/convertToFileTranslationData.js +21 -0
  68. package/dist/formats/files/fileMapping.d.ts +11 -0
  69. package/dist/formats/files/fileMapping.js +115 -0
  70. package/dist/formats/files/preprocess/mdx.d.ts +6 -0
  71. package/dist/formats/files/preprocess/mdx.js +14 -0
  72. package/dist/formats/files/preprocess/mintlify.d.ts +5 -0
  73. package/dist/formats/files/preprocess/mintlify.js +15 -0
  74. package/dist/formats/files/preprocessContent.d.ts +8 -0
  75. package/dist/formats/files/preprocessContent.js +23 -0
  76. package/dist/formats/files/save.d.ts +5 -0
  77. package/dist/formats/files/save.js +17 -0
  78. package/dist/formats/files/supportedFiles.d.ts +11 -0
  79. package/dist/formats/files/supportedFiles.js +20 -0
  80. package/dist/formats/json/extractJson.d.ts +15 -0
  81. package/dist/formats/json/extractJson.js +101 -0
  82. package/dist/formats/json/flattenJson.d.ts +14 -0
  83. package/dist/formats/json/flattenJson.js +64 -0
  84. package/dist/formats/json/mergeJson.d.ts +13 -0
  85. package/dist/formats/json/mergeJson.js +367 -0
  86. package/dist/formats/json/parseJson.d.ts +2 -0
  87. package/dist/formats/json/parseJson.js +109 -0
  88. package/dist/formats/json/utils.d.ts +47 -0
  89. package/dist/formats/json/utils.js +150 -0
  90. package/dist/formats/utils.d.ts +2 -0
  91. package/dist/formats/utils.js +24 -0
  92. package/dist/formats/yaml/mergeYaml.d.ts +5 -0
  93. package/dist/formats/yaml/mergeYaml.js +61 -0
  94. package/dist/formats/yaml/parseYaml.d.ts +5 -0
  95. package/dist/formats/yaml/parseYaml.js +24 -0
  96. package/dist/formats/yaml/utils.d.ts +2 -0
  97. package/dist/formats/yaml/utils.js +23 -0
  98. package/dist/fs/clearLocaleDirs.d.ts +8 -0
  99. package/dist/fs/clearLocaleDirs.js +126 -0
  100. package/dist/fs/config/downloadedVersions.d.ts +21 -0
  101. package/dist/fs/config/downloadedVersions.js +50 -0
  102. package/dist/fs/config/loadConfig.d.ts +1 -0
  103. package/dist/fs/config/loadConfig.js +9 -0
  104. package/dist/fs/config/parseFilesConfig.d.ts +27 -0
  105. package/dist/fs/config/parseFilesConfig.js +150 -0
  106. package/dist/fs/config/setupConfig.d.ts +17 -0
  107. package/dist/fs/config/setupConfig.js +50 -0
  108. package/dist/fs/config/updateConfig.d.ts +21 -0
  109. package/dist/fs/config/updateConfig.js +57 -0
  110. package/dist/fs/config/updateVersions.d.ts +11 -0
  111. package/dist/fs/config/updateVersions.js +30 -0
  112. package/dist/fs/copyFile.d.ts +7 -0
  113. package/dist/fs/copyFile.js +39 -0
  114. package/dist/fs/createLoadTranslationsFile.d.ts +1 -0
  115. package/dist/fs/createLoadTranslationsFile.js +49 -0
  116. package/dist/fs/determineFramework.d.ts +5 -0
  117. package/dist/fs/determineFramework.js +53 -0
  118. package/dist/fs/findFilepath.d.ts +36 -0
  119. package/dist/fs/findFilepath.js +90 -0
  120. package/dist/fs/index.d.ts +1 -0
  121. package/dist/fs/index.js +1 -0
  122. package/dist/fs/loadJSON.d.ts +6 -0
  123. package/dist/fs/loadJSON.js +17 -0
  124. package/dist/fs/matchFiles.d.ts +1 -0
  125. package/dist/fs/matchFiles.js +8 -0
  126. package/dist/fs/saveJSON.d.ts +1 -0
  127. package/dist/fs/saveJSON.js +7 -0
  128. package/dist/fs/utils.d.ts +1 -0
  129. package/dist/fs/utils.js +16 -0
  130. package/dist/functions.d.ts +7 -0
  131. package/dist/functions.js +6 -0
  132. package/dist/generated/version.d.ts +1 -0
  133. package/dist/generated/version.js +2 -0
  134. package/dist/git/branches.d.ts +7 -0
  135. package/dist/git/branches.js +88 -0
  136. package/dist/hooks/postProcess.d.ts +4 -0
  137. package/dist/hooks/postProcess.js +110 -0
  138. package/dist/index.d.ts +4 -0
  139. package/dist/index.js +27 -0
  140. package/dist/locadex/setupFlow.d.ts +2 -0
  141. package/dist/locadex/setupFlow.js +9 -0
  142. package/dist/main.d.ts +2 -0
  143. package/dist/main.js +10 -0
  144. package/dist/next/config/parseNextConfig.d.ts +10 -0
  145. package/dist/next/config/parseNextConfig.js +53 -0
  146. package/dist/next/jsx/utils.d.ts +7 -0
  147. package/dist/next/jsx/utils.js +42 -0
  148. package/dist/next/parse/handleInitGT.d.ts +7 -0
  149. package/dist/next/parse/handleInitGT.js +157 -0
  150. package/dist/next/parse/wrapContent.d.ts +12 -0
  151. package/dist/next/parse/wrapContent.js +164 -0
  152. package/dist/react/config/createESBuildConfig.d.ts +2 -0
  153. package/dist/react/config/createESBuildConfig.js +119 -0
  154. package/dist/react/jsx/evaluateJsx.d.ts +24 -0
  155. package/dist/react/jsx/evaluateJsx.js +123 -0
  156. package/dist/react/jsx/utils/buildImportMap.d.ts +9 -0
  157. package/dist/react/jsx/utils/buildImportMap.js +30 -0
  158. package/dist/react/jsx/utils/constants.d.ts +15 -0
  159. package/dist/react/jsx/utils/constants.js +49 -0
  160. package/dist/react/jsx/utils/getCalleeNameFromExpression.d.ts +9 -0
  161. package/dist/react/jsx/utils/getCalleeNameFromExpression.js +32 -0
  162. package/dist/react/jsx/utils/getPathsAndAliases.d.ts +21 -0
  163. package/dist/react/jsx/utils/getPathsAndAliases.js +91 -0
  164. package/dist/react/jsx/utils/isNumberLiteral.d.ts +7 -0
  165. package/dist/react/jsx/utils/isNumberLiteral.js +13 -0
  166. package/dist/react/jsx/utils/jsxParsing/addGTIdentifierToSyntaxTree.d.ts +9 -0
  167. package/dist/react/jsx/utils/jsxParsing/addGTIdentifierToSyntaxTree.js +138 -0
  168. package/dist/react/jsx/utils/jsxParsing/handleChildrenWhitespace.d.ts +6 -0
  169. package/dist/react/jsx/utils/jsxParsing/handleChildrenWhitespace.js +197 -0
  170. package/dist/react/jsx/utils/jsxParsing/multiplication/findMultiplicationNode.d.ts +13 -0
  171. package/dist/react/jsx/utils/jsxParsing/multiplication/findMultiplicationNode.js +42 -0
  172. package/dist/react/jsx/utils/jsxParsing/multiplication/multiplyJsxTree.d.ts +5 -0
  173. package/dist/react/jsx/utils/jsxParsing/multiplication/multiplyJsxTree.js +69 -0
  174. package/dist/react/jsx/utils/jsxParsing/parseJsx.d.ts +33 -0
  175. package/dist/react/jsx/utils/jsxParsing/parseJsx.js +918 -0
  176. package/dist/react/jsx/utils/jsxParsing/parseTProps.d.ts +8 -0
  177. package/dist/react/jsx/utils/jsxParsing/parseTProps.js +65 -0
  178. package/dist/react/jsx/utils/jsxParsing/removeNullChildrenFields.d.ts +2 -0
  179. package/dist/react/jsx/utils/jsxParsing/removeNullChildrenFields.js +61 -0
  180. package/dist/react/jsx/utils/jsxParsing/types.d.ts +48 -0
  181. package/dist/react/jsx/utils/jsxParsing/types.js +34 -0
  182. package/dist/react/jsx/utils/mapAttributeName.d.ts +11 -0
  183. package/dist/react/jsx/utils/mapAttributeName.js +12 -0
  184. package/dist/react/jsx/utils/parseAst.d.ts +31 -0
  185. package/dist/react/jsx/utils/parseAst.js +278 -0
  186. package/dist/react/jsx/utils/parseDeclareStatic.d.ts +15 -0
  187. package/dist/react/jsx/utils/parseDeclareStatic.js +540 -0
  188. package/dist/react/jsx/utils/parseString.d.ts +25 -0
  189. package/dist/react/jsx/utils/parseString.js +540 -0
  190. package/dist/react/jsx/utils/parseStringFunction.d.ts +30 -0
  191. package/dist/react/jsx/utils/parseStringFunction.js +348 -0
  192. package/dist/react/jsx/utils/resolveImportPath.d.ts +11 -0
  193. package/dist/react/jsx/utils/resolveImportPath.js +111 -0
  194. package/dist/react/jsx/utils/stringParsing/processTranslationCall/extractStringEntryMetadata.d.ts +29 -0
  195. package/dist/react/jsx/utils/stringParsing/processTranslationCall/extractStringEntryMetadata.js +86 -0
  196. package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleInvalidTranslationCall.d.ts +14 -0
  197. package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleInvalidTranslationCall.js +24 -0
  198. package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleLiteralTranslationCall.d.ts +19 -0
  199. package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleLiteralTranslationCall.js +31 -0
  200. package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleStaticTranslationCall.d.ts +22 -0
  201. package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleStaticTranslationCall.js +51 -0
  202. package/dist/react/jsx/utils/stringParsing/processTranslationCall/index.d.ts +18 -0
  203. package/dist/react/jsx/utils/stringParsing/processTranslationCall/index.js +39 -0
  204. package/dist/react/jsx/utils/stringParsing/processTranslationCall/routeTranslationCall.d.ts +24 -0
  205. package/dist/react/jsx/utils/stringParsing/processTranslationCall/routeTranslationCall.js +68 -0
  206. package/dist/react/jsx/utils/stringParsing/types.d.ts +41 -0
  207. package/dist/react/jsx/utils/stringParsing/types.js +1 -0
  208. package/dist/react/jsx/utils/types.d.ts +14 -0
  209. package/dist/react/jsx/utils/types.js +1 -0
  210. package/dist/react/jsx/utils/validateStringFunction.d.ts +7 -0
  211. package/dist/react/jsx/utils/validateStringFunction.js +31 -0
  212. package/dist/react/jsx/wrapJsx.d.ts +51 -0
  213. package/dist/react/jsx/wrapJsx.js +387 -0
  214. package/dist/react/parse/addVitePlugin/index.d.ts +22 -0
  215. package/dist/react/parse/addVitePlugin/index.js +41 -0
  216. package/dist/react/parse/addVitePlugin/installCompiler.d.ts +8 -0
  217. package/dist/react/parse/addVitePlugin/installCompiler.js +22 -0
  218. package/dist/react/parse/addVitePlugin/updateViteConfig.d.ts +19 -0
  219. package/dist/react/parse/addVitePlugin/updateViteConfig.js +120 -0
  220. package/dist/react/parse/addVitePlugin/utils/addCompilerImport.d.ts +9 -0
  221. package/dist/react/parse/addVitePlugin/utils/addCompilerImport.js +34 -0
  222. package/dist/react/parse/addVitePlugin/utils/addPluginInvocation.d.ts +11 -0
  223. package/dist/react/parse/addVitePlugin/utils/addPluginInvocation.js +48 -0
  224. package/dist/react/parse/addVitePlugin/utils/checkCompilerImport.d.ts +15 -0
  225. package/dist/react/parse/addVitePlugin/utils/checkCompilerImport.js +113 -0
  226. package/dist/react/parse/addVitePlugin/utils/checkPluginInvocation.d.ts +12 -0
  227. package/dist/react/parse/addVitePlugin/utils/checkPluginInvocation.js +32 -0
  228. package/dist/react/parse/createDictionaryUpdates.d.ts +3 -0
  229. package/dist/react/parse/createDictionaryUpdates.js +187 -0
  230. package/dist/react/parse/createInlineUpdates.d.ts +13 -0
  231. package/dist/react/parse/createInlineUpdates.js +161 -0
  232. package/dist/react/parse/wrapContent.d.ts +12 -0
  233. package/dist/react/parse/wrapContent.js +162 -0
  234. package/dist/react/utils/flattenDictionary.d.ts +20 -0
  235. package/dist/react/utils/flattenDictionary.js +75 -0
  236. package/dist/react/utils/getEntryAndMetadata.d.ts +5 -0
  237. package/dist/react/utils/getEntryAndMetadata.js +11 -0
  238. package/dist/react/utils/getVariableName.d.ts +25 -0
  239. package/dist/react/utils/getVariableName.js +37 -0
  240. package/dist/setup/agentInstructions.d.ts +24 -0
  241. package/dist/setup/agentInstructions.js +138 -0
  242. package/dist/setup/detectFramework.d.ts +31 -0
  243. package/dist/setup/detectFramework.js +106 -0
  244. package/dist/setup/frameworkUtils.d.ts +3 -0
  245. package/dist/setup/frameworkUtils.js +30 -0
  246. package/dist/setup/instructions/base.md +29 -0
  247. package/dist/setup/instructions/gt-next.md +107 -0
  248. package/dist/setup/instructions/gt-react.md +98 -0
  249. package/dist/setup/userInput.d.ts +4 -0
  250. package/dist/setup/userInput.js +32 -0
  251. package/dist/setup/wizard.d.ts +3 -0
  252. package/dist/setup/wizard.js +147 -0
  253. package/dist/state/recentDownloads.d.ts +12 -0
  254. package/dist/state/recentDownloads.js +18 -0
  255. package/dist/state/translateWarnings.d.ts +10 -0
  256. package/dist/state/translateWarnings.js +13 -0
  257. package/dist/translation/parse.d.ts +17 -0
  258. package/dist/translation/parse.js +77 -0
  259. package/dist/translation/stage.d.ts +3 -0
  260. package/dist/translation/stage.js +44 -0
  261. package/dist/translation/validate.d.ts +14 -0
  262. package/dist/translation/validate.js +100 -0
  263. package/dist/types/branch.d.ts +14 -0
  264. package/dist/types/branch.js +1 -0
  265. package/dist/types/data/json.d.ts +6 -0
  266. package/dist/types/data/json.js +1 -0
  267. package/dist/types/data.d.ts +37 -0
  268. package/dist/types/data.js +1 -0
  269. package/dist/types/files.d.ts +8 -0
  270. package/dist/types/files.js +1 -0
  271. package/dist/types/index.d.ts +243 -0
  272. package/dist/types/index.js +1 -0
  273. package/dist/types/libraries.d.ts +31 -0
  274. package/dist/types/libraries.js +72 -0
  275. package/dist/types/parsing.d.ts +3 -0
  276. package/dist/types/parsing.js +1 -0
  277. package/dist/utils/addExplicitAnchorIds.d.ts +24 -0
  278. package/dist/utils/addExplicitAnchorIds.js +416 -0
  279. package/dist/utils/constants.d.ts +5 -0
  280. package/dist/utils/constants.js +6 -0
  281. package/dist/utils/credentials.d.ts +12 -0
  282. package/dist/utils/credentials.js +120 -0
  283. package/dist/utils/flattenJsonFiles.d.ts +2 -0
  284. package/dist/utils/flattenJsonFiles.js +36 -0
  285. package/dist/utils/gitDiff.d.ts +8 -0
  286. package/dist/utils/gitDiff.js +34 -0
  287. package/dist/utils/gt.d.ts +2 -0
  288. package/dist/utils/gt.js +2 -0
  289. package/dist/utils/hash.d.ts +6 -0
  290. package/dist/utils/hash.js +11 -0
  291. package/dist/utils/headers.d.ts +1 -0
  292. package/dist/utils/headers.js +14 -0
  293. package/dist/utils/installPackage.d.ts +3 -0
  294. package/dist/utils/installPackage.js +77 -0
  295. package/dist/utils/localizeRelativeAssets.d.ts +8 -0
  296. package/dist/utils/localizeRelativeAssets.js +166 -0
  297. package/dist/utils/localizeStaticImports.d.ts +15 -0
  298. package/dist/utils/localizeStaticImports.js +397 -0
  299. package/dist/utils/localizeStaticUrls.d.ts +19 -0
  300. package/dist/utils/localizeStaticUrls.js +450 -0
  301. package/dist/utils/mintlifyTitleFallback.d.ts +6 -0
  302. package/dist/utils/mintlifyTitleFallback.js +80 -0
  303. package/dist/utils/packageInfo.d.ts +3 -0
  304. package/dist/utils/packageInfo.js +17 -0
  305. package/dist/utils/packageJson.d.ts +6 -0
  306. package/dist/utils/packageJson.js +68 -0
  307. package/dist/utils/packageManager.d.ts +28 -0
  308. package/dist/utils/packageManager.js +269 -0
  309. package/dist/utils/parse/needsCJS.d.ts +20 -0
  310. package/dist/utils/parse/needsCJS.js +72 -0
  311. package/dist/utils/persistPostprocessHashes.d.ts +12 -0
  312. package/dist/utils/persistPostprocessHashes.js +39 -0
  313. package/dist/utils/processAnchorIds.d.ts +6 -0
  314. package/dist/utils/processAnchorIds.js +56 -0
  315. package/dist/utils/processOpenApi.d.ts +8 -0
  316. package/dist/utils/processOpenApi.js +651 -0
  317. package/dist/utils/sanitizeFileContent.d.ts +6 -0
  318. package/dist/utils/sanitizeFileContent.js +29 -0
  319. package/dist/utils/sharedStaticAssets.d.ts +9 -0
  320. package/dist/utils/sharedStaticAssets.js +384 -0
  321. package/dist/utils/validateMdx.d.ts +10 -0
  322. package/dist/utils/validateMdx.js +25 -0
  323. package/dist/utils/wrapPlainUrls.d.ts +8 -0
  324. package/dist/utils/wrapPlainUrls.js +72 -0
  325. package/dist/workflows/download.d.ts +32 -0
  326. package/dist/workflows/download.js +131 -0
  327. package/dist/workflows/enqueue.d.ts +17 -0
  328. package/dist/workflows/enqueue.js +59 -0
  329. package/dist/workflows/setupProject.d.ts +13 -0
  330. package/dist/workflows/setupProject.js +48 -0
  331. package/dist/workflows/stage.d.ts +18 -0
  332. package/dist/workflows/stage.js +59 -0
  333. package/dist/workflows/steps/BranchStep.d.ts +13 -0
  334. package/dist/workflows/steps/BranchStep.js +161 -0
  335. package/dist/workflows/steps/DownloadStep.d.ts +19 -0
  336. package/dist/workflows/steps/DownloadStep.js +131 -0
  337. package/dist/workflows/steps/EnqueueStep.d.ts +15 -0
  338. package/dist/workflows/steps/EnqueueStep.js +33 -0
  339. package/dist/workflows/steps/PollJobsStep.d.ts +31 -0
  340. package/dist/workflows/steps/PollJobsStep.js +288 -0
  341. package/dist/workflows/steps/SetupStep.d.ts +16 -0
  342. package/dist/workflows/steps/SetupStep.js +72 -0
  343. package/dist/workflows/steps/UploadSourcesStep.d.ts +27 -0
  344. package/dist/workflows/steps/UploadSourcesStep.js +131 -0
  345. package/dist/workflows/steps/UploadTranslationsStep.d.ts +22 -0
  346. package/dist/workflows/steps/UploadTranslationsStep.js +71 -0
  347. package/dist/workflows/steps/UserEditDiffsStep.d.ts +11 -0
  348. package/dist/workflows/steps/UserEditDiffsStep.js +30 -0
  349. package/dist/workflows/steps/WorkflowStep.d.ts +4 -0
  350. package/dist/workflows/steps/WorkflowStep.js +2 -0
  351. package/dist/workflows/upload.d.ts +15 -0
  352. package/dist/workflows/upload.js +47 -0
  353. package/package.json +149 -112
  354. package/.dont-break +0 -6
  355. package/.jshintrc +0 -76
  356. package/.npmignore +0 -9
  357. package/.travis.yml +0 -21
  358. package/Gruntfile.js +0 -65
  359. package/History.md +0 -90
  360. package/MIT-License.txt +0 -21
  361. package/bin/gt.js +0 -58
  362. package/complexity.json +0 -17
  363. package/doc/RequireJsExample.md +0 -10
  364. package/examples/all.js +0 -72
  365. package/examples/altAsserrionSyntax/tests.js +0 -32
  366. package/examples/amd/bar.js +0 -4
  367. package/examples/amd/foo.js +0 -15
  368. package/examples/amd/fooTests.js +0 -8
  369. package/examples/arrays/test.js +0 -15
  370. package/examples/assert/test-assert-object.js +0 -15
  371. package/examples/assert/test-assert-require.js +0 -17
  372. package/examples/async/asyncAll.js +0 -37
  373. package/examples/async/asyncSetup.js +0 -29
  374. package/examples/async/asyncSetupOnce.js +0 -25
  375. package/examples/async/asyncTeardown.js +0 -27
  376. package/examples/async/stopStart.js +0 -22
  377. package/examples/async/test.js +0 -43
  378. package/examples/async/timeoutTests.js +0 -19
  379. package/examples/basic/code.js +0 -50
  380. package/examples/basic/code2.js +0 -9
  381. package/examples/basic/default.js +0 -26
  382. package/examples/basic/definedUndefined.js +0 -28
  383. package/examples/basic/empty.js +0 -24
  384. package/examples/basic/exceptionTests.js +0 -55
  385. package/examples/basic/fullMessage.js +0 -28
  386. package/examples/basic/functions.js +0 -18
  387. package/examples/basic/incomplete.js +0 -16
  388. package/examples/basic/null.js +0 -17
  389. package/examples/basic/optional.js +0 -45
  390. package/examples/basic/tests.js +0 -147
  391. package/examples/bdd/spec.js +0 -67
  392. package/examples/browser/code_coverage_report.json +0 -1
  393. package/examples/browser/index.html +0 -50
  394. package/examples/browser/packages.js +0 -12
  395. package/examples/browser/packagesDefault.js +0 -12
  396. package/examples/browser/qunit/qunit-1.10.0.css +0 -235
  397. package/examples/browser/qunit/qunit-1.10.0.js +0 -1977
  398. package/examples/browser/runTestsWithCoverage.bat +0 -19
  399. package/examples/browser/runner.js +0 -178
  400. package/examples/browser/src/Foo.js +0 -14
  401. package/examples/browser/srcInstrumented/Foo.js +0 -6
  402. package/examples/browser/test/FooTest.js +0 -31
  403. package/examples/browser/testDojo.js +0 -63
  404. package/examples/browser/testInstrumented/FooTest.js +0 -6
  405. package/examples/coffee/coffeeTestsCoffee/foo.coffee +0 -4
  406. package/examples/coffee/coffeeTestsCoffee/tests.coffee +0 -7
  407. package/examples/coffee/coffeeTestsJs/foo.js +0 -9
  408. package/examples/coffee/coffeeTestsJs/tests.coffee +0 -9
  409. package/examples/coffee/jsTestsCoffee/foo.coffee +0 -4
  410. package/examples/coffee/jsTestsCoffee/tests.js +0 -8
  411. package/examples/coverage.png +0 -0
  412. package/examples/crash/foo.js +0 -8
  413. package/examples/crashOnLoading/foo.js +0 -3
  414. package/examples/crashStackSize/foo.js +0 -8
  415. package/examples/crashStackSize/test.js +0 -7
  416. package/examples/doh/foo.js +0 -15
  417. package/examples/doh/fooTests.js +0 -28
  418. package/examples/dohDefine/foo.js +0 -14
  419. package/examples/dohDefine/fooTests.js +0 -24
  420. package/examples/dojo/src/Foo.js +0 -12
  421. package/examples/dojo/test/FooTest.js +0 -9
  422. package/examples/dojo/testDojo.js +0 -69
  423. package/examples/equiv/equiv.js +0 -22
  424. package/examples/example.png +0 -0
  425. package/examples/exec/foo.js +0 -5
  426. package/examples/exec/tests.js +0 -50
  427. package/examples/expect/test.js +0 -53
  428. package/examples/extend/extend-through-api.js +0 -40
  429. package/examples/extend/test.js +0 -18
  430. package/examples/faster/fibonacci.js +0 -18
  431. package/examples/faster/test.js +0 -89
  432. package/examples/fluent/foo.js +0 -38
  433. package/examples/funcAndArity/test.js +0 -15
  434. package/examples/gtAndQUnit/gtTests.js +0 -6
  435. package/examples/gtAndQUnit/qunitTests.js +0 -5
  436. package/examples/jsUnity/foo.js +0 -10
  437. package/examples/jsUnity/fooTests.js +0 -19
  438. package/examples/lodash/totalLength.js +0 -19
  439. package/examples/longStrings/test.js +0 -27
  440. package/examples/moduleSetupTeardown/test.js +0 -115
  441. package/examples/namedTest/foo.js +0 -9
  442. package/examples/overrideGt/test.js +0 -11
  443. package/examples/quickFail/test.js +0 -22
  444. package/examples/qunit/foo.js +0 -13
  445. package/examples/reporting/tests.coffee +0 -9
  446. package/examples/requirejs/lib/Foo.js +0 -11
  447. package/examples/requirejs/lib/Rectangle.js +0 -13
  448. package/examples/requirejs/runTests.js +0 -5
  449. package/examples/requirejs/test/RectangleTest.js +0 -22
  450. package/examples/silent/foo.js +0 -7
  451. package/examples/silent/fooTest.js +0 -18
  452. package/examples/skipTest/tests.js +0 -15
  453. package/examples/testsFromOtherTests/parentTests.js +0 -7
  454. package/examples/testsFromOtherTests/tests.js +0 -5
  455. package/examples/throws/test.js +0 -17
  456. package/examples/use-gt-as-module/fooTest.js +0 -8
  457. package/examples/use-gt-as-module/test-code.js +0 -7
  458. package/gt.js +0 -11
  459. package/lib/coverage.js +0 -234
  460. package/src/JUnitReporter.js +0 -30
  461. package/src/QUnitBrowserAdapter.js +0 -15
  462. package/src/Reporter.js +0 -127
  463. package/src/TestRunInfo.js +0 -25
  464. package/src/TestRunner.js +0 -223
  465. package/src/UnitTest/CollectionMethods.js +0 -97
  466. package/src/UnitTest/ModuleTests.js +0 -104
  467. package/src/UnitTest/Test.js +0 -85
  468. package/src/UnitTest/TestAsync.js +0 -78
  469. package/src/UnitTest/TestBaseInfo.js +0 -21
  470. package/src/UnitTest/TestCollection.js +0 -206
  471. package/src/UnitTest/TestInfo.js +0 -30
  472. package/src/UnitTest/TestReport.js +0 -27
  473. package/src/assertions/PrimaryAssertions.js +0 -163
  474. package/src/assertions/SecondaryAssertions.js +0 -262
  475. package/src/assertions/TertiaryAssertions.js +0 -99
  476. package/src/bddInterface.js +0 -39
  477. package/src/covered.js +0 -156
  478. package/src/dohAdapter.js +0 -79
  479. package/src/dohInterface.js +0 -20
  480. package/src/equiv.js +0 -11
  481. package/src/jsunityAdapter.js +0 -66
  482. package/src/jsunityInterface.js +0 -13
  483. package/src/options.js +0 -116
  484. package/src/shiv.js +0 -16
  485. package/src/sure.js +0 -226
  486. package/src/test/ConsoleHider.js +0 -26
  487. package/src/test/JUnitReporter.js +0 -12
  488. package/src/test/ModuleTests.js +0 -37
  489. package/src/test/Test.js +0 -18
  490. package/src/test/TestCollection.js +0 -21
  491. package/src/test/TestRunInfo.js +0 -15
  492. package/src/test/TestRunner.js +0 -9
  493. package/src/test/utils.js +0 -43
  494. package/src/utils/ConsoleHider.js +0 -27
  495. package/src/utils/WatchFiles.js +0 -13
  496. package/src/utils/discoverFiles.js +0 -18
  497. package/src/utils/joinArguments.js +0 -13
  498. package/src/utils/not.js +0 -14
  499. package/src/utils/pluckFunction.js +0 -15
  500. package/src/utils/test/joinArgumentsTest.js +0 -24
  501. package/src/utils/test/not.js +0 -70
  502. package/src/utils/test/pluckFunctionLoDashTest.js +0 -51
  503. package/src/utils/test/pluckFunctionTest.js +0 -41
  504. package/src/utils/test/pluckObjects.js +0 -20
  505. package/src/utils/utils.js +0 -146
  506. package/tests/all.js +0 -24
  507. package/tests/large/bddTest.js +0 -9
  508. package/tests/large/expectedCrash.js +0 -3
  509. package/tests/large/expectedCrashTest.js +0 -9
  510. package/tests/large/filterCLI.js +0 -10
  511. package/tests/large/filterCLITest.js +0 -18
  512. package/tests/large/loadingCrash.js +0 -1
  513. package/tests/large/loadingCrashTest.js +0 -9
  514. package/tests/large/skip.js +0 -11
  515. package/tests/large/skipTest.js +0 -9
  516. package/tests/large/twoFailing.js +0 -9
  517. package/tests/large/twoFailingTest.js +0 -9
  518. package/tests/mocha/.npmignore +0 -1
  519. package/tests/mocha/basic.js +0 -12
  520. package/tests/mocha/gt-as-module.js +0 -65
  521. package/tests/mocha/test-collection.js +0 -67
  522. package/tests/small/errorInAsync.js +0 -6
  523. package/tests/small/errorInAsyncTest.js +0 -14
  524. package/tests/small/oneFails.js +0 -7
  525. package/tests/small/oneFailsTest.js +0 -18
  526. package/tests/small/pluckObjects.js +0 -20
  527. package/tests/small/pluckTest.js +0 -51
  528. package/tests/small/setupException.js +0 -8
  529. package/tests/small/setupExceptionTest.js +0 -9
  530. package/tests/small/teardownException.js +0 -8
  531. package/tests/small/teardownExceptionTest.js +0 -9
@@ -0,0 +1,529 @@
1
+ import { createOrUpdateConfig } from '../fs/config/setupConfig.js';
2
+ import findFilepath from '../fs/findFilepath.js';
3
+ import { displayHeader, promptText, logErrorAndExit, promptConfirm, promptMultiSelect, promptSelect, } from '../console/logging.js';
4
+ import { logger } from '../console/logger.js';
5
+ import path from 'node:path';
6
+ import fs from 'node:fs';
7
+ import { generateSettings } from '../config/generateSettings.js';
8
+ import chalk from 'chalk';
9
+ import { FILE_EXT_TO_EXT_LABEL } from '../formats/files/supportedFiles.js';
10
+ import { handleSetupReactCommand } from '../setup/wizard.js';
11
+ import { isPackageInstalled, searchForPackageJson, } from '../utils/packageJson.js';
12
+ import { getDesiredLocales } from '../setup/userInput.js';
13
+ import { installPackage } from '../utils/installPackage.js';
14
+ import { getPackageManager } from '../utils/packageManager.js';
15
+ import { retrieveCredentials, setCredentials } from '../utils/credentials.js';
16
+ import { areCredentialsSet } from '../utils/credentials.js';
17
+ import { upload } from './commands/upload.js';
18
+ import { attachSharedFlags, attachTranslateFlags } from './flags.js';
19
+ import { handleStage } from './commands/stage.js';
20
+ import { handleSetupProject } from './commands/setupProject.js';
21
+ import { handleDownload } from './commands/download.js';
22
+ import { handleTranslate, postProcessTranslations, } from './commands/translate.js';
23
+ import { getDownloaded, clearDownloaded } from '../state/recentDownloads.js';
24
+ import { clearWarnings } from '../state/translateWarnings.js';
25
+ import { displayTranslateSummary } from '../console/displayTranslateSummary.js';
26
+ import updateConfig from '../fs/config/updateConfig.js';
27
+ import { createLoadTranslationsFile } from '../fs/createLoadTranslationsFile.js';
28
+ import { saveLocalEdits } from '../api/saveLocalEdits.js';
29
+ import processSharedStaticAssets, { mirrorAssetsToLocales, } from '../utils/sharedStaticAssets.js';
30
+ import { setupLocadex } from '../locadex/setupFlow.js';
31
+ import { detectFramework } from '../setup/detectFramework.js';
32
+ import { getFrameworkDisplayName, getReactFrameworkLibrary, } from '../setup/frameworkUtils.js';
33
+ import { findAgentFiles, findAgentFilesWithInstructions, hasCursorRulesDir, CURSOR_GT_RULES_FILE, getAgentInstructions, appendAgentInstructions, } from '../setup/agentInstructions.js';
34
+ import { determineLibrary } from '../fs/determineFramework.js';
35
+ import { INLINE_LIBRARIES } from '../types/libraries.js';
36
+ import { handleEnqueue } from './commands/enqueue.js';
37
+ export class BaseCLI {
38
+ library;
39
+ additionalModules;
40
+ program;
41
+ // Constructor is shared amongst all CLI class types
42
+ constructor(program, library, additionalModules) {
43
+ this.program = program;
44
+ this.library = library;
45
+ this.additionalModules = additionalModules || [];
46
+ this.setupInitCommand();
47
+ this.setupConfigureCommand();
48
+ this.setupUploadCommand();
49
+ this.setupLoginCommand();
50
+ this.setupSendDiffsCommand();
51
+ this.setupUpdateInstructionsCommand();
52
+ }
53
+ // Init is never called in a child class
54
+ init() {
55
+ this.setupSetupProjectCommand();
56
+ this.setupStageCommand();
57
+ this.setupTranslateCommand();
58
+ this.setupDownloadCommand();
59
+ this.setupEnqueueCommand();
60
+ }
61
+ // Execute is called by the main program
62
+ execute() {
63
+ // If no command is specified, run 'init'
64
+ if (process.argv.length <= 2) {
65
+ process.argv.push('init');
66
+ }
67
+ }
68
+ setupSetupProjectCommand() {
69
+ attachTranslateFlags(this.program
70
+ .command('setup')
71
+ .description('Upload source files and setup the project for translation')).action(async (initOptions) => {
72
+ displayHeader('Uploading source files and setting up project...');
73
+ await this.handleSetupProject(initOptions);
74
+ logger.endCommand('Done!');
75
+ });
76
+ }
77
+ setupStageCommand() {
78
+ attachTranslateFlags(this.program
79
+ .command('stage')
80
+ .description('Submits the project to the General Translation API for translation. Translations created using this command will require human approval.')).action(async (initOptions) => {
81
+ displayHeader('Staging project for translation with approval required...');
82
+ await this.handleStage(initOptions);
83
+ logger.endCommand('Done!');
84
+ });
85
+ }
86
+ /**
87
+ * Enqueues translations for a given set of files
88
+ * @param initOptions - The options for the command
89
+ * @returns The results of the command
90
+ */
91
+ setupEnqueueCommand() {
92
+ attachTranslateFlags(this.program
93
+ .command('enqueue')
94
+ .description('Enqueues translations for a given set of files')).action(async (initOptions) => {
95
+ displayHeader('Enqueuing translations...');
96
+ await this.handleEnqueue(initOptions);
97
+ logger.endCommand('Done!');
98
+ });
99
+ }
100
+ /**
101
+ * Downloads translations that were originally staged
102
+ * @param initOptions - The options for the command
103
+ * @returns The results of the command
104
+ */
105
+ setupDownloadCommand() {
106
+ attachTranslateFlags(this.program
107
+ .command('download')
108
+ .description('Download translations that were originally staged')).action(async (initOptions) => {
109
+ displayHeader('Downloading translations...');
110
+ await this.handleDownload(initOptions);
111
+ logger.endCommand('Done!');
112
+ });
113
+ }
114
+ setupTranslateCommand() {
115
+ attachTranslateFlags(this.program
116
+ .command('translate')
117
+ .description('Translate your project using General Translation')).action(async (initOptions) => {
118
+ displayHeader('Starting translation...');
119
+ await this.handleTranslate(initOptions);
120
+ logger.endCommand('Done!');
121
+ });
122
+ }
123
+ setupSendDiffsCommand() {
124
+ attachSharedFlags(this.program
125
+ .command('save-local')
126
+ .description('Save local edits for all configured files by sending diffs (no translation enqueued)')).action(async (initOptions) => {
127
+ displayHeader('Saving local edits...');
128
+ const settings = await generateSettings(initOptions);
129
+ await saveLocalEdits(settings);
130
+ logger.endCommand('Saved local edits');
131
+ });
132
+ }
133
+ async handleSetupProject(initOptions) {
134
+ const settings = await generateSettings(initOptions);
135
+ // Preprocess shared static assets if configured (move + rewrite sources)
136
+ await processSharedStaticAssets(settings);
137
+ await handleSetupProject(initOptions, settings, this.library);
138
+ }
139
+ async handleStage(initOptions) {
140
+ const settings = await generateSettings(initOptions);
141
+ // Preprocess shared static assets if configured (move + rewrite sources)
142
+ await processSharedStaticAssets(settings);
143
+ if (!settings.stageTranslations) {
144
+ // Update settings.stageTranslations to true
145
+ settings.stageTranslations = true;
146
+ await updateConfig(settings.config, {
147
+ stageTranslations: true,
148
+ });
149
+ }
150
+ await handleStage(initOptions, settings, this.library, true);
151
+ }
152
+ /**
153
+ * Enqueues translations for a given set of files
154
+ * @param initOptions - The options for the command
155
+ * @returns The results of the command
156
+ */
157
+ async handleEnqueue(initOptions) {
158
+ const settings = await generateSettings(initOptions);
159
+ await handleEnqueue(initOptions, settings, this.library);
160
+ }
161
+ /**
162
+ * Downloads translations that were originally staged
163
+ * @param initOptions - The options for the command
164
+ * @returns The results of the command
165
+ */
166
+ async handleDownload(initOptions) {
167
+ const settings = await generateSettings(initOptions);
168
+ await handleDownload(initOptions, settings, this.library);
169
+ }
170
+ async handleTranslate(initOptions) {
171
+ const settings = await generateSettings(initOptions);
172
+ // Preprocess shared static assets if configured (move + rewrite sources)
173
+ await processSharedStaticAssets(settings);
174
+ if (!settings.stageTranslations) {
175
+ const results = await handleStage(initOptions, settings, this.library, false);
176
+ if (results) {
177
+ await handleTranslate(initOptions, settings, results.fileVersionData, results.jobData, results.branchData);
178
+ }
179
+ }
180
+ else {
181
+ await handleDownload(initOptions, settings, this.library);
182
+ }
183
+ // Only postprocess files downloaded in this run
184
+ const include = getDownloaded();
185
+ if (include.size > 0) {
186
+ await postProcessTranslations(settings, include);
187
+ }
188
+ // Mirror assets after translations are downloaded and locale dirs are populated
189
+ await mirrorAssetsToLocales(settings);
190
+ clearDownloaded();
191
+ displayTranslateSummary();
192
+ clearWarnings();
193
+ }
194
+ setupUploadCommand() {
195
+ attachTranslateFlags(this.program
196
+ .command('upload')
197
+ .description('Upload source files and translations to the General Translation platform')).action(async (initOptions) => {
198
+ displayHeader('Starting upload...');
199
+ const settings = await generateSettings(initOptions);
200
+ const options = { ...initOptions, ...settings };
201
+ await this.handleUploadCommand(options);
202
+ logger.endCommand('Done!');
203
+ });
204
+ }
205
+ setupLoginCommand() {
206
+ this.program
207
+ .command('auth')
208
+ .description('Generate a General Translation API key and project ID')
209
+ .option('-c, --config <path>', 'Filepath to config file, by default gt.config.json', findFilepath(['gt.config.json']))
210
+ .option('-t, --key-type <type>', 'Type of key to generate, production | development')
211
+ .action(async (options) => {
212
+ displayHeader('Authenticating with General Translation...');
213
+ if (!options.keyType) {
214
+ const packageJson = await searchForPackageJson();
215
+ if (packageJson &&
216
+ INLINE_LIBRARIES.some((lib) => isPackageInstalled(lib, packageJson))) {
217
+ options.keyType = 'development';
218
+ }
219
+ else {
220
+ options.keyType = 'production';
221
+ }
222
+ }
223
+ else {
224
+ if (options.keyType !== 'development' &&
225
+ options.keyType !== 'production') {
226
+ logErrorAndExit('Invalid key type, must be development or production');
227
+ }
228
+ }
229
+ await this.handleLoginCommand(options);
230
+ logger.endCommand(`Done! A ${options.keyType} key has been generated and saved to your .env.local file.`);
231
+ });
232
+ }
233
+ setupInitCommand() {
234
+ this.program
235
+ .command('init')
236
+ .description('Run the setup wizard to configure your project for General Translation')
237
+ .option('--src <paths...>', "Space-separated list of glob patterns containing the app's source code, by default 'src/**/*.{js,jsx,ts,tsx}' 'app/**/*.{js,jsx,ts,tsx}' 'pages/**/*.{js,jsx,ts,tsx}' 'components/**/*.{js,jsx,ts,tsx}'")
238
+ .option('-c, --config <path>', 'Filepath to config file, by default gt.config.json', findFilepath(['gt.config.json']))
239
+ .action(async (options) => {
240
+ const settings = await generateSettings(options);
241
+ displayHeader('Running setup wizard...');
242
+ const framework = await detectFramework();
243
+ const useAgent = await (async () => {
244
+ let useAgentMessage;
245
+ if (framework.name === 'mintlify') {
246
+ useAgentMessage = `Mintlify project detected. Would you like to connect to GitHub so that the Locadex AI Agent can translate your project automatically?`;
247
+ }
248
+ if (framework.name === 'next-app') {
249
+ useAgentMessage = `Next.js App Router detected. Would you like to connect to GitHub so that the Locadex AI Agent can set up your project automatically?`;
250
+ }
251
+ if (useAgentMessage) {
252
+ return await promptConfirm({
253
+ message: useAgentMessage,
254
+ defaultValue: false,
255
+ });
256
+ }
257
+ return false;
258
+ })();
259
+ if (useAgent) {
260
+ await setupLocadex(settings);
261
+ await this.promptAgentInstructions();
262
+ logger.endCommand('Once installed, Locadex will open a PR to your repository. See the docs for more information: https://generaltranslation.com/docs/locadex');
263
+ }
264
+ else {
265
+ // Get framework display info for the defaults message
266
+ const frameworkDisplayName = framework.type === 'react'
267
+ ? getFrameworkDisplayName(framework)
268
+ : null;
269
+ const library = framework.type === 'react'
270
+ ? getReactFrameworkLibrary(framework)
271
+ : null;
272
+ // Build defaults description based on detected framework
273
+ const defaultsDescription = framework.type === 'react'
274
+ ? `${library} & GTProvider, ${frameworkDisplayName}, Files saved locally in ./public/_gt`
275
+ : 'Files saved locally in ./public/_gt';
276
+ // Ask if user wants to use defaults
277
+ const useDefaults = await promptConfirm({
278
+ message: `Would you like to use the recommended General Translation defaults? ${chalk.dim(`(${defaultsDescription})`)}`,
279
+ defaultValue: true,
280
+ });
281
+ let ranReactSetup = false;
282
+ // so that people can run init in non-js projects
283
+ if (framework.type === 'react') {
284
+ const wrap = useDefaults
285
+ ? true
286
+ : await promptConfirm({
287
+ message: `Would you like to install ${library} and add the GTProvider? See the docs for more information: https://generaltranslation.com/docs/react/tutorials/quickstart`,
288
+ defaultValue: true,
289
+ });
290
+ if (wrap) {
291
+ logger.info(`${chalk.yellow('[EXPERIMENTAL]')} Configuring project...`);
292
+ await handleSetupReactCommand(options, framework, useDefaults);
293
+ logger.endCommand(`Done! Since this wizard is experimental, please review the changes and make modifications as needed.
294
+ \nNext step: start internationalizing! See the docs for more information: https://generaltranslation.com/docs/react/tutorials/quickstart`);
295
+ ranReactSetup = true;
296
+ }
297
+ }
298
+ if (ranReactSetup) {
299
+ logger.startCommand('Setting up project config...');
300
+ }
301
+ // Configure gt.config.json
302
+ await this.handleInitCommand(ranReactSetup, useDefaults);
303
+ await this.promptAgentInstructions(useDefaults);
304
+ logger.endCommand('Done! Check out our docs for more information on how to use General Translation: https://generaltranslation.com/docs');
305
+ }
306
+ });
307
+ }
308
+ setupConfigureCommand() {
309
+ this.program
310
+ .command('configure')
311
+ .description('Configure your project for General Translation. This will create a gt.config.json file in your codebase.')
312
+ .action(async () => {
313
+ displayHeader('Configuring project...');
314
+ logger.info('Welcome! This tool will help you configure your gt.config.json file. See the docs: https://generaltranslation.com/docs/cli/reference/config for more information.');
315
+ // Configure gt.config.json
316
+ await this.handleInitCommand(false);
317
+ logger.endCommand('Done! Make sure you have an API key and project ID to use General Translation. Get them on the dashboard: https://generaltranslation.com/dashboard');
318
+ });
319
+ }
320
+ async handleUploadCommand(settings) {
321
+ // dataFormat for JSONs
322
+ let dataFormat;
323
+ if (this.library === 'next-intl') {
324
+ dataFormat = 'ICU';
325
+ }
326
+ else if (this.library === 'i18next') {
327
+ if (this.additionalModules.includes('i18next-icu')) {
328
+ dataFormat = 'ICU';
329
+ }
330
+ else {
331
+ dataFormat = 'I18NEXT';
332
+ }
333
+ }
334
+ else {
335
+ dataFormat = 'JSX';
336
+ }
337
+ if (!settings.files) {
338
+ return;
339
+ }
340
+ const { resolvedPaths: sourceFiles, placeholderPaths, transformPaths, } = settings.files;
341
+ // Process all file types at once with a single call
342
+ await upload(sourceFiles, placeholderPaths, transformPaths, dataFormat, settings);
343
+ }
344
+ // Wizard for configuring gt.config.json
345
+ async handleInitCommand(ranReactSetup, useDefaults = false) {
346
+ const { defaultLocale, locales } = await getDesiredLocales(); // Locales should still be asked for even if using defaults
347
+ const packageJson = await searchForPackageJson();
348
+ // Ask if using another i18n library
349
+ const gtInstalled = !!packageJson &&
350
+ INLINE_LIBRARIES.some((lib) => isPackageInstalled(lib, packageJson));
351
+ const isUsingGT = ranReactSetup || gtInstalled;
352
+ // Ask where the translations are stored
353
+ const usingCDN = await (async () => {
354
+ if (!isUsingGT)
355
+ return false;
356
+ if (useDefaults)
357
+ return false; // Default to local
358
+ const selectedValue = await promptSelect({
359
+ message: `Would you like to save translation files locally or use the General Translation CDN to store them?`,
360
+ options: [
361
+ { value: 'local', label: 'Save locally' },
362
+ { value: 'cdn', label: 'Use CDN' },
363
+ ],
364
+ defaultValue: 'local',
365
+ });
366
+ return selectedValue === 'cdn';
367
+ })();
368
+ // Ask where the translations are stored
369
+ const translationsDir = isUsingGT && !usingCDN
370
+ ? useDefaults
371
+ ? './public/_gt'
372
+ : await promptText({
373
+ message: 'What is the path to the directory where you would like to store your translation files?',
374
+ defaultValue: './public/_gt',
375
+ })
376
+ : null;
377
+ // Determine final translations directory with fallback
378
+ const finalTranslationsDir = translationsDir?.trim() || './public/_gt';
379
+ if (isUsingGT && !usingCDN) {
380
+ // Create loadTranslations.js file for local translations
381
+ await createLoadTranslationsFile(process.cwd(), finalTranslationsDir, locales);
382
+ logger.message(`Created ${chalk.cyan('loadTranslations.js')} file for local translations.
383
+ Make sure to add this function to your app configuration.
384
+ See https://generaltranslation.com/en/docs/next/guides/local-tx`);
385
+ }
386
+ const message = !isUsingGT
387
+ ? 'What is the format of your language resource files? Select as many as applicable.\nAdditionally, you can translate any other files you have in your project.'
388
+ : `Do you have any additional files in this project to translate? For example, Markdown files for docs. ${chalk.dim('(To continue without selecting press Enter)')}`;
389
+ const fileExtensions = useDefaults && isUsingGT
390
+ ? [] // Skip for GT projects when using defaults
391
+ : await promptMultiSelect({
392
+ message,
393
+ options: [
394
+ { value: 'json', label: FILE_EXT_TO_EXT_LABEL.json },
395
+ { value: 'md', label: FILE_EXT_TO_EXT_LABEL.md },
396
+ { value: 'mdx', label: FILE_EXT_TO_EXT_LABEL.mdx },
397
+ { value: 'ts', label: FILE_EXT_TO_EXT_LABEL.ts },
398
+ { value: 'js', label: FILE_EXT_TO_EXT_LABEL.js },
399
+ { value: 'yaml', label: FILE_EXT_TO_EXT_LABEL.yaml },
400
+ ],
401
+ required: !isUsingGT,
402
+ });
403
+ const files = {};
404
+ for (const fileExtension of fileExtensions) {
405
+ const paths = await promptText({
406
+ message: `${chalk.cyan(FILE_EXT_TO_EXT_LABEL[fileExtension])}: Please enter a space-separated list of glob patterns matching the location of the ${FILE_EXT_TO_EXT_LABEL[fileExtension]} files you would like to translate.\nMake sure to include [locale] in the patterns.\nSee https://generaltranslation.com/docs/cli/reference/config#include for more information.`,
407
+ defaultValue: `./**/[locale]/*.${fileExtension}`,
408
+ });
409
+ files[fileExtension] = {
410
+ include: paths.split(' '),
411
+ };
412
+ }
413
+ // Add GT translations if using GT and storing locally
414
+ if (isUsingGT && !usingCDN) {
415
+ files.gt = {
416
+ output: path.join(finalTranslationsDir, `[locale].json`),
417
+ };
418
+ }
419
+ let configFilepath = 'gt.config.json';
420
+ if (fs.existsSync('src/gt.config.json')) {
421
+ configFilepath = 'src/gt.config.json';
422
+ }
423
+ // Create gt.config.json
424
+ await createOrUpdateConfig(configFilepath, {
425
+ defaultLocale,
426
+ locales,
427
+ files: Object.keys(files).length > 0 ? files : undefined,
428
+ publish: isUsingGT && usingCDN,
429
+ });
430
+ logger.success(`Edit ${chalk.cyan(configFilepath)} to customize your translation setup. Docs: https://generaltranslation.com/docs/cli/reference/config`);
431
+ // Install gt if not installed
432
+ const isCLIInstalled = packageJson
433
+ ? isPackageInstalled('gt', packageJson, true, true)
434
+ : true; // if no package.json, we can't install it
435
+ if (!isCLIInstalled) {
436
+ const packageManager = await getPackageManager();
437
+ const spinner = logger.createSpinner();
438
+ spinner.start(`Installing gt as a dev dependency with ${packageManager.name}...`);
439
+ await installPackage('gt', packageManager, true);
440
+ spinner.stop(chalk.green('Installed gt.'));
441
+ }
442
+ // Set credentials
443
+ if (!areCredentialsSet()) {
444
+ const loginQuestion = useDefaults
445
+ ? true
446
+ : await promptConfirm({
447
+ message: `Would you like the wizard to automatically generate a ${isUsingGT ? 'development' : 'production'} API key and project ID for you?`,
448
+ defaultValue: true,
449
+ });
450
+ if (loginQuestion) {
451
+ const settings = await generateSettings({});
452
+ const keyType = isUsingGT ? 'development' : 'production';
453
+ const credentials = await retrieveCredentials(settings, keyType);
454
+ await setCredentials(credentials, keyType, settings.framework);
455
+ }
456
+ }
457
+ }
458
+ async handleLoginCommand(options) {
459
+ const settings = await generateSettings({});
460
+ const keyType = options.keyType || 'production';
461
+ const credentials = await retrieveCredentials(settings, keyType);
462
+ await setCredentials(credentials, keyType, settings.framework);
463
+ }
464
+ setupUpdateInstructionsCommand() {
465
+ this.program
466
+ .command('update-instructions')
467
+ .description('Update GT usage instructions in AI agent files')
468
+ .option('--new', 'Add instructions to all agent files, even those without existing GT instructions')
469
+ .action(async (options) => {
470
+ const agentFiles = options.new
471
+ ? findAgentFiles()
472
+ : findAgentFilesWithInstructions();
473
+ if (options.new &&
474
+ hasCursorRulesDir() &&
475
+ !agentFiles.includes(CURSOR_GT_RULES_FILE)) {
476
+ agentFiles.push(CURSOR_GT_RULES_FILE);
477
+ }
478
+ if (agentFiles.length === 0) {
479
+ logger.warn(options.new
480
+ ? 'No agent files found. Create a CLAUDE.md or similar agent file first.'
481
+ : 'No agent files with GT instructions found. Use --new to add instructions to existing agent files.');
482
+ return;
483
+ }
484
+ const { library } = determineLibrary();
485
+ const instructions = getAgentInstructions(library);
486
+ let updatedCount = 0;
487
+ for (const file of agentFiles) {
488
+ if (appendAgentInstructions(file, instructions)) {
489
+ updatedCount++;
490
+ }
491
+ }
492
+ if (updatedCount > 0) {
493
+ logger.success(`Updated GT instructions in ${updatedCount} file${updatedCount > 1 ? 's' : ''}.`);
494
+ }
495
+ else {
496
+ logger.info('All agent instruction files are already up to date.');
497
+ }
498
+ });
499
+ }
500
+ async promptAgentInstructions(useDefaults = false) {
501
+ const agentFiles = findAgentFiles();
502
+ // Include .cursor/rules/gt-i18n.mdc if the directory exists but the file doesn't yet
503
+ if (hasCursorRulesDir() && !agentFiles.includes(CURSOR_GT_RULES_FILE)) {
504
+ agentFiles.push(CURSOR_GT_RULES_FILE);
505
+ }
506
+ if (agentFiles.length === 0)
507
+ return;
508
+ const addInstructions = useDefaults
509
+ ? true
510
+ : await promptConfirm({
511
+ message: `Found AI agent instruction files (${agentFiles.map((f) => path.basename(f)).join(', ')}). Would you like to add GT usage instructions?`,
512
+ defaultValue: true,
513
+ });
514
+ if (addInstructions) {
515
+ // Re-detect library since packages may have been installed during init
516
+ const { library } = determineLibrary();
517
+ const instructions = getAgentInstructions(library);
518
+ let updatedCount = 0;
519
+ for (const file of agentFiles) {
520
+ if (appendAgentInstructions(file, instructions)) {
521
+ updatedCount++;
522
+ }
523
+ }
524
+ if (updatedCount > 0) {
525
+ logger.success('Added GT instructions to agent files.');
526
+ }
527
+ }
528
+ }
529
+ }
@@ -0,0 +1,8 @@
1
+ import { SupportedLibraries, TranslateFlags } from '../../types/index.js';
2
+ import { Settings } from '../../types/index.js';
3
+ /**
4
+ * Downloads translations that were originally staged
5
+ * @param options - The options for the command
6
+ * @param settings - The settings for the command
7
+ */
8
+ export declare function handleDownload(options: TranslateFlags, settings: Settings, library: SupportedLibraries): Promise<undefined>;
@@ -0,0 +1,51 @@
1
+ import { noVersionIdError, noFilesError } from '../../console/index.js';
2
+ import { createFileMapping } from '../../formats/files/fileMapping.js';
3
+ import { getStagedVersions } from '../../fs/config/updateVersions.js';
4
+ import { runDownloadWorkflow, } from '../../workflows/download.js';
5
+ import { exitSync, logErrorAndExit } from '../../console/logging.js';
6
+ import { convertToFileTranslationData } from '../../formats/files/convertToFileTranslationData.js';
7
+ import { collectFiles } from '../../formats/files/collectFiles.js';
8
+ import { hasValidCredentials, hasValidLocales } from './utils/validation.js';
9
+ // Downloads translations that were originally staged
10
+ /**
11
+ * Downloads translations that were originally staged
12
+ * @param options - The options for the command
13
+ * @param settings - The settings for the command
14
+ */
15
+ export async function handleDownload(options, settings, library) {
16
+ if (!hasValidLocales(settings))
17
+ return exitSync(1);
18
+ // Validate credentials if not in dry run
19
+ if (!options.dryRun && !hasValidCredentials(settings))
20
+ return exitSync(1);
21
+ if (!settings._versionId) {
22
+ return logErrorAndExit(noVersionIdError);
23
+ }
24
+ if (!settings.files) {
25
+ return logErrorAndExit(noFilesError);
26
+ }
27
+ // Files
28
+ const { resolvedPaths, placeholderPaths, transformPaths } = settings.files;
29
+ const fileMapping = createFileMapping(resolvedPaths, placeholderPaths, transformPaths, settings.locales, settings.defaultLocale);
30
+ // Collect the hashes for all files we need to download
31
+ let fileVersionData;
32
+ if (settings.stageTranslations) {
33
+ fileVersionData = await getStagedVersions(settings.configDirectory);
34
+ }
35
+ else {
36
+ const { files } = await collectFiles(options, settings, library);
37
+ fileVersionData = convertToFileTranslationData(files);
38
+ }
39
+ // Check for remaining translations
40
+ await runDownloadWorkflow({
41
+ fileVersionData: fileVersionData,
42
+ jobData: undefined,
43
+ branchData: undefined,
44
+ locales: settings.locales,
45
+ timeoutDuration: options.timeout,
46
+ resolveOutputPath: (sourcePath, locale) => fileMapping[locale][sourcePath] ?? null,
47
+ options: settings,
48
+ forceRetranslation: false, // force is not applicable for downloading staged translations
49
+ forceDownload: options.force || options.forceDownload,
50
+ });
51
+ }
@@ -0,0 +1,9 @@
1
+ import { EnqueueFilesResult } from 'generaltranslation/types';
2
+ import { Settings, SupportedLibraries, TranslateFlags } from '../../types/index.js';
3
+ /**
4
+ * Enqueues translations for a given set of files
5
+ * @param options - The options for the enqueue operation
6
+ * @param settings - The settings for the enqueue operation
7
+ * @returns {Promise<EnqueueFilesResult>} The enqueue result
8
+ */
9
+ export declare function handleEnqueue(options: TranslateFlags, settings: Settings, library: SupportedLibraries): Promise<EnqueueFilesResult>;
@@ -0,0 +1,27 @@
1
+ import { runEnqueueWorkflow } from '../../workflows/enqueue.js';
2
+ import { collectFiles } from '../../formats/files/collectFiles.js';
3
+ import { noFilesError, noVersionIdError } from '../../console/index.js';
4
+ import { hasValidCredentials, hasValidLocales } from './utils/validation.js';
5
+ import { exitSync, logErrorAndExit } from '../../console/logging.js';
6
+ /**
7
+ * Enqueues translations for a given set of files
8
+ * @param options - The options for the enqueue operation
9
+ * @param settings - The settings for the enqueue operation
10
+ * @returns {Promise<EnqueueFilesResult>} The enqueue result
11
+ */
12
+ export async function handleEnqueue(options, settings, library) {
13
+ if (!hasValidLocales(settings))
14
+ return exitSync(1);
15
+ // Validate credentials if not in dry run
16
+ if (!options.dryRun && !hasValidCredentials(settings))
17
+ return exitSync(1);
18
+ if (!settings._versionId) {
19
+ return logErrorAndExit(noVersionIdError);
20
+ }
21
+ if (!settings.files) {
22
+ return logErrorAndExit(noFilesError);
23
+ }
24
+ // Collect the data for all files we need to enqueue
25
+ const { files } = await collectFiles(options, settings, library);
26
+ return runEnqueueWorkflow({ files, options, settings });
27
+ }
@@ -0,0 +1,7 @@
1
+ import { Settings, SupportedLibraries, TranslateFlags } from '../../types/index.js';
2
+ import { FileTranslationData } from '../../workflows/download.js';
3
+ import { BranchData } from '../../types/branch.js';
4
+ export declare function handleSetupProject(options: TranslateFlags, settings: Settings, library: SupportedLibraries): Promise<{
5
+ fileVersionData: FileTranslationData | undefined;
6
+ branchData: BranchData | undefined;
7
+ } | null>;