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,64 @@
1
+ import { JSONPath } from 'jsonpath-plus';
2
+ import { logger } from '../../console/logger.js';
3
+ /**
4
+ * Flattens a JSON object according to a list of JSON paths.
5
+ * @param json - The JSON object to flatten
6
+ * @param jsonPaths - The list of JSON paths to flatten
7
+ * @returns A mapping of json pointers to their values
8
+ */
9
+ export function flattenJson(json, jsonPaths) {
10
+ const extractedJson = {};
11
+ for (const jsonPath of jsonPaths) {
12
+ try {
13
+ const results = JSONPath({
14
+ json,
15
+ path: jsonPath,
16
+ resultType: 'all',
17
+ flatten: true,
18
+ wrap: true,
19
+ });
20
+ if (!results || results.length === 0) {
21
+ continue;
22
+ }
23
+ results.forEach((result) => {
24
+ extractedJson[result.pointer] = result.value;
25
+ });
26
+ }
27
+ catch (error) {
28
+ logger.error(`Error with JSONPath pattern: ${jsonPath}`);
29
+ }
30
+ }
31
+ return extractedJson;
32
+ }
33
+ /**
34
+ * Flattens a JSON object according to a list of JSON paths, only including strings
35
+ * @param json - The JSON object to flatten
36
+ * @param jsonPaths - The list of JSON paths to flatten
37
+ * @returns A mapping of json pointers to their values
38
+ */
39
+ export function flattenJsonWithStringFilter(json, jsonPaths) {
40
+ const extractedJson = {};
41
+ for (const jsonPath of jsonPaths) {
42
+ try {
43
+ const results = JSONPath({
44
+ json,
45
+ path: jsonPath,
46
+ resultType: 'all',
47
+ flatten: true,
48
+ wrap: true,
49
+ });
50
+ if (!results || results.length === 0) {
51
+ continue;
52
+ }
53
+ results.forEach((result) => {
54
+ if (typeof result.value === 'string') {
55
+ extractedJson[result.pointer] = result.value;
56
+ }
57
+ });
58
+ }
59
+ catch {
60
+ logger.error(`Error with JSONPath pattern: ${jsonPath}`);
61
+ }
62
+ }
63
+ return extractedJson;
64
+ }
@@ -0,0 +1,13 @@
1
+ import { AdditionalOptions, SourceObjectOptions } from '../../types/index.js';
2
+ export declare function mergeJson(originalContent: string, inputPath: string, options: AdditionalOptions, targets: {
3
+ translatedContent: string;
4
+ targetLocale: string;
5
+ }[], defaultLocale: string, localeOrder?: string[]): string[];
6
+ /**
7
+ * Apply transformations to the sourceItem in-place
8
+ * @param sourceItem - The source item to apply transformations to
9
+ * @param transform - The transformations to apply
10
+ * @param targetLocale - The target locale
11
+ * @param defaultLocale - The default locale
12
+ */
13
+ export declare function applyTransformations(sourceItem: any, transform: SourceObjectOptions['transform'], targetLocale: string, defaultLocale: string): void;
@@ -0,0 +1,367 @@
1
+ import JSONPointer from 'jsonpointer';
2
+ import { exitSync } from '../../console/logging.js';
3
+ import { logger } from '../../console/logger.js';
4
+ import { findMatchingItemArray, findMatchingItemObject, generateSourceObjectPointers, getIdentifyingLocaleProperty, getSourceObjectOptionsArray, validateJsonSchema, } from './utils.js';
5
+ import { JSONPath } from 'jsonpath-plus';
6
+ import { getLocaleProperties } from 'generaltranslation';
7
+ import { replaceLocalePlaceholders } from '../utils.js';
8
+ import { gt } from '../../utils/gt.js';
9
+ export function mergeJson(originalContent, inputPath, options, targets, defaultLocale, localeOrder = []) {
10
+ const jsonSchema = validateJsonSchema(options, inputPath);
11
+ if (!jsonSchema) {
12
+ return targets.map((target) => target.translatedContent);
13
+ }
14
+ let originalJson;
15
+ try {
16
+ originalJson = JSON.parse(originalContent);
17
+ }
18
+ catch {
19
+ logger.error(`Invalid JSON file: ${inputPath}`);
20
+ return exitSync(1);
21
+ }
22
+ const useCanonicalLocaleKeys = options?.experimentalCanonicalLocaleKeys ?? false;
23
+ const canonicalDefaultLocale = useCanonicalLocaleKeys
24
+ ? gt.resolveCanonicalLocale(defaultLocale)
25
+ : defaultLocale;
26
+ const canonicalLocaleOrder = useCanonicalLocaleKeys
27
+ ? localeOrder.map((locale) => gt.resolveCanonicalLocale(locale))
28
+ : localeOrder;
29
+ // Handle include
30
+ if (jsonSchema.include) {
31
+ const output = [];
32
+ for (const target of targets) {
33
+ // Must clone the original JSON to avoid mutations
34
+ const mergedJson = structuredClone(originalJson);
35
+ const translatedJson = JSON.parse(target.translatedContent);
36
+ for (const [jsonPointer, translatedValue] of Object.entries(translatedJson)) {
37
+ try {
38
+ const value = JSONPointer.get(mergedJson, jsonPointer);
39
+ if (!value)
40
+ continue;
41
+ JSONPointer.set(mergedJson, jsonPointer, translatedValue);
42
+ }
43
+ catch {
44
+ /* empty */
45
+ }
46
+ }
47
+ output.push(JSON.stringify(mergedJson, null, 2));
48
+ }
49
+ return output;
50
+ }
51
+ if (!jsonSchema.composite) {
52
+ logger.error('No composite property found in JSON schema');
53
+ return exitSync(1);
54
+ }
55
+ // Handle composite
56
+ // Create a deep copy of the original JSON to avoid mutations
57
+ const mergedJson = structuredClone(originalJson);
58
+ // Create mapping of sourceObjectPointer to SourceObjectOptions
59
+ const sourceObjectPointers = generateSourceObjectPointers(jsonSchema.composite, originalJson);
60
+ // Find the source object
61
+ for (const [sourceObjectPointer, { sourceObjectValue, sourceObjectOptions },] of Object.entries(sourceObjectPointers)) {
62
+ // Find the source item
63
+ if (sourceObjectOptions.type === 'array') {
64
+ // Validate type
65
+ if (!Array.isArray(sourceObjectValue)) {
66
+ logger.error(`Source object value is not an array at path: ${sourceObjectPointer}`);
67
+ return exitSync(1);
68
+ }
69
+ // Get source item for default locale
70
+ const matchingDefaultLocaleItems = findMatchingItemArray(canonicalDefaultLocale, sourceObjectOptions, sourceObjectPointer, sourceObjectValue);
71
+ if (!Object.keys(matchingDefaultLocaleItems).length) {
72
+ logger.warn(`Matching sourceItems not found at path: ${sourceObjectPointer}. Please check your JSON file includes the key field. Skipping this target`);
73
+ continue;
74
+ }
75
+ const matchingDefaultLocaleItemKeys = new Set(Object.keys(matchingDefaultLocaleItems));
76
+ // For each target:
77
+ // 1. Get the target items
78
+ // 2. Track all array indecies to remove (will be overwritten)
79
+ // 3. Merge matchingDefaultLocaleItems and targetItems
80
+ // 4. Validate that the mergedItems is not empty
81
+ // For each target item:
82
+ // 5. Validate that all the array indecies are still present in the source json
83
+ // 6. Override the source item with the translated values
84
+ // 7. Apply additional mutations to the sourceItem
85
+ // 8. Track all items to add
86
+ // 9. Check that items to add is >= items to remove
87
+ // 10. Remove all items for the target locale (they can be identified by the key)
88
+ const indiciesToRemove = new Set();
89
+ const itemsToAdd = [];
90
+ for (const target of targets) {
91
+ const targetJson = JSON.parse(target.translatedContent);
92
+ let targetItems = targetJson[sourceObjectPointer];
93
+ // 1. Get the target items
94
+ if (!targetItems) {
95
+ // If no translation can be found, a transformation may need to happen still
96
+ targetItems = {};
97
+ }
98
+ // 2. Track all array indecies to remove (will be overwritten)
99
+ const targetItemsToRemove = findMatchingItemArray(useCanonicalLocaleKeys
100
+ ? gt.resolveCanonicalLocale(target.targetLocale)
101
+ : target.targetLocale, sourceObjectOptions, sourceObjectPointer, sourceObjectValue);
102
+ Object.values(targetItemsToRemove).forEach(({ index }) => indiciesToRemove.add(index));
103
+ // Remap mismatched positional keys to current source positions
104
+ const sourceKeys = [...matchingDefaultLocaleItemKeys];
105
+ const remappedTargetItems = {};
106
+ for (const [key, value] of Object.entries(targetItems)) {
107
+ if (matchingDefaultLocaleItemKeys.has(key)) {
108
+ remappedTargetItems[key] = value;
109
+ }
110
+ else if (sourceKeys.length === 1 &&
111
+ !(sourceKeys[0] in remappedTargetItems)) {
112
+ remappedTargetItems[sourceKeys[0]] = value;
113
+ }
114
+ else {
115
+ logger.warn(`Skipping translated item at ${key}: cannot map to source item at path ${sourceObjectPointer}`);
116
+ }
117
+ }
118
+ // Merge matchingDefaultLocaleItems and remapped targetItems
119
+ const mergedItems = {
120
+ ...(sourceObjectOptions.transform ? matchingDefaultLocaleItems : {}),
121
+ ...remappedTargetItems,
122
+ };
123
+ // 4. Validate that the mergedItems is not empty
124
+ if (Object.keys(mergedItems).length === 0) {
125
+ logger.warn(`Translated JSON for locale: ${target.targetLocale} does not have a valid sourceObjectPointer: ${sourceObjectPointer}. Skipping this target`);
126
+ continue;
127
+ }
128
+ for (const [sourceItemPointer, targetItem] of Object.entries(mergedItems)) {
129
+ // 5. Validate that all the array indecies are still present in the source json
130
+ if (!matchingDefaultLocaleItemKeys.has(sourceItemPointer)) {
131
+ logger.warn(`Skipping translated item at ${sourceItemPointer}: not present in source json at path ${sourceObjectPointer}`);
132
+ continue;
133
+ }
134
+ // 6. Override the source item with the translated values
135
+ const defaultLocaleSourceItem = matchingDefaultLocaleItems[sourceItemPointer].sourceItem;
136
+ const defaultLocaleKeyPointer = matchingDefaultLocaleItems[sourceItemPointer].keyPointer;
137
+ const mutatedSourceItem = structuredClone(defaultLocaleSourceItem);
138
+ const { identifyingLocaleProperty: targetLocaleKeyProperty } = getSourceObjectOptionsArray(useCanonicalLocaleKeys
139
+ ? gt.resolveCanonicalLocale(target.targetLocale)
140
+ : target.targetLocale, sourceObjectPointer, sourceObjectOptions);
141
+ JSONPointer.set(mutatedSourceItem, defaultLocaleKeyPointer, targetLocaleKeyProperty);
142
+ for (const [translatedKeyJsonPointer, translatedValue,] of Object.entries(targetItem || {})) {
143
+ const valueToSet = useCanonicalLocaleKeys &&
144
+ defaultLocaleKeyPointer &&
145
+ translatedKeyJsonPointer === defaultLocaleKeyPointer
146
+ ? targetLocaleKeyProperty
147
+ : translatedValue;
148
+ try {
149
+ const value = JSONPointer.get(mutatedSourceItem, translatedKeyJsonPointer);
150
+ if (!value)
151
+ continue;
152
+ JSONPointer.set(mutatedSourceItem, translatedKeyJsonPointer, valueToSet);
153
+ }
154
+ catch {
155
+ /* empty */
156
+ }
157
+ }
158
+ // 7. Apply additional mutations to the sourceItem
159
+ applyTransformations(mutatedSourceItem, sourceObjectOptions.transform, target.targetLocale, defaultLocale);
160
+ itemsToAdd.push(mutatedSourceItem);
161
+ }
162
+ }
163
+ // 8. Check that items to add is >= items to remove
164
+ if (itemsToAdd.length < indiciesToRemove.size) {
165
+ logger.warn(`Items to add (${itemsToAdd.length}) is less than items to remove (${indiciesToRemove.size}) at path: ${sourceObjectPointer}. Some translated items may have been skipped.`);
166
+ }
167
+ // 9. Remove all items for the target locale (they can be identified by the key)
168
+ const filteredSourceObjectValue = sourceObjectValue.filter((_, index) => !indiciesToRemove.has(index));
169
+ // 10. Add all items to the original JSON
170
+ filteredSourceObjectValue.push(...itemsToAdd);
171
+ JSONPointer.set(mergedJson, sourceObjectPointer, sortByLocaleOrder(filteredSourceObjectValue, sourceObjectOptions, canonicalLocaleOrder, sourceObjectPointer, canonicalDefaultLocale));
172
+ }
173
+ else {
174
+ // Validate type
175
+ if (typeof sourceObjectValue !== 'object' || sourceObjectValue === null) {
176
+ logger.error(`Source object value is not an object at path: ${sourceObjectPointer}`);
177
+ return exitSync(1);
178
+ }
179
+ // Validate localeProperty
180
+ const matchingDefaultLocaleItem = findMatchingItemObject(canonicalDefaultLocale, sourceObjectPointer, sourceObjectOptions, sourceObjectValue);
181
+ // Validate source item exists
182
+ if (!matchingDefaultLocaleItem.sourceItem) {
183
+ logger.error(`Source item not found at path: ${sourceObjectPointer}. You must specify a source item where its key matches the default locale`);
184
+ return exitSync(1);
185
+ }
186
+ const { sourceItem: defaultLocaleSourceItem } = matchingDefaultLocaleItem;
187
+ // For each target:
188
+ // 1. Get the target items
189
+ // 2. Find the source item for the target locale
190
+ // 3. Merge the target items with the source item
191
+ // 4. Validate that the mergedItems is not empty
192
+ // 5. Override the source item with the translated values
193
+ // 6. Apply additional mutations to the sourceItem
194
+ // 7. Merge the source item with the original JSON (if the source item is not a new item)
195
+ for (const target of targets) {
196
+ const targetJson = JSON.parse(target.translatedContent);
197
+ // 1. Get the target items
198
+ let targetItems = targetJson[sourceObjectPointer];
199
+ if (!targetItems) {
200
+ targetItems = {};
201
+ }
202
+ // 2. Find the source item for the target locale
203
+ const matchingTargetItem = findMatchingItemObject(useCanonicalLocaleKeys
204
+ ? gt.resolveCanonicalLocale(target.targetLocale)
205
+ : target.targetLocale, sourceObjectPointer, sourceObjectOptions, sourceObjectValue);
206
+ // If the target locale has a matching source item, use it to mutate the source item
207
+ // Otherwise, fallback to the default locale source item
208
+ const mutateSourceItem = structuredClone(defaultLocaleSourceItem);
209
+ const mutateSourceItemKey = matchingTargetItem.keyParentProperty;
210
+ // 3. Merge the target items with the source item (if there are transformations to perform)
211
+ const mergedItems = {
212
+ ...(sourceObjectOptions.transform ? defaultLocaleSourceItem : {}),
213
+ ...targetItems,
214
+ };
215
+ // 4. Validate that the mergedItems is not empty
216
+ if (Object.keys(mergedItems).length === 0) {
217
+ logger.warn(`Translated JSON for locale: ${target.targetLocale} does not have a valid sourceObjectPointer: ${sourceObjectPointer}. Skipping this target`);
218
+ continue;
219
+ }
220
+ // 5. Override the source item with the translated values
221
+ for (const [translatedKeyJsonPointer, translatedValue,] of Object.entries(mergedItems || {})) {
222
+ try {
223
+ const value = JSONPointer.get(mutateSourceItem, translatedKeyJsonPointer);
224
+ if (!value)
225
+ continue;
226
+ JSONPointer.set(mutateSourceItem, translatedKeyJsonPointer, translatedValue);
227
+ }
228
+ catch {
229
+ /* empty */
230
+ }
231
+ }
232
+ // 6. Apply additional mutations to the sourceItem
233
+ applyTransformations(mutateSourceItem, sourceObjectOptions.transform, target.targetLocale, defaultLocale);
234
+ // 7. Merge the source item with the original JSON
235
+ sourceObjectValue[mutateSourceItemKey] = mutateSourceItem;
236
+ }
237
+ JSONPointer.set(mergedJson, sourceObjectPointer, sourceObjectValue);
238
+ }
239
+ }
240
+ return [JSON.stringify(mergedJson, null, 2)];
241
+ }
242
+ function sortByLocaleOrder(items, sourceObjectOptions, localeOrder, sourceObjectPointer, defaultLocale) {
243
+ const sortMode = sourceObjectOptions.experimentalSort;
244
+ if (!sortMode || !sourceObjectOptions.key) {
245
+ return items;
246
+ }
247
+ const itemsWithLocale = items.map((item) => {
248
+ let localeValue;
249
+ try {
250
+ const values = JSONPath({
251
+ json: item,
252
+ path: sourceObjectOptions.key,
253
+ resultType: 'value',
254
+ flatten: true,
255
+ wrap: true,
256
+ });
257
+ const value = values?.[0];
258
+ if (typeof value === 'string') {
259
+ localeValue = value;
260
+ }
261
+ }
262
+ catch {
263
+ /* empty */
264
+ }
265
+ return { item, localeValue };
266
+ });
267
+ if (sortMode === 'locales') {
268
+ if (!localeOrder.length) {
269
+ return items;
270
+ }
271
+ const orderedLocaleList = [
272
+ defaultLocale,
273
+ ...localeOrder.filter((locale) => locale !== defaultLocale),
274
+ ];
275
+ const localeOrderValues = orderedLocaleList.map((locale) => getIdentifyingLocaleProperty(locale, sourceObjectPointer, sourceObjectOptions));
276
+ const orderedItems = [];
277
+ const remainingItems = [...itemsWithLocale];
278
+ for (const localeValue of localeOrderValues) {
279
+ for (let i = 0; i < remainingItems.length;) {
280
+ const entry = remainingItems[i];
281
+ if (entry.localeValue === localeValue) {
282
+ orderedItems.push(entry.item);
283
+ remainingItems.splice(i, 1);
284
+ continue;
285
+ }
286
+ i += 1;
287
+ }
288
+ }
289
+ remainingItems.forEach((entry) => orderedItems.push(entry.item));
290
+ return orderedItems;
291
+ }
292
+ if (sortMode === 'localesAlphabetical') {
293
+ const defaultLocaleValue = getIdentifyingLocaleProperty(defaultLocale, sourceObjectPointer, sourceObjectOptions);
294
+ const defaultItems = [];
295
+ const sortableItems = [];
296
+ const remainingItems = [];
297
+ for (const entry of itemsWithLocale) {
298
+ if (entry.localeValue === defaultLocaleValue) {
299
+ defaultItems.push(entry);
300
+ continue;
301
+ }
302
+ if (entry.localeValue) {
303
+ sortableItems.push(entry);
304
+ continue;
305
+ }
306
+ remainingItems.push(entry);
307
+ }
308
+ sortableItems.sort((a, b) => {
309
+ if (!a.localeValue || !b.localeValue) {
310
+ return 0;
311
+ }
312
+ return a.localeValue.localeCompare(b.localeValue);
313
+ });
314
+ return [...defaultItems, ...sortableItems, ...remainingItems].map((entry) => entry.item);
315
+ }
316
+ return items;
317
+ }
318
+ /**
319
+ * Apply transformations to the sourceItem in-place
320
+ * @param sourceItem - The source item to apply transformations to
321
+ * @param transform - The transformations to apply
322
+ * @param targetLocale - The target locale
323
+ * @param defaultLocale - The default locale
324
+ */
325
+ export function applyTransformations(sourceItem, transform, targetLocale, defaultLocale) {
326
+ if (!transform)
327
+ return;
328
+ const targetLocaleProperties = getLocaleProperties(targetLocale);
329
+ const defaultLocaleProperties = getLocaleProperties(defaultLocale);
330
+ for (const [transformPath, transformOptions] of Object.entries(transform)) {
331
+ if (!transformOptions.replace ||
332
+ typeof transformOptions.replace !== 'string') {
333
+ continue;
334
+ }
335
+ const results = JSONPath({
336
+ json: sourceItem,
337
+ path: transformPath,
338
+ resultType: 'all',
339
+ flatten: true,
340
+ wrap: true,
341
+ });
342
+ if (!results || results.length === 0) {
343
+ continue;
344
+ }
345
+ results.forEach((result) => {
346
+ if (typeof result.value !== 'string') {
347
+ return;
348
+ }
349
+ // Replace locale placeholders in the replace string
350
+ let replaceString = transformOptions.replace;
351
+ // Replace all locale property placeholders
352
+ replaceString = replaceLocalePlaceholders(replaceString, targetLocaleProperties);
353
+ if (transformOptions.match &&
354
+ typeof transformOptions.match === 'string') {
355
+ // Replace locale placeholders in the match string using defaultLocale properties
356
+ let matchString = transformOptions.match;
357
+ matchString = replaceLocalePlaceholders(matchString, defaultLocaleProperties);
358
+ result.value = result.value.replace(new RegExp(matchString, 'g'), replaceString);
359
+ }
360
+ else {
361
+ result.value = replaceString;
362
+ }
363
+ // Update the actual sourceItem using JSONPointer
364
+ JSONPointer.set(sourceItem, result.pointer, result.value);
365
+ });
366
+ }
367
+ }
@@ -0,0 +1,2 @@
1
+ import { AdditionalOptions } from '../../types/index.js';
2
+ export declare function parseJson(content: string, filePath: string, options: AdditionalOptions, defaultLocale: string): string;
@@ -0,0 +1,109 @@
1
+ import { flattenJsonWithStringFilter } from './flattenJson.js';
2
+ import { JSONPath } from 'jsonpath-plus';
3
+ import { exitSync } from '../../console/logging.js';
4
+ import { logger } from '../../console/logger.js';
5
+ import { findMatchingItemArray, findMatchingItemObject, generateSourceObjectPointers, validateJsonSchema, } from './utils.js';
6
+ // Parse a JSON file according to a JSON schema
7
+ export function parseJson(content, filePath, options, defaultLocale) {
8
+ const jsonSchema = validateJsonSchema(options, filePath);
9
+ if (!jsonSchema) {
10
+ return content;
11
+ }
12
+ let json;
13
+ try {
14
+ json = JSON.parse(content);
15
+ }
16
+ catch {
17
+ logger.error(`Invalid JSON file: ${filePath}`);
18
+ return exitSync(1);
19
+ }
20
+ // Handle include
21
+ if (jsonSchema.include) {
22
+ const flattenedJson = flattenJsonWithStringFilter(json, jsonSchema.include);
23
+ return JSON.stringify(flattenedJson);
24
+ }
25
+ if (!jsonSchema.composite) {
26
+ logger.error('No composite property found in JSON schema');
27
+ return exitSync(1);
28
+ }
29
+ // Construct lvl 1
30
+ // Create mapping of sourceObjectPointer to SourceObjectOptions
31
+ const sourceObjectPointers = generateSourceObjectPointers(jsonSchema.composite, json);
32
+ // Construct lvl 2
33
+ const sourceObjectsToTranslate = {};
34
+ for (const [sourceObjectPointer, { sourceObjectValue, sourceObjectOptions },] of Object.entries(sourceObjectPointers)) {
35
+ // Skip if no includes
36
+ if (!sourceObjectOptions.include.length) {
37
+ continue;
38
+ }
39
+ // Find the default locale in each source item in each sourceObjectValue
40
+ // Array: use key field
41
+ if (sourceObjectOptions.type === 'array') {
42
+ // Validate type
43
+ if (!Array.isArray(sourceObjectValue)) {
44
+ logger.error(`Source object value is not an array at path: ${sourceObjectPointer}`);
45
+ return exitSync(1);
46
+ }
47
+ // Find matching source items
48
+ const matchingItems = findMatchingItemArray(defaultLocale, sourceObjectOptions, sourceObjectPointer, sourceObjectValue);
49
+ if (!Object.keys(matchingItems).length) {
50
+ logger.error(`Matching sourceItem not found at path: ${sourceObjectPointer} for locale: ${defaultLocale}. Please check your JSON schema`);
51
+ return exitSync(1);
52
+ }
53
+ // Construct lvl 3
54
+ const sourceItemsToTranslate = {};
55
+ for (const [arrayPointer, matchingItem] of Object.entries(matchingItems)) {
56
+ const { sourceItem, keyPointer } = matchingItem;
57
+ // Get the fields to translate from the includes
58
+ const matchingItemsToTranslate = [];
59
+ for (const include of sourceObjectOptions.include) {
60
+ try {
61
+ const matchingItems = JSONPath({
62
+ json: sourceItem,
63
+ path: include,
64
+ resultType: 'all',
65
+ flatten: true,
66
+ wrap: true,
67
+ });
68
+ if (matchingItems) {
69
+ matchingItemsToTranslate.push(...matchingItems);
70
+ }
71
+ }
72
+ catch {
73
+ /* empty */
74
+ }
75
+ }
76
+ // Filter out the key pointer
77
+ sourceItemsToTranslate[arrayPointer] = Object.fromEntries(matchingItemsToTranslate
78
+ .filter((item) => item.pointer !== keyPointer)
79
+ .map((item) => [
80
+ item.pointer,
81
+ item.value,
82
+ ]));
83
+ }
84
+ // Add the items to translate to the result
85
+ sourceObjectsToTranslate[sourceObjectPointer] = sourceItemsToTranslate;
86
+ }
87
+ else {
88
+ // Object: use the key in this object with the matching locale property
89
+ // Validate type
90
+ if (typeof sourceObjectValue !== 'object' || sourceObjectValue === null) {
91
+ logger.error(`Source object value is not an object at path: ${sourceObjectPointer}`);
92
+ return exitSync(1);
93
+ }
94
+ // Validate localeProperty
95
+ const matchingItem = findMatchingItemObject(defaultLocale, sourceObjectPointer, sourceObjectOptions, sourceObjectValue);
96
+ // Validate source item exists
97
+ if (!matchingItem.sourceItem) {
98
+ logger.error(`Source item not found at path: ${sourceObjectPointer}. You must specify a source item where its key matches the default locale`);
99
+ return exitSync(1);
100
+ }
101
+ const { sourceItem } = matchingItem;
102
+ // Get the fields to translate from the includes
103
+ const itemsToTranslate = flattenJsonWithStringFilter(sourceItem, sourceObjectOptions.include);
104
+ // Add the items to translate to the result
105
+ sourceObjectsToTranslate[sourceObjectPointer] = itemsToTranslate;
106
+ }
107
+ }
108
+ return JSON.stringify(sourceObjectsToTranslate);
109
+ }
@@ -0,0 +1,47 @@
1
+ import { AdditionalOptions, JsonSchema, SourceObjectOptions } from '../../types/index.js';
2
+ export declare function findMatchingItemArray(locale: string, sourceObjectOptions: SourceObjectOptions, sourceObjectPointer: string, sourceObjectValue: any): Record<string, {
3
+ sourceItem: any;
4
+ keyParentProperty: string;
5
+ keyPointer: string;
6
+ index: number;
7
+ }>;
8
+ export declare function findMatchingItemObject(locale: string, sourceObjectPointer: string, sourceObjectOptions: SourceObjectOptions, sourceObjectValue: any): {
9
+ sourceItem: any | undefined;
10
+ keyParentProperty: string;
11
+ };
12
+ /**
13
+ * Get the identifying locale property for an object
14
+ * @param locale - The locale to get the identifying locale property for
15
+ * @param sourceObjectPointer - The path to the source object
16
+ * @param sourceObjectOptions - The source object options
17
+ * @returns The identifying locale property
18
+ */
19
+ export declare function getIdentifyingLocaleProperty(locale: string, sourceObjectPointer: string, sourceObjectOptions: SourceObjectOptions): string;
20
+ /**
21
+ * Get the identifying locale property and the json path to the key for an array
22
+ * @param locale - The locale to get the identifying locale property for
23
+ * @param sourceObjectPointer - The path to the source object
24
+ * @param sourceObjectOptions - The source object options
25
+ * @returns The identifying locale property and the json path to the key
26
+ */
27
+ export declare function getSourceObjectOptionsArray(locale: string, sourceObjectPointer: string, sourceObjectOptions: SourceObjectOptions): {
28
+ identifyingLocaleProperty: string;
29
+ localeKeyJsonPath: string;
30
+ };
31
+ export declare function getSourceObjectOptionsObject(defaultLocale: string, sourceObjectPointer: string, sourceObjectOptions: SourceObjectOptions): {
32
+ identifyingLocaleProperty: string;
33
+ };
34
+ /**
35
+ * Generate a mapping of sourceObjectPointer to SourceObjectOptions
36
+ * where the sourceObjectPointer is a jsonpointer to the array or object containing
37
+ * @param jsonSchema - The json schema to generate the mapping from
38
+ * @param originalJson - The original json to generate the mapping from
39
+ * @returns A mapping of sourceObjectPointer to SourceObjectOptions
40
+ */
41
+ export declare function generateSourceObjectPointers(jsonSchema: {
42
+ [sourceObjectPath: string]: SourceObjectOptions;
43
+ }, originalJson: any): Record<string, {
44
+ sourceObjectValue: any;
45
+ sourceObjectOptions: SourceObjectOptions;
46
+ }>;
47
+ export declare function validateJsonSchema(options: AdditionalOptions, filePath: string): JsonSchema | null;