i18next-cli 1.28.3 → 1.29.1

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/README.md CHANGED
@@ -451,6 +451,9 @@ export default defineConfig({
451
451
 
452
452
  // Optional JSX tag names whose content should be ignored when linting
453
453
  ignoredTags: ['pre'],
454
+
455
+ /** Glob pattern(s) for files to ignore during lint (in addition to those defined during extract) */
456
+ ignore: ['additional/stuff/**'],
454
457
  },
455
458
 
456
459
  // TypeScript type generation
package/dist/cjs/cli.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var e=require("commander"),o=require("chokidar"),t=require("glob"),n=require("minimatch"),i=require("chalk"),r=require("./config.js"),a=require("./heuristic-config.js"),c=require("./extractor/core/extractor.js");require("node:path"),require("node:fs/promises"),require("jiti"),require("@croct/json5-parser");var s=require("./types-generator.js"),l=require("./syncer.js"),u=require("./migrator.js"),d=require("./init.js"),g=require("./linter.js"),f=require("./status.js"),p=require("./locize.js"),y=require("./rename-key.js");const m=new e.Command;m.name("i18next-cli").description("A unified, high-performance i18next CLI.").version("1.28.3"),m.option("-c, --config <path>","Path to i18next-cli config file (overrides detection)"),m.command("extract").description("Extract translation keys from source files and update resource files.").option("-w, --watch","Watch for file changes and re-run the extractor.").option("--ci","Exit with a non-zero status code if any files are updated.").option("--dry-run","Run the extractor without writing any files to disk.").option("--sync-primary","Sync primary language values with default values from code.").option("--sync-all","Sync primary language values with default values from code AND clear synced keys in all other locales.").action(async e=>{try{const t=m.opts().config,i=await r.ensureConfig(t),a=async()=>{const o=!!e.syncPrimary||!!e.syncAll,t=await c.runExtractor(i,{isWatchMode:!!e.watch,isDryRun:!!e.dryRun,syncPrimaryWithDefaults:o,syncAll:!!e.syncAll});return e.ci&&!t?(console.log("✅ No files were updated."),process.exit(0)):e.ci&&t&&(console.error("❌ Some files were updated. This should not happen in CI mode."),process.exit(1)),t};if(await a(),e.watch){console.log("\nWatching for changes...");const e=await x(i.extract.input),t=h(i.extract.ignore),r=w(i.extract.output),c=[...t,...r].filter(Boolean),s=e.filter(e=>!c.some(o=>n.minimatch(e,o,{dot:!0})));o.watch(s,{ignored:/node_modules/,persistent:!0}).on("change",e=>{console.log(`\nFile changed: ${e}`),a()})}}catch(e){console.error("Error running extractor:",e),process.exit(1)}}),m.command("status [locale]").description("Display translation status. Provide a locale for a detailed key-by-key view.").option("-n, --namespace <ns>","Filter the status report by a specific namespace").action(async(e,o)=>{const t=m.opts().config;let n=await r.loadConfig(t);if(!n){console.log(i.blue("No config file found. Attempting to detect project structure..."));const e=await a.detectConfig();e||(console.error(i.red("Could not automatically detect your project structure.")),console.log(`Please create a config file first by running: ${i.cyan("npx i18next-cli init")}`),process.exit(1)),console.log(i.green("Project structure detected successfully!")),n=e}await f.runStatus(n,{detail:e,namespace:o.namespace})}),m.command("types").description("Generate TypeScript definitions from translation resource files.").option("-w, --watch","Watch for file changes and re-run the type generator.").action(async e=>{const t=m.opts().config,i=await r.ensureConfig(t),a=()=>s.runTypesGenerator(i);if(await a(),e.watch){console.log("\nWatching for changes...");const e=await x(i.types?.input||[]),t=[...h(i.extract?.ignore)].filter(Boolean),r=e.filter(e=>!t.some(o=>n.minimatch(e,o,{dot:!0})));o.watch(r,{persistent:!0}).on("change",e=>{console.log(`\nFile changed: ${e}`),a()})}}),m.command("sync").description("Synchronize secondary language files with the primary language file.").action(async()=>{const e=m.opts().config,o=await r.ensureConfig(e);await l.runSyncer(o)}),m.command("migrate-config [configPath]").description("Migrate a legacy i18next-parser.config.js to the new format.").action(async e=>{await u.runMigrator(e)}),m.command("init").description("Create a new i18next.config.ts/js file with an interactive setup wizard.").action(d.runInit),m.command("lint").description("Find potential issues like hardcoded strings in your codebase.").option("-w, --watch","Watch for file changes and re-run the linter.").action(async e=>{const t=m.opts().config,c=async()=>{let e=await r.loadConfig(t);if(!e){console.log(i.blue("No config file found. Attempting to detect project structure..."));const o=await a.detectConfig();o||(console.error(i.red("Could not automatically detect your project structure.")),console.log(`Please create a config file first by running: ${i.cyan("npx i18next-cli init")}`),process.exit(1)),console.log(i.green("Project structure detected successfully!")),e=o}await g.runLinterCli(e)};if(await c(),e.watch){console.log("\nWatching for changes...");const e=await r.loadConfig(t);if(e?.extract?.input){const t=await x(e.extract.input),i=[...h(e.extract.ignore),...w(e.extract.output)].filter(Boolean),r=t.filter(e=>!i.some(o=>n.minimatch(e,o,{dot:!0})));o.watch(r,{ignored:/node_modules/,persistent:!0}).on("change",e=>{console.log(`\nFile changed: ${e}`),c()})}}}),m.command("locize-sync").description("Synchronize local translations with your locize project.").option("--update-values","Update values of existing translations on locize.").option("--src-lng-only","Check for changes in source language only.").option("--compare-mtime","Compare modification times when syncing.").option("--dry-run","Run the command without making any changes.").action(async e=>{const o=m.opts().config,t=await r.ensureConfig(o);await p.runLocizeSync(t,e)}),m.command("locize-download").description("Download all translations from your locize project.").action(async e=>{const o=m.opts().config,t=await r.ensureConfig(o);await p.runLocizeDownload(t,e)}),m.command("locize-migrate").description("Migrate local translation files to a new locize project.").action(async e=>{const o=m.opts().config,t=await r.ensureConfig(o);await p.runLocizeMigrate(t,e)}),m.command("rename-key <oldKey> <newKey>").description("Rename a translation key across all source files and translation files.").option("--dry-run","Preview changes without modifying files").action(async(e,o,t)=>{try{const n=m.opts().config,a=await r.ensureConfig(n),c=await y.runRenameKey(a,e,o,t);c.success||(c.conflicts&&(console.error(i.red("\n❌ Conflicts detected:")),c.conflicts.forEach(e=>console.error(` - ${e}`))),c.error&&console.error(i.red(`\n❌ ${c.error}`)),process.exit(1));0===c.sourceFiles.reduce((e,o)=>e+o.changes,0)&&console.log(i.yellow(`\n⚠️ No usages found for "${e}"`))}catch(e){console.error(i.red("Error renaming key:"),e),process.exit(1)}}),m.parse(process.argv);const h=e=>Array.isArray(e)?e:e?[e]:[],w=e=>e&&"string"==typeof e?[e.replace(/\{\{[^}]+\}\}/g,"*")]:[],x=async(e=[])=>{const o=h(e),n=await Promise.all(o.map(e=>t.glob(e||"",{nodir:!0})));return Array.from(new Set(n.flat()))};exports.program=m;
2
+ "use strict";var e=require("commander"),o=require("chokidar"),t=require("glob"),n=require("minimatch"),i=require("chalk"),r=require("./config.js"),a=require("./heuristic-config.js"),c=require("./extractor/core/extractor.js");require("node:path"),require("node:fs/promises"),require("jiti"),require("@croct/json5-parser");var s=require("./types-generator.js"),l=require("./syncer.js"),u=require("./migrator.js"),d=require("./init.js"),g=require("./linter.js"),f=require("./status.js"),p=require("./locize.js"),y=require("./rename-key.js");const m=new e.Command;m.name("i18next-cli").description("A unified, high-performance i18next CLI.").version("1.29.1"),m.option("-c, --config <path>","Path to i18next-cli config file (overrides detection)"),m.command("extract").description("Extract translation keys from source files and update resource files.").option("-w, --watch","Watch for file changes and re-run the extractor.").option("--ci","Exit with a non-zero status code if any files are updated.").option("--dry-run","Run the extractor without writing any files to disk.").option("--sync-primary","Sync primary language values with default values from code.").option("--sync-all","Sync primary language values with default values from code AND clear synced keys in all other locales.").action(async e=>{try{const t=m.opts().config,i=await r.ensureConfig(t),a=async()=>{const o=!!e.syncPrimary||!!e.syncAll,t=await c.runExtractor(i,{isWatchMode:!!e.watch,isDryRun:!!e.dryRun,syncPrimaryWithDefaults:o,syncAll:!!e.syncAll});return e.ci&&!t?(console.log("✅ No files were updated."),process.exit(0)):e.ci&&t&&(console.error("❌ Some files were updated. This should not happen in CI mode."),process.exit(1)),t};if(await a(),e.watch){console.log("\nWatching for changes...");const e=await x(i.extract.input),t=h(i.extract.ignore),r=w(i.extract.output),c=[...t,...r].filter(Boolean),s=e.filter(e=>!c.some(o=>n.minimatch(e,o,{dot:!0})));o.watch(s,{ignored:/node_modules/,persistent:!0}).on("change",e=>{console.log(`\nFile changed: ${e}`),a()})}}catch(e){console.error("Error running extractor:",e),process.exit(1)}}),m.command("status [locale]").description("Display translation status. Provide a locale for a detailed key-by-key view.").option("-n, --namespace <ns>","Filter the status report by a specific namespace").action(async(e,o)=>{const t=m.opts().config;let n=await r.loadConfig(t);if(!n){console.log(i.blue("No config file found. Attempting to detect project structure..."));const e=await a.detectConfig();e||(console.error(i.red("Could not automatically detect your project structure.")),console.log(`Please create a config file first by running: ${i.cyan("npx i18next-cli init")}`),process.exit(1)),console.log(i.green("Project structure detected successfully!")),n=e}await f.runStatus(n,{detail:e,namespace:o.namespace})}),m.command("types").description("Generate TypeScript definitions from translation resource files.").option("-w, --watch","Watch for file changes and re-run the type generator.").action(async e=>{const t=m.opts().config,i=await r.ensureConfig(t),a=()=>s.runTypesGenerator(i);if(await a(),e.watch){console.log("\nWatching for changes...");const e=await x(i.types?.input||[]),t=[...h(i.extract?.ignore)].filter(Boolean),r=e.filter(e=>!t.some(o=>n.minimatch(e,o,{dot:!0})));o.watch(r,{persistent:!0}).on("change",e=>{console.log(`\nFile changed: ${e}`),a()})}}),m.command("sync").description("Synchronize secondary language files with the primary language file.").action(async()=>{const e=m.opts().config,o=await r.ensureConfig(e);await l.runSyncer(o)}),m.command("migrate-config [configPath]").description("Migrate a legacy i18next-parser.config.js to the new format.").action(async e=>{await u.runMigrator(e)}),m.command("init").description("Create a new i18next.config.ts/js file with an interactive setup wizard.").action(d.runInit),m.command("lint").description("Find potential issues like hardcoded strings in your codebase.").option("-w, --watch","Watch for file changes and re-run the linter.").action(async e=>{const t=m.opts().config,c=async()=>{let e=await r.loadConfig(t);if(!e){console.log(i.blue("No config file found. Attempting to detect project structure..."));const o=await a.detectConfig();o||(console.error(i.red("Could not automatically detect your project structure.")),console.log(`Please create a config file first by running: ${i.cyan("npx i18next-cli init")}`),process.exit(1)),console.log(i.green("Project structure detected successfully!")),e=o}await g.runLinterCli(e)};if(await c(),e.watch){console.log("\nWatching for changes...");const e=await r.loadConfig(t);if(e?.extract?.input){const t=await x(e.extract.input),i=[...h(e.extract.ignore),...w(e.extract.output)].filter(Boolean),r=t.filter(e=>!i.some(o=>n.minimatch(e,o,{dot:!0})));o.watch(r,{ignored:/node_modules/,persistent:!0}).on("change",e=>{console.log(`\nFile changed: ${e}`),c()})}}}),m.command("locize-sync").description("Synchronize local translations with your locize project.").option("--update-values","Update values of existing translations on locize.").option("--src-lng-only","Check for changes in source language only.").option("--compare-mtime","Compare modification times when syncing.").option("--dry-run","Run the command without making any changes.").action(async e=>{const o=m.opts().config,t=await r.ensureConfig(o);await p.runLocizeSync(t,e)}),m.command("locize-download").description("Download all translations from your locize project.").action(async e=>{const o=m.opts().config,t=await r.ensureConfig(o);await p.runLocizeDownload(t,e)}),m.command("locize-migrate").description("Migrate local translation files to a new locize project.").action(async e=>{const o=m.opts().config,t=await r.ensureConfig(o);await p.runLocizeMigrate(t,e)}),m.command("rename-key <oldKey> <newKey>").description("Rename a translation key across all source files and translation files.").option("--dry-run","Preview changes without modifying files").action(async(e,o,t)=>{try{const n=m.opts().config,a=await r.ensureConfig(n),c=await y.runRenameKey(a,e,o,t);c.success||(c.conflicts&&(console.error(i.red("\n❌ Conflicts detected:")),c.conflicts.forEach(e=>console.error(` - ${e}`))),c.error&&console.error(i.red(`\n❌ ${c.error}`)),process.exit(1));0===c.sourceFiles.reduce((e,o)=>e+o.changes,0)&&console.log(i.yellow(`\n⚠️ No usages found for "${e}"`))}catch(e){console.error(i.red("Error renaming key:"),e),process.exit(1)}}),m.parse(process.argv);const h=e=>Array.isArray(e)?e:e?[e]:[],w=e=>e&&"string"==typeof e?[e.replace(/\{\{[^}]+\}\}/g,"*")]:[],x=async(e=[])=>{const o=h(e),n=await Promise.all(o.map(e=>t.glob(e||"",{nodir:!0})));return Array.from(new Set(n.flat()))};exports.program=m;
@@ -1 +1 @@
1
- "use strict";var e=require("node:path"),t=require("glob"),s=require("../../utils/nested-object.js"),n=require("../../utils/file-utils.js"),r=require("../../utils/default-value.js");function o(e){const t=`^${e.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*")}$`;return new RegExp(t)}function a(e,t,s,n){if(0===t.size)return!1;let r=e;const o=["zero","one","two","few","many","other"];for(const e of o){if(r.endsWith(`${s}${e}`)){r=r.slice(0,-(s.length+e.length));break}if(r.endsWith(`${s}ordinal${s}${e}`)){r=r.slice(0,-(s.length+7+s.length+e.length));break}}const a=r.split(n);if(a.length>1)for(let e=1;e<a.length;e++){const s=a.slice(0,-e).join(n);if(t.has(s))return!0}return!!t.has(r)}function l(e,t,s){if("object"!=typeof e||null===e||Array.isArray(e))return e;const n={},r=t?.extract?.pluralSeparator??"_",o=["zero","one","two","few","many","other"],a=o.map(e=>`ordinal${r}${e}`),i=Object.keys(e).sort((e,t)=>{const n=e=>{for(const t of a)if(e.endsWith(`${r}${t}`)){return{base:e.slice(0,-(r.length+t.length)),form:t,isOrdinal:!0,isPlural:!0,fullKey:e}}for(const t of o)if(e.endsWith(`${r}${t}`)){return{base:e.slice(0,-(r.length+t.length)),form:t,isOrdinal:!1,isPlural:!0,fullKey:e}}return{base:e,form:"",isOrdinal:!1,isPlural:!1,fullKey:e}},l=n(e),i=n(t);if(l.isPlural&&i.isPlural){const e=s?s(l.base,i.base):l.base.localeCompare(i.base,void 0,{sensitivity:"base"});if(0!==e)return e;if(l.isOrdinal!==i.isOrdinal)return l.isOrdinal?1:-1;const t=l.isOrdinal?a:o,n=t.indexOf(l.form),r=t.indexOf(i.form);return-1!==n&&-1!==r?n-r:l.form.localeCompare(i.form)}if(s)return s(e,t);const c=e.localeCompare(t,void 0,{sensitivity:"base"});return 0===c?e.localeCompare(t,void 0,{sensitivity:"case"}):c});for(const r of i)n[r]=l(e[r],t,s);return n}function i(e,t,n,i,c,u=[],f=new Set,d=!1,p=!1){const{keySeparator:g=".",sort:h=!0,removeUnusedKeys:y=!0,primaryLanguage:x,defaultValue:$="",pluralSeparator:S="_",contextSeparator:m="_",preserveContextVariants:O=!1}=n.extract,v=new Set;if(O)for(const{keyAcceptingContext:t}of e)t&&v.add(t);const N=new Set;let w=[],b=[];try{const e=new Intl.PluralRules(i,{type:"cardinal"}),t=new Intl.PluralRules(i,{type:"ordinal"});w=e.resolvedOptions().pluralCategories,b=t.resolvedOptions().pluralCategories,w.forEach(e=>N.add(e)),t.resolvedOptions().pluralCategories.forEach(e=>N.add(`ordinal_${e}`))}catch(e){const t=x||"en",s=new Intl.PluralRules(t,{type:"cardinal"}),n=new Intl.PluralRules(t,{type:"ordinal"});w=s.resolvedOptions().pluralCategories,b=n.resolvedOptions().pluralCategories,w.forEach(e=>N.add(e)),n.resolvedOptions().pluralCategories.forEach(e=>N.add(`ordinal_${e}`))}const k=n.extract.preservePatterns||[],j="string"==typeof n.extract.nsSeparator?n.extract.nsSeparator:":",V=e=>{if(u.some(t=>t.test(e)))return!0;for(const t of k)if("string"==typeof t){if(t.endsWith(`${j}*`)){const e=t.slice(0,-(j.length+1));if("*"===e||c&&e===c)return!0}if(t.includes(j)&&c){const[s,n]=t.split(j);if(s===c){if(o(n).test(e))return!0}}}return!1},P=e.filter(({key:e,hasCount:t,isOrdinal:s})=>{if((e=>{if(u.some(t=>t.test(e)))return!0;for(const e of k)if("string"==typeof e&&e.endsWith(`${j}*`)){const t=e.slice(0,-(j.length+1));if("*"===t||c&&t===c)return!0}return!1})(e))return!1;if(!t)return!0;const n=e.split(S);if(t&&1===n.length)return!0;if(1===w.length&&"other"===w[0]&&1===n.length)return!0;if(s&&n.includes("ordinal")){const e=n[n.length-1];return N.has(`ordinal_${e}`)}if(t){const e=n[n.length-1];return N.has(e)}return!0}),C=new Set;for(const e of P)if(e.isExpandedPlural){const t=String(e.key).split(S);t.length>=3&&"ordinal"===t[t.length-2]?C.add(t.slice(0,-2).join(S)):C.add(t.slice(0,-1).join(S))}let W=y?{}:JSON.parse(JSON.stringify(t));const _=s.getNestedKeys(t,g??".");for(const e of _){const n=V(e),r=!n&&a(e,v,S,m);if(n||O&&r){const n=s.getNestedValue(t,e,g??".");s.setNestedValue(W,e,n,g??".")}}if(y){const e=s.getNestedKeys(t,g??".");for(const n of e){const e=n.split(S);if("zero"===e[e.length-1]){const r=e.slice(0,-1).join(S);if(P.some(({key:e})=>e.split(S).slice(0,-1).join(S)===r)){const e=s.getNestedValue(t,n,g??".");s.setNestedValue(W,n,e,g??".")}}}}for(const{key:e,defaultValue:o,explicitDefault:a,hasCount:l,isExpandedPlural:u,isOrdinal:h}of P){if(l&&!u){const t=String(e).split(S);let s=e;if(t.length>=3&&"ordinal"===t[t.length-2]?s=t.slice(0,-2).join(S):t.length>=2&&(s=t.slice(0,-1).join(S)),C.has(s))continue}if(l&&!u){if(1===String(e).split(S).length&&i!==x){const a=e;if(C.has(a));else{const e=h?b:w;for(const l of e){const e=h?`${a}${S}ordinal${S}${l}`:`${a}${S}${l}`,u=s.getNestedValue(t,e,g??".");if(void 0===u){let t;t="string"==typeof o?o:r.resolveDefaultValue($,String(a),c||n?.extract?.defaultNS||"translation",i,o),s.setNestedValue(W,e,t,g??".")}else s.setNestedValue(W,e,u,g??".")}}continue}}const y=s.getNestedValue(t,e,g??"."),O=!1===g||!P.some(t=>t.key!==e&&t.key.startsWith(`${e}${g}`)),v="object"==typeof y&&null!==y&&(f.has(e)||!o||o===e),N="object"==typeof y&&null!==y&&O&&!f.has(e)&&!v;if(v){s.setNestedValue(W,e,y,g??".");continue}let k;if(void 0===y||N)if(i===x)if(d){const t=o&&(o===e||j&&c&&o===`${c}${j}${e}`||e!==o&&(e.startsWith(o+S)||e.startsWith(o+m)));k=o&&!t?o:r.resolveDefaultValue($,e,c||n?.extract?.defaultNS||"translation",i,o)}else k=o||e;else k=r.resolveDefaultValue($,e,c||n?.extract?.defaultNS||"translation",i,o);else if(i===x&&d){const t=o&&(o===e||j&&c&&o===`${c}${j}${e}`||e!==o&&(e.startsWith(o+S)||e.startsWith(o+m)));k=(e.includes(S)||e.includes(m))&&!a?y:o&&!t?r.resolveDefaultValue(o,e,c||n?.extract?.defaultNS||"translation",i,o):y}else k=p&&i!==x&&a?r.resolveDefaultValue($,e,c||n?.extract?.defaultNS||"translation",i,o):y;s.setNestedValue(W,e,k,g??".")}if(!0===h)return l(W,n);if("function"==typeof h){const t={},s=Object.keys(W),r=new Map;for(const t of e)if(r.set(String(t.key),t),g){const e=String(t.key).split(g)[0];r.has(e)||r.set(e,t)}const o=(e,t)=>{const s=r.get(e),n=r.get(t);if(s&&n)return h(s,n);return h({key:e},{key:t})};s.sort(o);for(const e of s)t[e]=l(W[e],n,o);W=t}return W}exports.getTranslations=async function(s,r,a,{syncPrimaryWithDefaults:l=!1,syncAll:c=!1}={}){a.extract.primaryLanguage||=a.locales[0]||"en",a.extract.secondaryLanguages||=a.locales.filter(e=>e!==a?.extract?.primaryLanguage);const u=[...a.extract.preservePatterns||[]],f=a.extract.indentation??2;for(const e of r)u.push(`${e}.*`);const d=u.map(o),p="__no_namespace__",g=new Map;for(const e of s.values()){const t=e.nsIsImplicit&&!1===a.extract.defaultNS?p:String(e.ns??a.extract.defaultNS??"translation");g.has(t)||g.set(t,[]),g.get(t).push(e)}const h=[],y=Array.isArray(a.extract.ignore)?a.extract.ignore:a.extract.ignore?[a.extract.ignore]:[];for(const s of a.locales){if(a.extract.mergeNamespaces||"string"==typeof a.extract.output&&!a.extract.output.includes("{{namespace}}")){const t={},o=n.getOutputPath(a.extract.output,s),c=e.resolve(process.cwd(),o),u=await n.loadTranslationFile(c)||{},y=Object.keys(u),x=!1!==a.extract.defaultNS&&y.some(e=>{const t=u[e];return"object"==typeof t&&null!==t&&!Array.isArray(t)})?new Set([...g.keys(),...y]):new Set([...g.keys(),p]);for(const e of x){const n=g.get(e)||[];if(e===p){const e=i(n,u,a,s,void 0,d,r,l);Object.assign(t,e)}else{const o=u[e]||{};t[e]=i(n,o,a,s,e,d,r,l)}}const $=JSON.stringify(u,null,f),S=JSON.stringify(t,null,f);h.push({path:c,updated:S!==$,newTranslations:t,existingTranslations:u})}else{const o=new Set(g.keys()),u=n.getOutputPath(a.extract.output,s,"*").replace(/\\/g,"/"),p=await t.glob(u,{ignore:y});for(const t of p)o.add(e.basename(t,e.extname(t)));for(const t of o){const o=g.get(t)||[],u=n.getOutputPath(a.extract.output,s,t),p=e.resolve(process.cwd(),u),y=await n.loadTranslationFile(p)||{},x=i(o,y,a,s,t,d,r,l,c),$=JSON.stringify(y,null,f),S=JSON.stringify(x,null,f);h.push({path:p,updated:S!==$,newTranslations:x,existingTranslations:y})}}}return h};
1
+ "use strict";var e=require("node:path"),t=require("glob"),s=require("../../utils/nested-object.js"),n=require("../../utils/file-utils.js"),r=require("../../utils/default-value.js");function a(e){const t=`^${e.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*")}$`;return new RegExp(t)}function o(e,t,s,n){if(0===t.size)return!1;let r=e;const a=["zero","one","two","few","many","other"];for(const e of a){if(r.endsWith(`${s}${e}`)){r=r.slice(0,-(s.length+e.length));break}if(r.endsWith(`${s}ordinal${s}${e}`)){r=r.slice(0,-(s.length+7+s.length+e.length));break}}const o=r.split(n);if(o.length>1)for(let e=1;e<o.length;e++){const s=o.slice(0,-e).join(n);if(t.has(s))return!0}return!!t.has(r)}function i(e,t,s){if("object"!=typeof e||null===e||Array.isArray(e))return e;const n={},r=t?.extract?.pluralSeparator??"_",a=["zero","one","two","few","many","other"],o=a.map(e=>`ordinal${r}${e}`),l=Object.keys(e).sort((e,t)=>{const n=e=>{for(const t of o)if(e.endsWith(`${r}${t}`)){return{base:e.slice(0,-(r.length+t.length)),form:t,isOrdinal:!0,isPlural:!0,fullKey:e}}for(const t of a)if(e.endsWith(`${r}${t}`)){return{base:e.slice(0,-(r.length+t.length)),form:t,isOrdinal:!1,isPlural:!0,fullKey:e}}return{base:e,form:"",isOrdinal:!1,isPlural:!1,fullKey:e}},i=n(e),l=n(t);if(i.isPlural&&l.isPlural){const e=s?s(i.base,l.base):i.base.localeCompare(l.base,void 0,{sensitivity:"base"});if(0!==e)return e;if(i.isOrdinal!==l.isOrdinal)return i.isOrdinal?1:-1;const t=i.isOrdinal?o:a,n=t.indexOf(i.form),r=t.indexOf(l.form);return-1!==n&&-1!==r?n-r:i.form.localeCompare(l.form)}if(s)return s(e,t);const c=e.localeCompare(t,void 0,{sensitivity:"base"});return 0===c?e.localeCompare(t,void 0,{sensitivity:"case"}):c});for(const r of l)n[r]=i(e[r],t,s);return n}function l(e,t,n,l,c,u=[],f=new Set,d=!1,p=!1){const{keySeparator:g=".",sort:h=!0,removeUnusedKeys:y=!0,primaryLanguage:x,defaultValue:$="",pluralSeparator:S="_",contextSeparator:m="_",preserveContextVariants:O=!1}=n.extract,v=new Set;if(O)for(const{keyAcceptingContext:t}of e)t&&v.add(t);const N=new Set;let w=[],b=[];try{const e=new Intl.PluralRules(l,{type:"cardinal"}),t=new Intl.PluralRules(l,{type:"ordinal"});w=e.resolvedOptions().pluralCategories,b=t.resolvedOptions().pluralCategories,w.forEach(e=>N.add(e)),t.resolvedOptions().pluralCategories.forEach(e=>N.add(`ordinal_${e}`))}catch(e){const t=x||"en",s=new Intl.PluralRules(t,{type:"cardinal"}),n=new Intl.PluralRules(t,{type:"ordinal"});w=s.resolvedOptions().pluralCategories,b=n.resolvedOptions().pluralCategories,w.forEach(e=>N.add(e)),n.resolvedOptions().pluralCategories.forEach(e=>N.add(`ordinal_${e}`))}const k=n.extract.preservePatterns||[],j="string"==typeof n.extract.nsSeparator?n.extract.nsSeparator:":",V=e=>{if(u.some(t=>t.test(e)))return!0;for(const t of k)if("string"==typeof t){if(t.endsWith(`${j}*`)){const e=t.slice(0,-(j.length+1));if("*"===e||c&&e===c)return!0}if(t.includes(j)&&c){const[s,n]=t.split(j);if(s===c){if(a(n).test(e))return!0}}}return!1},P=e.filter(({key:e,hasCount:t,isOrdinal:s})=>{if((e=>{if(u.some(t=>t.test(e)))return!0;for(const e of k)if("string"==typeof e&&e.endsWith(`${j}*`)){const t=e.slice(0,-(j.length+1));if("*"===t||c&&t===c)return!0}return!1})(e))return!1;if(!t)return!0;const n=e.split(S);if(t&&1===n.length)return!0;if(1===w.length&&"other"===w[0]&&1===n.length)return!0;if(s&&n.includes("ordinal")){const e=n[n.length-1];return N.has(`ordinal_${e}`)}if(t){const e=n[n.length-1];return N.has(e)}return!0}),C=new Set;for(const e of P)if(e.isExpandedPlural){const t=String(e.key).split(S);t.length>=3&&"ordinal"===t[t.length-2]?C.add(t.slice(0,-2).join(S)):C.add(t.slice(0,-1).join(S))}let W=y?{}:JSON.parse(JSON.stringify(t));const _=s.getNestedKeys(t,g??".");for(const e of _){const n=V(e),r=!n&&o(e,v,S,m);if(n||O&&r){const n=s.getNestedValue(t,e,g??".");s.setNestedValue(W,e,n,g??".")}}if(y){const e=s.getNestedKeys(t,g??".");for(const n of e){const e=n.split(S);if("zero"===e[e.length-1]){const r=e.slice(0,-1).join(S);if(P.some(({key:e})=>e.split(S).slice(0,-1).join(S)===r)){const e=s.getNestedValue(t,n,g??".");s.setNestedValue(W,n,e,g??".")}}}}for(const{key:e,defaultValue:a,explicitDefault:o,hasCount:i,isExpandedPlural:u,isOrdinal:h}of P){if(i&&!u){const t=String(e).split(S);let s=e;if(t.length>=3&&"ordinal"===t[t.length-2]?s=t.slice(0,-2).join(S):t.length>=2&&(s=t.slice(0,-1).join(S)),C.has(s))continue}if(i&&!u){if(1===String(e).split(S).length&&l!==x){const o=e;if(C.has(o));else{const e=h?b:w;for(const i of e){const e=h?`${o}${S}ordinal${S}${i}`:`${o}${S}${i}`,u=!e.startsWith("<")&&(g??"."),f=s.getNestedValue(t,e,u);if(void 0===f){let t;t="string"==typeof a?a:r.resolveDefaultValue($,String(o),c||n?.extract?.defaultNS||"translation",l,a),s.setNestedValue(W,e,t,u)}else s.setNestedValue(W,e,f,u)}}continue}}const y=!e.startsWith("<")&&(g??"."),O=s.getNestedValue(t,e,y),v=!1===g||!P.some(t=>t.key!==e&&t.key.startsWith(`${e}${g}`)),N="object"==typeof O&&null!==O&&(f.has(e)||!a||a===e),k="object"==typeof O&&null!==O&&v&&!f.has(e)&&!N;if(N){s.setNestedValue(W,e,O,y);continue}let V;if(void 0===O||k)if(l===x)if(d){const t=a&&(a===e||j&&c&&a===`${c}${j}${e}`||e!==a&&(e.startsWith(a+S)||e.startsWith(a+m)));V=a&&!t?a:r.resolveDefaultValue($,e,c||n?.extract?.defaultNS||"translation",l,a)}else V=a||e;else V=r.resolveDefaultValue($,e,c||n?.extract?.defaultNS||"translation",l,a);else if(l===x&&d){const t=a&&(a===e||j&&c&&a===`${c}${j}${e}`||e!==a&&(e.startsWith(a+S)||e.startsWith(a+m)));V=(e.includes(S)||e.includes(m))&&!o?O:a&&!t?r.resolveDefaultValue(a,e,c||n?.extract?.defaultNS||"translation",l,a):O}else V=p&&l!==x&&o?r.resolveDefaultValue($,e,c||n?.extract?.defaultNS||"translation",l,a):O;s.setNestedValue(W,e,V,y)}if(!0===h)return i(W,n);if("function"==typeof h){const t={},s=Object.keys(W),r=new Map;for(const t of e)if(r.set(String(t.key),t),g){const e=String(t.key).split(g)[0];r.has(e)||r.set(e,t)}const a=(e,t)=>{const s=r.get(e),n=r.get(t);if(s&&n)return h(s,n);return h({key:e},{key:t})};s.sort(a);for(const e of s)t[e]=i(W[e],n,a);W=t}return W}exports.getTranslations=async function(s,r,o,{syncPrimaryWithDefaults:i=!1,syncAll:c=!1}={}){o.extract.primaryLanguage||=o.locales[0]||"en",o.extract.secondaryLanguages||=o.locales.filter(e=>e!==o?.extract?.primaryLanguage);const u=[...o.extract.preservePatterns||[]],f=o.extract.indentation??2;for(const e of r)u.push(`${e}.*`);const d=u.map(a),p="__no_namespace__",g=new Map;for(const e of s.values()){const t=e.nsIsImplicit&&!1===o.extract.defaultNS?p:String(e.ns??o.extract.defaultNS??"translation");g.has(t)||g.set(t,[]),g.get(t).push(e)}const h=[],y=Array.isArray(o.extract.ignore)?o.extract.ignore:o.extract.ignore?[o.extract.ignore]:[];for(const s of o.locales){if(o.extract.mergeNamespaces||"string"==typeof o.extract.output&&!o.extract.output.includes("{{namespace}}")){const t={},a=n.getOutputPath(o.extract.output,s),c=e.resolve(process.cwd(),a),u=await n.loadTranslationFile(c)||{},y=Object.keys(u),x=!1!==o.extract.defaultNS&&y.some(e=>{const t=u[e];return"object"==typeof t&&null!==t&&!Array.isArray(t)})?new Set([...g.keys(),...y]):new Set([...g.keys(),p]);for(const e of x){const n=g.get(e)||[];if(e===p){const e=l(n,u,o,s,void 0,d,r,i);Object.assign(t,e)}else{const a=u[e]||{};t[e]=l(n,a,o,s,e,d,r,i)}}const $=JSON.stringify(u,null,f),S=JSON.stringify(t,null,f);h.push({path:c,updated:S!==$,newTranslations:t,existingTranslations:u})}else{const a=new Set(g.keys()),u=n.getOutputPath(o.extract.output,s,"*").replace(/\\/g,"/"),p=await t.glob(u,{ignore:y});for(const t of p)a.add(e.basename(t,e.extname(t)));for(const t of a){const a=g.get(t)||[],u=n.getOutputPath(o.extract.output,s,t),p=e.resolve(process.cwd(),u),y=await n.loadTranslationFile(p)||{},x=l(a,y,o,s,t,d,r,i,c),$=JSON.stringify(y,null,f),S=JSON.stringify(x,null,f);h.push({path:p,updated:S!==$,newTranslations:x,existingTranslations:y})}}}return h};
@@ -1 +1 @@
1
- "use strict";var e=require("./ast-utils.js");function t(t){if(t)return"StringLiteral"===t.type?t.value:"TemplateLiteral"===t.type&&e.isSimpleTemplateLiteral(t)?t.quasis[0].cooked:void 0}function n(e){return"StringLiteral"===e.value?.type?e.value.value:"JSXExpressionContainer"===e.value?.type?t(e.value.expression):void 0}exports.extractFromTransComponent=function(i,s){const r=i.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"i18nKey"===e.name.value),o=i.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"defaults"===e.name.value),p=i.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"count"===e.name.value),l=i.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"values"===e.name.value);let a;p||"JSXAttribute"!==l?.type||"JSXExpressionContainer"!==l.value?.type||"ObjectExpression"!==l.value.expression.type||(a=e.getObjectPropValueExpression(l.value.expression,"count"));const c=!!p||!!a,u=i.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"tOptions"===e.name.value),f="JSXAttribute"===u?.type&&"JSXExpressionContainer"===u.value?.type&&"ObjectExpression"===u.value.expression.type?u.value.expression:void 0,y=i.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"ordinal"===e.name.value),g=!!y,d=i.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"context"===e.name.value);let x="JSXAttribute"===d?.type&&"JSXExpressionContainer"===d.value?.type?d.value.expression:"JSXAttribute"===d?.type&&"StringLiteral"===d.value?.type?d.value:void 0;const h=i.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"ns"===e.name.value);let v;v="JSXAttribute"===h?.type?n(h):void 0,f&&(void 0===v&&(v=e.getObjectPropValue(f,"ns")),void 0===x&&(x=e.getObjectPropValueExpression(f,"context")));const S=function(e,n){if(!e||0===e.length)return"";const i=new Set(n.extract.transKeepBasicHtmlNodesFor??["br","strong","i","p"]),s=e=>e&&"JSXText"===e.type&&/^\s*$/.test(e.value)&&e.value.includes("\n");function r(e,n,o=!1,p=!1){if(!e||!e.length)return;const l=p&&e.filter(e=>e&&"JSXElement"===e.type&&"p"===e.opening?.name?.value).length>1;let a=0,c=e.length-1;for(;a<=c&&s(e[a]);)a++;for(;c>=a&&s(e[c]);)c--;const u=a<=c?e.slice(a,c+1):[],f=u.some(e=>e&&("JSXElement"===e.type||"JSXFragment"===e.type));for(let e=0;e<u.length;e++){const a=u[e];if(a)if("JSXText"!==a.type){if("JSXExpressionContainer"===a.type){if(o&&!f&&a.expression){const e=a.expression.type;if("ObjectExpression"===e){const e=a.expression.properties&&a.expression.properties[0];if(e&&"KeyValueProperty"===e.type)continue}if(void 0!==t(a.expression))continue;if("Identifier"===e||"MemberExpression"===e||"CallExpression"===e)continue}const i=t(a.expression);if(void 0!==i){const t=/^\s*$/.test(i)&&!i.includes("\n"),r=u[e-1],o=u[e+1];if(t){const t=u[e+2];if(o&&"JSXText"===o.type&&s(o)&&t&&("JSXElement"===t.type||"JSXFragment"===t.type)){const t=u[e-1],n=u[e-2];if(!t||"JSXText"!==t.type&&n&&"JSXExpressionContainer"===n.type)continue}if(r&&("JSXElement"===r.type||"JSXFragment"===r.type)&&o&&"JSXText"===o.type&&s(o))continue;const i=!o||"JSXText"===o.type&&!s(o);if(r&&"JSXText"===r.type&&i){const e=n[n.length-1];if(e&&"JSXText"===e.type){e.value=String(e.value)+a.expression.value;continue}}if(r&&("JSXElement"===r.type||"JSXFragment"===r.type)&&o&&"JSXText"===o.type&&s(o))continue}}n.push(a);continue}if("JSXElement"===a.type){const e=a.opening&&a.opening.name&&"Identifier"===a.opening.name.type?a.opening.name.value:void 0;if(e&&i.has(e)){const o=a.opening&&Array.isArray(a.opening.attributes)&&a.opening.attributes.length>0,c=a.children||[],f=1===c.length&&("JSXText"===c[0]?.type||"JSXExpressionContainer"===c[0]?.type&&void 0!==t(c[0].expression)),y=!c.length,g=f;if(o&&!f)n.push(a),r(a.children||[],n,!0);else if(y)n.push(a);else if(!g)if("p"===e){const e=(c||[]).some(e=>{if(!e||"JSXElement"!==e.type)return!1;const n=e.opening&&e.opening.name&&"Identifier"===e.opening.name.type?e.opening.name.value:void 0,s=e.opening&&Array.isArray(e.opening.attributes)&&e.opening.attributes.length>0,r=e.children||[],o=1===r.length&&("JSXText"===r[0]?.type||"JSXExpressionContainer"===r[0]?.type&&void 0!==t(r[0].expression));return!(n&&i.has(n)&&!s&&(0===r.length||o))}),o=p&&u.some(e=>e&&e!==a&&"JSXText"===e.type&&!s(e));l||p&&e&&!o?(n.push(a),r(a.children||[],n,!0,!1)):r(a.children||[],n,!1,!1)}else r(a.children||[],n,!1,!1);continue}n.push(a),r(a.children||[],n,!0);continue}"JSXFragment"!==a.type||r(a.children||[],n,o)}else{if(o&&!f)continue;if(o&&s(a))continue;if(s(a)){const t=u[e-1],i=u[e+1];if(t&&("JSXElement"===t.type||"JSXFragment"===t.type)&&i&&("JSXElement"===i.type||"JSXFragment"===i.type))continue;const s=n[n.length-1],r=u[e-1];if(s){if(r&&"JSXExpressionContainer"===r.type)continue;if("JSXText"===s.type&&r&&"JSXText"===r.type){s.value=String(s.value)+a.value;continue}}}if(o&&f&&0===e)continue;n.push(a)}}}const o=[];function p(e){if(!e||!e.length)return!1;let t=!1;for(const n of e)if(n)if("JSXElement"!==n.type){if("JSXExpressionContainer"===n.type&&-1!==o.indexOf(n))return t;if("JSXText"===n.type&&-1!==o.indexOf(n)){if(s(n))continue;if(!t)return!0;const i=e.indexOf(n);if(e.slice(i+1).some(e=>e&&"JSXElement"===e.type))return!0}}else t=!0;return!1}r(e,o,!1,!0);const l=new Set,a=e=>String(e).replace(/^\s*\n\s*/g,"").replace(/\s*\n\s*$/g,"");function c(e,n,r=!1){if(!e||0===e.length)return"";let u="";const f=e=>{if(!e)return-1;if(n&&n.has(e))return n.get(e);if(n)for(const[t,i]of n.entries())try{if(t&&e&&t.span&&e.span&&t.span.start===e.span.start&&t.span.end===e.span.end)return i}catch(e){}return o.indexOf(e)};let y=0;for(let n=0;n<e.length;n++){const g=e[n];if(g){if("JSXText"===g.type){if(s(g))continue;const t=e[n+1],r=e[n-1];if(r&&"JSXElement"===r.type){const t="Identifier"===r.opening?.name?.type?r.opening.name.value:void 0,s=t&&i.has(t),o=0===(r.children||[]).length;if(s&&o&&/^\s*\n\s*/.test(g.value)){const e=g.value.replace(/^\s*\n\s*/,"");if(e){u+=e;continue}continue}if(!s&&/^\s*\n\s*/.test(g.value)){const t=g.value.replace(/^\s*\n\s*/,"");if(t){if(r&&"JSXElement"===r.type&&Array.isArray(r.children)&&0===r.children.length){u+=t;continue}const i=e[n-2];if(i&&"JSXText"===i.type){const e=i.value.replace(/\n\s*$/,""),n=/[A-Za-z0-9]$/.test(e),s=/^[A-Za-z0-9]/.test(t),r=/^[a-z]/.test(t);if(n&&s&&r){u+=t;continue}}u+=" "+t;continue}continue}}if(/\n\s*$/.test(g.value)&&t&&"JSXElement"===t.type){const r=g.value.replace(/\n\s*$/,"");if(r.trim()){const o="Identifier"===t.opening?.name?.type?t.opening.name.value:void 0,p=o&&i.has(o),a=(t.children||[]).length>0,c=/\s\n/.test(g.value),f=e[n+2],y=f&&"JSXText"===f.type&&!s(f)&&/[a-zA-Z0-9]/.test(f.value),d=!!(t.opening&&Array.isArray(t.opening.attributes)&&t.opening.attributes.length>0),x=/^\s/.test(r)&&!/^\n/.test(r),h=r.trim(),v=x?" "+h:h,S=/[A-Za-z0-9]$/.test(h),m=f&&"string"==typeof f.value&&/^[A-Za-z0-9]/.test(f.value.trim()),J=f&&"string"==typeof f.value&&/^[a-z]/.test(f.value.trim()),X=f&&"string"==typeof f.value&&/^\s/.test(f.value)&&!/^\n/.test(f.value),$=d&&a&&y&&!(S&&m&&J&&!c&&!x&&!X),E=f&&"string"==typeof f.value&&/^[,;:!?.]/.test(f.value.trim()),b=$&&!E;S&&m&&J&&!c&&!x&&!X&&l.add(t),u+=c||p&&a||!p&&y&&x||b?v+" ":v;continue}}u+=g.value;continue}if("JSXExpressionContainer"===g.type){const e=g.expression;if(!e)continue;const n=t(e);if(void 0!==n)u+=n;else if("Identifier"===e.type)u+=`{{${e.value}}}`;else if("TsAsExpression"===e.type&&"ObjectExpression"===e.expression?.type){const t=e.expression,n=t.properties.filter(e=>"KeyValueProperty"===e.type&&e.key&&"Identifier"===e.key.type).map(e=>e.key.value);if(n.length>0)u+=n.map(e=>`{{${e}}}`).join("");else{const e=t.properties[0];if(!e||"Identifier"!==e.type)throw new Error("Unrecognized expression in JSX placeholder");u+=`{{${e.value}}}`}}else if("ObjectExpression"===e.type){const t=e.properties[0];if(t&&"KeyValueProperty"===t.type&&t.key&&"Identifier"===t.key.type)u+=`{{${t.key.value}}}`;else{if(!t||"Identifier"!==t.type)throw new Error("Unrecognized expression in JSX placeholder");u+=`{{${t.value}}}`}}else if("MemberExpression"===e.type&&e.property&&"Identifier"===e.property.type)u+=`{{${e.property.value}}}`;else{if("CallExpression"!==e.type||"Identifier"!==e.callee?.type)throw new Error("Unrecognized expression in JSX placeholder");u+=`{{${e.callee.value}}}`}continue}if("JSXElement"===g.type){let l;g.opening&&g.opening.name&&"Identifier"===g.opening.name.type&&(l=g.opening.name.value);const d=r?y:void 0;if(r&&"JSXElement"===g.type&&y++,l&&i.has(l)){const x=g.opening&&Array.isArray(g.opening.attributes)&&g.opening.attributes.length>0,h=g.children||[],v=h.length>0,S=1===h.length&&("JSXText"===h[0]?.type||"JSXExpressionContainer"===h[0]?.type&&void 0!==t(h[0].expression)),m="p"===l;let J=0;if(m&&r&&(J=e.filter(e=>e&&"JSXElement"===e.type&&"p"===e.opening?.name?.value).length),!v||S){const t=S?c(h,void 0):"";if(""!==String(t).trim())if(i.has(l)&&"p"!==l)u+=`<${l}>${a(t)}</${l}>`;else if(m&&r&&J>1)u+=`<${l}>${a(t)}</${l}>`;else if(m){const e=r?y-1:o.indexOf(g);u+=`<${e}>${a(t)}</${e}>`}else{const e=r?y-1:o.indexOf(g);u+=`<${e}>${a(t)}</${e}>`}else{const t=e[n-1];t&&"JSXText"===t.type&&/\n\s*$/.test(t.value)&&(u=u.replace(/\s+$/,"")),u+=`<${l} />`}}else if(x&&!S){const e=h,n=f(g);if(p(e)){const s=new Map;let r=0;for(const n of e)if(n&&"JSXElement"===n.type){const e=n.opening&&n.opening.name&&"Identifier"===n.opening.name.type?n.opening.name.value:void 0;if(e&&i.has(e)){const e=n.opening&&Array.isArray(n.opening.attributes)&&n.opening.attributes.length>0,i=n.children||[],o=1===i.length&&("JSXText"===i[0]?.type||"JSXExpressionContainer"===i[0]?.type&&void 0!==t(i[0].expression));!e&&(!i.length||o)||s.set(n,r++)}else s.set(n,r++)}const o=c(e,s.size?s:void 0);u+=`<${n}>${a(o)}</${n}>`}else{const e=new Map;let s=0;for(const n of h)if(n&&"JSXElement"===n.type){const r=n.opening&&n.opening.name&&"Identifier"===n.opening.name.type?n.opening.name.value:void 0;if(r&&i.has(r)){const i=n.opening&&Array.isArray(n.opening.attributes)&&n.opening.attributes.length>0,r=n.children||[],o=1===r.length&&("JSXText"===r[0]?.type||"JSXExpressionContainer"===r[0]?.type&&void 0!==t(r[0].expression));!i&&(!r.length||o)||e.set(n,s++)}else e.set(n,s++)}const r=c(h,e.size?e:void 0);u+=`<${n}>${a(r)}</${n}>`}}else{const e=o.indexOf(g);if(-1!==e){const n=void 0!==d?d:e;if((()=>{let e=!1;for(const t of h)if(t)if("JSXElement"!==t.type){if("JSXExpressionContainer"===t.type&&-1!==o.indexOf(t))return e;if("JSXText"===t.type&&-1!==o.indexOf(t)){if(s(t))continue;if(!e)return!0;if(h.slice(h.indexOf(t)+1).some(e=>e&&"JSXElement"===e.type))return!0}}else e=!0;return!1})()){if(0===n){const e=c(h,void 0,!1);u+=`<${n}>${a(e)}</${n}>`;continue}const e=new Map;let s=0;for(const n of h)if(n&&"JSXElement"===n.type){const r=n.opening&&n.opening.name&&"Identifier"===n.opening.name.type?n.opening.name.value:void 0;if(r&&i.has(r)){const i=n.opening&&Array.isArray(n.opening.attributes)&&n.opening.attributes.length>0,r=n.children||[],o=1===r.length&&("JSXText"===r[0]?.type||"JSXExpressionContainer"===r[0]?.type&&void 0!==t(r[0].expression));!i&&(!r.length||o)||e.set(n,s++)}else e.set(n,s++)}const r=c(h,e.size?e:void 0,!1);u+=`<${n}>${a(r)}</${n}>`;continue}const r=new Map;let p=0;for(const e of h)if(e&&"JSXElement"===e.type){const n=e.opening&&e.opening.name&&"Identifier"===e.opening.name.type?e.opening.name.value:void 0;if(n&&i.has(n)){const n=e.opening&&Array.isArray(e.opening.attributes)&&e.opening.attributes.length>0,i=e.children||[],s=1===i.length&&("JSXText"===i[0]?.type||"JSXExpressionContainer"===i[0]?.type&&void 0!==t(i[0].expression));!n&&(!i.length||s)||r.set(e,p++)}else r.set(e,p++)}const l=c(h,r.size>0?r:void 0,!1);u+=`<${n}>${a(l)}</${n}>`}else{const e=c(h,void 0,!1);u+=`<${l}>${a(e)}</${l}>`}}}else{const e=g.children||[];if(e.some(e=>e&&("JSXText"===e.type||"JSXExpressionContainer"===e.type)&&-1!==o.indexOf(e))){const t=o.indexOf(g),n=c(e,void 0);u+=`<${t}>${a(n)}</${t}>`}else{const t=new Map,n=f(g);let s=0;for(const n of e)if(n&&"JSXElement"===n.type){const e=n.opening&&n.opening.name&&"Identifier"===n.opening.name.type?n.opening.name.value:void 0;if(e&&i.has(e)){const e=n.opening&&Array.isArray(n.opening.attributes)&&n.opening.attributes.length>0,i=n.children||[],r=1===i.length&&"JSXText"===i[0]?.type;!e&&(!i.length||r)||t.set(n,s++)}else t.set(n,s++)}const r=c(e,t.size?t:void 0);u+=`<${n}>${a(r)}</${n}>`}}continue}"JSXFragment"!==g.type||(u+=c(g.children||[]))}}return u}const u=c(e,void 0,!0),f=String(u).replace(/<br \/>\s*\n\s*/g,"<br />"),y=String(f),g=new Set;if(l&&l.size>0)for(let e=0;e<o.length;e++)l.has(o[e])&&g.add(e);let d=String(y);if(g&&g.size>0)for(const e of g)try{d=d.replace(new RegExp("\\s+<"+e+">","g"),"<"+e+">"),d=d.replace(new RegExp("<\\/"+e+">\\s+","g"),"</"+e+">")}catch(e){}d=d.replace(/<\/(\d+)>\s*\n\s*(\S)/g,(e,t,n)=>{const i=Number(t);return g.has(i)?`</${t}>${n}`:`</${t}> ${n}`}),d=d.replace(/(\S)\s*\n\s*<(\d+)/g,(e,t,n)=>{const i=Number(n);return g.has(i)?`${t}<${n}`:`${t} <${n}`}),d=d.replace(/\s*\n\s*/g," "),d=d.replace(/\s+/g," "),d=d.replace(/\s+([,;:!?.])/g,"$1");const x=d.trim();let h=String(x);if(g&&g.size>0)for(const e of g)try{h=h.replace(new RegExp("[\\s\\u00A0]+<"+e+">","g"),"<"+e+">"),h=h.replace(new RegExp("<\\/"+e+">[\\s\\u00A0]+","g"),"</"+e+">")}catch(e){}try{for(let e=0;e<o.length;e++){const t=o[e];if(!t||"JSXElement"!==t.type)continue;const n=o[e-1],i=o[e+1];if(!n||!i)continue;if("JSXText"!==n.type||"JSXText"!==i.type)continue;const s=String(n.value),r=String(i.value),p=s.replace(/\n\s*$/,""),l=/[A-Za-z0-9]$/.test(p),a=/^[A-Za-z0-9]/.test(r.trim()),c=/^[a-z]/.test(r.trim()),u=/\s\n/.test(s),f=r&&/^\s/.test(r)&&!/^\n/.test(r);if(l&&a&&c&&!u&&!f){const t=e;h=h.replace(new RegExp("\\s+<"+t+">","g"),"<"+t+">")}}}catch(e){}function v(e){if(!e||!e.includes("<"))return e;function t(e){const t=[],n=[];let i=0;const s=/<\/?(\d+)>|<[^>]+>/g;let r;for(;r=s.exec(e);){const o=r[0],p=r.index;if(p>i){const s={type:"text",text:e.slice(i,p)};n.length?n[n.length-1].node.children.push(s):t.push(s)}const l=/^<\/(\d+)>$/.exec(o),a=/^<(\d+)>$/.exec(o);if(a){const e=Number(a[1]),i={type:"ph",idx:e,children:[]};n.length?n[n.length-1].node.children.push(i):t.push(i),n.push({node:i,idx:e})}else if(l)n.length&&n.pop();else{const e={type:"text",text:o};n.length?n[n.length-1].node.children.push(e):t.push(e)}i=s.lastIndex}if(i<e.length){const s={type:"text",text:e.slice(i)};n.length?n[n.length-1].node.children.push(s):t.push(s)}return t}function n(e,t=null){let s="";for(const r of e)if("text"===r.type)s+=r.text;else{const e=r.children.filter(e=>"ph"===e.type),p=e.map(e=>e.idx);if(!(p.length<=1||p.every((e,t)=>0===t||e===p[t-1]+1))){const e=r.children.map(e=>"text"===e.type?e.text:`<${e.idx}>${n(e.children,e.idx)}</${e.idx}>`).join("");s+=`<${r.idx}>${e}</${r.idx}>`;continue}const l=new Map;let a=0;try{const n=o[r.idx];if(n&&n.span){const s=n.span.start,p=n.span.end;let l=-1;for(let e=r.idx+1;e<o.length;e++){const t=o[e];if(t&&t.span&&(t.span.start>=s&&t.span.end<=p&&"JSXElement"===t.type)){l=e;break}}let c=0;if(-1!==l)for(let e=r.idx+1;e<l;e++){const t=o[e];t&&t.span&&(t.span.start>=s&&t.span.end<=p&&("JSXText"!==t.type&&"JSXExpressionContainer"!==t.type||c++))}else for(let e=r.idx+1;e<o.length;e++){const t=o[e];t&&t.span&&(t.span.start>=s&&t.span.end<=p&&("JSXText"!==t.type&&"JSXExpressionContainer"!==t.type||c++))}if("number"==typeof r.idx){const n=o[r.idx],s=n?.opening?.name?.value,p=s&&i.has(s),l=null===t;1===e.length?(a=Math.max(1,c+1),!l||p||0!==e[0].idx||"a"!==s&&"p"!==s||(a=0)):a=0}}}catch(e){}for(const t of e)l.has(t.idx)||l.set(t.idx,a++);const c=r.children.map(e=>{if("text"===e.type)return e.text;const t=e.idx,i=l.has(t)?l.get(t):t;return`<${i}>${n(e.children,i)}</${i}>`}).join("");s+=`<${r.idx}>${c}</${r.idx}>`}return s}try{return n(t(e))}catch(t){return e}}return h=v(h),h.trim()}(i.children,s);let m;const J="JSXAttribute"===o?.type?n(o):void 0;if(void 0!==J)m=J;else{const e=s.extract.defaultValue;m="string"==typeof e?e:""}let X,$;if("JSXAttribute"===r?.type){if("StringLiteral"===r.value?.type){if(X=r.value,$=X.value,!$||""===$.trim())return null;if(v&&"StringLiteral"===X.type){const e=s.extract.nsSeparator??":",t=X.value;if(e&&t.startsWith(`${v}${e}`)){if($=t.slice(`${v}${e}`.length),!$||""===$.trim())return null;X={...X,value:$}}}}else"JSXExpressionContainer"===r.value?.type&&"JSXEmptyExpression"!==r.value.expression.type&&(X=r.value.expression);if(!X)return null}return o||!$||S.trim()?!o&&S.trim()&&(m=S):m=$,{keyExpression:X,serializedChildren:S,ns:v,defaultValue:m,hasCount:c,isOrdinal:g,contextExpression:x,optionsNode:f,explicitDefault:void 0!==J||(e=>{if(!e||!Array.isArray(e.properties))return!1;for(const t of e.properties)if(t&&"KeyValueProperty"===t.type&&t.key){const e="Identifier"===t.key.type&&t.key.value||"StringLiteral"===t.key.type&&t.key.value;if("string"==typeof e&&e.startsWith("defaultValue"))return!0}return!1})(f)}};
1
+ "use strict";var e=require("./ast-utils.js");function t(t){if(t)return"StringLiteral"===t.type?t.value:"TemplateLiteral"===t.type&&e.isSimpleTemplateLiteral(t)?t.quasis[0].cooked:void 0}function n(e){return"StringLiteral"===e.value?.type?e.value.value:"JSXExpressionContainer"===e.value?.type?t(e.value.expression):void 0}exports.extractFromTransComponent=function(i,s){const r=i.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"i18nKey"===e.name.value),o=i.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"defaults"===e.name.value),p=i.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"count"===e.name.value),l=i.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"values"===e.name.value);let a;p||"JSXAttribute"!==l?.type||"JSXExpressionContainer"!==l.value?.type||"ObjectExpression"!==l.value.expression.type||(a=e.getObjectPropValueExpression(l.value.expression,"count"));const c=!!p||!!a,u=i.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"tOptions"===e.name.value),f="JSXAttribute"===u?.type&&"JSXExpressionContainer"===u.value?.type&&"ObjectExpression"===u.value.expression.type?u.value.expression:void 0,y=i.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"ordinal"===e.name.value),d=!!y,g=i.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"context"===e.name.value);let x="JSXAttribute"===g?.type&&"JSXExpressionContainer"===g.value?.type?g.value.expression:"JSXAttribute"===g?.type&&"StringLiteral"===g.value?.type?g.value:void 0;const h=i.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"ns"===e.name.value);let v;v="JSXAttribute"===h?.type?n(h):void 0,f&&(void 0===v&&(v=e.getObjectPropValue(f,"ns")),void 0===x&&(x=e.getObjectPropValueExpression(f,"context")));const S=function(e,n){if(!e||0===e.length)return"";const i=new Set(n.extract.transKeepBasicHtmlNodesFor??["br","strong","i","p"]),s=e=>e&&"JSXText"===e.type&&/^\s*$/.test(e.value)&&e.value.includes("\n");function r(e,n,o=!1,p=!1){if(!e||!e.length)return;const l=p&&e.filter(e=>e&&"JSXElement"===e.type&&"p"===e.opening?.name?.value).length>1;let a=0,c=e.length-1;for(;a<=c&&s(e[a]);)a++;for(;c>=a&&s(e[c]);)c--;const u=a<=c?e.slice(a,c+1):[],f=u.some(e=>e&&("JSXElement"===e.type||"JSXFragment"===e.type));for(let e=0;e<u.length;e++){const a=u[e];if(a)if("JSXText"!==a.type){if("JSXExpressionContainer"===a.type){if(o&&!f&&a.expression){const e=a.expression.type;if("ObjectExpression"===e)continue;if(void 0!==t(a.expression))continue;if("Identifier"===e||"MemberExpression"===e||"CallExpression"===e)continue}const i=t(a.expression);if(void 0!==i){const t=/^\s*$/.test(i)&&!i.includes("\n"),r=u[e-1],o=u[e+1];if(t){const t=u[e+2];if(o&&"JSXText"===o.type&&s(o)&&t&&("JSXElement"===t.type||"JSXFragment"===t.type)){const t=u[e-1],n=u[e-2];if(!t||"JSXText"!==t.type&&n&&"JSXExpressionContainer"===n.type)continue}if(r&&("JSXElement"===r.type||"JSXFragment"===r.type)&&o&&"JSXText"===o.type&&s(o))continue;const i=!o||"JSXText"===o.type&&!s(o);if(r&&"JSXText"===r.type&&i){const e=n[n.length-1];if(e&&"JSXText"===e.type){e.value=String(e.value)+a.expression.value;continue}}if(r&&("JSXElement"===r.type||"JSXFragment"===r.type)&&o&&"JSXText"===o.type&&s(o))continue}}n.push(a);continue}if("JSXElement"===a.type){const e=a.opening&&a.opening.name&&"Identifier"===a.opening.name.type?a.opening.name.value:void 0;if(e&&i.has(e)){const o=a.opening&&Array.isArray(a.opening.attributes)&&a.opening.attributes.length>0,c=a.children||[],f=1===c.length&&("JSXText"===c[0]?.type||"JSXExpressionContainer"===c[0]?.type&&void 0!==t(c[0].expression)),y=!c.length,d=f;if(o&&!f)n.push(a),r(a.children||[],n,!0);else if(y)n.push(a);else if(!d){if((a.children||[]).some(e=>"JSXExpressionContainer"===e.type&&void 0===t(e.expression)))n.push(a),r(a.children||[],n,!0);else if("p"===e){const e=(c||[]).some(e=>{if(!e||"JSXElement"!==e.type)return!1;const n=e.opening&&e.opening.name&&"Identifier"===e.opening.name.type?e.opening.name.value:void 0,s=e.opening&&Array.isArray(e.opening.attributes)&&e.opening.attributes.length>0,r=e.children||[],o=1===r.length&&("JSXText"===r[0]?.type||"JSXExpressionContainer"===r[0]?.type&&void 0!==t(r[0].expression));return!(n&&i.has(n)&&!s&&(0===r.length||o))}),o=p&&u.some(e=>e&&e!==a&&"JSXText"===e.type&&!s(e));l||p&&e&&!o?(n.push(a),r(a.children||[],n,!0,!1)):r(a.children||[],n,!1,!1)}else r(a.children||[],n,!1,!1)}continue}n.push(a),r(a.children||[],n,!0);continue}"JSXFragment"!==a.type||r(a.children||[],n,o)}else{if(o&&!f)continue;if(o&&s(a))continue;if(s(a)){const t=u[e-1],i=u[e+1];if(t&&("JSXElement"===t.type||"JSXFragment"===t.type)&&i&&("JSXElement"===i.type||"JSXFragment"===i.type))continue;const s=n[n.length-1],r=u[e-1];if(s){if(r&&"JSXExpressionContainer"===r.type)continue;if("JSXText"===s.type&&r&&"JSXText"===r.type){s.value=String(s.value)+a.value;continue}}}if(o&&f&&0===e)continue;n.push(a)}}}const o=[];function p(e){if(!e||!e.length)return!1;let t=!1;for(const n of e)if(n)if("JSXElement"!==n.type){if("JSXExpressionContainer"===n.type&&-1!==o.indexOf(n))return t;if("JSXText"===n.type&&-1!==o.indexOf(n)){if(s(n))continue;if(!t)return!0;const i=e.indexOf(n);if(e.slice(i+1).some(e=>e&&"JSXElement"===e.type))return!0}}else t=!0;return!1}r(e,o,!1,!0);const l=new Set,a=e=>String(e).replace(/^\s*\n\s*/g,"").replace(/\s*\n\s*$/g,"");function c(e,n,r=!1){if(!e||0===e.length)return"";let u="";const f=e=>{if(!e)return-1;if(n&&n.has(e))return n.get(e);if(n)for(const[t,i]of n.entries())try{if(t&&e&&t.span&&e.span&&t.span.start===e.span.start&&t.span.end===e.span.end)return i}catch(e){}return o.indexOf(e)},y=t=>{if(!r)return o.indexOf(t);const n=e.indexOf(t);if(-1===n)return-1;let i=0;for(let t=0;t<n;t++){const n=e[t];n&&("JSXText"===n.type?s(n)||i++:"JSXExpressionContainer"===n.type?n.expression&&"JSXEmptyExpression"!==n.expression.type&&i++:"JSXElement"===n.type&&i++)}return i};for(let n=0;n<e.length;n++){const d=e[n];if(d){if("JSXText"===d.type){if(s(d))continue;const t=e[n+1],r=e[n-1];if(r&&"JSXElement"===r.type){const t="Identifier"===r.opening?.name?.type?r.opening.name.value:void 0,s=t&&i.has(t),o=0===(r.children||[]).length;if(s&&o&&/^\s*\n\s*/.test(d.value)){const e=d.value.replace(/^\s*\n\s*/,"");if(e){u+=e;continue}continue}if(!s&&/^\s*\n\s*/.test(d.value)){const t=d.value.replace(/^\s*\n\s*/,"");if(t){if(r&&"JSXElement"===r.type&&Array.isArray(r.children)&&0===r.children.length){u+=t;continue}const i=e[n-2];if(i&&"JSXText"===i.type){const e=i.value.replace(/\n\s*$/,""),n=/[A-Za-z0-9]$/.test(e),s=/^[A-Za-z0-9]/.test(t),r=/^[a-z]/.test(t);if(n&&s&&r){u+=t;continue}}u+=" "+t;continue}continue}}if(/\n\s*$/.test(d.value)&&t&&"JSXElement"===t.type){const r=d.value.replace(/\n\s*$/,"");if(r.trim()){const o="Identifier"===t.opening?.name?.type?t.opening.name.value:void 0,p=o&&i.has(o),a=(t.children||[]).length>0,c=/\s\n/.test(d.value),f=e[n+2],y=f&&"JSXText"===f.type&&!s(f)&&/[a-zA-Z0-9]/.test(f.value),g=!!(t.opening&&Array.isArray(t.opening.attributes)&&t.opening.attributes.length>0),x=/^\s/.test(r)&&!/^\n/.test(r),h=r.trim(),v=x?" "+h:h,S=/[A-Za-z0-9]$/.test(h),m=f&&"string"==typeof f.value&&/^[A-Za-z0-9]/.test(f.value.trim()),J=f&&"string"==typeof f.value&&/^[a-z]/.test(f.value.trim()),X=f&&"string"==typeof f.value&&/^\s/.test(f.value)&&!/^\n/.test(f.value),$=g&&a&&y&&!(S&&m&&J&&!c&&!x&&!X),E=f&&"string"==typeof f.value&&/^[,;:!?.]/.test(f.value.trim()),b=$&&!E;S&&m&&J&&!c&&!x&&!X&&l.add(t),u+=c||p&&a||!p&&y&&x||b?v+" ":v;continue}}u+=d.value;continue}if("JSXExpressionContainer"===d.type){const e=d.expression;if(!e)continue;const n=t(e);if(void 0!==n)u+=n;else if("Identifier"===e.type)u+=`{{${e.value}}}`;else if("TsAsExpression"===e.type&&"ObjectExpression"===e.expression?.type){const t=e.expression,n=t.properties.filter(e=>"KeyValueProperty"===e.type&&e.key&&"Identifier"===e.key.type).map(e=>e.key.value);if(n.length>0)u+=n.map(e=>`{{${e}}}`).join("");else{const e=t.properties[0];if(!e||"Identifier"!==e.type)throw new Error("Unrecognized expression in JSX placeholder");u+=`{{${e.value}}}`}}else if("ObjectExpression"===e.type){const t=e.properties[0];if(t&&"KeyValueProperty"===t.type&&t.key&&"Identifier"===t.key.type)u+=`{{${t.key.value}}}`;else{if(!t||"Identifier"!==t.type)throw new Error("Unrecognized expression in JSX placeholder");u+=`{{${t.value}}}`}}else if("MemberExpression"===e.type&&e.property&&"Identifier"===e.property.type)u+=`{{${e.property.value}}}`;else{if("CallExpression"!==e.type||"Identifier"!==e.callee?.type)throw new Error("Unrecognized expression in JSX placeholder");u+=`{{${e.callee.value}}}`}continue}if("JSXElement"===d.type){const l=r?y(d):void 0;let g;if(d.opening&&d.opening.name&&"Identifier"===d.opening.name.type&&(g=d.opening.name.value),g&&i.has(g)){const y=d.opening&&Array.isArray(d.opening.attributes)&&d.opening.attributes.length>0,x=d.children||[],h=x.length>0,v=1===x.length&&("JSXText"===x[0]?.type||"JSXExpressionContainer"===x[0]?.type&&void 0!==t(x[0].expression)),S="p"===g;let m=0;if(S&&r&&(m=e.filter(e=>e&&"JSXElement"===e.type&&"p"===e.opening?.name?.value).length),!h||v){const t=v?c(x,void 0):"";if(""!==String(t).trim())if(i.has(g)&&"p"!==g)u+=`<${g}>${a(t)}</${g}>`;else if(S&&r&&m>1)u+=`<${g}>${a(t)}</${g}>`;else if(S){const e=r&&void 0!==l?l:o.indexOf(d);u+=`<${e}>${a(t)}</${e}>`}else{const e=r&&void 0!==l?l:o.indexOf(d);u+=`<${e}>${a(t)}</${e}>`}else{const t=e[n-1];t&&"JSXText"===t.type&&/\n\s*$/.test(t.value)&&(u=u.replace(/\s+$/,"")),u+=`<${g} />`}}else if(y&&!v){const e=x,n=r&&void 0!==l?l:f(d);if(p(e)){const s=new Map;let r=0;for(const n of e)if(n&&"JSXElement"===n.type){const e=n.opening&&n.opening.name&&"Identifier"===n.opening.name.type?n.opening.name.value:void 0;if(e&&i.has(e)){const e=n.opening&&Array.isArray(n.opening.attributes)&&n.opening.attributes.length>0,i=n.children||[],o=1===i.length&&("JSXText"===i[0]?.type||"JSXExpressionContainer"===i[0]?.type&&void 0!==t(i[0].expression));!e&&(!i.length||o)||s.set(n,r++)}else s.set(n,r++)}const o=c(e,s.size?s:void 0);u+=`<${n}>${a(o)}</${n}>`}else{const e=new Map;let s=0;for(const n of x)if(n&&"JSXElement"===n.type){const r=n.opening&&n.opening.name&&"Identifier"===n.opening.name.type?n.opening.name.value:void 0;if(r&&i.has(r)){const i=n.opening&&Array.isArray(n.opening.attributes)&&n.opening.attributes.length>0,r=n.children||[],o=1===r.length&&("JSXText"===r[0]?.type||"JSXExpressionContainer"===r[0]?.type&&void 0!==t(r[0].expression));!i&&(!r.length||o)||e.set(n,s++)}else e.set(n,s++)}const r=c(x,e.size?e:void 0);u+=`<${n}>${a(r)}</${n}>`}}else{const e=o.indexOf(d);if(-1!==e){const n=void 0!==l?l:e;if((()=>{let e=!1;for(const t of x)if(t)if("JSXElement"!==t.type){if("JSXExpressionContainer"===t.type&&-1!==o.indexOf(t))return e;if("JSXText"===t.type&&-1!==o.indexOf(t)){if(s(t))continue;if(!e)return!0;if(x.slice(x.indexOf(t)+1).some(e=>e&&"JSXElement"===e.type))return!0}}else e=!0;return!1})()){if(0===n){const e=c(x,void 0,!1);u+=`<${n}>${a(e)}</${n}>`;continue}const e=new Map;let s=0;for(const n of x)if(n&&"JSXElement"===n.type){const r=n.opening&&n.opening.name&&"Identifier"===n.opening.name.type?n.opening.name.value:void 0;if(r&&i.has(r)){const i=n.opening&&Array.isArray(n.opening.attributes)&&n.opening.attributes.length>0,r=n.children||[],o=1===r.length&&("JSXText"===r[0]?.type||"JSXExpressionContainer"===r[0]?.type&&void 0!==t(r[0].expression));!i&&(!r.length||o)||e.set(n,s++)}else e.set(n,s++)}const r=c(x,e.size?e:void 0,!1);u+=`<${n}>${a(r)}</${n}>`;continue}const r=new Map;let p=0;for(const e of x)if(e&&"JSXElement"===e.type){const n=e.opening&&e.opening.name&&"Identifier"===e.opening.name.type?e.opening.name.value:void 0;if(n&&i.has(n)){const n=e.opening&&Array.isArray(e.opening.attributes)&&e.opening.attributes.length>0,i=e.children||[],s=1===i.length&&("JSXText"===i[0]?.type||"JSXExpressionContainer"===i[0]?.type&&void 0!==t(i[0].expression));!n&&(!i.length||s)||r.set(e,p++)}else r.set(e,p++)}const f=c(x,r.size>0?r:void 0,!1);u+=`<${n}>${a(f)}</${n}>`}else{const e=c(x,void 0,!1);u+=`<${g}>${a(e)}</${g}>`}}}else{const e=d.children||[];if(e.some(e=>e&&("JSXText"===e.type||"JSXExpressionContainer"===e.type)&&-1!==o.indexOf(e))){const t=o.indexOf(d),n=c(e,void 0);u+=`<${t}>${a(n)}</${t}>`}else{const t=new Map,n=f(d);let s=0;for(const n of e)if(n&&"JSXElement"===n.type){const e=n.opening&&n.opening.name&&"Identifier"===n.opening.name.type?n.opening.name.value:void 0;if(e&&i.has(e)){const e=n.opening&&Array.isArray(n.opening.attributes)&&n.opening.attributes.length>0,i=n.children||[],r=1===i.length&&"JSXText"===i[0]?.type;!e&&(!i.length||r)||t.set(n,s++)}else t.set(n,s++)}const r=c(e,t.size?t:void 0);u+=`<${n}>${a(r)}</${n}>`}}continue}"JSXFragment"!==d.type||(u+=c(d.children||[]))}}return u}const u=c(e,void 0,!0),f=String(u).replace(/<br \/>\s*\n\s*/g,"<br />"),y=String(f),d=new Set;if(l&&l.size>0)for(let e=0;e<o.length;e++)l.has(o[e])&&d.add(e);let g=String(y);if(d&&d.size>0)for(const e of d)try{g=g.replace(new RegExp("\\s+<"+e+">","g"),"<"+e+">"),g=g.replace(new RegExp("<\\/"+e+">\\s+","g"),"</"+e+">")}catch(e){}g=g.replace(/<\/(\d+)>\s*\n\s*(\S)/g,(e,t,n)=>{const i=Number(t);return d.has(i)?`</${t}>${n}`:`</${t}> ${n}`}),g=g.replace(/(\S)\s*\n\s*<(\d+)/g,(e,t,n)=>{const i=Number(n);return d.has(i)?`${t}<${n}`:`${t} <${n}`}),g=g.replace(/\s*\n\s*/g," "),g=g.replace(/\s+/g," "),g=g.replace(/\s+([,;:!?.])/g,"$1");const x=g.trim();let h=String(x);if(d&&d.size>0)for(const e of d)try{h=h.replace(new RegExp("[\\s\\u00A0]+<"+e+">","g"),"<"+e+">"),h=h.replace(new RegExp("<\\/"+e+">[\\s\\u00A0]+","g"),"</"+e+">")}catch(e){}try{for(let e=0;e<o.length;e++){const t=o[e];if(!t||"JSXElement"!==t.type)continue;const n=o[e-1],i=o[e+1];if(!n||!i)continue;if("JSXText"!==n.type||"JSXText"!==i.type)continue;const s=String(n.value),r=String(i.value),p=s.replace(/\n\s*$/,""),l=/[A-Za-z0-9]$/.test(p),a=/^[A-Za-z0-9]/.test(r.trim()),c=/^[a-z]/.test(r.trim()),u=/\s\n/.test(s),f=r&&/^\s/.test(r)&&!/^\n/.test(r);if(l&&a&&c&&!u&&!f){const t=e;h=h.replace(new RegExp("\\s+<"+t+">","g"),"<"+t+">")}}}catch(e){}function v(e){if(!e||!e.includes("<"))return e;function t(e){const t=[],n=[];let i=0;const s=/<\/?(\d+)>|<[^>]+>/g;let r;for(;r=s.exec(e);){const o=r[0],p=r.index;if(p>i){const s={type:"text",text:e.slice(i,p)};n.length?n[n.length-1].node.children.push(s):t.push(s)}const l=/^<\/(\d+)>$/.exec(o),a=/^<(\d+)>$/.exec(o);if(a){const e=Number(a[1]),i={type:"ph",idx:e,children:[]};n.length?n[n.length-1].node.children.push(i):t.push(i),n.push({node:i,idx:e})}else if(l)n.length&&n.pop();else{const e={type:"text",text:o};n.length?n[n.length-1].node.children.push(e):t.push(e)}i=s.lastIndex}if(i<e.length){const s={type:"text",text:e.slice(i)};n.length?n[n.length-1].node.children.push(s):t.push(s)}return t}function n(e,t=null){let s="";for(const r of e)if("text"===r.type)s+=r.text;else{const e=r.children.filter(e=>"ph"===e.type),p=e.map(e=>e.idx);if(!(p.length<=1||p.every((e,t)=>0===t||e===p[t-1]+1))){const e=r.children.map(e=>"text"===e.type?e.text:`<${e.idx}>${n(e.children,e.idx)}</${e.idx}>`).join("");s+=`<${r.idx}>${e}</${r.idx}>`;continue}const l=new Map;let a=0;try{const n=o[r.idx];if(n&&n.span){const s=n.span.start,p=n.span.end;let l=-1;for(let e=r.idx+1;e<o.length;e++){const t=o[e];if(t&&t.span&&(t.span.start>=s&&t.span.end<=p&&"JSXElement"===t.type)){l=e;break}}let c=0;if(-1!==l)for(let e=r.idx+1;e<l;e++){const t=o[e];t&&t.span&&(t.span.start>=s&&t.span.end<=p&&("JSXText"!==t.type&&"JSXExpressionContainer"!==t.type||c++))}else for(let e=r.idx+1;e<o.length;e++){const t=o[e];t&&t.span&&(t.span.start>=s&&t.span.end<=p&&("JSXText"!==t.type&&"JSXExpressionContainer"!==t.type||c++))}if("number"==typeof r.idx){const n=o[r.idx],s=n?.opening?.name?.value,p=s&&i.has(s),l=null===t;1===e.length?(a=Math.max(1,c+1),!l||p||0!==e[0].idx||"a"!==s&&"p"!==s||(a=0)):a=0}}}catch(e){}for(const t of e)l.has(t.idx)||l.set(t.idx,a++);const c=r.children.map(e=>{if("text"===e.type)return e.text;const t=e.idx,i=l.has(t)?l.get(t):t;return`<${i}>${n(e.children,i)}</${i}>`}).join("");s+=`<${r.idx}>${c}</${r.idx}>`}return s}try{return n(t(e))}catch(t){return e}}return h=v(h),h.trim()}(i.children,s);let m;const J="JSXAttribute"===o?.type?n(o):void 0;if(void 0!==J)m=J;else{const e=s.extract.defaultValue;m="string"==typeof e?e:""}let X,$;if("JSXAttribute"===r?.type){if("StringLiteral"===r.value?.type){if(X=r.value,$=X.value,!$||""===$.trim())return null;if(v&&"StringLiteral"===X.type){const e=s.extract.nsSeparator??":",t=X.value;if(e&&t.startsWith(`${v}${e}`)){if($=t.slice(`${v}${e}`.length),!$||""===$.trim())return null;X={...X,value:$}}}}else"JSXExpressionContainer"===r.value?.type&&"JSXEmptyExpression"!==r.value.expression.type&&(X=r.value.expression);if(!X)return null}return o||!$||S.trim()?!o&&S.trim()&&(m=S):m=$,{keyExpression:X,serializedChildren:S,ns:v,defaultValue:m,hasCount:c,isOrdinal:d,contextExpression:x,optionsNode:f,explicitDefault:void 0!==J||(e=>{if(!e||!Array.isArray(e.properties))return!1;for(const t of e.properties)if(t&&"KeyValueProperty"===t.type&&t.key){const e="Identifier"===t.key.type&&t.key.value||"StringLiteral"===t.key.type&&t.key.value;if("string"==typeof e&&e.startsWith("defaultValue"))return!0}return!1})(f)}};
@@ -1 +1 @@
1
- "use strict";var e=require("glob"),t=require("node:fs/promises"),r=require("@swc/core"),n=require("node:path"),s=require("node:events"),a=require("chalk"),o=require("ora");const i=["a","abbr","address","article","aside","bdi","bdo","blockquote","button","caption","cite","code","data","dd","del","details","dfn","dialog","div","dt","em","figcaption","footer","h1","h2","h3","h4","h5","h6","header","img","ins","kbd","label","legend","li","main","mark","nav","option","output","p","pre","q","s","samp","section","small","span","strong","sub","summary","sup","td","textarea","th","time","title","var"].map(e=>e.toLowerCase()),c=["abbr","accesskey","alt","aria-description","aria-label","aria-placeholder","aria-roledescription","aria-valuetext","content","label","placeholder","summary","title"].map(e=>e.toLowerCase()),l=["className","key","id","style","href","i18nKey","defaults","type","target"].map(e=>e.toLowerCase()),u=["script","style","code"];class p extends s.EventEmitter{config;constructor(e){super({captureRejections:!0}),this.config=e}wrapError(e){const t="Linter failed to run: ";if(e instanceof Error){if(e.message.startsWith(t))return e;const r=new Error(`${t}${e.message}`);return r.stack=e.stack,r}return new Error(`${t}${String(e)}`)}async run(){const{config:s}=this;try{this.emit("progress",{message:"Finding source files to analyze..."});const a=["node_modules/**"],o=Array.isArray(s.extract.ignore)?s.extract.ignore:s.extract.ignore?[s.extract.ignore]:[],i=await e.glob(s.extract.input,{ignore:[...a,...o]});this.emit("progress",{message:`Analyzing ${i.length} source files...`});let c=0;const l=new Map;for(const e of i){const a=await t.readFile(e,"utf-8"),o=n.extname(e).toLowerCase(),i=".ts"===o||".tsx"===o||".mts"===o||".cts"===o,u=".tsx"===o,p=".jsx"===o;let f;try{f=await r.parse(a,{syntax:i?"typescript":"ecmascript",tsx:u,jsx:p,decorators:!0})}catch(t){if(".ts"!==o||u){if(".js"!==o||p){const e=this.wrapError(t);this.emit("error",e);continue}try{f=await r.parse(a,{syntax:"ecmascript",jsx:!0,decorators:!0}),this.emit("progress",{message:`Parsed ${e} using JSX fallback`})}catch(e){const t=this.wrapError(e);this.emit("error",t);continue}}else try{f=await r.parse(a,{syntax:"typescript",tsx:!0,decorators:!0}),this.emit("progress",{message:`Parsed ${e} using TSX fallback`})}catch(e){const t=this.wrapError(e);this.emit("error",t);continue}}const g=m(f,a,s);g.length>0&&(c+=g.length,l.set(e,g))}const u={success:0===c,message:c>0?`Linter found ${c} potential issues.`:"No issues found.",files:Object.fromEntries(l.entries())};return this.emit("done",u),u}catch(e){const t=this.wrapError(e);throw this.emit("error",t),t}}}const f=e=>/^(https|http|\/\/|^\/)/.test(e);function m(e,t,r){const n=[],s=[],a=e=>t.substring(0,e).split("\n").length,o=(r.extract.transComponents||["Trans"]).map(e=>e.toLowerCase()),p=(r?.lint?.ignoredTags||r.extract.ignoredTags||[]).map(e=>e.toLowerCase()),m=new Set([...o,...u.map(e=>e.toLowerCase()),...p]),g=(r?.lint?.ignoredAttributes||r.extract.ignoredAttributes||[]).map(e=>e.toLowerCase()),d=new Set([...l,...g]),y=r?.lint?.acceptedTags?r.lint.acceptedTags:null,h=r?.extract?.acceptedTags?r.extract.acceptedTags:null,b=(y??h??i)?.map(e=>e.toLowerCase())??null,w=r?.lint?.acceptedAttributes?r.lint.acceptedAttributes:null,x=r?.extract?.acceptedAttributes?r.extract.acceptedAttributes:null,S=(w??x??c)?.map(e=>e.toLowerCase())??null,E=b&&b.length>0?new Set(b):null,v=S&&S.length>0?new Set(S):null,L=e=>{if(!e)return null;const t=e.name??e.opening?.name??e.opening?.name;if(!t)return e.opening?.name?L({name:e.opening.name}):null;const r=e=>{if(!e)return null;if("JSXIdentifier"===e.type&&(e.name||e.value))return e.name??e.value;if("Identifier"===e.type&&(e.name||e.value))return e.name??e.value;if("JSXMemberExpression"===e.type){const t=r(e.object),n=r(e.property);return t&&n?`${t}.${n}`:n??t}return e.name??e.value??e.property?.name??e.property?.value??null},n=r(t);return n?String(n):null},C=e=>{if(!e)return null;if("string"==typeof e)return e;if("JSXIdentifier"===e.type||"Identifier"===e.type){const t=e.name??e.value??e.raw??null;return t?String(t):null}if("JSXNamespacedName"===e.type)return C(e.name)??C(e.namespace);if("JSXMemberExpression"===e.type){const t=C(e.object),r=C(e.property);return t&&r?`${t}.${r}`:r??t}if(e.name||e.value||e.property)return e.name??e.value??e.property?.name??e.property?.value??null;try{const t=JSON.stringify(e),r=/"?(?:name|value)"?\s*:\s*"?([a-zA-Z0-9_\-:.$]+)"?/.exec(t);return r?r[1]:null}catch{return null}},J=e=>{for(let t=e.length-1;t>=0;t--){const r=e[t];if(r&&"object"==typeof r&&("JSXElement"===r.type||"JSXOpeningElement"===r.type||"JSXSelfClosingElement"===r.type)){const e=L(r);if(!e)continue;if(m.has(String(e).toLowerCase()))return!0}}if(E){for(let t=e.length-1;t>=0;t--){const r=e[t];if(r&&"object"==typeof r&&("JSXElement"===r.type||"JSXOpeningElement"===r.type||"JSXSelfClosingElement"===r.type)){const e=L(r);if(!e)continue;return!E.has(String(e).toLowerCase())}}return!0}return!1},X=(e,t)=>{if(!e||"object"!=typeof e)return;const r=[...t,e];if("JSXText"===e.type)if(v&&!E);else{if(!J(r)){const t=e.value.trim();t&&t.length>1&&"..."!==t&&!f(t)&&isNaN(Number(t))&&!t.startsWith("{{")&&s.push(e)}}if("StringLiteral"===e.type){const t=r[r.length-2],n=J(r);if("JSXAttribute"===t?.type&&!n){const n=C(t.name),a=n?String(n).toLowerCase():null,o=r.slice(0,-2).reverse().find(e=>e&&"object"==typeof e&&("JSXElement"===e.type||"JSXOpeningElement"===e.type||"JSXSelfClosingElement"===e.type));if(E&&o){const e=L(o);if(!e||!E.has(String(e).toLowerCase()))return}else if(E&&!o)return;if(v?null!=a&&v.has(a):null!=a&&!d.has(a)){const t=e.value.trim();t&&"..."!==t&&!f(t)&&isNaN(Number(t))&&s.push(e)}}}for(const t of Object.keys(e)){if("span"===t)continue;const n=e[t];Array.isArray(n)?n.forEach(e=>X(e,r)):n&&"object"==typeof n&&X(n,r)}};X(e,[]);let $=0;for(const e of s){const r=e.raw??e.value,s=t.indexOf(r,$);s>-1&&(n.push({text:e.value.trim(),line:a(s)}),$=s+r.length)}return n}exports.Linter=p,exports.runLinter=async function(e){return new p(e).run()},exports.runLinterCli=async function(e){const t=new p(e),r=o().start();t.on("progress",e=>{r.text=e.message});try{const{success:e,message:n,files:s}=await t.run();if(e)r.succeed(a.green.bold(n));else{r.fail(a.red.bold(n));for(const[e,t]of Object.entries(s))console.log(a.yellow(`\n${e}`)),t.forEach(({text:e,line:t})=>{console.log(` ${a.gray(`${t}:`)} ${a.red("Error:")} Found hardcoded string: "${e}"`)});process.exit(1)}}catch(e){const n=t.wrapError(e);r.fail(n.message),console.error(n),process.exit(1)}};
1
+ "use strict";var e=require("glob"),t=require("node:fs/promises"),r=require("@swc/core"),n=require("node:path"),s=require("node:events"),a=require("chalk"),i=require("ora");const o=["a","abbr","address","article","aside","bdi","bdo","blockquote","button","caption","cite","code","data","dd","del","details","dfn","dialog","div","dt","em","figcaption","footer","h1","h2","h3","h4","h5","h6","header","img","ins","kbd","label","legend","li","main","mark","nav","option","output","p","pre","q","s","samp","section","small","span","strong","sub","summary","sup","td","textarea","th","time","title","var"].map(e=>e.toLowerCase()),l=["abbr","accesskey","alt","aria-description","aria-label","aria-placeholder","aria-roledescription","aria-valuetext","content","label","placeholder","summary","title"].map(e=>e.toLowerCase()),c=["className","key","id","style","href","i18nKey","defaults","type","target"].map(e=>e.toLowerCase()),u=["script","style","code"];class p extends s.EventEmitter{config;constructor(e){super({captureRejections:!0}),this.config=e}wrapError(e){const t="Linter failed to run: ";if(e instanceof Error){if(e.message.startsWith(t))return e;const r=new Error(`${t}${e.message}`);return r.stack=e.stack,r}return new Error(`${t}${String(e)}`)}async run(){const{config:s}=this;try{this.emit("progress",{message:"Finding source files to analyze..."});const a=["node_modules/**"],i=Array.isArray(s.extract.ignore)?s.extract.ignore:s.extract.ignore?[s.extract.ignore]:[],o=Array.isArray(s.lint?.ignore)?s.lint.ignore:s.lint?.ignore?[s.lint.ignore]:[],l=await e.glob(s.extract.input,{ignore:[...a,...i,...o]});this.emit("progress",{message:`Analyzing ${l.length} source files...`});let c=0;const u=new Map;for(const e of l){const a=await t.readFile(e,"utf-8"),i=n.extname(e).toLowerCase(),o=".ts"===i||".tsx"===i||".mts"===i||".cts"===i,l=".tsx"===i,p=".jsx"===i;let f;try{f=await r.parse(a,{syntax:o?"typescript":"ecmascript",tsx:l,jsx:p,decorators:!0})}catch(t){if(".ts"!==i||l){if(".js"!==i||p){const e=this.wrapError(t);this.emit("error",e);continue}try{f=await r.parse(a,{syntax:"ecmascript",jsx:!0,decorators:!0}),this.emit("progress",{message:`Parsed ${e} using JSX fallback`})}catch(e){const t=this.wrapError(e);this.emit("error",t);continue}}else try{f=await r.parse(a,{syntax:"typescript",tsx:!0,decorators:!0}),this.emit("progress",{message:`Parsed ${e} using TSX fallback`})}catch(e){const t=this.wrapError(e);this.emit("error",t);continue}}const g=m(f,a,s);g.length>0&&(c+=g.length,u.set(e,g))}const p={success:0===c,message:c>0?`Linter found ${c} potential issues.`:"No issues found.",files:Object.fromEntries(u.entries())};return this.emit("done",p),p}catch(e){const t=this.wrapError(e);throw this.emit("error",t),t}}}const f=e=>/^(https|http|\/\/|^\/)/.test(e);function m(e,t,r){const n=[],s=[],a=e=>t.substring(0,e).split("\n").length,i=(r.extract.transComponents||["Trans"]).map(e=>e.toLowerCase()),p=(r?.lint?.ignoredTags||r.extract.ignoredTags||[]).map(e=>e.toLowerCase()),m=new Set([...i,...u.map(e=>e.toLowerCase()),...p]),g=(r?.lint?.ignoredAttributes||r.extract.ignoredAttributes||[]).map(e=>e.toLowerCase()),d=new Set([...c,...g]),y=r?.lint?.acceptedTags?r.lint.acceptedTags:null,h=r?.extract?.acceptedTags?r.extract.acceptedTags:null,b=(y??h??o)?.map(e=>e.toLowerCase())??null,w=r?.lint?.acceptedAttributes?r.lint.acceptedAttributes:null,x=r?.extract?.acceptedAttributes?r.extract.acceptedAttributes:null,S=(w??x??l)?.map(e=>e.toLowerCase())??null,E=b&&b.length>0?new Set(b):null,v=S&&S.length>0?new Set(S):null,L=e=>{if(!e)return null;const t=e.name??e.opening?.name??e.opening?.name;if(!t)return e.opening?.name?L({name:e.opening.name}):null;const r=e=>{if(!e)return null;if("JSXIdentifier"===e.type&&(e.name||e.value))return e.name??e.value;if("Identifier"===e.type&&(e.name||e.value))return e.name??e.value;if("JSXMemberExpression"===e.type){const t=r(e.object),n=r(e.property);return t&&n?`${t}.${n}`:n??t}return e.name??e.value??e.property?.name??e.property?.value??null},n=r(t);return n?String(n):null},C=e=>{if(!e)return null;if("string"==typeof e)return e;if("JSXIdentifier"===e.type||"Identifier"===e.type){const t=e.name??e.value??e.raw??null;return t?String(t):null}if("JSXNamespacedName"===e.type)return C(e.name)??C(e.namespace);if("JSXMemberExpression"===e.type){const t=C(e.object),r=C(e.property);return t&&r?`${t}.${r}`:r??t}if(e.name||e.value||e.property)return e.name??e.value??e.property?.name??e.property?.value??null;try{const t=JSON.stringify(e),r=/"?(?:name|value)"?\s*:\s*"?([a-zA-Z0-9_\-:.$]+)"?/.exec(t);return r?r[1]:null}catch{return null}},J=e=>{for(let t=e.length-1;t>=0;t--){const r=e[t];if(r&&"object"==typeof r&&("JSXElement"===r.type||"JSXOpeningElement"===r.type||"JSXSelfClosingElement"===r.type)){const e=L(r);if(!e)continue;if(m.has(String(e).toLowerCase()))return!0}}if(E){for(let t=e.length-1;t>=0;t--){const r=e[t];if(r&&"object"==typeof r&&("JSXElement"===r.type||"JSXOpeningElement"===r.type||"JSXSelfClosingElement"===r.type)){const e=L(r);if(!e)continue;return!E.has(String(e).toLowerCase())}}return!0}return!1},X=(e,t)=>{if(!e||"object"!=typeof e)return;const r=[...t,e];if("JSXText"===e.type)if(v&&!E);else{if(!J(r)){const t=e.value.trim();t&&t.length>1&&"..."!==t&&!f(t)&&isNaN(Number(t))&&!t.startsWith("{{")&&s.push(e)}}if("StringLiteral"===e.type){const t=r[r.length-2],n=J(r);if("JSXAttribute"===t?.type&&!n){const n=C(t.name),a=n?String(n).toLowerCase():null,i=r.slice(0,-2).reverse().find(e=>e&&"object"==typeof e&&("JSXElement"===e.type||"JSXOpeningElement"===e.type||"JSXSelfClosingElement"===e.type));if(E&&i){const e=L(i);if(!e||!E.has(String(e).toLowerCase()))return}else if(E&&!i)return;if(v?null!=a&&v.has(a):null!=a&&!d.has(a)){const t=e.value.trim();t&&"..."!==t&&!f(t)&&isNaN(Number(t))&&s.push(e)}}}for(const t of Object.keys(e)){if("span"===t)continue;const n=e[t];Array.isArray(n)?n.forEach(e=>X(e,r)):n&&"object"==typeof n&&X(n,r)}};X(e,[]);let $=0;for(const e of s){const r=e.raw??e.value,s=t.indexOf(r,$);s>-1&&(n.push({text:e.value.trim(),line:a(s)}),$=s+r.length)}return n}exports.Linter=p,exports.runLinter=async function(e){return new p(e).run()},exports.runLinterCli=async function(e){const t=new p(e),r=i().start();t.on("progress",e=>{r.text=e.message});try{const{success:e,message:n,files:s}=await t.run();if(e)r.succeed(a.green.bold(n));else{r.fail(a.red.bold(n));for(const[e,t]of Object.entries(s))console.log(a.yellow(`\n${e}`)),t.forEach(({text:e,line:t})=>{console.log(` ${a.gray(`${t}:`)} ${a.red("Error:")} Found hardcoded string: "${e}"`)});process.exit(1)}}catch(e){const n=t.wrapError(e);r.fail(n.message),console.error(n),process.exit(1)}};
package/dist/esm/cli.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{Command as o}from"commander";import e from"chokidar";import{glob as t}from"glob";import{minimatch as n}from"minimatch";import i from"chalk";import{ensureConfig as a,loadConfig as r}from"./config.js";import{detectConfig as c}from"./heuristic-config.js";import{runExtractor as s}from"./extractor/core/extractor.js";import"node:path";import"node:fs/promises";import"jiti";import"@croct/json5-parser";import{runTypesGenerator as l}from"./types-generator.js";import{runSyncer as p}from"./syncer.js";import{runMigrator as f}from"./migrator.js";import{runInit as m}from"./init.js";import{runLinterCli as d}from"./linter.js";import{runStatus as g}from"./status.js";import{runLocizeSync as u,runLocizeDownload as y,runLocizeMigrate as h}from"./locize.js";import{runRenameKey as w}from"./rename-key.js";const x=new o;x.name("i18next-cli").description("A unified, high-performance i18next CLI.").version("1.28.3"),x.option("-c, --config <path>","Path to i18next-cli config file (overrides detection)"),x.command("extract").description("Extract translation keys from source files and update resource files.").option("-w, --watch","Watch for file changes and re-run the extractor.").option("--ci","Exit with a non-zero status code if any files are updated.").option("--dry-run","Run the extractor without writing any files to disk.").option("--sync-primary","Sync primary language values with default values from code.").option("--sync-all","Sync primary language values with default values from code AND clear synced keys in all other locales.").action(async o=>{try{const t=x.opts().config,i=await a(t),r=async()=>{const e=!!o.syncPrimary||!!o.syncAll,t=await s(i,{isWatchMode:!!o.watch,isDryRun:!!o.dryRun,syncPrimaryWithDefaults:e,syncAll:!!o.syncAll});return o.ci&&!t?(console.log("✅ No files were updated."),process.exit(0)):o.ci&&t&&(console.error("❌ Some files were updated. This should not happen in CI mode."),process.exit(1)),t};if(await r(),o.watch){console.log("\nWatching for changes...");const o=await v(i.extract.input),t=j(i.extract.ignore),a=k(i.extract.output),c=[...t,...a].filter(Boolean),s=o.filter(o=>!c.some(e=>n(o,e,{dot:!0})));e.watch(s,{ignored:/node_modules/,persistent:!0}).on("change",o=>{console.log(`\nFile changed: ${o}`),r()})}}catch(o){console.error("Error running extractor:",o),process.exit(1)}}),x.command("status [locale]").description("Display translation status. Provide a locale for a detailed key-by-key view.").option("-n, --namespace <ns>","Filter the status report by a specific namespace").action(async(o,e)=>{const t=x.opts().config;let n=await r(t);if(!n){console.log(i.blue("No config file found. Attempting to detect project structure..."));const o=await c();o||(console.error(i.red("Could not automatically detect your project structure.")),console.log(`Please create a config file first by running: ${i.cyan("npx i18next-cli init")}`),process.exit(1)),console.log(i.green("Project structure detected successfully!")),n=o}await g(n,{detail:o,namespace:e.namespace})}),x.command("types").description("Generate TypeScript definitions from translation resource files.").option("-w, --watch","Watch for file changes and re-run the type generator.").action(async o=>{const t=x.opts().config,i=await a(t),r=()=>l(i);if(await r(),o.watch){console.log("\nWatching for changes...");const o=await v(i.types?.input||[]),t=[...j(i.extract?.ignore)].filter(Boolean),a=o.filter(o=>!t.some(e=>n(o,e,{dot:!0})));e.watch(a,{persistent:!0}).on("change",o=>{console.log(`\nFile changed: ${o}`),r()})}}),x.command("sync").description("Synchronize secondary language files with the primary language file.").action(async()=>{const o=x.opts().config,e=await a(o);await p(e)}),x.command("migrate-config [configPath]").description("Migrate a legacy i18next-parser.config.js to the new format.").action(async o=>{await f(o)}),x.command("init").description("Create a new i18next.config.ts/js file with an interactive setup wizard.").action(m),x.command("lint").description("Find potential issues like hardcoded strings in your codebase.").option("-w, --watch","Watch for file changes and re-run the linter.").action(async o=>{const t=x.opts().config,a=async()=>{let o=await r(t);if(!o){console.log(i.blue("No config file found. Attempting to detect project structure..."));const e=await c();e||(console.error(i.red("Could not automatically detect your project structure.")),console.log(`Please create a config file first by running: ${i.cyan("npx i18next-cli init")}`),process.exit(1)),console.log(i.green("Project structure detected successfully!")),o=e}await d(o)};if(await a(),o.watch){console.log("\nWatching for changes...");const o=await r(t);if(o?.extract?.input){const t=await v(o.extract.input),i=[...j(o.extract.ignore),...k(o.extract.output)].filter(Boolean),r=t.filter(o=>!i.some(e=>n(o,e,{dot:!0})));e.watch(r,{ignored:/node_modules/,persistent:!0}).on("change",o=>{console.log(`\nFile changed: ${o}`),a()})}}}),x.command("locize-sync").description("Synchronize local translations with your locize project.").option("--update-values","Update values of existing translations on locize.").option("--src-lng-only","Check for changes in source language only.").option("--compare-mtime","Compare modification times when syncing.").option("--dry-run","Run the command without making any changes.").action(async o=>{const e=x.opts().config,t=await a(e);await u(t,o)}),x.command("locize-download").description("Download all translations from your locize project.").action(async o=>{const e=x.opts().config,t=await a(e);await y(t,o)}),x.command("locize-migrate").description("Migrate local translation files to a new locize project.").action(async o=>{const e=x.opts().config,t=await a(e);await h(t,o)}),x.command("rename-key <oldKey> <newKey>").description("Rename a translation key across all source files and translation files.").option("--dry-run","Preview changes without modifying files").action(async(o,e,t)=>{try{const n=x.opts().config,r=await a(n),c=await w(r,o,e,t);c.success||(c.conflicts&&(console.error(i.red("\n❌ Conflicts detected:")),c.conflicts.forEach(o=>console.error(` - ${o}`))),c.error&&console.error(i.red(`\n❌ ${c.error}`)),process.exit(1));0===c.sourceFiles.reduce((o,e)=>o+e.changes,0)&&console.log(i.yellow(`\n⚠️ No usages found for "${o}"`))}catch(o){console.error(i.red("Error renaming key:"),o),process.exit(1)}}),x.parse(process.argv);const j=o=>Array.isArray(o)?o:o?[o]:[],k=o=>o&&"string"==typeof o?[o.replace(/\{\{[^}]+\}\}/g,"*")]:[],v=async(o=[])=>{const e=j(o),n=await Promise.all(e.map(o=>t(o||"",{nodir:!0})));return Array.from(new Set(n.flat()))};export{x as program};
2
+ import{Command as o}from"commander";import e from"chokidar";import{glob as t}from"glob";import{minimatch as n}from"minimatch";import i from"chalk";import{ensureConfig as a,loadConfig as r}from"./config.js";import{detectConfig as c}from"./heuristic-config.js";import{runExtractor as s}from"./extractor/core/extractor.js";import"node:path";import"node:fs/promises";import"jiti";import"@croct/json5-parser";import{runTypesGenerator as l}from"./types-generator.js";import{runSyncer as p}from"./syncer.js";import{runMigrator as f}from"./migrator.js";import{runInit as m}from"./init.js";import{runLinterCli as d}from"./linter.js";import{runStatus as g}from"./status.js";import{runLocizeSync as u,runLocizeDownload as y,runLocizeMigrate as h}from"./locize.js";import{runRenameKey as w}from"./rename-key.js";const x=new o;x.name("i18next-cli").description("A unified, high-performance i18next CLI.").version("1.29.1"),x.option("-c, --config <path>","Path to i18next-cli config file (overrides detection)"),x.command("extract").description("Extract translation keys from source files and update resource files.").option("-w, --watch","Watch for file changes and re-run the extractor.").option("--ci","Exit with a non-zero status code if any files are updated.").option("--dry-run","Run the extractor without writing any files to disk.").option("--sync-primary","Sync primary language values with default values from code.").option("--sync-all","Sync primary language values with default values from code AND clear synced keys in all other locales.").action(async o=>{try{const t=x.opts().config,i=await a(t),r=async()=>{const e=!!o.syncPrimary||!!o.syncAll,t=await s(i,{isWatchMode:!!o.watch,isDryRun:!!o.dryRun,syncPrimaryWithDefaults:e,syncAll:!!o.syncAll});return o.ci&&!t?(console.log("✅ No files were updated."),process.exit(0)):o.ci&&t&&(console.error("❌ Some files were updated. This should not happen in CI mode."),process.exit(1)),t};if(await r(),o.watch){console.log("\nWatching for changes...");const o=await v(i.extract.input),t=j(i.extract.ignore),a=k(i.extract.output),c=[...t,...a].filter(Boolean),s=o.filter(o=>!c.some(e=>n(o,e,{dot:!0})));e.watch(s,{ignored:/node_modules/,persistent:!0}).on("change",o=>{console.log(`\nFile changed: ${o}`),r()})}}catch(o){console.error("Error running extractor:",o),process.exit(1)}}),x.command("status [locale]").description("Display translation status. Provide a locale for a detailed key-by-key view.").option("-n, --namespace <ns>","Filter the status report by a specific namespace").action(async(o,e)=>{const t=x.opts().config;let n=await r(t);if(!n){console.log(i.blue("No config file found. Attempting to detect project structure..."));const o=await c();o||(console.error(i.red("Could not automatically detect your project structure.")),console.log(`Please create a config file first by running: ${i.cyan("npx i18next-cli init")}`),process.exit(1)),console.log(i.green("Project structure detected successfully!")),n=o}await g(n,{detail:o,namespace:e.namespace})}),x.command("types").description("Generate TypeScript definitions from translation resource files.").option("-w, --watch","Watch for file changes and re-run the type generator.").action(async o=>{const t=x.opts().config,i=await a(t),r=()=>l(i);if(await r(),o.watch){console.log("\nWatching for changes...");const o=await v(i.types?.input||[]),t=[...j(i.extract?.ignore)].filter(Boolean),a=o.filter(o=>!t.some(e=>n(o,e,{dot:!0})));e.watch(a,{persistent:!0}).on("change",o=>{console.log(`\nFile changed: ${o}`),r()})}}),x.command("sync").description("Synchronize secondary language files with the primary language file.").action(async()=>{const o=x.opts().config,e=await a(o);await p(e)}),x.command("migrate-config [configPath]").description("Migrate a legacy i18next-parser.config.js to the new format.").action(async o=>{await f(o)}),x.command("init").description("Create a new i18next.config.ts/js file with an interactive setup wizard.").action(m),x.command("lint").description("Find potential issues like hardcoded strings in your codebase.").option("-w, --watch","Watch for file changes and re-run the linter.").action(async o=>{const t=x.opts().config,a=async()=>{let o=await r(t);if(!o){console.log(i.blue("No config file found. Attempting to detect project structure..."));const e=await c();e||(console.error(i.red("Could not automatically detect your project structure.")),console.log(`Please create a config file first by running: ${i.cyan("npx i18next-cli init")}`),process.exit(1)),console.log(i.green("Project structure detected successfully!")),o=e}await d(o)};if(await a(),o.watch){console.log("\nWatching for changes...");const o=await r(t);if(o?.extract?.input){const t=await v(o.extract.input),i=[...j(o.extract.ignore),...k(o.extract.output)].filter(Boolean),r=t.filter(o=>!i.some(e=>n(o,e,{dot:!0})));e.watch(r,{ignored:/node_modules/,persistent:!0}).on("change",o=>{console.log(`\nFile changed: ${o}`),a()})}}}),x.command("locize-sync").description("Synchronize local translations with your locize project.").option("--update-values","Update values of existing translations on locize.").option("--src-lng-only","Check for changes in source language only.").option("--compare-mtime","Compare modification times when syncing.").option("--dry-run","Run the command without making any changes.").action(async o=>{const e=x.opts().config,t=await a(e);await u(t,o)}),x.command("locize-download").description("Download all translations from your locize project.").action(async o=>{const e=x.opts().config,t=await a(e);await y(t,o)}),x.command("locize-migrate").description("Migrate local translation files to a new locize project.").action(async o=>{const e=x.opts().config,t=await a(e);await h(t,o)}),x.command("rename-key <oldKey> <newKey>").description("Rename a translation key across all source files and translation files.").option("--dry-run","Preview changes without modifying files").action(async(o,e,t)=>{try{const n=x.opts().config,r=await a(n),c=await w(r,o,e,t);c.success||(c.conflicts&&(console.error(i.red("\n❌ Conflicts detected:")),c.conflicts.forEach(o=>console.error(` - ${o}`))),c.error&&console.error(i.red(`\n❌ ${c.error}`)),process.exit(1));0===c.sourceFiles.reduce((o,e)=>o+e.changes,0)&&console.log(i.yellow(`\n⚠️ No usages found for "${o}"`))}catch(o){console.error(i.red("Error renaming key:"),o),process.exit(1)}}),x.parse(process.argv);const j=o=>Array.isArray(o)?o:o?[o]:[],k=o=>o&&"string"==typeof o?[o.replace(/\{\{[^}]+\}\}/g,"*")]:[],v=async(o=[])=>{const e=j(o),n=await Promise.all(e.map(o=>t(o||"",{nodir:!0})));return Array.from(new Set(n.flat()))};export{x as program};
@@ -1 +1 @@
1
- import{resolve as t,basename as e,extname as n}from"node:path";import{glob as r}from"glob";import{getNestedKeys as s,getNestedValue as o,setNestedValue as i}from"../../utils/nested-object.js";import{getOutputPath as a,loadTranslationFile as l}from"../../utils/file-utils.js";import{resolveDefaultValue as c}from"../../utils/default-value.js";function f(t){const e=`^${t.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*")}$`;return new RegExp(e)}function u(t,e,n,r){if(0===e.size)return!1;let s=t;const o=["zero","one","two","few","many","other"];for(const t of o){if(s.endsWith(`${n}${t}`)){s=s.slice(0,-(n.length+t.length));break}if(s.endsWith(`${n}ordinal${n}${t}`)){s=s.slice(0,-(n.length+7+n.length+t.length));break}}const i=s.split(r);if(i.length>1)for(let t=1;t<i.length;t++){const n=i.slice(0,-t).join(r);if(e.has(n))return!0}return!!e.has(s)}function p(t,e,n){if("object"!=typeof t||null===t||Array.isArray(t))return t;const r={},s=e?.extract?.pluralSeparator??"_",o=["zero","one","two","few","many","other"],i=o.map(t=>`ordinal${s}${t}`),a=Object.keys(t).sort((t,e)=>{const r=t=>{for(const e of i)if(t.endsWith(`${s}${e}`)){return{base:t.slice(0,-(s.length+e.length)),form:e,isOrdinal:!0,isPlural:!0,fullKey:t}}for(const e of o)if(t.endsWith(`${s}${e}`)){return{base:t.slice(0,-(s.length+e.length)),form:e,isOrdinal:!1,isPlural:!0,fullKey:t}}return{base:t,form:"",isOrdinal:!1,isPlural:!1,fullKey:t}},a=r(t),l=r(e);if(a.isPlural&&l.isPlural){const t=n?n(a.base,l.base):a.base.localeCompare(l.base,void 0,{sensitivity:"base"});if(0!==t)return t;if(a.isOrdinal!==l.isOrdinal)return a.isOrdinal?1:-1;const e=a.isOrdinal?i:o,r=e.indexOf(a.form),s=e.indexOf(l.form);return-1!==r&&-1!==s?r-s:a.form.localeCompare(l.form)}if(n)return n(t,e);const c=t.localeCompare(e,void 0,{sensitivity:"base"});return 0===c?t.localeCompare(e,void 0,{sensitivity:"case"}):c});for(const s of a)r[s]=p(t[s],e,n);return r}function d(t,e,n,r,a,l=[],d=new Set,g=!1,h=!1){const{keySeparator:y=".",sort:m=!0,removeUnusedKeys:x=!0,primaryLanguage:$,defaultValue:S="",pluralSeparator:O="_",contextSeparator:w="_",preserveContextVariants:b=!1}=n.extract,v=new Set;if(b)for(const{keyAcceptingContext:e}of t)e&&v.add(e);const k=new Set;let j=[],N=[];try{const t=new Intl.PluralRules(r,{type:"cardinal"}),e=new Intl.PluralRules(r,{type:"ordinal"});j=t.resolvedOptions().pluralCategories,N=e.resolvedOptions().pluralCategories,j.forEach(t=>k.add(t)),e.resolvedOptions().pluralCategories.forEach(t=>k.add(`ordinal_${t}`))}catch(t){const e=$||"en",n=new Intl.PluralRules(e,{type:"cardinal"}),r=new Intl.PluralRules(e,{type:"ordinal"});j=n.resolvedOptions().pluralCategories,N=r.resolvedOptions().pluralCategories,j.forEach(t=>k.add(t)),r.resolvedOptions().pluralCategories.forEach(t=>k.add(`ordinal_${t}`))}const C=n.extract.preservePatterns||[],P="string"==typeof n.extract.nsSeparator?n.extract.nsSeparator:":",W=t=>{if(l.some(e=>e.test(t)))return!0;for(const e of C)if("string"==typeof e){if(e.endsWith(`${P}*`)){const t=e.slice(0,-(P.length+1));if("*"===t||a&&t===a)return!0}if(e.includes(P)&&a){const[n,r]=e.split(P);if(n===a){if(f(r).test(t))return!0}}}return!1},_=t.filter(({key:t,hasCount:e,isOrdinal:n})=>{if((t=>{if(l.some(e=>e.test(t)))return!0;for(const t of C)if("string"==typeof t&&t.endsWith(`${P}*`)){const e=t.slice(0,-(P.length+1));if("*"===e||a&&e===a)return!0}return!1})(t))return!1;if(!e)return!0;const r=t.split(O);if(e&&1===r.length)return!0;if(1===j.length&&"other"===j[0]&&1===r.length)return!0;if(n&&r.includes("ordinal")){const t=r[r.length-1];return k.has(`ordinal_${t}`)}if(e){const t=r[r.length-1];return k.has(t)}return!0}),A=new Set;for(const t of _)if(t.isExpandedPlural){const e=String(t.key).split(O);e.length>=3&&"ordinal"===e[e.length-2]?A.add(e.slice(0,-2).join(O)):A.add(e.slice(0,-1).join(O))}let E=x?{}:JSON.parse(JSON.stringify(e));const I=s(e,y??".");for(const t of I){const n=W(t),r=!n&&u(t,v,O,w);if(n||b&&r){const n=o(e,t,y??".");i(E,t,n,y??".")}}if(x){const t=s(e,y??".");for(const n of t){const t=n.split(O);if("zero"===t[t.length-1]){const r=t.slice(0,-1).join(O);if(_.some(({key:t})=>t.split(O).slice(0,-1).join(O)===r)){const t=o(e,n,y??".");i(E,n,t,y??".")}}}}for(const{key:t,defaultValue:s,explicitDefault:l,hasCount:f,isExpandedPlural:u,isOrdinal:p}of _){if(f&&!u){const e=String(t).split(O);let n=t;if(e.length>=3&&"ordinal"===e[e.length-2]?n=e.slice(0,-2).join(O):e.length>=2&&(n=e.slice(0,-1).join(O)),A.has(n))continue}if(f&&!u){if(1===String(t).split(O).length&&r!==$){const l=t;if(A.has(l));else{const t=p?N:j;for(const f of t){const t=p?`${l}${O}ordinal${O}${f}`:`${l}${O}${f}`,u=o(e,t,y??".");if(void 0===u){let e;e="string"==typeof s?s:c(S,String(l),a||n?.extract?.defaultNS||"translation",r,s),i(E,t,e,y??".")}else i(E,t,u,y??".")}}continue}}const m=o(e,t,y??"."),x=!1===y||!_.some(e=>e.key!==t&&e.key.startsWith(`${t}${y}`)),b="object"==typeof m&&null!==m&&(d.has(t)||!s||s===t),v="object"==typeof m&&null!==m&&x&&!d.has(t)&&!b;if(b){i(E,t,m,y??".");continue}let k;if(void 0===m||v)if(r===$)if(g){const e=s&&(s===t||P&&a&&s===`${a}${P}${t}`||t!==s&&(t.startsWith(s+O)||t.startsWith(s+w)));k=s&&!e?s:c(S,t,a||n?.extract?.defaultNS||"translation",r,s)}else k=s||t;else k=c(S,t,a||n?.extract?.defaultNS||"translation",r,s);else if(r===$&&g){const e=s&&(s===t||P&&a&&s===`${a}${P}${t}`||t!==s&&(t.startsWith(s+O)||t.startsWith(s+w)));k=(t.includes(O)||t.includes(w))&&!l?m:s&&!e?c(s,t,a||n?.extract?.defaultNS||"translation",r,s):m}else k=h&&r!==$&&l?c(S,t,a||n?.extract?.defaultNS||"translation",r,s):m;i(E,t,k,y??".")}if(!0===m)return p(E,n);if("function"==typeof m){const e={},r=Object.keys(E),s=new Map;for(const e of t)if(s.set(String(e.key),e),y){const t=String(e.key).split(y)[0];s.has(t)||s.set(t,e)}const o=(t,e)=>{const n=s.get(t),r=s.get(e);if(n&&r)return m(n,r);return m({key:t},{key:e})};r.sort(o);for(const t of r)e[t]=p(E[t],n,o);E=e}return E}async function g(s,o,i,{syncPrimaryWithDefaults:c=!1,syncAll:u=!1}={}){i.extract.primaryLanguage||=i.locales[0]||"en",i.extract.secondaryLanguages||=i.locales.filter(t=>t!==i?.extract?.primaryLanguage);const p=[...i.extract.preservePatterns||[]],g=i.extract.indentation??2;for(const t of o)p.push(`${t}.*`);const h=p.map(f),y="__no_namespace__",m=new Map;for(const t of s.values()){const e=t.nsIsImplicit&&!1===i.extract.defaultNS?y:String(t.ns??i.extract.defaultNS??"translation");m.has(e)||m.set(e,[]),m.get(e).push(t)}const x=[],$=Array.isArray(i.extract.ignore)?i.extract.ignore:i.extract.ignore?[i.extract.ignore]:[];for(const s of i.locales){if(i.extract.mergeNamespaces||"string"==typeof i.extract.output&&!i.extract.output.includes("{{namespace}}")){const e={},n=a(i.extract.output,s),r=t(process.cwd(),n),f=await l(r)||{},u=Object.keys(f),p=!1!==i.extract.defaultNS&&u.some(t=>{const e=f[t];return"object"==typeof e&&null!==e&&!Array.isArray(e)})?new Set([...m.keys(),...u]):new Set([...m.keys(),y]);for(const t of p){const n=m.get(t)||[];if(t===y){const t=d(n,f,i,s,void 0,h,o,c);Object.assign(e,t)}else{const r=f[t]||{};e[t]=d(n,r,i,s,t,h,o,c)}}const $=JSON.stringify(f,null,g),S=JSON.stringify(e,null,g);x.push({path:r,updated:S!==$,newTranslations:e,existingTranslations:f})}else{const f=new Set(m.keys()),p=a(i.extract.output,s,"*").replace(/\\/g,"/"),y=await r(p,{ignore:$});for(const t of y)f.add(e(t,n(t)));for(const e of f){const n=m.get(e)||[],r=a(i.extract.output,s,e),f=t(process.cwd(),r),p=await l(f)||{},y=d(n,p,i,s,e,h,o,c,u),$=JSON.stringify(p,null,g),S=JSON.stringify(y,null,g);x.push({path:f,updated:S!==$,newTranslations:y,existingTranslations:p})}}}return x}export{g as getTranslations};
1
+ import{resolve as t,basename as e,extname as n}from"node:path";import{glob as r}from"glob";import{getNestedKeys as s,getNestedValue as o,setNestedValue as i}from"../../utils/nested-object.js";import{getOutputPath as a,loadTranslationFile as l}from"../../utils/file-utils.js";import{resolveDefaultValue as c}from"../../utils/default-value.js";function f(t){const e=`^${t.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*")}$`;return new RegExp(e)}function u(t,e,n,r){if(0===e.size)return!1;let s=t;const o=["zero","one","two","few","many","other"];for(const t of o){if(s.endsWith(`${n}${t}`)){s=s.slice(0,-(n.length+t.length));break}if(s.endsWith(`${n}ordinal${n}${t}`)){s=s.slice(0,-(n.length+7+n.length+t.length));break}}const i=s.split(r);if(i.length>1)for(let t=1;t<i.length;t++){const n=i.slice(0,-t).join(r);if(e.has(n))return!0}return!!e.has(s)}function p(t,e,n){if("object"!=typeof t||null===t||Array.isArray(t))return t;const r={},s=e?.extract?.pluralSeparator??"_",o=["zero","one","two","few","many","other"],i=o.map(t=>`ordinal${s}${t}`),a=Object.keys(t).sort((t,e)=>{const r=t=>{for(const e of i)if(t.endsWith(`${s}${e}`)){return{base:t.slice(0,-(s.length+e.length)),form:e,isOrdinal:!0,isPlural:!0,fullKey:t}}for(const e of o)if(t.endsWith(`${s}${e}`)){return{base:t.slice(0,-(s.length+e.length)),form:e,isOrdinal:!1,isPlural:!0,fullKey:t}}return{base:t,form:"",isOrdinal:!1,isPlural:!1,fullKey:t}},a=r(t),l=r(e);if(a.isPlural&&l.isPlural){const t=n?n(a.base,l.base):a.base.localeCompare(l.base,void 0,{sensitivity:"base"});if(0!==t)return t;if(a.isOrdinal!==l.isOrdinal)return a.isOrdinal?1:-1;const e=a.isOrdinal?i:o,r=e.indexOf(a.form),s=e.indexOf(l.form);return-1!==r&&-1!==s?r-s:a.form.localeCompare(l.form)}if(n)return n(t,e);const c=t.localeCompare(e,void 0,{sensitivity:"base"});return 0===c?t.localeCompare(e,void 0,{sensitivity:"case"}):c});for(const s of a)r[s]=p(t[s],e,n);return r}function d(t,e,n,r,a,l=[],d=new Set,g=!1,h=!1){const{keySeparator:y=".",sort:m=!0,removeUnusedKeys:x=!0,primaryLanguage:$,defaultValue:S="",pluralSeparator:O="_",contextSeparator:w="_",preserveContextVariants:b=!1}=n.extract,v=new Set;if(b)for(const{keyAcceptingContext:e}of t)e&&v.add(e);const k=new Set;let j=[],N=[];try{const t=new Intl.PluralRules(r,{type:"cardinal"}),e=new Intl.PluralRules(r,{type:"ordinal"});j=t.resolvedOptions().pluralCategories,N=e.resolvedOptions().pluralCategories,j.forEach(t=>k.add(t)),e.resolvedOptions().pluralCategories.forEach(t=>k.add(`ordinal_${t}`))}catch(t){const e=$||"en",n=new Intl.PluralRules(e,{type:"cardinal"}),r=new Intl.PluralRules(e,{type:"ordinal"});j=n.resolvedOptions().pluralCategories,N=r.resolvedOptions().pluralCategories,j.forEach(t=>k.add(t)),r.resolvedOptions().pluralCategories.forEach(t=>k.add(`ordinal_${t}`))}const C=n.extract.preservePatterns||[],P="string"==typeof n.extract.nsSeparator?n.extract.nsSeparator:":",W=t=>{if(l.some(e=>e.test(t)))return!0;for(const e of C)if("string"==typeof e){if(e.endsWith(`${P}*`)){const t=e.slice(0,-(P.length+1));if("*"===t||a&&t===a)return!0}if(e.includes(P)&&a){const[n,r]=e.split(P);if(n===a){if(f(r).test(t))return!0}}}return!1},_=t.filter(({key:t,hasCount:e,isOrdinal:n})=>{if((t=>{if(l.some(e=>e.test(t)))return!0;for(const t of C)if("string"==typeof t&&t.endsWith(`${P}*`)){const e=t.slice(0,-(P.length+1));if("*"===e||a&&e===a)return!0}return!1})(t))return!1;if(!e)return!0;const r=t.split(O);if(e&&1===r.length)return!0;if(1===j.length&&"other"===j[0]&&1===r.length)return!0;if(n&&r.includes("ordinal")){const t=r[r.length-1];return k.has(`ordinal_${t}`)}if(e){const t=r[r.length-1];return k.has(t)}return!0}),A=new Set;for(const t of _)if(t.isExpandedPlural){const e=String(t.key).split(O);e.length>=3&&"ordinal"===e[e.length-2]?A.add(e.slice(0,-2).join(O)):A.add(e.slice(0,-1).join(O))}let E=x?{}:JSON.parse(JSON.stringify(e));const I=s(e,y??".");for(const t of I){const n=W(t),r=!n&&u(t,v,O,w);if(n||b&&r){const n=o(e,t,y??".");i(E,t,n,y??".")}}if(x){const t=s(e,y??".");for(const n of t){const t=n.split(O);if("zero"===t[t.length-1]){const r=t.slice(0,-1).join(O);if(_.some(({key:t})=>t.split(O).slice(0,-1).join(O)===r)){const t=o(e,n,y??".");i(E,n,t,y??".")}}}}for(const{key:t,defaultValue:s,explicitDefault:l,hasCount:f,isExpandedPlural:u,isOrdinal:p}of _){if(f&&!u){const e=String(t).split(O);let n=t;if(e.length>=3&&"ordinal"===e[e.length-2]?n=e.slice(0,-2).join(O):e.length>=2&&(n=e.slice(0,-1).join(O)),A.has(n))continue}if(f&&!u){if(1===String(t).split(O).length&&r!==$){const l=t;if(A.has(l));else{const t=p?N:j;for(const f of t){const t=p?`${l}${O}ordinal${O}${f}`:`${l}${O}${f}`,u=!t.startsWith("<")&&(y??"."),d=o(e,t,u);if(void 0===d){let e;e="string"==typeof s?s:c(S,String(l),a||n?.extract?.defaultNS||"translation",r,s),i(E,t,e,u)}else i(E,t,d,u)}}continue}}const m=!t.startsWith("<")&&(y??"."),x=o(e,t,m),b=!1===y||!_.some(e=>e.key!==t&&e.key.startsWith(`${t}${y}`)),v="object"==typeof x&&null!==x&&(d.has(t)||!s||s===t),k="object"==typeof x&&null!==x&&b&&!d.has(t)&&!v;if(v){i(E,t,x,m);continue}let C;if(void 0===x||k)if(r===$)if(g){const e=s&&(s===t||P&&a&&s===`${a}${P}${t}`||t!==s&&(t.startsWith(s+O)||t.startsWith(s+w)));C=s&&!e?s:c(S,t,a||n?.extract?.defaultNS||"translation",r,s)}else C=s||t;else C=c(S,t,a||n?.extract?.defaultNS||"translation",r,s);else if(r===$&&g){const e=s&&(s===t||P&&a&&s===`${a}${P}${t}`||t!==s&&(t.startsWith(s+O)||t.startsWith(s+w)));C=(t.includes(O)||t.includes(w))&&!l?x:s&&!e?c(s,t,a||n?.extract?.defaultNS||"translation",r,s):x}else C=h&&r!==$&&l?c(S,t,a||n?.extract?.defaultNS||"translation",r,s):x;i(E,t,C,m)}if(!0===m)return p(E,n);if("function"==typeof m){const e={},r=Object.keys(E),s=new Map;for(const e of t)if(s.set(String(e.key),e),y){const t=String(e.key).split(y)[0];s.has(t)||s.set(t,e)}const o=(t,e)=>{const n=s.get(t),r=s.get(e);if(n&&r)return m(n,r);return m({key:t},{key:e})};r.sort(o);for(const t of r)e[t]=p(E[t],n,o);E=e}return E}async function g(s,o,i,{syncPrimaryWithDefaults:c=!1,syncAll:u=!1}={}){i.extract.primaryLanguage||=i.locales[0]||"en",i.extract.secondaryLanguages||=i.locales.filter(t=>t!==i?.extract?.primaryLanguage);const p=[...i.extract.preservePatterns||[]],g=i.extract.indentation??2;for(const t of o)p.push(`${t}.*`);const h=p.map(f),y="__no_namespace__",m=new Map;for(const t of s.values()){const e=t.nsIsImplicit&&!1===i.extract.defaultNS?y:String(t.ns??i.extract.defaultNS??"translation");m.has(e)||m.set(e,[]),m.get(e).push(t)}const x=[],$=Array.isArray(i.extract.ignore)?i.extract.ignore:i.extract.ignore?[i.extract.ignore]:[];for(const s of i.locales){if(i.extract.mergeNamespaces||"string"==typeof i.extract.output&&!i.extract.output.includes("{{namespace}}")){const e={},n=a(i.extract.output,s),r=t(process.cwd(),n),f=await l(r)||{},u=Object.keys(f),p=!1!==i.extract.defaultNS&&u.some(t=>{const e=f[t];return"object"==typeof e&&null!==e&&!Array.isArray(e)})?new Set([...m.keys(),...u]):new Set([...m.keys(),y]);for(const t of p){const n=m.get(t)||[];if(t===y){const t=d(n,f,i,s,void 0,h,o,c);Object.assign(e,t)}else{const r=f[t]||{};e[t]=d(n,r,i,s,t,h,o,c)}}const $=JSON.stringify(f,null,g),S=JSON.stringify(e,null,g);x.push({path:r,updated:S!==$,newTranslations:e,existingTranslations:f})}else{const f=new Set(m.keys()),p=a(i.extract.output,s,"*").replace(/\\/g,"/"),y=await r(p,{ignore:$});for(const t of y)f.add(e(t,n(t)));for(const e of f){const n=m.get(e)||[],r=a(i.extract.output,s,e),f=t(process.cwd(),r),p=await l(f)||{},y=d(n,p,i,s,e,h,o,c,u),$=JSON.stringify(p,null,g),S=JSON.stringify(y,null,g);x.push({path:f,updated:S!==$,newTranslations:y,existingTranslations:p})}}}return x}export{g as getTranslations};
@@ -1 +1 @@
1
- import{getObjectPropValueExpression as e,getObjectPropValue as t,isSimpleTemplateLiteral as n}from"./ast-utils.js";function i(e){if(e)return"StringLiteral"===e.type?e.value:"TemplateLiteral"===e.type&&n(e)?e.quasis[0].cooked:void 0}function s(e){return"StringLiteral"===e.value?.type?e.value.value:"JSXExpressionContainer"===e.value?.type?i(e.value.expression):void 0}function r(n,r){const o=n.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"i18nKey"===e.name.value),p=n.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"defaults"===e.name.value),l=n.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"count"===e.name.value),a=n.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"values"===e.name.value);let c;l||"JSXAttribute"!==a?.type||"JSXExpressionContainer"!==a.value?.type||"ObjectExpression"!==a.value.expression.type||(c=e(a.value.expression,"count"));const u=!!l||!!c,f=n.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"tOptions"===e.name.value),y="JSXAttribute"===f?.type&&"JSXExpressionContainer"===f.value?.type&&"ObjectExpression"===f.value.expression.type?f.value.expression:void 0,g=n.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"ordinal"===e.name.value),d=!!g,x=n.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"context"===e.name.value);let h="JSXAttribute"===x?.type&&"JSXExpressionContainer"===x.value?.type?x.value.expression:"JSXAttribute"===x?.type&&"StringLiteral"===x.value?.type?x.value:void 0;const v=n.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"ns"===e.name.value);let S;S="JSXAttribute"===v?.type?s(v):void 0,y&&(void 0===S&&(S=t(y,"ns")),void 0===h&&(h=e(y,"context")));const m=function(e,t){if(!e||0===e.length)return"";const n=new Set(t.extract.transKeepBasicHtmlNodesFor??["br","strong","i","p"]),s=e=>e&&"JSXText"===e.type&&/^\s*$/.test(e.value)&&e.value.includes("\n");function r(e,t,o=!1,p=!1){if(!e||!e.length)return;const l=p&&e.filter(e=>e&&"JSXElement"===e.type&&"p"===e.opening?.name?.value).length>1;let a=0,c=e.length-1;for(;a<=c&&s(e[a]);)a++;for(;c>=a&&s(e[c]);)c--;const u=a<=c?e.slice(a,c+1):[],f=u.some(e=>e&&("JSXElement"===e.type||"JSXFragment"===e.type));for(let e=0;e<u.length;e++){const a=u[e];if(a)if("JSXText"!==a.type){if("JSXExpressionContainer"===a.type){if(o&&!f&&a.expression){const e=a.expression.type;if("ObjectExpression"===e){const e=a.expression.properties&&a.expression.properties[0];if(e&&"KeyValueProperty"===e.type)continue}if(void 0!==i(a.expression))continue;if("Identifier"===e||"MemberExpression"===e||"CallExpression"===e)continue}const n=i(a.expression);if(void 0!==n){const i=/^\s*$/.test(n)&&!n.includes("\n"),r=u[e-1],o=u[e+1];if(i){const n=u[e+2];if(o&&"JSXText"===o.type&&s(o)&&n&&("JSXElement"===n.type||"JSXFragment"===n.type)){const t=u[e-1],n=u[e-2];if(!t||"JSXText"!==t.type&&n&&"JSXExpressionContainer"===n.type)continue}if(r&&("JSXElement"===r.type||"JSXFragment"===r.type)&&o&&"JSXText"===o.type&&s(o))continue;const i=!o||"JSXText"===o.type&&!s(o);if(r&&"JSXText"===r.type&&i){const e=t[t.length-1];if(e&&"JSXText"===e.type){e.value=String(e.value)+a.expression.value;continue}}if(r&&("JSXElement"===r.type||"JSXFragment"===r.type)&&o&&"JSXText"===o.type&&s(o))continue}}t.push(a);continue}if("JSXElement"===a.type){const e=a.opening&&a.opening.name&&"Identifier"===a.opening.name.type?a.opening.name.value:void 0;if(e&&n.has(e)){const o=a.opening&&Array.isArray(a.opening.attributes)&&a.opening.attributes.length>0,c=a.children||[],f=1===c.length&&("JSXText"===c[0]?.type||"JSXExpressionContainer"===c[0]?.type&&void 0!==i(c[0].expression)),y=!c.length,g=f;if(o&&!f)t.push(a),r(a.children||[],t,!0);else if(y)t.push(a);else if(!g)if("p"===e){const e=(c||[]).some(e=>{if(!e||"JSXElement"!==e.type)return!1;const t=e.opening&&e.opening.name&&"Identifier"===e.opening.name.type?e.opening.name.value:void 0,s=e.opening&&Array.isArray(e.opening.attributes)&&e.opening.attributes.length>0,r=e.children||[],o=1===r.length&&("JSXText"===r[0]?.type||"JSXExpressionContainer"===r[0]?.type&&void 0!==i(r[0].expression));return!(t&&n.has(t)&&!s&&(0===r.length||o))}),o=p&&u.some(e=>e&&e!==a&&"JSXText"===e.type&&!s(e));l||p&&e&&!o?(t.push(a),r(a.children||[],t,!0,!1)):r(a.children||[],t,!1,!1)}else r(a.children||[],t,!1,!1);continue}t.push(a),r(a.children||[],t,!0);continue}"JSXFragment"!==a.type||r(a.children||[],t,o)}else{if(o&&!f)continue;if(o&&s(a))continue;if(s(a)){const n=u[e-1],i=u[e+1];if(n&&("JSXElement"===n.type||"JSXFragment"===n.type)&&i&&("JSXElement"===i.type||"JSXFragment"===i.type))continue;const s=t[t.length-1],r=u[e-1];if(s){if(r&&"JSXExpressionContainer"===r.type)continue;if("JSXText"===s.type&&r&&"JSXText"===r.type){s.value=String(s.value)+a.value;continue}}}if(o&&f&&0===e)continue;t.push(a)}}}const o=[];function p(e){if(!e||!e.length)return!1;let t=!1;for(const n of e)if(n)if("JSXElement"!==n.type){if("JSXExpressionContainer"===n.type&&-1!==o.indexOf(n))return t;if("JSXText"===n.type&&-1!==o.indexOf(n)){if(s(n))continue;if(!t)return!0;const i=e.indexOf(n);if(e.slice(i+1).some(e=>e&&"JSXElement"===e.type))return!0}}else t=!0;return!1}r(e,o,!1,!0);const l=new Set,a=e=>String(e).replace(/^\s*\n\s*/g,"").replace(/\s*\n\s*$/g,"");function c(e,t,r=!1){if(!e||0===e.length)return"";let u="";const f=e=>{if(!e)return-1;if(t&&t.has(e))return t.get(e);if(t)for(const[n,i]of t.entries())try{if(n&&e&&n.span&&e.span&&n.span.start===e.span.start&&n.span.end===e.span.end)return i}catch(e){}return o.indexOf(e)};let y=0;for(let t=0;t<e.length;t++){const g=e[t];if(g){if("JSXText"===g.type){if(s(g))continue;const i=e[t+1],r=e[t-1];if(r&&"JSXElement"===r.type){const i="Identifier"===r.opening?.name?.type?r.opening.name.value:void 0,s=i&&n.has(i),o=0===(r.children||[]).length;if(s&&o&&/^\s*\n\s*/.test(g.value)){const e=g.value.replace(/^\s*\n\s*/,"");if(e){u+=e;continue}continue}if(!s&&/^\s*\n\s*/.test(g.value)){const n=g.value.replace(/^\s*\n\s*/,"");if(n){if(r&&"JSXElement"===r.type&&Array.isArray(r.children)&&0===r.children.length){u+=n;continue}const i=e[t-2];if(i&&"JSXText"===i.type){const e=i.value.replace(/\n\s*$/,""),t=/[A-Za-z0-9]$/.test(e),s=/^[A-Za-z0-9]/.test(n),r=/^[a-z]/.test(n);if(t&&s&&r){u+=n;continue}}u+=" "+n;continue}continue}}if(/\n\s*$/.test(g.value)&&i&&"JSXElement"===i.type){const r=g.value.replace(/\n\s*$/,"");if(r.trim()){const o="Identifier"===i.opening?.name?.type?i.opening.name.value:void 0,p=o&&n.has(o),a=(i.children||[]).length>0,c=/\s\n/.test(g.value),f=e[t+2],y=f&&"JSXText"===f.type&&!s(f)&&/[a-zA-Z0-9]/.test(f.value),d=!!(i.opening&&Array.isArray(i.opening.attributes)&&i.opening.attributes.length>0),x=/^\s/.test(r)&&!/^\n/.test(r),h=r.trim(),v=x?" "+h:h,S=/[A-Za-z0-9]$/.test(h),m=f&&"string"==typeof f.value&&/^[A-Za-z0-9]/.test(f.value.trim()),J=f&&"string"==typeof f.value&&/^[a-z]/.test(f.value.trim()),X=f&&"string"==typeof f.value&&/^\s/.test(f.value)&&!/^\n/.test(f.value),$=d&&a&&y&&!(S&&m&&J&&!c&&!x&&!X),E=f&&"string"==typeof f.value&&/^[,;:!?.]/.test(f.value.trim()),b=$&&!E;S&&m&&J&&!c&&!x&&!X&&l.add(i),u+=c||p&&a||!p&&y&&x||b?v+" ":v;continue}}u+=g.value;continue}if("JSXExpressionContainer"===g.type){const e=g.expression;if(!e)continue;const t=i(e);if(void 0!==t)u+=t;else if("Identifier"===e.type)u+=`{{${e.value}}}`;else if("TsAsExpression"===e.type&&"ObjectExpression"===e.expression?.type){const t=e.expression,n=t.properties.filter(e=>"KeyValueProperty"===e.type&&e.key&&"Identifier"===e.key.type).map(e=>e.key.value);if(n.length>0)u+=n.map(e=>`{{${e}}}`).join("");else{const e=t.properties[0];if(!e||"Identifier"!==e.type)throw new Error("Unrecognized expression in JSX placeholder");u+=`{{${e.value}}}`}}else if("ObjectExpression"===e.type){const t=e.properties[0];if(t&&"KeyValueProperty"===t.type&&t.key&&"Identifier"===t.key.type)u+=`{{${t.key.value}}}`;else{if(!t||"Identifier"!==t.type)throw new Error("Unrecognized expression in JSX placeholder");u+=`{{${t.value}}}`}}else if("MemberExpression"===e.type&&e.property&&"Identifier"===e.property.type)u+=`{{${e.property.value}}}`;else{if("CallExpression"!==e.type||"Identifier"!==e.callee?.type)throw new Error("Unrecognized expression in JSX placeholder");u+=`{{${e.callee.value}}}`}continue}if("JSXElement"===g.type){let l;g.opening&&g.opening.name&&"Identifier"===g.opening.name.type&&(l=g.opening.name.value);const d=r?y:void 0;if(r&&"JSXElement"===g.type&&y++,l&&n.has(l)){const x=g.opening&&Array.isArray(g.opening.attributes)&&g.opening.attributes.length>0,h=g.children||[],v=h.length>0,S=1===h.length&&("JSXText"===h[0]?.type||"JSXExpressionContainer"===h[0]?.type&&void 0!==i(h[0].expression)),m="p"===l;let J=0;if(m&&r&&(J=e.filter(e=>e&&"JSXElement"===e.type&&"p"===e.opening?.name?.value).length),!v||S){const i=S?c(h,void 0):"";if(""!==String(i).trim())if(n.has(l)&&"p"!==l)u+=`<${l}>${a(i)}</${l}>`;else if(m&&r&&J>1)u+=`<${l}>${a(i)}</${l}>`;else if(m){const e=r?y-1:o.indexOf(g);u+=`<${e}>${a(i)}</${e}>`}else{const e=r?y-1:o.indexOf(g);u+=`<${e}>${a(i)}</${e}>`}else{const n=e[t-1];n&&"JSXText"===n.type&&/\n\s*$/.test(n.value)&&(u=u.replace(/\s+$/,"")),u+=`<${l} />`}}else if(x&&!S){const e=h,t=f(g);if(p(e)){const s=new Map;let r=0;for(const t of e)if(t&&"JSXElement"===t.type){const e=t.opening&&t.opening.name&&"Identifier"===t.opening.name.type?t.opening.name.value:void 0;if(e&&n.has(e)){const e=t.opening&&Array.isArray(t.opening.attributes)&&t.opening.attributes.length>0,n=t.children||[],o=1===n.length&&("JSXText"===n[0]?.type||"JSXExpressionContainer"===n[0]?.type&&void 0!==i(n[0].expression));!e&&(!n.length||o)||s.set(t,r++)}else s.set(t,r++)}const o=c(e,s.size?s:void 0);u+=`<${t}>${a(o)}</${t}>`}else{const e=new Map;let s=0;for(const t of h)if(t&&"JSXElement"===t.type){const r=t.opening&&t.opening.name&&"Identifier"===t.opening.name.type?t.opening.name.value:void 0;if(r&&n.has(r)){const n=t.opening&&Array.isArray(t.opening.attributes)&&t.opening.attributes.length>0,r=t.children||[],o=1===r.length&&("JSXText"===r[0]?.type||"JSXExpressionContainer"===r[0]?.type&&void 0!==i(r[0].expression));!n&&(!r.length||o)||e.set(t,s++)}else e.set(t,s++)}const r=c(h,e.size?e:void 0);u+=`<${t}>${a(r)}</${t}>`}}else{const e=o.indexOf(g);if(-1!==e){const t=void 0!==d?d:e;if((()=>{let e=!1;for(const t of h)if(t)if("JSXElement"!==t.type){if("JSXExpressionContainer"===t.type&&-1!==o.indexOf(t))return e;if("JSXText"===t.type&&-1!==o.indexOf(t)){if(s(t))continue;if(!e)return!0;if(h.slice(h.indexOf(t)+1).some(e=>e&&"JSXElement"===e.type))return!0}}else e=!0;return!1})()){if(0===t){const e=c(h,void 0,!1);u+=`<${t}>${a(e)}</${t}>`;continue}const e=new Map;let s=0;for(const t of h)if(t&&"JSXElement"===t.type){const r=t.opening&&t.opening.name&&"Identifier"===t.opening.name.type?t.opening.name.value:void 0;if(r&&n.has(r)){const n=t.opening&&Array.isArray(t.opening.attributes)&&t.opening.attributes.length>0,r=t.children||[],o=1===r.length&&("JSXText"===r[0]?.type||"JSXExpressionContainer"===r[0]?.type&&void 0!==i(r[0].expression));!n&&(!r.length||o)||e.set(t,s++)}else e.set(t,s++)}const r=c(h,e.size?e:void 0,!1);u+=`<${t}>${a(r)}</${t}>`;continue}const r=new Map;let p=0;for(const e of h)if(e&&"JSXElement"===e.type){const t=e.opening&&e.opening.name&&"Identifier"===e.opening.name.type?e.opening.name.value:void 0;if(t&&n.has(t)){const t=e.opening&&Array.isArray(e.opening.attributes)&&e.opening.attributes.length>0,n=e.children||[],s=1===n.length&&("JSXText"===n[0]?.type||"JSXExpressionContainer"===n[0]?.type&&void 0!==i(n[0].expression));!t&&(!n.length||s)||r.set(e,p++)}else r.set(e,p++)}const l=c(h,r.size>0?r:void 0,!1);u+=`<${t}>${a(l)}</${t}>`}else{const e=c(h,void 0,!1);u+=`<${l}>${a(e)}</${l}>`}}}else{const e=g.children||[];if(e.some(e=>e&&("JSXText"===e.type||"JSXExpressionContainer"===e.type)&&-1!==o.indexOf(e))){const t=o.indexOf(g),n=c(e,void 0);u+=`<${t}>${a(n)}</${t}>`}else{const t=new Map,i=f(g);let s=0;for(const i of e)if(i&&"JSXElement"===i.type){const e=i.opening&&i.opening.name&&"Identifier"===i.opening.name.type?i.opening.name.value:void 0;if(e&&n.has(e)){const e=i.opening&&Array.isArray(i.opening.attributes)&&i.opening.attributes.length>0,n=i.children||[],r=1===n.length&&"JSXText"===n[0]?.type;!e&&(!n.length||r)||t.set(i,s++)}else t.set(i,s++)}const r=c(e,t.size?t:void 0);u+=`<${i}>${a(r)}</${i}>`}}continue}"JSXFragment"!==g.type||(u+=c(g.children||[]))}}return u}const u=c(e,void 0,!0),f=String(u).replace(/<br \/>\s*\n\s*/g,"<br />"),y=String(f),g=new Set;if(l&&l.size>0)for(let e=0;e<o.length;e++)l.has(o[e])&&g.add(e);let d=String(y);if(g&&g.size>0)for(const e of g)try{d=d.replace(new RegExp("\\s+<"+e+">","g"),"<"+e+">"),d=d.replace(new RegExp("<\\/"+e+">\\s+","g"),"</"+e+">")}catch(e){}d=d.replace(/<\/(\d+)>\s*\n\s*(\S)/g,(e,t,n)=>{const i=Number(t);return g.has(i)?`</${t}>${n}`:`</${t}> ${n}`}),d=d.replace(/(\S)\s*\n\s*<(\d+)/g,(e,t,n)=>{const i=Number(n);return g.has(i)?`${t}<${n}`:`${t} <${n}`}),d=d.replace(/\s*\n\s*/g," "),d=d.replace(/\s+/g," "),d=d.replace(/\s+([,;:!?.])/g,"$1");const x=d.trim();let h=String(x);if(g&&g.size>0)for(const e of g)try{h=h.replace(new RegExp("[\\s\\u00A0]+<"+e+">","g"),"<"+e+">"),h=h.replace(new RegExp("<\\/"+e+">[\\s\\u00A0]+","g"),"</"+e+">")}catch(e){}try{for(let e=0;e<o.length;e++){const t=o[e];if(!t||"JSXElement"!==t.type)continue;const n=o[e-1],i=o[e+1];if(!n||!i)continue;if("JSXText"!==n.type||"JSXText"!==i.type)continue;const s=String(n.value),r=String(i.value),p=s.replace(/\n\s*$/,""),l=/[A-Za-z0-9]$/.test(p),a=/^[A-Za-z0-9]/.test(r.trim()),c=/^[a-z]/.test(r.trim()),u=/\s\n/.test(s),f=r&&/^\s/.test(r)&&!/^\n/.test(r);if(l&&a&&c&&!u&&!f){const t=e;h=h.replace(new RegExp("\\s+<"+t+">","g"),"<"+t+">")}}}catch(e){}function v(e){if(!e||!e.includes("<"))return e;function t(e){const t=[],n=[];let i=0;const s=/<\/?(\d+)>|<[^>]+>/g;let r;for(;r=s.exec(e);){const o=r[0],p=r.index;if(p>i){const s={type:"text",text:e.slice(i,p)};n.length?n[n.length-1].node.children.push(s):t.push(s)}const l=/^<\/(\d+)>$/.exec(o),a=/^<(\d+)>$/.exec(o);if(a){const e=Number(a[1]),i={type:"ph",idx:e,children:[]};n.length?n[n.length-1].node.children.push(i):t.push(i),n.push({node:i,idx:e})}else if(l)n.length&&n.pop();else{const e={type:"text",text:o};n.length?n[n.length-1].node.children.push(e):t.push(e)}i=s.lastIndex}if(i<e.length){const s={type:"text",text:e.slice(i)};n.length?n[n.length-1].node.children.push(s):t.push(s)}return t}function i(e,t=null){let s="";for(const r of e)if("text"===r.type)s+=r.text;else{const e=r.children.filter(e=>"ph"===e.type),p=e.map(e=>e.idx);if(!(p.length<=1||p.every((e,t)=>0===t||e===p[t-1]+1))){const e=r.children.map(e=>"text"===e.type?e.text:`<${e.idx}>${i(e.children,e.idx)}</${e.idx}>`).join("");s+=`<${r.idx}>${e}</${r.idx}>`;continue}const l=new Map;let a=0;try{const i=o[r.idx];if(i&&i.span){const s=i.span.start,p=i.span.end;let l=-1;for(let e=r.idx+1;e<o.length;e++){const t=o[e];if(t&&t.span&&(t.span.start>=s&&t.span.end<=p&&"JSXElement"===t.type)){l=e;break}}let c=0;if(-1!==l)for(let e=r.idx+1;e<l;e++){const t=o[e];t&&t.span&&(t.span.start>=s&&t.span.end<=p&&("JSXText"!==t.type&&"JSXExpressionContainer"!==t.type||c++))}else for(let e=r.idx+1;e<o.length;e++){const t=o[e];t&&t.span&&(t.span.start>=s&&t.span.end<=p&&("JSXText"!==t.type&&"JSXExpressionContainer"!==t.type||c++))}if("number"==typeof r.idx){const i=o[r.idx],s=i?.opening?.name?.value,p=s&&n.has(s),l=null===t;1===e.length?(a=Math.max(1,c+1),!l||p||0!==e[0].idx||"a"!==s&&"p"!==s||(a=0)):a=0}}}catch(e){}for(const t of e)l.has(t.idx)||l.set(t.idx,a++);const c=r.children.map(e=>{if("text"===e.type)return e.text;const t=e.idx,n=l.has(t)?l.get(t):t;return`<${n}>${i(e.children,n)}</${n}>`}).join("");s+=`<${r.idx}>${c}</${r.idx}>`}return s}try{return i(t(e))}catch(t){return e}}return h=v(h),h.trim()}(n.children,r);let J;const X="JSXAttribute"===p?.type?s(p):void 0;if(void 0!==X)J=X;else{const e=r.extract.defaultValue;J="string"==typeof e?e:""}let $,E;if("JSXAttribute"===o?.type){if("StringLiteral"===o.value?.type){if($=o.value,E=$.value,!E||""===E.trim())return null;if(S&&"StringLiteral"===$.type){const e=r.extract.nsSeparator??":",t=$.value;if(e&&t.startsWith(`${S}${e}`)){if(E=t.slice(`${S}${e}`.length),!E||""===E.trim())return null;$={...$,value:E}}}}else"JSXExpressionContainer"===o.value?.type&&"JSXEmptyExpression"!==o.value.expression.type&&($=o.value.expression);if(!$)return null}p||!E||m.trim()?!p&&m.trim()&&(J=m):J=E;return{keyExpression:$,serializedChildren:m,ns:S,defaultValue:J,hasCount:u,isOrdinal:d,contextExpression:h,optionsNode:y,explicitDefault:void 0!==X||(e=>{if(!e||!Array.isArray(e.properties))return!1;for(const t of e.properties)if(t&&"KeyValueProperty"===t.type&&t.key){const e="Identifier"===t.key.type&&t.key.value||"StringLiteral"===t.key.type&&t.key.value;if("string"==typeof e&&e.startsWith("defaultValue"))return!0}return!1})(y)}}export{r as extractFromTransComponent};
1
+ import{getObjectPropValueExpression as e,getObjectPropValue as t,isSimpleTemplateLiteral as n}from"./ast-utils.js";function i(e){if(e)return"StringLiteral"===e.type?e.value:"TemplateLiteral"===e.type&&n(e)?e.quasis[0].cooked:void 0}function s(e){return"StringLiteral"===e.value?.type?e.value.value:"JSXExpressionContainer"===e.value?.type?i(e.value.expression):void 0}function r(n,r){const o=n.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"i18nKey"===e.name.value),p=n.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"defaults"===e.name.value),l=n.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"count"===e.name.value),a=n.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"values"===e.name.value);let c;l||"JSXAttribute"!==a?.type||"JSXExpressionContainer"!==a.value?.type||"ObjectExpression"!==a.value.expression.type||(c=e(a.value.expression,"count"));const u=!!l||!!c,f=n.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"tOptions"===e.name.value),y="JSXAttribute"===f?.type&&"JSXExpressionContainer"===f.value?.type&&"ObjectExpression"===f.value.expression.type?f.value.expression:void 0,d=n.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"ordinal"===e.name.value),g=!!d,x=n.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"context"===e.name.value);let h="JSXAttribute"===x?.type&&"JSXExpressionContainer"===x.value?.type?x.value.expression:"JSXAttribute"===x?.type&&"StringLiteral"===x.value?.type?x.value:void 0;const v=n.opening.attributes?.find(e=>"JSXAttribute"===e.type&&"Identifier"===e.name.type&&"ns"===e.name.value);let S;S="JSXAttribute"===v?.type?s(v):void 0,y&&(void 0===S&&(S=t(y,"ns")),void 0===h&&(h=e(y,"context")));const m=function(e,t){if(!e||0===e.length)return"";const n=new Set(t.extract.transKeepBasicHtmlNodesFor??["br","strong","i","p"]),s=e=>e&&"JSXText"===e.type&&/^\s*$/.test(e.value)&&e.value.includes("\n");function r(e,t,o=!1,p=!1){if(!e||!e.length)return;const l=p&&e.filter(e=>e&&"JSXElement"===e.type&&"p"===e.opening?.name?.value).length>1;let a=0,c=e.length-1;for(;a<=c&&s(e[a]);)a++;for(;c>=a&&s(e[c]);)c--;const u=a<=c?e.slice(a,c+1):[],f=u.some(e=>e&&("JSXElement"===e.type||"JSXFragment"===e.type));for(let e=0;e<u.length;e++){const a=u[e];if(a)if("JSXText"!==a.type){if("JSXExpressionContainer"===a.type){if(o&&!f&&a.expression){const e=a.expression.type;if("ObjectExpression"===e)continue;if(void 0!==i(a.expression))continue;if("Identifier"===e||"MemberExpression"===e||"CallExpression"===e)continue}const n=i(a.expression);if(void 0!==n){const i=/^\s*$/.test(n)&&!n.includes("\n"),r=u[e-1],o=u[e+1];if(i){const n=u[e+2];if(o&&"JSXText"===o.type&&s(o)&&n&&("JSXElement"===n.type||"JSXFragment"===n.type)){const t=u[e-1],n=u[e-2];if(!t||"JSXText"!==t.type&&n&&"JSXExpressionContainer"===n.type)continue}if(r&&("JSXElement"===r.type||"JSXFragment"===r.type)&&o&&"JSXText"===o.type&&s(o))continue;const i=!o||"JSXText"===o.type&&!s(o);if(r&&"JSXText"===r.type&&i){const e=t[t.length-1];if(e&&"JSXText"===e.type){e.value=String(e.value)+a.expression.value;continue}}if(r&&("JSXElement"===r.type||"JSXFragment"===r.type)&&o&&"JSXText"===o.type&&s(o))continue}}t.push(a);continue}if("JSXElement"===a.type){const e=a.opening&&a.opening.name&&"Identifier"===a.opening.name.type?a.opening.name.value:void 0;if(e&&n.has(e)){const o=a.opening&&Array.isArray(a.opening.attributes)&&a.opening.attributes.length>0,c=a.children||[],f=1===c.length&&("JSXText"===c[0]?.type||"JSXExpressionContainer"===c[0]?.type&&void 0!==i(c[0].expression)),y=!c.length,d=f;if(o&&!f)t.push(a),r(a.children||[],t,!0);else if(y)t.push(a);else if(!d){if((a.children||[]).some(e=>"JSXExpressionContainer"===e.type&&void 0===i(e.expression)))t.push(a),r(a.children||[],t,!0);else if("p"===e){const e=(c||[]).some(e=>{if(!e||"JSXElement"!==e.type)return!1;const t=e.opening&&e.opening.name&&"Identifier"===e.opening.name.type?e.opening.name.value:void 0,s=e.opening&&Array.isArray(e.opening.attributes)&&e.opening.attributes.length>0,r=e.children||[],o=1===r.length&&("JSXText"===r[0]?.type||"JSXExpressionContainer"===r[0]?.type&&void 0!==i(r[0].expression));return!(t&&n.has(t)&&!s&&(0===r.length||o))}),o=p&&u.some(e=>e&&e!==a&&"JSXText"===e.type&&!s(e));l||p&&e&&!o?(t.push(a),r(a.children||[],t,!0,!1)):r(a.children||[],t,!1,!1)}else r(a.children||[],t,!1,!1)}continue}t.push(a),r(a.children||[],t,!0);continue}"JSXFragment"!==a.type||r(a.children||[],t,o)}else{if(o&&!f)continue;if(o&&s(a))continue;if(s(a)){const n=u[e-1],i=u[e+1];if(n&&("JSXElement"===n.type||"JSXFragment"===n.type)&&i&&("JSXElement"===i.type||"JSXFragment"===i.type))continue;const s=t[t.length-1],r=u[e-1];if(s){if(r&&"JSXExpressionContainer"===r.type)continue;if("JSXText"===s.type&&r&&"JSXText"===r.type){s.value=String(s.value)+a.value;continue}}}if(o&&f&&0===e)continue;t.push(a)}}}const o=[];function p(e){if(!e||!e.length)return!1;let t=!1;for(const n of e)if(n)if("JSXElement"!==n.type){if("JSXExpressionContainer"===n.type&&-1!==o.indexOf(n))return t;if("JSXText"===n.type&&-1!==o.indexOf(n)){if(s(n))continue;if(!t)return!0;const i=e.indexOf(n);if(e.slice(i+1).some(e=>e&&"JSXElement"===e.type))return!0}}else t=!0;return!1}r(e,o,!1,!0);const l=new Set,a=e=>String(e).replace(/^\s*\n\s*/g,"").replace(/\s*\n\s*$/g,"");function c(e,t,r=!1){if(!e||0===e.length)return"";let u="";const f=e=>{if(!e)return-1;if(t&&t.has(e))return t.get(e);if(t)for(const[n,i]of t.entries())try{if(n&&e&&n.span&&e.span&&n.span.start===e.span.start&&n.span.end===e.span.end)return i}catch(e){}return o.indexOf(e)},y=t=>{if(!r)return o.indexOf(t);const n=e.indexOf(t);if(-1===n)return-1;let i=0;for(let t=0;t<n;t++){const n=e[t];n&&("JSXText"===n.type?s(n)||i++:"JSXExpressionContainer"===n.type?n.expression&&"JSXEmptyExpression"!==n.expression.type&&i++:"JSXElement"===n.type&&i++)}return i};for(let t=0;t<e.length;t++){const d=e[t];if(d){if("JSXText"===d.type){if(s(d))continue;const i=e[t+1],r=e[t-1];if(r&&"JSXElement"===r.type){const i="Identifier"===r.opening?.name?.type?r.opening.name.value:void 0,s=i&&n.has(i),o=0===(r.children||[]).length;if(s&&o&&/^\s*\n\s*/.test(d.value)){const e=d.value.replace(/^\s*\n\s*/,"");if(e){u+=e;continue}continue}if(!s&&/^\s*\n\s*/.test(d.value)){const n=d.value.replace(/^\s*\n\s*/,"");if(n){if(r&&"JSXElement"===r.type&&Array.isArray(r.children)&&0===r.children.length){u+=n;continue}const i=e[t-2];if(i&&"JSXText"===i.type){const e=i.value.replace(/\n\s*$/,""),t=/[A-Za-z0-9]$/.test(e),s=/^[A-Za-z0-9]/.test(n),r=/^[a-z]/.test(n);if(t&&s&&r){u+=n;continue}}u+=" "+n;continue}continue}}if(/\n\s*$/.test(d.value)&&i&&"JSXElement"===i.type){const r=d.value.replace(/\n\s*$/,"");if(r.trim()){const o="Identifier"===i.opening?.name?.type?i.opening.name.value:void 0,p=o&&n.has(o),a=(i.children||[]).length>0,c=/\s\n/.test(d.value),f=e[t+2],y=f&&"JSXText"===f.type&&!s(f)&&/[a-zA-Z0-9]/.test(f.value),g=!!(i.opening&&Array.isArray(i.opening.attributes)&&i.opening.attributes.length>0),x=/^\s/.test(r)&&!/^\n/.test(r),h=r.trim(),v=x?" "+h:h,S=/[A-Za-z0-9]$/.test(h),m=f&&"string"==typeof f.value&&/^[A-Za-z0-9]/.test(f.value.trim()),J=f&&"string"==typeof f.value&&/^[a-z]/.test(f.value.trim()),X=f&&"string"==typeof f.value&&/^\s/.test(f.value)&&!/^\n/.test(f.value),$=g&&a&&y&&!(S&&m&&J&&!c&&!x&&!X),E=f&&"string"==typeof f.value&&/^[,;:!?.]/.test(f.value.trim()),b=$&&!E;S&&m&&J&&!c&&!x&&!X&&l.add(i),u+=c||p&&a||!p&&y&&x||b?v+" ":v;continue}}u+=d.value;continue}if("JSXExpressionContainer"===d.type){const e=d.expression;if(!e)continue;const t=i(e);if(void 0!==t)u+=t;else if("Identifier"===e.type)u+=`{{${e.value}}}`;else if("TsAsExpression"===e.type&&"ObjectExpression"===e.expression?.type){const t=e.expression,n=t.properties.filter(e=>"KeyValueProperty"===e.type&&e.key&&"Identifier"===e.key.type).map(e=>e.key.value);if(n.length>0)u+=n.map(e=>`{{${e}}}`).join("");else{const e=t.properties[0];if(!e||"Identifier"!==e.type)throw new Error("Unrecognized expression in JSX placeholder");u+=`{{${e.value}}}`}}else if("ObjectExpression"===e.type){const t=e.properties[0];if(t&&"KeyValueProperty"===t.type&&t.key&&"Identifier"===t.key.type)u+=`{{${t.key.value}}}`;else{if(!t||"Identifier"!==t.type)throw new Error("Unrecognized expression in JSX placeholder");u+=`{{${t.value}}}`}}else if("MemberExpression"===e.type&&e.property&&"Identifier"===e.property.type)u+=`{{${e.property.value}}}`;else{if("CallExpression"!==e.type||"Identifier"!==e.callee?.type)throw new Error("Unrecognized expression in JSX placeholder");u+=`{{${e.callee.value}}}`}continue}if("JSXElement"===d.type){const l=r?y(d):void 0;let g;if(d.opening&&d.opening.name&&"Identifier"===d.opening.name.type&&(g=d.opening.name.value),g&&n.has(g)){const y=d.opening&&Array.isArray(d.opening.attributes)&&d.opening.attributes.length>0,x=d.children||[],h=x.length>0,v=1===x.length&&("JSXText"===x[0]?.type||"JSXExpressionContainer"===x[0]?.type&&void 0!==i(x[0].expression)),S="p"===g;let m=0;if(S&&r&&(m=e.filter(e=>e&&"JSXElement"===e.type&&"p"===e.opening?.name?.value).length),!h||v){const i=v?c(x,void 0):"";if(""!==String(i).trim())if(n.has(g)&&"p"!==g)u+=`<${g}>${a(i)}</${g}>`;else if(S&&r&&m>1)u+=`<${g}>${a(i)}</${g}>`;else if(S){const e=r&&void 0!==l?l:o.indexOf(d);u+=`<${e}>${a(i)}</${e}>`}else{const e=r&&void 0!==l?l:o.indexOf(d);u+=`<${e}>${a(i)}</${e}>`}else{const n=e[t-1];n&&"JSXText"===n.type&&/\n\s*$/.test(n.value)&&(u=u.replace(/\s+$/,"")),u+=`<${g} />`}}else if(y&&!v){const e=x,t=r&&void 0!==l?l:f(d);if(p(e)){const s=new Map;let r=0;for(const t of e)if(t&&"JSXElement"===t.type){const e=t.opening&&t.opening.name&&"Identifier"===t.opening.name.type?t.opening.name.value:void 0;if(e&&n.has(e)){const e=t.opening&&Array.isArray(t.opening.attributes)&&t.opening.attributes.length>0,n=t.children||[],o=1===n.length&&("JSXText"===n[0]?.type||"JSXExpressionContainer"===n[0]?.type&&void 0!==i(n[0].expression));!e&&(!n.length||o)||s.set(t,r++)}else s.set(t,r++)}const o=c(e,s.size?s:void 0);u+=`<${t}>${a(o)}</${t}>`}else{const e=new Map;let s=0;for(const t of x)if(t&&"JSXElement"===t.type){const r=t.opening&&t.opening.name&&"Identifier"===t.opening.name.type?t.opening.name.value:void 0;if(r&&n.has(r)){const n=t.opening&&Array.isArray(t.opening.attributes)&&t.opening.attributes.length>0,r=t.children||[],o=1===r.length&&("JSXText"===r[0]?.type||"JSXExpressionContainer"===r[0]?.type&&void 0!==i(r[0].expression));!n&&(!r.length||o)||e.set(t,s++)}else e.set(t,s++)}const r=c(x,e.size?e:void 0);u+=`<${t}>${a(r)}</${t}>`}}else{const e=o.indexOf(d);if(-1!==e){const t=void 0!==l?l:e;if((()=>{let e=!1;for(const t of x)if(t)if("JSXElement"!==t.type){if("JSXExpressionContainer"===t.type&&-1!==o.indexOf(t))return e;if("JSXText"===t.type&&-1!==o.indexOf(t)){if(s(t))continue;if(!e)return!0;if(x.slice(x.indexOf(t)+1).some(e=>e&&"JSXElement"===e.type))return!0}}else e=!0;return!1})()){if(0===t){const e=c(x,void 0,!1);u+=`<${t}>${a(e)}</${t}>`;continue}const e=new Map;let s=0;for(const t of x)if(t&&"JSXElement"===t.type){const r=t.opening&&t.opening.name&&"Identifier"===t.opening.name.type?t.opening.name.value:void 0;if(r&&n.has(r)){const n=t.opening&&Array.isArray(t.opening.attributes)&&t.opening.attributes.length>0,r=t.children||[],o=1===r.length&&("JSXText"===r[0]?.type||"JSXExpressionContainer"===r[0]?.type&&void 0!==i(r[0].expression));!n&&(!r.length||o)||e.set(t,s++)}else e.set(t,s++)}const r=c(x,e.size?e:void 0,!1);u+=`<${t}>${a(r)}</${t}>`;continue}const r=new Map;let p=0;for(const e of x)if(e&&"JSXElement"===e.type){const t=e.opening&&e.opening.name&&"Identifier"===e.opening.name.type?e.opening.name.value:void 0;if(t&&n.has(t)){const t=e.opening&&Array.isArray(e.opening.attributes)&&e.opening.attributes.length>0,n=e.children||[],s=1===n.length&&("JSXText"===n[0]?.type||"JSXExpressionContainer"===n[0]?.type&&void 0!==i(n[0].expression));!t&&(!n.length||s)||r.set(e,p++)}else r.set(e,p++)}const f=c(x,r.size>0?r:void 0,!1);u+=`<${t}>${a(f)}</${t}>`}else{const e=c(x,void 0,!1);u+=`<${g}>${a(e)}</${g}>`}}}else{const e=d.children||[];if(e.some(e=>e&&("JSXText"===e.type||"JSXExpressionContainer"===e.type)&&-1!==o.indexOf(e))){const t=o.indexOf(d),n=c(e,void 0);u+=`<${t}>${a(n)}</${t}>`}else{const t=new Map,i=f(d);let s=0;for(const i of e)if(i&&"JSXElement"===i.type){const e=i.opening&&i.opening.name&&"Identifier"===i.opening.name.type?i.opening.name.value:void 0;if(e&&n.has(e)){const e=i.opening&&Array.isArray(i.opening.attributes)&&i.opening.attributes.length>0,n=i.children||[],r=1===n.length&&"JSXText"===n[0]?.type;!e&&(!n.length||r)||t.set(i,s++)}else t.set(i,s++)}const r=c(e,t.size?t:void 0);u+=`<${i}>${a(r)}</${i}>`}}continue}"JSXFragment"!==d.type||(u+=c(d.children||[]))}}return u}const u=c(e,void 0,!0),f=String(u).replace(/<br \/>\s*\n\s*/g,"<br />"),y=String(f),d=new Set;if(l&&l.size>0)for(let e=0;e<o.length;e++)l.has(o[e])&&d.add(e);let g=String(y);if(d&&d.size>0)for(const e of d)try{g=g.replace(new RegExp("\\s+<"+e+">","g"),"<"+e+">"),g=g.replace(new RegExp("<\\/"+e+">\\s+","g"),"</"+e+">")}catch(e){}g=g.replace(/<\/(\d+)>\s*\n\s*(\S)/g,(e,t,n)=>{const i=Number(t);return d.has(i)?`</${t}>${n}`:`</${t}> ${n}`}),g=g.replace(/(\S)\s*\n\s*<(\d+)/g,(e,t,n)=>{const i=Number(n);return d.has(i)?`${t}<${n}`:`${t} <${n}`}),g=g.replace(/\s*\n\s*/g," "),g=g.replace(/\s+/g," "),g=g.replace(/\s+([,;:!?.])/g,"$1");const x=g.trim();let h=String(x);if(d&&d.size>0)for(const e of d)try{h=h.replace(new RegExp("[\\s\\u00A0]+<"+e+">","g"),"<"+e+">"),h=h.replace(new RegExp("<\\/"+e+">[\\s\\u00A0]+","g"),"</"+e+">")}catch(e){}try{for(let e=0;e<o.length;e++){const t=o[e];if(!t||"JSXElement"!==t.type)continue;const n=o[e-1],i=o[e+1];if(!n||!i)continue;if("JSXText"!==n.type||"JSXText"!==i.type)continue;const s=String(n.value),r=String(i.value),p=s.replace(/\n\s*$/,""),l=/[A-Za-z0-9]$/.test(p),a=/^[A-Za-z0-9]/.test(r.trim()),c=/^[a-z]/.test(r.trim()),u=/\s\n/.test(s),f=r&&/^\s/.test(r)&&!/^\n/.test(r);if(l&&a&&c&&!u&&!f){const t=e;h=h.replace(new RegExp("\\s+<"+t+">","g"),"<"+t+">")}}}catch(e){}function v(e){if(!e||!e.includes("<"))return e;function t(e){const t=[],n=[];let i=0;const s=/<\/?(\d+)>|<[^>]+>/g;let r;for(;r=s.exec(e);){const o=r[0],p=r.index;if(p>i){const s={type:"text",text:e.slice(i,p)};n.length?n[n.length-1].node.children.push(s):t.push(s)}const l=/^<\/(\d+)>$/.exec(o),a=/^<(\d+)>$/.exec(o);if(a){const e=Number(a[1]),i={type:"ph",idx:e,children:[]};n.length?n[n.length-1].node.children.push(i):t.push(i),n.push({node:i,idx:e})}else if(l)n.length&&n.pop();else{const e={type:"text",text:o};n.length?n[n.length-1].node.children.push(e):t.push(e)}i=s.lastIndex}if(i<e.length){const s={type:"text",text:e.slice(i)};n.length?n[n.length-1].node.children.push(s):t.push(s)}return t}function i(e,t=null){let s="";for(const r of e)if("text"===r.type)s+=r.text;else{const e=r.children.filter(e=>"ph"===e.type),p=e.map(e=>e.idx);if(!(p.length<=1||p.every((e,t)=>0===t||e===p[t-1]+1))){const e=r.children.map(e=>"text"===e.type?e.text:`<${e.idx}>${i(e.children,e.idx)}</${e.idx}>`).join("");s+=`<${r.idx}>${e}</${r.idx}>`;continue}const l=new Map;let a=0;try{const i=o[r.idx];if(i&&i.span){const s=i.span.start,p=i.span.end;let l=-1;for(let e=r.idx+1;e<o.length;e++){const t=o[e];if(t&&t.span&&(t.span.start>=s&&t.span.end<=p&&"JSXElement"===t.type)){l=e;break}}let c=0;if(-1!==l)for(let e=r.idx+1;e<l;e++){const t=o[e];t&&t.span&&(t.span.start>=s&&t.span.end<=p&&("JSXText"!==t.type&&"JSXExpressionContainer"!==t.type||c++))}else for(let e=r.idx+1;e<o.length;e++){const t=o[e];t&&t.span&&(t.span.start>=s&&t.span.end<=p&&("JSXText"!==t.type&&"JSXExpressionContainer"!==t.type||c++))}if("number"==typeof r.idx){const i=o[r.idx],s=i?.opening?.name?.value,p=s&&n.has(s),l=null===t;1===e.length?(a=Math.max(1,c+1),!l||p||0!==e[0].idx||"a"!==s&&"p"!==s||(a=0)):a=0}}}catch(e){}for(const t of e)l.has(t.idx)||l.set(t.idx,a++);const c=r.children.map(e=>{if("text"===e.type)return e.text;const t=e.idx,n=l.has(t)?l.get(t):t;return`<${n}>${i(e.children,n)}</${n}>`}).join("");s+=`<${r.idx}>${c}</${r.idx}>`}return s}try{return i(t(e))}catch(t){return e}}return h=v(h),h.trim()}(n.children,r);let J;const X="JSXAttribute"===p?.type?s(p):void 0;if(void 0!==X)J=X;else{const e=r.extract.defaultValue;J="string"==typeof e?e:""}let $,E;if("JSXAttribute"===o?.type){if("StringLiteral"===o.value?.type){if($=o.value,E=$.value,!E||""===E.trim())return null;if(S&&"StringLiteral"===$.type){const e=r.extract.nsSeparator??":",t=$.value;if(e&&t.startsWith(`${S}${e}`)){if(E=t.slice(`${S}${e}`.length),!E||""===E.trim())return null;$={...$,value:E}}}}else"JSXExpressionContainer"===o.value?.type&&"JSXEmptyExpression"!==o.value.expression.type&&($=o.value.expression);if(!$)return null}p||!E||m.trim()?!p&&m.trim()&&(J=m):J=E;return{keyExpression:$,serializedChildren:m,ns:S,defaultValue:J,hasCount:u,isOrdinal:g,contextExpression:h,optionsNode:y,explicitDefault:void 0!==X||(e=>{if(!e||!Array.isArray(e.properties))return!1;for(const t of e.properties)if(t&&"KeyValueProperty"===t.type&&t.key){const e="Identifier"===t.key.type&&t.key.value||"StringLiteral"===t.key.type&&t.key.value;if("string"==typeof e&&e.startsWith("defaultValue"))return!0}return!1})(y)}}export{r as extractFromTransComponent};
@@ -1 +1 @@
1
- import{glob as e}from"glob";import{readFile as t}from"node:fs/promises";import{parse as r}from"@swc/core";import{extname as n}from"node:path";import{EventEmitter as s}from"node:events";import o from"chalk";import a from"ora";const i=["a","abbr","address","article","aside","bdi","bdo","blockquote","button","caption","cite","code","data","dd","del","details","dfn","dialog","div","dt","em","figcaption","footer","h1","h2","h3","h4","h5","h6","header","img","ins","kbd","label","legend","li","main","mark","nav","option","output","p","pre","q","s","samp","section","small","span","strong","sub","summary","sup","td","textarea","th","time","title","var"].map(e=>e.toLowerCase()),c=["abbr","accesskey","alt","aria-description","aria-label","aria-placeholder","aria-roledescription","aria-valuetext","content","label","placeholder","summary","title"].map(e=>e.toLowerCase()),l=["className","key","id","style","href","i18nKey","defaults","type","target"].map(e=>e.toLowerCase()),p=["script","style","code"];class u extends s{config;constructor(e){super({captureRejections:!0}),this.config=e}wrapError(e){const t="Linter failed to run: ";if(e instanceof Error){if(e.message.startsWith(t))return e;const r=new Error(`${t}${e.message}`);return r.stack=e.stack,r}return new Error(`${t}${String(e)}`)}async run(){const{config:s}=this;try{this.emit("progress",{message:"Finding source files to analyze..."});const o=["node_modules/**"],a=Array.isArray(s.extract.ignore)?s.extract.ignore:s.extract.ignore?[s.extract.ignore]:[],i=await e(s.extract.input,{ignore:[...o,...a]});this.emit("progress",{message:`Analyzing ${i.length} source files...`});let c=0;const l=new Map;for(const e of i){const o=await t(e,"utf-8"),a=n(e).toLowerCase(),i=".ts"===a||".tsx"===a||".mts"===a||".cts"===a,p=".tsx"===a,u=".jsx"===a;let m;try{m=await r(o,{syntax:i?"typescript":"ecmascript",tsx:p,jsx:u,decorators:!0})}catch(t){if(".ts"!==a||p){if(".js"!==a||u){const e=this.wrapError(t);this.emit("error",e);continue}try{m=await r(o,{syntax:"ecmascript",jsx:!0,decorators:!0}),this.emit("progress",{message:`Parsed ${e} using JSX fallback`})}catch(e){const t=this.wrapError(e);this.emit("error",t);continue}}else try{m=await r(o,{syntax:"typescript",tsx:!0,decorators:!0}),this.emit("progress",{message:`Parsed ${e} using TSX fallback`})}catch(e){const t=this.wrapError(e);this.emit("error",t);continue}}const f=d(m,o,s);f.length>0&&(c+=f.length,l.set(e,f))}const p={success:0===c,message:c>0?`Linter found ${c} potential issues.`:"No issues found.",files:Object.fromEntries(l.entries())};return this.emit("done",p),p}catch(e){const t=this.wrapError(e);throw this.emit("error",t),t}}}async function m(e){return new u(e).run()}async function f(e){const t=new u(e),r=a().start();t.on("progress",e=>{r.text=e.message});try{const{success:e,message:n,files:s}=await t.run();if(e)r.succeed(o.green.bold(n));else{r.fail(o.red.bold(n));for(const[e,t]of Object.entries(s))console.log(o.yellow(`\n${e}`)),t.forEach(({text:e,line:t})=>{console.log(` ${o.gray(`${t}:`)} ${o.red("Error:")} Found hardcoded string: "${e}"`)});process.exit(1)}}catch(e){const n=t.wrapError(e);r.fail(n.message),console.error(n),process.exit(1)}}const g=e=>/^(https|http|\/\/|^\/)/.test(e);function d(e,t,r){const n=[],s=[],o=e=>t.substring(0,e).split("\n").length,a=(r.extract.transComponents||["Trans"]).map(e=>e.toLowerCase()),u=(r?.lint?.ignoredTags||r.extract.ignoredTags||[]).map(e=>e.toLowerCase()),m=new Set([...a,...p.map(e=>e.toLowerCase()),...u]),f=(r?.lint?.ignoredAttributes||r.extract.ignoredAttributes||[]).map(e=>e.toLowerCase()),d=new Set([...l,...f]),y=r?.lint?.acceptedTags?r.lint.acceptedTags:null,h=r?.extract?.acceptedTags?r.extract.acceptedTags:null,b=(y??h??i)?.map(e=>e.toLowerCase())??null,w=r?.lint?.acceptedAttributes?r.lint.acceptedAttributes:null,x=r?.extract?.acceptedAttributes?r.extract.acceptedAttributes:null,S=(w??x??c)?.map(e=>e.toLowerCase())??null,E=b&&b.length>0?new Set(b):null,v=S&&S.length>0?new Set(S):null,C=e=>{if(!e)return null;const t=e.name??e.opening?.name??e.opening?.name;if(!t)return e.opening?.name?C({name:e.opening.name}):null;const r=e=>{if(!e)return null;if("JSXIdentifier"===e.type&&(e.name||e.value))return e.name??e.value;if("Identifier"===e.type&&(e.name||e.value))return e.name??e.value;if("JSXMemberExpression"===e.type){const t=r(e.object),n=r(e.property);return t&&n?`${t}.${n}`:n??t}return e.name??e.value??e.property?.name??e.property?.value??null},n=r(t);return n?String(n):null},J=e=>{if(!e)return null;if("string"==typeof e)return e;if("JSXIdentifier"===e.type||"Identifier"===e.type){const t=e.name??e.value??e.raw??null;return t?String(t):null}if("JSXNamespacedName"===e.type)return J(e.name)??J(e.namespace);if("JSXMemberExpression"===e.type){const t=J(e.object),r=J(e.property);return t&&r?`${t}.${r}`:r??t}if(e.name||e.value||e.property)return e.name??e.value??e.property?.name??e.property?.value??null;try{const t=JSON.stringify(e),r=/"?(?:name|value)"?\s*:\s*"?([a-zA-Z0-9_\-:.$]+)"?/.exec(t);return r?r[1]:null}catch{return null}},X=e=>{for(let t=e.length-1;t>=0;t--){const r=e[t];if(r&&"object"==typeof r&&("JSXElement"===r.type||"JSXOpeningElement"===r.type||"JSXSelfClosingElement"===r.type)){const e=C(r);if(!e)continue;if(m.has(String(e).toLowerCase()))return!0}}if(E){for(let t=e.length-1;t>=0;t--){const r=e[t];if(r&&"object"==typeof r&&("JSXElement"===r.type||"JSXOpeningElement"===r.type||"JSXSelfClosingElement"===r.type)){const e=C(r);if(!e)continue;return!E.has(String(e).toLowerCase())}}return!0}return!1},$=(e,t)=>{if(!e||"object"!=typeof e)return;const r=[...t,e];if("JSXText"===e.type)if(v&&!E);else{if(!X(r)){const t=e.value.trim();t&&t.length>1&&"..."!==t&&!g(t)&&isNaN(Number(t))&&!t.startsWith("{{")&&s.push(e)}}if("StringLiteral"===e.type){const t=r[r.length-2],n=X(r);if("JSXAttribute"===t?.type&&!n){const n=J(t.name),o=n?String(n).toLowerCase():null,a=r.slice(0,-2).reverse().find(e=>e&&"object"==typeof e&&("JSXElement"===e.type||"JSXOpeningElement"===e.type||"JSXSelfClosingElement"===e.type));if(E&&a){const e=C(a);if(!e||!E.has(String(e).toLowerCase()))return}else if(E&&!a)return;if(v?null!=o&&v.has(o):null!=o&&!d.has(o)){const t=e.value.trim();t&&"..."!==t&&!g(t)&&isNaN(Number(t))&&s.push(e)}}}for(const t of Object.keys(e)){if("span"===t)continue;const n=e[t];Array.isArray(n)?n.forEach(e=>$(e,r)):n&&"object"==typeof n&&$(n,r)}};$(e,[]);let L=0;for(const e of s){const r=e.raw??e.value,s=t.indexOf(r,L);s>-1&&(n.push({text:e.value.trim(),line:o(s)}),L=s+r.length)}return n}export{u as Linter,m as runLinter,f as runLinterCli};
1
+ import{glob as e}from"glob";import{readFile as t}from"node:fs/promises";import{parse as r}from"@swc/core";import{extname as n}from"node:path";import{EventEmitter as s}from"node:events";import o from"chalk";import a from"ora";const i=["a","abbr","address","article","aside","bdi","bdo","blockquote","button","caption","cite","code","data","dd","del","details","dfn","dialog","div","dt","em","figcaption","footer","h1","h2","h3","h4","h5","h6","header","img","ins","kbd","label","legend","li","main","mark","nav","option","output","p","pre","q","s","samp","section","small","span","strong","sub","summary","sup","td","textarea","th","time","title","var"].map(e=>e.toLowerCase()),c=["abbr","accesskey","alt","aria-description","aria-label","aria-placeholder","aria-roledescription","aria-valuetext","content","label","placeholder","summary","title"].map(e=>e.toLowerCase()),l=["className","key","id","style","href","i18nKey","defaults","type","target"].map(e=>e.toLowerCase()),p=["script","style","code"];class u extends s{config;constructor(e){super({captureRejections:!0}),this.config=e}wrapError(e){const t="Linter failed to run: ";if(e instanceof Error){if(e.message.startsWith(t))return e;const r=new Error(`${t}${e.message}`);return r.stack=e.stack,r}return new Error(`${t}${String(e)}`)}async run(){const{config:s}=this;try{this.emit("progress",{message:"Finding source files to analyze..."});const o=["node_modules/**"],a=Array.isArray(s.extract.ignore)?s.extract.ignore:s.extract.ignore?[s.extract.ignore]:[],i=Array.isArray(s.lint?.ignore)?s.lint.ignore:s.lint?.ignore?[s.lint.ignore]:[],c=await e(s.extract.input,{ignore:[...o,...a,...i]});this.emit("progress",{message:`Analyzing ${c.length} source files...`});let l=0;const p=new Map;for(const e of c){const o=await t(e,"utf-8"),a=n(e).toLowerCase(),i=".ts"===a||".tsx"===a||".mts"===a||".cts"===a,c=".tsx"===a,u=".jsx"===a;let m;try{m=await r(o,{syntax:i?"typescript":"ecmascript",tsx:c,jsx:u,decorators:!0})}catch(t){if(".ts"!==a||c){if(".js"!==a||u){const e=this.wrapError(t);this.emit("error",e);continue}try{m=await r(o,{syntax:"ecmascript",jsx:!0,decorators:!0}),this.emit("progress",{message:`Parsed ${e} using JSX fallback`})}catch(e){const t=this.wrapError(e);this.emit("error",t);continue}}else try{m=await r(o,{syntax:"typescript",tsx:!0,decorators:!0}),this.emit("progress",{message:`Parsed ${e} using TSX fallback`})}catch(e){const t=this.wrapError(e);this.emit("error",t);continue}}const f=d(m,o,s);f.length>0&&(l+=f.length,p.set(e,f))}const u={success:0===l,message:l>0?`Linter found ${l} potential issues.`:"No issues found.",files:Object.fromEntries(p.entries())};return this.emit("done",u),u}catch(e){const t=this.wrapError(e);throw this.emit("error",t),t}}}async function m(e){return new u(e).run()}async function f(e){const t=new u(e),r=a().start();t.on("progress",e=>{r.text=e.message});try{const{success:e,message:n,files:s}=await t.run();if(e)r.succeed(o.green.bold(n));else{r.fail(o.red.bold(n));for(const[e,t]of Object.entries(s))console.log(o.yellow(`\n${e}`)),t.forEach(({text:e,line:t})=>{console.log(` ${o.gray(`${t}:`)} ${o.red("Error:")} Found hardcoded string: "${e}"`)});process.exit(1)}}catch(e){const n=t.wrapError(e);r.fail(n.message),console.error(n),process.exit(1)}}const g=e=>/^(https|http|\/\/|^\/)/.test(e);function d(e,t,r){const n=[],s=[],o=e=>t.substring(0,e).split("\n").length,a=(r.extract.transComponents||["Trans"]).map(e=>e.toLowerCase()),u=(r?.lint?.ignoredTags||r.extract.ignoredTags||[]).map(e=>e.toLowerCase()),m=new Set([...a,...p.map(e=>e.toLowerCase()),...u]),f=(r?.lint?.ignoredAttributes||r.extract.ignoredAttributes||[]).map(e=>e.toLowerCase()),d=new Set([...l,...f]),y=r?.lint?.acceptedTags?r.lint.acceptedTags:null,h=r?.extract?.acceptedTags?r.extract.acceptedTags:null,b=(y??h??i)?.map(e=>e.toLowerCase())??null,w=r?.lint?.acceptedAttributes?r.lint.acceptedAttributes:null,x=r?.extract?.acceptedAttributes?r.extract.acceptedAttributes:null,S=(w??x??c)?.map(e=>e.toLowerCase())??null,E=b&&b.length>0?new Set(b):null,v=S&&S.length>0?new Set(S):null,C=e=>{if(!e)return null;const t=e.name??e.opening?.name??e.opening?.name;if(!t)return e.opening?.name?C({name:e.opening.name}):null;const r=e=>{if(!e)return null;if("JSXIdentifier"===e.type&&(e.name||e.value))return e.name??e.value;if("Identifier"===e.type&&(e.name||e.value))return e.name??e.value;if("JSXMemberExpression"===e.type){const t=r(e.object),n=r(e.property);return t&&n?`${t}.${n}`:n??t}return e.name??e.value??e.property?.name??e.property?.value??null},n=r(t);return n?String(n):null},J=e=>{if(!e)return null;if("string"==typeof e)return e;if("JSXIdentifier"===e.type||"Identifier"===e.type){const t=e.name??e.value??e.raw??null;return t?String(t):null}if("JSXNamespacedName"===e.type)return J(e.name)??J(e.namespace);if("JSXMemberExpression"===e.type){const t=J(e.object),r=J(e.property);return t&&r?`${t}.${r}`:r??t}if(e.name||e.value||e.property)return e.name??e.value??e.property?.name??e.property?.value??null;try{const t=JSON.stringify(e),r=/"?(?:name|value)"?\s*:\s*"?([a-zA-Z0-9_\-:.$]+)"?/.exec(t);return r?r[1]:null}catch{return null}},X=e=>{for(let t=e.length-1;t>=0;t--){const r=e[t];if(r&&"object"==typeof r&&("JSXElement"===r.type||"JSXOpeningElement"===r.type||"JSXSelfClosingElement"===r.type)){const e=C(r);if(!e)continue;if(m.has(String(e).toLowerCase()))return!0}}if(E){for(let t=e.length-1;t>=0;t--){const r=e[t];if(r&&"object"==typeof r&&("JSXElement"===r.type||"JSXOpeningElement"===r.type||"JSXSelfClosingElement"===r.type)){const e=C(r);if(!e)continue;return!E.has(String(e).toLowerCase())}}return!0}return!1},$=(e,t)=>{if(!e||"object"!=typeof e)return;const r=[...t,e];if("JSXText"===e.type)if(v&&!E);else{if(!X(r)){const t=e.value.trim();t&&t.length>1&&"..."!==t&&!g(t)&&isNaN(Number(t))&&!t.startsWith("{{")&&s.push(e)}}if("StringLiteral"===e.type){const t=r[r.length-2],n=X(r);if("JSXAttribute"===t?.type&&!n){const n=J(t.name),o=n?String(n).toLowerCase():null,a=r.slice(0,-2).reverse().find(e=>e&&"object"==typeof e&&("JSXElement"===e.type||"JSXOpeningElement"===e.type||"JSXSelfClosingElement"===e.type));if(E&&a){const e=C(a);if(!e||!E.has(String(e).toLowerCase()))return}else if(E&&!a)return;if(v?null!=o&&v.has(o):null!=o&&!d.has(o)){const t=e.value.trim();t&&"..."!==t&&!g(t)&&isNaN(Number(t))&&s.push(e)}}}for(const t of Object.keys(e)){if("span"===t)continue;const n=e[t];Array.isArray(n)?n.forEach(e=>$(e,r)):n&&"object"==typeof n&&$(n,r)}};$(e,[]);let L=0;for(const e of s){const r=e.raw??e.value,s=t.indexOf(r,L);s>-1&&(n.push({text:e.value.trim(),line:o(s)}),L=s+r.length)}return n}export{u as Linter,m as runLinter,f as runLinterCli};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "i18next-cli",
3
- "version": "1.28.3",
3
+ "version": "1.29.1",
4
4
  "description": "A unified, high-performance i18next CLI.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1 +1 @@
1
- {"version":3,"file":"translation-manager.d.ts","sourceRoot":"","sources":["../../../src/extractor/core/translation-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAkmBnF;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EAC/B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,MAAM,EAAE,oBAAoB,EAC5B,EACE,uBAA+B,EAC/B,OAAe,EAChB,GAAE;IACD,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAA;CACb,GACL,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAgH9B"}
1
+ {"version":3,"file":"translation-manager.d.ts","sourceRoot":"","sources":["../../../src/extractor/core/translation-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAymBnF;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EAC/B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,MAAM,EAAE,oBAAoB,EAC5B,EACE,uBAA+B,EAC/B,OAAe,EAChB,GAAE;IACD,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAA;CACb,GACL,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAgH9B"}
@@ -1 +1 @@
1
- {"version":3,"file":"linter.d.ts","sourceRoot":"","sources":["../src/linter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAEnD,KAAK,cAAc,GAAG;IACpB,QAAQ,EAAE;QAAC;YACT,OAAO,EAAE,MAAM,CAAC;SACjB;KAAC,CAAC;IACH,IAAI,EAAE;QAAC;YACL,OAAO,EAAE,OAAO,CAAC;YACjB,OAAO,EAAE,MAAM,CAAC;YAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;SAC1C;KAAC,CAAC;IACH,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;CACvB,CAAA;AASD,qBAAa,MAAO,SAAQ,YAAY,CAAC,cAAc,CAAC;IACtD,OAAO,CAAC,MAAM,CAAsB;gBAEvB,MAAM,EAAE,oBAAoB;IAKzC,SAAS,CAAE,KAAK,EAAE,OAAO;IAanB,GAAG;;;;;;;CAuFV;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,SAAS,CAAE,MAAM,EAAE,oBAAoB;;;;;;GAE5D;AAED,wBAAsB,YAAY,CAAE,MAAM,EAAE,oBAAoB,iBA4B/D;AAED;;GAEG;AACH,UAAU,eAAe;IACvB,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;CACd"}
1
+ {"version":3,"file":"linter.d.ts","sourceRoot":"","sources":["../src/linter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAEnD,KAAK,cAAc,GAAG;IACpB,QAAQ,EAAE;QAAC;YACT,OAAO,EAAE,MAAM,CAAC;SACjB;KAAC,CAAC;IACH,IAAI,EAAE;QAAC;YACL,OAAO,EAAE,OAAO,CAAC;YACjB,OAAO,EAAE,MAAM,CAAC;YAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;SAC1C;KAAC,CAAC;IACH,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;CACvB,CAAA;AASD,qBAAa,MAAO,SAAQ,YAAY,CAAC,cAAc,CAAC;IACtD,OAAO,CAAC,MAAM,CAAsB;gBAEvB,MAAM,EAAE,oBAAoB;IAKzC,SAAS,CAAE,KAAK,EAAE,OAAO;IAanB,GAAG;;;;;;;CA0FV;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,SAAS,CAAE,MAAM,EAAE,oBAAoB;;;;;;GAE5D;AAED,wBAAsB,YAAY,CAAE,MAAM,EAAE,oBAAoB,iBA4B/D;AAED;;GAEG;AACH,UAAU,eAAe;IACvB,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;CACd"}
package/types/types.d.ts CHANGED
@@ -140,6 +140,8 @@ export interface I18nextToolkitConfig {
140
140
  * See README for the exact recommended list.
141
141
  */
142
142
  acceptedTags?: string[];
143
+ /** Glob pattern(s) for files to ignore during lint (in addition to those defined during extract) */
144
+ ignore?: string | string[];
143
145
  };
144
146
  /** Configuration options for TypeScript type generation */
145
147
  types?: {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}