@generaltranslation/compiler 1.3.32 → 1.3.34

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.
package/dist/index.d.ts CHANGED
@@ -58,5 +58,6 @@ export default gtUnplugin;
58
58
  export declare const webpack: (options?: GTUnpluginOptions | undefined) => WebpackPluginInstance;
59
59
  export declare const vite: (options?: GTUnpluginOptions | undefined) => import("vite").Plugin<any> | import("vite").Plugin<any>[];
60
60
  export declare const rollup: (options?: GTUnpluginOptions | undefined) => any;
61
+ export declare const rspack: (options?: GTUnpluginOptions | undefined) => RspackPluginInstance;
61
62
  export declare const esbuild: (options?: GTUnpluginOptions | undefined) => EsbuildPlugin;
62
63
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAWlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,YAAY,EAAE,QAAQ;CAAG;AAEpE,eAAO,MAAM,yBAAyB,iMAC0J,CAAC;AAEjM,eAAO,MAAM,4BAA4B,GACvC,YAAY,MAAM,EAClB,OAAO,OAAO,WAI6C,CAAC;AAuG9D;;;;;GAKG;AACH,QAAA,MAAM,UAAU,6EA6If,CAAC;AAGF,eAAe,UAAU,CAAC;AAC1B,eAAO,MAAM,OAAO,oEAAqB,CAAC;AAC1C,eAAO,MAAM,IAAI,wGAAkB,CAAC;AACpC,eAAO,MAAM,MAAM,kDAAoB,CAAC;AACxC,eAAO,MAAM,OAAO,4DAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAWlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,YAAY,EAAE,QAAQ;CAAG;AAEpE,eAAO,MAAM,yBAAyB,iMAC0J,CAAC;AAEjM,eAAO,MAAM,4BAA4B,GACvC,YAAY,MAAM,EAClB,OAAO,OAAO,WAI6C,CAAC;AAuG9D;;;;;GAKG;AACH,QAAA,MAAM,UAAU,6EA6If,CAAC;AAGF,eAAe,UAAU,CAAC;AAC1B,eAAO,MAAM,OAAO,oEAAqB,CAAC;AAC1C,eAAO,MAAM,IAAI,wGAAkB,CAAC;AACpC,eAAO,MAAM,MAAM,kDAAoB,CAAC;AACxC,eAAO,MAAM,MAAM,mEAAoB,CAAC;AACxC,eAAO,MAAM,OAAO,4DAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -171,6 +171,7 @@ const gtUnplugin = (0, unplugin.createUnplugin)((options = {}) => {
171
171
  const webpack = gtUnplugin.webpack;
172
172
  const vite = gtUnplugin.vite;
173
173
  const rollup = gtUnplugin.rollup;
174
+ const rspack = gtUnplugin.rspack;
174
175
  const esbuild = gtUnplugin.esbuild;
175
176
  //#endregion
176
177
  exports.MISSING_GT_CONFIG_WARNING = MISSING_GT_CONFIG_WARNING;
@@ -178,6 +179,7 @@ exports.createInvalidGTConfigWarning = createInvalidGTConfigWarning;
178
179
  exports.default = gtUnplugin;
179
180
  exports.esbuild = esbuild;
180
181
  exports.rollup = rollup;
182
+ exports.rspack = rspack;
181
183
  exports.vite = vite;
182
184
  exports.webpack = webpack;
183
185
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["path","fs","initializeState","parser","jsxInsertionPass","macroExpansionPass","collectionPass","handleErrors","injectionPass","runtimeTranslatePass","InvalidLibraryUsageError"],"sources":["../src/index.ts"],"sourcesContent":["import { createUnplugin } from 'unplugin';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport * as parser from '@babel/parser';\nimport generate from '@babel/generator';\nimport traverse from '@babel/traverse';\n\n// Core modules\nimport { GTConfig, PluginConfig } from './config';\n\n// Import passes\nimport { collectionPass } from './passes/collectionPass';\nimport { injectionPass } from './passes/injectionPass';\nimport { macroExpansionPass } from './passes/macroExpansionPass';\nimport { handleErrors, InvalidLibraryUsageError } from './passes/handleErrors';\nimport { initializeState } from './state/utils/initializeState';\nimport { jsxInsertionPass } from './passes/jsxInsertionPass';\nimport { runtimeTranslatePass } from './passes/runtimeTranslatePass';\n\n/**\n * Architecture:\n *\n * Pass Pipeline:\n * - Pass 0: Macro expansion — transforms t`...` tagged templates and t(`...`) template/concatenation args\n * - Pass 1: Collection — collect + calculate all data, check for violations, register + track\n * - Pass 2: Injection — inject all data (hashes, messages, etc.)\n *\n * Babel functions:\n * - 1-to-1 relationship with processing functions\n * - Handle (1) enter/exit scope (2) invoking processing function\n * - ex) JSXElement()\n *\n * Processing functions:\n * - Are dependent on the pass, so they have three categories: (1) collection, (2) injection, (3) shared/general\n * - Invoke transformation functions and utility functions\n * - ex) processJSXElement()\n * - Has the following file structure:\n * + processing\n * | sharedProcessingFunction.ts\n * | + collection\n * | | collectionProcessingFunction.ts\n * | + injection\n * | | injectionProcessingFunction.ts\n *\n * Transformation functions:\n * - Are AGNOSTIC to pass number\n * - MUST be stateful in some way\n * - ex) trackImportDeclaration()\n *\n * Utility functions:\n * - Are AGNOSTIC to pass number\n * - Are stateless\n * - ex) extractIdentifiersFromLVal()\n *\n * State:\n * - Includes classes for tracking state\n *\n * Currently no support for:\n * - namespaces and and modules\n */\n\n/**\n * GT Universal Plugin Options\n */\nexport interface GTUnpluginOptions extends PluginConfig, GTConfig {}\n\nexport const MISSING_GT_CONFIG_WARNING =\n '[@generaltranslation/compiler] No gtConfig found. Auto JSX injection and parsingFlags features require a gt.config.json. See https://generaltranslation.com/en/docs/react/concepts/compiler.';\n\nexport const createInvalidGTConfigWarning = (\n configPath: string,\n error: unknown\n) =>\n `[@generaltranslation/compiler] Failed to load gt.config.json at ${configPath}. ` +\n `Auto JSX injection and parsingFlags features require a valid gt.config.json. ` +\n `${error instanceof Error ? error.message : String(error)}`;\n\nfunction shouldWarn(logLevel: PluginConfig['logLevel']): boolean {\n return logLevel !== 'silent' && logLevel !== 'error';\n}\n\ntype GTConfigLoadResult =\n | {\n gtConfig: NonNullable<PluginConfig['gtConfig']>;\n status: 'loaded';\n }\n | {\n status: 'missing';\n }\n | {\n configPath: string;\n error: unknown;\n status: 'invalid';\n };\n\nfunction loadGTConfigFromCwd(): GTConfigLoadResult {\n const configPath = path.join(process.cwd(), 'gt.config.json');\n if (!fs.existsSync(configPath)) {\n return { status: 'missing' };\n }\n\n try {\n return {\n gtConfig: JSON.parse(fs.readFileSync(configPath, 'utf-8')) as NonNullable<\n PluginConfig['gtConfig']\n >,\n status: 'loaded',\n };\n } catch (error) {\n return { configPath, error, status: 'invalid' };\n }\n}\n\nfunction hasInlineGTConfig(options: GTUnpluginOptions): boolean {\n return (\n options.defaultLocale !== undefined ||\n options.locales !== undefined ||\n options.projectId !== undefined ||\n options._versionId !== undefined ||\n options.files !== undefined\n );\n}\n\nfunction getInlineGTConfig(options: GTUnpluginOptions): GTConfig | undefined {\n if (!hasInlineGTConfig(options)) return undefined;\n\n return {\n ...(options.defaultLocale !== undefined\n ? { defaultLocale: options.defaultLocale }\n : {}),\n ...(options.locales !== undefined ? { locales: options.locales } : {}),\n ...(options.projectId !== undefined\n ? { projectId: options.projectId }\n : {}),\n ...(options._versionId !== undefined\n ? { _versionId: options._versionId }\n : {}),\n ...(options.files !== undefined ? { files: options.files } : {}),\n };\n}\n\nfunction mergeGTConfigs(base: GTConfig, override: GTConfig): GTConfig {\n const mergedConfig = { ...base, ...override };\n if (!base.files && !override.files) return mergedConfig;\n\n const files = { ...base.files, ...override.files };\n if (base.files?.gt || override.files?.gt) {\n const gt = { ...base.files?.gt, ...override.files?.gt };\n if (base.files?.gt?.parsingFlags || override.files?.gt?.parsingFlags) {\n gt.parsingFlags = {\n ...base.files?.gt?.parsingFlags,\n ...override.files?.gt?.parsingFlags,\n };\n }\n files.gt = gt;\n }\n\n return { ...mergedConfig, files };\n}\n\nfunction resolveGTConfig(options: GTUnpluginOptions): GTConfigLoadResult {\n if (options.gtConfig) {\n return { gtConfig: options.gtConfig, status: 'loaded' };\n }\n\n const inlineGTConfig = getInlineGTConfig(options);\n const diskGTConfig = loadGTConfigFromCwd();\n if (!inlineGTConfig) return diskGTConfig;\n\n return {\n gtConfig:\n diskGTConfig.status === 'loaded'\n ? mergeGTConfigs(diskGTConfig.gtConfig, inlineGTConfig)\n : inlineGTConfig,\n status: 'loaded',\n };\n}\n\n/**\n * GT Universal Plugin - Main entry point\n *\n * Universal plugin for compile-time optimization of GT translation components\n * that works across webpack, Vite, Rollup, and other bundlers.\n */\nconst gtUnplugin = createUnplugin<GTUnpluginOptions | undefined>(\n (options = {}) => {\n const gtConfigLoadResult = resolveGTConfig(options);\n const loadedGTConfig =\n gtConfigLoadResult.status === 'loaded'\n ? gtConfigLoadResult.gtConfig\n : undefined;\n const resolvedOptions: GTUnpluginOptions = {\n ...options,\n ...(loadedGTConfig ? { gtConfig: loadedGTConfig } : {}),\n };\n\n if (shouldWarn(options.logLevel)) {\n if (gtConfigLoadResult.status === 'missing') {\n console.warn(MISSING_GT_CONFIG_WARNING);\n } else if (gtConfigLoadResult.status === 'invalid') {\n console.warn(\n createInvalidGTConfigWarning(\n gtConfigLoadResult.configPath,\n gtConfigLoadResult.error\n )\n );\n }\n }\n\n // Debug manifest: accumulates hash → jsxChildren across all files\n const debugManifest = resolvedOptions._debugHashManifest\n ? new Map<string, unknown>()\n : undefined;\n\n return {\n name: '@generaltranslation/GT_PLUGIN',\n transformInclude(id: string) {\n // Only transform TSX and JSX files\n return (\n id.endsWith('.tsx') ||\n id.endsWith('.jsx') ||\n id.endsWith('.ts') ||\n id.endsWith('.js')\n );\n },\n transform(code: string, id: string) {\n // Initialize processing state\n const state = initializeState(resolvedOptions, id);\n if (debugManifest) state.debugManifest = debugManifest;\n try {\n // Skip transformation if not needed\n if (\n state.settings.disableBuildChecks &&\n !state.settings.compileTimeHash\n ) {\n return null;\n }\n\n // Parse the code into AST\n const ast = parser.parse(code, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript', 'decorators-legacy'],\n allowImportExportEverywhere: true,\n allowReturnOutsideFunction: true,\n });\n\n // Pass 1: Jsx insertion\n if (state.settings.enableAutoJsxInjection) {\n traverse(ast, jsxInsertionPass(state));\n }\n\n // Pass 2: Macro expansion\n if (state.settings.enableMacroTransform) {\n traverse(ast, macroExpansionPass(state));\n }\n\n // Pass 3: Collection\n traverse(ast, collectionPass(state));\n\n // Handle errors\n if (handleErrors(state)) {\n return null;\n }\n\n // Pass 4: Injection (hashes + useGT prefetch parameters), gated on\n // the compileTimeHash setting\n const hasCollectionContent = state.stringCollector.hasContent();\n const injectionRan =\n hasCollectionContent && state.settings.compileTimeHash;\n\n if (injectionRan) {\n traverse(ast, injectionPass(state));\n }\n\n // Pass 5: Runtime translate (dev hot reload)\n const devHotReloadActive =\n state.settings.devHotReload.strings ||\n state.settings.devHotReload.jsx;\n if (devHotReloadActive && hasCollectionContent) {\n traverse(ast, runtimeTranslatePass(state));\n }\n\n // Generate code if any pass modified the AST\n if (\n !injectionRan &&\n state.statistics.macroExpansionsCount === 0 &&\n state.statistics.jsxInsertionsCount === 0 &&\n state.statistics.runtimeTranslateCount === 0\n ) {\n return null;\n }\n\n return generate(ast, {\n retainLines: true,\n compact: false,\n });\n } catch (error) {\n // If the error is an instance of InvalidLibraryUsageError, throw it\n if (error instanceof InvalidLibraryUsageError) {\n throw error;\n }\n\n // Otherwise, log the error\n state.logger.logError(`Error processing ${id}: ${error}`);\n return null;\n }\n },\n buildEnd() {\n if (debugManifest && debugManifest.size > 0) {\n const fs = require('fs');\n const path = require('path');\n const outPath = path.resolve(\n process.cwd(),\n '_gt_debug_hash_manifest.json'\n );\n const manifest = Object.fromEntries(debugManifest);\n fs.writeFileSync(outPath, JSON.stringify(manifest, null, 2));\n // eslint-disable-next-line no-console\n console.log(\n `[gt-compiler] Debug hash manifest written to ${outPath} (${debugManifest.size} entries)`\n );\n }\n },\n };\n }\n);\n\n// Export the unplugin with different bundler integrations\nexport default gtUnplugin;\nexport const webpack = gtUnplugin.webpack;\nexport const vite = gtUnplugin.vite;\nexport const rollup = gtUnplugin.rollup;\nexport const esbuild = gtUnplugin.esbuild;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["path","fs","initializeState","parser","jsxInsertionPass","macroExpansionPass","collectionPass","handleErrors","injectionPass","runtimeTranslatePass","InvalidLibraryUsageError"],"sources":["../src/index.ts"],"sourcesContent":["import { createUnplugin } from 'unplugin';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport * as parser from '@babel/parser';\nimport generate from '@babel/generator';\nimport traverse from '@babel/traverse';\n\n// Core modules\nimport { GTConfig, PluginConfig } from './config';\n\n// Import passes\nimport { collectionPass } from './passes/collectionPass';\nimport { injectionPass } from './passes/injectionPass';\nimport { macroExpansionPass } from './passes/macroExpansionPass';\nimport { handleErrors, InvalidLibraryUsageError } from './passes/handleErrors';\nimport { initializeState } from './state/utils/initializeState';\nimport { jsxInsertionPass } from './passes/jsxInsertionPass';\nimport { runtimeTranslatePass } from './passes/runtimeTranslatePass';\n\n/**\n * Architecture:\n *\n * Pass Pipeline:\n * - Pass 0: Macro expansion — transforms t`...` tagged templates and t(`...`) template/concatenation args\n * - Pass 1: Collection — collect + calculate all data, check for violations, register + track\n * - Pass 2: Injection — inject all data (hashes, messages, etc.)\n *\n * Babel functions:\n * - 1-to-1 relationship with processing functions\n * - Handle (1) enter/exit scope (2) invoking processing function\n * - ex) JSXElement()\n *\n * Processing functions:\n * - Are dependent on the pass, so they have three categories: (1) collection, (2) injection, (3) shared/general\n * - Invoke transformation functions and utility functions\n * - ex) processJSXElement()\n * - Has the following file structure:\n * + processing\n * | sharedProcessingFunction.ts\n * | + collection\n * | | collectionProcessingFunction.ts\n * | + injection\n * | | injectionProcessingFunction.ts\n *\n * Transformation functions:\n * - Are AGNOSTIC to pass number\n * - MUST be stateful in some way\n * - ex) trackImportDeclaration()\n *\n * Utility functions:\n * - Are AGNOSTIC to pass number\n * - Are stateless\n * - ex) extractIdentifiersFromLVal()\n *\n * State:\n * - Includes classes for tracking state\n *\n * Currently no support for:\n * - namespaces and and modules\n */\n\n/**\n * GT Universal Plugin Options\n */\nexport interface GTUnpluginOptions extends PluginConfig, GTConfig {}\n\nexport const MISSING_GT_CONFIG_WARNING =\n '[@generaltranslation/compiler] No gtConfig found. Auto JSX injection and parsingFlags features require a gt.config.json. See https://generaltranslation.com/en/docs/react/concepts/compiler.';\n\nexport const createInvalidGTConfigWarning = (\n configPath: string,\n error: unknown\n) =>\n `[@generaltranslation/compiler] Failed to load gt.config.json at ${configPath}. ` +\n `Auto JSX injection and parsingFlags features require a valid gt.config.json. ` +\n `${error instanceof Error ? error.message : String(error)}`;\n\nfunction shouldWarn(logLevel: PluginConfig['logLevel']): boolean {\n return logLevel !== 'silent' && logLevel !== 'error';\n}\n\ntype GTConfigLoadResult =\n | {\n gtConfig: NonNullable<PluginConfig['gtConfig']>;\n status: 'loaded';\n }\n | {\n status: 'missing';\n }\n | {\n configPath: string;\n error: unknown;\n status: 'invalid';\n };\n\nfunction loadGTConfigFromCwd(): GTConfigLoadResult {\n const configPath = path.join(process.cwd(), 'gt.config.json');\n if (!fs.existsSync(configPath)) {\n return { status: 'missing' };\n }\n\n try {\n return {\n gtConfig: JSON.parse(fs.readFileSync(configPath, 'utf-8')) as NonNullable<\n PluginConfig['gtConfig']\n >,\n status: 'loaded',\n };\n } catch (error) {\n return { configPath, error, status: 'invalid' };\n }\n}\n\nfunction hasInlineGTConfig(options: GTUnpluginOptions): boolean {\n return (\n options.defaultLocale !== undefined ||\n options.locales !== undefined ||\n options.projectId !== undefined ||\n options._versionId !== undefined ||\n options.files !== undefined\n );\n}\n\nfunction getInlineGTConfig(options: GTUnpluginOptions): GTConfig | undefined {\n if (!hasInlineGTConfig(options)) return undefined;\n\n return {\n ...(options.defaultLocale !== undefined\n ? { defaultLocale: options.defaultLocale }\n : {}),\n ...(options.locales !== undefined ? { locales: options.locales } : {}),\n ...(options.projectId !== undefined\n ? { projectId: options.projectId }\n : {}),\n ...(options._versionId !== undefined\n ? { _versionId: options._versionId }\n : {}),\n ...(options.files !== undefined ? { files: options.files } : {}),\n };\n}\n\nfunction mergeGTConfigs(base: GTConfig, override: GTConfig): GTConfig {\n const mergedConfig = { ...base, ...override };\n if (!base.files && !override.files) return mergedConfig;\n\n const files = { ...base.files, ...override.files };\n if (base.files?.gt || override.files?.gt) {\n const gt = { ...base.files?.gt, ...override.files?.gt };\n if (base.files?.gt?.parsingFlags || override.files?.gt?.parsingFlags) {\n gt.parsingFlags = {\n ...base.files?.gt?.parsingFlags,\n ...override.files?.gt?.parsingFlags,\n };\n }\n files.gt = gt;\n }\n\n return { ...mergedConfig, files };\n}\n\nfunction resolveGTConfig(options: GTUnpluginOptions): GTConfigLoadResult {\n if (options.gtConfig) {\n return { gtConfig: options.gtConfig, status: 'loaded' };\n }\n\n const inlineGTConfig = getInlineGTConfig(options);\n const diskGTConfig = loadGTConfigFromCwd();\n if (!inlineGTConfig) return diskGTConfig;\n\n return {\n gtConfig:\n diskGTConfig.status === 'loaded'\n ? mergeGTConfigs(diskGTConfig.gtConfig, inlineGTConfig)\n : inlineGTConfig,\n status: 'loaded',\n };\n}\n\n/**\n * GT Universal Plugin - Main entry point\n *\n * Universal plugin for compile-time optimization of GT translation components\n * that works across webpack, Vite, Rollup, and other bundlers.\n */\nconst gtUnplugin = createUnplugin<GTUnpluginOptions | undefined>(\n (options = {}) => {\n const gtConfigLoadResult = resolveGTConfig(options);\n const loadedGTConfig =\n gtConfigLoadResult.status === 'loaded'\n ? gtConfigLoadResult.gtConfig\n : undefined;\n const resolvedOptions: GTUnpluginOptions = {\n ...options,\n ...(loadedGTConfig ? { gtConfig: loadedGTConfig } : {}),\n };\n\n if (shouldWarn(options.logLevel)) {\n if (gtConfigLoadResult.status === 'missing') {\n console.warn(MISSING_GT_CONFIG_WARNING);\n } else if (gtConfigLoadResult.status === 'invalid') {\n console.warn(\n createInvalidGTConfigWarning(\n gtConfigLoadResult.configPath,\n gtConfigLoadResult.error\n )\n );\n }\n }\n\n // Debug manifest: accumulates hash → jsxChildren across all files\n const debugManifest = resolvedOptions._debugHashManifest\n ? new Map<string, unknown>()\n : undefined;\n\n return {\n name: '@generaltranslation/GT_PLUGIN',\n transformInclude(id: string) {\n // Only transform TSX and JSX files\n return (\n id.endsWith('.tsx') ||\n id.endsWith('.jsx') ||\n id.endsWith('.ts') ||\n id.endsWith('.js')\n );\n },\n transform(code: string, id: string) {\n // Initialize processing state\n const state = initializeState(resolvedOptions, id);\n if (debugManifest) state.debugManifest = debugManifest;\n try {\n // Skip transformation if not needed\n if (\n state.settings.disableBuildChecks &&\n !state.settings.compileTimeHash\n ) {\n return null;\n }\n\n // Parse the code into AST\n const ast = parser.parse(code, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript', 'decorators-legacy'],\n allowImportExportEverywhere: true,\n allowReturnOutsideFunction: true,\n });\n\n // Pass 1: Jsx insertion\n if (state.settings.enableAutoJsxInjection) {\n traverse(ast, jsxInsertionPass(state));\n }\n\n // Pass 2: Macro expansion\n if (state.settings.enableMacroTransform) {\n traverse(ast, macroExpansionPass(state));\n }\n\n // Pass 3: Collection\n traverse(ast, collectionPass(state));\n\n // Handle errors\n if (handleErrors(state)) {\n return null;\n }\n\n // Pass 4: Injection (hashes + useGT prefetch parameters), gated on\n // the compileTimeHash setting\n const hasCollectionContent = state.stringCollector.hasContent();\n const injectionRan =\n hasCollectionContent && state.settings.compileTimeHash;\n\n if (injectionRan) {\n traverse(ast, injectionPass(state));\n }\n\n // Pass 5: Runtime translate (dev hot reload)\n const devHotReloadActive =\n state.settings.devHotReload.strings ||\n state.settings.devHotReload.jsx;\n if (devHotReloadActive && hasCollectionContent) {\n traverse(ast, runtimeTranslatePass(state));\n }\n\n // Generate code if any pass modified the AST\n if (\n !injectionRan &&\n state.statistics.macroExpansionsCount === 0 &&\n state.statistics.jsxInsertionsCount === 0 &&\n state.statistics.runtimeTranslateCount === 0\n ) {\n return null;\n }\n\n return generate(ast, {\n retainLines: true,\n compact: false,\n });\n } catch (error) {\n // If the error is an instance of InvalidLibraryUsageError, throw it\n if (error instanceof InvalidLibraryUsageError) {\n throw error;\n }\n\n // Otherwise, log the error\n state.logger.logError(`Error processing ${id}: ${error}`);\n return null;\n }\n },\n buildEnd() {\n if (debugManifest && debugManifest.size > 0) {\n const fs = require('fs');\n const path = require('path');\n const outPath = path.resolve(\n process.cwd(),\n '_gt_debug_hash_manifest.json'\n );\n const manifest = Object.fromEntries(debugManifest);\n fs.writeFileSync(outPath, JSON.stringify(manifest, null, 2));\n // eslint-disable-next-line no-console\n console.log(\n `[gt-compiler] Debug hash manifest written to ${outPath} (${debugManifest.size} entries)`\n );\n }\n },\n };\n }\n);\n\n// Export the unplugin with different bundler integrations\nexport default gtUnplugin;\nexport const webpack = gtUnplugin.webpack;\nexport const vite = gtUnplugin.vite;\nexport const rollup = gtUnplugin.rollup;\nexport const rspack = gtUnplugin.rspack;\nexport const esbuild = gtUnplugin.esbuild;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@generaltranslation/compiler",
3
- "version": "1.3.32",
3
+ "version": "1.3.34",
4
4
  "description": "Universal plugin for compile-time optimization of GT translation components",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -14,6 +14,7 @@
14
14
  "webpack",
15
15
  "vite",
16
16
  "rollup",
17
+ "rspack",
17
18
  "gt-next",
18
19
  "translation",
19
20
  "i18n"
@@ -24,8 +25,8 @@
24
25
  "@babel/traverse": "^7.23.0",
25
26
  "@babel/types": "^7.23.0",
26
27
  "unplugin": "^2.3.10",
27
- "@generaltranslation/format": "0.1.2",
28
- "generaltranslation": "9.0.3"
28
+ "@generaltranslation/format": "0.1.4",
29
+ "generaltranslation": "9.0.5"
29
30
  },
30
31
  "devDependencies": {
31
32
  "@types/babel__core": "^7.20.0",