gt 2.16.4 → 2.17.0-iris.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 (88) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/LICENSE.md +18 -102
  3. package/dist/api/downloadFileBatch.d.ts +6 -3
  4. package/dist/api/downloadFileBatch.js +10 -7
  5. package/dist/api/downloadFileBatch.js.map +1 -1
  6. package/dist/cli/base.d.ts +24 -2
  7. package/dist/cli/base.js +67 -20
  8. package/dist/cli/base.js.map +1 -1
  9. package/dist/cli/commands/download.js +9 -4
  10. package/dist/cli/commands/download.js.map +1 -1
  11. package/dist/cli/commands/enqueue.js +3 -2
  12. package/dist/cli/commands/enqueue.js.map +1 -1
  13. package/dist/cli/commands/setupProject.js +3 -3
  14. package/dist/cli/commands/setupProject.js.map +1 -1
  15. package/dist/cli/commands/stage.d.ts +2 -0
  16. package/dist/cli/commands/stage.js +6 -4
  17. package/dist/cli/commands/stage.js.map +1 -1
  18. package/dist/cli/commands/translate.d.ts +2 -1
  19. package/dist/cli/commands/translate.js +2 -1
  20. package/dist/cli/commands/translate.js.map +1 -1
  21. package/dist/cli/flags.d.ts +2 -2
  22. package/dist/cli/flags.js +6 -6
  23. package/dist/cli/flags.js.map +1 -1
  24. package/dist/cli/inline.d.ts +5 -1
  25. package/dist/cli/inline.js +15 -8
  26. package/dist/cli/inline.js.map +1 -1
  27. package/dist/cli/react.js +1 -1
  28. package/dist/cli/vue.d.ts +17 -0
  29. package/dist/cli/vue.js +42 -0
  30. package/dist/cli/vue.js.map +1 -0
  31. package/dist/console/logging.d.ts +2 -1
  32. package/dist/console/logging.js +4 -2
  33. package/dist/console/logging.js.map +1 -1
  34. package/dist/formats/files/collectFiles.d.ts +4 -0
  35. package/dist/formats/files/collectFiles.js +16 -4
  36. package/dist/formats/files/collectFiles.js.map +1 -1
  37. package/dist/fs/config/setupConfig.d.ts +3 -0
  38. package/dist/fs/config/setupConfig.js +2 -0
  39. package/dist/fs/config/setupConfig.js.map +1 -1
  40. package/dist/fs/determineFramework/index.d.ts +9 -1
  41. package/dist/fs/determineFramework/index.js +15 -3
  42. package/dist/fs/determineFramework/index.js.map +1 -1
  43. package/dist/generated/version.d.ts +1 -1
  44. package/dist/generated/version.js +1 -1
  45. package/dist/generated/version.js.map +1 -1
  46. package/dist/index.js +5 -2
  47. package/dist/index.js.map +1 -1
  48. package/dist/next/parse/wrapContent.js +1 -1
  49. package/dist/react/jsx/utils/jsxParsing/removeNullChildrenFields.js.map +1 -1
  50. package/dist/react/jsx/utils/parseString.js +1 -1
  51. package/dist/react/jsx/utils/stringParsing/derivation/handleDerivation.d.ts +0 -1
  52. package/dist/react/jsx/utils/stringParsing/derivation/handleDerivation.js.map +1 -1
  53. package/dist/react/jsx/utils/stringParsing/derivation/isDeriveCall.js +1 -1
  54. package/dist/react/parse/createInlineUpdates.js +1 -1
  55. package/dist/react/parse/wrapContent.js +1 -1
  56. package/dist/setup/wizard.js +1 -1
  57. package/dist/translation/extractInline.d.ts +12 -0
  58. package/dist/translation/extractInline.js +37 -0
  59. package/dist/translation/extractInline.js.map +1 -0
  60. package/dist/translation/parse.js +3 -2
  61. package/dist/translation/parse.js.map +1 -1
  62. package/dist/translation/validate.d.ts +1 -1
  63. package/dist/translation/validate.js +7 -3
  64. package/dist/translation/validate.js.map +1 -1
  65. package/dist/types/libraries.d.ts +4 -1
  66. package/dist/types/libraries.js +7 -1
  67. package/dist/types/libraries.js.map +1 -1
  68. package/dist/types/parsing.d.ts +5 -0
  69. package/dist/types/parsing.js.map +1 -1
  70. package/dist/workflows/download.d.ts +3 -1
  71. package/dist/workflows/download.js +3 -3
  72. package/dist/workflows/download.js.map +1 -1
  73. package/dist/workflows/enqueue.d.ts +3 -1
  74. package/dist/workflows/enqueue.js +2 -2
  75. package/dist/workflows/enqueue.js.map +1 -1
  76. package/dist/workflows/setupProject.d.ts +2 -1
  77. package/dist/workflows/setupProject.js +2 -2
  78. package/dist/workflows/setupProject.js.map +1 -1
  79. package/dist/workflows/stage.d.ts +3 -1
  80. package/dist/workflows/stage.js +2 -2
  81. package/dist/workflows/stage.js.map +1 -1
  82. package/dist/workflows/steps/DownloadStep.d.ts +3 -1
  83. package/dist/workflows/steps/DownloadStep.js +3 -2
  84. package/dist/workflows/steps/DownloadStep.js.map +1 -1
  85. package/dist/workflows/steps/PollJobsStep.d.ts +3 -1
  86. package/dist/workflows/steps/PollJobsStep.js +4 -2
  87. package/dist/workflows/steps/PollJobsStep.js.map +1 -1
  88. package/package.json +10 -8
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/fs/determineFramework/index.ts"],"sourcesContent":["import path from 'node:path';\nimport fs from 'node:fs';\nimport { SupportedLibraries } from '../../types/index.js';\nimport { logger } from '../../console/logger.js';\nimport { Libraries } from '../../types/libraries.js';\nimport { detectPythonLibrary } from './detectPythonLibrary.js';\n\nexport function determineLibrary(): {\n library: SupportedLibraries;\n additionalModules: SupportedLibraries[];\n} {\n let library: SupportedLibraries = 'base';\n const additionalModules: SupportedLibraries[] = [];\n try {\n // Get the current working directory (where the CLI is being run)\n const cwd = process.cwd();\n const packageJsonPath = path.join(cwd, 'package.json');\n\n // Check if package.json exists\n if (fs.existsSync(packageJsonPath)) {\n // Read and parse package.json\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));\n const dependencies = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n // Check for gt-next or gt-react in dependencies\n if (dependencies[Libraries.GT_NEXT]) {\n library = Libraries.GT_NEXT;\n } else if (dependencies[Libraries.GT_TANSTACK_START]) {\n library = Libraries.GT_TANSTACK_START;\n } else if (dependencies[Libraries.GT_REACT]) {\n library = Libraries.GT_REACT;\n } else if (dependencies[Libraries.GT_REACT_NATIVE]) {\n library = Libraries.GT_REACT_NATIVE;\n } else if (dependencies[Libraries.GT_NODE]) {\n library = Libraries.GT_NODE;\n } else if (dependencies['next-intl']) {\n library = 'next-intl';\n } else if (dependencies['i18next']) {\n library = 'i18next';\n }\n\n if (dependencies['i18next-icu']) {\n additionalModules.push('i18next-icu');\n }\n }\n\n // If no JS library found, check for Python project files\n if (library === 'base') {\n const pythonLibrary = detectPythonLibrary(cwd);\n if (pythonLibrary) {\n library = pythonLibrary;\n }\n }\n\n // Fallback to base if neither is found\n return { library, additionalModules };\n } catch (error) {\n logger.error('Error determining framework: ' + String(error));\n return { library: 'base', additionalModules: [] };\n }\n}\n"],"mappings":";;;;;;AAOA,SAAgB,mBAGd;CACA,IAAI,UAA8B;CAClC,MAAM,oBAA0C,EAAE;AAClD,KAAI;EAEF,MAAM,MAAM,QAAQ,KAAK;EACzB,MAAM,kBAAkB,KAAK,KAAK,KAAK,eAAe;AAGtD,MAAI,GAAG,WAAW,gBAAgB,EAAE;GAElC,MAAM,cAAc,KAAK,MAAM,GAAG,aAAa,iBAAiB,OAAO,CAAC;GACxE,MAAM,eAAe;IACnB,GAAG,YAAY;IACf,GAAG,YAAY;IAChB;AAGD,OAAI,aAAA,WACF,WAAA;YACS,aAAA,qBACT,WAAA;YACS,aAAA,YACT,WAAA;YACS,aAAA,mBACT,WAAA;YACS,aAAA,WACT,WAAA;YACS,aAAa,aACtB,WAAU;YACD,aAAa,WACtB,WAAU;AAGZ,OAAI,aAAa,eACf,mBAAkB,KAAK,cAAc;;AAKzC,MAAI,YAAY,QAAQ;GACtB,MAAM,gBAAgB,oBAAoB,IAAI;AAC9C,OAAI,cACF,WAAU;;AAKd,SAAO;GAAE;GAAS;GAAmB;UAC9B,OAAO;AACd,SAAO,MAAM,kCAAkC,OAAO,MAAM,CAAC;AAC7D,SAAO;GAAE,SAAS;GAAQ,mBAAmB,EAAE;GAAE"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/fs/determineFramework/index.ts"],"sourcesContent":["import path from 'node:path';\nimport fs from 'node:fs';\nimport { SupportedLibraries } from '../../types/index.js';\nimport { logger } from '../../console/logger.js';\nimport { Libraries } from '../../types/libraries.js';\nimport { detectPythonLibrary } from './detectPythonLibrary.js';\nimport { manifestDirectlyDeclaresGTVue } from '@generaltranslation/vue-extractor/integration';\n\ntype DeterminedLibrary = {\n library: SupportedLibraries;\n additionalModules: SupportedLibraries[];\n};\n\ntype DeterminedCLILibrary = DeterminedLibrary & {\n directlyDeclaresVue: boolean;\n};\n\n/** Preserves the historical public detection result shape. */\nexport function determineLibrary(): DeterminedLibrary {\n const { directlyDeclaresVue: _directlyDeclaresVue, ...selection } =\n determineLibraryForCLI();\n return selection;\n}\n\n/** Includes the direct Vue signal needed to select a mixed command adapter. */\nexport function determineLibraryForCLI(): DeterminedCLILibrary {\n let library: SupportedLibraries = 'base';\n const additionalModules: SupportedLibraries[] = [];\n let directlyDeclaresVue = false;\n try {\n // Get the current working directory (where the CLI is being run)\n const cwd = process.cwd();\n const packageJsonPath = path.join(cwd, 'package.json');\n\n // Check if package.json exists\n if (fs.existsSync(packageJsonPath)) {\n // Read and parse package.json\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));\n directlyDeclaresVue = manifestDirectlyDeclaresGTVue(packageJson);\n const dependencies = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n // Check for gt-next or gt-react in dependencies\n if (dependencies[Libraries.GT_NEXT]) {\n library = Libraries.GT_NEXT;\n } else if (dependencies[Libraries.GT_TANSTACK_START]) {\n library = Libraries.GT_TANSTACK_START;\n } else if (dependencies[Libraries.GT_REACT]) {\n library = Libraries.GT_REACT;\n } else if (dependencies[Libraries.GT_REACT_NATIVE]) {\n library = Libraries.GT_REACT_NATIVE;\n } else if (dependencies[Libraries.GT_NODE]) {\n library = Libraries.GT_NODE;\n } else if (dependencies['next-intl']) {\n library = 'next-intl';\n } else if (dependencies['i18next']) {\n library = 'i18next';\n }\n\n if (dependencies['i18next-icu']) {\n additionalModules.push('i18next-icu');\n }\n }\n\n // If no JS library found, check for Python project files\n if (library === 'base') {\n const pythonLibrary = detectPythonLibrary(cwd);\n if (pythonLibrary) {\n library = pythonLibrary;\n }\n }\n\n // Vue is intentionally the final fallback so every existing framework\n // keeps its historical command surface and priority in mixed projects.\n if (library === 'base' && directlyDeclaresVue) {\n library = Libraries.GT_VUE;\n }\n\n // Fallback to base if neither is found\n return { library, additionalModules, directlyDeclaresVue };\n } catch (error) {\n logger.error('Error determining framework: ' + String(error));\n return {\n library: 'base',\n additionalModules: [],\n directlyDeclaresVue: false,\n };\n }\n}\n"],"mappings":";;;;;;;;AAkBA,SAAgB,mBAAsC;CACpD,MAAM,EAAE,qBAAqB,sBAAsB,GAAG,cACpD,wBAAwB;AAC1B,QAAO;;;AAIT,SAAgB,yBAA+C;CAC7D,IAAI,UAA8B;CAClC,MAAM,oBAA0C,EAAE;CAClD,IAAI,sBAAsB;AAC1B,KAAI;EAEF,MAAM,MAAM,QAAQ,KAAK;EACzB,MAAM,kBAAkB,KAAK,KAAK,KAAK,eAAe;AAGtD,MAAI,GAAG,WAAW,gBAAgB,EAAE;GAElC,MAAM,cAAc,KAAK,MAAM,GAAG,aAAa,iBAAiB,OAAO,CAAC;AACxE,yBAAsB,8BAA8B,YAAY;GAChE,MAAM,eAAe;IACnB,GAAG,YAAY;IACf,GAAG,YAAY;IAChB;AAGD,OAAI,aAAA,WACF,WAAA;YACS,aAAA,qBACT,WAAA;YACS,aAAA,YACT,WAAA;YACS,aAAA,mBACT,WAAA;YACS,aAAA,WACT,WAAA;YACS,aAAa,aACtB,WAAU;YACD,aAAa,WACtB,WAAU;AAGZ,OAAI,aAAa,eACf,mBAAkB,KAAK,cAAc;;AAKzC,MAAI,YAAY,QAAQ;GACtB,MAAM,gBAAgB,oBAAoB,IAAI;AAC9C,OAAI,cACF,WAAU;;AAMd,MAAI,YAAY,UAAU,oBACxB,WAAA;AAIF,SAAO;GAAE;GAAS;GAAmB;GAAqB;UACnD,OAAO;AACd,SAAO,MAAM,kCAAkC,OAAO,MAAM,CAAC;AAC7D,SAAO;GACL,SAAS;GACT,mBAAmB,EAAE;GACrB,qBAAqB;GACtB"}
@@ -1 +1 @@
1
- export declare const PACKAGE_VERSION = "2.16.4";
1
+ export declare const PACKAGE_VERSION = "2.17.0-iris.0";
@@ -1,5 +1,5 @@
1
1
  //#region src/generated/version.ts
2
- const PACKAGE_VERSION = "2.16.4";
2
+ const PACKAGE_VERSION = "2.17.0-iris.0";
3
3
  //#endregion
4
4
  export { PACKAGE_VERSION };
5
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","names":[],"sources":["../../src/generated/version.ts"],"sourcesContent":["// This file is auto-generated. Do not edit manually.\nexport const PACKAGE_VERSION = '2.16.4';\n"],"mappings":";AACA,MAAa,kBAAkB"}
1
+ {"version":3,"file":"version.js","names":[],"sources":["../../src/generated/version.ts"],"sourcesContent":["// This file is auto-generated. Do not edit manually.\nexport const PACKAGE_VERSION = '2.17.0-iris.0';\n"],"mappings":";AACA,MAAa,kBAAkB"}
package/dist/index.js CHANGED
@@ -1,19 +1,22 @@
1
1
  import { isPythonLibrary } from "./types/libraries.js";
2
- import { determineLibrary } from "./fs/determineFramework/index.js";
2
+ import { determineLibraryForCLI } from "./fs/determineFramework/index.js";
3
3
  import { BaseCLI } from "./cli/base.js";
4
4
  import { ReactCLI } from "./cli/react.js";
5
5
  import { NextCLI } from "./cli/next.js";
6
6
  import { PythonCLI } from "./cli/python.js";
7
7
  import { NodeCLI } from "./cli/node.js";
8
+ import { VueCLI } from "./cli/vue.js";
8
9
  //#region src/index.ts
9
10
  function main(program) {
10
11
  program.name("gt");
11
- const { library, additionalModules } = determineLibrary();
12
+ const { library, additionalModules, directlyDeclaresVue } = determineLibraryForCLI();
12
13
  let cli;
13
14
  if (library === "gt-next") cli = new NextCLI(program, library, additionalModules);
14
15
  else if (library === "gt-react" || library === "gt-react-native" || library === "gt-tanstack-start") cli = new ReactCLI(program, library, additionalModules);
15
16
  else if (library === "gt-node") cli = new NodeCLI(program, library, additionalModules);
17
+ else if (library === "gt-vue") cli = new VueCLI(program, additionalModules);
16
18
  else if (isPythonLibrary(library)) cli = new PythonCLI(program, library, additionalModules);
19
+ else if (directlyDeclaresVue && (library === "next-intl" || library === "i18next")) cli = new VueCLI(program, additionalModules, library);
17
20
  else cli = new BaseCLI(program, library, additionalModules);
18
21
  cli.init();
19
22
  cli.execute();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { BaseCLI } from './cli/base.js';\nimport { NextCLI } from './cli/next.js';\nimport { ReactCLI } from './cli/react.js';\nimport { PythonCLI } from './cli/python.js';\nimport { determineLibrary } from './fs/determineFramework/index.js';\nimport { Command } from 'commander';\nimport { NodeCLI } from './cli/node.js';\nimport { Libraries, isPythonLibrary } from './types/libraries.js';\n\nexport function main(program: Command) {\n program.name('gt');\n\n const { library, additionalModules } = determineLibrary();\n let cli: BaseCLI;\n if (library === Libraries.GT_NEXT) {\n cli = new NextCLI(program, library, additionalModules);\n } else if (\n library === Libraries.GT_REACT ||\n library === Libraries.GT_REACT_NATIVE ||\n library === Libraries.GT_TANSTACK_START\n ) {\n cli = new ReactCLI(program, library, additionalModules);\n } else if (library === Libraries.GT_NODE) {\n cli = new NodeCLI(program, library, additionalModules);\n } else if (isPythonLibrary(library)) {\n cli = new PythonCLI(program, library, additionalModules);\n } else {\n cli = new BaseCLI(program, library, additionalModules);\n }\n cli.init();\n cli.execute();\n}\n\nexport { BaseCLI };\n"],"mappings":";;;;;;;;AASA,SAAgB,KAAK,SAAkB;AACrC,SAAQ,KAAK,KAAK;CAElB,MAAM,EAAE,SAAS,sBAAsB,kBAAkB;CACzD,IAAI;AACJ,KAAI,YAAA,UACF,OAAM,IAAI,QAAQ,SAAS,SAAS,kBAAkB;UAEtD,YAAA,cACA,YAAA,qBACA,YAAA,oBAEA,OAAM,IAAI,SAAS,SAAS,SAAS,kBAAkB;UAC9C,YAAA,UACT,OAAM,IAAI,QAAQ,SAAS,SAAS,kBAAkB;UAC7C,gBAAgB,QAAQ,CACjC,OAAM,IAAI,UAAU,SAAS,SAAS,kBAAkB;KAExD,OAAM,IAAI,QAAQ,SAAS,SAAS,kBAAkB;AAExD,KAAI,MAAM;AACV,KAAI,SAAS"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { BaseCLI } from './cli/base.js';\nimport { NextCLI } from './cli/next.js';\nimport { ReactCLI } from './cli/react.js';\nimport { PythonCLI } from './cli/python.js';\nimport { determineLibraryForCLI } from './fs/determineFramework/index.js';\nimport { Command } from 'commander';\nimport { NodeCLI } from './cli/node.js';\nimport { Libraries, isPythonLibrary } from './types/libraries.js';\nimport { VueCLI } from './cli/vue.js';\n\nexport function main(program: Command) {\n program.name('gt');\n\n const { library, additionalModules, directlyDeclaresVue } =\n determineLibraryForCLI();\n let cli: BaseCLI;\n if (library === Libraries.GT_NEXT) {\n cli = new NextCLI(program, library, additionalModules);\n } else if (\n library === Libraries.GT_REACT ||\n library === Libraries.GT_REACT_NATIVE ||\n library === Libraries.GT_TANSTACK_START\n ) {\n cli = new ReactCLI(program, library, additionalModules);\n } else if (library === Libraries.GT_NODE) {\n cli = new NodeCLI(program, library, additionalModules);\n } else if (library === Libraries.GT_VUE) {\n cli = new VueCLI(program, additionalModules);\n } else if (isPythonLibrary(library)) {\n cli = new PythonCLI(program, library, additionalModules);\n } else if (\n directlyDeclaresVue &&\n (library === 'next-intl' || library === 'i18next')\n ) {\n cli = new VueCLI(program, additionalModules, library);\n } else {\n cli = new BaseCLI(program, library, additionalModules);\n }\n cli.init();\n cli.execute();\n}\n\nexport { BaseCLI };\n"],"mappings":";;;;;;;;;AAUA,SAAgB,KAAK,SAAkB;AACrC,SAAQ,KAAK,KAAK;CAElB,MAAM,EAAE,SAAS,mBAAmB,wBAClC,wBAAwB;CAC1B,IAAI;AACJ,KAAI,YAAA,UACF,OAAM,IAAI,QAAQ,SAAS,SAAS,kBAAkB;UAEtD,YAAA,cACA,YAAA,qBACA,YAAA,oBAEA,OAAM,IAAI,SAAS,SAAS,SAAS,kBAAkB;UAC9C,YAAA,UACT,OAAM,IAAI,QAAQ,SAAS,SAAS,kBAAkB;UAC7C,YAAA,SACT,OAAM,IAAI,OAAO,SAAS,kBAAkB;UACnC,gBAAgB,QAAQ,CACjC,OAAM,IAAI,UAAU,SAAS,SAAS,kBAAkB;UAExD,wBACC,YAAY,eAAe,YAAY,WAExC,OAAM,IAAI,OAAO,SAAS,mBAAmB,QAAQ;KAErD,OAAM,IAAI,QAAQ,SAAS,SAAS,kBAAkB;AAExD,KAAI,MAAM;AACV,KAAI,SAAS"}
@@ -1,7 +1,7 @@
1
+ import "../../types/libraries.js";
1
2
  import { getRelativePath } from "../../fs/findFilepath.js";
2
3
  import { isMeaningful } from "../../react/jsx/evaluateJsx.js";
3
4
  import { createImports, generateImportMap } from "../../react/jsx/utils/parseAst.js";
4
- import "../../types/libraries.js";
5
5
  import { matchFiles } from "../../fs/matchFiles.js";
6
6
  import { DEFAULT_SRC_PATTERNS } from "../../config/generateSettings.js";
7
7
  import { handleJsxElement } from "../../react/jsx/wrapJsx.js";
@@ -1 +1 @@
1
- {"version":3,"file":"removeNullChildrenFields.js","names":[],"sources":["../../../../../src/react/jsx/utils/jsxParsing/removeNullChildrenFields.ts"],"sourcesContent":["import type {\n GTProp,\n JsxChild,\n JsxChildren,\n} from '@generaltranslation/format/types';\n\nimport { isVariable } from 'generaltranslation/internal';\n\nexport function removeNullChildrenFields(tree: JsxChildren): JsxChildren {\n return handleChildren(tree);\n\n function handleChildren(children: JsxChildren): JsxChildren {\n if (Array.isArray(children)) {\n return children.filter((child) => child != null).map(handleChild);\n }\n return handleChild(children);\n }\n\n function handleChild(child: JsxChild): JsxChild {\n if (typeof child === 'string') {\n return child;\n }\n if (typeof child !== 'object' || child === null) {\n return child;\n }\n if (isVariable(child)) {\n return child;\n }\n // other fields\n let t: string | undefined;\n if (child && 't' in child && child.t != null) {\n t = child.t;\n }\n let i: number | undefined;\n if (child && 'i' in child && child.i != null) {\n i = child.i;\n }\n // gtprop\n let d: GTProp | undefined;\n if (child && 'd' in child && child.d != null) {\n let b: Record<string, JsxChildren> | undefined;\n if (child.d && 'b' in child.d && child.d.b != null) {\n b = Object.fromEntries(\n Object.entries(child.d.b).map(([key, value]) => [\n key,\n handleChildren(value),\n ])\n );\n }\n d = {\n ...(b != null && { b }),\n ...(child.d?.t != null && { t: child.d.t }),\n ...Object.fromEntries(\n Object.entries(child.d)\n .filter(\n ([key, value]) => key !== 'b' && key !== 't' && value != null\n )\n .map(([key, value]) => [key, value])\n ),\n };\n }\n // children\n let c: JsxChildren | undefined;\n if (child && 'c' in child && child.c != null) {\n c = handleChildren(child.c);\n }\n return {\n ...(t != null && { t }),\n ...(i != null && { i }),\n ...(d != null && { d }),\n ...(c != null && { c }),\n };\n }\n}\n"],"mappings":";;AAQA,SAAgB,yBAAyB,MAAgC;AACvE,QAAO,eAAe,KAAK;CAE3B,SAAS,eAAe,UAAoC;AAC1D,MAAI,MAAM,QAAQ,SAAS,CACzB,QAAO,SAAS,QAAQ,UAAU,SAAS,KAAK,CAAC,IAAI,YAAY;AAEnE,SAAO,YAAY,SAAS;;CAG9B,SAAS,YAAY,OAA2B;AAC9C,MAAI,OAAO,UAAU,SACnB,QAAO;AAET,MAAI,OAAO,UAAU,YAAY,UAAU,KACzC,QAAO;AAET,MAAI,WAAW,MAAM,CACnB,QAAO;EAGT,IAAI;AACJ,MAAI,SAAS,OAAO,SAAS,MAAM,KAAK,KACtC,KAAI,MAAM;EAEZ,IAAI;AACJ,MAAI,SAAS,OAAO,SAAS,MAAM,KAAK,KACtC,KAAI,MAAM;EAGZ,IAAI;AACJ,MAAI,SAAS,OAAO,SAAS,MAAM,KAAK,MAAM;GAC5C,IAAI;AACJ,OAAI,MAAM,KAAK,OAAO,MAAM,KAAK,MAAM,EAAE,KAAK,KAC5C,KAAI,OAAO,YACT,OAAO,QAAQ,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,WAAW,CAC9C,KACA,eAAe,MAAM,CACtB,CAAC,CACH;AAEH,OAAI;IACF,GAAI,KAAK,QAAQ,EAAE,GAAG;IACtB,GAAI,MAAM,GAAG,KAAK,QAAQ,EAAE,GAAG,MAAM,EAAE,GAAG;IAC1C,GAAG,OAAO,YACR,OAAO,QAAQ,MAAM,EAAE,CACpB,QACE,CAAC,KAAK,WAAW,QAAQ,OAAO,QAAQ,OAAO,SAAS,KAC1D,CACA,KAAK,CAAC,KAAK,WAAW,CAAC,KAAK,MAAM,CAAC,CACvC;IACF;;EAGH,IAAI;AACJ,MAAI,SAAS,OAAO,SAAS,MAAM,KAAK,KACtC,KAAI,eAAe,MAAM,EAAE;AAE7B,SAAO;GACL,GAAI,KAAK,QAAQ,EAAE,GAAG;GACtB,GAAI,KAAK,QAAQ,EAAE,GAAG;GACtB,GAAI,KAAK,QAAQ,EAAE,GAAG;GACtB,GAAI,KAAK,QAAQ,EAAE,GAAG;GACvB"}
1
+ {"version":3,"file":"removeNullChildrenFields.js","names":[],"sources":["../../../../../src/react/jsx/utils/jsxParsing/removeNullChildrenFields.ts"],"sourcesContent":["import type {\n GTProp,\n JsxChild,\n JsxChildren,\n} from '@generaltranslation/format/types';\n\nimport { isVariable } from 'generaltranslation/internal';\n\nexport function removeNullChildrenFields(tree: JsxChildren): JsxChildren {\n return handleChildren(tree);\n\n function handleChildren(children: JsxChildren): JsxChildren {\n if (Array.isArray(children)) {\n return children.filter((child) => child != null).map(handleChild);\n }\n // The public wire type now accurately admits scalar boolean/null values.\n // `handleChild` already preserves them at runtime; this erased cast keeps\n // the historical React extractor byte-for-byte unchanged.\n return handleChild(children as JsxChild);\n }\n\n function handleChild(child: JsxChild): JsxChild {\n if (typeof child === 'string') {\n return child;\n }\n if (typeof child !== 'object' || child === null) {\n return child;\n }\n if (isVariable(child)) {\n return child;\n }\n // other fields\n let t: string | undefined;\n if (child && 't' in child && child.t != null) {\n t = child.t;\n }\n let i: number | undefined;\n if (child && 'i' in child && child.i != null) {\n i = child.i;\n }\n // gtprop\n let d: GTProp | undefined;\n if (child && 'd' in child && child.d != null) {\n let b: Record<string, JsxChildren> | undefined;\n if (child.d && 'b' in child.d && child.d.b != null) {\n b = Object.fromEntries(\n Object.entries(child.d.b).map(([key, value]) => [\n key,\n handleChildren(value),\n ])\n );\n }\n d = {\n ...(b != null && { b }),\n ...(child.d?.t != null && { t: child.d.t }),\n ...Object.fromEntries(\n Object.entries(child.d)\n .filter(\n ([key, value]) => key !== 'b' && key !== 't' && value != null\n )\n .map(([key, value]) => [key, value])\n ),\n };\n }\n // children\n let c: JsxChildren | undefined;\n if (child && 'c' in child && child.c != null) {\n c = handleChildren(child.c);\n }\n return {\n ...(t != null && { t }),\n ...(i != null && { i }),\n ...(d != null && { d }),\n ...(c != null && { c }),\n };\n }\n}\n"],"mappings":";;AAQA,SAAgB,yBAAyB,MAAgC;AACvE,QAAO,eAAe,KAAK;CAE3B,SAAS,eAAe,UAAoC;AAC1D,MAAI,MAAM,QAAQ,SAAS,CACzB,QAAO,SAAS,QAAQ,UAAU,SAAS,KAAK,CAAC,IAAI,YAAY;AAKnE,SAAO,YAAY,SAAqB;;CAG1C,SAAS,YAAY,OAA2B;AAC9C,MAAI,OAAO,UAAU,SACnB,QAAO;AAET,MAAI,OAAO,UAAU,YAAY,UAAU,KACzC,QAAO;AAET,MAAI,WAAW,MAAM,CACnB,QAAO;EAGT,IAAI;AACJ,MAAI,SAAS,OAAO,SAAS,MAAM,KAAK,KACtC,KAAI,MAAM;EAEZ,IAAI;AACJ,MAAI,SAAS,OAAO,SAAS,MAAM,KAAK,KACtC,KAAI,MAAM;EAGZ,IAAI;AACJ,MAAI,SAAS,OAAO,SAAS,MAAM,KAAK,MAAM;GAC5C,IAAI;AACJ,OAAI,MAAM,KAAK,OAAO,MAAM,KAAK,MAAM,EAAE,KAAK,KAC5C,KAAI,OAAO,YACT,OAAO,QAAQ,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,WAAW,CAC9C,KACA,eAAe,MAAM,CACtB,CAAC,CACH;AAEH,OAAI;IACF,GAAI,KAAK,QAAQ,EAAE,GAAG;IACtB,GAAI,MAAM,GAAG,KAAK,QAAQ,EAAE,GAAG,MAAM,EAAE,GAAG;IAC1C,GAAG,OAAO,YACR,OAAO,QAAQ,MAAM,EAAE,CACpB,QACE,CAAC,KAAK,WAAW,QAAQ,OAAO,QAAQ,OAAO,SAAS,KAC1D,CACA,KAAK,CAAC,KAAK,WAAW,CAAC,KAAK,MAAM,CAAC,CACvC;IACF;;EAGH,IAAI;AACJ,MAAI,SAAS,OAAO,SAAS,MAAM,KAAK,KACtC,KAAI,eAAe,MAAM,EAAE;AAE7B,SAAO;GACL,GAAI,KAAK,QAAQ,EAAE,GAAG;GACtB,GAAI,KAAK,QAAQ,EAAE,GAAG;GACtB,GAAI,KAAK,QAAQ,EAAE,GAAG;GACtB,GAAI,KAAK,QAAQ,EAAE,GAAG;GACvB"}
@@ -1,9 +1,9 @@
1
+ import { GT_LIBRARIES } from "../../../types/libraries.js";
1
2
  import { isStaticExpression } from "../evaluateJsx.js";
2
3
  import "./constants.js";
3
4
  import { warnDeriveCircularSpreadSync, warnDeriveDestructuringSync, warnDeriveFunctionNoResultsSync, warnDeriveNonConstVariableSync, warnDeriveOptionalChainingSync, warnDeriveUnresolvableValueSync, warnFunctionNotFoundSync, warnInvalidDeclareVarNameSync } from "../../../console/index.js";
4
5
  import { resolveImportPath } from "./resolveImportPath.js";
5
6
  import { buildImportMap } from "./buildImportMap.js";
6
- import { GT_LIBRARIES } from "../../../types/libraries.js";
7
7
  import fs from "node:fs";
8
8
  import * as t from "@babel/types";
9
9
  import { declareVar } from "generaltranslation/internal";
@@ -2,7 +2,6 @@ import * as t from '@babel/types';
2
2
  import { NodePath } from '@babel/traverse';
3
3
  import { ParsingConfigOptions } from '../../../../../types/parsing.js';
4
4
  import { StringNode } from '../../types.js';
5
- export type StringTree = (string | StringTree)[];
6
5
  /**
7
6
  * Extracts content if an expression is derivable (statically analyzable) or uses derive()
8
7
  * Returns a Node representing the parsed expression
@@ -1 +1 @@
1
- {"version":3,"file":"handleDerivation.js","names":[],"sources":["../../../../../../src/react/jsx/utils/stringParsing/derivation/handleDerivation.ts"],"sourcesContent":["import * as t from '@babel/types';\nimport { NodePath } from '@babel/traverse';\nimport { ParsingConfigOptions } from '../../../../../types/parsing.js';\nimport { parseStringExpression, nodeToStrings } from '../../parseString.js';\nimport { StringNode } from '../../types.js';\nimport { buildImportMap } from '../../buildImportMap.js';\nimport { resolveImportPath } from '../../resolveImportPath.js';\nimport { parse } from '@babel/parser';\nimport fs from 'node:fs';\nimport {\n warnFunctionNotFoundSync,\n warnDeriveFunctionNoResultsSync,\n warnDeriveFunctionNotWrappedSync,\n warnAutoderiveNoResultsSync,\n} from '../../../../../console/index.js';\n\nimport traverseModule from '@babel/traverse';\nimport generateModule from '@babel/generator';\nimport { isDeriveCall } from './isDeriveCall.js';\n// Handle CommonJS/ESM interop\nconst traverse = traverseModule.default || traverseModule;\nconst generate = generateModule.default || generateModule;\n\n// Nested arrays of strings (deprecated - kept for backwards compatibility)\nexport type StringTree = (string | StringTree)[];\n\n/**\n * Cache for resolved import paths to avoid redundant I/O operations.\n * Key: `${currentFile}::${importPath}`\n * Value: resolved absolute path or null\n */\nconst resolveImportPathCache = new Map<string, string | null>();\n\n/**\n * Cache for processed functions to avoid re-parsing the same files.\n * Key: `${filePath}::${functionName}`\n * Value: Node result or null\n */\nconst processFunctionCache = new Map<string, StringNode | null>();\n\n/**\n * Extracts content if an expression is derivable (statically analyzable) or uses derive()\n * Returns a Node representing the parsed expression\n * @param expr - The expression to check\n * @param tPath - NodePath for scope resolution\n * @param file - Current file path\n * @param parsingOptions - Parsing configuration\n * @param errors - Errors to add to\n * @param runtimeInterpolationState - When provided, non-derive dynamic expressions become {n} placeholders instead of errors. Pass { index: 0 } at the entry point for template macros.\n * @param skipDeriveInvocation - If true, skip derive invocation check\n * @returns Node | null - The parsed node, or null if invalid\n *\n * @note runtimeInterpolationState\n * - Only provide at entry for template macros, otherwise omit\n * - t`Hello {nonDerivableValue}` -> t`Hello {0}`\n *\n */\nexport function handleDerivation({\n expr,\n tPath,\n file,\n parsingOptions,\n errors,\n warnings,\n runtimeInterpolationState,\n skipDeriveInvocation,\n}: {\n expr: t.Expression;\n tPath: NodePath;\n file: string;\n parsingOptions: ParsingConfigOptions;\n errors: string[];\n warnings: Set<string>;\n runtimeInterpolationState?: { index: number };\n skipDeriveInvocation?: boolean;\n}): StringNode | null {\n if (!expr) {\n return null;\n }\n\n // Handle expressions\n if (t.isCallExpression(expr)) {\n if (isDeriveCall({ expr, tPath })) {\n const variants = getDeriveVariants({\n call: expr,\n tPath,\n file,\n parsingOptions,\n errors,\n warnings,\n });\n if (variants) {\n return {\n type: 'choice',\n nodes: variants.map((v) => ({ type: 'text', text: v })),\n };\n }\n // derive() had no resolvable results\n const code =\n expr.arguments.length > 0\n ? generate(expr.arguments[0]).code\n : 'no arguments';\n errors.push(\n warnDeriveFunctionNoResultsSync(\n file,\n code,\n `${expr.loc?.start?.line}:${expr.loc?.start?.column}`\n )\n );\n return null;\n }\n // Non-derive call\n if (runtimeInterpolationState) {\n return { type: 'text', text: `{${runtimeInterpolationState.index++}}` };\n }\n const calleeName = t.isIdentifier(expr.callee)\n ? expr.callee.name\n : generate(expr.callee).code;\n errors.push(\n warnDeriveFunctionNotWrappedSync(\n file,\n calleeName,\n `${expr.callee.loc?.start?.line}:${expr.callee.loc?.start?.column}`\n )\n );\n return null;\n }\n\n // Handle direct string literals\n if (t.isStringLiteral(expr)) {\n return { type: 'text', text: expr.value };\n }\n\n // Handle template literals\n if (t.isTemplateLiteral(expr)) {\n const parts: StringNode[] = [];\n for (let index = 0; index < expr.quasis.length; index++) {\n const quasi = expr.quasis[index];\n const text = quasi.value.cooked ?? quasi.value.raw ?? '';\n if (text) {\n parts.push({ type: 'text', text });\n }\n const exprNode = expr.expressions[index];\n if (exprNode && t.isExpression(exprNode)) {\n if (isDeriveCall({ expr: exprNode, tPath })) {\n // Derive — resolve fully (no runtime interpolation forwarding)\n const result = handleDerivation({\n expr: exprNode,\n tPath,\n file,\n parsingOptions,\n errors,\n warnings,\n });\n if (result === null) return null;\n parts.push(result);\n } else {\n // Non-derive — recurse with runtime interpolation forwarded\n const result = handleDerivation({\n expr: exprNode,\n tPath,\n file,\n parsingOptions,\n errors,\n warnings,\n runtimeInterpolationState,\n skipDeriveInvocation,\n });\n if (result === null) return null;\n parts.push(result);\n }\n }\n }\n\n if (parts.length === 0) {\n return { type: 'text', text: '' };\n }\n if (parts.length === 1) {\n return parts[0];\n }\n return { type: 'sequence', nodes: parts };\n }\n\n // Handle binary expressions\n if (t.isBinaryExpression(expr) && expr.operator === '+') {\n if (!t.isExpression(expr.left) || !t.isExpression(expr.right)) {\n return null;\n }\n const leftResult = handleDerivation({\n expr: expr.left,\n tPath,\n file,\n parsingOptions,\n errors,\n warnings,\n runtimeInterpolationState,\n skipDeriveInvocation,\n });\n const rightResult = handleDerivation({\n expr: expr.right,\n tPath,\n file,\n parsingOptions,\n errors,\n warnings,\n runtimeInterpolationState,\n skipDeriveInvocation,\n });\n\n if (leftResult === null || rightResult === null) {\n return null;\n }\n\n return { type: 'sequence', nodes: [leftResult, rightResult] };\n }\n\n // Handle parenthesized expressions\n if (t.isParenthesizedExpression(expr)) {\n return handleDerivation({\n expr: expr.expression,\n tPath,\n file,\n parsingOptions,\n errors,\n warnings,\n runtimeInterpolationState,\n skipDeriveInvocation,\n });\n }\n\n // Handle numeric literals by converting them to strings\n if (t.isNumericLiteral(expr)) {\n return { type: 'text', text: String(expr.value) };\n }\n\n // Handle unary expressions by converting them to strings\n if (t.isUnaryExpression(expr)) {\n let operator = '';\n if (expr.operator === '-') {\n operator = expr.operator;\n }\n if (t.isNumericLiteral(expr.argument)) {\n if (expr.argument.value === 0) {\n return { type: 'text', text: '0' };\n } else {\n return {\n type: 'text',\n text: operator + expr.argument.value.toString(),\n };\n }\n } else {\n // invalid\n return null;\n }\n }\n\n // Handle boolean literals by converting them to strings\n if (t.isBooleanLiteral(expr)) {\n return { type: 'text', text: String(expr.value) };\n }\n\n // Handle null literal\n if (t.isNullLiteral(expr)) {\n return { type: 'text', text: 'null' };\n }\n\n // Non-static expression\n if (skipDeriveInvocation) {\n // Skip pass a `derive()` invocation to do derivation\n const variants = resolveCallStringVariants(\n expr,\n tPath,\n file,\n parsingOptions,\n errors,\n warnings\n );\n if (variants) {\n return {\n type: 'choice',\n nodes: variants.map((v) => ({ type: 'text', text: v })),\n };\n }\n // Autoderive had no resolvable results\n const code = generate(expr).code;\n errors.push(\n warnAutoderiveNoResultsSync(\n file,\n code,\n `${expr.loc?.start?.line}:${expr.loc?.start?.column}`\n )\n );\n return null;\n }\n\n // Not a derivable expression\n if (runtimeInterpolationState) {\n return { type: 'text', text: `{${runtimeInterpolationState.index++}}` };\n }\n return null;\n}\n\n/**\n * Given a CallExpression, if it is derive(<call>) or derive(await <call>),\n * return all possible string outcomes of that argument call as an array of strings.\n *\n * Examples:\n * derive(time()) -> [\"day\", \"night\"]\n * derive(await time()) -> [\"day\", \"night\"]\n *\n * Returns null if it can't be resolved.\n */\nfunction getDeriveVariants<T extends t.CallExpression = t.CallExpression>({\n call,\n tPath,\n file,\n parsingOptions,\n errors,\n warnings,\n}: {\n call: T;\n tPath: NodePath;\n file: string;\n parsingOptions: ParsingConfigOptions;\n errors: string[];\n warnings: Set<string>;\n}): string[] | null {\n // --- Validate Callee --- //\n\n // Must be a derive(...) call or an alias of it\n if (!isDeriveCall({ expr: call, tPath })) {\n const calleeName = t.isIdentifier(call.callee)\n ? call.callee.name\n : generate(call.callee).code;\n errors.push(\n warnDeriveFunctionNotWrappedSync(\n file,\n calleeName,\n `${call.callee.loc?.start?.line}:${call.callee.loc?.start?.column}`\n )\n );\n return null;\n }\n\n // --- Validate Arguments --- //\n\n if (call.arguments.length !== 1) return null;\n\n const arg = call.arguments[0];\n if (!t.isExpression(arg)) return null;\n\n // Handle await expression: derive(await time())\n if (t.isAwaitExpression(arg)) {\n // Resolve the inner call's possible string outcomes\n return resolveCallStringVariants(\n arg.argument,\n tPath,\n file,\n parsingOptions,\n errors,\n warnings\n );\n }\n // Handle call expression: derive(time())\n if (t.isCallExpression(arg)) {\n return resolveCallStringVariants(\n arg,\n tPath,\n file,\n parsingOptions,\n errors,\n warnings\n );\n }\n // Handle other expressions (ternary, string literal, etc.) by recursing into handleDerivation\n const node = handleDerivation({\n expr: arg,\n tPath,\n file,\n parsingOptions,\n errors,\n warnings,\n skipDeriveInvocation: true,\n });\n if (node) {\n return nodeToStrings(node);\n }\n return null;\n}\n\nfunction resolveCallStringVariants(\n expression: t.Expression,\n tPath: NodePath,\n file: string,\n parsingOptions: ParsingConfigOptions,\n errors: string[],\n warnings: Set<string>\n): string[] | null {\n // Handle function identifier calls: derive(time())\n if (t.isCallExpression(expression) && t.isIdentifier(expression.callee)) {\n const functionName = expression.callee.name;\n\n // Use Binding to resolve the function\n const calleeBinding = tPath.scope.getBinding(functionName);\n\n if (calleeBinding) {\n // Check if the binding itself is an import (not just if the name exists in imports)\n const isImportBinding =\n calleeBinding.path.isImportSpecifier() ||\n calleeBinding.path.isImportDefaultSpecifier() ||\n calleeBinding.path.isImportNamespaceSpecifier();\n\n if (isImportBinding) {\n // Function is imported - resolve cross-file\n const importedFunctionsMap = buildImportMap(\n tPath.scope.getProgramParent().path\n );\n\n let originalName: string | undefined;\n if (calleeBinding.path.isImportSpecifier()) {\n originalName = t.isIdentifier(calleeBinding.path.node.imported)\n ? calleeBinding.path.node.imported.name\n : calleeBinding.path.node.imported.value;\n } else if (calleeBinding.path.isImportDefaultSpecifier()) {\n originalName = calleeBinding.path.node.local.name;\n } else if (calleeBinding.path.isImportNamespaceSpecifier()) {\n originalName = calleeBinding.path.node.local.name;\n }\n\n const importPath = importedFunctionsMap.get(functionName);\n if (importPath) {\n const filePath = resolveImportPath(\n file,\n importPath,\n parsingOptions,\n resolveImportPathCache\n );\n\n if (filePath && originalName) {\n const node = resolveFunctionInFile(\n filePath,\n originalName,\n parsingOptions,\n errors,\n warnings\n );\n if (node) {\n return nodeToStrings(node);\n }\n }\n }\n } else {\n // Function is local - use parseStringExpression with resolveFunctionCall\n const node = resolveFunctionCallFromBinding(\n calleeBinding,\n tPath,\n file,\n parsingOptions,\n warnings,\n errors\n );\n if (node) {\n return nodeToStrings(node);\n }\n }\n } else {\n // Function not found in scope\n errors.push(\n warnFunctionNotFoundSync(\n file,\n functionName,\n `${expression.callee.loc?.start?.line}:${expression.callee.loc?.start?.column}`\n )\n );\n return null;\n }\n }\n\n // If we get here: analyze this call as derivable (statically analyzable)\n const node = parseStringExpression(\n expression,\n tPath,\n file,\n parsingOptions,\n warnings,\n errors\n );\n if (node) {\n return nodeToStrings(node);\n }\n return null;\n}\n\n/**\n * Resolves a function from a binding (local function) using parseStringExpression logic\n */\nfunction resolveFunctionCallFromBinding(\n calleeBinding: ReturnType<NodePath['scope']['getBinding']>,\n tPath: NodePath,\n file: string,\n parsingOptions: ParsingConfigOptions,\n warnings: Set<string>,\n errors: string[]\n): StringNode | null {\n if (!calleeBinding) {\n return null;\n }\n\n const bindingPath = calleeBinding.path;\n const branches: StringNode[] = [];\n\n // Handle function declarations: function time() { return \"day\"; }\n if (bindingPath.isFunctionDeclaration()) {\n bindingPath.traverse({\n ReturnStatement(returnPath) {\n // Only process return statements that are direct children of this function\n const parentFunction = returnPath.getFunctionParent();\n if (parentFunction?.node !== bindingPath.node) {\n return;\n }\n\n const returnArg = returnPath.node.argument;\n if (!returnArg || !t.isExpression(returnArg)) {\n return;\n }\n const returnResult = parseStringExpression(\n returnArg,\n returnPath,\n file,\n parsingOptions,\n warnings,\n errors\n );\n if (returnResult !== null) {\n branches.push(returnResult);\n }\n },\n });\n }\n // Handle arrow functions: const time = () => \"day\"\n else if (bindingPath.isVariableDeclarator()) {\n const init = bindingPath.get('init');\n if (!init.isArrowFunctionExpression()) {\n return null;\n }\n\n const body = init.get('body');\n\n // Handle expression body: () => \"day\"\n if (body.isExpression()) {\n const bodyResult = parseStringExpression(\n body.node,\n body,\n file,\n parsingOptions,\n warnings,\n errors\n );\n if (bodyResult !== null) {\n branches.push(bodyResult);\n }\n }\n // Handle block body: () => { return \"day\"; }\n else if (body.isBlockStatement()) {\n const arrowFunction = init.node;\n body.traverse({\n ReturnStatement(returnPath) {\n // Only process return statements that are direct children of this function\n const parentFunction = returnPath.getFunctionParent();\n if (parentFunction?.node !== arrowFunction) {\n return;\n }\n\n const returnArg = returnPath.node.argument;\n if (!returnArg || !t.isExpression(returnArg)) {\n return;\n }\n const returnResult = parseStringExpression(\n returnArg,\n returnPath,\n file,\n parsingOptions,\n warnings,\n errors\n );\n if (returnResult !== null) {\n branches.push(returnResult);\n }\n },\n });\n }\n }\n\n if (branches.length === 0) {\n return null;\n }\n\n if (branches.length === 1) {\n return branches[0];\n }\n\n return { type: 'choice', nodes: branches };\n}\n\n/**\n * Resolves a function definition in an external file\n */\nfunction resolveFunctionInFile(\n filePath: string,\n functionName: string,\n parsingOptions: ParsingConfigOptions,\n errors: string[],\n warnings: Set<string>\n): StringNode | null {\n // Check cache first\n const cacheKey = `${filePath}::${functionName}`;\n if (processFunctionCache.has(cacheKey)) {\n return processFunctionCache.get(cacheKey) ?? null;\n }\n\n let result: StringNode | null = null;\n\n try {\n const code = fs.readFileSync(filePath, 'utf8');\n const ast = parse(code, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript'],\n });\n\n traverse(ast, {\n // Handle re-exports: export * from './utils'\n ExportAllDeclaration(path) {\n // Only follow re-exports if we haven't found the function yet\n if (result !== null) return;\n\n if (t.isStringLiteral(path.node.source)) {\n const reexportPath = path.node.source.value;\n const resolvedPath = resolveImportPath(\n filePath,\n reexportPath,\n parsingOptions,\n resolveImportPathCache\n );\n\n if (resolvedPath) {\n // Recursively resolve in the re-exported file\n const reexportResult = resolveFunctionInFile(\n resolvedPath,\n functionName,\n parsingOptions,\n errors,\n warnings\n );\n if (reexportResult) {\n result = reexportResult;\n }\n }\n }\n },\n // Handle named re-exports: export { fn1 } from './utils'\n ExportNamedDeclaration(path) {\n // Only follow re-exports if we haven't found the function yet\n if (result !== null) return;\n\n // Check if this is a re-export with a source\n if (path.node.source && t.isStringLiteral(path.node.source)) {\n // Check if any of the exported specifiers match our function name\n const hasMatchingExport = path.node.specifiers.some((spec) => {\n if (t.isExportSpecifier(spec)) {\n const exportedName = t.isIdentifier(spec.exported)\n ? spec.exported.name\n : spec.exported.value;\n return exportedName === functionName;\n }\n return false;\n });\n\n if (hasMatchingExport) {\n const reexportPath = path.node.source.value;\n const resolvedPath = resolveImportPath(\n filePath,\n reexportPath,\n parsingOptions,\n resolveImportPathCache\n );\n\n if (resolvedPath) {\n // Find the original name in case it was renamed\n const specifier = path.node.specifiers.find((spec) => {\n if (t.isExportSpecifier(spec)) {\n const exportedName = t.isIdentifier(spec.exported)\n ? spec.exported.name\n : spec.exported.value;\n return exportedName === functionName;\n }\n return false;\n });\n\n let originalName = functionName;\n if (\n specifier &&\n t.isExportSpecifier(specifier) &&\n t.isIdentifier(specifier.local)\n ) {\n originalName = specifier.local.name;\n }\n\n // Recursively resolve in the re-exported file\n const reexportResult = resolveFunctionInFile(\n resolvedPath,\n originalName,\n parsingOptions,\n errors,\n warnings\n );\n if (reexportResult) {\n result = reexportResult;\n }\n }\n }\n }\n },\n // Handle function declarations: function woah() { ... }\n FunctionDeclaration(path) {\n if (path.node.id?.name === functionName && result === null) {\n const branches: StringNode[] = [];\n path.traverse({\n Function(innerPath) {\n // Skip nested functions\n innerPath.skip();\n },\n ReturnStatement(returnPath: NodePath) {\n if (!t.isReturnStatement(returnPath.node)) {\n return;\n }\n const returnArg = returnPath.node.argument;\n if (!returnArg || !t.isExpression(returnArg)) {\n return;\n }\n const returnResult = parseStringExpression(\n returnArg,\n returnPath,\n filePath,\n parsingOptions,\n warnings,\n errors\n );\n if (returnResult !== null) {\n branches.push(returnResult);\n }\n },\n });\n\n if (branches.length === 1) {\n result = branches[0];\n } else if (branches.length > 1) {\n result = { type: 'choice', nodes: branches };\n }\n }\n },\n // Handle variable declarations: const woah = () => { ... }\n VariableDeclarator(path) {\n if (\n t.isIdentifier(path.node.id) &&\n path.node.id.name === functionName &&\n path.node.init &&\n (t.isArrowFunctionExpression(path.node.init) ||\n t.isFunctionExpression(path.node.init)) &&\n result === null\n ) {\n const init = path.get('init');\n if (\n !init.isArrowFunctionExpression() &&\n !init.isFunctionExpression()\n ) {\n return;\n }\n\n const bodyPath = init.get('body');\n const branches: StringNode[] = [];\n\n // Handle expression body: () => \"day\"\n if (!Array.isArray(bodyPath) && t.isExpression(bodyPath.node)) {\n const bodyResult = parseStringExpression(\n bodyPath.node,\n bodyPath,\n filePath,\n parsingOptions,\n warnings,\n errors\n );\n if (bodyResult !== null) {\n branches.push(bodyResult);\n }\n }\n // Handle block body: () => { return \"day\"; }\n else if (\n !Array.isArray(bodyPath) &&\n t.isBlockStatement(bodyPath.node)\n ) {\n const arrowFunction = init.node;\n bodyPath.traverse({\n Function(innerPath: NodePath) {\n // Skip nested functions\n innerPath.skip();\n },\n ReturnStatement(returnPath: NodePath) {\n // Only process return statements that are direct children of this function\n const parentFunction = returnPath.getFunctionParent();\n if (parentFunction?.node !== arrowFunction) {\n return;\n }\n\n if (!t.isReturnStatement(returnPath.node)) {\n return;\n }\n const returnArg = returnPath.node.argument;\n if (!returnArg || !t.isExpression(returnArg)) {\n return;\n }\n const returnResult = parseStringExpression(\n returnArg,\n returnPath,\n filePath,\n parsingOptions,\n warnings,\n errors\n );\n if (returnResult !== null) {\n branches.push(returnResult);\n }\n },\n });\n }\n\n if (branches.length === 1) {\n result = branches[0];\n } else if (branches.length > 1) {\n result = { type: 'choice', nodes: branches };\n }\n }\n },\n });\n } catch (error) {\n // File read or parse error - return null\n errors.push(\n warnDeriveFunctionNoResultsSync(\n filePath,\n functionName,\n 'file read/parse error: ' + error\n )\n );\n result = null;\n }\n\n // Cache the result\n processFunctionCache.set(cacheKey, result);\n return result;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"handleDerivation.js","names":[],"sources":["../../../../../../src/react/jsx/utils/stringParsing/derivation/handleDerivation.ts"],"sourcesContent":["import * as t from '@babel/types';\nimport { NodePath } from '@babel/traverse';\nimport { ParsingConfigOptions } from '../../../../../types/parsing.js';\nimport { parseStringExpression, nodeToStrings } from '../../parseString.js';\nimport { StringNode } from '../../types.js';\nimport { buildImportMap } from '../../buildImportMap.js';\nimport { resolveImportPath } from '../../resolveImportPath.js';\nimport { parse } from '@babel/parser';\nimport fs from 'node:fs';\nimport {\n warnFunctionNotFoundSync,\n warnDeriveFunctionNoResultsSync,\n warnDeriveFunctionNotWrappedSync,\n warnAutoderiveNoResultsSync,\n} from '../../../../../console/index.js';\n\nimport traverseModule from '@babel/traverse';\nimport generateModule from '@babel/generator';\nimport { isDeriveCall } from './isDeriveCall.js';\n// Handle CommonJS/ESM interop\nconst traverse = traverseModule.default || traverseModule;\nconst generate = generateModule.default || generateModule;\n\n/**\n * Cache for resolved import paths to avoid redundant I/O operations.\n * Key: `${currentFile}::${importPath}`\n * Value: resolved absolute path or null\n */\nconst resolveImportPathCache = new Map<string, string | null>();\n\n/**\n * Cache for processed functions to avoid re-parsing the same files.\n * Key: `${filePath}::${functionName}`\n * Value: Node result or null\n */\nconst processFunctionCache = new Map<string, StringNode | null>();\n\n/**\n * Extracts content if an expression is derivable (statically analyzable) or uses derive()\n * Returns a Node representing the parsed expression\n * @param expr - The expression to check\n * @param tPath - NodePath for scope resolution\n * @param file - Current file path\n * @param parsingOptions - Parsing configuration\n * @param errors - Errors to add to\n * @param runtimeInterpolationState - When provided, non-derive dynamic expressions become {n} placeholders instead of errors. Pass { index: 0 } at the entry point for template macros.\n * @param skipDeriveInvocation - If true, skip derive invocation check\n * @returns Node | null - The parsed node, or null if invalid\n *\n * @note runtimeInterpolationState\n * - Only provide at entry for template macros, otherwise omit\n * - t`Hello {nonDerivableValue}` -> t`Hello {0}`\n *\n */\nexport function handleDerivation({\n expr,\n tPath,\n file,\n parsingOptions,\n errors,\n warnings,\n runtimeInterpolationState,\n skipDeriveInvocation,\n}: {\n expr: t.Expression;\n tPath: NodePath;\n file: string;\n parsingOptions: ParsingConfigOptions;\n errors: string[];\n warnings: Set<string>;\n runtimeInterpolationState?: { index: number };\n skipDeriveInvocation?: boolean;\n}): StringNode | null {\n if (!expr) {\n return null;\n }\n\n // Handle expressions\n if (t.isCallExpression(expr)) {\n if (isDeriveCall({ expr, tPath })) {\n const variants = getDeriveVariants({\n call: expr,\n tPath,\n file,\n parsingOptions,\n errors,\n warnings,\n });\n if (variants) {\n return {\n type: 'choice',\n nodes: variants.map((v) => ({ type: 'text', text: v })),\n };\n }\n // derive() had no resolvable results\n const code =\n expr.arguments.length > 0\n ? generate(expr.arguments[0]).code\n : 'no arguments';\n errors.push(\n warnDeriveFunctionNoResultsSync(\n file,\n code,\n `${expr.loc?.start?.line}:${expr.loc?.start?.column}`\n )\n );\n return null;\n }\n // Non-derive call\n if (runtimeInterpolationState) {\n return { type: 'text', text: `{${runtimeInterpolationState.index++}}` };\n }\n const calleeName = t.isIdentifier(expr.callee)\n ? expr.callee.name\n : generate(expr.callee).code;\n errors.push(\n warnDeriveFunctionNotWrappedSync(\n file,\n calleeName,\n `${expr.callee.loc?.start?.line}:${expr.callee.loc?.start?.column}`\n )\n );\n return null;\n }\n\n // Handle direct string literals\n if (t.isStringLiteral(expr)) {\n return { type: 'text', text: expr.value };\n }\n\n // Handle template literals\n if (t.isTemplateLiteral(expr)) {\n const parts: StringNode[] = [];\n for (let index = 0; index < expr.quasis.length; index++) {\n const quasi = expr.quasis[index];\n const text = quasi.value.cooked ?? quasi.value.raw ?? '';\n if (text) {\n parts.push({ type: 'text', text });\n }\n const exprNode = expr.expressions[index];\n if (exprNode && t.isExpression(exprNode)) {\n if (isDeriveCall({ expr: exprNode, tPath })) {\n // Derive — resolve fully (no runtime interpolation forwarding)\n const result = handleDerivation({\n expr: exprNode,\n tPath,\n file,\n parsingOptions,\n errors,\n warnings,\n });\n if (result === null) return null;\n parts.push(result);\n } else {\n // Non-derive — recurse with runtime interpolation forwarded\n const result = handleDerivation({\n expr: exprNode,\n tPath,\n file,\n parsingOptions,\n errors,\n warnings,\n runtimeInterpolationState,\n skipDeriveInvocation,\n });\n if (result === null) return null;\n parts.push(result);\n }\n }\n }\n\n if (parts.length === 0) {\n return { type: 'text', text: '' };\n }\n if (parts.length === 1) {\n return parts[0];\n }\n return { type: 'sequence', nodes: parts };\n }\n\n // Handle binary expressions\n if (t.isBinaryExpression(expr) && expr.operator === '+') {\n if (!t.isExpression(expr.left) || !t.isExpression(expr.right)) {\n return null;\n }\n const leftResult = handleDerivation({\n expr: expr.left,\n tPath,\n file,\n parsingOptions,\n errors,\n warnings,\n runtimeInterpolationState,\n skipDeriveInvocation,\n });\n const rightResult = handleDerivation({\n expr: expr.right,\n tPath,\n file,\n parsingOptions,\n errors,\n warnings,\n runtimeInterpolationState,\n skipDeriveInvocation,\n });\n\n if (leftResult === null || rightResult === null) {\n return null;\n }\n\n return { type: 'sequence', nodes: [leftResult, rightResult] };\n }\n\n // Handle parenthesized expressions\n if (t.isParenthesizedExpression(expr)) {\n return handleDerivation({\n expr: expr.expression,\n tPath,\n file,\n parsingOptions,\n errors,\n warnings,\n runtimeInterpolationState,\n skipDeriveInvocation,\n });\n }\n\n // Handle numeric literals by converting them to strings\n if (t.isNumericLiteral(expr)) {\n return { type: 'text', text: String(expr.value) };\n }\n\n // Handle unary expressions by converting them to strings\n if (t.isUnaryExpression(expr)) {\n let operator = '';\n if (expr.operator === '-') {\n operator = expr.operator;\n }\n if (t.isNumericLiteral(expr.argument)) {\n if (expr.argument.value === 0) {\n return { type: 'text', text: '0' };\n } else {\n return {\n type: 'text',\n text: operator + expr.argument.value.toString(),\n };\n }\n } else {\n // invalid\n return null;\n }\n }\n\n // Handle boolean literals by converting them to strings\n if (t.isBooleanLiteral(expr)) {\n return { type: 'text', text: String(expr.value) };\n }\n\n // Handle null literal\n if (t.isNullLiteral(expr)) {\n return { type: 'text', text: 'null' };\n }\n\n // Non-static expression\n if (skipDeriveInvocation) {\n // Skip pass a `derive()` invocation to do derivation\n const variants = resolveCallStringVariants(\n expr,\n tPath,\n file,\n parsingOptions,\n errors,\n warnings\n );\n if (variants) {\n return {\n type: 'choice',\n nodes: variants.map((v) => ({ type: 'text', text: v })),\n };\n }\n // Autoderive had no resolvable results\n const code = generate(expr).code;\n errors.push(\n warnAutoderiveNoResultsSync(\n file,\n code,\n `${expr.loc?.start?.line}:${expr.loc?.start?.column}`\n )\n );\n return null;\n }\n\n // Not a derivable expression\n if (runtimeInterpolationState) {\n return { type: 'text', text: `{${runtimeInterpolationState.index++}}` };\n }\n return null;\n}\n\n/**\n * Given a CallExpression, if it is derive(<call>) or derive(await <call>),\n * return all possible string outcomes of that argument call as an array of strings.\n *\n * Examples:\n * derive(time()) -> [\"day\", \"night\"]\n * derive(await time()) -> [\"day\", \"night\"]\n *\n * Returns null if it can't be resolved.\n */\nfunction getDeriveVariants<T extends t.CallExpression = t.CallExpression>({\n call,\n tPath,\n file,\n parsingOptions,\n errors,\n warnings,\n}: {\n call: T;\n tPath: NodePath;\n file: string;\n parsingOptions: ParsingConfigOptions;\n errors: string[];\n warnings: Set<string>;\n}): string[] | null {\n // --- Validate Callee --- //\n\n // Must be a derive(...) call or an alias of it\n if (!isDeriveCall({ expr: call, tPath })) {\n const calleeName = t.isIdentifier(call.callee)\n ? call.callee.name\n : generate(call.callee).code;\n errors.push(\n warnDeriveFunctionNotWrappedSync(\n file,\n calleeName,\n `${call.callee.loc?.start?.line}:${call.callee.loc?.start?.column}`\n )\n );\n return null;\n }\n\n // --- Validate Arguments --- //\n\n if (call.arguments.length !== 1) return null;\n\n const arg = call.arguments[0];\n if (!t.isExpression(arg)) return null;\n\n // Handle await expression: derive(await time())\n if (t.isAwaitExpression(arg)) {\n // Resolve the inner call's possible string outcomes\n return resolveCallStringVariants(\n arg.argument,\n tPath,\n file,\n parsingOptions,\n errors,\n warnings\n );\n }\n // Handle call expression: derive(time())\n if (t.isCallExpression(arg)) {\n return resolveCallStringVariants(\n arg,\n tPath,\n file,\n parsingOptions,\n errors,\n warnings\n );\n }\n // Handle other expressions (ternary, string literal, etc.) by recursing into handleDerivation\n const node = handleDerivation({\n expr: arg,\n tPath,\n file,\n parsingOptions,\n errors,\n warnings,\n skipDeriveInvocation: true,\n });\n if (node) {\n return nodeToStrings(node);\n }\n return null;\n}\n\nfunction resolveCallStringVariants(\n expression: t.Expression,\n tPath: NodePath,\n file: string,\n parsingOptions: ParsingConfigOptions,\n errors: string[],\n warnings: Set<string>\n): string[] | null {\n // Handle function identifier calls: derive(time())\n if (t.isCallExpression(expression) && t.isIdentifier(expression.callee)) {\n const functionName = expression.callee.name;\n\n // Use Binding to resolve the function\n const calleeBinding = tPath.scope.getBinding(functionName);\n\n if (calleeBinding) {\n // Check if the binding itself is an import (not just if the name exists in imports)\n const isImportBinding =\n calleeBinding.path.isImportSpecifier() ||\n calleeBinding.path.isImportDefaultSpecifier() ||\n calleeBinding.path.isImportNamespaceSpecifier();\n\n if (isImportBinding) {\n // Function is imported - resolve cross-file\n const importedFunctionsMap = buildImportMap(\n tPath.scope.getProgramParent().path\n );\n\n let originalName: string | undefined;\n if (calleeBinding.path.isImportSpecifier()) {\n originalName = t.isIdentifier(calleeBinding.path.node.imported)\n ? calleeBinding.path.node.imported.name\n : calleeBinding.path.node.imported.value;\n } else if (calleeBinding.path.isImportDefaultSpecifier()) {\n originalName = calleeBinding.path.node.local.name;\n } else if (calleeBinding.path.isImportNamespaceSpecifier()) {\n originalName = calleeBinding.path.node.local.name;\n }\n\n const importPath = importedFunctionsMap.get(functionName);\n if (importPath) {\n const filePath = resolveImportPath(\n file,\n importPath,\n parsingOptions,\n resolveImportPathCache\n );\n\n if (filePath && originalName) {\n const node = resolveFunctionInFile(\n filePath,\n originalName,\n parsingOptions,\n errors,\n warnings\n );\n if (node) {\n return nodeToStrings(node);\n }\n }\n }\n } else {\n // Function is local - use parseStringExpression with resolveFunctionCall\n const node = resolveFunctionCallFromBinding(\n calleeBinding,\n tPath,\n file,\n parsingOptions,\n warnings,\n errors\n );\n if (node) {\n return nodeToStrings(node);\n }\n }\n } else {\n // Function not found in scope\n errors.push(\n warnFunctionNotFoundSync(\n file,\n functionName,\n `${expression.callee.loc?.start?.line}:${expression.callee.loc?.start?.column}`\n )\n );\n return null;\n }\n }\n\n // If we get here: analyze this call as derivable (statically analyzable)\n const node = parseStringExpression(\n expression,\n tPath,\n file,\n parsingOptions,\n warnings,\n errors\n );\n if (node) {\n return nodeToStrings(node);\n }\n return null;\n}\n\n/**\n * Resolves a function from a binding (local function) using parseStringExpression logic\n */\nfunction resolveFunctionCallFromBinding(\n calleeBinding: ReturnType<NodePath['scope']['getBinding']>,\n tPath: NodePath,\n file: string,\n parsingOptions: ParsingConfigOptions,\n warnings: Set<string>,\n errors: string[]\n): StringNode | null {\n if (!calleeBinding) {\n return null;\n }\n\n const bindingPath = calleeBinding.path;\n const branches: StringNode[] = [];\n\n // Handle function declarations: function time() { return \"day\"; }\n if (bindingPath.isFunctionDeclaration()) {\n bindingPath.traverse({\n ReturnStatement(returnPath) {\n // Only process return statements that are direct children of this function\n const parentFunction = returnPath.getFunctionParent();\n if (parentFunction?.node !== bindingPath.node) {\n return;\n }\n\n const returnArg = returnPath.node.argument;\n if (!returnArg || !t.isExpression(returnArg)) {\n return;\n }\n const returnResult = parseStringExpression(\n returnArg,\n returnPath,\n file,\n parsingOptions,\n warnings,\n errors\n );\n if (returnResult !== null) {\n branches.push(returnResult);\n }\n },\n });\n }\n // Handle arrow functions: const time = () => \"day\"\n else if (bindingPath.isVariableDeclarator()) {\n const init = bindingPath.get('init');\n if (!init.isArrowFunctionExpression()) {\n return null;\n }\n\n const body = init.get('body');\n\n // Handle expression body: () => \"day\"\n if (body.isExpression()) {\n const bodyResult = parseStringExpression(\n body.node,\n body,\n file,\n parsingOptions,\n warnings,\n errors\n );\n if (bodyResult !== null) {\n branches.push(bodyResult);\n }\n }\n // Handle block body: () => { return \"day\"; }\n else if (body.isBlockStatement()) {\n const arrowFunction = init.node;\n body.traverse({\n ReturnStatement(returnPath) {\n // Only process return statements that are direct children of this function\n const parentFunction = returnPath.getFunctionParent();\n if (parentFunction?.node !== arrowFunction) {\n return;\n }\n\n const returnArg = returnPath.node.argument;\n if (!returnArg || !t.isExpression(returnArg)) {\n return;\n }\n const returnResult = parseStringExpression(\n returnArg,\n returnPath,\n file,\n parsingOptions,\n warnings,\n errors\n );\n if (returnResult !== null) {\n branches.push(returnResult);\n }\n },\n });\n }\n }\n\n if (branches.length === 0) {\n return null;\n }\n\n if (branches.length === 1) {\n return branches[0];\n }\n\n return { type: 'choice', nodes: branches };\n}\n\n/**\n * Resolves a function definition in an external file\n */\nfunction resolveFunctionInFile(\n filePath: string,\n functionName: string,\n parsingOptions: ParsingConfigOptions,\n errors: string[],\n warnings: Set<string>\n): StringNode | null {\n // Check cache first\n const cacheKey = `${filePath}::${functionName}`;\n if (processFunctionCache.has(cacheKey)) {\n return processFunctionCache.get(cacheKey) ?? null;\n }\n\n let result: StringNode | null = null;\n\n try {\n const code = fs.readFileSync(filePath, 'utf8');\n const ast = parse(code, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript'],\n });\n\n traverse(ast, {\n // Handle re-exports: export * from './utils'\n ExportAllDeclaration(path) {\n // Only follow re-exports if we haven't found the function yet\n if (result !== null) return;\n\n if (t.isStringLiteral(path.node.source)) {\n const reexportPath = path.node.source.value;\n const resolvedPath = resolveImportPath(\n filePath,\n reexportPath,\n parsingOptions,\n resolveImportPathCache\n );\n\n if (resolvedPath) {\n // Recursively resolve in the re-exported file\n const reexportResult = resolveFunctionInFile(\n resolvedPath,\n functionName,\n parsingOptions,\n errors,\n warnings\n );\n if (reexportResult) {\n result = reexportResult;\n }\n }\n }\n },\n // Handle named re-exports: export { fn1 } from './utils'\n ExportNamedDeclaration(path) {\n // Only follow re-exports if we haven't found the function yet\n if (result !== null) return;\n\n // Check if this is a re-export with a source\n if (path.node.source && t.isStringLiteral(path.node.source)) {\n // Check if any of the exported specifiers match our function name\n const hasMatchingExport = path.node.specifiers.some((spec) => {\n if (t.isExportSpecifier(spec)) {\n const exportedName = t.isIdentifier(spec.exported)\n ? spec.exported.name\n : spec.exported.value;\n return exportedName === functionName;\n }\n return false;\n });\n\n if (hasMatchingExport) {\n const reexportPath = path.node.source.value;\n const resolvedPath = resolveImportPath(\n filePath,\n reexportPath,\n parsingOptions,\n resolveImportPathCache\n );\n\n if (resolvedPath) {\n // Find the original name in case it was renamed\n const specifier = path.node.specifiers.find((spec) => {\n if (t.isExportSpecifier(spec)) {\n const exportedName = t.isIdentifier(spec.exported)\n ? spec.exported.name\n : spec.exported.value;\n return exportedName === functionName;\n }\n return false;\n });\n\n let originalName = functionName;\n if (\n specifier &&\n t.isExportSpecifier(specifier) &&\n t.isIdentifier(specifier.local)\n ) {\n originalName = specifier.local.name;\n }\n\n // Recursively resolve in the re-exported file\n const reexportResult = resolveFunctionInFile(\n resolvedPath,\n originalName,\n parsingOptions,\n errors,\n warnings\n );\n if (reexportResult) {\n result = reexportResult;\n }\n }\n }\n }\n },\n // Handle function declarations: function woah() { ... }\n FunctionDeclaration(path) {\n if (path.node.id?.name === functionName && result === null) {\n const branches: StringNode[] = [];\n path.traverse({\n Function(innerPath) {\n // Skip nested functions\n innerPath.skip();\n },\n ReturnStatement(returnPath: NodePath) {\n if (!t.isReturnStatement(returnPath.node)) {\n return;\n }\n const returnArg = returnPath.node.argument;\n if (!returnArg || !t.isExpression(returnArg)) {\n return;\n }\n const returnResult = parseStringExpression(\n returnArg,\n returnPath,\n filePath,\n parsingOptions,\n warnings,\n errors\n );\n if (returnResult !== null) {\n branches.push(returnResult);\n }\n },\n });\n\n if (branches.length === 1) {\n result = branches[0];\n } else if (branches.length > 1) {\n result = { type: 'choice', nodes: branches };\n }\n }\n },\n // Handle variable declarations: const woah = () => { ... }\n VariableDeclarator(path) {\n if (\n t.isIdentifier(path.node.id) &&\n path.node.id.name === functionName &&\n path.node.init &&\n (t.isArrowFunctionExpression(path.node.init) ||\n t.isFunctionExpression(path.node.init)) &&\n result === null\n ) {\n const init = path.get('init');\n if (\n !init.isArrowFunctionExpression() &&\n !init.isFunctionExpression()\n ) {\n return;\n }\n\n const bodyPath = init.get('body');\n const branches: StringNode[] = [];\n\n // Handle expression body: () => \"day\"\n if (!Array.isArray(bodyPath) && t.isExpression(bodyPath.node)) {\n const bodyResult = parseStringExpression(\n bodyPath.node,\n bodyPath,\n filePath,\n parsingOptions,\n warnings,\n errors\n );\n if (bodyResult !== null) {\n branches.push(bodyResult);\n }\n }\n // Handle block body: () => { return \"day\"; }\n else if (\n !Array.isArray(bodyPath) &&\n t.isBlockStatement(bodyPath.node)\n ) {\n const arrowFunction = init.node;\n bodyPath.traverse({\n Function(innerPath: NodePath) {\n // Skip nested functions\n innerPath.skip();\n },\n ReturnStatement(returnPath: NodePath) {\n // Only process return statements that are direct children of this function\n const parentFunction = returnPath.getFunctionParent();\n if (parentFunction?.node !== arrowFunction) {\n return;\n }\n\n if (!t.isReturnStatement(returnPath.node)) {\n return;\n }\n const returnArg = returnPath.node.argument;\n if (!returnArg || !t.isExpression(returnArg)) {\n return;\n }\n const returnResult = parseStringExpression(\n returnArg,\n returnPath,\n filePath,\n parsingOptions,\n warnings,\n errors\n );\n if (returnResult !== null) {\n branches.push(returnResult);\n }\n },\n });\n }\n\n if (branches.length === 1) {\n result = branches[0];\n } else if (branches.length > 1) {\n result = { type: 'choice', nodes: branches };\n }\n }\n },\n });\n } catch (error) {\n // File read or parse error - return null\n errors.push(\n warnDeriveFunctionNoResultsSync(\n filePath,\n functionName,\n 'file read/parse error: ' + error\n )\n );\n result = null;\n }\n\n // Cache the result\n processFunctionCache.set(cacheKey, result);\n return result;\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { GT_DERIVE_STRING_FUNCTIONS } from "../../constants.js";
2
1
  import { GT_LIBRARIES } from "../../../../../types/libraries.js";
2
+ import { GT_DERIVE_STRING_FUNCTIONS } from "../../constants.js";
3
3
  import * as t from "@babel/types";
4
4
  //#region src/react/jsx/utils/stringParsing/derivation/isDeriveCall.ts
5
5
  /**
@@ -1,9 +1,9 @@
1
1
  import { logger } from "../../console/logger.js";
2
+ import { GT_LIBRARIES_UPSTREAM, REACT_LIBRARIES } from "../../types/libraries.js";
2
3
  import "../jsx/utils/constants.js";
3
4
  import { warnDeprecatedTSugarPropsSync } from "../../console/index.js";
4
5
  import { getPathsAndAliases } from "../jsx/utils/getPathsAndAliases.js";
5
6
  import { autoInsertJsxComponents, ensureTAndVarImported } from "../jsx/utils/jsxParsing/autoInsertion.js";
6
- import { GT_LIBRARIES_UPSTREAM, REACT_LIBRARIES } from "../../types/libraries.js";
7
7
  import { parseTranslationComponent } from "../jsx/utils/jsxParsing/parseJsx.js";
8
8
  import { parseStrings } from "../jsx/utils/parseStringFunction.js";
9
9
  import { matchFiles } from "../../fs/matchFiles.js";
@@ -1,7 +1,7 @@
1
+ import "../../types/libraries.js";
1
2
  import { getRelativePath } from "../../fs/findFilepath.js";
2
3
  import { isMeaningful } from "../jsx/evaluateJsx.js";
3
4
  import { createImports, generateImportMap } from "../jsx/utils/parseAst.js";
4
- import "../../types/libraries.js";
5
5
  import { matchFiles } from "../../fs/matchFiles.js";
6
6
  import { DEFAULT_SRC_PATTERNS } from "../../config/generateSettings.js";
7
7
  import { handleJsxElement } from "../jsx/wrapJsx.js";
@@ -1,8 +1,8 @@
1
1
  import { logger } from "../console/logger.js";
2
2
  import { getPackageJson, isPackageInstalled } from "../utils/packageJson.js";
3
+ import "../types/libraries.js";
3
4
  import { exitSync, promptConfirm, promptSelect } from "../console/logging.js";
4
5
  import findFilepath from "../fs/findFilepath.js";
5
- import "../types/libraries.js";
6
6
  import { loadConfig } from "../fs/config/loadConfig.js";
7
7
  import { createOrUpdateConfig } from "../fs/config/setupConfig.js";
8
8
  import { detectFormatter, formatFiles } from "../hooks/postProcess.js";
@@ -0,0 +1,12 @@
1
+ import { type InlineExtractionOutput, type PrimaryInlineExtractor } from '@generaltranslation/vue-extractor/integration';
2
+ import type { InlineLibrary } from '../types/libraries.js';
3
+ import type { GTParsingFlags, ParsingConfigOptions } from '../types/parsing.js';
4
+ export type { PrimaryInlineExtractor } from '@generaltranslation/vue-extractor/integration';
5
+ /**
6
+ * Adds package-owned Vue extraction around the existing inline extractor.
7
+ *
8
+ * Non-Vue projects immediately call the historical extractor with the same
9
+ * arguments. The standalone Vue package owns activation, source partitioning,
10
+ * compiler resolution, extraction, and cross-framework result merging.
11
+ */
12
+ export declare function extractInlineFromProject(library: InlineLibrary, filePatterns: string[] | undefined, parsingFlags: GTParsingFlags, parsingOptions: ParsingConfigOptions, extractPrimary?: PrimaryInlineExtractor, tsconfigPath?: string): Promise<InlineExtractionOutput>;
@@ -0,0 +1,37 @@
1
+ import { createDiagnosticMessage } from "generaltranslation/internal";
2
+ import { planVueExtraction } from "@generaltranslation/vue-extractor/integration";
3
+ //#region src/translation/extractInline.ts
4
+ const missingVueExtractorDiagnostic = createDiagnosticMessage({
5
+ source: "gt",
6
+ severity: "Error",
7
+ whatHappened: "The gt-vue extractor did not claim this project",
8
+ fix: "Install compatible versions of gt and @generaltranslation/vue-extractor"
9
+ });
10
+ /**
11
+ * Adds package-owned Vue extraction around the existing inline extractor.
12
+ *
13
+ * Non-Vue projects immediately call the historical extractor with the same
14
+ * arguments. The standalone Vue package owns activation, source partitioning,
15
+ * compiler resolution, extraction, and cross-framework result merging.
16
+ */
17
+ function extractInlineFromProject(library, filePatterns, parsingFlags, parsingOptions, extractPrimary, tsconfigPath) {
18
+ const plan = planVueExtraction({
19
+ library,
20
+ projectRoot: process.cwd(),
21
+ filePatterns,
22
+ includeSourceCodeContext: parsingFlags.includeSourceCodeContext,
23
+ conditionNames: parsingOptions.conditionNames,
24
+ vueCompilerOptions: parsingFlags.vueCompilerOptions,
25
+ viteConfigPath: parsingFlags.viteConfigPath,
26
+ tsconfigPath
27
+ });
28
+ if (!plan.handled) {
29
+ if (!extractPrimary) throw new Error(missingVueExtractorDiagnostic);
30
+ return extractPrimary(filePatterns);
31
+ }
32
+ return plan.run({ extractPrimary });
33
+ }
34
+ //#endregion
35
+ export { extractInlineFromProject };
36
+
37
+ //# sourceMappingURL=extractInline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractInline.js","names":[],"sources":["../../src/translation/extractInline.ts"],"sourcesContent":["import {\n planVueExtraction,\n type InlineExtractionOutput,\n type PrimaryInlineExtractor,\n} from '@generaltranslation/vue-extractor/integration';\nimport { createDiagnosticMessage } from 'generaltranslation/internal';\nimport type { InlineLibrary } from '../types/libraries.js';\nimport type { GTParsingFlags, ParsingConfigOptions } from '../types/parsing.js';\n\nexport type { PrimaryInlineExtractor } from '@generaltranslation/vue-extractor/integration';\n\nconst missingVueExtractorDiagnostic = createDiagnosticMessage({\n source: 'gt',\n severity: 'Error',\n whatHappened: 'The gt-vue extractor did not claim this project',\n fix: 'Install compatible versions of gt and @generaltranslation/vue-extractor',\n});\n\n/**\n * Adds package-owned Vue extraction around the existing inline extractor.\n *\n * Non-Vue projects immediately call the historical extractor with the same\n * arguments. The standalone Vue package owns activation, source partitioning,\n * compiler resolution, extraction, and cross-framework result merging.\n */\nexport function extractInlineFromProject(\n library: InlineLibrary,\n filePatterns: string[] | undefined,\n parsingFlags: GTParsingFlags,\n parsingOptions: ParsingConfigOptions,\n extractPrimary?: PrimaryInlineExtractor,\n tsconfigPath?: string\n): Promise<InlineExtractionOutput> {\n const plan = planVueExtraction({\n library,\n projectRoot: process.cwd(),\n filePatterns,\n includeSourceCodeContext: parsingFlags.includeSourceCodeContext,\n conditionNames: parsingOptions.conditionNames,\n vueCompilerOptions: parsingFlags.vueCompilerOptions,\n viteConfigPath: parsingFlags.viteConfigPath,\n tsconfigPath,\n });\n\n if (!plan.handled) {\n if (!extractPrimary) {\n throw new Error(missingVueExtractorDiagnostic);\n }\n return extractPrimary(filePatterns);\n }\n\n return plan.run({ extractPrimary });\n}\n"],"mappings":";;;AAWA,MAAM,gCAAgC,wBAAwB;CAC5D,QAAQ;CACR,UAAU;CACV,cAAc;CACd,KAAK;CACN,CAAC;;;;;;;;AASF,SAAgB,yBACd,SACA,cACA,cACA,gBACA,gBACA,cACiC;CACjC,MAAM,OAAO,kBAAkB;EAC7B;EACA,aAAa,QAAQ,KAAK;EAC1B;EACA,0BAA0B,aAAa;EACvC,gBAAgB,eAAe;EAC/B,oBAAoB,aAAa;EACjC,gBAAgB,aAAa;EAC7B;EACD,CAAC;AAEF,KAAI,CAAC,KAAK,SAAS;AACjB,MAAI,CAAC,eACH,OAAM,IAAI,MAAM,8BAA8B;AAEhD,SAAO,eAAe,aAAa;;AAGrC,QAAO,KAAK,IAAI,EAAE,gBAAgB,CAAC"}
@@ -1,11 +1,12 @@
1
1
  import { logger } from "../console/logger.js";
2
+ import { isPythonLibrary } from "../types/libraries.js";
2
3
  import { exitSync } from "../console/logging.js";
3
4
  import loadJSON from "../fs/loadJSON.js";
4
5
  import { createDictionaryUpdates } from "../react/parse/createDictionaryUpdates.js";
5
- import { isPythonLibrary } from "../types/libraries.js";
6
6
  import { createInlineUpdates } from "../react/parse/createInlineUpdates.js";
7
7
  import { createPythonInlineUpdates } from "../python/parse/createPythonInlineUpdates.js";
8
8
  import createESBuildConfig from "../react/config/createESBuildConfig.js";
9
+ import { extractInlineFromProject } from "./extractInline.js";
9
10
  import chalk from "chalk";
10
11
  import fs from "fs";
11
12
  //#region src/translation/parse.ts
@@ -35,7 +36,7 @@ async function createUpdates(options, src, sourceDictionary, pkg, validate, pars
35
36
  } else esbuildConfig = createESBuildConfig({});
36
37
  updates = [...updates, ...await createDictionaryUpdates(sourceDictionary, errors, warnings, esbuildConfig)];
37
38
  }
38
- const { updates: newUpdates, errors: newErrors, warnings: newWarnings } = isPythonLibrary(pkg) ? await createPythonInlineUpdates(src) : await createInlineUpdates(pkg, validate, src, parsingFlags, parsingOptions);
39
+ const { updates: newUpdates, errors: newErrors, warnings: newWarnings } = await extractInlineFromProject(pkg, src, parsingFlags, parsingOptions, pkg === "gt-vue" ? void 0 : (primaryPatterns) => isPythonLibrary(pkg) ? createPythonInlineUpdates(primaryPatterns) : createInlineUpdates(pkg, validate, primaryPatterns, parsingFlags, parsingOptions), options.jsconfig || void 0);
39
40
  errors = [...errors, ...newErrors];
40
41
  warnings = [...warnings, ...newWarnings];
41
42
  updates = [...updates, ...newUpdates];
@@ -1 +1 @@
1
- {"version":3,"file":"parse.js","names":[],"sources":["../../src/translation/parse.ts"],"sourcesContent":["import { Updates, TranslateFlags } from '../types/index.js';\nimport fs from 'fs';\nimport { logger } from '../console/logger.js';\nimport loadJSON from '../fs/loadJSON.js';\nimport { createDictionaryUpdates } from '../react/parse/createDictionaryUpdates.js';\nimport { createInlineUpdates } from '../react/parse/createInlineUpdates.js';\nimport { createPythonInlineUpdates } from '../python/parse/createPythonInlineUpdates.js';\nimport createESBuildConfig from '../react/config/createESBuildConfig.js';\nimport chalk from 'chalk';\nimport type { ParsingConfigOptions, GTParsingFlags } from '../types/parsing.js';\nimport { exitSync } from '../console/logging.js';\nimport { InlineLibrary, isPythonLibrary } from '../types/libraries.js';\n\n/**\n * Searches for gt-react or gt-next dictionary files and creates updates for them,\n * as well as inline updates for <T> tags and useGT()/getGT() calls\n *\n * @param options - The options object\n * @param sourceDictionary - The source dictionary file path\n * @param pkg - The package name\n * @returns An object containing the updates and errors\n */\nexport async function createUpdates(\n options: TranslateFlags,\n src: string[] | undefined,\n sourceDictionary: string | undefined,\n pkg: InlineLibrary,\n validate: boolean,\n parsingFlags: GTParsingFlags,\n parsingOptions: ParsingConfigOptions\n): Promise<{ updates: Updates; errors: string[]; warnings: string[] }> {\n let updates: Updates = [];\n let errors: string[] = [];\n let warnings: string[] = [];\n\n // Parse dictionary with esbuildConfig\n if (\n sourceDictionary &&\n fs.existsSync(sourceDictionary) &&\n fs.statSync(sourceDictionary).isFile()\n ) {\n if (sourceDictionary.endsWith('.json')) {\n updates = [\n ...updates,\n ...(await createDictionaryUpdates(sourceDictionary, errors, warnings)),\n ];\n } else {\n let esbuildConfig;\n if (options.jsconfig) {\n const jsconfig = loadJSON(options.jsconfig);\n if (!jsconfig) {\n logger.error(\n `Failed to resolve jsconfig.json or tsconfig.json at provided filepath: \"${options.jsconfig}\"`\n );\n exitSync(1);\n }\n esbuildConfig = createESBuildConfig(jsconfig);\n } else {\n esbuildConfig = createESBuildConfig({});\n }\n updates = [\n ...updates,\n ...(await createDictionaryUpdates(\n sourceDictionary,\n errors,\n warnings,\n esbuildConfig\n )),\n ];\n }\n }\n // Scan through project for translatable content\n const {\n updates: newUpdates,\n errors: newErrors,\n warnings: newWarnings,\n } = isPythonLibrary(pkg)\n ? await createPythonInlineUpdates(src)\n : await createInlineUpdates(\n pkg,\n validate,\n src,\n parsingFlags,\n parsingOptions\n );\n\n errors = [...errors, ...newErrors];\n warnings = [...warnings, ...newWarnings];\n updates = [...updates, ...newUpdates];\n\n // Validate user-supplied IDs without using them as translation lookup keys.\n const idHashMap = new Map<string, string>();\n const hashlessIds = new Set<string>();\n const warnedHashlessDuplicateIds = new Set<string>();\n const duplicateIds = new Set<string>();\n\n const warnHashlessDuplicateId = (id: string) => {\n if (warnedHashlessDuplicateIds.has(id)) return;\n warnings.push(\n `Duplicate id ${chalk.blue(\n id\n )} includes at least one entry without a hash. Hashless duplicate IDs cannot be compared, and later entries may overwrite earlier entries.`\n );\n warnedHashlessDuplicateIds.add(id);\n };\n\n updates = updates.map((update) => {\n const { id, hash } = update.metadata;\n if (!id) return update;\n if (!hash) {\n if (hashlessIds.has(id) || idHashMap.has(id)) {\n warnHashlessDuplicateId(id);\n }\n hashlessIds.add(id);\n return update;\n }\n\n if (hashlessIds.has(id)) {\n warnHashlessDuplicateId(id);\n }\n\n const existingHash = idHashMap.get(id);\n if (existingHash !== undefined) {\n if (existingHash !== hash) {\n errors.push(\n `Hashes don't match on two components with the same id: ${chalk.blue(\n id\n )}. Check your ${chalk.green(\n '<T>'\n )} tags and dictionary entries and make sure you're not accidentally duplicating IDs.`\n );\n duplicateIds.add(id);\n }\n } else {\n idHashMap.set(id, hash);\n }\n return update;\n });\n\n updates = updates.filter(\n (update) => !update.metadata.id || !duplicateIds.has(update.metadata.id)\n );\n\n return { updates, errors, warnings };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAsBA,eAAsB,cACpB,SACA,KACA,kBACA,KACA,UACA,cACA,gBACqE;CACrE,IAAI,UAAmB,EAAE;CACzB,IAAI,SAAmB,EAAE;CACzB,IAAI,WAAqB,EAAE;AAG3B,KACE,oBACA,GAAG,WAAW,iBAAiB,IAC/B,GAAG,SAAS,iBAAiB,CAAC,QAAQ,CAEtC,KAAI,iBAAiB,SAAS,QAAQ,CACpC,WAAU,CACR,GAAG,SACH,GAAI,MAAM,wBAAwB,kBAAkB,QAAQ,SAAS,CACtE;MACI;EACL,IAAI;AACJ,MAAI,QAAQ,UAAU;GACpB,MAAM,WAAW,SAAS,QAAQ,SAAS;AAC3C,OAAI,CAAC,UAAU;AACb,WAAO,MACL,2EAA2E,QAAQ,SAAS,GAC7F;AACD,aAAS,EAAE;;AAEb,mBAAgB,oBAAoB,SAAS;QAE7C,iBAAgB,oBAAoB,EAAE,CAAC;AAEzC,YAAU,CACR,GAAG,SACH,GAAI,MAAM,wBACR,kBACA,QACA,UACA,cACD,CACF;;CAIL,MAAM,EACJ,SAAS,YACT,QAAQ,WACR,UAAU,gBACR,gBAAgB,IAAI,GACpB,MAAM,0BAA0B,IAAI,GACpC,MAAM,oBACJ,KACA,UACA,KACA,cACA,eACD;AAEL,UAAS,CAAC,GAAG,QAAQ,GAAG,UAAU;AAClC,YAAW,CAAC,GAAG,UAAU,GAAG,YAAY;AACxC,WAAU,CAAC,GAAG,SAAS,GAAG,WAAW;CAGrC,MAAM,4BAAY,IAAI,KAAqB;CAC3C,MAAM,8BAAc,IAAI,KAAa;CACrC,MAAM,6CAA6B,IAAI,KAAa;CACpD,MAAM,+BAAe,IAAI,KAAa;CAEtC,MAAM,2BAA2B,OAAe;AAC9C,MAAI,2BAA2B,IAAI,GAAG,CAAE;AACxC,WAAS,KACP,gBAAgB,MAAM,KACpB,GACD,CAAC,0IACH;AACD,6BAA2B,IAAI,GAAG;;AAGpC,WAAU,QAAQ,KAAK,WAAW;EAChC,MAAM,EAAE,IAAI,SAAS,OAAO;AAC5B,MAAI,CAAC,GAAI,QAAO;AAChB,MAAI,CAAC,MAAM;AACT,OAAI,YAAY,IAAI,GAAG,IAAI,UAAU,IAAI,GAAG,CAC1C,yBAAwB,GAAG;AAE7B,eAAY,IAAI,GAAG;AACnB,UAAO;;AAGT,MAAI,YAAY,IAAI,GAAG,CACrB,yBAAwB,GAAG;EAG7B,MAAM,eAAe,UAAU,IAAI,GAAG;AACtC,MAAI,iBAAiB,KAAA;OACf,iBAAiB,MAAM;AACzB,WAAO,KACL,0DAA0D,MAAM,KAC9D,GACD,CAAC,eAAe,MAAM,MACrB,MACD,CAAC,qFACH;AACD,iBAAa,IAAI,GAAG;;QAGtB,WAAU,IAAI,IAAI,KAAK;AAEzB,SAAO;GACP;AAEF,WAAU,QAAQ,QACf,WAAW,CAAC,OAAO,SAAS,MAAM,CAAC,aAAa,IAAI,OAAO,SAAS,GAAG,CACzE;AAED,QAAO;EAAE;EAAS;EAAQ;EAAU"}
1
+ {"version":3,"file":"parse.js","names":[],"sources":["../../src/translation/parse.ts"],"sourcesContent":["import { Updates, TranslateFlags } from '../types/index.js';\nimport fs from 'fs';\nimport { logger } from '../console/logger.js';\nimport loadJSON from '../fs/loadJSON.js';\nimport { createDictionaryUpdates } from '../react/parse/createDictionaryUpdates.js';\nimport { createInlineUpdates } from '../react/parse/createInlineUpdates.js';\nimport { createPythonInlineUpdates } from '../python/parse/createPythonInlineUpdates.js';\nimport createESBuildConfig from '../react/config/createESBuildConfig.js';\nimport chalk from 'chalk';\nimport type { ParsingConfigOptions, GTParsingFlags } from '../types/parsing.js';\nimport { exitSync } from '../console/logging.js';\nimport {\n InlineLibrary,\n isPythonLibrary,\n Libraries,\n} from '../types/libraries.js';\nimport {\n extractInlineFromProject,\n type PrimaryInlineExtractor,\n} from './extractInline.js';\n\n/**\n * Searches for gt-react or gt-next dictionary files and creates updates for them,\n * as well as inline updates for <T> tags and useGT()/getGT() calls\n *\n * @param options - The options object\n * @param sourceDictionary - The source dictionary file path\n * @param pkg - The package name\n * @returns An object containing the updates and errors\n */\nexport async function createUpdates(\n options: TranslateFlags,\n src: string[] | undefined,\n sourceDictionary: string | undefined,\n pkg: InlineLibrary,\n validate: boolean,\n parsingFlags: GTParsingFlags,\n parsingOptions: ParsingConfigOptions\n): Promise<{ updates: Updates; errors: string[]; warnings: string[] }> {\n let updates: Updates = [];\n let errors: string[] = [];\n let warnings: string[] = [];\n\n // Parse dictionary with esbuildConfig\n if (\n sourceDictionary &&\n fs.existsSync(sourceDictionary) &&\n fs.statSync(sourceDictionary).isFile()\n ) {\n if (sourceDictionary.endsWith('.json')) {\n updates = [\n ...updates,\n ...(await createDictionaryUpdates(sourceDictionary, errors, warnings)),\n ];\n } else {\n let esbuildConfig;\n if (options.jsconfig) {\n const jsconfig = loadJSON(options.jsconfig);\n if (!jsconfig) {\n logger.error(\n `Failed to resolve jsconfig.json or tsconfig.json at provided filepath: \"${options.jsconfig}\"`\n );\n exitSync(1);\n }\n esbuildConfig = createESBuildConfig(jsconfig);\n } else {\n esbuildConfig = createESBuildConfig({});\n }\n updates = [\n ...updates,\n ...(await createDictionaryUpdates(\n sourceDictionary,\n errors,\n warnings,\n esbuildConfig\n )),\n ];\n }\n }\n // Scan through project for translatable content\n const extractPrimary: PrimaryInlineExtractor | undefined =\n pkg === Libraries.GT_VUE\n ? undefined\n : (primaryPatterns) =>\n isPythonLibrary(pkg)\n ? createPythonInlineUpdates(primaryPatterns)\n : createInlineUpdates(\n pkg,\n validate,\n primaryPatterns,\n parsingFlags,\n parsingOptions\n );\n const {\n updates: newUpdates,\n errors: newErrors,\n warnings: newWarnings,\n } = await extractInlineFromProject(\n pkg,\n src,\n parsingFlags,\n parsingOptions,\n extractPrimary,\n options.jsconfig || undefined\n );\n\n errors = [...errors, ...newErrors];\n warnings = [...warnings, ...newWarnings];\n updates = [...updates, ...newUpdates];\n\n // Validate user-supplied IDs without using them as translation lookup keys.\n const idHashMap = new Map<string, string>();\n const hashlessIds = new Set<string>();\n const warnedHashlessDuplicateIds = new Set<string>();\n const duplicateIds = new Set<string>();\n\n const warnHashlessDuplicateId = (id: string) => {\n if (warnedHashlessDuplicateIds.has(id)) return;\n warnings.push(\n `Duplicate id ${chalk.blue(\n id\n )} includes at least one entry without a hash. Hashless duplicate IDs cannot be compared, and later entries may overwrite earlier entries.`\n );\n warnedHashlessDuplicateIds.add(id);\n };\n\n updates = updates.map((update) => {\n const { id, hash } = update.metadata;\n if (!id) return update;\n if (!hash) {\n if (hashlessIds.has(id) || idHashMap.has(id)) {\n warnHashlessDuplicateId(id);\n }\n hashlessIds.add(id);\n return update;\n }\n\n if (hashlessIds.has(id)) {\n warnHashlessDuplicateId(id);\n }\n\n const existingHash = idHashMap.get(id);\n if (existingHash !== undefined) {\n if (existingHash !== hash) {\n errors.push(\n `Hashes don't match on two components with the same id: ${chalk.blue(\n id\n )}. Check your ${chalk.green(\n '<T>'\n )} tags and dictionary entries and make sure you're not accidentally duplicating IDs.`\n );\n duplicateIds.add(id);\n }\n } else {\n idHashMap.set(id, hash);\n }\n return update;\n });\n\n updates = updates.filter(\n (update) => !update.metadata.id || !duplicateIds.has(update.metadata.id)\n );\n\n return { updates, errors, warnings };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA8BA,eAAsB,cACpB,SACA,KACA,kBACA,KACA,UACA,cACA,gBACqE;CACrE,IAAI,UAAmB,EAAE;CACzB,IAAI,SAAmB,EAAE;CACzB,IAAI,WAAqB,EAAE;AAG3B,KACE,oBACA,GAAG,WAAW,iBAAiB,IAC/B,GAAG,SAAS,iBAAiB,CAAC,QAAQ,CAEtC,KAAI,iBAAiB,SAAS,QAAQ,CACpC,WAAU,CACR,GAAG,SACH,GAAI,MAAM,wBAAwB,kBAAkB,QAAQ,SAAS,CACtE;MACI;EACL,IAAI;AACJ,MAAI,QAAQ,UAAU;GACpB,MAAM,WAAW,SAAS,QAAQ,SAAS;AAC3C,OAAI,CAAC,UAAU;AACb,WAAO,MACL,2EAA2E,QAAQ,SAAS,GAC7F;AACD,aAAS,EAAE;;AAEb,mBAAgB,oBAAoB,SAAS;QAE7C,iBAAgB,oBAAoB,EAAE,CAAC;AAEzC,YAAU,CACR,GAAG,SACH,GAAI,MAAM,wBACR,kBACA,QACA,UACA,cACD,CACF;;CAiBL,MAAM,EACJ,SAAS,YACT,QAAQ,WACR,UAAU,gBACR,MAAM,yBACR,KACA,KACA,cACA,gBApBA,QAAA,WACI,KAAA,KACC,oBACC,gBAAgB,IAAI,GAChB,0BAA0B,gBAAgB,GAC1C,oBACE,KACA,UACA,iBACA,cACA,eACD,EAWX,QAAQ,YAAY,KAAA,EACrB;AAED,UAAS,CAAC,GAAG,QAAQ,GAAG,UAAU;AAClC,YAAW,CAAC,GAAG,UAAU,GAAG,YAAY;AACxC,WAAU,CAAC,GAAG,SAAS,GAAG,WAAW;CAGrC,MAAM,4BAAY,IAAI,KAAqB;CAC3C,MAAM,8BAAc,IAAI,KAAa;CACrC,MAAM,6CAA6B,IAAI,KAAa;CACpD,MAAM,+BAAe,IAAI,KAAa;CAEtC,MAAM,2BAA2B,OAAe;AAC9C,MAAI,2BAA2B,IAAI,GAAG,CAAE;AACxC,WAAS,KACP,gBAAgB,MAAM,KACpB,GACD,CAAC,0IACH;AACD,6BAA2B,IAAI,GAAG;;AAGpC,WAAU,QAAQ,KAAK,WAAW;EAChC,MAAM,EAAE,IAAI,SAAS,OAAO;AAC5B,MAAI,CAAC,GAAI,QAAO;AAChB,MAAI,CAAC,MAAM;AACT,OAAI,YAAY,IAAI,GAAG,IAAI,UAAU,IAAI,GAAG,CAC1C,yBAAwB,GAAG;AAE7B,eAAY,IAAI,GAAG;AACnB,UAAO;;AAGT,MAAI,YAAY,IAAI,GAAG,CACrB,yBAAwB,GAAG;EAG7B,MAAM,eAAe,UAAU,IAAI,GAAG;AACtC,MAAI,iBAAiB,KAAA;OACf,iBAAiB,MAAM;AACzB,WAAO,KACL,0DAA0D,MAAM,KAC9D,GACD,CAAC,eAAe,MAAM,MACrB,MACD,CAAC,qFACH;AACD,iBAAa,IAAI,GAAG;;QAGtB,WAAU,IAAI,IAAI,KAAK;AAEzB,SAAO;GACP;AAEF,WAAU,QAAQ,QACf,WAAW,CAAC,OAAO,SAAS,MAAM,CAAC,aAAa,IAAI,OAAO,SAAS,GAAG,CACzE;AAED,QAAO;EAAE;EAAS;EAAQ;EAAU"}
@@ -10,5 +10,5 @@ export type ValidationResult = Record<string, ValidationMessage[]>;
10
10
  * Programmatic API for validation - returns structured results instead of logging/exiting.
11
11
  * Equivalent to running `gt validate` but returns data.
12
12
  */
13
- export declare function getValidateJson(settings: Options & Settings, pkg: `${typeof Libraries.GT_REACT}` | `${typeof Libraries.GT_NEXT}` | `${typeof Libraries.GT_REACT_NATIVE}`, files?: string[]): Promise<ValidationResult>;
13
+ export declare function getValidateJson(settings: Options & Settings, pkg: `${typeof Libraries.GT_REACT}` | `${typeof Libraries.GT_NEXT}` | `${typeof Libraries.GT_REACT_NATIVE}` | `${typeof Libraries.GT_VUE}`, files?: string[]): Promise<ValidationResult>;
14
14
  export declare function validateProject(settings: Options & Settings, pkg: InlineLibrary, files?: string[]): Promise<void>;
@@ -1,8 +1,9 @@
1
1
  import { logger } from "../console/logger.js";
2
+ import "../types/libraries.js";
2
3
  import { logErrorAndExit, stripAnsi } from "../console/logging.js";
3
4
  import findFilepath from "../fs/findFilepath.js";
4
- import "../types/libraries.js";
5
5
  import { createInlineUpdates } from "../react/parse/createInlineUpdates.js";
6
+ import { extractInlineFromProject } from "./extractInline.js";
6
7
  import { createUpdates } from "./parse.js";
7
8
  import chalk from "chalk";
8
9
  //#region src/translation/validate.ts
@@ -10,7 +11,10 @@ import chalk from "chalk";
10
11
  * Shared validation logic - returns raw results from createUpdates/createInlineUpdates
11
12
  */
12
13
  async function runValidation(settings, pkg, files) {
13
- if (files && files.length > 0) return createInlineUpdates(pkg, true, files, settings.files.gtJson.parsingFlags, settings.parsingOptions);
14
+ if (files && files.length > 0) {
15
+ const extractPrimary = pkg === "gt-vue" ? void 0 : (primaryFiles) => createInlineUpdates(pkg, true, primaryFiles, settings.files.gtJson.parsingFlags, settings.parsingOptions);
16
+ return extractInlineFromProject(pkg, files, settings.files.gtJson.parsingFlags, settings.parsingOptions, extractPrimary, settings.jsconfig || void 0);
17
+ }
14
18
  const dictionary = settings.dictionary || findFilepath([
15
19
  "./dictionary.js",
16
20
  "./src/dictionary.js",
@@ -45,7 +49,7 @@ function parseFileFromMessage(msg) {
45
49
  * Equivalent to running `gt validate` but returns data.
46
50
  */
47
51
  async function getValidateJson(settings, pkg, files) {
48
- const { errors, warnings } = await runValidation(settings, pkg === "gt-next" ? "gt-next" : pkg === "gt-react-native" ? "gt-react-native" : "gt-react", files);
52
+ const { errors, warnings } = await runValidation(settings, pkg === "gt-vue" ? "gt-vue" : pkg === "gt-next" ? "gt-next" : pkg === "gt-react-native" ? "gt-react-native" : "gt-react", files);
49
53
  const result = {};
50
54
  const addMessage = (file, level, message) => {
51
55
  if (!result[file]) result[file] = [];
@@ -1 +1 @@
1
- {"version":3,"file":"validate.js","names":[],"sources":["../../src/translation/validate.ts"],"sourcesContent":["import { logErrorAndExit, stripAnsi } from '../console/logging.js';\nimport chalk from 'chalk';\nimport findFilepath from '../fs/findFilepath.js';\nimport { Framework, Options, Settings, Updates } from '../types/index.js';\nimport { logger } from '../console/logger.js';\n\nimport { createUpdates } from './parse.js';\nimport { createInlineUpdates } from '../react/parse/createInlineUpdates.js';\nimport { InlineLibrary, Libraries } from '../types/libraries.js';\n\n// Types for programmatic validation API\nexport type ValidationLevel = 'error' | 'warning';\n\nexport type ValidationMessage = {\n level: ValidationLevel;\n message: string;\n};\n\nexport type ValidationResult = Record<string, ValidationMessage[]>;\n\n/**\n * Shared validation logic - returns raw results from createUpdates/createInlineUpdates\n */\nasync function runValidation(\n settings: Options & Settings,\n pkg: InlineLibrary,\n files?: string[]\n): Promise<{ updates: Updates; errors: string[]; warnings: string[] }> {\n if (files && files.length > 0) {\n return createInlineUpdates(\n pkg,\n true,\n files,\n settings.files.gtJson.parsingFlags,\n settings.parsingOptions\n );\n }\n\n // Full project validation\n // Use local variable to avoid mutating caller's settings object\n const dictionary =\n settings.dictionary ||\n findFilepath([\n './dictionary.js',\n './src/dictionary.js',\n './dictionary.json',\n './src/dictionary.json',\n './dictionary.ts',\n './src/dictionary.ts',\n ]);\n\n return createUpdates(\n settings,\n settings.src,\n dictionary,\n pkg,\n true,\n settings.files.gtJson.parsingFlags,\n settings.parsingOptions\n );\n}\n\n/**\n * Parse file path from error/warning string in withLocation format: \"filepath (line:col): message\"\n */\nfunction parseFileFromMessage(msg: string): { file: string; message: string } {\n // First try to match with location format: \"filepath (line:col): message\"\n // Using [\\s\\S] instead of . with /s flag for ES5 compatibility\n const withLocation = msg.match(/^(.+)\\s+\\(\\d+:\\d+\\)\\s*:\\s*([\\s\\S]+)$/);\n if (withLocation) {\n return { file: withLocation[1].trim(), message: withLocation[2].trim() };\n }\n\n // Fallback: find the last \": \" pattern (handles Windows paths like C:\\...)\n const lastColonSpace = msg.lastIndexOf(': ');\n if (lastColonSpace > 0) {\n return {\n file: msg.substring(0, lastColonSpace).trim(),\n message: msg.substring(lastColonSpace + 2).trim(),\n };\n }\n\n // No file found - use empty string as key for \"global\" messages\n return { file: '', message: msg };\n}\n\n/**\n * Programmatic API for validation - returns structured results instead of logging/exiting.\n * Equivalent to running `gt validate` but returns data.\n */\nexport async function getValidateJson(\n settings: Options & Settings,\n // TODO: fix compatability more generally so do not have to do this\n pkg:\n | `${typeof Libraries.GT_REACT}`\n | `${typeof Libraries.GT_NEXT}`\n | `${typeof Libraries.GT_REACT_NATIVE}`,\n files?: string[]\n): Promise<ValidationResult> {\n const validatedPkg: Framework =\n pkg === Libraries.GT_NEXT\n ? Libraries.GT_NEXT\n : pkg === Libraries.GT_REACT_NATIVE\n ? Libraries.GT_REACT_NATIVE\n : Libraries.GT_REACT;\n const { errors, warnings } = await runValidation(\n settings,\n validatedPkg,\n files\n );\n\n const result: ValidationResult = {};\n\n const addMessage = (\n file: string,\n level: ValidationLevel,\n message: string\n ) => {\n if (!result[file]) {\n result[file] = [];\n }\n result[file].push({ level, message });\n };\n\n for (const error of errors) {\n const { file, message } = parseFileFromMessage(stripAnsi(error));\n addMessage(file, 'error', message);\n }\n for (const warning of warnings) {\n const { file, message } = parseFileFromMessage(stripAnsi(warning));\n addMessage(file, 'warning', message);\n }\n\n return result;\n}\n\nexport async function validateProject(\n settings: Options & Settings,\n pkg: InlineLibrary,\n files?: string[]\n): Promise<void> {\n const { updates, errors, warnings } = await runValidation(\n settings,\n pkg,\n files\n );\n\n if (warnings.length > 0) {\n logger.warn(\n chalk.yellow(\n `CLI tool encountered ${warnings.length} warnings while scanning for translatable content.`\n ) +\n '\\n' +\n warnings\n .map((warning) => chalk.yellow('• ') + chalk.white(warning))\n .join('\\n')\n );\n }\n\n if (errors.length > 0) {\n logErrorAndExit(\n chalk.red(\n `Error: CLI tool encountered ${errors.length} syntax errors while scanning for translatable content.\\n` +\n errors\n .map((error) => chalk.red('• ') + chalk.white(error) + '\\n')\n .join('')\n )\n );\n }\n\n if (updates.length === 0) {\n logger.error(\n chalk.red(\n `No inline content or dictionaries were found for ${chalk.green(\n pkg\n )}. Are you sure you're running this command in the right directory?`\n )\n );\n } else {\n logger.success(\n chalk.green(\n `Success! Found ${updates.length} translatable entries for ${chalk.green(\n pkg\n )}.`\n )\n );\n }\n}\n"],"mappings":";;;;;;;;;;;AAuBA,eAAe,cACb,UACA,KACA,OACqE;AACrE,KAAI,SAAS,MAAM,SAAS,EAC1B,QAAO,oBACL,KACA,MACA,OACA,SAAS,MAAM,OAAO,cACtB,SAAS,eACV;CAKH,MAAM,aACJ,SAAS,cACT,aAAa;EACX;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;AAEJ,QAAO,cACL,UACA,SAAS,KACT,YACA,KACA,MACA,SAAS,MAAM,OAAO,cACtB,SAAS,eACV;;;;;AAMH,SAAS,qBAAqB,KAAgD;CAG5E,MAAM,eAAe,IAAI,MAAM,uCAAuC;AACtE,KAAI,aACF,QAAO;EAAE,MAAM,aAAa,GAAG,MAAM;EAAE,SAAS,aAAa,GAAG,MAAM;EAAE;CAI1E,MAAM,iBAAiB,IAAI,YAAY,KAAK;AAC5C,KAAI,iBAAiB,EACnB,QAAO;EACL,MAAM,IAAI,UAAU,GAAG,eAAe,CAAC,MAAM;EAC7C,SAAS,IAAI,UAAU,iBAAiB,EAAE,CAAC,MAAM;EAClD;AAIH,QAAO;EAAE,MAAM;EAAI,SAAS;EAAK;;;;;;AAOnC,eAAsB,gBACpB,UAEA,KAIA,OAC2B;CAO3B,MAAM,EAAE,QAAQ,aAAa,MAAM,cACjC,UANA,QAAA,YAAA,YAEI,QAAA,oBAAA,oBAAA,YAMJ,MACD;CAED,MAAM,SAA2B,EAAE;CAEnC,MAAM,cACJ,MACA,OACA,YACG;AACH,MAAI,CAAC,OAAO,MACV,QAAO,QAAQ,EAAE;AAEnB,SAAO,MAAM,KAAK;GAAE;GAAO;GAAS,CAAC;;AAGvC,MAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,EAAE,MAAM,YAAY,qBAAqB,UAAU,MAAM,CAAC;AAChE,aAAW,MAAM,SAAS,QAAQ;;AAEpC,MAAK,MAAM,WAAW,UAAU;EAC9B,MAAM,EAAE,MAAM,YAAY,qBAAqB,UAAU,QAAQ,CAAC;AAClE,aAAW,MAAM,WAAW,QAAQ;;AAGtC,QAAO;;AAGT,eAAsB,gBACpB,UACA,KACA,OACe;CACf,MAAM,EAAE,SAAS,QAAQ,aAAa,MAAM,cAC1C,UACA,KACA,MACD;AAED,KAAI,SAAS,SAAS,EACpB,QAAO,KACL,MAAM,OACJ,wBAAwB,SAAS,OAAO,oDACzC,GACC,OACA,SACG,KAAK,YAAY,MAAM,OAAO,KAAK,GAAG,MAAM,MAAM,QAAQ,CAAC,CAC3D,KAAK,KAAK,CAChB;AAGH,KAAI,OAAO,SAAS,EAClB,iBACE,MAAM,IACJ,+BAA+B,OAAO,OAAO,6DAC3C,OACG,KAAK,UAAU,MAAM,IAAI,KAAK,GAAG,MAAM,MAAM,MAAM,GAAG,KAAK,CAC3D,KAAK,GAAG,CACd,CACF;AAGH,KAAI,QAAQ,WAAW,EACrB,QAAO,MACL,MAAM,IACJ,oDAAoD,MAAM,MACxD,IACD,CAAC,oEACH,CACF;KAED,QAAO,QACL,MAAM,MACJ,kBAAkB,QAAQ,OAAO,4BAA4B,MAAM,MACjE,IACD,CAAC,GACH,CACF"}
1
+ {"version":3,"file":"validate.js","names":[],"sources":["../../src/translation/validate.ts"],"sourcesContent":["import { logErrorAndExit, stripAnsi } from '../console/logging.js';\nimport chalk from 'chalk';\nimport findFilepath from '../fs/findFilepath.js';\nimport { Options, Settings, Updates } from '../types/index.js';\nimport { logger } from '../console/logger.js';\n\nimport { createUpdates } from './parse.js';\nimport { createInlineUpdates } from '../react/parse/createInlineUpdates.js';\nimport { InlineLibrary, Libraries } from '../types/libraries.js';\nimport {\n extractInlineFromProject,\n type PrimaryInlineExtractor,\n} from './extractInline.js';\n\n// Types for programmatic validation API\nexport type ValidationLevel = 'error' | 'warning';\n\nexport type ValidationMessage = {\n level: ValidationLevel;\n message: string;\n};\n\nexport type ValidationResult = Record<string, ValidationMessage[]>;\n\n/**\n * Shared validation logic - returns raw results from createUpdates/createInlineUpdates\n */\nasync function runValidation(\n settings: Options & Settings,\n pkg: InlineLibrary,\n files?: string[]\n): Promise<{ updates: Updates; errors: string[]; warnings: string[] }> {\n if (files && files.length > 0) {\n const extractPrimary: PrimaryInlineExtractor | undefined =\n pkg === Libraries.GT_VUE\n ? undefined\n : (primaryFiles) =>\n createInlineUpdates(\n pkg,\n true,\n primaryFiles,\n settings.files.gtJson.parsingFlags,\n settings.parsingOptions\n );\n return extractInlineFromProject(\n pkg,\n files,\n settings.files.gtJson.parsingFlags,\n settings.parsingOptions,\n extractPrimary,\n settings.jsconfig || undefined\n );\n }\n\n // Full project validation\n // Use local variable to avoid mutating caller's settings object\n const dictionary =\n settings.dictionary ||\n findFilepath([\n './dictionary.js',\n './src/dictionary.js',\n './dictionary.json',\n './src/dictionary.json',\n './dictionary.ts',\n './src/dictionary.ts',\n ]);\n\n return createUpdates(\n settings,\n settings.src,\n dictionary,\n pkg,\n true,\n settings.files.gtJson.parsingFlags,\n settings.parsingOptions\n );\n}\n\n/**\n * Parse file path from error/warning string in withLocation format: \"filepath (line:col): message\"\n */\nfunction parseFileFromMessage(msg: string): { file: string; message: string } {\n // First try to match with location format: \"filepath (line:col): message\"\n // Using [\\s\\S] instead of . with /s flag for ES5 compatibility\n const withLocation = msg.match(/^(.+)\\s+\\(\\d+:\\d+\\)\\s*:\\s*([\\s\\S]+)$/);\n if (withLocation) {\n return { file: withLocation[1].trim(), message: withLocation[2].trim() };\n }\n\n // Fallback: find the last \": \" pattern (handles Windows paths like C:\\...)\n const lastColonSpace = msg.lastIndexOf(': ');\n if (lastColonSpace > 0) {\n return {\n file: msg.substring(0, lastColonSpace).trim(),\n message: msg.substring(lastColonSpace + 2).trim(),\n };\n }\n\n // No file found - use empty string as key for \"global\" messages\n return { file: '', message: msg };\n}\n\n/**\n * Programmatic API for validation - returns structured results instead of logging/exiting.\n * Equivalent to running `gt validate` but returns data.\n */\nexport async function getValidateJson(\n settings: Options & Settings,\n // TODO: fix compatability more generally so do not have to do this\n pkg:\n | `${typeof Libraries.GT_REACT}`\n | `${typeof Libraries.GT_NEXT}`\n | `${typeof Libraries.GT_REACT_NATIVE}`\n | `${typeof Libraries.GT_VUE}`,\n files?: string[]\n): Promise<ValidationResult> {\n const validatedPkg: InlineLibrary =\n pkg === Libraries.GT_VUE\n ? Libraries.GT_VUE\n : pkg === Libraries.GT_NEXT\n ? Libraries.GT_NEXT\n : pkg === Libraries.GT_REACT_NATIVE\n ? Libraries.GT_REACT_NATIVE\n : Libraries.GT_REACT;\n const { errors, warnings } = await runValidation(\n settings,\n validatedPkg,\n files\n );\n\n const result: ValidationResult = {};\n\n const addMessage = (\n file: string,\n level: ValidationLevel,\n message: string\n ) => {\n if (!result[file]) {\n result[file] = [];\n }\n result[file].push({ level, message });\n };\n\n for (const error of errors) {\n const { file, message } = parseFileFromMessage(stripAnsi(error));\n addMessage(file, 'error', message);\n }\n for (const warning of warnings) {\n const { file, message } = parseFileFromMessage(stripAnsi(warning));\n addMessage(file, 'warning', message);\n }\n\n return result;\n}\n\nexport async function validateProject(\n settings: Options & Settings,\n pkg: InlineLibrary,\n files?: string[]\n): Promise<void> {\n const { updates, errors, warnings } = await runValidation(\n settings,\n pkg,\n files\n );\n\n if (warnings.length > 0) {\n logger.warn(\n chalk.yellow(\n `CLI tool encountered ${warnings.length} warnings while scanning for translatable content.`\n ) +\n '\\n' +\n warnings\n .map((warning) => chalk.yellow('• ') + chalk.white(warning))\n .join('\\n')\n );\n }\n\n if (errors.length > 0) {\n logErrorAndExit(\n chalk.red(\n `Error: CLI tool encountered ${errors.length} syntax errors while scanning for translatable content.\\n` +\n errors\n .map((error) => chalk.red('• ') + chalk.white(error) + '\\n')\n .join('')\n )\n );\n }\n\n if (updates.length === 0) {\n logger.error(\n chalk.red(\n `No inline content or dictionaries were found for ${chalk.green(\n pkg\n )}. Are you sure you're running this command in the right directory?`\n )\n );\n } else {\n logger.success(\n chalk.green(\n `Success! Found ${updates.length} translatable entries for ${chalk.green(\n pkg\n )}.`\n )\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;AA2BA,eAAe,cACb,UACA,KACA,OACqE;AACrE,KAAI,SAAS,MAAM,SAAS,GAAG;EAC7B,MAAM,iBACJ,QAAA,WACI,KAAA,KACC,iBACC,oBACE,KACA,MACA,cACA,SAAS,MAAM,OAAO,cACtB,SAAS,eACV;AACT,SAAO,yBACL,KACA,OACA,SAAS,MAAM,OAAO,cACtB,SAAS,gBACT,gBACA,SAAS,YAAY,KAAA,EACtB;;CAKH,MAAM,aACJ,SAAS,cACT,aAAa;EACX;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;AAEJ,QAAO,cACL,UACA,SAAS,KACT,YACA,KACA,MACA,SAAS,MAAM,OAAO,cACtB,SAAS,eACV;;;;;AAMH,SAAS,qBAAqB,KAAgD;CAG5E,MAAM,eAAe,IAAI,MAAM,uCAAuC;AACtE,KAAI,aACF,QAAO;EAAE,MAAM,aAAa,GAAG,MAAM;EAAE,SAAS,aAAa,GAAG,MAAM;EAAE;CAI1E,MAAM,iBAAiB,IAAI,YAAY,KAAK;AAC5C,KAAI,iBAAiB,EACnB,QAAO;EACL,MAAM,IAAI,UAAU,GAAG,eAAe,CAAC,MAAM;EAC7C,SAAS,IAAI,UAAU,iBAAiB,EAAE,CAAC,MAAM;EAClD;AAIH,QAAO;EAAE,MAAM;EAAI,SAAS;EAAK;;;;;;AAOnC,eAAsB,gBACpB,UAEA,KAKA,OAC2B;CAS3B,MAAM,EAAE,QAAQ,aAAa,MAAM,cACjC,UARA,QAAA,WAAA,WAEI,QAAA,YAAA,YAEE,QAAA,oBAAA,oBAAA,YAMN,MACD;CAED,MAAM,SAA2B,EAAE;CAEnC,MAAM,cACJ,MACA,OACA,YACG;AACH,MAAI,CAAC,OAAO,MACV,QAAO,QAAQ,EAAE;AAEnB,SAAO,MAAM,KAAK;GAAE;GAAO;GAAS,CAAC;;AAGvC,MAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,EAAE,MAAM,YAAY,qBAAqB,UAAU,MAAM,CAAC;AAChE,aAAW,MAAM,SAAS,QAAQ;;AAEpC,MAAK,MAAM,WAAW,UAAU;EAC9B,MAAM,EAAE,MAAM,YAAY,qBAAqB,UAAU,QAAQ,CAAC;AAClE,aAAW,MAAM,WAAW,QAAQ;;AAGtC,QAAO;;AAGT,eAAsB,gBACpB,UACA,KACA,OACe;CACf,MAAM,EAAE,SAAS,QAAQ,aAAa,MAAM,cAC1C,UACA,KACA,MACD;AAED,KAAI,SAAS,SAAS,EACpB,QAAO,KACL,MAAM,OACJ,wBAAwB,SAAS,OAAO,oDACzC,GACC,OACA,SACG,KAAK,YAAY,MAAM,OAAO,KAAK,GAAG,MAAM,MAAM,QAAQ,CAAC,CAC3D,KAAK,KAAK,CAChB;AAGH,KAAI,OAAO,SAAS,EAClB,iBACE,MAAM,IACJ,+BAA+B,OAAO,OAAO,6DAC3C,OACG,KAAK,UAAU,MAAM,IAAI,KAAK,GAAG,MAAM,MAAM,MAAM,GAAG,KAAK,CAC3D,KAAK,GAAG,CACd,CACF;AAGH,KAAI,QAAQ,WAAW,EACrB,QAAO,MACL,MAAM,IACJ,oDAAoD,MAAM,MACxD,IACD,CAAC,oEACH,CACF;KAED,QAAO,QACL,MAAM,MACJ,kBAAkB,QAAQ,OAAO,4BAA4B,MAAM,MACjE,IACD,CAAC,GACH,CACF"}
@@ -9,6 +9,7 @@ export declare enum Libraries {
9
9
  GT_I18N = "gt-i18n",
10
10
  GT_REACT_CORE = "@generaltranslation/react-core",
11
11
  GT_TANSTACK_START = "gt-tanstack-start",
12
+ GT_VUE = "gt-vue",
12
13
  GT_FLASK = "gt-flask",
13
14
  GT_FASTAPI = "gt-fastapi"
14
15
  }
@@ -20,9 +21,11 @@ export type GTLibrary = (typeof GT_LIBRARIES)[number];
20
21
  /**
21
22
  * Libraries that support inline translation
22
23
  */
23
- export declare const INLINE_LIBRARIES: readonly [Libraries.GT_REACT, Libraries.GT_NEXT, Libraries.GT_NODE, Libraries.GT_REACT_NATIVE, Libraries.GT_REACT_CORE, Libraries.GT_TANSTACK_START, Libraries.GT_I18N, Libraries.GT_FLASK, Libraries.GT_FASTAPI];
24
+ export declare const INLINE_LIBRARIES: readonly [Libraries.GT_REACT, Libraries.GT_NEXT, Libraries.GT_NODE, Libraries.GT_REACT_NATIVE, Libraries.GT_REACT_CORE, Libraries.GT_TANSTACK_START, Libraries.GT_VUE, Libraries.GT_I18N, Libraries.GT_FLASK, Libraries.GT_FASTAPI];
24
25
  export type InlineLibrary = (typeof INLINE_LIBRARIES)[number];
25
26
  export declare function isInlineLibrary(lib: string): lib is InlineLibrary;
27
+ /** Returns the framework-specific label for the shared inline GTJSON file. */
28
+ export declare function getInlineElementsLabel(inlineLibrary?: InlineLibrary): 'Vue Elements' | 'React Elements';
26
29
  /**
27
30
  * Libraries that support react primitives
28
31
  */