@intlayer/chokidar 8.1.6 → 8.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +37 -28
  2. package/dist/assets/installSkills/skills/astro.md +2 -2
  3. package/dist/assets/installSkills/skills/cli.md +1 -1
  4. package/dist/assets/installSkills/skills/compiler.md +32 -0
  5. package/dist/assets/installSkills/skills/{next_js.md → next-js.md} +1 -2
  6. package/dist/cjs/build.cjs +1 -1
  7. package/dist/cjs/cli.cjs +1 -1
  8. package/dist/cjs/detectFormatCommand.cjs +2 -0
  9. package/dist/cjs/detectFormatCommand.cjs.map +1 -0
  10. package/dist/cjs/index.cjs +1 -1
  11. package/dist/cjs/init/index.cjs +1 -1
  12. package/dist/cjs/init/index.cjs.map +1 -1
  13. package/dist/cjs/init/utils/fileSystem.cjs +1 -1
  14. package/dist/cjs/init/utils/fileSystem.cjs.map +1 -1
  15. package/dist/cjs/init/utils/index.cjs +1 -1
  16. package/dist/cjs/installSkills/index.cjs +1 -1
  17. package/dist/cjs/installSkills/index.cjs.map +1 -1
  18. package/dist/cjs/transformFiles/transformFiles.cjs +1 -1
  19. package/dist/cjs/transformFiles/transformFiles.cjs.map +1 -1
  20. package/dist/cjs/writeContentDeclaration/index.cjs +1 -1
  21. package/dist/cjs/writeContentDeclaration/writeJSFile.cjs +1 -1
  22. package/dist/cjs/writeContentDeclaration/writeJSFile.cjs.map +1 -1
  23. package/dist/esm/build.mjs +1 -1
  24. package/dist/esm/cli.mjs +1 -1
  25. package/dist/esm/detectFormatCommand.mjs.map +1 -0
  26. package/dist/esm/index.mjs +1 -1
  27. package/dist/esm/init/index.mjs +1 -1
  28. package/dist/esm/init/index.mjs.map +1 -1
  29. package/dist/esm/init/utils/fileSystem.mjs +1 -1
  30. package/dist/esm/init/utils/fileSystem.mjs.map +1 -1
  31. package/dist/esm/init/utils/index.mjs +1 -1
  32. package/dist/esm/installSkills/index.mjs +1 -1
  33. package/dist/esm/installSkills/index.mjs.map +1 -1
  34. package/dist/esm/transformFiles/transformFiles.mjs +1 -1
  35. package/dist/esm/transformFiles/transformFiles.mjs.map +1 -1
  36. package/dist/esm/writeContentDeclaration/index.mjs +1 -1
  37. package/dist/esm/writeContentDeclaration/writeJSFile.mjs +1 -1
  38. package/dist/esm/writeContentDeclaration/writeJSFile.mjs.map +1 -1
  39. package/dist/types/build.d.ts +1 -2
  40. package/dist/types/cli.d.ts +2 -1
  41. package/dist/types/{writeContentDeclaration/detectFormatCommand.d.ts → detectFormatCommand.d.ts} +1 -1
  42. package/dist/types/detectFormatCommand.d.ts.map +1 -0
  43. package/dist/types/index.d.ts +1 -1
  44. package/dist/types/init/index.d.ts.map +1 -1
  45. package/dist/types/init/utils/fileSystem.d.ts +5 -1
  46. package/dist/types/init/utils/fileSystem.d.ts.map +1 -1
  47. package/dist/types/init/utils/index.d.ts +2 -2
  48. package/dist/types/installSkills/index.d.ts +1 -0
  49. package/dist/types/installSkills/index.d.ts.map +1 -1
  50. package/dist/types/writeContentDeclaration/index.d.ts +1 -2
  51. package/package.json +11 -12
  52. package/dist/cjs/writeContentDeclaration/detectFormatCommand.cjs +0 -2
  53. package/dist/cjs/writeContentDeclaration/detectFormatCommand.cjs.map +0 -1
  54. package/dist/esm/writeContentDeclaration/detectFormatCommand.mjs.map +0 -1
  55. package/dist/types/writeContentDeclaration/detectFormatCommand.d.ts.map +0 -1
  56. /package/dist/assets/installSkills/skills/{remote_content.md → remote-content.md} +0 -0
  57. /package/dist/esm/{writeContentDeclaration/detectFormatCommand.mjs → detectFormatCommand.mjs} +0 -0
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`../writeContentDeclaration/detectFormatCommand.cjs`),n=require(`../writeContentDeclaration/writeContentDeclaration.cjs`),r=require(`./extractDictionaryKey.cjs`);let i=require(`@intlayer/config/node`),a=require(`node:fs/promises`);a=e.__toESM(a);let o=require(`node:path`),s=require(`@intlayer/config/logger`),c=require(`@intlayer/config/utils`),l=require(`ts-morph`),u=require(`node:child_process`),d=require(`@intlayer/core/utils`);const f=[`title`,`placeholder`,`alt`,`aria-label`,`label`],p=e=>{let t=e.trim();return!(!t||!t.includes(` `)||!/^[A-Z]/.test(t)||t.startsWith(`{`)||t.startsWith(`v-`))},m=async(e,t,r,i,a)=>{let{defaultLocale:s}=i.internationalization,{baseDir:c,fileExtensions:l}=i.content,u=i?.dictionary?.locale,d=a?(0,o.resolve)(a):(0,o.dirname)(r),f=(0,o.basename)(r,(0,o.extname)(r)),p=(0,o.join)(d,`${f.charAt(0).toLowerCase()+f.slice(1)}.${l[0]}`),m=(0,o.relative)(c,p),h;if(u)h={key:t,content:e,locale:s,filePath:m};else{let n={};for(let[t,r]of Object.entries(e))n[t]={nodeType:`translation`,translation:{[s]:r}};h={key:t,content:n,filePath:m}}let g=(0,o.relative)(c,d);return await n.writeContentDeclaration(h,i,{newDictionariesPath:g}),p},h=(e,t)=>{let n={},r=[];return e.forEachDescendant(e=>{if(l.Node.isJsxText(e)){let i=e.getText();if(p(i)){let a=(0,d.generateKey)(i,t);t.add(a),n[a]=i.replace(/\s+/g,` `).trim(),r.push({node:e,key:a,type:`jsx-text`})}}else if(l.Node.isJsxAttribute(e)){let i=e.getNameNode().getText();if(f.includes(i)){let i=e.getInitializer();if(l.Node.isStringLiteral(i)){let a=i.getLiteralValue();if(p(a)){let i=(0,d.generateKey)(a,t);t.add(i),n[i]=a.trim(),r.push({node:e,key:i,type:`jsx-attribute`})}}}}else if(l.Node.isStringLiteral(e)){let i=e.getLiteralValue();if(p(i)){let a=e.getParent();if(a?.getKindName()===`ImportDeclaration`||a?.getKindName()===`ImportSpecifier`||a?.getKindName()===`ModuleSpecifier`||l.Node.isJsxAttribute(a)||l.Node.isCallExpression(a)&&a.getExpression().getText().includes(`console.log`)||l.Node.isPropertyAssignment(a)&&a.getNameNode()===e)return;let o=(0,d.generateKey)(i,t);t.add(o),n[o]=i.trim(),r.push({node:e,key:o,type:`string-literal`})}}}),{extractedContent:n,replacements:r}},g=async(e,t,n,r,i=!0)=>{let a;try{a=r.addSourceFileAtPath(e)}catch{a=r.getSourceFileOrThrow(e)}let o=n===`solid-intlayer`,{extractedContent:s,replacements:c}=h(a,new Set);if(Object.keys(s).length===0)return null;for(let{node:e,key:t,type:n}of c){let r=o?`content().${t}`:`content.${t}`;n===`jsx-text`&&l.Node.isJsxText(e)?e.replaceWithText(`{${r}}`):n===`jsx-attribute`&&l.Node.isJsxAttribute(e)?e.setInitializer(`{${r}.value}`):n===`string-literal`&&l.Node.isStringLiteral(e)&&e.replaceWithText(`${r}.value`)}let u=a.getImportDeclaration(e=>e.getModuleSpecifierValue()===n);return u?u.getNamedImports().some(e=>e.getName()===`useIntlayer`)||u.addNamedImport(`useIntlayer`):a.addImportDeclaration({namedImports:[`useIntlayer`],moduleSpecifier:n}),a.getFunctions().forEach(e=>{e.getBody()?.asKind(l.SyntaxKind.Block)?.insertStatements(0,`const content = useIntlayer("${t}");`)}),a.getVariableDeclarations().forEach(e=>{let n=e.getInitializer();if(l.Node.isArrowFunction(n)||l.Node.isFunctionExpression(n)){let e=n.getBody();l.Node.isBlock(e)&&(e.getText().includes(`return`)||e.getText().includes(`use`))&&e.insertStatements(0,`const content = useIntlayer("${t}");`)}}),i&&await a.save(),s},_=async(e,n,f,_)=>{let v=!f?.declarationOnly,y=!f?.codeOnly,b=(0,i.getConfiguration)(f?.configOptions),x=(0,s.getAppLogger)(b),{baseDir:S}=b.content,C=_||new l.Project({skipAddingFilesFromTsConfig:!0}),w=r.extractDictionaryKey(e,(await a.default.readFile(e)).toString()),T=(0,c.camelCaseToKebabCase)(w),E=(0,o.extname)(e),D=null;if(E===`.vue`)try{let{processVueFile:t}=await import(`@intlayer/vue-transformer`);D=await t(e,T,n,{generateKey:d.generateKey,shouldExtract:p,extractTsContent:h},v)}catch(e){throw e.code===`ERR_MODULE_NOT_FOUND`||e.message?.includes(`Cannot find module`)?Error(`Please install ${(0,s.colorizePath)(`@intlayer/vue-transformer`,s.ANSIColors.YELLOW)} to process Vue files.`):e}else if(E===`.svelte`)try{let{processSvelteFile:t}=await import(`@intlayer/svelte-transformer`);D=await t(e,T,n,{generateKey:d.generateKey,shouldExtract:p,extractTsContent:h},v)}catch(e){throw e.code===`ERR_MODULE_NOT_FOUND`||e.message?.includes(`Cannot find module`)?Error(`Please install ${(0,s.colorizePath)(`@intlayer/svelte-transformer`,s.ANSIColors.YELLOW)} to process Svelte files.`):e}else [`.tsx`,`.jsx`,`.ts`,`.js`].includes(E)&&(D=await g(e,T,n,C,v));if(!D){x(`No extractable text found in ${w}`);return}if(y){let t=await m(D,T,e,b,f?.outputDir);x(`Created content file: ${(0,s.colorizePath)((0,o.relative)(b.content.baseDir,t))}`)}if(v){try{let n=t.detectFormatCommand(b);n&&(0,u.execSync)(n.replace(`{{file}}`,e),{stdio:`ignore`,cwd:S})}catch{}x(`Updated component: ${(0,s.colorizePath)((0,o.relative)(S,e))}`)}},v=async(e,t,n)=>{let r=(0,s.getAppLogger)((0,i.getConfiguration)(n?.configOptions)),a=new l.Project({skipAddingFilesFromTsConfig:!0});for(let i of e)try{await _(i,t,n,a)}catch(e){r(`Failed to transform ${i}: ${e.message}`)}};exports.ATTRIBUTES_TO_EXTRACT=f,exports.extractIntlayer=_,exports.shouldExtract=p,exports.transformFiles=v;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`../detectFormatCommand.cjs`),n=require(`../writeContentDeclaration/writeContentDeclaration.cjs`),r=require(`./extractDictionaryKey.cjs`);let i=require(`@intlayer/config/node`),a=require(`node:fs/promises`);a=e.__toESM(a);let o=require(`node:path`),s=require(`@intlayer/config/logger`),c=require(`@intlayer/config/utils`),l=require(`ts-morph`),u=require(`node:child_process`),d=require(`@intlayer/core/utils`);const f=[`title`,`placeholder`,`alt`,`aria-label`,`label`],p=e=>{let t=e.trim();return!(!t||!t.includes(` `)||!/^[A-Z]/.test(t)||t.startsWith(`{`)||t.startsWith(`v-`))},m=async(e,t,r,i,a)=>{let{defaultLocale:s}=i.internationalization,{baseDir:c,fileExtensions:l}=i.content,u=i?.dictionary?.locale,d=a?(0,o.resolve)(a):(0,o.dirname)(r),f=(0,o.basename)(r,(0,o.extname)(r)),p=(0,o.join)(d,`${f.charAt(0).toLowerCase()+f.slice(1)}.${l[0]}`),m=(0,o.relative)(c,p),h;if(u)h={key:t,content:e,locale:s,filePath:m};else{let n={};for(let[t,r]of Object.entries(e))n[t]={nodeType:`translation`,translation:{[s]:r}};h={key:t,content:n,filePath:m}}let g=(0,o.relative)(c,d);return await n.writeContentDeclaration(h,i,{newDictionariesPath:g}),p},h=(e,t)=>{let n={},r=[];return e.forEachDescendant(e=>{if(l.Node.isJsxText(e)){let i=e.getText();if(p(i)){let a=(0,d.generateKey)(i,t);t.add(a),n[a]=i.replace(/\s+/g,` `).trim(),r.push({node:e,key:a,type:`jsx-text`})}}else if(l.Node.isJsxAttribute(e)){let i=e.getNameNode().getText();if(f.includes(i)){let i=e.getInitializer();if(l.Node.isStringLiteral(i)){let a=i.getLiteralValue();if(p(a)){let i=(0,d.generateKey)(a,t);t.add(i),n[i]=a.trim(),r.push({node:e,key:i,type:`jsx-attribute`})}}}}else if(l.Node.isStringLiteral(e)){let i=e.getLiteralValue();if(p(i)){let a=e.getParent();if(a?.getKindName()===`ImportDeclaration`||a?.getKindName()===`ImportSpecifier`||a?.getKindName()===`ModuleSpecifier`||l.Node.isJsxAttribute(a)||l.Node.isCallExpression(a)&&a.getExpression().getText().includes(`console.log`)||l.Node.isPropertyAssignment(a)&&a.getNameNode()===e)return;let o=(0,d.generateKey)(i,t);t.add(o),n[o]=i.trim(),r.push({node:e,key:o,type:`string-literal`})}}}),{extractedContent:n,replacements:r}},g=async(e,t,n,r,i=!0)=>{let a;try{a=r.addSourceFileAtPath(e)}catch{a=r.getSourceFileOrThrow(e)}let o=n===`solid-intlayer`,{extractedContent:s,replacements:c}=h(a,new Set);if(Object.keys(s).length===0)return null;for(let{node:e,key:t,type:n}of c){let r=o?`content().${t}`:`content.${t}`;n===`jsx-text`&&l.Node.isJsxText(e)?e.replaceWithText(`{${r}}`):n===`jsx-attribute`&&l.Node.isJsxAttribute(e)?e.setInitializer(`{${r}.value}`):n===`string-literal`&&l.Node.isStringLiteral(e)&&e.replaceWithText(`${r}.value`)}let u=a.getImportDeclaration(e=>e.getModuleSpecifierValue()===n);return u?u.getNamedImports().some(e=>e.getName()===`useIntlayer`)||u.addNamedImport(`useIntlayer`):a.addImportDeclaration({namedImports:[`useIntlayer`],moduleSpecifier:n}),a.getFunctions().forEach(e=>{e.getBody()?.asKind(l.SyntaxKind.Block)?.insertStatements(0,`const content = useIntlayer("${t}");`)}),a.getVariableDeclarations().forEach(e=>{let n=e.getInitializer();if(l.Node.isArrowFunction(n)||l.Node.isFunctionExpression(n)){let e=n.getBody();l.Node.isBlock(e)&&(e.getText().includes(`return`)||e.getText().includes(`use`))&&e.insertStatements(0,`const content = useIntlayer("${t}");`)}}),i&&await a.save(),s},_=async(e,n,f,_)=>{let v=!f?.declarationOnly,y=!f?.codeOnly,b=(0,i.getConfiguration)(f?.configOptions),x=(0,s.getAppLogger)(b),{baseDir:S}=b.content,C=_||new l.Project({skipAddingFilesFromTsConfig:!0}),w=r.extractDictionaryKey(e,(await a.default.readFile(e)).toString()),T=(0,c.camelCaseToKebabCase)(w),E=(0,o.extname)(e),D=null;if(E===`.vue`)try{let{processVueFile:t}=await import(`@intlayer/vue-transformer`);D=await t(e,T,n,{generateKey:d.generateKey,shouldExtract:p,extractTsContent:h},v)}catch(e){throw e.code===`ERR_MODULE_NOT_FOUND`||e.message?.includes(`Cannot find module`)?Error(`Please install ${(0,s.colorizePath)(`@intlayer/vue-transformer`,s.ANSIColors.YELLOW)} to process Vue files.`):e}else if(E===`.svelte`)try{let{processSvelteFile:t}=await import(`@intlayer/svelte-transformer`);D=await t(e,T,n,{generateKey:d.generateKey,shouldExtract:p,extractTsContent:h},v)}catch(e){throw e.code===`ERR_MODULE_NOT_FOUND`||e.message?.includes(`Cannot find module`)?Error(`Please install ${(0,s.colorizePath)(`@intlayer/svelte-transformer`,s.ANSIColors.YELLOW)} to process Svelte files.`):e}else [`.tsx`,`.jsx`,`.ts`,`.js`].includes(E)&&(D=await g(e,T,n,C,v));if(!D){x(`No extractable text found in ${w}`);return}if(y){let t=await m(D,T,e,b,f?.outputDir);x(`Created content file: ${(0,s.colorizePath)((0,o.relative)(b.content.baseDir,t))}`)}if(v){try{let n=t.detectFormatCommand(b);n&&(0,u.execSync)(n.replace(`{{file}}`,e),{stdio:`ignore`,cwd:S})}catch{}x(`Updated component: ${(0,s.colorizePath)((0,o.relative)(S,e))}`)}},v=async(e,t,n)=>{let r=(0,s.getAppLogger)((0,i.getConfiguration)(n?.configOptions)),a=new l.Project({skipAddingFilesFromTsConfig:!0});for(let i of e)try{await _(i,t,n,a)}catch(e){r(`Failed to transform ${i}: ${e.message}`)}};exports.ATTRIBUTES_TO_EXTRACT=f,exports.extractIntlayer=_,exports.shouldExtract=p,exports.transformFiles=v;
2
2
  //# sourceMappingURL=transformFiles.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"transformFiles.cjs","names":["writeContentDeclaration","Node","SyntaxKind","Project","extractDictionaryKey","fs","ANSIColors","detectFormatCommand"],"sources":["../../../src/transformFiles/transformFiles.ts"],"sourcesContent":["import { execSync } from 'node:child_process';\nimport fs from 'node:fs/promises';\nimport { basename, dirname, extname, join, relative, resolve } from 'node:path';\nimport {\n ANSIColors,\n colorizePath,\n getAppLogger,\n} from '@intlayer/config/logger';\nimport {\n type GetConfigurationOptions,\n getConfiguration,\n} from '@intlayer/config/node';\nimport { camelCaseToKebabCase } from '@intlayer/config/utils';\nimport { generateKey } from '@intlayer/core/utils';\nimport type { Dictionary, IntlayerConfig } from '@intlayer/types';\nimport { Node, Project, type SourceFile, SyntaxKind } from 'ts-morph';\nimport { writeContentDeclaration } from '../writeContentDeclaration';\nimport { detectFormatCommand } from '../writeContentDeclaration/detectFormatCommand';\nimport { extractDictionaryKey } from './extractDictionaryKey';\n\n// ==========================================\n// Shared Utilities (exported for reuse in babel plugin)\n// ==========================================\n\n/**\n * Attributes that should be extracted for localization\n */\nexport const ATTRIBUTES_TO_EXTRACT = [\n 'title',\n 'placeholder',\n 'alt',\n 'aria-label',\n 'label',\n];\n\n/**\n * Default function to determine if a string should be extracted for localization\n */\nexport const shouldExtract = (text: string): boolean => {\n const trimmed = text.trim();\n if (!trimmed) return false;\n if (!trimmed.includes(' ')) return false;\n // Starts with Capital letter\n if (!/^[A-Z]/.test(trimmed)) return false;\n // Filter out template logic identifiers (simple check)\n if (trimmed.startsWith('{') || trimmed.startsWith('v-')) return false;\n return true;\n};\n\n/**\n * Translation node structure used in multilingual dictionaries\n */\ntype TranslationNode = {\n nodeType: 'translation';\n translation: Record<string, string>;\n};\n\nconst writeContentHelper = async (\n extractedContent: Record<string, string>,\n componentKey: string,\n filePath: string,\n configuration: IntlayerConfig,\n outputDir?: string\n) => {\n const { defaultLocale } = configuration.internationalization;\n const { baseDir, fileExtensions } = configuration.content;\n\n const isPerLocaleFile = configuration?.dictionary?.locale;\n\n const dirName = outputDir ? resolve(outputDir) : dirname(filePath);\n const ext = extname(filePath);\n const baseName = basename(filePath, ext);\n const contentBaseName = baseName.charAt(0).toLowerCase() + baseName.slice(1);\n\n const contentFilePath = join(\n dirName,\n `${contentBaseName}.${fileExtensions[0]}`\n );\n const relativeContentFilePath = relative(baseDir, contentFilePath);\n\n let dictionary: Dictionary;\n\n if (isPerLocaleFile) {\n // Per-locale format: simple string content with locale property\n dictionary = {\n key: componentKey,\n content: extractedContent,\n locale: defaultLocale,\n filePath: relativeContentFilePath,\n };\n } else {\n // Multilingual format: content wrapped in translation nodes, no locale property\n const multilingualContent: Record<string, TranslationNode> = {};\n for (const [key, value] of Object.entries(extractedContent)) {\n multilingualContent[key] = {\n nodeType: 'translation',\n translation: {\n [defaultLocale]: value,\n },\n };\n }\n\n dictionary = {\n key: componentKey,\n content: multilingualContent,\n filePath: relativeContentFilePath,\n };\n }\n\n const relativeDir = relative(baseDir, dirName);\n await writeContentDeclaration(dictionary, configuration, {\n newDictionariesPath: relativeDir,\n });\n\n return contentFilePath;\n};\n\ntype TsReplacement = {\n node: Node;\n key: string;\n type: 'jsx-text' | 'jsx-attribute' | 'string-literal';\n};\n\nconst extractTsContent = (\n sourceFile: SourceFile,\n existingKeys: Set<string>\n): {\n extractedContent: Record<string, string>;\n replacements: TsReplacement[];\n} => {\n const extractedContent: Record<string, string> = {};\n const replacements: TsReplacement[] = [];\n\n sourceFile.forEachDescendant((node) => {\n // 1. JSX Text\n if (Node.isJsxText(node)) {\n const text = node.getText();\n if (shouldExtract(text)) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n extractedContent[key] = text.replace(/\\s+/g, ' ').trim();\n replacements.push({ node, key, type: 'jsx-text' });\n }\n }\n\n // 2. JSX Attributes\n else if (Node.isJsxAttribute(node)) {\n const name = node.getNameNode().getText();\n if (ATTRIBUTES_TO_EXTRACT.includes(name)) {\n const initializer = node.getInitializer();\n if (Node.isStringLiteral(initializer)) {\n const text = initializer.getLiteralValue();\n if (shouldExtract(text)) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n extractedContent[key] = text.trim();\n replacements.push({ node, key, type: 'jsx-attribute' });\n }\n }\n }\n }\n\n // 3. String Literals (Variables, Arrays, etc.)\n else if (Node.isStringLiteral(node)) {\n const text = node.getLiteralValue();\n if (shouldExtract(text)) {\n const parent = node.getParent();\n\n // Skip if inside ImportDeclaration\n if (\n parent?.getKindName() === 'ImportDeclaration' ||\n parent?.getKindName() === 'ImportSpecifier' ||\n parent?.getKindName() === 'ModuleSpecifier'\n ) {\n return;\n }\n\n // Skip if it's a JSX Attribute value (handled above)\n if (Node.isJsxAttribute(parent)) return;\n\n // Skip console.log\n if (Node.isCallExpression(parent)) {\n const expression = parent.getExpression();\n if (expression.getText().includes('console.log')) return;\n }\n\n // Skip Object Keys: { key: \"value\" } -> \"key\" is PropertyAssignment name if not computed\n if (Node.isPropertyAssignment(parent)) {\n if (parent.getNameNode() === node) return; // It's the key\n }\n\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n extractedContent[key] = text.trim();\n replacements.push({ node, key, type: 'string-literal' });\n }\n }\n });\n\n return { extractedContent, replacements };\n};\n\n// ==========================================\n// React (TS-Morph) Strategy\n// ==========================================\n\nconst processTsxFile = async (\n filePath: string,\n componentKey: string,\n packageName: PackageName,\n project: Project,\n save: boolean = true\n) => {\n let sourceFile: SourceFile;\n try {\n sourceFile = project.addSourceFileAtPath(filePath);\n } catch {\n sourceFile = project.getSourceFileOrThrow(filePath);\n }\n\n const isSolid = packageName === 'solid-intlayer';\n\n const existingKeys = new Set<string>();\n const { extractedContent, replacements } = extractTsContent(\n sourceFile,\n existingKeys\n );\n\n if (Object.keys(extractedContent).length === 0) return null;\n\n for (const { node, key, type } of replacements) {\n const contentAccess = isSolid ? `content().${key}` : `content.${key}`;\n\n if (type === 'jsx-text' && Node.isJsxText(node)) {\n node.replaceWithText(`{${contentAccess}}`);\n } else if (type === 'jsx-attribute' && Node.isJsxAttribute(node)) {\n node.setInitializer(`{${contentAccess}.value}`);\n } else if (type === 'string-literal' && Node.isStringLiteral(node)) {\n // For React/JS variables, we usually want the value\n node.replaceWithText(`${contentAccess}.value`);\n }\n }\n\n // Inject hook\n const importDecl = sourceFile.getImportDeclaration(\n (d) => d.getModuleSpecifierValue() === packageName\n );\n if (!importDecl) {\n sourceFile.addImportDeclaration({\n namedImports: ['useIntlayer'],\n moduleSpecifier: packageName,\n });\n } else if (\n !importDecl.getNamedImports().some((n) => n.getName() === 'useIntlayer')\n ) {\n importDecl.addNamedImport('useIntlayer');\n }\n\n // Insert hook at start of component\n sourceFile.getFunctions().forEach((f) => {\n f.getBody()\n ?.asKind(SyntaxKind.Block)\n ?.insertStatements(0, `const content = useIntlayer(\"${componentKey}\");`);\n });\n\n // Also handle const/arrow components\n sourceFile.getVariableDeclarations().forEach((v) => {\n const init = v.getInitializer();\n if (Node.isArrowFunction(init) || Node.isFunctionExpression(init)) {\n const body = init.getBody();\n if (Node.isBlock(body)) {\n // Heuristic: check if it returns JSX or uses hooks\n if (\n body.getText().includes('return') ||\n body.getText().includes('use')\n ) {\n body.insertStatements(\n 0,\n `const content = useIntlayer(\"${componentKey}\");`\n );\n }\n }\n }\n });\n\n if (save) {\n await sourceFile.save();\n }\n return extractedContent;\n};\n\n// ==========================================\n// 5. Main Dispatcher\n// ==========================================\n\nexport type PackageName =\n | 'next-intlayer'\n | 'react-intlayer'\n | 'vue-intlayer'\n | 'svelte-intlayer'\n | 'preact-intlayer'\n | 'solid-intlayer'\n | 'angular-intlayer'\n | 'express-intlayer';\n\nexport type ExtractIntlayerOptions = {\n configOptions?: GetConfigurationOptions;\n outputDir?: string;\n codeOnly?: boolean;\n declarationOnly?: boolean;\n};\n\nexport const extractIntlayer = async (\n filePath: string,\n packageName: PackageName,\n options?: ExtractIntlayerOptions,\n project?: Project\n) => {\n const saveComponent = !options?.declarationOnly;\n const writeContent = !options?.codeOnly;\n\n const configuration = getConfiguration(options?.configOptions);\n const appLogger = getAppLogger(configuration);\n const { baseDir } = configuration.content;\n\n // Setup Project for TS/React files if needed\n const _project =\n project || new Project({ skipAddingFilesFromTsConfig: true });\n\n const baseName = extractDictionaryKey(\n filePath,\n (await fs.readFile(filePath)).toString()\n );\n const componentKey = camelCaseToKebabCase(baseName);\n const ext = extname(filePath);\n\n let extractedContent: Record<string, string> | null = null;\n\n if (ext === '.vue') {\n try {\n const { processVueFile } = await import('@intlayer/vue-transformer');\n extractedContent = await processVueFile(\n filePath,\n componentKey,\n packageName,\n {\n generateKey,\n shouldExtract,\n extractTsContent,\n },\n saveComponent\n );\n } catch (error: any) {\n if (\n error.code === 'ERR_MODULE_NOT_FOUND' ||\n error.message?.includes('Cannot find module')\n ) {\n throw new Error(\n `Please install ${colorizePath('@intlayer/vue-transformer', ANSIColors.YELLOW)} to process Vue files.`\n );\n }\n throw error;\n }\n } else if (ext === '.svelte') {\n try {\n const { processSvelteFile } = (await import(\n '@intlayer/svelte-transformer'\n )) as any;\n extractedContent = await processSvelteFile(\n filePath,\n componentKey,\n packageName,\n {\n generateKey,\n shouldExtract,\n extractTsContent,\n },\n saveComponent\n );\n } catch (error: any) {\n if (\n error.code === 'ERR_MODULE_NOT_FOUND' ||\n error.message?.includes('Cannot find module')\n ) {\n throw new Error(\n `Please install ${colorizePath('@intlayer/svelte-transformer', ANSIColors.YELLOW)} to process Svelte files.`\n );\n }\n throw error;\n }\n } else if (['.tsx', '.jsx', '.ts', '.js'].includes(ext)) {\n extractedContent = await processTsxFile(\n filePath,\n componentKey,\n packageName,\n _project,\n saveComponent\n );\n }\n\n if (!extractedContent) {\n appLogger(`No extractable text found in ${baseName}`);\n return;\n }\n\n // Shared Write Logic\n if (writeContent) {\n const contentFilePath = await writeContentHelper(\n extractedContent,\n componentKey,\n filePath,\n configuration,\n options?.outputDir\n );\n\n const relativeContentFilePath = relative(\n configuration.content.baseDir,\n contentFilePath\n );\n appLogger(`Created content file: ${colorizePath(relativeContentFilePath)}`);\n }\n\n // Optional: Format\n if (saveComponent) {\n try {\n const formatCommand = detectFormatCommand(configuration);\n if (formatCommand) {\n execSync(formatCommand.replace('{{file}}', filePath), {\n stdio: 'ignore', // Silent\n cwd: baseDir,\n });\n }\n } catch {\n // Ignore format errors\n }\n\n appLogger(\n `Updated component: ${colorizePath(relative(baseDir, filePath))}`\n );\n }\n};\n\nexport const transformFiles = async (\n filePaths: string[],\n packageName: PackageName,\n options?: ExtractIntlayerOptions\n) => {\n const configuration = getConfiguration(options?.configOptions);\n const appLogger = getAppLogger(configuration);\n\n const project = new Project({\n skipAddingFilesFromTsConfig: true,\n });\n\n for (const filePath of filePaths) {\n try {\n await extractIntlayer(filePath, packageName, options, project);\n } catch (error) {\n appLogger(`Failed to transform ${filePath}: ${(error as Error).message}`);\n }\n }\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"transformFiles.cjs","names":["writeContentDeclaration","Node","SyntaxKind","Project","extractDictionaryKey","fs","ANSIColors","detectFormatCommand"],"sources":["../../../src/transformFiles/transformFiles.ts"],"sourcesContent":["import { execSync } from 'node:child_process';\nimport fs from 'node:fs/promises';\nimport { basename, dirname, extname, join, relative, resolve } from 'node:path';\nimport {\n ANSIColors,\n colorizePath,\n getAppLogger,\n} from '@intlayer/config/logger';\nimport {\n type GetConfigurationOptions,\n getConfiguration,\n} from '@intlayer/config/node';\nimport { camelCaseToKebabCase } from '@intlayer/config/utils';\nimport { generateKey } from '@intlayer/core/utils';\nimport type { Dictionary, IntlayerConfig } from '@intlayer/types';\nimport { Node, Project, type SourceFile, SyntaxKind } from 'ts-morph';\nimport { detectFormatCommand } from '../detectFormatCommand';\nimport { writeContentDeclaration } from '../writeContentDeclaration';\nimport { extractDictionaryKey } from './extractDictionaryKey';\n\n// ==========================================\n// Shared Utilities (exported for reuse in babel plugin)\n// ==========================================\n\n/**\n * Attributes that should be extracted for localization\n */\nexport const ATTRIBUTES_TO_EXTRACT = [\n 'title',\n 'placeholder',\n 'alt',\n 'aria-label',\n 'label',\n];\n\n/**\n * Default function to determine if a string should be extracted for localization\n */\nexport const shouldExtract = (text: string): boolean => {\n const trimmed = text.trim();\n if (!trimmed) return false;\n if (!trimmed.includes(' ')) return false;\n // Starts with Capital letter\n if (!/^[A-Z]/.test(trimmed)) return false;\n // Filter out template logic identifiers (simple check)\n if (trimmed.startsWith('{') || trimmed.startsWith('v-')) return false;\n return true;\n};\n\n/**\n * Translation node structure used in multilingual dictionaries\n */\ntype TranslationNode = {\n nodeType: 'translation';\n translation: Record<string, string>;\n};\n\nconst writeContentHelper = async (\n extractedContent: Record<string, string>,\n componentKey: string,\n filePath: string,\n configuration: IntlayerConfig,\n outputDir?: string\n) => {\n const { defaultLocale } = configuration.internationalization;\n const { baseDir, fileExtensions } = configuration.content;\n\n const isPerLocaleFile = configuration?.dictionary?.locale;\n\n const dirName = outputDir ? resolve(outputDir) : dirname(filePath);\n const ext = extname(filePath);\n const baseName = basename(filePath, ext);\n const contentBaseName = baseName.charAt(0).toLowerCase() + baseName.slice(1);\n\n const contentFilePath = join(\n dirName,\n `${contentBaseName}.${fileExtensions[0]}`\n );\n const relativeContentFilePath = relative(baseDir, contentFilePath);\n\n let dictionary: Dictionary;\n\n if (isPerLocaleFile) {\n // Per-locale format: simple string content with locale property\n dictionary = {\n key: componentKey,\n content: extractedContent,\n locale: defaultLocale,\n filePath: relativeContentFilePath,\n };\n } else {\n // Multilingual format: content wrapped in translation nodes, no locale property\n const multilingualContent: Record<string, TranslationNode> = {};\n for (const [key, value] of Object.entries(extractedContent)) {\n multilingualContent[key] = {\n nodeType: 'translation',\n translation: {\n [defaultLocale]: value,\n },\n };\n }\n\n dictionary = {\n key: componentKey,\n content: multilingualContent,\n filePath: relativeContentFilePath,\n };\n }\n\n const relativeDir = relative(baseDir, dirName);\n await writeContentDeclaration(dictionary, configuration, {\n newDictionariesPath: relativeDir,\n });\n\n return contentFilePath;\n};\n\ntype TsReplacement = {\n node: Node;\n key: string;\n type: 'jsx-text' | 'jsx-attribute' | 'string-literal';\n};\n\nconst extractTsContent = (\n sourceFile: SourceFile,\n existingKeys: Set<string>\n): {\n extractedContent: Record<string, string>;\n replacements: TsReplacement[];\n} => {\n const extractedContent: Record<string, string> = {};\n const replacements: TsReplacement[] = [];\n\n sourceFile.forEachDescendant((node) => {\n // 1. JSX Text\n if (Node.isJsxText(node)) {\n const text = node.getText();\n if (shouldExtract(text)) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n extractedContent[key] = text.replace(/\\s+/g, ' ').trim();\n replacements.push({ node, key, type: 'jsx-text' });\n }\n }\n\n // 2. JSX Attributes\n else if (Node.isJsxAttribute(node)) {\n const name = node.getNameNode().getText();\n if (ATTRIBUTES_TO_EXTRACT.includes(name)) {\n const initializer = node.getInitializer();\n if (Node.isStringLiteral(initializer)) {\n const text = initializer.getLiteralValue();\n if (shouldExtract(text)) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n extractedContent[key] = text.trim();\n replacements.push({ node, key, type: 'jsx-attribute' });\n }\n }\n }\n }\n\n // 3. String Literals (Variables, Arrays, etc.)\n else if (Node.isStringLiteral(node)) {\n const text = node.getLiteralValue();\n if (shouldExtract(text)) {\n const parent = node.getParent();\n\n // Skip if inside ImportDeclaration\n if (\n parent?.getKindName() === 'ImportDeclaration' ||\n parent?.getKindName() === 'ImportSpecifier' ||\n parent?.getKindName() === 'ModuleSpecifier'\n ) {\n return;\n }\n\n // Skip if it's a JSX Attribute value (handled above)\n if (Node.isJsxAttribute(parent)) return;\n\n // Skip console.log\n if (Node.isCallExpression(parent)) {\n const expression = parent.getExpression();\n if (expression.getText().includes('console.log')) return;\n }\n\n // Skip Object Keys: { key: \"value\" } -> \"key\" is PropertyAssignment name if not computed\n if (Node.isPropertyAssignment(parent)) {\n if (parent.getNameNode() === node) return; // It's the key\n }\n\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n extractedContent[key] = text.trim();\n replacements.push({ node, key, type: 'string-literal' });\n }\n }\n });\n\n return { extractedContent, replacements };\n};\n\n// ==========================================\n// React (TS-Morph) Strategy\n// ==========================================\n\nconst processTsxFile = async (\n filePath: string,\n componentKey: string,\n packageName: PackageName,\n project: Project,\n save: boolean = true\n) => {\n let sourceFile: SourceFile;\n try {\n sourceFile = project.addSourceFileAtPath(filePath);\n } catch {\n sourceFile = project.getSourceFileOrThrow(filePath);\n }\n\n const isSolid = packageName === 'solid-intlayer';\n\n const existingKeys = new Set<string>();\n const { extractedContent, replacements } = extractTsContent(\n sourceFile,\n existingKeys\n );\n\n if (Object.keys(extractedContent).length === 0) return null;\n\n for (const { node, key, type } of replacements) {\n const contentAccess = isSolid ? `content().${key}` : `content.${key}`;\n\n if (type === 'jsx-text' && Node.isJsxText(node)) {\n node.replaceWithText(`{${contentAccess}}`);\n } else if (type === 'jsx-attribute' && Node.isJsxAttribute(node)) {\n node.setInitializer(`{${contentAccess}.value}`);\n } else if (type === 'string-literal' && Node.isStringLiteral(node)) {\n // For React/JS variables, we usually want the value\n node.replaceWithText(`${contentAccess}.value`);\n }\n }\n\n // Inject hook\n const importDecl = sourceFile.getImportDeclaration(\n (d) => d.getModuleSpecifierValue() === packageName\n );\n if (!importDecl) {\n sourceFile.addImportDeclaration({\n namedImports: ['useIntlayer'],\n moduleSpecifier: packageName,\n });\n } else if (\n !importDecl.getNamedImports().some((n) => n.getName() === 'useIntlayer')\n ) {\n importDecl.addNamedImport('useIntlayer');\n }\n\n // Insert hook at start of component\n sourceFile.getFunctions().forEach((f) => {\n f.getBody()\n ?.asKind(SyntaxKind.Block)\n ?.insertStatements(0, `const content = useIntlayer(\"${componentKey}\");`);\n });\n\n // Also handle const/arrow components\n sourceFile.getVariableDeclarations().forEach((v) => {\n const init = v.getInitializer();\n if (Node.isArrowFunction(init) || Node.isFunctionExpression(init)) {\n const body = init.getBody();\n if (Node.isBlock(body)) {\n // Heuristic: check if it returns JSX or uses hooks\n if (\n body.getText().includes('return') ||\n body.getText().includes('use')\n ) {\n body.insertStatements(\n 0,\n `const content = useIntlayer(\"${componentKey}\");`\n );\n }\n }\n }\n });\n\n if (save) {\n await sourceFile.save();\n }\n return extractedContent;\n};\n\n// ==========================================\n// 5. Main Dispatcher\n// ==========================================\n\nexport type PackageName =\n | 'next-intlayer'\n | 'react-intlayer'\n | 'vue-intlayer'\n | 'svelte-intlayer'\n | 'preact-intlayer'\n | 'solid-intlayer'\n | 'angular-intlayer'\n | 'express-intlayer';\n\nexport type ExtractIntlayerOptions = {\n configOptions?: GetConfigurationOptions;\n outputDir?: string;\n codeOnly?: boolean;\n declarationOnly?: boolean;\n};\n\nexport const extractIntlayer = async (\n filePath: string,\n packageName: PackageName,\n options?: ExtractIntlayerOptions,\n project?: Project\n) => {\n const saveComponent = !options?.declarationOnly;\n const writeContent = !options?.codeOnly;\n\n const configuration = getConfiguration(options?.configOptions);\n const appLogger = getAppLogger(configuration);\n const { baseDir } = configuration.content;\n\n // Setup Project for TS/React files if needed\n const _project =\n project || new Project({ skipAddingFilesFromTsConfig: true });\n\n const baseName = extractDictionaryKey(\n filePath,\n (await fs.readFile(filePath)).toString()\n );\n const componentKey = camelCaseToKebabCase(baseName);\n const ext = extname(filePath);\n\n let extractedContent: Record<string, string> | null = null;\n\n if (ext === '.vue') {\n try {\n const { processVueFile } = await import('@intlayer/vue-transformer');\n extractedContent = await processVueFile(\n filePath,\n componentKey,\n packageName,\n {\n generateKey,\n shouldExtract,\n extractTsContent,\n },\n saveComponent\n );\n } catch (error: any) {\n if (\n error.code === 'ERR_MODULE_NOT_FOUND' ||\n error.message?.includes('Cannot find module')\n ) {\n throw new Error(\n `Please install ${colorizePath('@intlayer/vue-transformer', ANSIColors.YELLOW)} to process Vue files.`\n );\n }\n throw error;\n }\n } else if (ext === '.svelte') {\n try {\n const { processSvelteFile } = (await import(\n '@intlayer/svelte-transformer'\n )) as any;\n extractedContent = await processSvelteFile(\n filePath,\n componentKey,\n packageName,\n {\n generateKey,\n shouldExtract,\n extractTsContent,\n },\n saveComponent\n );\n } catch (error: any) {\n if (\n error.code === 'ERR_MODULE_NOT_FOUND' ||\n error.message?.includes('Cannot find module')\n ) {\n throw new Error(\n `Please install ${colorizePath('@intlayer/svelte-transformer', ANSIColors.YELLOW)} to process Svelte files.`\n );\n }\n throw error;\n }\n } else if (['.tsx', '.jsx', '.ts', '.js'].includes(ext)) {\n extractedContent = await processTsxFile(\n filePath,\n componentKey,\n packageName,\n _project,\n saveComponent\n );\n }\n\n if (!extractedContent) {\n appLogger(`No extractable text found in ${baseName}`);\n return;\n }\n\n // Shared Write Logic\n if (writeContent) {\n const contentFilePath = await writeContentHelper(\n extractedContent,\n componentKey,\n filePath,\n configuration,\n options?.outputDir\n );\n\n const relativeContentFilePath = relative(\n configuration.content.baseDir,\n contentFilePath\n );\n appLogger(`Created content file: ${colorizePath(relativeContentFilePath)}`);\n }\n\n // Optional: Format\n if (saveComponent) {\n try {\n const formatCommand = detectFormatCommand(configuration);\n if (formatCommand) {\n execSync(formatCommand.replace('{{file}}', filePath), {\n stdio: 'ignore', // Silent\n cwd: baseDir,\n });\n }\n } catch {\n // Ignore format errors\n }\n\n appLogger(\n `Updated component: ${colorizePath(relative(baseDir, filePath))}`\n );\n }\n};\n\nexport const transformFiles = async (\n filePaths: string[],\n packageName: PackageName,\n options?: ExtractIntlayerOptions\n) => {\n const configuration = getConfiguration(options?.configOptions);\n const appLogger = getAppLogger(configuration);\n\n const project = new Project({\n skipAddingFilesFromTsConfig: true,\n });\n\n for (const filePath of filePaths) {\n try {\n await extractIntlayer(filePath, packageName, options, project);\n } catch (error) {\n appLogger(`Failed to transform ${filePath}: ${(error as Error).message}`);\n }\n }\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./detectExportedComponentName.cjs`),t=require(`./detectFormatCommand.cjs`),n=require(`./transformJSFile.cjs`),r=require(`./writeJSFile.cjs`),i=require(`./writeContentDeclaration.cjs`);exports.detectExportedComponentName=e.detectExportedComponentName,exports.detectFormatCommand=t.detectFormatCommand,exports.transformJSFile=n.transformJSFile,exports.writeContentDeclaration=i.writeContentDeclaration,exports.writeJSFile=r.writeJSFile;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./detectExportedComponentName.cjs`),t=require(`./transformJSFile.cjs`),n=require(`./writeJSFile.cjs`),r=require(`./writeContentDeclaration.cjs`);exports.detectExportedComponentName=e.detectExportedComponentName,exports.transformJSFile=t.transformJSFile,exports.writeContentDeclaration=r.writeContentDeclaration,exports.writeJSFile=n.writeJSFile;
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`./detectFormatCommand.cjs`),t=require(`./transformJSFile.cjs`),n=require(`../utils/getFormatFromExtension.cjs`),r=require(`../getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.cjs`);let i=require(`node:fs/promises`),a=require(`node:path`),o=require(`@intlayer/config/logger`),s=require(`node:fs`),c=require(`node:child_process`);const l=async(l,u,d)=>{let f={...d.dictionary,...u},p=(0,o.getAppLogger)(d);if(!(0,s.existsSync)(l)){let e=n.getFormatFromExtension((0,a.extname)(l));p(`File does not exist, creating it`,{isVerbose:!0});let t=await r.getContentDeclarationFileTemplate(f.key,e,Object.fromEntries(Object.entries({id:f.id,locale:f.locale,filled:f.filled,fill:f.fill,description:f.description,title:f.title,tags:f.tags,version:f.version,priority:f.priority,importMode:f.importMode}).filter(([,e])=>e!==void 0))),o=d.system?.tempDir;o&&await(0,i.mkdir)(o,{recursive:!0});let s=`${(0,a.basename)(l)}.${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`,c=o?(0,a.join)(o,s):`${l}.${s}`;try{await(0,i.writeFile)(c,t,`utf-8`),await(0,i.rename)(c,l)}catch(e){try{await(0,i.rm)(c,{force:!0})}catch{}throw e}}let m=await(0,i.readFile)(l,`utf-8`);if(m===``){let e=n.getFormatFromExtension((0,a.extname)(l));m=await r.getContentDeclarationFileTemplate(f.key,e)}let h=await t.transformJSFile(m,u),g=d.system?.tempDir;g&&await(0,i.mkdir)(g,{recursive:!0});let _=`${(0,a.basename)(l)}.${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`,v=g?(0,a.join)(g,_):`${l}.${_}`;try{await(0,i.writeFile)(v,h,`utf-8`),await(0,i.rename)(v,l),(0,o.logger)(`Successfully updated ${l}`,{level:`info`,isVerbose:!0})}catch(e){try{await(0,i.rm)(v,{force:!0})}catch{}let t=e;throw(0,o.logger)(`Failed to write updated file: ${l}`,{level:`error`}),Error(`Failed to write updated file ${l}: ${t.message}`)}let y=e.detectFormatCommand(d);if(y)try{(0,c.execSync)(y.replace(`{{file}}`,l),{stdio:`inherit`,cwd:d.content.baseDir})}catch(e){console.error(e)}};exports.writeJSFile=l;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`./transformJSFile.cjs`),t=require(`../utils/getFormatFromExtension.cjs`),n=require(`../detectFormatCommand.cjs`),r=require(`../getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.cjs`);let i=require(`node:fs/promises`),a=require(`node:path`),o=require(`@intlayer/config/logger`),s=require(`node:fs`),c=require(`node:child_process`);const l=async(l,u,d)=>{let f={...d.dictionary,...u},p=(0,o.getAppLogger)(d);if(!(0,s.existsSync)(l)){let e=t.getFormatFromExtension((0,a.extname)(l));p(`File does not exist, creating it`,{isVerbose:!0});let n=await r.getContentDeclarationFileTemplate(f.key,e,Object.fromEntries(Object.entries({id:f.id,locale:f.locale,filled:f.filled,fill:f.fill,description:f.description,title:f.title,tags:f.tags,version:f.version,priority:f.priority,importMode:f.importMode}).filter(([,e])=>e!==void 0))),o=d.system?.tempDir;o&&await(0,i.mkdir)(o,{recursive:!0});let s=`${(0,a.basename)(l)}.${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`,c=o?(0,a.join)(o,s):`${l}.${s}`;try{await(0,i.writeFile)(c,n,`utf-8`),await(0,i.rename)(c,l)}catch(e){try{await(0,i.rm)(c,{force:!0})}catch{}throw e}}let m=await(0,i.readFile)(l,`utf-8`);if(m===``){let e=t.getFormatFromExtension((0,a.extname)(l));m=await r.getContentDeclarationFileTemplate(f.key,e)}let h=await e.transformJSFile(m,u),g=d.system?.tempDir;g&&await(0,i.mkdir)(g,{recursive:!0});let _=`${(0,a.basename)(l)}.${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`,v=g?(0,a.join)(g,_):`${l}.${_}`;try{await(0,i.writeFile)(v,h,`utf-8`),await(0,i.rename)(v,l),(0,o.logger)(`Successfully updated ${l}`,{level:`info`,isVerbose:!0})}catch(e){try{await(0,i.rm)(v,{force:!0})}catch{}let t=e;throw(0,o.logger)(`Failed to write updated file: ${l}`,{level:`error`}),Error(`Failed to write updated file ${l}: ${t.message}`)}let y=n.detectFormatCommand(d);if(y)try{(0,c.execSync)(y.replace(`{{file}}`,l),{stdio:`inherit`,cwd:d.content.baseDir})}catch(e){console.error(e)}};exports.writeJSFile=l;
2
2
  //# sourceMappingURL=writeJSFile.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"writeJSFile.cjs","names":["getFormatFromExtension","getContentDeclarationFileTemplate","transformJSFile","detectFormatCommand"],"sources":["../../../src/writeContentDeclaration/writeJSFile.ts"],"sourcesContent":["import { execSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';\nimport { basename, extname, join } from 'node:path';\nimport { getAppLogger, logger } from '@intlayer/config/logger';\nimport type { Dictionary, IntlayerConfig } from '@intlayer/types';\nimport { getContentDeclarationFileTemplate } from '../getContentDeclarationFileTemplate/getContentDeclarationFileTemplate';\nimport {\n type Extension,\n getFormatFromExtension,\n} from '../utils/getFormatFromExtension';\nimport { detectFormatCommand } from './detectFormatCommand';\nimport { transformJSFile } from './transformJSFile';\n\n/**\n * Updates a JavaScript/TypeScript file based on the provided JSON instructions.\n * It targets a specific dictionary object within the file (identified by its 'key' property)\n * and updates its 'content' entries. Currently, it focuses on modifying arguments\n * of 't' (translation) function calls.\n */\nexport const writeJSFile = async (\n filePath: string,\n dictionary: Dictionary,\n configuration: IntlayerConfig\n): Promise<void> => {\n const mergedDictionary = {\n ...configuration.dictionary,\n ...dictionary,\n };\n\n const appLogger = getAppLogger(configuration);\n\n // Check if the file exist\n if (!existsSync(filePath)) {\n const fileExtension = extname(filePath) as Extension;\n\n const format = getFormatFromExtension(fileExtension);\n\n appLogger('File does not exist, creating it', {\n isVerbose: true,\n });\n const template = await getContentDeclarationFileTemplate(\n mergedDictionary.key,\n format,\n // Filter out undefined values\n Object.fromEntries(\n Object.entries({\n id: mergedDictionary.id,\n locale: mergedDictionary.locale,\n filled: mergedDictionary.filled,\n fill: mergedDictionary.fill,\n description: mergedDictionary.description,\n title: mergedDictionary.title,\n tags: mergedDictionary.tags,\n version: mergedDictionary.version,\n priority: mergedDictionary.priority,\n importMode: mergedDictionary.importMode,\n }).filter(([, value]) => value !== undefined)\n )\n );\n\n const tempDir = configuration.system?.tempDir;\n if (tempDir) {\n await mkdir(tempDir, { recursive: true });\n }\n\n const tempFileName = `${basename(filePath)}.${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`;\n const tempPath = tempDir\n ? join(tempDir, tempFileName)\n : `${filePath}.${tempFileName}`;\n try {\n await writeFile(tempPath, template, 'utf-8');\n await rename(tempPath, filePath);\n } catch (error) {\n try {\n await rm(tempPath, { force: true });\n } catch {\n // Ignore\n }\n throw error;\n }\n }\n\n let fileContent = await readFile(filePath, 'utf-8');\n\n if (fileContent === '') {\n const format = getFormatFromExtension(extname(filePath) as Extension);\n\n fileContent = await getContentDeclarationFileTemplate(\n mergedDictionary.key,\n format\n );\n }\n\n const finalCode = await transformJSFile(fileContent, dictionary);\n\n // Write the modified code back to the file\n const tempDir = configuration.system?.tempDir;\n if (tempDir) {\n await mkdir(tempDir, { recursive: true });\n }\n\n const tempFileName = `${basename(filePath)}.${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`;\n const tempPath = tempDir\n ? join(tempDir, tempFileName)\n : `${filePath}.${tempFileName}`;\n try {\n await writeFile(tempPath, finalCode, 'utf-8');\n await rename(tempPath, filePath);\n logger(`Successfully updated ${filePath}`, {\n level: 'info',\n isVerbose: true,\n });\n } catch (error) {\n try {\n await rm(tempPath, { force: true });\n } catch {\n // Ignore\n }\n const err = error as Error;\n logger(`Failed to write updated file: ${filePath}`, {\n level: 'error',\n });\n throw new Error(`Failed to write updated file ${filePath}: ${err.message}`);\n }\n\n const formatCommand = detectFormatCommand(configuration);\n\n if (formatCommand) {\n try {\n execSync(formatCommand.replace('{{file}}', filePath), {\n stdio: 'inherit',\n cwd: configuration.content.baseDir,\n });\n } catch (error) {\n console.error(error);\n }\n }\n};\n"],"mappings":"4dAoBA,MAAa,EAAc,MACzB,EACA,EACA,IACkB,CAClB,IAAM,EAAmB,CACvB,GAAG,EAAc,WACjB,GAAG,EACJ,CAEK,GAAA,EAAA,EAAA,cAAyB,EAAc,CAG7C,GAAI,EAAA,EAAA,EAAA,YAAY,EAAS,CAAE,CAGzB,IAAM,EAASA,EAAAA,wBAAAA,EAAAA,EAAAA,SAFe,EAAS,CAEa,CAEpD,EAAU,mCAAoC,CAC5C,UAAW,GACZ,CAAC,CACF,IAAM,EAAW,MAAMC,EAAAA,kCACrB,EAAiB,IACjB,EAEA,OAAO,YACL,OAAO,QAAQ,CACb,GAAI,EAAiB,GACrB,OAAQ,EAAiB,OACzB,OAAQ,EAAiB,OACzB,KAAM,EAAiB,KACvB,YAAa,EAAiB,YAC9B,MAAO,EAAiB,MACxB,KAAM,EAAiB,KACvB,QAAS,EAAiB,QAC1B,SAAU,EAAiB,SAC3B,WAAY,EAAiB,WAC9B,CAAC,CAAC,QAAQ,EAAG,KAAW,IAAU,IAAA,GAAU,CAC9C,CACF,CAEK,EAAU,EAAc,QAAQ,QAClC,GACF,MAAA,EAAA,EAAA,OAAY,EAAS,CAAE,UAAW,GAAM,CAAC,CAG3C,IAAM,EAAe,IAAA,EAAA,EAAA,UAAY,EAAS,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE,CAAC,MAC1F,EAAW,GAAA,EAAA,EAAA,MACR,EAAS,EAAa,CAC3B,GAAG,EAAS,GAAG,IACnB,GAAI,CACF,MAAA,EAAA,EAAA,WAAgB,EAAU,EAAU,QAAQ,CAC5C,MAAA,EAAA,EAAA,QAAa,EAAU,EAAS,OACzB,EAAO,CACd,GAAI,CACF,MAAA,EAAA,EAAA,IAAS,EAAU,CAAE,MAAO,GAAM,CAAC,MAC7B,EAGR,MAAM,GAIV,IAAI,EAAc,MAAA,EAAA,EAAA,UAAe,EAAU,QAAQ,CAEnD,GAAI,IAAgB,GAAI,CACtB,IAAM,EAASD,EAAAA,wBAAAA,EAAAA,EAAAA,SAA+B,EAAS,CAAc,CAErE,EAAc,MAAMC,EAAAA,kCAClB,EAAiB,IACjB,EACD,CAGH,IAAM,EAAY,MAAMC,EAAAA,gBAAgB,EAAa,EAAW,CAG1D,EAAU,EAAc,QAAQ,QAClC,GACF,MAAA,EAAA,EAAA,OAAY,EAAS,CAAE,UAAW,GAAM,CAAC,CAG3C,IAAM,EAAe,IAAA,EAAA,EAAA,UAAY,EAAS,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE,CAAC,MAC1F,EAAW,GAAA,EAAA,EAAA,MACR,EAAS,EAAa,CAC3B,GAAG,EAAS,GAAG,IACnB,GAAI,CACF,MAAA,EAAA,EAAA,WAAgB,EAAU,EAAW,QAAQ,CAC7C,MAAA,EAAA,EAAA,QAAa,EAAU,EAAS,EAChC,EAAA,EAAA,QAAO,wBAAwB,IAAY,CACzC,MAAO,OACP,UAAW,GACZ,CAAC,OACK,EAAO,CACd,GAAI,CACF,MAAA,EAAA,EAAA,IAAS,EAAU,CAAE,MAAO,GAAM,CAAC,MAC7B,EAGR,IAAM,EAAM,EAIZ,MAHA,EAAA,EAAA,QAAO,iCAAiC,IAAY,CAClD,MAAO,QACR,CAAC,CACQ,MAAM,gCAAgC,EAAS,IAAI,EAAI,UAAU,CAG7E,IAAM,EAAgBC,EAAAA,oBAAoB,EAAc,CAExD,GAAI,EACF,GAAI,EACF,EAAA,EAAA,UAAS,EAAc,QAAQ,WAAY,EAAS,CAAE,CACpD,MAAO,UACP,IAAK,EAAc,QAAQ,QAC5B,CAAC,OACK,EAAO,CACd,QAAQ,MAAM,EAAM"}
1
+ {"version":3,"file":"writeJSFile.cjs","names":["getFormatFromExtension","getContentDeclarationFileTemplate","transformJSFile","detectFormatCommand"],"sources":["../../../src/writeContentDeclaration/writeJSFile.ts"],"sourcesContent":["import { execSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';\nimport { basename, extname, join } from 'node:path';\nimport { getAppLogger, logger } from '@intlayer/config/logger';\nimport type { Dictionary, IntlayerConfig } from '@intlayer/types';\nimport { detectFormatCommand } from '../detectFormatCommand';\nimport { getContentDeclarationFileTemplate } from '../getContentDeclarationFileTemplate/getContentDeclarationFileTemplate';\nimport {\n type Extension,\n getFormatFromExtension,\n} from '../utils/getFormatFromExtension';\nimport { transformJSFile } from './transformJSFile';\n\n/**\n * Updates a JavaScript/TypeScript file based on the provided JSON instructions.\n * It targets a specific dictionary object within the file (identified by its 'key' property)\n * and updates its 'content' entries. Currently, it focuses on modifying arguments\n * of 't' (translation) function calls.\n */\nexport const writeJSFile = async (\n filePath: string,\n dictionary: Dictionary,\n configuration: IntlayerConfig\n): Promise<void> => {\n const mergedDictionary = {\n ...configuration.dictionary,\n ...dictionary,\n };\n\n const appLogger = getAppLogger(configuration);\n\n // Check if the file exist\n if (!existsSync(filePath)) {\n const fileExtension = extname(filePath) as Extension;\n\n const format = getFormatFromExtension(fileExtension);\n\n appLogger('File does not exist, creating it', {\n isVerbose: true,\n });\n const template = await getContentDeclarationFileTemplate(\n mergedDictionary.key,\n format,\n // Filter out undefined values\n Object.fromEntries(\n Object.entries({\n id: mergedDictionary.id,\n locale: mergedDictionary.locale,\n filled: mergedDictionary.filled,\n fill: mergedDictionary.fill,\n description: mergedDictionary.description,\n title: mergedDictionary.title,\n tags: mergedDictionary.tags,\n version: mergedDictionary.version,\n priority: mergedDictionary.priority,\n importMode: mergedDictionary.importMode,\n }).filter(([, value]) => value !== undefined)\n )\n );\n\n const tempDir = configuration.system?.tempDir;\n if (tempDir) {\n await mkdir(tempDir, { recursive: true });\n }\n\n const tempFileName = `${basename(filePath)}.${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`;\n const tempPath = tempDir\n ? join(tempDir, tempFileName)\n : `${filePath}.${tempFileName}`;\n try {\n await writeFile(tempPath, template, 'utf-8');\n await rename(tempPath, filePath);\n } catch (error) {\n try {\n await rm(tempPath, { force: true });\n } catch {\n // Ignore\n }\n throw error;\n }\n }\n\n let fileContent = await readFile(filePath, 'utf-8');\n\n if (fileContent === '') {\n const format = getFormatFromExtension(extname(filePath) as Extension);\n\n fileContent = await getContentDeclarationFileTemplate(\n mergedDictionary.key,\n format\n );\n }\n\n const finalCode = await transformJSFile(fileContent, dictionary);\n\n // Write the modified code back to the file\n const tempDir = configuration.system?.tempDir;\n if (tempDir) {\n await mkdir(tempDir, { recursive: true });\n }\n\n const tempFileName = `${basename(filePath)}.${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`;\n const tempPath = tempDir\n ? join(tempDir, tempFileName)\n : `${filePath}.${tempFileName}`;\n try {\n await writeFile(tempPath, finalCode, 'utf-8');\n await rename(tempPath, filePath);\n logger(`Successfully updated ${filePath}`, {\n level: 'info',\n isVerbose: true,\n });\n } catch (error) {\n try {\n await rm(tempPath, { force: true });\n } catch {\n // Ignore\n }\n const err = error as Error;\n logger(`Failed to write updated file: ${filePath}`, {\n level: 'error',\n });\n throw new Error(`Failed to write updated file ${filePath}: ${err.message}`);\n }\n\n const formatCommand = detectFormatCommand(configuration);\n\n if (formatCommand) {\n try {\n execSync(formatCommand.replace('{{file}}', filePath), {\n stdio: 'inherit',\n cwd: configuration.content.baseDir,\n });\n } catch (error) {\n console.error(error);\n }\n }\n};\n"],"mappings":"6dAoBA,MAAa,EAAc,MACzB,EACA,EACA,IACkB,CAClB,IAAM,EAAmB,CACvB,GAAG,EAAc,WACjB,GAAG,EACJ,CAEK,GAAA,EAAA,EAAA,cAAyB,EAAc,CAG7C,GAAI,EAAA,EAAA,EAAA,YAAY,EAAS,CAAE,CAGzB,IAAM,EAASA,EAAAA,wBAAAA,EAAAA,EAAAA,SAFe,EAAS,CAEa,CAEpD,EAAU,mCAAoC,CAC5C,UAAW,GACZ,CAAC,CACF,IAAM,EAAW,MAAMC,EAAAA,kCACrB,EAAiB,IACjB,EAEA,OAAO,YACL,OAAO,QAAQ,CACb,GAAI,EAAiB,GACrB,OAAQ,EAAiB,OACzB,OAAQ,EAAiB,OACzB,KAAM,EAAiB,KACvB,YAAa,EAAiB,YAC9B,MAAO,EAAiB,MACxB,KAAM,EAAiB,KACvB,QAAS,EAAiB,QAC1B,SAAU,EAAiB,SAC3B,WAAY,EAAiB,WAC9B,CAAC,CAAC,QAAQ,EAAG,KAAW,IAAU,IAAA,GAAU,CAC9C,CACF,CAEK,EAAU,EAAc,QAAQ,QAClC,GACF,MAAA,EAAA,EAAA,OAAY,EAAS,CAAE,UAAW,GAAM,CAAC,CAG3C,IAAM,EAAe,IAAA,EAAA,EAAA,UAAY,EAAS,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE,CAAC,MAC1F,EAAW,GAAA,EAAA,EAAA,MACR,EAAS,EAAa,CAC3B,GAAG,EAAS,GAAG,IACnB,GAAI,CACF,MAAA,EAAA,EAAA,WAAgB,EAAU,EAAU,QAAQ,CAC5C,MAAA,EAAA,EAAA,QAAa,EAAU,EAAS,OACzB,EAAO,CACd,GAAI,CACF,MAAA,EAAA,EAAA,IAAS,EAAU,CAAE,MAAO,GAAM,CAAC,MAC7B,EAGR,MAAM,GAIV,IAAI,EAAc,MAAA,EAAA,EAAA,UAAe,EAAU,QAAQ,CAEnD,GAAI,IAAgB,GAAI,CACtB,IAAM,EAASD,EAAAA,wBAAAA,EAAAA,EAAAA,SAA+B,EAAS,CAAc,CAErE,EAAc,MAAMC,EAAAA,kCAClB,EAAiB,IACjB,EACD,CAGH,IAAM,EAAY,MAAMC,EAAAA,gBAAgB,EAAa,EAAW,CAG1D,EAAU,EAAc,QAAQ,QAClC,GACF,MAAA,EAAA,EAAA,OAAY,EAAS,CAAE,UAAW,GAAM,CAAC,CAG3C,IAAM,EAAe,IAAA,EAAA,EAAA,UAAY,EAAS,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE,CAAC,MAC1F,EAAW,GAAA,EAAA,EAAA,MACR,EAAS,EAAa,CAC3B,GAAG,EAAS,GAAG,IACnB,GAAI,CACF,MAAA,EAAA,EAAA,WAAgB,EAAU,EAAW,QAAQ,CAC7C,MAAA,EAAA,EAAA,QAAa,EAAU,EAAS,EAChC,EAAA,EAAA,QAAO,wBAAwB,IAAY,CACzC,MAAO,OACP,UAAW,GACZ,CAAC,OACK,EAAO,CACd,GAAI,CACF,MAAA,EAAA,EAAA,IAAS,EAAU,CAAE,MAAO,GAAM,CAAC,MAC7B,EAGR,IAAM,EAAM,EAIZ,MAHA,EAAA,EAAA,QAAO,iCAAiC,IAAY,CAClD,MAAO,QACR,CAAC,CACQ,MAAM,gCAAgC,EAAS,IAAI,EAAI,UAAU,CAG7E,IAAM,EAAgBC,EAAAA,oBAAoB,EAAc,CAExD,GAAI,EACF,GAAI,EACF,EAAA,EAAA,UAAS,EAAc,QAAQ,WAAY,EAAS,CAAE,CACpD,MAAO,UACP,IAAK,EAAc,QAAQ,QAC5B,CAAC,OACK,EAAO,CACd,QAAQ,MAAM,EAAM"}
@@ -1 +1 @@
1
- import{buildDictionary as e}from"./buildIntlayerDictionary/buildIntlayerDictionary.mjs";import{processContentDeclaration as t}from"./buildIntlayerDictionary/processContentDeclaration.mjs";import{cleanOutputDir as n}from"./cleanOutputDir.mjs";import{generateDictionaryListContent as r}from"./createDictionaryEntryPoint/generateDictionaryListContent.mjs";import{getBuiltDictionariesPath as i}from"./createDictionaryEntryPoint/getBuiltDictionariesPath.mjs";import{getBuiltDynamicDictionariesPath as a}from"./createDictionaryEntryPoint/getBuiltDynamicDictionariesPath.mjs";import{getBuiltFetchDictionariesPath as o}from"./createDictionaryEntryPoint/getBuiltFetchDictionariesPath.mjs";import{getBuiltRemoteDictionariesPath as s}from"./createDictionaryEntryPoint/getBuiltRemoteDictionariesPath.mjs";import{getBuiltUnmergedDictionariesPath as c}from"./createDictionaryEntryPoint/getBuiltUnmergedDictionariesPath.mjs";import{createDictionaryEntryPoint as l}from"./createDictionaryEntryPoint/createDictionaryEntryPoint.mjs";import{createModuleAugmentation as u,getTypeName as d}from"./createType/createModuleAugmentation.mjs";import{createTypes as f,generateTypeScriptType as p}from"./createType/createType.mjs";import{formatDictionaries as m,formatDictionariesOutput as h,formatDictionary as g,formatDictionaryOutput as _}from"./formatDictionary.mjs";import{formatLocalDictionaries as v,loadContentDeclarations as y}from"./loadDictionaries/loadContentDeclaration.mjs";import{formatDistantDictionaries as b,loadRemoteDictionaries as x}from"./loadDictionaries/loadRemoteDictionaries.mjs";import{loadDictionaries as S}from"./loadDictionaries/loadDictionaries.mjs";import{loadLocalDictionaries as C}from"./loadDictionaries/loadLocalDictionaries.mjs";import{isCachedConfigurationUpToDate as w,writeConfiguration as T}from"./writeConfiguration/index.mjs";import{prepareIntlayer as E}from"./prepareIntlayer.mjs";import{detectExportedComponentName as D}from"./writeContentDeclaration/detectExportedComponentName.mjs";import{detectFormatCommand as O}from"./writeContentDeclaration/detectFormatCommand.mjs";import{transformJSFile as k}from"./writeContentDeclaration/transformJSFile.mjs";import{writeJSFile as A}from"./writeContentDeclaration/writeJSFile.mjs";import{writeContentDeclaration as j}from"./writeContentDeclaration/writeContentDeclaration.mjs";export{e as buildDictionary,n as cleanOutputDir,l as createDictionaryEntryPoint,u as createModuleAugmentation,f as createTypes,D as detectExportedComponentName,O as detectFormatCommand,m as formatDictionaries,h as formatDictionariesOutput,g as formatDictionary,_ as formatDictionaryOutput,b as formatDistantDictionaries,v as formatLocalDictionaries,r as generateDictionaryListContent,p as generateTypeScriptType,i as getBuiltDictionariesPath,a as getBuiltDynamicDictionariesPath,o as getBuiltFetchDictionariesPath,s as getBuiltRemoteDictionariesPath,c as getBuiltUnmergedDictionariesPath,d as getTypeName,w as isCachedConfigurationUpToDate,y as loadContentDeclarations,S as loadDictionaries,C as loadLocalDictionaries,x as loadRemoteDictionaries,E as prepareIntlayer,t as processContentDeclaration,k as transformJSFile,T as writeConfiguration,j as writeContentDeclaration,A as writeJSFile};
1
+ import{buildDictionary as e}from"./buildIntlayerDictionary/buildIntlayerDictionary.mjs";import{processContentDeclaration as t}from"./buildIntlayerDictionary/processContentDeclaration.mjs";import{cleanOutputDir as n}from"./cleanOutputDir.mjs";import{generateDictionaryListContent as r}from"./createDictionaryEntryPoint/generateDictionaryListContent.mjs";import{getBuiltDictionariesPath as i}from"./createDictionaryEntryPoint/getBuiltDictionariesPath.mjs";import{getBuiltDynamicDictionariesPath as a}from"./createDictionaryEntryPoint/getBuiltDynamicDictionariesPath.mjs";import{getBuiltFetchDictionariesPath as o}from"./createDictionaryEntryPoint/getBuiltFetchDictionariesPath.mjs";import{getBuiltRemoteDictionariesPath as s}from"./createDictionaryEntryPoint/getBuiltRemoteDictionariesPath.mjs";import{getBuiltUnmergedDictionariesPath as c}from"./createDictionaryEntryPoint/getBuiltUnmergedDictionariesPath.mjs";import{createDictionaryEntryPoint as l}from"./createDictionaryEntryPoint/createDictionaryEntryPoint.mjs";import{createModuleAugmentation as u,getTypeName as d}from"./createType/createModuleAugmentation.mjs";import{createTypes as f,generateTypeScriptType as p}from"./createType/createType.mjs";import{formatDictionaries as m,formatDictionariesOutput as h,formatDictionary as g,formatDictionaryOutput as _}from"./formatDictionary.mjs";import{formatLocalDictionaries as v,loadContentDeclarations as y}from"./loadDictionaries/loadContentDeclaration.mjs";import{formatDistantDictionaries as b,loadRemoteDictionaries as x}from"./loadDictionaries/loadRemoteDictionaries.mjs";import{loadDictionaries as S}from"./loadDictionaries/loadDictionaries.mjs";import{loadLocalDictionaries as C}from"./loadDictionaries/loadLocalDictionaries.mjs";import{isCachedConfigurationUpToDate as w,writeConfiguration as T}from"./writeConfiguration/index.mjs";import{prepareIntlayer as E}from"./prepareIntlayer.mjs";import{detectExportedComponentName as D}from"./writeContentDeclaration/detectExportedComponentName.mjs";import{transformJSFile as O}from"./writeContentDeclaration/transformJSFile.mjs";import{writeJSFile as k}from"./writeContentDeclaration/writeJSFile.mjs";import{writeContentDeclaration as A}from"./writeContentDeclaration/writeContentDeclaration.mjs";export{e as buildDictionary,n as cleanOutputDir,l as createDictionaryEntryPoint,u as createModuleAugmentation,f as createTypes,D as detectExportedComponentName,m as formatDictionaries,h as formatDictionariesOutput,g as formatDictionary,_ as formatDictionaryOutput,b as formatDistantDictionaries,v as formatLocalDictionaries,r as generateDictionaryListContent,p as generateTypeScriptType,i as getBuiltDictionariesPath,a as getBuiltDynamicDictionariesPath,o as getBuiltFetchDictionariesPath,s as getBuiltRemoteDictionariesPath,c as getBuiltUnmergedDictionariesPath,d as getTypeName,w as isCachedConfigurationUpToDate,y as loadContentDeclarations,S as loadDictionaries,C as loadLocalDictionaries,x as loadRemoteDictionaries,E as prepareIntlayer,t as processContentDeclaration,O as transformJSFile,T as writeConfiguration,A as writeContentDeclaration,k as writeJSFile};
package/dist/esm/cli.mjs CHANGED
@@ -1 +1 @@
1
- import{listDictionaries as e,listDictionariesWithStats as t}from"./listDictionariesPath.mjs";import{getContentDeclarationFileTemplate as n}from"./getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.mjs";import{initIntlayer as r}from"./init/index.mjs";import{SKILLS as i,SKILLS_METADATA as a,installSkills as o}from"./installSkills/index.mjs";import{listGitFiles as s,listGitLines as c}from"./listGitFiles.mjs";import{listProjects as l}from"./listProjects.mjs";import{extractDictionaryKey as u}from"./transformFiles/extractDictionaryKey.mjs";import{ATTRIBUTES_TO_EXTRACT as d,extractIntlayer as f,shouldExtract as p,transformFiles as m}from"./transformFiles/transformFiles.mjs";export{d as ATTRIBUTES_TO_EXTRACT,i as SKILLS,a as SKILLS_METADATA,u as extractDictionaryKey,f as extractIntlayer,n as getContentDeclarationFileTemplate,r as initIntlayer,o as installSkills,e as listDictionaries,t as listDictionariesWithStats,s as listGitFiles,c as listGitLines,l as listProjects,p as shouldExtract,m as transformFiles};
1
+ import{listDictionaries as e,listDictionariesWithStats as t}from"./listDictionariesPath.mjs";import{detectFormatCommand as n}from"./detectFormatCommand.mjs";import{getContentDeclarationFileTemplate as r}from"./getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.mjs";import{initIntlayer as i}from"./init/index.mjs";import{SKILLS as a,SKILLS_METADATA as o,installSkills as s}from"./installSkills/index.mjs";import{listGitFiles as c,listGitLines as l}from"./listGitFiles.mjs";import{listProjects as u}from"./listProjects.mjs";import{extractDictionaryKey as d}from"./transformFiles/extractDictionaryKey.mjs";import{ATTRIBUTES_TO_EXTRACT as f,extractIntlayer as p,shouldExtract as m,transformFiles as h}from"./transformFiles/transformFiles.mjs";export{f as ATTRIBUTES_TO_EXTRACT,a as SKILLS,o as SKILLS_METADATA,n as detectFormatCommand,d as extractDictionaryKey,p as extractIntlayer,r as getContentDeclarationFileTemplate,i as initIntlayer,s as installSkills,e as listDictionaries,t as listDictionariesWithStats,c as listGitFiles,l as listGitLines,u as listProjects,m as shouldExtract,h as transformFiles};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detectFormatCommand.mjs","names":[],"sources":["../../src/detectFormatCommand.ts"],"sourcesContent":["import { getProjectRequire } from '@intlayer/config/utils';\nimport type { IntlayerConfig } from '@intlayer/types';\n\nlet cachedFormatCommand: string | undefined | null = null;\n\nexport const detectFormatCommand = (\n configuration: IntlayerConfig,\n projectRequireProp?: NodeJS.Require\n) => {\n const { formatCommand, baseDir } = configuration.content;\n const projectRequire = projectRequireProp ?? getProjectRequire(baseDir);\n\n // Priority: Explicit configuration\n // We do not cache this because the user might change their config file active-session.\n if (formatCommand) {\n return formatCommand;\n }\n\n // Priority: Cached detection\n // If not null, we have already performed the expensive checks.\n if (cachedFormatCommand !== null) {\n return cachedFormatCommand;\n }\n\n // Perform Detection\n\n // Try Prettier\n try {\n projectRequire.resolve('prettier');\n cachedFormatCommand = 'prettier --write \"{{file}}\" --log-level silent';\n return cachedFormatCommand;\n } catch (_error) {\n // Prettier not found, continue\n }\n\n // Try Biome\n try {\n projectRequire.resolve('biome');\n cachedFormatCommand = 'biome format \"{{file}}\" --write --log-level none';\n return cachedFormatCommand;\n } catch (_error) {\n // Biome not found, continue\n }\n\n // Try ESLint\n try {\n projectRequire.resolve('eslint');\n cachedFormatCommand = 'eslint --fix \"{{file}}\" --quiet';\n return cachedFormatCommand;\n } catch (_error) {\n // ESLint not found\n }\n\n // No formatter found\n // Set to undefined (not null) so we know we checked and found nothing.\n cachedFormatCommand = undefined;\n return undefined;\n};\n"],"mappings":"2DAGA,IAAI,EAAiD,KAErD,MAAa,GACX,EACA,IACG,CACH,GAAM,CAAE,gBAAe,WAAY,EAAc,QAC3C,EAAiB,GAAsB,EAAkB,EAAQ,CAIvE,GAAI,EACF,OAAO,EAKT,GAAI,IAAwB,KAC1B,OAAO,EAMT,GAAI,CAGF,OAFA,EAAe,QAAQ,WAAW,CAClC,EAAsB,iDACf,OACQ,EAKjB,GAAI,CAGF,OAFA,EAAe,QAAQ,QAAQ,CAC/B,EAAsB,mDACf,OACQ,EAKjB,GAAI,CAGF,OAFA,EAAe,QAAQ,SAAS,CAChC,EAAsB,kCACf,OACQ,EAMjB,EAAsB,IAAA"}
@@ -1 +1 @@
1
- import{Queue as e,pLimit as t}from"./utils/pLimit.mjs";import{parallelize as n}from"./utils/parallelize.mjs";import{formatLocale as r,formatPath as i}from"./utils/formatter.mjs";import{buildDictionary as a}from"./buildIntlayerDictionary/buildIntlayerDictionary.mjs";import{autoDecorateContent as o}from"./utils/autoDecorateContent.mjs";import{resolveObjectPromises as s}from"./utils/resolveObjectPromises.mjs";import{processContentDeclaration as c}from"./buildIntlayerDictionary/processContentDeclaration.mjs";import{cleanOutputDir as l}from"./cleanOutputDir.mjs";import{getFileHash as u}from"./utils/getFileHash.mjs";import{generateDictionaryListContent as d}from"./createDictionaryEntryPoint/generateDictionaryListContent.mjs";import{getBuiltDictionariesPath as f}from"./createDictionaryEntryPoint/getBuiltDictionariesPath.mjs";import{getBuiltDynamicDictionariesPath as p}from"./createDictionaryEntryPoint/getBuiltDynamicDictionariesPath.mjs";import{getBuiltFetchDictionariesPath as m}from"./createDictionaryEntryPoint/getBuiltFetchDictionariesPath.mjs";import{getBuiltRemoteDictionariesPath as h}from"./createDictionaryEntryPoint/getBuiltRemoteDictionariesPath.mjs";import{getBuiltUnmergedDictionariesPath as g}from"./createDictionaryEntryPoint/getBuiltUnmergedDictionariesPath.mjs";import{createDictionaryEntryPoint as _}from"./createDictionaryEntryPoint/createDictionaryEntryPoint.mjs";import{createModuleAugmentation as v,getTypeName as y}from"./createType/createModuleAugmentation.mjs";import{createTypes as b,generateTypeScriptType as x}from"./createType/createType.mjs";import{formatDictionaries as S,formatDictionariesOutput as C,formatDictionary as w,formatDictionaryOutput as T}from"./formatDictionary.mjs";import{formatLocalDictionaries as E,loadContentDeclarations as D}from"./loadDictionaries/loadContentDeclaration.mjs";import{sortAlphabetically as O}from"./utils/sortAlphabetically.mjs";import{formatDistantDictionaries as k,loadRemoteDictionaries as A}from"./loadDictionaries/loadRemoteDictionaries.mjs";import{loadDictionaries as j}from"./loadDictionaries/loadDictionaries.mjs";import{loadLocalDictionaries as M}from"./loadDictionaries/loadLocalDictionaries.mjs";import{listDictionaries as N,listDictionariesWithStats as P}from"./listDictionariesPath.mjs";import{runOnce as F}from"./utils/runOnce.mjs";import{isCachedConfigurationUpToDate as I,writeConfiguration as L}from"./writeConfiguration/index.mjs";import{prepareIntlayer as R}from"./prepareIntlayer.mjs";import{detectExportedComponentName as z}from"./writeContentDeclaration/detectExportedComponentName.mjs";import{detectFormatCommand as B}from"./writeContentDeclaration/detectFormatCommand.mjs";import{transformJSFile as V}from"./writeContentDeclaration/transformJSFile.mjs";import{getExtensionFromFormat as H,getFormatFromExtension as U}from"./utils/getFormatFromExtension.mjs";import{getContentDeclarationFileTemplate as W}from"./getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.mjs";import{writeJSFile as G}from"./writeContentDeclaration/writeJSFile.mjs";import{writeContentDeclaration as K}from"./writeContentDeclaration/writeContentDeclaration.mjs";import{initIntlayer as q}from"./init/index.mjs";import{SKILLS as J,SKILLS_METADATA as Y,installSkills as X}from"./installSkills/index.mjs";import{listGitFiles as Z,listGitLines as Q}from"./listGitFiles.mjs";import{listProjects as $}from"./listProjects.mjs";import{extractDictionaryKey as ee}from"./transformFiles/extractDictionaryKey.mjs";import{ATTRIBUTES_TO_EXTRACT as te,extractIntlayer as ne,shouldExtract as re,transformFiles as ie}from"./transformFiles/transformFiles.mjs";import{buildFilesList as ae}from"./utils/buildFilesList.mjs";import{splitTextByLines as oe}from"./utils/splitTextByLine.mjs";import{getChunk as se}from"./utils/getChunk.mjs";import{assembleJSON as ce,chunkJSON as le,reconstructFromSingleChunk as ue}from"./utils/chunkJSON.mjs";import{getComponentTransformPattern as de,getComponentTransformPatternSync as fe}from"./utils/getComponentTransformPattern.mjs";import{mergeChunks as pe}from"./utils/mergeChunks.mjs";import{getGlobalLimiter as me,getTaskLimiter as he,parallelizeGlobal as ge}from"./utils/parallelizeGlobal.mjs";import{reduceObjectFormat as _e}from"./utils/reduceObjectFormat.mjs";import{runParallel as ve}from"./utils/runParallel/index.mjs";import{verifyIdenticObjectFormat as ye}from"./utils/verifyIdenticObjectFormat.mjs";import{buildAndWatchIntlayer as be,watch as xe}from"./watcher.mjs";export{te as ATTRIBUTES_TO_EXTRACT,e as Queue,J as SKILLS,Y as SKILLS_METADATA,ce as assembleJSON,o as autoDecorateContent,be as buildAndWatchIntlayer,a as buildDictionary,ae as buildFilesList,le as chunkJSON,l as cleanOutputDir,_ as createDictionaryEntryPoint,v as createModuleAugmentation,b as createTypes,z as detectExportedComponentName,B as detectFormatCommand,ee as extractDictionaryKey,ne as extractIntlayer,S as formatDictionaries,C as formatDictionariesOutput,w as formatDictionary,T as formatDictionaryOutput,k as formatDistantDictionaries,E as formatLocalDictionaries,r as formatLocale,i as formatPath,d as generateDictionaryListContent,x as generateTypeScriptType,f as getBuiltDictionariesPath,p as getBuiltDynamicDictionariesPath,m as getBuiltFetchDictionariesPath,h as getBuiltRemoteDictionariesPath,g as getBuiltUnmergedDictionariesPath,se as getChunk,de as getComponentTransformPattern,fe as getComponentTransformPatternSync,W as getContentDeclarationFileTemplate,H as getExtensionFromFormat,u as getFileHash,U as getFormatFromExtension,me as getGlobalLimiter,he as getTaskLimiter,y as getTypeName,q as initIntlayer,X as installSkills,I as isCachedConfigurationUpToDate,N as listDictionaries,P as listDictionariesWithStats,Z as listGitFiles,Q as listGitLines,$ as listProjects,D as loadContentDeclarations,j as loadDictionaries,M as loadLocalDictionaries,A as loadRemoteDictionaries,pe as mergeChunks,t as pLimit,n as parallelize,ge as parallelizeGlobal,R as prepareIntlayer,c as processContentDeclaration,ue as reconstructFromSingleChunk,_e as reduceObjectFormat,s as resolveObjectPromises,F as runOnce,ve as runParallel,re as shouldExtract,O as sortAlphabetically,oe as splitTextByLines,ie as transformFiles,V as transformJSFile,ye as verifyIdenticObjectFormat,xe as watch,L as writeConfiguration,K as writeContentDeclaration,G as writeJSFile};
1
+ import{Queue as e,pLimit as t}from"./utils/pLimit.mjs";import{parallelize as n}from"./utils/parallelize.mjs";import{formatLocale as r,formatPath as i}from"./utils/formatter.mjs";import{buildDictionary as a}from"./buildIntlayerDictionary/buildIntlayerDictionary.mjs";import{autoDecorateContent as o}from"./utils/autoDecorateContent.mjs";import{resolveObjectPromises as s}from"./utils/resolveObjectPromises.mjs";import{processContentDeclaration as c}from"./buildIntlayerDictionary/processContentDeclaration.mjs";import{cleanOutputDir as l}from"./cleanOutputDir.mjs";import{getFileHash as u}from"./utils/getFileHash.mjs";import{generateDictionaryListContent as d}from"./createDictionaryEntryPoint/generateDictionaryListContent.mjs";import{getBuiltDictionariesPath as f}from"./createDictionaryEntryPoint/getBuiltDictionariesPath.mjs";import{getBuiltDynamicDictionariesPath as p}from"./createDictionaryEntryPoint/getBuiltDynamicDictionariesPath.mjs";import{getBuiltFetchDictionariesPath as m}from"./createDictionaryEntryPoint/getBuiltFetchDictionariesPath.mjs";import{getBuiltRemoteDictionariesPath as h}from"./createDictionaryEntryPoint/getBuiltRemoteDictionariesPath.mjs";import{getBuiltUnmergedDictionariesPath as g}from"./createDictionaryEntryPoint/getBuiltUnmergedDictionariesPath.mjs";import{createDictionaryEntryPoint as _}from"./createDictionaryEntryPoint/createDictionaryEntryPoint.mjs";import{createModuleAugmentation as v,getTypeName as y}from"./createType/createModuleAugmentation.mjs";import{createTypes as b,generateTypeScriptType as x}from"./createType/createType.mjs";import{formatDictionaries as S,formatDictionariesOutput as C,formatDictionary as w,formatDictionaryOutput as T}from"./formatDictionary.mjs";import{formatLocalDictionaries as E,loadContentDeclarations as D}from"./loadDictionaries/loadContentDeclaration.mjs";import{sortAlphabetically as O}from"./utils/sortAlphabetically.mjs";import{formatDistantDictionaries as k,loadRemoteDictionaries as A}from"./loadDictionaries/loadRemoteDictionaries.mjs";import{loadDictionaries as j}from"./loadDictionaries/loadDictionaries.mjs";import{loadLocalDictionaries as M}from"./loadDictionaries/loadLocalDictionaries.mjs";import{listDictionaries as N,listDictionariesWithStats as P}from"./listDictionariesPath.mjs";import{runOnce as F}from"./utils/runOnce.mjs";import{isCachedConfigurationUpToDate as I,writeConfiguration as L}from"./writeConfiguration/index.mjs";import{prepareIntlayer as R}from"./prepareIntlayer.mjs";import{detectExportedComponentName as z}from"./writeContentDeclaration/detectExportedComponentName.mjs";import{transformJSFile as B}from"./writeContentDeclaration/transformJSFile.mjs";import{getExtensionFromFormat as V,getFormatFromExtension as H}from"./utils/getFormatFromExtension.mjs";import{detectFormatCommand as U}from"./detectFormatCommand.mjs";import{getContentDeclarationFileTemplate as W}from"./getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.mjs";import{writeJSFile as G}from"./writeContentDeclaration/writeJSFile.mjs";import{writeContentDeclaration as K}from"./writeContentDeclaration/writeContentDeclaration.mjs";import{initIntlayer as q}from"./init/index.mjs";import{SKILLS as J,SKILLS_METADATA as Y,installSkills as X}from"./installSkills/index.mjs";import{listGitFiles as Z,listGitLines as Q}from"./listGitFiles.mjs";import{listProjects as $}from"./listProjects.mjs";import{extractDictionaryKey as ee}from"./transformFiles/extractDictionaryKey.mjs";import{ATTRIBUTES_TO_EXTRACT as te,extractIntlayer as ne,shouldExtract as re,transformFiles as ie}from"./transformFiles/transformFiles.mjs";import{buildFilesList as ae}from"./utils/buildFilesList.mjs";import{splitTextByLines as oe}from"./utils/splitTextByLine.mjs";import{getChunk as se}from"./utils/getChunk.mjs";import{assembleJSON as ce,chunkJSON as le,reconstructFromSingleChunk as ue}from"./utils/chunkJSON.mjs";import{getComponentTransformPattern as de,getComponentTransformPatternSync as fe}from"./utils/getComponentTransformPattern.mjs";import{mergeChunks as pe}from"./utils/mergeChunks.mjs";import{getGlobalLimiter as me,getTaskLimiter as he,parallelizeGlobal as ge}from"./utils/parallelizeGlobal.mjs";import{reduceObjectFormat as _e}from"./utils/reduceObjectFormat.mjs";import{runParallel as ve}from"./utils/runParallel/index.mjs";import{verifyIdenticObjectFormat as ye}from"./utils/verifyIdenticObjectFormat.mjs";import{buildAndWatchIntlayer as be,watch as xe}from"./watcher.mjs";export{te as ATTRIBUTES_TO_EXTRACT,e as Queue,J as SKILLS,Y as SKILLS_METADATA,ce as assembleJSON,o as autoDecorateContent,be as buildAndWatchIntlayer,a as buildDictionary,ae as buildFilesList,le as chunkJSON,l as cleanOutputDir,_ as createDictionaryEntryPoint,v as createModuleAugmentation,b as createTypes,z as detectExportedComponentName,U as detectFormatCommand,ee as extractDictionaryKey,ne as extractIntlayer,S as formatDictionaries,C as formatDictionariesOutput,w as formatDictionary,T as formatDictionaryOutput,k as formatDistantDictionaries,E as formatLocalDictionaries,r as formatLocale,i as formatPath,d as generateDictionaryListContent,x as generateTypeScriptType,f as getBuiltDictionariesPath,p as getBuiltDynamicDictionariesPath,m as getBuiltFetchDictionariesPath,h as getBuiltRemoteDictionariesPath,g as getBuiltUnmergedDictionariesPath,se as getChunk,de as getComponentTransformPattern,fe as getComponentTransformPatternSync,W as getContentDeclarationFileTemplate,V as getExtensionFromFormat,u as getFileHash,H as getFormatFromExtension,me as getGlobalLimiter,he as getTaskLimiter,y as getTypeName,q as initIntlayer,X as installSkills,I as isCachedConfigurationUpToDate,N as listDictionaries,P as listDictionariesWithStats,Z as listGitFiles,Q as listGitLines,$ as listProjects,D as loadContentDeclarations,j as loadDictionaries,M as loadLocalDictionaries,A as loadRemoteDictionaries,pe as mergeChunks,t as pLimit,n as parallelize,ge as parallelizeGlobal,R as prepareIntlayer,c as processContentDeclaration,ue as reconstructFromSingleChunk,_e as reduceObjectFormat,s as resolveObjectPromises,F as runOnce,ve as runParallel,re as shouldExtract,O as sortAlphabetically,oe as splitTextByLines,ie as transformFiles,B as transformJSFile,ye as verifyIdenticObjectFormat,xe as watch,L as writeConfiguration,K as writeContentDeclaration,G as writeJSFile};
@@ -1,2 +1,2 @@
1
- import{initConfig as e}from"../initConfig/index.mjs";import{updateNextConfig as t,updateViteConfig as n}from"./utils/configManipulation.mjs";import{exists as r,readFileFromRoot as i,writeFileToRoot as a}from"./utils/fileSystem.mjs";import{parseJSONWithComments as o}from"./utils/jsonParser.mjs";import{findTsConfigFiles as s}from"./utils/tsConfig.mjs";import{getConfiguration as c}from"@intlayer/config/node";import{ANSIColors as l,colorize as u,colorizePath as d,logger as f,v as p,x as m}from"@intlayer/config/logger";import{getAlias as h}from"@intlayer/config/utils";const g={NextJS:`https://intlayer.org/doc/environment/nextjs.md`,NextJS_15:`https://intlayer.org/doc/environment/nextjs/15.md`,NextJS_14:`https://intlayer.org/doc/environment/nextjs/14.md`,CRA:`https://intlayer.org/doc/environment/create-react-app.md`,Astro:`https://intlayer.org/doc/environment/astro.md`,ViteAndReact:`https://intlayer.org/doc/environment/vite-and-react.md`,ViteAndReact_ReactRouterV7:`https://intlayer.org/doc/environment/vite-and-react/react-router-v7.md`,ViteAndReact_ReactRouterV7_FSRoutes:`https://intlayer.org/doc/environment/vite-and-react/react-router-v7-fs-routes.md`,ViteAndVue:`https://intlayer.org/doc/environment/vite-and-vue.md`,ViteAndSolid:`https://intlayer.org/doc/environment/vite-and-solid.md`,ViteAndSvelte:`https://intlayer.org/doc/environment/vite-and-svelte.md`,ViteAndPreact:`https://intlayer.org/doc/environment/vite-and-preact.md`,TanStackRouter:`https://intlayer.org/doc/environment/tanstack.md`,NuxtAndVue:`https://intlayer.org/doc/environment/nuxt-and-vue.md`,Angular:`https://intlayer.org/doc/environment/angular.md`,SvelteKit:`https://intlayer.org/doc/environment/sveltekit.md`,ReactNativeAndExpo:`https://intlayer.org/doc/environment/react-native-and-expo.md`,Lynx:`https://intlayer.org/doc/environment/lynx-and-react.md`,Express:`https://intlayer.org/doc/environment/express.md`,NestJS:`https://intlayer.org/doc/environment/nestjs.md`,Fastify:`https://intlayer.org/doc/environment/fastify.md`,Default:`https://intlayer.org/doc/get-started`,NextIntl:`https://intlayer.org/blog/intlayer-with-next-intl.md`,ReactI18Next:`https://intlayer.org/blog/intlayer-with-react-i18next.md`,ReactIntl:`https://intlayer.org/blog/intlayer-with-react-intl.md`,NextI18Next:`https://intlayer.org/blog/intlayer-with-next-i18next.md`,VueI18n:`https://intlayer.org/blog/intlayer-with-vue-i18n.md`},_=e=>{let t={...e.dependencies,...e.devDependencies},n=(e,t)=>!e||typeof e!=`string`?!1:RegExp(`^[\\^~]?${t}(?:\\.|$)`).test(e);if(t[`@lynx-js/react`]||t[`@lynx-js/core`])return g.Lynx;if(t[`react-native`]||t.expo)return g.ReactNativeAndExpo;if(t.next){let e=t.next;return n(e,14)?g.NextJS_14:n(e,15)?g.NextJS_15:g.NextJS}if(t.nuxt)return g.NuxtAndVue;if(t.astro)return g.Astro;if(t[`@sveltejs/kit`])return g.SvelteKit;if(t[`@tanstack/react-router`])return g.TanStackRouter;let r=t[`react-router`];if(r&&typeof r==`string`){if(t[`@react-router/fs-routes`])return g.ViteAndReact_ReactRouterV7_FSRoutes;if(n(r,7))return g.ViteAndReact_ReactRouterV7}return t.vite?t.vue?g.ViteAndVue:t[`solid-js`]?g.ViteAndSolid:t.svelte?g.ViteAndSvelte:t.preact?g.ViteAndPreact:g.ViteAndReact:t[`react-scripts`]?g.CRA:t[`@angular/core`]?g.Angular:t[`@nestjs/core`]?g.NestJS:t.express?g.Express:t.fastify?g.Fastify:t[`next-intl`]?g.NextIntl:t[`react-i18next`]||t.i18next?g.ReactI18Next:t[`react-intl`]?g.ReactIntl:t[`next-i18next`]?g.NextI18Next:t[`vue-i18n`]?g.VueI18n:g.Default},v=async g=>{f(u(`Checking Intlayer configuration...`,l.CYAN));let v=`package.json`;await r(g,v)||(f(`${m} No ${d(`package.json`)} found. Please run this script from the project root.`,{level:`error`}),process.exit(1));let y=await i(g,v),b;try{b=JSON.parse(y)}catch{f(`${m} Could not parse ${d(`package.json`)}.`,{level:`error`}),process.exit(1)}let x=_(b),S=`.gitignore`;if(await r(g,S)){let e=await i(g,S);e.includes(`intlayer`)?f(`${p} ${d(S)} already includes .intlayer`):(await a(g,S,`${e}\n# Intlayer\n.intlayer\n`),f(`${p} Added ${d(`.intlayer`)} to ${d(S)}`))}let C=await s(g),w=!1;for(let e of C)if(await r(g,e)){w=!0;try{let t=o(await i(g,e)),n=`.intlayer/**/*.ts`,r=!1;t.include&&(Array.isArray(t.include)&&!t.include.some(e=>e.includes(`.intlayer`))?(t.include.push(n),r=!0):t.include.includes(n)&&f(`${p} ${d(e)} already includes intlayer types`)),r&&(await a(g,e,JSON.stringify(t,null,2)),f(`${p} Updated ${d(e)} to include intlayer types`))}catch{f(`${m} Could not parse or update ${d(e)}. You may need to add ${d(`.intlayer/types/**/*.ts`)} manually.`,{level:`warn`})}}await e(w?`intlayer.config.ts`:`intlayer.config.mjs`,g);let T=!1;for(let e of[`vite.config.ts`,`vite.config.js`,`vite.config.mjs`])if(await r(g,e)){T=!0;let t=await i(g,e);t.includes(`vite-intlayer`)||(await a(g,e,n(t,e.split(`.`).pop())),f(`${p} Updated ${d(e)} to include Intlayer plugin`));break}for(let e of[`next.config.js`,`next.config.mjs`,`next.config.ts`])if(await r(g,e)){T=!0;let n=await i(g,e);n.includes(`next-intlayer`)||(await a(g,e,t(n,e.split(`.`).pop())),f(`${p} Updated ${d(e)} to include Intlayer plugin`));break}for(let e of[`webpack.config.js`,`webpack.config.ts`,`webpack.config.mjs`,`webpack.config.cjs`])if(await r(g,e)){T=!0,f(`${p} Found ${d(e)}. Make sure to configure aliases manually or use the Intlayer Webpack plugin.`);break}if(!T){let e=h({configuration:c({baseDir:g})});if(w&&C.length>0){let t=C.find(e=>e===`tsconfig.json`)||C[0],n=o(await i(g,t));n.compilerOptions??={},n.compilerOptions.paths??={};let r=!1;Object.entries(e).forEach(([e,t])=>{n.compilerOptions.paths[e]||(n.compilerOptions.paths[e]=[t],r=!0)}),r&&(await a(g,t,JSON.stringify(n,null,2)),f(`${p} Updated ${d(t)} to include Intlayer aliases`))}else{let t=`jsconfig.json`;if(await r(g,t)){let n=o(await i(g,t));n.compilerOptions??={},n.compilerOptions.paths??={};let r=!1;Object.entries(e).forEach(([e,t])=>{n.compilerOptions.paths[e]||(n.compilerOptions.paths[e]=[t],r=!0)}),r&&(await a(g,t,JSON.stringify(n,null,2)),f(`${p} Updated ${d(t)} to include Intlayer aliases`))}else{b.imports??={};let t=!1;Object.entries(e).forEach(([e,n])=>{let r=e.replace(`@`,`#`),i=n.startsWith(`.`)?n:`./${n}`;b.imports[r]||(b.imports[r]=i,t=!0)}),t&&(await a(g,v,JSON.stringify(b,null,2)),f(`${p} Updated ${d(v)} to include Intlayer imports`))}}}f(`${p} ${u(`Intlayer init setup complete.`,l.GREEN)}`),f([u(`Next →`,l.MAGENTA),u(`Follow the instructions in the documentation to complete the setup:`,l.GREY_LIGHT),d(x)])};export{v as initIntlayer};
1
+ import{initConfig as e}from"../initConfig/index.mjs";import{updateNextConfig as t,updateViteConfig as n}from"./utils/configManipulation.mjs";import{ensureDirectory as r,exists as i,readFileFromRoot as a,writeFileToRoot as o}from"./utils/fileSystem.mjs";import{parseJSONWithComments as s}from"./utils/jsonParser.mjs";import{findTsConfigFiles as c}from"./utils/tsConfig.mjs";import{getConfiguration as l}from"@intlayer/config/node";import{join as u}from"node:path";import{ANSIColors as d,colorize as f,colorizePath as p,logger as m,v as h,x as g}from"@intlayer/config/logger";import{getAlias as _}from"@intlayer/config/utils";const v={NextJS:`https://intlayer.org/doc/environment/nextjs.md`,NextJS_15:`https://intlayer.org/doc/environment/nextjs/15.md`,NextJS_14:`https://intlayer.org/doc/environment/nextjs/14.md`,CRA:`https://intlayer.org/doc/environment/create-react-app.md`,Astro:`https://intlayer.org/doc/environment/astro.md`,ViteAndReact:`https://intlayer.org/doc/environment/vite-and-react.md`,ViteAndReact_ReactRouterV7:`https://intlayer.org/doc/environment/vite-and-react/react-router-v7.md`,ViteAndReact_ReactRouterV7_FSRoutes:`https://intlayer.org/doc/environment/vite-and-react/react-router-v7-fs-routes.md`,ViteAndVue:`https://intlayer.org/doc/environment/vite-and-vue.md`,ViteAndSolid:`https://intlayer.org/doc/environment/vite-and-solid.md`,ViteAndSvelte:`https://intlayer.org/doc/environment/vite-and-svelte.md`,ViteAndPreact:`https://intlayer.org/doc/environment/vite-and-preact.md`,TanStackRouter:`https://intlayer.org/doc/environment/tanstack.md`,NuxtAndVue:`https://intlayer.org/doc/environment/nuxt-and-vue.md`,Angular:`https://intlayer.org/doc/environment/angular.md`,SvelteKit:`https://intlayer.org/doc/environment/sveltekit.md`,ReactNativeAndExpo:`https://intlayer.org/doc/environment/react-native-and-expo.md`,Lynx:`https://intlayer.org/doc/environment/lynx-and-react.md`,Express:`https://intlayer.org/doc/environment/express.md`,NestJS:`https://intlayer.org/doc/environment/nestjs.md`,Fastify:`https://intlayer.org/doc/environment/fastify.md`,Default:`https://intlayer.org/doc/get-started`,NextIntl:`https://intlayer.org/blog/intlayer-with-next-intl.md`,ReactI18Next:`https://intlayer.org/blog/intlayer-with-react-i18next.md`,ReactIntl:`https://intlayer.org/blog/intlayer-with-react-intl.md`,NextI18Next:`https://intlayer.org/blog/intlayer-with-next-i18next.md`,VueI18n:`https://intlayer.org/blog/intlayer-with-vue-i18n.md`},y=e=>{let t={...e.dependencies,...e.devDependencies},n=(e,t)=>!e||typeof e!=`string`?!1:RegExp(`^[\\^~]?${t}(?:\\.|$)`).test(e);if(t[`@lynx-js/react`]||t[`@lynx-js/core`])return v.Lynx;if(t[`react-native`]||t.expo)return v.ReactNativeAndExpo;if(t.next){let e=t.next;return n(e,14)?v.NextJS_14:n(e,15)?v.NextJS_15:v.NextJS}if(t.nuxt)return v.NuxtAndVue;if(t.astro)return v.Astro;if(t[`@sveltejs/kit`])return v.SvelteKit;if(t[`@tanstack/react-router`])return v.TanStackRouter;let r=t[`react-router`];if(r&&typeof r==`string`){if(t[`@react-router/fs-routes`])return v.ViteAndReact_ReactRouterV7_FSRoutes;if(n(r,7))return v.ViteAndReact_ReactRouterV7}return t.vite?t.vue?v.ViteAndVue:t[`solid-js`]?v.ViteAndSolid:t.svelte?v.ViteAndSvelte:t.preact?v.ViteAndPreact:v.ViteAndReact:t[`react-scripts`]?v.CRA:t[`@angular/core`]?v.Angular:t[`@nestjs/core`]?v.NestJS:t.express?v.Express:t.fastify?v.Fastify:t[`next-intl`]?v.NextIntl:t[`react-i18next`]||t.i18next?v.ReactI18Next:t[`react-intl`]?v.ReactIntl:t[`next-i18next`]?v.NextI18Next:t[`vue-i18n`]?v.VueI18n:v.Default},b=async v=>{m(f(`Checking Intlayer configuration...`,d.CYAN));let b=`package.json`;await i(v,b)||(m(`${g} No ${p(`package.json`)} found. Please run this script from the project root.`,{level:`error`}),process.exit(1));let x=await a(v,b),S;try{S=JSON.parse(x)}catch{m(`${g} Could not parse ${p(`package.json`)}.`,{level:`error`}),process.exit(1)}let C=y(S),w=`.gitignore`;if(await i(v,w)){let e=await a(v,w);e.includes(`intlayer`)?m(`${h} ${p(w)} already includes .intlayer`):(await o(v,w,`${e}\n# Intlayer\n.intlayer\n`),m(`${h} Added ${p(`.intlayer`)} to ${p(w)}`))}let T=`.vscode`,E=u(T,`extensions.json`),D=`intlayer.intlayer-vs-code-extension`;try{let e={recommendations:[]};await i(v,E)?e=s(await a(v,E)):await r(v,T),e.recommendations||=[],e.recommendations.includes(D)?m(`${h} ${p(E)} already includes ${f(D,d.MAGENTA)}`):(e.recommendations.push(D),await o(v,E,JSON.stringify(e,null,2)),m(`${h} Added ${f(D,d.MAGENTA)} to ${p(E)}`))}catch{m(`${g} Could not update ${p(E)}. You may need to add ${f(D,d.MAGENTA)} manually.`,{level:`warn`})}let O=await c(v),k=!1;for(let e of O)if(await i(v,e)){k=!0;try{let t=s(await a(v,e)),n=`.intlayer/**/*.ts`,r=!1;t.include&&(Array.isArray(t.include)&&!t.include.some(e=>e.includes(`.intlayer`))?(t.include.push(n),r=!0):t.include.includes(n)&&m(`${h} ${p(e)} already includes intlayer types`)),r&&(await o(v,e,JSON.stringify(t,null,2)),m(`${h} Updated ${p(e)} to include intlayer types`))}catch{m(`${g} Could not parse or update ${p(e)}. You may need to add ${p(`.intlayer/types/**/*.ts`)} manually.`,{level:`warn`})}}await e(k?`intlayer.config.ts`:`intlayer.config.mjs`,v);let A=!1;for(let e of[`vite.config.ts`,`vite.config.js`,`vite.config.mjs`])if(await i(v,e)){A=!0;let t=await a(v,e);t.includes(`vite-intlayer`)||(await o(v,e,n(t,e.split(`.`).pop())),m(`${h} Updated ${p(e)} to include Intlayer plugin`));break}for(let e of[`next.config.js`,`next.config.mjs`,`next.config.ts`])if(await i(v,e)){A=!0;let n=await a(v,e);n.includes(`next-intlayer`)||(await o(v,e,t(n,e.split(`.`).pop())),m(`${h} Updated ${p(e)} to include Intlayer plugin`));break}for(let e of[`webpack.config.js`,`webpack.config.ts`,`webpack.config.mjs`,`webpack.config.cjs`])if(await i(v,e)){A=!0,m(`${h} Found ${p(e)}. Make sure to configure aliases manually or use the Intlayer Webpack plugin.`);break}if(!A){let e=_({configuration:l({baseDir:v})});if(k&&O.length>0){let t=O.find(e=>e===`tsconfig.json`)||O[0],n=s(await a(v,t));n.compilerOptions??={},n.compilerOptions.paths??={};let r=!1;Object.entries(e).forEach(([e,t])=>{n.compilerOptions.paths[e]||(n.compilerOptions.paths[e]=[t],r=!0)}),r&&(await o(v,t,JSON.stringify(n,null,2)),m(`${h} Updated ${p(t)} to include Intlayer aliases`))}else{let t=`jsconfig.json`;if(await i(v,t)){let n=s(await a(v,t));n.compilerOptions??={},n.compilerOptions.paths??={};let r=!1;Object.entries(e).forEach(([e,t])=>{n.compilerOptions.paths[e]||(n.compilerOptions.paths[e]=[t],r=!0)}),r&&(await o(v,t,JSON.stringify(n,null,2)),m(`${h} Updated ${p(t)} to include Intlayer aliases`))}else{S.imports??={};let t=!1;Object.entries(e).forEach(([e,n])=>{let r=e.replace(`@`,`#`),i=n.startsWith(`.`)?n:`./${n}`;S.imports[r]||(S.imports[r]=i,t=!0)}),t&&(await o(v,b,JSON.stringify(S,null,2)),m(`${h} Updated ${p(b)} to include Intlayer imports`))}}}m(`${h} ${f(`Intlayer init setup complete.`,d.GREEN)}`),m([f(`Next →`,d.MAGENTA),f(`Follow the instructions in the documentation to complete the setup:`,d.GREY_LIGHT),p(C)])};export{b as initIntlayer};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/init/index.ts"],"sourcesContent":["import {\n ANSIColors,\n colorize,\n colorizePath,\n logger,\n v,\n x,\n} from '@intlayer/config/logger';\nimport { getConfiguration } from '@intlayer/config/node';\nimport { getAlias } from '@intlayer/config/utils';\nimport { initConfig } from '../initConfig';\nimport {\n exists,\n findTsConfigFiles,\n parseJSONWithComments,\n readFileFromRoot,\n updateNextConfig,\n updateViteConfig,\n writeFileToRoot,\n} from './utils';\n\n/**\n * Documentation URL Constants\n */\nconst DocumentationRouter = {\n NextJS: 'https://intlayer.org/doc/environment/nextjs.md',\n NextJS_15: 'https://intlayer.org/doc/environment/nextjs/15.md',\n NextJS_14: 'https://intlayer.org/doc/environment/nextjs/14.md',\n CRA: 'https://intlayer.org/doc/environment/create-react-app.md',\n Astro: 'https://intlayer.org/doc/environment/astro.md',\n ViteAndReact: 'https://intlayer.org/doc/environment/vite-and-react.md',\n ViteAndReact_ReactRouterV7:\n 'https://intlayer.org/doc/environment/vite-and-react/react-router-v7.md',\n ViteAndReact_ReactRouterV7_FSRoutes:\n 'https://intlayer.org/doc/environment/vite-and-react/react-router-v7-fs-routes.md',\n ViteAndVue: 'https://intlayer.org/doc/environment/vite-and-vue.md',\n ViteAndSolid: 'https://intlayer.org/doc/environment/vite-and-solid.md',\n ViteAndSvelte: 'https://intlayer.org/doc/environment/vite-and-svelte.md',\n ViteAndPreact: 'https://intlayer.org/doc/environment/vite-and-preact.md',\n TanStackRouter: 'https://intlayer.org/doc/environment/tanstack.md',\n NuxtAndVue: 'https://intlayer.org/doc/environment/nuxt-and-vue.md',\n Angular: 'https://intlayer.org/doc/environment/angular.md',\n SvelteKit: 'https://intlayer.org/doc/environment/sveltekit.md',\n ReactNativeAndExpo:\n 'https://intlayer.org/doc/environment/react-native-and-expo.md',\n Lynx: 'https://intlayer.org/doc/environment/lynx-and-react.md',\n Express: 'https://intlayer.org/doc/environment/express.md',\n NestJS: 'https://intlayer.org/doc/environment/nestjs.md',\n Fastify: 'https://intlayer.org/doc/environment/fastify.md',\n Default: 'https://intlayer.org/doc/get-started',\n\n // Check for competitors libs\n NextIntl: 'https://intlayer.org/blog/intlayer-with-next-intl.md',\n ReactI18Next: 'https://intlayer.org/blog/intlayer-with-react-i18next.md',\n ReactIntl: 'https://intlayer.org/blog/intlayer-with-react-intl.md',\n NextI18Next: 'https://intlayer.org/blog/intlayer-with-next-i18next.md',\n VueI18n: 'https://intlayer.org/blog/intlayer-with-vue-i18n.md',\n};\n\n/**\n * Helper: Detects the environment and returns the doc URL\n */\nconst getDocumentationUrl = (packageJson: any): string => {\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n /**\n * Helper to check if a version string matches a specific major version\n * Matches: \"15\", \"^15.0.0\", \"~15.2\", \"15.0.0-beta\"\n */\n const isVersion = (versionString: string, major: number): boolean => {\n if (!versionString || typeof versionString !== 'string') return false;\n const regex = new RegExp(`^[\\\\^~]?${major}(?:\\\\.|$)`);\n return regex.test(versionString);\n };\n\n // Mobile / Cross-platform\n if (deps['@lynx-js/react'] || deps['@lynx-js/core']) {\n return DocumentationRouter.Lynx;\n }\n if (deps['react-native'] || deps.expo) {\n return DocumentationRouter.ReactNativeAndExpo;\n }\n\n // Meta-frameworks (Next, Nuxt, Astro, SvelteKit)\n if (deps.next) {\n const version = deps.next;\n\n if (isVersion(version, 14)) {\n return DocumentationRouter.NextJS_14;\n }\n\n if (isVersion(version, 15)) {\n return DocumentationRouter.NextJS_15;\n }\n\n return DocumentationRouter.NextJS;\n }\n\n if (deps.nuxt) return DocumentationRouter.NuxtAndVue;\n if (deps.astro) return DocumentationRouter.Astro;\n if (deps['@sveltejs/kit']) return DocumentationRouter.SvelteKit;\n\n // Routers (TanStack & React Router v7)\n if (deps['@tanstack/react-router']) {\n return DocumentationRouter.TanStackRouter;\n }\n\n // Check for React Router v7\n const reactRouterVersion = deps['react-router'];\n if (reactRouterVersion && typeof reactRouterVersion === 'string') {\n // Distinguish between standard v7 and v7 with FS routes\n if (deps['@react-router/fs-routes']) {\n return DocumentationRouter.ViteAndReact_ReactRouterV7_FSRoutes;\n }\n\n // Use Regex to ensure it is v7\n if (isVersion(reactRouterVersion, 7)) {\n return DocumentationRouter.ViteAndReact_ReactRouterV7;\n }\n }\n\n // Vite Ecosystem (General)\n if (deps.vite) {\n if (deps.vue) return DocumentationRouter.ViteAndVue;\n if (deps['solid-js']) return DocumentationRouter.ViteAndSolid;\n if (deps.svelte) return DocumentationRouter.ViteAndSvelte;\n if (deps.preact) return DocumentationRouter.ViteAndPreact;\n\n // Default to React if Vite is present but specific other frameworks aren't found\n return DocumentationRouter.ViteAndReact;\n }\n\n // Other Web Frameworks\n if (deps['react-scripts']) return DocumentationRouter.CRA;\n if (deps['@angular/core']) return DocumentationRouter.Angular;\n\n // Backend\n if (deps['@nestjs/core']) return DocumentationRouter.NestJS;\n if (deps.express) return DocumentationRouter.Express;\n if (deps.fastify) return DocumentationRouter.Fastify;\n\n // Competitor Libs (Migration Guides)\n // We check these last as specific environment setup is usually higher priority,\n // but if no specific framework logic matched (or as a fallback), we guide to migration.\n if (deps['next-intl']) return DocumentationRouter.NextIntl;\n if (deps['react-i18next'] || deps.i18next)\n return DocumentationRouter.ReactI18Next;\n if (deps['react-intl']) return DocumentationRouter.ReactIntl;\n if (deps['next-i18next']) return DocumentationRouter.NextI18Next;\n if (deps['vue-i18n']) return DocumentationRouter.VueI18n;\n\n return DocumentationRouter.Default;\n};\n\n/**\n * MAIN LOGIC\n */\nexport const initIntlayer = async (rootDir: string) => {\n logger(colorize('Checking Intlayer configuration...', ANSIColors.CYAN));\n\n // READ PACKAGE.JSON\n const packageJsonPath = 'package.json';\n if (!(await exists(rootDir, packageJsonPath))) {\n logger(\n `${x} No ${colorizePath('package.json')} found. Please run this script from the project root.`,\n { level: 'error' }\n );\n process.exit(1);\n }\n\n const packageJsonContent = await readFileFromRoot(rootDir, packageJsonPath);\n let packageJson: Record<string, any>;\n try {\n packageJson = JSON.parse(packageJsonContent);\n } catch {\n logger(`${x} Could not parse ${colorizePath('package.json')}.`, {\n level: 'error',\n });\n process.exit(1);\n }\n\n // Determine the correct documentation URL based on dependencies\n const guideUrl = getDocumentationUrl(packageJson);\n\n // 2. CHECK .GITIGNORE\n const gitignorePath = '.gitignore';\n if (await exists(rootDir, gitignorePath)) {\n const gitignoreContent = await readFileFromRoot(rootDir, gitignorePath);\n\n if (!gitignoreContent.includes('intlayer')) {\n const newContent = `${gitignoreContent}\\n# Intlayer\\n.intlayer\\n`;\n await writeFileToRoot(rootDir, gitignorePath, newContent);\n logger(\n `${v} Added ${colorizePath('.intlayer')} to ${colorizePath(gitignorePath)}`\n );\n } else {\n logger(`${v} ${colorizePath(gitignorePath)} already includes .intlayer`);\n }\n }\n\n // CHECK TSCONFIGS\n const tsConfigFiles = await findTsConfigFiles(rootDir);\n let hasTsConfig = false;\n\n for (const fileName of tsConfigFiles) {\n if (await exists(rootDir, fileName)) {\n hasTsConfig = true;\n try {\n const fileContent = await readFileFromRoot(rootDir, fileName);\n const config = parseJSONWithComments(fileContent);\n const typeDefinition = '.intlayer/**/*.ts';\n\n let updated = false;\n\n if (!config.include) {\n // Skip if no include array (solution-style)\n } else if (\n Array.isArray(config.include) &&\n !(config.include as string[]).some((pattern: string) =>\n pattern.includes('.intlayer')\n )\n ) {\n config.include.push(typeDefinition);\n updated = true;\n } else if (config.include.includes(typeDefinition)) {\n logger(\n `${v} ${colorizePath(fileName)} already includes intlayer types`\n );\n }\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n fileName,\n JSON.stringify(config, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(fileName)} to include intlayer types`\n );\n }\n } catch {\n logger(\n `${x} Could not parse or update ${colorizePath(fileName)}. You may need to add ${colorizePath('.intlayer/types/**/*.ts')} manually.`,\n { level: 'warn' }\n );\n }\n }\n }\n\n // INITIALIZE CONFIG FILE\n const format = hasTsConfig ? 'intlayer.config.ts' : 'intlayer.config.mjs';\n await initConfig(format, rootDir);\n\n let hasAliasConfiguration = false;\n\n // CHECK VITE CONFIG\n const viteConfigs = ['vite.config.ts', 'vite.config.js', 'vite.config.mjs'];\n for (const file of viteConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n const content = await readFileFromRoot(rootDir, file);\n\n if (!content.includes('vite-intlayer')) {\n const extension = file.split('.').pop()!;\n const updatedContent = updateViteConfig(content, extension);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(`${v} Updated ${colorizePath(file)} to include Intlayer plugin`);\n }\n break;\n }\n }\n\n // CHECK NEXT CONFIG\n const nextConfigs = ['next.config.js', 'next.config.mjs', 'next.config.ts'];\n for (const file of nextConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n const content = await readFileFromRoot(rootDir, file);\n\n if (!content.includes('next-intlayer')) {\n const extension = file.split('.').pop()!;\n const updatedContent = updateNextConfig(content, extension);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(`${v} Updated ${colorizePath(file)} to include Intlayer plugin`);\n }\n break;\n }\n }\n\n // CHECK WEBPACK CONFIG\n const webpackConfigs = [\n 'webpack.config.js',\n 'webpack.config.ts',\n 'webpack.config.mjs',\n 'webpack.config.cjs',\n ];\n for (const file of webpackConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n logger(\n `${v} Found ${colorizePath(\n file\n )}. Make sure to configure aliases manually or use the Intlayer Webpack plugin.`\n );\n break;\n }\n }\n\n if (!hasAliasConfiguration) {\n const configuration = getConfiguration({ baseDir: rootDir });\n const aliases = getAlias({ configuration });\n\n if (hasTsConfig && tsConfigFiles.length > 0) {\n const tsConfigPath =\n tsConfigFiles.find((f) => f === 'tsconfig.json') || tsConfigFiles[0];\n const tsConfigContent = await readFileFromRoot(rootDir, tsConfigPath);\n const config = parseJSONWithComments(tsConfigContent);\n\n config.compilerOptions ??= {};\n config.compilerOptions.paths ??= {};\n\n let updated = false;\n\n Object.entries(aliases).forEach(([alias, path]) => {\n if (!config.compilerOptions.paths[alias]) {\n config.compilerOptions.paths[alias] = [path];\n updated = true;\n }\n });\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n tsConfigPath,\n JSON.stringify(config, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(\n tsConfigPath\n )} to include Intlayer aliases`\n );\n }\n } else {\n const jsConfigPath = 'jsconfig.json';\n if (await exists(rootDir, jsConfigPath)) {\n const jsConfigContent = await readFileFromRoot(rootDir, jsConfigPath);\n const config = parseJSONWithComments(jsConfigContent);\n\n config.compilerOptions ??= {};\n config.compilerOptions.paths ??= {};\n\n let updated = false;\n\n Object.entries(aliases).forEach(([alias, path]) => {\n if (!config.compilerOptions.paths[alias]) {\n config.compilerOptions.paths[alias] = [path];\n updated = true;\n }\n });\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n jsConfigPath,\n JSON.stringify(config, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(\n jsConfigPath\n )} to include Intlayer aliases`\n );\n }\n } else {\n packageJson.imports ??= {};\n\n let updated = false;\n\n Object.entries(aliases).forEach(([alias, path]) => {\n const importAlias = alias.replace('@', '#');\n const importPath = path.startsWith('.') ? path : `./${path}`;\n\n if (!packageJson.imports[importAlias]) {\n packageJson.imports[importAlias] = importPath;\n updated = true;\n }\n });\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n packageJsonPath,\n JSON.stringify(packageJson, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(\n packageJsonPath\n )} to include Intlayer imports`\n );\n }\n }\n }\n }\n\n // FINAL SUCCESS MESSAGE\n logger(`${v} ${colorize('Intlayer init setup complete.', ANSIColors.GREEN)}`);\n logger([\n colorize('Next →', ANSIColors.MAGENTA),\n colorize(\n `Follow the instructions in the documentation to complete the setup:`,\n ANSIColors.GREY_LIGHT\n ),\n colorizePath(guideUrl),\n ]);\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/init/index.ts"],"sourcesContent":["import { join } from 'node:path';\nimport {\n ANSIColors,\n colorize,\n colorizePath,\n logger,\n v,\n x,\n} from '@intlayer/config/logger';\nimport { getConfiguration } from '@intlayer/config/node';\n\nimport { getAlias } from '@intlayer/config/utils';\nimport { initConfig } from '../initConfig';\nimport {\n ensureDirectory,\n exists,\n findTsConfigFiles,\n parseJSONWithComments,\n readFileFromRoot,\n updateNextConfig,\n updateViteConfig,\n writeFileToRoot,\n} from './utils';\n\n/**\n * Documentation URL Constants\n */\nconst DocumentationRouter = {\n NextJS: 'https://intlayer.org/doc/environment/nextjs.md',\n NextJS_15: 'https://intlayer.org/doc/environment/nextjs/15.md',\n NextJS_14: 'https://intlayer.org/doc/environment/nextjs/14.md',\n CRA: 'https://intlayer.org/doc/environment/create-react-app.md',\n Astro: 'https://intlayer.org/doc/environment/astro.md',\n ViteAndReact: 'https://intlayer.org/doc/environment/vite-and-react.md',\n ViteAndReact_ReactRouterV7:\n 'https://intlayer.org/doc/environment/vite-and-react/react-router-v7.md',\n ViteAndReact_ReactRouterV7_FSRoutes:\n 'https://intlayer.org/doc/environment/vite-and-react/react-router-v7-fs-routes.md',\n ViteAndVue: 'https://intlayer.org/doc/environment/vite-and-vue.md',\n ViteAndSolid: 'https://intlayer.org/doc/environment/vite-and-solid.md',\n ViteAndSvelte: 'https://intlayer.org/doc/environment/vite-and-svelte.md',\n ViteAndPreact: 'https://intlayer.org/doc/environment/vite-and-preact.md',\n TanStackRouter: 'https://intlayer.org/doc/environment/tanstack.md',\n NuxtAndVue: 'https://intlayer.org/doc/environment/nuxt-and-vue.md',\n Angular: 'https://intlayer.org/doc/environment/angular.md',\n SvelteKit: 'https://intlayer.org/doc/environment/sveltekit.md',\n ReactNativeAndExpo:\n 'https://intlayer.org/doc/environment/react-native-and-expo.md',\n Lynx: 'https://intlayer.org/doc/environment/lynx-and-react.md',\n Express: 'https://intlayer.org/doc/environment/express.md',\n NestJS: 'https://intlayer.org/doc/environment/nestjs.md',\n Fastify: 'https://intlayer.org/doc/environment/fastify.md',\n Default: 'https://intlayer.org/doc/get-started',\n\n // Check for competitors libs\n NextIntl: 'https://intlayer.org/blog/intlayer-with-next-intl.md',\n ReactI18Next: 'https://intlayer.org/blog/intlayer-with-react-i18next.md',\n ReactIntl: 'https://intlayer.org/blog/intlayer-with-react-intl.md',\n NextI18Next: 'https://intlayer.org/blog/intlayer-with-next-i18next.md',\n VueI18n: 'https://intlayer.org/blog/intlayer-with-vue-i18n.md',\n};\n\n/**\n * Helper: Detects the environment and returns the doc URL\n */\nconst getDocumentationUrl = (packageJson: any): string => {\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n /**\n * Helper to check if a version string matches a specific major version\n * Matches: \"15\", \"^15.0.0\", \"~15.2\", \"15.0.0-beta\"\n */\n const isVersion = (versionString: string, major: number): boolean => {\n if (!versionString || typeof versionString !== 'string') return false;\n const regex = new RegExp(`^[\\\\^~]?${major}(?:\\\\.|$)`);\n return regex.test(versionString);\n };\n\n // Mobile / Cross-platform\n if (deps['@lynx-js/react'] || deps['@lynx-js/core']) {\n return DocumentationRouter.Lynx;\n }\n if (deps['react-native'] || deps.expo) {\n return DocumentationRouter.ReactNativeAndExpo;\n }\n\n // Meta-frameworks (Next, Nuxt, Astro, SvelteKit)\n if (deps.next) {\n const version = deps.next;\n\n if (isVersion(version, 14)) {\n return DocumentationRouter.NextJS_14;\n }\n\n if (isVersion(version, 15)) {\n return DocumentationRouter.NextJS_15;\n }\n\n return DocumentationRouter.NextJS;\n }\n\n if (deps.nuxt) return DocumentationRouter.NuxtAndVue;\n if (deps.astro) return DocumentationRouter.Astro;\n if (deps['@sveltejs/kit']) return DocumentationRouter.SvelteKit;\n\n // Routers (TanStack & React Router v7)\n if (deps['@tanstack/react-router']) {\n return DocumentationRouter.TanStackRouter;\n }\n\n // Check for React Router v7\n const reactRouterVersion = deps['react-router'];\n if (reactRouterVersion && typeof reactRouterVersion === 'string') {\n // Distinguish between standard v7 and v7 with FS routes\n if (deps['@react-router/fs-routes']) {\n return DocumentationRouter.ViteAndReact_ReactRouterV7_FSRoutes;\n }\n\n // Use Regex to ensure it is v7\n if (isVersion(reactRouterVersion, 7)) {\n return DocumentationRouter.ViteAndReact_ReactRouterV7;\n }\n }\n\n // Vite Ecosystem (General)\n if (deps.vite) {\n if (deps.vue) return DocumentationRouter.ViteAndVue;\n if (deps['solid-js']) return DocumentationRouter.ViteAndSolid;\n if (deps.svelte) return DocumentationRouter.ViteAndSvelte;\n if (deps.preact) return DocumentationRouter.ViteAndPreact;\n\n // Default to React if Vite is present but specific other frameworks aren't found\n return DocumentationRouter.ViteAndReact;\n }\n\n // Other Web Frameworks\n if (deps['react-scripts']) return DocumentationRouter.CRA;\n if (deps['@angular/core']) return DocumentationRouter.Angular;\n\n // Backend\n if (deps['@nestjs/core']) return DocumentationRouter.NestJS;\n if (deps.express) return DocumentationRouter.Express;\n if (deps.fastify) return DocumentationRouter.Fastify;\n\n // Competitor Libs (Migration Guides)\n // We check these last as specific environment setup is usually higher priority,\n // but if no specific framework logic matched (or as a fallback), we guide to migration.\n if (deps['next-intl']) return DocumentationRouter.NextIntl;\n if (deps['react-i18next'] || deps.i18next)\n return DocumentationRouter.ReactI18Next;\n if (deps['react-intl']) return DocumentationRouter.ReactIntl;\n if (deps['next-i18next']) return DocumentationRouter.NextI18Next;\n if (deps['vue-i18n']) return DocumentationRouter.VueI18n;\n\n return DocumentationRouter.Default;\n};\n\n/**\n * MAIN LOGIC\n */\nexport const initIntlayer = async (rootDir: string) => {\n logger(colorize('Checking Intlayer configuration...', ANSIColors.CYAN));\n\n // READ PACKAGE.JSON\n const packageJsonPath = 'package.json';\n if (!(await exists(rootDir, packageJsonPath))) {\n logger(\n `${x} No ${colorizePath('package.json')} found. Please run this script from the project root.`,\n { level: 'error' }\n );\n process.exit(1);\n }\n\n const packageJsonContent = await readFileFromRoot(rootDir, packageJsonPath);\n let packageJson: Record<string, any>;\n try {\n packageJson = JSON.parse(packageJsonContent);\n } catch {\n logger(`${x} Could not parse ${colorizePath('package.json')}.`, {\n level: 'error',\n });\n process.exit(1);\n }\n\n // Determine the correct documentation URL based on dependencies\n const guideUrl = getDocumentationUrl(packageJson);\n\n // 2. CHECK .GITIGNORE\n const gitignorePath = '.gitignore';\n if (await exists(rootDir, gitignorePath)) {\n const gitignoreContent = await readFileFromRoot(rootDir, gitignorePath);\n\n if (!gitignoreContent.includes('intlayer')) {\n const newContent = `${gitignoreContent}\\n# Intlayer\\n.intlayer\\n`;\n await writeFileToRoot(rootDir, gitignorePath, newContent);\n logger(\n `${v} Added ${colorizePath('.intlayer')} to ${colorizePath(gitignorePath)}`\n );\n } else {\n logger(`${v} ${colorizePath(gitignorePath)} already includes .intlayer`);\n }\n }\n\n // 3. CHECK VS CODE EXTENSION RECOMMENDATIONS\n const vscodeDir = '.vscode';\n const extensionsJsonPath = join(vscodeDir, 'extensions.json');\n const extensionId = 'intlayer.intlayer-vs-code-extension';\n\n try {\n let extensionsConfig: { recommendations: string[] } = {\n recommendations: [],\n };\n\n if (await exists(rootDir, extensionsJsonPath)) {\n const content = await readFileFromRoot(rootDir, extensionsJsonPath);\n extensionsConfig = parseJSONWithComments(content);\n } else {\n await ensureDirectory(rootDir, vscodeDir);\n }\n\n if (!extensionsConfig.recommendations) {\n extensionsConfig.recommendations = [];\n }\n\n if (!extensionsConfig.recommendations.includes(extensionId)) {\n extensionsConfig.recommendations.push(extensionId);\n await writeFileToRoot(\n rootDir,\n extensionsJsonPath,\n JSON.stringify(extensionsConfig, null, 2)\n );\n logger(\n `${v} Added ${colorize(extensionId, ANSIColors.MAGENTA)} to ${colorizePath(extensionsJsonPath)}`\n );\n } else {\n logger(\n `${v} ${colorizePath(extensionsJsonPath)} already includes ${colorize(extensionId, ANSIColors.MAGENTA)}`\n );\n }\n } catch {\n logger(\n `${x} Could not update ${colorizePath(extensionsJsonPath)}. You may need to add ${colorize(extensionId, ANSIColors.MAGENTA)} manually.`,\n { level: 'warn' }\n );\n }\n\n // CHECK TSCONFIGS\n const tsConfigFiles = await findTsConfigFiles(rootDir);\n let hasTsConfig = false;\n\n for (const fileName of tsConfigFiles) {\n if (await exists(rootDir, fileName)) {\n hasTsConfig = true;\n try {\n const fileContent = await readFileFromRoot(rootDir, fileName);\n const config = parseJSONWithComments(fileContent);\n const typeDefinition = '.intlayer/**/*.ts';\n\n let updated = false;\n\n if (!config.include) {\n // Skip if no include array (solution-style)\n } else if (\n Array.isArray(config.include) &&\n !(config.include as string[]).some((pattern: string) =>\n pattern.includes('.intlayer')\n )\n ) {\n config.include.push(typeDefinition);\n updated = true;\n } else if (config.include.includes(typeDefinition)) {\n logger(\n `${v} ${colorizePath(fileName)} already includes intlayer types`\n );\n }\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n fileName,\n JSON.stringify(config, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(fileName)} to include intlayer types`\n );\n }\n } catch {\n logger(\n `${x} Could not parse or update ${colorizePath(fileName)}. You may need to add ${colorizePath('.intlayer/types/**/*.ts')} manually.`,\n { level: 'warn' }\n );\n }\n }\n }\n\n // INITIALIZE CONFIG FILE\n const format = hasTsConfig ? 'intlayer.config.ts' : 'intlayer.config.mjs';\n await initConfig(format, rootDir);\n\n let hasAliasConfiguration = false;\n\n // CHECK VITE CONFIG\n const viteConfigs = ['vite.config.ts', 'vite.config.js', 'vite.config.mjs'];\n for (const file of viteConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n const content = await readFileFromRoot(rootDir, file);\n\n if (!content.includes('vite-intlayer')) {\n const extension = file.split('.').pop()!;\n const updatedContent = updateViteConfig(content, extension);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(`${v} Updated ${colorizePath(file)} to include Intlayer plugin`);\n }\n break;\n }\n }\n\n // CHECK NEXT CONFIG\n const nextConfigs = ['next.config.js', 'next.config.mjs', 'next.config.ts'];\n for (const file of nextConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n const content = await readFileFromRoot(rootDir, file);\n\n if (!content.includes('next-intlayer')) {\n const extension = file.split('.').pop()!;\n const updatedContent = updateNextConfig(content, extension);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(`${v} Updated ${colorizePath(file)} to include Intlayer plugin`);\n }\n break;\n }\n }\n\n // CHECK WEBPACK CONFIG\n const webpackConfigs = [\n 'webpack.config.js',\n 'webpack.config.ts',\n 'webpack.config.mjs',\n 'webpack.config.cjs',\n ];\n for (const file of webpackConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n logger(\n `${v} Found ${colorizePath(\n file\n )}. Make sure to configure aliases manually or use the Intlayer Webpack plugin.`\n );\n break;\n }\n }\n\n if (!hasAliasConfiguration) {\n const configuration = getConfiguration({ baseDir: rootDir });\n const aliases = getAlias({ configuration });\n\n if (hasTsConfig && tsConfigFiles.length > 0) {\n const tsConfigPath =\n tsConfigFiles.find((f) => f === 'tsconfig.json') || tsConfigFiles[0];\n const tsConfigContent = await readFileFromRoot(rootDir, tsConfigPath);\n const config = parseJSONWithComments(tsConfigContent);\n\n config.compilerOptions ??= {};\n config.compilerOptions.paths ??= {};\n\n let updated = false;\n\n Object.entries(aliases).forEach(([alias, path]) => {\n if (!config.compilerOptions.paths[alias]) {\n config.compilerOptions.paths[alias] = [path];\n updated = true;\n }\n });\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n tsConfigPath,\n JSON.stringify(config, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(\n tsConfigPath\n )} to include Intlayer aliases`\n );\n }\n } else {\n const jsConfigPath = 'jsconfig.json';\n if (await exists(rootDir, jsConfigPath)) {\n const jsConfigContent = await readFileFromRoot(rootDir, jsConfigPath);\n const config = parseJSONWithComments(jsConfigContent);\n\n config.compilerOptions ??= {};\n config.compilerOptions.paths ??= {};\n\n let updated = false;\n\n Object.entries(aliases).forEach(([alias, path]) => {\n if (!config.compilerOptions.paths[alias]) {\n config.compilerOptions.paths[alias] = [path];\n updated = true;\n }\n });\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n jsConfigPath,\n JSON.stringify(config, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(\n jsConfigPath\n )} to include Intlayer aliases`\n );\n }\n } else {\n packageJson.imports ??= {};\n\n let updated = false;\n\n Object.entries(aliases).forEach(([alias, path]) => {\n const importAlias = alias.replace('@', '#');\n const importPath = path.startsWith('.') ? path : `./${path}`;\n\n if (!packageJson.imports[importAlias]) {\n packageJson.imports[importAlias] = importPath;\n updated = true;\n }\n });\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n packageJsonPath,\n JSON.stringify(packageJson, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(\n packageJsonPath\n )} to include Intlayer imports`\n );\n }\n }\n }\n }\n\n // FINAL SUCCESS MESSAGE\n logger(`${v} ${colorize('Intlayer init setup complete.', ANSIColors.GREEN)}`);\n logger([\n colorize('Next →', ANSIColors.MAGENTA),\n colorize(\n `Follow the instructions in the documentation to complete the setup:`,\n ANSIColors.GREY_LIGHT\n ),\n colorizePath(guideUrl),\n ]);\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{access as e,readFile as t,writeFile as n}from"node:fs/promises";import{join as r}from"node:path";const i=async(t,n)=>{try{return await e(r(t,n)),!0}catch{return!1}},a=async(e,n)=>await t(r(e,n),`utf8`),o=async(e,t,i)=>await n(r(e,t),i,`utf8`);export{i as exists,a as readFileFromRoot,o as writeFileToRoot};
1
+ import{access as e,mkdir as t,readFile as n,writeFile as r}from"node:fs/promises";import{join as i}from"node:path";const a=async(t,n)=>{try{return await e(i(t,n)),!0}catch{return!1}},o=async(e,t)=>await n(i(e,t),`utf8`),s=async(e,t,n)=>await r(i(e,t),n,`utf8`),c=async(e,n)=>{try{await t(i(e,n),{recursive:!0})}catch{}};export{c as ensureDirectory,a as exists,o as readFileFromRoot,s as writeFileToRoot};
2
2
  //# sourceMappingURL=fileSystem.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"fileSystem.mjs","names":[],"sources":["../../../../src/init/utils/fileSystem.ts"],"sourcesContent":["import { access, readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\n/**\n * Helper to check if a file exists\n */\nexport const exists = async (rootDir: string, filePath: string) => {\n try {\n await access(join(rootDir, filePath));\n return true;\n } catch {\n return false;\n }\n};\n\n/**\n * Helper to read a file\n */\nexport const readFileFromRoot = async (rootDir: string, filePath: string) =>\n await readFile(join(rootDir, filePath), 'utf8');\n\n/**\n * Helper to write a file\n */\nexport const writeFileToRoot = async (\n rootDir: string,\n filePath: string,\n content: string\n) => await writeFile(join(rootDir, filePath), content, 'utf8');\n"],"mappings":"wGAMA,MAAa,EAAS,MAAO,EAAiB,IAAqB,CACjE,GAAI,CAEF,OADA,MAAM,EAAO,EAAK,EAAS,EAAS,CAAC,CAC9B,QACD,CACN,MAAO,KAOE,EAAmB,MAAO,EAAiB,IACtD,MAAM,EAAS,EAAK,EAAS,EAAS,CAAE,OAAO,CAKpC,EAAkB,MAC7B,EACA,EACA,IACG,MAAM,EAAU,EAAK,EAAS,EAAS,CAAE,EAAS,OAAO"}
1
+ {"version":3,"file":"fileSystem.mjs","names":[],"sources":["../../../../src/init/utils/fileSystem.ts"],"sourcesContent":["import { access, mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\n/**\n * Helper to check if a file exists\n */\nexport const exists = async (rootDir: string, filePath: string) => {\n try {\n await access(join(rootDir, filePath));\n return true;\n } catch {\n return false;\n }\n};\n\n/**\n * Helper to read a file\n */\nexport const readFileFromRoot = async (rootDir: string, filePath: string) =>\n await readFile(join(rootDir, filePath), 'utf8');\n\n/**\n * Helper to write a file\n */\nexport const writeFileToRoot = async (\n rootDir: string,\n filePath: string,\n content: string\n) => await writeFile(join(rootDir, filePath), content, 'utf8');\n\n/**\n * Helper to ensure a directory exists\n */\nexport const ensureDirectory = async (rootDir: string, dirPath: string) => {\n try {\n await mkdir(join(rootDir, dirPath), { recursive: true });\n } catch {\n // Directory already exists or could not be created\n }\n};\n"],"mappings":"mHAMA,MAAa,EAAS,MAAO,EAAiB,IAAqB,CACjE,GAAI,CAEF,OADA,MAAM,EAAO,EAAK,EAAS,EAAS,CAAC,CAC9B,QACD,CACN,MAAO,KAOE,EAAmB,MAAO,EAAiB,IACtD,MAAM,EAAS,EAAK,EAAS,EAAS,CAAE,OAAO,CAKpC,EAAkB,MAC7B,EACA,EACA,IACG,MAAM,EAAU,EAAK,EAAS,EAAS,CAAE,EAAS,OAAO,CAKjD,EAAkB,MAAO,EAAiB,IAAoB,CACzE,GAAI,CACF,MAAM,EAAM,EAAK,EAAS,EAAQ,CAAE,CAAE,UAAW,GAAM,CAAC,MAClD"}
@@ -1 +1 @@
1
- import{updateNextConfig as e,updateViteConfig as t}from"./configManipulation.mjs";import{exists as n,readFileFromRoot as r,writeFileToRoot as i}from"./fileSystem.mjs";import{parseJSONWithComments as a}from"./jsonParser.mjs";import{findTsConfigFiles as o}from"./tsConfig.mjs";export{n as exists,o as findTsConfigFiles,a as parseJSONWithComments,r as readFileFromRoot,e as updateNextConfig,t as updateViteConfig,i as writeFileToRoot};
1
+ import{updateNextConfig as e,updateViteConfig as t}from"./configManipulation.mjs";import{ensureDirectory as n,exists as r,readFileFromRoot as i,writeFileToRoot as a}from"./fileSystem.mjs";import{parseJSONWithComments as o}from"./jsonParser.mjs";import{findTsConfigFiles as s}from"./tsConfig.mjs";export{n as ensureDirectory,r as exists,s as findTsConfigFiles,o as parseJSONWithComments,i as readFileFromRoot,e as updateNextConfig,t as updateViteConfig,a as writeFileToRoot};
@@ -1,2 +1,2 @@
1
- import{readAsset as e}from"../_virtual/_utils_asset.mjs";import t from"node:path";import{promises as n}from"node:fs";import{getMarkdownMetadata as r}from"@intlayer/core/markdown";const i={Usage:`How to use Intlayer in your project`,RemoteContent:`How to use Intlayer with Remote/CMS/Server-side content`,Config:`Intlayer configuration documentation`,Content:`Reference for all Intlayer content node types (t, enu, etc.)`,React:`React-specific syntax and hooks usage`,Angular:`Angular-specific syntax and Injectable Function usage`,NextJS:`Next.js-specific usage (Server & Client components)`,Vue:`Vue-specific composables and syntax`,Preact:`Preact-specific syntax and hooks usage`,Solid:`Integrates Intlayer internationalization with SolidJS components. Use when the user asks to "setup SolidJS i18n", use the "useIntlayer" hook in Solid, or manage locales in a SolidJS application.`,Svelte:`Svelte-specific stores and syntax`,Astro:`Astro-specific usage and getIntlayer`,CLI:`Intlayer CLI commands and usage`},a=Object.keys(i),o={},s={Cursor:`.cursor/skills`,Windsurf:`.windsurf/skills`,Trae:`.trae/skills`,OpenCode:`.opencode/skills`,GitHub:`.github/skills`,Claude:`.claude/skills`,VSCode:`.vscode/skills`,Antigravity:`.agent/skills`,Augment:`.augment/skills`,OpenClaw:`skills`,Cline:`.cline/skills`,CodeBuddy:`.codebuddy/skills`,CommandCode:`.commandcode/skills`,Continue:`.continue/skills`,Crush:`.crush/skills`,Droid:`.factory/skills`,Goose:`.goose/skills`,Junie:`.junie/skills`,IFlow:`.iflow/skills`,KiloCode:`.kilocode/skills`,Kiro:`.kiro/skills`,Kode:`.kode/skills`,MCPJam:`.mcpjam/skills`,MistralVibe:`.vibe/skills`,Mux:`.mux/skills`,OpenHands:`.openhands/skills`,Pi:`.pi/skills`,Qoder:`.qoder/skills`,Qwen:`.qwen/skills`,RooCode:`.roo/skills`,TraeCN:`.trae/skills`,Zencoder:`.zencoder/skills`,Neovate:`.neovate/skills`,Pochi:`.pochi/skills`,Other:`skills`},c=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),l=t=>{let n=`./skills/${o[t]??c(t)}.md`;try{return e(n)}catch{return console.warn(`Warning: Could not read asset for skill: ${t} at ${n}`),``}},u=()=>{try{return e(`./LICENCE.md`)}catch{return console.warn(`Warning: Could not read LICENCE.md asset`),``}},d=async e=>{let t=await fetch(e);if(!t.ok)throw Error(`Failed to fetch ${e}: ${t.statusText}`);return t.text()},f=async(e,i,a)=>{let f=s[i]??`skills`,p=t.join(e,f),m=i!==`VSCode`;await n.mkdir(p,{recursive:!0});let h=[],g=u();for(let e of a){let i=`intlayer-${o[e]??c(e)}`,a=l(e);if(!a)continue;let s=Array.from(new Set(a.match(/https:\/\/intlayer\.org\/doc\/[^\s)]+\.md/g)||[]));if(m){let o=t.join(p,i),c=t.join(o,`references`);await n.mkdir(c,{recursive:!0}),g&&await n.writeFile(t.join(o,`LICENCE.md`),g,`utf-8`);let l=a,u=s.map(async t=>{try{let e=await d(t),n=r(e),i=``;return i=Array.isArray(n.slugs)?n.slugs.filter(e=>e!==`doc`).join(`_`):new URL(t).pathname.split(`/`).filter(e=>e&&e!==`doc`).map(e=>e.replace(`.md`,``)).join(`_`),i=i?`${i}.md`:`index.md`,{url:t,localRefPath:`references/${i}`,fileName:i,content:e,success:!0}}catch(n){return console.warn(`Warning: Failed to download ref ${t} for skill ${e}`,n),{url:t,success:!1}}}),f=await Promise.all(u);for(let e of f)e.success&&e.fileName&&e.content&&e.localRefPath&&(await n.writeFile(t.join(c,e.fileName),e.content,`utf-8`),l=l.replaceAll(e.url,e.localRefPath));let m=t.join(o,`SKILL.md`);await n.writeFile(m,l,`utf-8`),h.push(`${i}/SKILL.md`)}else{let e=`${i}.md`,r=t.join(p,e);await n.writeFile(r,a,`utf-8`),h.push(e)}}return h.length===0?`No skill files were created. Check your asset paths.`:`Created ${h.length} skills in ${p}`};export{a as SKILLS,i as SKILLS_METADATA,f as installSkills};
1
+ import{readAsset as e}from"../_virtual/_utils_asset.mjs";import t from"node:path";import{promises as n}from"node:fs";import{getMarkdownMetadata as r}from"@intlayer/core/markdown";const i={Usage:`How to use Intlayer in your project`,RemoteContent:`How to use Intlayer with Remote/CMS/Server-side content`,Config:`Intlayer configuration documentation`,Content:`Reference for all Intlayer content node types (t, enu, etc.)`,React:`React-specific syntax and hooks usage`,Angular:`Angular-specific syntax and Injectable Function usage`,NextJS:`Next.js-specific usage (Server & Client components)`,Vue:`Vue-specific composables and syntax`,Preact:`Preact-specific syntax and hooks usage`,Solid:`Integrates Intlayer internationalization with SolidJS components. Use when the user asks to "setup SolidJS i18n", use the "useIntlayer" hook in Solid, or manage locales in a SolidJS application.`,Svelte:`Svelte-specific stores and syntax`,Astro:`Astro-specific usage and getIntlayer`,CLI:`Intlayer CLI commands and usage`,Compiler:`Intlayer Compiler setup and usage for automatic content extraction without .content files`},a=Object.keys(i),o={},s={Cursor:`.cursor/skills`,Windsurf:`.windsurf/skills`,Trae:`.trae/skills`,OpenCode:`.opencode/skills`,GitHub:`.github/skills`,Claude:`.claude/skills`,VSCode:`.vscode/skills`,Antigravity:`.agent/skills`,Augment:`.augment/skills`,OpenClaw:`skills`,Cline:`.cline/skills`,CodeBuddy:`.codebuddy/skills`,CommandCode:`.commandcode/skills`,Continue:`.continue/skills`,Crush:`.crush/skills`,Droid:`.factory/skills`,Goose:`.goose/skills`,Junie:`.junie/skills`,IFlow:`.iflow/skills`,KiloCode:`.kilocode/skills`,Kiro:`.kiro/skills`,Kode:`.kode/skills`,MCPJam:`.mcpjam/skills`,MistralVibe:`.vibe/skills`,Mux:`.mux/skills`,OpenHands:`.openhands/skills`,Pi:`.pi/skills`,Qoder:`.qoder/skills`,Qwen:`.qwen/skills`,RooCode:`.roo/skills`,TraeCN:`.trae/skills`,Zencoder:`.zencoder/skills`,Neovate:`.neovate/skills`,Pochi:`.pochi/skills`,Other:`skills`},c=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),l=t=>{let n=`./skills/${o[t]??c(t)}.md`;try{return e(n)}catch{return console.warn(`Warning: Could not read asset for skill: ${t} at ${n}`),``}},u=()=>{try{return e(`./LICENCE.md`)}catch{return console.warn(`Warning: Could not read LICENCE.md asset`),``}},d=async e=>{let t=await fetch(e);if(!t.ok)throw Error(`Failed to fetch ${e}: ${t.statusText}`);return t.text()},f=async(e,i,a)=>{let f=s[i]??`skills`,p=t.join(e,f),m=i!==`VSCode`;await n.mkdir(p,{recursive:!0});let h=[],g=u();for(let e of a){let i=`intlayer-${o[e]??c(e)}`,a=l(e);if(!a)continue;let s=Array.from(new Set(a.match(/https:\/\/intlayer\.org\/doc\/[^\s)]+\.md/g)||[]));if(m){let o=t.join(p,i),c=t.join(o,`references`);await n.mkdir(c,{recursive:!0}),g&&await n.writeFile(t.join(o,`LICENCE.md`),g,`utf-8`);let l=a,u=s.map(async t=>{try{let e=await d(t),n=r(e),i=``;return i=Array.isArray(n.slugs)?n.slugs.filter(e=>e!==`doc`).join(`_`):new URL(t).pathname.split(`/`).filter(e=>e&&e!==`doc`).map(e=>e.replace(`.md`,``)).join(`_`),i=i?`${i}.md`:`index.md`,{url:t,localRefPath:`references/${i}`,fileName:i,content:e,success:!0}}catch(n){return console.warn(`Warning: Failed to download ref ${t} for skill ${e}`,n),{url:t,success:!1}}}),f=await Promise.all(u);for(let e of f)e.success&&e.fileName&&e.content&&e.localRefPath&&(await n.writeFile(t.join(c,e.fileName),e.content,`utf-8`),l=l.replaceAll(e.url,e.localRefPath));let m=t.join(o,`SKILL.md`);await n.writeFile(m,l,`utf-8`),h.push(`${i}/SKILL.md`)}else{let e=`${i}.md`,r=t.join(p,e);await n.writeFile(r,a,`utf-8`),h.push(e)}}return h.length===0?`No skill files were created. Check your asset paths.`:`Created ${h.length} skills in ${p}`};export{a as SKILLS,i as SKILLS_METADATA,f as installSkills};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["fs"],"sources":["../../../src/installSkills/index.ts"],"sourcesContent":["import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { readAsset } from 'utils:asset';\nimport { getMarkdownMetadata } from '@intlayer/core/markdown';\n\nexport const SKILLS_METADATA = {\n Usage: 'How to use Intlayer in your project',\n RemoteContent: 'How to use Intlayer with Remote/CMS/Server-side content',\n Config: 'Intlayer configuration documentation',\n Content: 'Reference for all Intlayer content node types (t, enu, etc.)',\n React: 'React-specific syntax and hooks usage',\n Angular: 'Angular-specific syntax and Injectable Function usage',\n NextJS: 'Next.js-specific usage (Server & Client components)',\n Vue: 'Vue-specific composables and syntax',\n Preact: 'Preact-specific syntax and hooks usage',\n Solid:\n 'Integrates Intlayer internationalization with SolidJS components. Use when the user asks to \"setup SolidJS i18n\", use the \"useIntlayer\" hook in Solid, or manage locales in a SolidJS application.',\n Svelte: 'Svelte-specific stores and syntax',\n Astro: 'Astro-specific usage and getIntlayer',\n CLI: 'Intlayer CLI commands and usage',\n} as const;\n\nexport const SKILLS = Object.keys(\n SKILLS_METADATA\n) as (keyof typeof SKILLS_METADATA)[];\n\nexport type Skill = (typeof SKILLS)[number];\n\n/**\n * Maps specific skill keys to special filenames if they differ from standard snake_case.\n */\nconst SKILL_FILENAME_MAP: Partial<Record<Skill, string>> = {};\n\n/**\n * Configuration for Platform paths to keep code clean.\n */\nconst PLATFORM_DIRS = {\n Cursor: '.cursor/skills',\n Windsurf: '.windsurf/skills',\n Trae: '.trae/skills',\n OpenCode: '.opencode/skills',\n GitHub: '.github/skills',\n Claude: '.claude/skills',\n VSCode: '.vscode/skills', // Fixed: VSCode usually uses .vscode, not .github\n Antigravity: '.agent/skills',\n Augment: '.augment/skills',\n OpenClaw: 'skills',\n Cline: '.cline/skills',\n CodeBuddy: '.codebuddy/skills',\n CommandCode: '.commandcode/skills',\n Continue: '.continue/skills',\n Crush: '.crush/skills',\n Droid: '.factory/skills',\n Goose: '.goose/skills',\n Junie: '.junie/skills',\n IFlow: '.iflow/skills',\n KiloCode: '.kilocode/skills',\n Kiro: '.kiro/skills',\n Kode: '.kode/skills',\n MCPJam: '.mcpjam/skills',\n MistralVibe: '.vibe/skills',\n Mux: '.mux/skills',\n OpenHands: '.openhands/skills',\n Pi: '.pi/skills',\n Qoder: '.qoder/skills',\n Qwen: '.qwen/skills',\n RooCode: '.roo/skills',\n TraeCN: '.trae/skills',\n Zencoder: '.zencoder/skills',\n Neovate: '.neovate/skills',\n Pochi: '.pochi/skills',\n Other: 'skills',\n};\n\nexport type Platform = keyof typeof PLATFORM_DIRS;\n\n/**\n * Helper to convert CamelCase to kebab-case for directory naming\n */\nconst camelToKebabCase = (str: string) =>\n str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n\n/**\n * Reads the raw markdown content for a specific skill from the assets folder.\n */\nconst getSkillContent = (skill: Skill): string => {\n const baseName = SKILL_FILENAME_MAP[skill] ?? camelToKebabCase(skill);\n const fileName = `./skills/${baseName}.md`;\n\n try {\n return readAsset(fileName);\n } catch {\n console.warn(\n `Warning: Could not read asset for skill: ${skill} at ${fileName}`\n );\n return '';\n }\n};\n\n/**\n * Reads the licence content from the assets folder.\n */\nconst getLicenceContent = (): string => {\n try {\n return readAsset('./LICENCE.md');\n } catch {\n console.warn('Warning: Could not read LICENCE.md asset');\n return '';\n }\n};\n\n/**\n * Fetches the content of a URL using native fetch.\n */\nconst fetchUrlContent = async (url: string): Promise<string> => {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch ${url}: ${response.statusText}`);\n }\n return response.text();\n};\n\n/**\n * Installs skills using the \"Agent Skills\" directory standard.\n * Standard: <PROJECT_ROOT>/<CONFIG_DIR>/skills/<SKILL_NAME>/SKILL.md\n */\nexport const installSkills = async (\n projectRoot: string,\n platform: Platform,\n skills: Skill[]\n): Promise<string> => {\n // 1. Determine destination directory\n const relativeDir = PLATFORM_DIRS[platform] ?? 'skills';\n const skillsBaseDir = path.join(projectRoot, relativeDir);\n\n const useAgentStructure = platform !== 'VSCode';\n\n // Ensure the base directory exists\n await fs.mkdir(skillsBaseDir, { recursive: true });\n\n const createdSkills: string[] = [];\n const licenceContent = getLicenceContent();\n\n for (const skill of skills) {\n const baseName = SKILL_FILENAME_MAP[skill] ?? camelToKebabCase(skill);\n const skillName = `intlayer-${baseName}`;\n const skillContent = getSkillContent(skill);\n\n if (!skillContent) continue;\n\n // Extract unique URLs\n const urls = Array.from(\n new Set(\n skillContent.match(/https:\\/\\/intlayer\\.org\\/doc\\/[^\\s)]+\\.md/g) || []\n )\n );\n\n if (useAgentStructure) {\n // Agent Standard: .../skills/<skill-name>/SKILL.md\n const skillDir = path.join(skillsBaseDir, skillName);\n const referenceDir = path.join(skillDir, 'references');\n\n // Ensure directories exist\n await fs.mkdir(referenceDir, { recursive: true });\n\n // Write License\n if (licenceContent) {\n await fs.writeFile(\n path.join(skillDir, 'LICENCE.md'),\n licenceContent,\n 'utf-8'\n );\n }\n\n let updatedSkillContent = skillContent;\n\n // Parallel download of references\n const downloadPromises = urls.map(async (url) => {\n try {\n const content = await fetchUrlContent(url);\n const metadata = getMarkdownMetadata<{ slugs?: string[] }>(content);\n\n let fileName = '';\n\n // Determine filename from slugs or URL path\n if (Array.isArray(metadata.slugs)) {\n fileName = metadata.slugs\n .filter((slug) => slug !== 'doc')\n .join('_');\n } else {\n const urlPath = new URL(url).pathname;\n fileName = urlPath\n .split('/')\n .filter((part) => part && part !== 'doc')\n .map((part) => part.replace('.md', '')) // Clean extension for joining\n .join('_');\n }\n\n // Ensure it ends with .md\n fileName = fileName ? `${fileName}.md` : 'index.md';\n const localRefPath = `references/${fileName}`;\n\n return {\n url,\n localRefPath,\n fileName,\n content,\n success: true,\n };\n } catch (error) {\n console.warn(\n `Warning: Failed to download ref ${url} for skill ${skill}`,\n error\n );\n return { url, success: false };\n }\n });\n\n const results = await Promise.all(downloadPromises);\n\n // Process results: Write files and update content string\n for (const res of results) {\n if (res.success && res.fileName && res.content && res.localRefPath) {\n // Write the reference file\n await fs.writeFile(\n path.join(referenceDir, res.fileName),\n res.content,\n 'utf-8'\n );\n\n // Update the main content to point to local file\n updatedSkillContent = updatedSkillContent.replaceAll(\n res.url,\n res.localRefPath\n );\n }\n }\n\n // Write the main SKILL.md\n const filePath = path.join(skillDir, 'SKILL.md');\n await fs.writeFile(filePath, updatedSkillContent, 'utf-8');\n createdSkills.push(`${skillName}/SKILL.md`);\n } else {\n // Flat Structure (Generic/VSCode): .../skills/<skill-name>.md\n const fileName = `${skillName}.md`;\n const filePath = path.join(skillsBaseDir, fileName);\n\n await fs.writeFile(filePath, skillContent, 'utf-8');\n createdSkills.push(fileName);\n }\n }\n\n if (createdSkills.length === 0) {\n return `No skill files were created. Check your asset paths.`;\n }\n\n return `Created ${createdSkills.length} skills in ${skillsBaseDir}`;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["fs"],"sources":["../../../src/installSkills/index.ts"],"sourcesContent":["import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { readAsset } from 'utils:asset';\nimport { getMarkdownMetadata } from '@intlayer/core/markdown';\n\nexport const SKILLS_METADATA = {\n Usage: 'How to use Intlayer in your project',\n RemoteContent: 'How to use Intlayer with Remote/CMS/Server-side content',\n Config: 'Intlayer configuration documentation',\n Content: 'Reference for all Intlayer content node types (t, enu, etc.)',\n React: 'React-specific syntax and hooks usage',\n Angular: 'Angular-specific syntax and Injectable Function usage',\n NextJS: 'Next.js-specific usage (Server & Client components)',\n Vue: 'Vue-specific composables and syntax',\n Preact: 'Preact-specific syntax and hooks usage',\n Solid:\n 'Integrates Intlayer internationalization with SolidJS components. Use when the user asks to \"setup SolidJS i18n\", use the \"useIntlayer\" hook in Solid, or manage locales in a SolidJS application.',\n Svelte: 'Svelte-specific stores and syntax',\n Astro: 'Astro-specific usage and getIntlayer',\n CLI: 'Intlayer CLI commands and usage',\n Compiler:\n 'Intlayer Compiler setup and usage for automatic content extraction without .content files',\n} as const;\n\nexport const SKILLS = Object.keys(\n SKILLS_METADATA\n) as (keyof typeof SKILLS_METADATA)[];\n\nexport type Skill = (typeof SKILLS)[number];\n\n/**\n * Maps specific skill keys to special filenames if they differ from standard snake_case.\n */\nconst SKILL_FILENAME_MAP: Partial<Record<Skill, string>> = {};\n\n/**\n * Configuration for Platform paths to keep code clean.\n */\nconst PLATFORM_DIRS = {\n Cursor: '.cursor/skills',\n Windsurf: '.windsurf/skills',\n Trae: '.trae/skills',\n OpenCode: '.opencode/skills',\n GitHub: '.github/skills',\n Claude: '.claude/skills',\n VSCode: '.vscode/skills', // Fixed: VSCode usually uses .vscode, not .github\n Antigravity: '.agent/skills',\n Augment: '.augment/skills',\n OpenClaw: 'skills',\n Cline: '.cline/skills',\n CodeBuddy: '.codebuddy/skills',\n CommandCode: '.commandcode/skills',\n Continue: '.continue/skills',\n Crush: '.crush/skills',\n Droid: '.factory/skills',\n Goose: '.goose/skills',\n Junie: '.junie/skills',\n IFlow: '.iflow/skills',\n KiloCode: '.kilocode/skills',\n Kiro: '.kiro/skills',\n Kode: '.kode/skills',\n MCPJam: '.mcpjam/skills',\n MistralVibe: '.vibe/skills',\n Mux: '.mux/skills',\n OpenHands: '.openhands/skills',\n Pi: '.pi/skills',\n Qoder: '.qoder/skills',\n Qwen: '.qwen/skills',\n RooCode: '.roo/skills',\n TraeCN: '.trae/skills',\n Zencoder: '.zencoder/skills',\n Neovate: '.neovate/skills',\n Pochi: '.pochi/skills',\n Other: 'skills',\n};\n\nexport type Platform = keyof typeof PLATFORM_DIRS;\n\n/**\n * Helper to convert CamelCase to kebab-case for directory naming\n */\nconst camelToKebabCase = (str: string) =>\n str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n\n/**\n * Reads the raw markdown content for a specific skill from the assets folder.\n */\nconst getSkillContent = (skill: Skill): string => {\n const baseName = SKILL_FILENAME_MAP[skill] ?? camelToKebabCase(skill);\n const fileName = `./skills/${baseName}.md`;\n\n try {\n return readAsset(fileName);\n } catch {\n console.warn(\n `Warning: Could not read asset for skill: ${skill} at ${fileName}`\n );\n return '';\n }\n};\n\n/**\n * Reads the licence content from the assets folder.\n */\nconst getLicenceContent = (): string => {\n try {\n return readAsset('./LICENCE.md');\n } catch {\n console.warn('Warning: Could not read LICENCE.md asset');\n return '';\n }\n};\n\n/**\n * Fetches the content of a URL using native fetch.\n */\nconst fetchUrlContent = async (url: string): Promise<string> => {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch ${url}: ${response.statusText}`);\n }\n return response.text();\n};\n\n/**\n * Installs skills using the \"Agent Skills\" directory standard.\n * Standard: <PROJECT_ROOT>/<CONFIG_DIR>/skills/<SKILL_NAME>/SKILL.md\n */\nexport const installSkills = async (\n projectRoot: string,\n platform: Platform,\n skills: Skill[]\n): Promise<string> => {\n // 1. Determine destination directory\n const relativeDir = PLATFORM_DIRS[platform] ?? 'skills';\n const skillsBaseDir = path.join(projectRoot, relativeDir);\n\n const useAgentStructure = platform !== 'VSCode';\n\n // Ensure the base directory exists\n await fs.mkdir(skillsBaseDir, { recursive: true });\n\n const createdSkills: string[] = [];\n const licenceContent = getLicenceContent();\n\n for (const skill of skills) {\n const baseName = SKILL_FILENAME_MAP[skill] ?? camelToKebabCase(skill);\n const skillName = `intlayer-${baseName}`;\n const skillContent = getSkillContent(skill);\n\n if (!skillContent) continue;\n\n // Extract unique URLs\n const urls = Array.from(\n new Set(\n skillContent.match(/https:\\/\\/intlayer\\.org\\/doc\\/[^\\s)]+\\.md/g) || []\n )\n );\n\n if (useAgentStructure) {\n // Agent Standard: .../skills/<skill-name>/SKILL.md\n const skillDir = path.join(skillsBaseDir, skillName);\n const referenceDir = path.join(skillDir, 'references');\n\n // Ensure directories exist\n await fs.mkdir(referenceDir, { recursive: true });\n\n // Write License\n if (licenceContent) {\n await fs.writeFile(\n path.join(skillDir, 'LICENCE.md'),\n licenceContent,\n 'utf-8'\n );\n }\n\n let updatedSkillContent = skillContent;\n\n // Parallel download of references\n const downloadPromises = urls.map(async (url) => {\n try {\n const content = await fetchUrlContent(url);\n const metadata = getMarkdownMetadata<{ slugs?: string[] }>(content);\n\n let fileName = '';\n\n // Determine filename from slugs or URL path\n if (Array.isArray(metadata.slugs)) {\n fileName = metadata.slugs\n .filter((slug) => slug !== 'doc')\n .join('_');\n } else {\n const urlPath = new URL(url).pathname;\n fileName = urlPath\n .split('/')\n .filter((part) => part && part !== 'doc')\n .map((part) => part.replace('.md', '')) // Clean extension for joining\n .join('_');\n }\n\n // Ensure it ends with .md\n fileName = fileName ? `${fileName}.md` : 'index.md';\n const localRefPath = `references/${fileName}`;\n\n return {\n url,\n localRefPath,\n fileName,\n content,\n success: true,\n };\n } catch (error) {\n console.warn(\n `Warning: Failed to download ref ${url} for skill ${skill}`,\n error\n );\n return { url, success: false };\n }\n });\n\n const results = await Promise.all(downloadPromises);\n\n // Process results: Write files and update content string\n for (const res of results) {\n if (res.success && res.fileName && res.content && res.localRefPath) {\n // Write the reference file\n await fs.writeFile(\n path.join(referenceDir, res.fileName),\n res.content,\n 'utf-8'\n );\n\n // Update the main content to point to local file\n updatedSkillContent = updatedSkillContent.replaceAll(\n res.url,\n res.localRefPath\n );\n }\n }\n\n // Write the main SKILL.md\n const filePath = path.join(skillDir, 'SKILL.md');\n await fs.writeFile(filePath, updatedSkillContent, 'utf-8');\n createdSkills.push(`${skillName}/SKILL.md`);\n } else {\n // Flat Structure (Generic/VSCode): .../skills/<skill-name>.md\n const fileName = `${skillName}.md`;\n const filePath = path.join(skillsBaseDir, fileName);\n\n await fs.writeFile(filePath, skillContent, 'utf-8');\n createdSkills.push(fileName);\n }\n }\n\n if (createdSkills.length === 0) {\n return `No skill files were created. Check your asset paths.`;\n }\n\n return `Created ${createdSkills.length} skills in ${skillsBaseDir}`;\n};\n"],"mappings":"mLAKA,MAAa,EAAkB,CAC7B,MAAO,sCACP,cAAe,0DACf,OAAQ,uCACR,QAAS,+DACT,MAAO,wCACP,QAAS,wDACT,OAAQ,sDACR,IAAK,sCACL,OAAQ,yCACR,MACE,qMACF,OAAQ,oCACR,MAAO,uCACP,IAAK,kCACL,SACE,4FACH,CAEY,EAAS,OAAO,KAC3B,EACD,CAOK,EAAqD,EAAE,CAKvD,EAAgB,CACpB,OAAQ,iBACR,SAAU,mBACV,KAAM,eACN,SAAU,mBACV,OAAQ,iBACR,OAAQ,iBACR,OAAQ,iBACR,YAAa,gBACb,QAAS,kBACT,SAAU,SACV,MAAO,gBACP,UAAW,oBACX,YAAa,sBACb,SAAU,mBACV,MAAO,gBACP,MAAO,kBACP,MAAO,gBACP,MAAO,gBACP,MAAO,gBACP,SAAU,mBACV,KAAM,eACN,KAAM,eACN,OAAQ,iBACR,YAAa,eACb,IAAK,cACL,UAAW,oBACX,GAAI,aACJ,MAAO,gBACP,KAAM,eACN,QAAS,cACT,OAAQ,eACR,SAAU,mBACV,QAAS,kBACT,MAAO,gBACP,MAAO,SACR,CAOK,EAAoB,GACxB,EAAI,QAAQ,qBAAsB,QAAQ,CAAC,aAAa,CAKpD,EAAmB,GAAyB,CAEhD,IAAM,EAAW,YADA,EAAmB,IAAU,EAAiB,EAAM,CAC/B,KAEtC,GAAI,CACF,OAAO,EAAU,EAAS,MACpB,CAIN,OAHA,QAAQ,KACN,4CAA4C,EAAM,MAAM,IACzD,CACM,KAOL,MAAkC,CACtC,GAAI,CACF,OAAO,EAAU,eAAe,MAC1B,CAEN,OADA,QAAQ,KAAK,2CAA2C,CACjD,KAOL,EAAkB,KAAO,IAAiC,CAC9D,IAAM,EAAW,MAAM,MAAM,EAAI,CACjC,GAAI,CAAC,EAAS,GACZ,MAAU,MAAM,mBAAmB,EAAI,IAAI,EAAS,aAAa,CAEnE,OAAO,EAAS,MAAM,EAOX,EAAgB,MAC3B,EACA,EACA,IACoB,CAEpB,IAAM,EAAc,EAAc,IAAa,SACzC,EAAgB,EAAK,KAAK,EAAa,EAAY,CAEnD,EAAoB,IAAa,SAGvC,MAAMA,EAAG,MAAM,EAAe,CAAE,UAAW,GAAM,CAAC,CAElD,IAAM,EAA0B,EAAE,CAC5B,EAAiB,GAAmB,CAE1C,IAAK,IAAM,KAAS,EAAQ,CAE1B,IAAM,EAAY,YADD,EAAmB,IAAU,EAAiB,EAAM,GAE/D,EAAe,EAAgB,EAAM,CAE3C,GAAI,CAAC,EAAc,SAGnB,IAAM,EAAO,MAAM,KACjB,IAAI,IACF,EAAa,MAAM,6CAA6C,EAAI,EAAE,CACvE,CACF,CAED,GAAI,EAAmB,CAErB,IAAM,EAAW,EAAK,KAAK,EAAe,EAAU,CAC9C,EAAe,EAAK,KAAK,EAAU,aAAa,CAGtD,MAAMA,EAAG,MAAM,EAAc,CAAE,UAAW,GAAM,CAAC,CAG7C,GACF,MAAMA,EAAG,UACP,EAAK,KAAK,EAAU,aAAa,CACjC,EACA,QACD,CAGH,IAAI,EAAsB,EAGpB,EAAmB,EAAK,IAAI,KAAO,IAAQ,CAC/C,GAAI,CACF,IAAM,EAAU,MAAM,EAAgB,EAAI,CACpC,EAAW,EAA0C,EAAQ,CAE/D,EAAW,GAoBf,MAjBA,CAME,EANE,MAAM,QAAQ,EAAS,MAAM,CACpB,EAAS,MACjB,OAAQ,GAAS,IAAS,MAAM,CAChC,KAAK,IAAI,CAEI,IAAI,IAAI,EAAI,CAAC,SAE1B,MAAM,IAAI,CACV,OAAQ,GAAS,GAAQ,IAAS,MAAM,CACxC,IAAK,GAAS,EAAK,QAAQ,MAAO,GAAG,CAAC,CACtC,KAAK,IAAI,CAId,EAAW,EAAW,GAAG,EAAS,KAAO,WAGlC,CACL,MACA,aAJmB,cAAc,IAKjC,WACA,UACA,QAAS,GACV,OACM,EAAO,CAKd,OAJA,QAAQ,KACN,mCAAmC,EAAI,aAAa,IACpD,EACD,CACM,CAAE,MAAK,QAAS,GAAO,GAEhC,CAEI,EAAU,MAAM,QAAQ,IAAI,EAAiB,CAGnD,IAAK,IAAM,KAAO,EACZ,EAAI,SAAW,EAAI,UAAY,EAAI,SAAW,EAAI,eAEpD,MAAMA,EAAG,UACP,EAAK,KAAK,EAAc,EAAI,SAAS,CACrC,EAAI,QACJ,QACD,CAGD,EAAsB,EAAoB,WACxC,EAAI,IACJ,EAAI,aACL,EAKL,IAAM,EAAW,EAAK,KAAK,EAAU,WAAW,CAChD,MAAMA,EAAG,UAAU,EAAU,EAAqB,QAAQ,CAC1D,EAAc,KAAK,GAAG,EAAU,WAAW,KACtC,CAEL,IAAM,EAAW,GAAG,EAAU,KACxB,EAAW,EAAK,KAAK,EAAe,EAAS,CAEnD,MAAMA,EAAG,UAAU,EAAU,EAAc,QAAQ,CACnD,EAAc,KAAK,EAAS,EAQhC,OAJI,EAAc,SAAW,EACpB,uDAGF,WAAW,EAAc,OAAO,aAAa"}
@@ -1,2 +1,2 @@
1
- import{detectFormatCommand as e}from"../writeContentDeclaration/detectFormatCommand.mjs";import{writeContentDeclaration as t}from"../writeContentDeclaration/writeContentDeclaration.mjs";import{extractDictionaryKey as n}from"./extractDictionaryKey.mjs";import{getConfiguration as r}from"@intlayer/config/node";import i from"node:fs/promises";import{basename as a,dirname as o,extname as s,join as c,relative as l,resolve as u}from"node:path";import{ANSIColors as d,colorizePath as f,getAppLogger as p}from"@intlayer/config/logger";import{camelCaseToKebabCase as m}from"@intlayer/config/utils";import{Node as h,Project as g,SyntaxKind as _}from"ts-morph";import{execSync as v}from"node:child_process";import{generateKey as y}from"@intlayer/core/utils";const b=[`title`,`placeholder`,`alt`,`aria-label`,`label`],x=e=>{let t=e.trim();return!(!t||!t.includes(` `)||!/^[A-Z]/.test(t)||t.startsWith(`{`)||t.startsWith(`v-`))},S=async(e,n,r,i,d)=>{let{defaultLocale:f}=i.internationalization,{baseDir:p,fileExtensions:m}=i.content,h=i?.dictionary?.locale,g=d?u(d):o(r),_=a(r,s(r)),v=c(g,`${_.charAt(0).toLowerCase()+_.slice(1)}.${m[0]}`),y=l(p,v),b;if(h)b={key:n,content:e,locale:f,filePath:y};else{let t={};for(let[n,r]of Object.entries(e))t[n]={nodeType:`translation`,translation:{[f]:r}};b={key:n,content:t,filePath:y}}let x=l(p,g);return await t(b,i,{newDictionariesPath:x}),v},C=(e,t)=>{let n={},r=[];return e.forEachDescendant(e=>{if(h.isJsxText(e)){let i=e.getText();if(x(i)){let a=y(i,t);t.add(a),n[a]=i.replace(/\s+/g,` `).trim(),r.push({node:e,key:a,type:`jsx-text`})}}else if(h.isJsxAttribute(e)){let i=e.getNameNode().getText();if(b.includes(i)){let i=e.getInitializer();if(h.isStringLiteral(i)){let a=i.getLiteralValue();if(x(a)){let i=y(a,t);t.add(i),n[i]=a.trim(),r.push({node:e,key:i,type:`jsx-attribute`})}}}}else if(h.isStringLiteral(e)){let i=e.getLiteralValue();if(x(i)){let a=e.getParent();if(a?.getKindName()===`ImportDeclaration`||a?.getKindName()===`ImportSpecifier`||a?.getKindName()===`ModuleSpecifier`||h.isJsxAttribute(a)||h.isCallExpression(a)&&a.getExpression().getText().includes(`console.log`)||h.isPropertyAssignment(a)&&a.getNameNode()===e)return;let o=y(i,t);t.add(o),n[o]=i.trim(),r.push({node:e,key:o,type:`string-literal`})}}}),{extractedContent:n,replacements:r}},w=async(e,t,n,r,i=!0)=>{let a;try{a=r.addSourceFileAtPath(e)}catch{a=r.getSourceFileOrThrow(e)}let o=n===`solid-intlayer`,{extractedContent:s,replacements:c}=C(a,new Set);if(Object.keys(s).length===0)return null;for(let{node:e,key:t,type:n}of c){let r=o?`content().${t}`:`content.${t}`;n===`jsx-text`&&h.isJsxText(e)?e.replaceWithText(`{${r}}`):n===`jsx-attribute`&&h.isJsxAttribute(e)?e.setInitializer(`{${r}.value}`):n===`string-literal`&&h.isStringLiteral(e)&&e.replaceWithText(`${r}.value`)}let l=a.getImportDeclaration(e=>e.getModuleSpecifierValue()===n);return l?l.getNamedImports().some(e=>e.getName()===`useIntlayer`)||l.addNamedImport(`useIntlayer`):a.addImportDeclaration({namedImports:[`useIntlayer`],moduleSpecifier:n}),a.getFunctions().forEach(e=>{e.getBody()?.asKind(_.Block)?.insertStatements(0,`const content = useIntlayer("${t}");`)}),a.getVariableDeclarations().forEach(e=>{let n=e.getInitializer();if(h.isArrowFunction(n)||h.isFunctionExpression(n)){let e=n.getBody();h.isBlock(e)&&(e.getText().includes(`return`)||e.getText().includes(`use`))&&e.insertStatements(0,`const content = useIntlayer("${t}");`)}}),i&&await a.save(),s},T=async(t,a,o,c)=>{let u=!o?.declarationOnly,h=!o?.codeOnly,_=r(o?.configOptions),b=p(_),{baseDir:T}=_.content,E=c||new g({skipAddingFilesFromTsConfig:!0}),D=n(t,(await i.readFile(t)).toString()),O=m(D),k=s(t),A=null;if(k===`.vue`)try{let{processVueFile:e}=await import(`@intlayer/vue-transformer`);A=await e(t,O,a,{generateKey:y,shouldExtract:x,extractTsContent:C},u)}catch(e){throw e.code===`ERR_MODULE_NOT_FOUND`||e.message?.includes(`Cannot find module`)?Error(`Please install ${f(`@intlayer/vue-transformer`,d.YELLOW)} to process Vue files.`):e}else if(k===`.svelte`)try{let{processSvelteFile:e}=await import(`@intlayer/svelte-transformer`);A=await e(t,O,a,{generateKey:y,shouldExtract:x,extractTsContent:C},u)}catch(e){throw e.code===`ERR_MODULE_NOT_FOUND`||e.message?.includes(`Cannot find module`)?Error(`Please install ${f(`@intlayer/svelte-transformer`,d.YELLOW)} to process Svelte files.`):e}else [`.tsx`,`.jsx`,`.ts`,`.js`].includes(k)&&(A=await w(t,O,a,E,u));if(!A){b(`No extractable text found in ${D}`);return}if(h){let e=await S(A,O,t,_,o?.outputDir);b(`Created content file: ${f(l(_.content.baseDir,e))}`)}if(u){try{let n=e(_);n&&v(n.replace(`{{file}}`,t),{stdio:`ignore`,cwd:T})}catch{}b(`Updated component: ${f(l(T,t))}`)}},E=async(e,t,n)=>{let i=p(r(n?.configOptions)),a=new g({skipAddingFilesFromTsConfig:!0});for(let r of e)try{await T(r,t,n,a)}catch(e){i(`Failed to transform ${r}: ${e.message}`)}};export{b as ATTRIBUTES_TO_EXTRACT,T as extractIntlayer,x as shouldExtract,E as transformFiles};
1
+ import{detectFormatCommand as e}from"../detectFormatCommand.mjs";import{writeContentDeclaration as t}from"../writeContentDeclaration/writeContentDeclaration.mjs";import{extractDictionaryKey as n}from"./extractDictionaryKey.mjs";import{getConfiguration as r}from"@intlayer/config/node";import i from"node:fs/promises";import{basename as a,dirname as o,extname as s,join as c,relative as l,resolve as u}from"node:path";import{ANSIColors as d,colorizePath as f,getAppLogger as p}from"@intlayer/config/logger";import{camelCaseToKebabCase as m}from"@intlayer/config/utils";import{Node as h,Project as g,SyntaxKind as _}from"ts-morph";import{execSync as v}from"node:child_process";import{generateKey as y}from"@intlayer/core/utils";const b=[`title`,`placeholder`,`alt`,`aria-label`,`label`],x=e=>{let t=e.trim();return!(!t||!t.includes(` `)||!/^[A-Z]/.test(t)||t.startsWith(`{`)||t.startsWith(`v-`))},S=async(e,n,r,i,d)=>{let{defaultLocale:f}=i.internationalization,{baseDir:p,fileExtensions:m}=i.content,h=i?.dictionary?.locale,g=d?u(d):o(r),_=a(r,s(r)),v=c(g,`${_.charAt(0).toLowerCase()+_.slice(1)}.${m[0]}`),y=l(p,v),b;if(h)b={key:n,content:e,locale:f,filePath:y};else{let t={};for(let[n,r]of Object.entries(e))t[n]={nodeType:`translation`,translation:{[f]:r}};b={key:n,content:t,filePath:y}}let x=l(p,g);return await t(b,i,{newDictionariesPath:x}),v},C=(e,t)=>{let n={},r=[];return e.forEachDescendant(e=>{if(h.isJsxText(e)){let i=e.getText();if(x(i)){let a=y(i,t);t.add(a),n[a]=i.replace(/\s+/g,` `).trim(),r.push({node:e,key:a,type:`jsx-text`})}}else if(h.isJsxAttribute(e)){let i=e.getNameNode().getText();if(b.includes(i)){let i=e.getInitializer();if(h.isStringLiteral(i)){let a=i.getLiteralValue();if(x(a)){let i=y(a,t);t.add(i),n[i]=a.trim(),r.push({node:e,key:i,type:`jsx-attribute`})}}}}else if(h.isStringLiteral(e)){let i=e.getLiteralValue();if(x(i)){let a=e.getParent();if(a?.getKindName()===`ImportDeclaration`||a?.getKindName()===`ImportSpecifier`||a?.getKindName()===`ModuleSpecifier`||h.isJsxAttribute(a)||h.isCallExpression(a)&&a.getExpression().getText().includes(`console.log`)||h.isPropertyAssignment(a)&&a.getNameNode()===e)return;let o=y(i,t);t.add(o),n[o]=i.trim(),r.push({node:e,key:o,type:`string-literal`})}}}),{extractedContent:n,replacements:r}},w=async(e,t,n,r,i=!0)=>{let a;try{a=r.addSourceFileAtPath(e)}catch{a=r.getSourceFileOrThrow(e)}let o=n===`solid-intlayer`,{extractedContent:s,replacements:c}=C(a,new Set);if(Object.keys(s).length===0)return null;for(let{node:e,key:t,type:n}of c){let r=o?`content().${t}`:`content.${t}`;n===`jsx-text`&&h.isJsxText(e)?e.replaceWithText(`{${r}}`):n===`jsx-attribute`&&h.isJsxAttribute(e)?e.setInitializer(`{${r}.value}`):n===`string-literal`&&h.isStringLiteral(e)&&e.replaceWithText(`${r}.value`)}let l=a.getImportDeclaration(e=>e.getModuleSpecifierValue()===n);return l?l.getNamedImports().some(e=>e.getName()===`useIntlayer`)||l.addNamedImport(`useIntlayer`):a.addImportDeclaration({namedImports:[`useIntlayer`],moduleSpecifier:n}),a.getFunctions().forEach(e=>{e.getBody()?.asKind(_.Block)?.insertStatements(0,`const content = useIntlayer("${t}");`)}),a.getVariableDeclarations().forEach(e=>{let n=e.getInitializer();if(h.isArrowFunction(n)||h.isFunctionExpression(n)){let e=n.getBody();h.isBlock(e)&&(e.getText().includes(`return`)||e.getText().includes(`use`))&&e.insertStatements(0,`const content = useIntlayer("${t}");`)}}),i&&await a.save(),s},T=async(t,a,o,c)=>{let u=!o?.declarationOnly,h=!o?.codeOnly,_=r(o?.configOptions),b=p(_),{baseDir:T}=_.content,E=c||new g({skipAddingFilesFromTsConfig:!0}),D=n(t,(await i.readFile(t)).toString()),O=m(D),k=s(t),A=null;if(k===`.vue`)try{let{processVueFile:e}=await import(`@intlayer/vue-transformer`);A=await e(t,O,a,{generateKey:y,shouldExtract:x,extractTsContent:C},u)}catch(e){throw e.code===`ERR_MODULE_NOT_FOUND`||e.message?.includes(`Cannot find module`)?Error(`Please install ${f(`@intlayer/vue-transformer`,d.YELLOW)} to process Vue files.`):e}else if(k===`.svelte`)try{let{processSvelteFile:e}=await import(`@intlayer/svelte-transformer`);A=await e(t,O,a,{generateKey:y,shouldExtract:x,extractTsContent:C},u)}catch(e){throw e.code===`ERR_MODULE_NOT_FOUND`||e.message?.includes(`Cannot find module`)?Error(`Please install ${f(`@intlayer/svelte-transformer`,d.YELLOW)} to process Svelte files.`):e}else [`.tsx`,`.jsx`,`.ts`,`.js`].includes(k)&&(A=await w(t,O,a,E,u));if(!A){b(`No extractable text found in ${D}`);return}if(h){let e=await S(A,O,t,_,o?.outputDir);b(`Created content file: ${f(l(_.content.baseDir,e))}`)}if(u){try{let n=e(_);n&&v(n.replace(`{{file}}`,t),{stdio:`ignore`,cwd:T})}catch{}b(`Updated component: ${f(l(T,t))}`)}},E=async(e,t,n)=>{let i=p(r(n?.configOptions)),a=new g({skipAddingFilesFromTsConfig:!0});for(let r of e)try{await T(r,t,n,a)}catch(e){i(`Failed to transform ${r}: ${e.message}`)}};export{b as ATTRIBUTES_TO_EXTRACT,T as extractIntlayer,x as shouldExtract,E as transformFiles};
2
2
  //# sourceMappingURL=transformFiles.mjs.map