@intlayer/chokidar 8.1.7 → 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 (49) hide show
  1. package/dist/assets/installSkills/skills/astro.md +2 -2
  2. package/dist/assets/installSkills/skills/cli.md +1 -1
  3. package/dist/assets/installSkills/skills/{next_js.md → next-js.md} +1 -2
  4. package/dist/cjs/build.cjs +1 -1
  5. package/dist/cjs/cli.cjs +1 -1
  6. package/dist/cjs/detectFormatCommand.cjs +2 -0
  7. package/dist/cjs/detectFormatCommand.cjs.map +1 -0
  8. package/dist/cjs/index.cjs +1 -1
  9. package/dist/cjs/init/index.cjs +1 -1
  10. package/dist/cjs/init/index.cjs.map +1 -1
  11. package/dist/cjs/init/utils/fileSystem.cjs +1 -1
  12. package/dist/cjs/init/utils/fileSystem.cjs.map +1 -1
  13. package/dist/cjs/init/utils/index.cjs +1 -1
  14. package/dist/cjs/transformFiles/transformFiles.cjs +1 -1
  15. package/dist/cjs/transformFiles/transformFiles.cjs.map +1 -1
  16. package/dist/cjs/writeContentDeclaration/index.cjs +1 -1
  17. package/dist/cjs/writeContentDeclaration/writeJSFile.cjs +1 -1
  18. package/dist/cjs/writeContentDeclaration/writeJSFile.cjs.map +1 -1
  19. package/dist/esm/build.mjs +1 -1
  20. package/dist/esm/cli.mjs +1 -1
  21. package/dist/esm/detectFormatCommand.mjs.map +1 -0
  22. package/dist/esm/index.mjs +1 -1
  23. package/dist/esm/init/index.mjs +1 -1
  24. package/dist/esm/init/index.mjs.map +1 -1
  25. package/dist/esm/init/utils/fileSystem.mjs +1 -1
  26. package/dist/esm/init/utils/fileSystem.mjs.map +1 -1
  27. package/dist/esm/init/utils/index.mjs +1 -1
  28. package/dist/esm/transformFiles/transformFiles.mjs +1 -1
  29. package/dist/esm/transformFiles/transformFiles.mjs.map +1 -1
  30. package/dist/esm/writeContentDeclaration/index.mjs +1 -1
  31. package/dist/esm/writeContentDeclaration/writeJSFile.mjs +1 -1
  32. package/dist/esm/writeContentDeclaration/writeJSFile.mjs.map +1 -1
  33. package/dist/types/build.d.ts +1 -2
  34. package/dist/types/cli.d.ts +2 -1
  35. package/dist/types/{writeContentDeclaration/detectFormatCommand.d.ts → detectFormatCommand.d.ts} +1 -1
  36. package/dist/types/detectFormatCommand.d.ts.map +1 -0
  37. package/dist/types/index.d.ts +1 -1
  38. package/dist/types/init/index.d.ts.map +1 -1
  39. package/dist/types/init/utils/fileSystem.d.ts +5 -1
  40. package/dist/types/init/utils/fileSystem.d.ts.map +1 -1
  41. package/dist/types/init/utils/index.d.ts +2 -2
  42. package/dist/types/writeContentDeclaration/index.d.ts +1 -2
  43. package/package.json +10 -10
  44. package/dist/cjs/writeContentDeclaration/detectFormatCommand.cjs +0 -2
  45. package/dist/cjs/writeContentDeclaration/detectFormatCommand.cjs.map +0 -1
  46. package/dist/esm/writeContentDeclaration/detectFormatCommand.mjs.map +0 -1
  47. package/dist/types/writeContentDeclaration/detectFormatCommand.d.ts.map +0 -1
  48. /package/dist/assets/installSkills/skills/{remote_content.md → remote-content.md} +0 -0
  49. /package/dist/esm/{writeContentDeclaration/detectFormatCommand.mjs → detectFormatCommand.mjs} +0 -0
@@ -28,12 +28,12 @@ const content = await getIntlayer("my-dictionary-key");
28
28
  <h1>{content.title}</h1>
29
29
  ```
30
30
 
31
- [Astro Documentation](https://intlayer.org/doc/packages/astro-intlayer.md)
31
+ [Astro Documentation](https://intlayer.org/doc/environment/astro.md)
32
32
 
33
33
  ## References
34
34
 
35
35
  - [Website](https://intlayer.org)
36
- - [Doc](https://intlayer.org/doc/concept/cli)
36
+ - [Doc](https://intlayer.org/doc/concept/cli.md)
37
37
 
38
38
  - [Astro](https://intlayer.org/doc/environment/astro.md)
39
39
  - [Intlayer Exports](https://intlayer.org/doc/packages/intlayer/exports.md)
@@ -63,7 +63,7 @@ npm install intlayer-cli
63
63
  ### Packages
64
64
 
65
65
  - [Website](https://intlayer.org)
66
- - [Doc](https://intlayer.org/doc/concept/cli)
66
+ - [Doc](https://intlayer.org/doc/concept/cli.md)
67
67
 
68
68
  - [Intlayer CLI](https://intlayer.org/doc/packages/intlayer-cli/exports.md)
69
69
  - [Intlayer CLI Exports](https://intlayer.org/doc/packages/intlayer-cli/exports.md)
@@ -104,8 +104,7 @@ export const MyClientComponent = () => {
104
104
  };
105
105
  ```
106
106
 
107
- [Next.js package Documentation](https://intlayer.org/doc/packages/next-intlayer.md)
108
- [Next.js package Documentation](https://intlayer.org/doc/packages/next-intlayer.md)
107
+ [Next.js package Documentation](https://intlayer.org/doc/packages/next-intlayer/exports.md)
109
108
 
110
109
  ## References
111
110
 
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./buildIntlayerDictionary/buildIntlayerDictionary.cjs`),t=require(`./buildIntlayerDictionary/processContentDeclaration.cjs`),n=require(`./cleanOutputDir.cjs`),r=require(`./createDictionaryEntryPoint/generateDictionaryListContent.cjs`),i=require(`./createDictionaryEntryPoint/getBuiltDictionariesPath.cjs`),a=require(`./createDictionaryEntryPoint/getBuiltDynamicDictionariesPath.cjs`),o=require(`./createDictionaryEntryPoint/getBuiltFetchDictionariesPath.cjs`),s=require(`./createDictionaryEntryPoint/getBuiltRemoteDictionariesPath.cjs`),c=require(`./createDictionaryEntryPoint/getBuiltUnmergedDictionariesPath.cjs`),l=require(`./createDictionaryEntryPoint/createDictionaryEntryPoint.cjs`),u=require(`./createType/createModuleAugmentation.cjs`),d=require(`./createType/createType.cjs`),f=require(`./formatDictionary.cjs`),p=require(`./loadDictionaries/loadContentDeclaration.cjs`),m=require(`./loadDictionaries/loadRemoteDictionaries.cjs`),h=require(`./loadDictionaries/loadDictionaries.cjs`),g=require(`./loadDictionaries/loadLocalDictionaries.cjs`),_=require(`./writeConfiguration/index.cjs`),v=require(`./prepareIntlayer.cjs`),y=require(`./writeContentDeclaration/detectExportedComponentName.cjs`),b=require(`./writeContentDeclaration/detectFormatCommand.cjs`),x=require(`./writeContentDeclaration/transformJSFile.cjs`),S=require(`./writeContentDeclaration/writeJSFile.cjs`),C=require(`./writeContentDeclaration/writeContentDeclaration.cjs`);exports.buildDictionary=e.buildDictionary,exports.cleanOutputDir=n.cleanOutputDir,exports.createDictionaryEntryPoint=l.createDictionaryEntryPoint,exports.createModuleAugmentation=u.createModuleAugmentation,exports.createTypes=d.createTypes,exports.detectExportedComponentName=y.detectExportedComponentName,exports.detectFormatCommand=b.detectFormatCommand,exports.formatDictionaries=f.formatDictionaries,exports.formatDictionariesOutput=f.formatDictionariesOutput,exports.formatDictionary=f.formatDictionary,exports.formatDictionaryOutput=f.formatDictionaryOutput,exports.formatDistantDictionaries=m.formatDistantDictionaries,exports.formatLocalDictionaries=p.formatLocalDictionaries,exports.generateDictionaryListContent=r.generateDictionaryListContent,exports.generateTypeScriptType=d.generateTypeScriptType,exports.getBuiltDictionariesPath=i.getBuiltDictionariesPath,exports.getBuiltDynamicDictionariesPath=a.getBuiltDynamicDictionariesPath,exports.getBuiltFetchDictionariesPath=o.getBuiltFetchDictionariesPath,exports.getBuiltRemoteDictionariesPath=s.getBuiltRemoteDictionariesPath,exports.getBuiltUnmergedDictionariesPath=c.getBuiltUnmergedDictionariesPath,exports.getTypeName=u.getTypeName,exports.isCachedConfigurationUpToDate=_.isCachedConfigurationUpToDate,exports.loadContentDeclarations=p.loadContentDeclarations,exports.loadDictionaries=h.loadDictionaries,exports.loadLocalDictionaries=g.loadLocalDictionaries,exports.loadRemoteDictionaries=m.loadRemoteDictionaries,exports.prepareIntlayer=v.prepareIntlayer,exports.processContentDeclaration=t.processContentDeclaration,exports.transformJSFile=x.transformJSFile,exports.writeConfiguration=_.writeConfiguration,exports.writeContentDeclaration=C.writeContentDeclaration,exports.writeJSFile=S.writeJSFile;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./buildIntlayerDictionary/buildIntlayerDictionary.cjs`),t=require(`./buildIntlayerDictionary/processContentDeclaration.cjs`),n=require(`./cleanOutputDir.cjs`),r=require(`./createDictionaryEntryPoint/generateDictionaryListContent.cjs`),i=require(`./createDictionaryEntryPoint/getBuiltDictionariesPath.cjs`),a=require(`./createDictionaryEntryPoint/getBuiltDynamicDictionariesPath.cjs`),o=require(`./createDictionaryEntryPoint/getBuiltFetchDictionariesPath.cjs`),s=require(`./createDictionaryEntryPoint/getBuiltRemoteDictionariesPath.cjs`),c=require(`./createDictionaryEntryPoint/getBuiltUnmergedDictionariesPath.cjs`),l=require(`./createDictionaryEntryPoint/createDictionaryEntryPoint.cjs`),u=require(`./createType/createModuleAugmentation.cjs`),d=require(`./createType/createType.cjs`),f=require(`./formatDictionary.cjs`),p=require(`./loadDictionaries/loadContentDeclaration.cjs`),m=require(`./loadDictionaries/loadRemoteDictionaries.cjs`),h=require(`./loadDictionaries/loadDictionaries.cjs`),g=require(`./loadDictionaries/loadLocalDictionaries.cjs`),_=require(`./writeConfiguration/index.cjs`),v=require(`./prepareIntlayer.cjs`),y=require(`./writeContentDeclaration/detectExportedComponentName.cjs`),b=require(`./writeContentDeclaration/transformJSFile.cjs`),x=require(`./writeContentDeclaration/writeJSFile.cjs`),S=require(`./writeContentDeclaration/writeContentDeclaration.cjs`);exports.buildDictionary=e.buildDictionary,exports.cleanOutputDir=n.cleanOutputDir,exports.createDictionaryEntryPoint=l.createDictionaryEntryPoint,exports.createModuleAugmentation=u.createModuleAugmentation,exports.createTypes=d.createTypes,exports.detectExportedComponentName=y.detectExportedComponentName,exports.formatDictionaries=f.formatDictionaries,exports.formatDictionariesOutput=f.formatDictionariesOutput,exports.formatDictionary=f.formatDictionary,exports.formatDictionaryOutput=f.formatDictionaryOutput,exports.formatDistantDictionaries=m.formatDistantDictionaries,exports.formatLocalDictionaries=p.formatLocalDictionaries,exports.generateDictionaryListContent=r.generateDictionaryListContent,exports.generateTypeScriptType=d.generateTypeScriptType,exports.getBuiltDictionariesPath=i.getBuiltDictionariesPath,exports.getBuiltDynamicDictionariesPath=a.getBuiltDynamicDictionariesPath,exports.getBuiltFetchDictionariesPath=o.getBuiltFetchDictionariesPath,exports.getBuiltRemoteDictionariesPath=s.getBuiltRemoteDictionariesPath,exports.getBuiltUnmergedDictionariesPath=c.getBuiltUnmergedDictionariesPath,exports.getTypeName=u.getTypeName,exports.isCachedConfigurationUpToDate=_.isCachedConfigurationUpToDate,exports.loadContentDeclarations=p.loadContentDeclarations,exports.loadDictionaries=h.loadDictionaries,exports.loadLocalDictionaries=g.loadLocalDictionaries,exports.loadRemoteDictionaries=m.loadRemoteDictionaries,exports.prepareIntlayer=v.prepareIntlayer,exports.processContentDeclaration=t.processContentDeclaration,exports.transformJSFile=b.transformJSFile,exports.writeConfiguration=_.writeConfiguration,exports.writeContentDeclaration=S.writeContentDeclaration,exports.writeJSFile=x.writeJSFile;
package/dist/cjs/cli.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./listDictionariesPath.cjs`),t=require(`./getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.cjs`),n=require(`./init/index.cjs`),r=require(`./installSkills/index.cjs`),i=require(`./listGitFiles.cjs`),a=require(`./listProjects.cjs`),o=require(`./transformFiles/extractDictionaryKey.cjs`),s=require(`./transformFiles/transformFiles.cjs`);exports.ATTRIBUTES_TO_EXTRACT=s.ATTRIBUTES_TO_EXTRACT,exports.SKILLS=r.SKILLS,exports.SKILLS_METADATA=r.SKILLS_METADATA,exports.extractDictionaryKey=o.extractDictionaryKey,exports.extractIntlayer=s.extractIntlayer,exports.getContentDeclarationFileTemplate=t.getContentDeclarationFileTemplate,exports.initIntlayer=n.initIntlayer,exports.installSkills=r.installSkills,exports.listDictionaries=e.listDictionaries,exports.listDictionariesWithStats=e.listDictionariesWithStats,exports.listGitFiles=i.listGitFiles,exports.listGitLines=i.listGitLines,exports.listProjects=a.listProjects,exports.shouldExtract=s.shouldExtract,exports.transformFiles=s.transformFiles;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./listDictionariesPath.cjs`),t=require(`./detectFormatCommand.cjs`),n=require(`./getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.cjs`),r=require(`./init/index.cjs`),i=require(`./installSkills/index.cjs`),a=require(`./listGitFiles.cjs`),o=require(`./listProjects.cjs`),s=require(`./transformFiles/extractDictionaryKey.cjs`),c=require(`./transformFiles/transformFiles.cjs`);exports.ATTRIBUTES_TO_EXTRACT=c.ATTRIBUTES_TO_EXTRACT,exports.SKILLS=i.SKILLS,exports.SKILLS_METADATA=i.SKILLS_METADATA,exports.detectFormatCommand=t.detectFormatCommand,exports.extractDictionaryKey=s.extractDictionaryKey,exports.extractIntlayer=c.extractIntlayer,exports.getContentDeclarationFileTemplate=n.getContentDeclarationFileTemplate,exports.initIntlayer=r.initIntlayer,exports.installSkills=i.installSkills,exports.listDictionaries=e.listDictionaries,exports.listDictionariesWithStats=e.listDictionariesWithStats,exports.listGitFiles=a.listGitFiles,exports.listGitLines=a.listGitLines,exports.listProjects=o.listProjects,exports.shouldExtract=c.shouldExtract,exports.transformFiles=c.transformFiles;
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./_virtual/_rolldown/runtime.cjs`);let e=require(`@intlayer/config/utils`),t=null;const n=(n,r)=>{let{formatCommand:i,baseDir:a}=n.content,o=r??(0,e.getProjectRequire)(a);if(i)return i;if(t!==null)return t;try{return o.resolve(`prettier`),t=`prettier --write "{{file}}" --log-level silent`,t}catch{}try{return o.resolve(`biome`),t=`biome format "{{file}}" --write --log-level none`,t}catch{}try{return o.resolve(`eslint`),t=`eslint --fix "{{file}}" --quiet`,t}catch{}t=void 0};exports.detectFormatCommand=n;
2
+ //# sourceMappingURL=detectFormatCommand.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detectFormatCommand.cjs","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":"uJAGI,EAAiD,KAErD,MAAa,GACX,EACA,IACG,CACH,GAAM,CAAE,gBAAe,WAAY,EAAc,QAC3C,EAAiB,IAAA,EAAA,EAAA,mBAAwC,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
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./utils/pLimit.cjs`),t=require(`./utils/parallelize.cjs`),n=require(`./utils/formatter.cjs`),r=require(`./buildIntlayerDictionary/buildIntlayerDictionary.cjs`),i=require(`./utils/autoDecorateContent.cjs`),a=require(`./utils/resolveObjectPromises.cjs`),o=require(`./buildIntlayerDictionary/processContentDeclaration.cjs`),s=require(`./cleanOutputDir.cjs`),c=require(`./utils/getFileHash.cjs`),l=require(`./createDictionaryEntryPoint/generateDictionaryListContent.cjs`),u=require(`./createDictionaryEntryPoint/getBuiltDictionariesPath.cjs`),d=require(`./createDictionaryEntryPoint/getBuiltDynamicDictionariesPath.cjs`),f=require(`./createDictionaryEntryPoint/getBuiltFetchDictionariesPath.cjs`),p=require(`./createDictionaryEntryPoint/getBuiltRemoteDictionariesPath.cjs`),m=require(`./createDictionaryEntryPoint/getBuiltUnmergedDictionariesPath.cjs`),h=require(`./createDictionaryEntryPoint/createDictionaryEntryPoint.cjs`),g=require(`./createType/createModuleAugmentation.cjs`),_=require(`./createType/createType.cjs`),v=require(`./formatDictionary.cjs`),y=require(`./loadDictionaries/loadContentDeclaration.cjs`),b=require(`./utils/sortAlphabetically.cjs`),x=require(`./loadDictionaries/loadRemoteDictionaries.cjs`),S=require(`./loadDictionaries/loadDictionaries.cjs`),C=require(`./loadDictionaries/loadLocalDictionaries.cjs`),w=require(`./listDictionariesPath.cjs`),T=require(`./utils/runOnce.cjs`),E=require(`./writeConfiguration/index.cjs`),D=require(`./prepareIntlayer.cjs`),O=require(`./writeContentDeclaration/detectExportedComponentName.cjs`),k=require(`./writeContentDeclaration/detectFormatCommand.cjs`),A=require(`./writeContentDeclaration/transformJSFile.cjs`),j=require(`./utils/getFormatFromExtension.cjs`),M=require(`./getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.cjs`),N=require(`./writeContentDeclaration/writeJSFile.cjs`),P=require(`./writeContentDeclaration/writeContentDeclaration.cjs`),F=require(`./init/index.cjs`),I=require(`./installSkills/index.cjs`),L=require(`./listGitFiles.cjs`),R=require(`./listProjects.cjs`),z=require(`./transformFiles/extractDictionaryKey.cjs`),B=require(`./transformFiles/transformFiles.cjs`),V=require(`./utils/buildFilesList.cjs`),H=require(`./utils/splitTextByLine.cjs`),U=require(`./utils/getChunk.cjs`),W=require(`./utils/chunkJSON.cjs`),G=require(`./utils/getComponentTransformPattern.cjs`),K=require(`./utils/mergeChunks.cjs`),q=require(`./utils/parallelizeGlobal.cjs`),J=require(`./utils/reduceObjectFormat.cjs`),Y=require(`./utils/runParallel/index.cjs`),X=require(`./utils/verifyIdenticObjectFormat.cjs`),Z=require(`./watcher.cjs`);exports.ATTRIBUTES_TO_EXTRACT=B.ATTRIBUTES_TO_EXTRACT,exports.Queue=e.Queue,exports.SKILLS=I.SKILLS,exports.SKILLS_METADATA=I.SKILLS_METADATA,exports.assembleJSON=W.assembleJSON,exports.autoDecorateContent=i.autoDecorateContent,exports.buildAndWatchIntlayer=Z.buildAndWatchIntlayer,exports.buildDictionary=r.buildDictionary,exports.buildFilesList=V.buildFilesList,exports.chunkJSON=W.chunkJSON,exports.cleanOutputDir=s.cleanOutputDir,exports.createDictionaryEntryPoint=h.createDictionaryEntryPoint,exports.createModuleAugmentation=g.createModuleAugmentation,exports.createTypes=_.createTypes,exports.detectExportedComponentName=O.detectExportedComponentName,exports.detectFormatCommand=k.detectFormatCommand,exports.extractDictionaryKey=z.extractDictionaryKey,exports.extractIntlayer=B.extractIntlayer,exports.formatDictionaries=v.formatDictionaries,exports.formatDictionariesOutput=v.formatDictionariesOutput,exports.formatDictionary=v.formatDictionary,exports.formatDictionaryOutput=v.formatDictionaryOutput,exports.formatDistantDictionaries=x.formatDistantDictionaries,exports.formatLocalDictionaries=y.formatLocalDictionaries,exports.formatLocale=n.formatLocale,exports.formatPath=n.formatPath,exports.generateDictionaryListContent=l.generateDictionaryListContent,exports.generateTypeScriptType=_.generateTypeScriptType,exports.getBuiltDictionariesPath=u.getBuiltDictionariesPath,exports.getBuiltDynamicDictionariesPath=d.getBuiltDynamicDictionariesPath,exports.getBuiltFetchDictionariesPath=f.getBuiltFetchDictionariesPath,exports.getBuiltRemoteDictionariesPath=p.getBuiltRemoteDictionariesPath,exports.getBuiltUnmergedDictionariesPath=m.getBuiltUnmergedDictionariesPath,exports.getChunk=U.getChunk,exports.getComponentTransformPattern=G.getComponentTransformPattern,exports.getComponentTransformPatternSync=G.getComponentTransformPatternSync,exports.getContentDeclarationFileTemplate=M.getContentDeclarationFileTemplate,exports.getExtensionFromFormat=j.getExtensionFromFormat,exports.getFileHash=c.getFileHash,exports.getFormatFromExtension=j.getFormatFromExtension,exports.getGlobalLimiter=q.getGlobalLimiter,exports.getTaskLimiter=q.getTaskLimiter,exports.getTypeName=g.getTypeName,exports.initIntlayer=F.initIntlayer,exports.installSkills=I.installSkills,exports.isCachedConfigurationUpToDate=E.isCachedConfigurationUpToDate,exports.listDictionaries=w.listDictionaries,exports.listDictionariesWithStats=w.listDictionariesWithStats,exports.listGitFiles=L.listGitFiles,exports.listGitLines=L.listGitLines,exports.listProjects=R.listProjects,exports.loadContentDeclarations=y.loadContentDeclarations,exports.loadDictionaries=S.loadDictionaries,exports.loadLocalDictionaries=C.loadLocalDictionaries,exports.loadRemoteDictionaries=x.loadRemoteDictionaries,exports.mergeChunks=K.mergeChunks,exports.pLimit=e.pLimit,exports.parallelize=t.parallelize,exports.parallelizeGlobal=q.parallelizeGlobal,exports.prepareIntlayer=D.prepareIntlayer,exports.processContentDeclaration=o.processContentDeclaration,exports.reconstructFromSingleChunk=W.reconstructFromSingleChunk,exports.reduceObjectFormat=J.reduceObjectFormat,exports.resolveObjectPromises=a.resolveObjectPromises,exports.runOnce=T.runOnce,exports.runParallel=Y.runParallel,exports.shouldExtract=B.shouldExtract,exports.sortAlphabetically=b.sortAlphabetically,exports.splitTextByLines=H.splitTextByLines,exports.transformFiles=B.transformFiles,exports.transformJSFile=A.transformJSFile,exports.verifyIdenticObjectFormat=X.verifyIdenticObjectFormat,exports.watch=Z.watch,exports.writeConfiguration=E.writeConfiguration,exports.writeContentDeclaration=P.writeContentDeclaration,exports.writeJSFile=N.writeJSFile;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./utils/pLimit.cjs`),t=require(`./utils/parallelize.cjs`),n=require(`./utils/formatter.cjs`),r=require(`./buildIntlayerDictionary/buildIntlayerDictionary.cjs`),i=require(`./utils/autoDecorateContent.cjs`),a=require(`./utils/resolveObjectPromises.cjs`),o=require(`./buildIntlayerDictionary/processContentDeclaration.cjs`),s=require(`./cleanOutputDir.cjs`),c=require(`./utils/getFileHash.cjs`),l=require(`./createDictionaryEntryPoint/generateDictionaryListContent.cjs`),u=require(`./createDictionaryEntryPoint/getBuiltDictionariesPath.cjs`),d=require(`./createDictionaryEntryPoint/getBuiltDynamicDictionariesPath.cjs`),f=require(`./createDictionaryEntryPoint/getBuiltFetchDictionariesPath.cjs`),p=require(`./createDictionaryEntryPoint/getBuiltRemoteDictionariesPath.cjs`),m=require(`./createDictionaryEntryPoint/getBuiltUnmergedDictionariesPath.cjs`),h=require(`./createDictionaryEntryPoint/createDictionaryEntryPoint.cjs`),g=require(`./createType/createModuleAugmentation.cjs`),_=require(`./createType/createType.cjs`),v=require(`./formatDictionary.cjs`),y=require(`./loadDictionaries/loadContentDeclaration.cjs`),b=require(`./utils/sortAlphabetically.cjs`),x=require(`./loadDictionaries/loadRemoteDictionaries.cjs`),S=require(`./loadDictionaries/loadDictionaries.cjs`),C=require(`./loadDictionaries/loadLocalDictionaries.cjs`),w=require(`./listDictionariesPath.cjs`),T=require(`./utils/runOnce.cjs`),E=require(`./writeConfiguration/index.cjs`),D=require(`./prepareIntlayer.cjs`),O=require(`./writeContentDeclaration/detectExportedComponentName.cjs`),k=require(`./writeContentDeclaration/transformJSFile.cjs`),A=require(`./utils/getFormatFromExtension.cjs`),j=require(`./detectFormatCommand.cjs`),M=require(`./getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.cjs`),N=require(`./writeContentDeclaration/writeJSFile.cjs`),P=require(`./writeContentDeclaration/writeContentDeclaration.cjs`),F=require(`./init/index.cjs`),I=require(`./installSkills/index.cjs`),L=require(`./listGitFiles.cjs`),R=require(`./listProjects.cjs`),z=require(`./transformFiles/extractDictionaryKey.cjs`),B=require(`./transformFiles/transformFiles.cjs`),V=require(`./utils/buildFilesList.cjs`),H=require(`./utils/splitTextByLine.cjs`),U=require(`./utils/getChunk.cjs`),W=require(`./utils/chunkJSON.cjs`),G=require(`./utils/getComponentTransformPattern.cjs`),K=require(`./utils/mergeChunks.cjs`),q=require(`./utils/parallelizeGlobal.cjs`),J=require(`./utils/reduceObjectFormat.cjs`),Y=require(`./utils/runParallel/index.cjs`),X=require(`./utils/verifyIdenticObjectFormat.cjs`),Z=require(`./watcher.cjs`);exports.ATTRIBUTES_TO_EXTRACT=B.ATTRIBUTES_TO_EXTRACT,exports.Queue=e.Queue,exports.SKILLS=I.SKILLS,exports.SKILLS_METADATA=I.SKILLS_METADATA,exports.assembleJSON=W.assembleJSON,exports.autoDecorateContent=i.autoDecorateContent,exports.buildAndWatchIntlayer=Z.buildAndWatchIntlayer,exports.buildDictionary=r.buildDictionary,exports.buildFilesList=V.buildFilesList,exports.chunkJSON=W.chunkJSON,exports.cleanOutputDir=s.cleanOutputDir,exports.createDictionaryEntryPoint=h.createDictionaryEntryPoint,exports.createModuleAugmentation=g.createModuleAugmentation,exports.createTypes=_.createTypes,exports.detectExportedComponentName=O.detectExportedComponentName,exports.detectFormatCommand=j.detectFormatCommand,exports.extractDictionaryKey=z.extractDictionaryKey,exports.extractIntlayer=B.extractIntlayer,exports.formatDictionaries=v.formatDictionaries,exports.formatDictionariesOutput=v.formatDictionariesOutput,exports.formatDictionary=v.formatDictionary,exports.formatDictionaryOutput=v.formatDictionaryOutput,exports.formatDistantDictionaries=x.formatDistantDictionaries,exports.formatLocalDictionaries=y.formatLocalDictionaries,exports.formatLocale=n.formatLocale,exports.formatPath=n.formatPath,exports.generateDictionaryListContent=l.generateDictionaryListContent,exports.generateTypeScriptType=_.generateTypeScriptType,exports.getBuiltDictionariesPath=u.getBuiltDictionariesPath,exports.getBuiltDynamicDictionariesPath=d.getBuiltDynamicDictionariesPath,exports.getBuiltFetchDictionariesPath=f.getBuiltFetchDictionariesPath,exports.getBuiltRemoteDictionariesPath=p.getBuiltRemoteDictionariesPath,exports.getBuiltUnmergedDictionariesPath=m.getBuiltUnmergedDictionariesPath,exports.getChunk=U.getChunk,exports.getComponentTransformPattern=G.getComponentTransformPattern,exports.getComponentTransformPatternSync=G.getComponentTransformPatternSync,exports.getContentDeclarationFileTemplate=M.getContentDeclarationFileTemplate,exports.getExtensionFromFormat=A.getExtensionFromFormat,exports.getFileHash=c.getFileHash,exports.getFormatFromExtension=A.getFormatFromExtension,exports.getGlobalLimiter=q.getGlobalLimiter,exports.getTaskLimiter=q.getTaskLimiter,exports.getTypeName=g.getTypeName,exports.initIntlayer=F.initIntlayer,exports.installSkills=I.installSkills,exports.isCachedConfigurationUpToDate=E.isCachedConfigurationUpToDate,exports.listDictionaries=w.listDictionaries,exports.listDictionariesWithStats=w.listDictionariesWithStats,exports.listGitFiles=L.listGitFiles,exports.listGitLines=L.listGitLines,exports.listProjects=R.listProjects,exports.loadContentDeclarations=y.loadContentDeclarations,exports.loadDictionaries=S.loadDictionaries,exports.loadLocalDictionaries=C.loadLocalDictionaries,exports.loadRemoteDictionaries=x.loadRemoteDictionaries,exports.mergeChunks=K.mergeChunks,exports.pLimit=e.pLimit,exports.parallelize=t.parallelize,exports.parallelizeGlobal=q.parallelizeGlobal,exports.prepareIntlayer=D.prepareIntlayer,exports.processContentDeclaration=o.processContentDeclaration,exports.reconstructFromSingleChunk=W.reconstructFromSingleChunk,exports.reduceObjectFormat=J.reduceObjectFormat,exports.resolveObjectPromises=a.resolveObjectPromises,exports.runOnce=T.runOnce,exports.runParallel=Y.runParallel,exports.shouldExtract=B.shouldExtract,exports.sortAlphabetically=b.sortAlphabetically,exports.splitTextByLines=H.splitTextByLines,exports.transformFiles=B.transformFiles,exports.transformJSFile=k.transformJSFile,exports.verifyIdenticObjectFormat=X.verifyIdenticObjectFormat,exports.watch=Z.watch,exports.writeConfiguration=E.writeConfiguration,exports.writeContentDeclaration=P.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(`../initConfig/index.cjs`),t=require(`./utils/configManipulation.cjs`),n=require(`./utils/fileSystem.cjs`),r=require(`./utils/jsonParser.cjs`),i=require(`./utils/tsConfig.cjs`);let a=require(`@intlayer/config/node`),o=require(`@intlayer/config/logger`),s=require(`@intlayer/config/utils`);const c={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`},l=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 c.Lynx;if(t[`react-native`]||t.expo)return c.ReactNativeAndExpo;if(t.next){let e=t.next;return n(e,14)?c.NextJS_14:n(e,15)?c.NextJS_15:c.NextJS}if(t.nuxt)return c.NuxtAndVue;if(t.astro)return c.Astro;if(t[`@sveltejs/kit`])return c.SvelteKit;if(t[`@tanstack/react-router`])return c.TanStackRouter;let r=t[`react-router`];if(r&&typeof r==`string`){if(t[`@react-router/fs-routes`])return c.ViteAndReact_ReactRouterV7_FSRoutes;if(n(r,7))return c.ViteAndReact_ReactRouterV7}return t.vite?t.vue?c.ViteAndVue:t[`solid-js`]?c.ViteAndSolid:t.svelte?c.ViteAndSvelte:t.preact?c.ViteAndPreact:c.ViteAndReact:t[`react-scripts`]?c.CRA:t[`@angular/core`]?c.Angular:t[`@nestjs/core`]?c.NestJS:t.express?c.Express:t.fastify?c.Fastify:t[`next-intl`]?c.NextIntl:t[`react-i18next`]||t.i18next?c.ReactI18Next:t[`react-intl`]?c.ReactIntl:t[`next-i18next`]?c.NextI18Next:t[`vue-i18n`]?c.VueI18n:c.Default},u=async c=>{(0,o.logger)((0,o.colorize)(`Checking Intlayer configuration...`,o.ANSIColors.CYAN));let u=`package.json`;await n.exists(c,u)||((0,o.logger)(`${o.x} No ${(0,o.colorizePath)(`package.json`)} found. Please run this script from the project root.`,{level:`error`}),process.exit(1));let d=await n.readFileFromRoot(c,u),f;try{f=JSON.parse(d)}catch{(0,o.logger)(`${o.x} Could not parse ${(0,o.colorizePath)(`package.json`)}.`,{level:`error`}),process.exit(1)}let p=l(f),m=`.gitignore`;if(await n.exists(c,m)){let e=await n.readFileFromRoot(c,m);e.includes(`intlayer`)?(0,o.logger)(`${o.v} ${(0,o.colorizePath)(m)} already includes .intlayer`):(await n.writeFileToRoot(c,m,`${e}\n# Intlayer\n.intlayer\n`),(0,o.logger)(`${o.v} Added ${(0,o.colorizePath)(`.intlayer`)} to ${(0,o.colorizePath)(m)}`))}let h=await i.findTsConfigFiles(c),g=!1;for(let e of h)if(await n.exists(c,e)){g=!0;try{let t=r.parseJSONWithComments(await n.readFileFromRoot(c,e)),i=`.intlayer/**/*.ts`,a=!1;t.include&&(Array.isArray(t.include)&&!t.include.some(e=>e.includes(`.intlayer`))?(t.include.push(i),a=!0):t.include.includes(i)&&(0,o.logger)(`${o.v} ${(0,o.colorizePath)(e)} already includes intlayer types`)),a&&(await n.writeFileToRoot(c,e,JSON.stringify(t,null,2)),(0,o.logger)(`${o.v} Updated ${(0,o.colorizePath)(e)} to include intlayer types`))}catch{(0,o.logger)(`${o.x} Could not parse or update ${(0,o.colorizePath)(e)}. You may need to add ${(0,o.colorizePath)(`.intlayer/types/**/*.ts`)} manually.`,{level:`warn`})}}await e.initConfig(g?`intlayer.config.ts`:`intlayer.config.mjs`,c);let _=!1;for(let e of[`vite.config.ts`,`vite.config.js`,`vite.config.mjs`])if(await n.exists(c,e)){_=!0;let r=await n.readFileFromRoot(c,e);r.includes(`vite-intlayer`)||(await n.writeFileToRoot(c,e,t.updateViteConfig(r,e.split(`.`).pop())),(0,o.logger)(`${o.v} Updated ${(0,o.colorizePath)(e)} to include Intlayer plugin`));break}for(let e of[`next.config.js`,`next.config.mjs`,`next.config.ts`])if(await n.exists(c,e)){_=!0;let r=await n.readFileFromRoot(c,e);r.includes(`next-intlayer`)||(await n.writeFileToRoot(c,e,t.updateNextConfig(r,e.split(`.`).pop())),(0,o.logger)(`${o.v} Updated ${(0,o.colorizePath)(e)} to include Intlayer plugin`));break}for(let e of[`webpack.config.js`,`webpack.config.ts`,`webpack.config.mjs`,`webpack.config.cjs`])if(await n.exists(c,e)){_=!0,(0,o.logger)(`${o.v} Found ${(0,o.colorizePath)(e)}. Make sure to configure aliases manually or use the Intlayer Webpack plugin.`);break}if(!_){let e=(0,s.getAlias)({configuration:(0,a.getConfiguration)({baseDir:c})});if(g&&h.length>0){let t=h.find(e=>e===`tsconfig.json`)||h[0],i=r.parseJSONWithComments(await n.readFileFromRoot(c,t));i.compilerOptions??={},i.compilerOptions.paths??={};let a=!1;Object.entries(e).forEach(([e,t])=>{i.compilerOptions.paths[e]||(i.compilerOptions.paths[e]=[t],a=!0)}),a&&(await n.writeFileToRoot(c,t,JSON.stringify(i,null,2)),(0,o.logger)(`${o.v} Updated ${(0,o.colorizePath)(t)} to include Intlayer aliases`))}else{let t=`jsconfig.json`;if(await n.exists(c,t)){let i=r.parseJSONWithComments(await n.readFileFromRoot(c,t));i.compilerOptions??={},i.compilerOptions.paths??={};let a=!1;Object.entries(e).forEach(([e,t])=>{i.compilerOptions.paths[e]||(i.compilerOptions.paths[e]=[t],a=!0)}),a&&(await n.writeFileToRoot(c,t,JSON.stringify(i,null,2)),(0,o.logger)(`${o.v} Updated ${(0,o.colorizePath)(t)} to include Intlayer aliases`))}else{f.imports??={};let t=!1;Object.entries(e).forEach(([e,n])=>{let r=e.replace(`@`,`#`),i=n.startsWith(`.`)?n:`./${n}`;f.imports[r]||(f.imports[r]=i,t=!0)}),t&&(await n.writeFileToRoot(c,u,JSON.stringify(f,null,2)),(0,o.logger)(`${o.v} Updated ${(0,o.colorizePath)(u)} to include Intlayer imports`))}}}(0,o.logger)(`${o.v} ${(0,o.colorize)(`Intlayer init setup complete.`,o.ANSIColors.GREEN)}`),(0,o.logger)([(0,o.colorize)(`Next →`,o.ANSIColors.MAGENTA),(0,o.colorize)(`Follow the instructions in the documentation to complete the setup:`,o.ANSIColors.GREY_LIGHT),(0,o.colorizePath)(p)])};exports.initIntlayer=u;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../initConfig/index.cjs`),t=require(`./utils/configManipulation.cjs`),n=require(`./utils/fileSystem.cjs`),r=require(`./utils/jsonParser.cjs`),i=require(`./utils/tsConfig.cjs`);let a=require(`@intlayer/config/node`),o=require(`node:path`),s=require(`@intlayer/config/logger`),c=require(`@intlayer/config/utils`);const l={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`},u=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 l.Lynx;if(t[`react-native`]||t.expo)return l.ReactNativeAndExpo;if(t.next){let e=t.next;return n(e,14)?l.NextJS_14:n(e,15)?l.NextJS_15:l.NextJS}if(t.nuxt)return l.NuxtAndVue;if(t.astro)return l.Astro;if(t[`@sveltejs/kit`])return l.SvelteKit;if(t[`@tanstack/react-router`])return l.TanStackRouter;let r=t[`react-router`];if(r&&typeof r==`string`){if(t[`@react-router/fs-routes`])return l.ViteAndReact_ReactRouterV7_FSRoutes;if(n(r,7))return l.ViteAndReact_ReactRouterV7}return t.vite?t.vue?l.ViteAndVue:t[`solid-js`]?l.ViteAndSolid:t.svelte?l.ViteAndSvelte:t.preact?l.ViteAndPreact:l.ViteAndReact:t[`react-scripts`]?l.CRA:t[`@angular/core`]?l.Angular:t[`@nestjs/core`]?l.NestJS:t.express?l.Express:t.fastify?l.Fastify:t[`next-intl`]?l.NextIntl:t[`react-i18next`]||t.i18next?l.ReactI18Next:t[`react-intl`]?l.ReactIntl:t[`next-i18next`]?l.NextI18Next:t[`vue-i18n`]?l.VueI18n:l.Default},d=async l=>{(0,s.logger)((0,s.colorize)(`Checking Intlayer configuration...`,s.ANSIColors.CYAN));let d=`package.json`;await n.exists(l,d)||((0,s.logger)(`${s.x} No ${(0,s.colorizePath)(`package.json`)} found. Please run this script from the project root.`,{level:`error`}),process.exit(1));let f=await n.readFileFromRoot(l,d),p;try{p=JSON.parse(f)}catch{(0,s.logger)(`${s.x} Could not parse ${(0,s.colorizePath)(`package.json`)}.`,{level:`error`}),process.exit(1)}let m=u(p),h=`.gitignore`;if(await n.exists(l,h)){let e=await n.readFileFromRoot(l,h);e.includes(`intlayer`)?(0,s.logger)(`${s.v} ${(0,s.colorizePath)(h)} already includes .intlayer`):(await n.writeFileToRoot(l,h,`${e}\n# Intlayer\n.intlayer\n`),(0,s.logger)(`${s.v} Added ${(0,s.colorizePath)(`.intlayer`)} to ${(0,s.colorizePath)(h)}`))}let g=`.vscode`,_=(0,o.join)(g,`extensions.json`),v=`intlayer.intlayer-vs-code-extension`;try{let e={recommendations:[]};await n.exists(l,_)?e=r.parseJSONWithComments(await n.readFileFromRoot(l,_)):await n.ensureDirectory(l,g),e.recommendations||=[],e.recommendations.includes(v)?(0,s.logger)(`${s.v} ${(0,s.colorizePath)(_)} already includes ${(0,s.colorize)(v,s.ANSIColors.MAGENTA)}`):(e.recommendations.push(v),await n.writeFileToRoot(l,_,JSON.stringify(e,null,2)),(0,s.logger)(`${s.v} Added ${(0,s.colorize)(v,s.ANSIColors.MAGENTA)} to ${(0,s.colorizePath)(_)}`))}catch{(0,s.logger)(`${s.x} Could not update ${(0,s.colorizePath)(_)}. You may need to add ${(0,s.colorize)(v,s.ANSIColors.MAGENTA)} manually.`,{level:`warn`})}let y=await i.findTsConfigFiles(l),b=!1;for(let e of y)if(await n.exists(l,e)){b=!0;try{let t=r.parseJSONWithComments(await n.readFileFromRoot(l,e)),i=`.intlayer/**/*.ts`,a=!1;t.include&&(Array.isArray(t.include)&&!t.include.some(e=>e.includes(`.intlayer`))?(t.include.push(i),a=!0):t.include.includes(i)&&(0,s.logger)(`${s.v} ${(0,s.colorizePath)(e)} already includes intlayer types`)),a&&(await n.writeFileToRoot(l,e,JSON.stringify(t,null,2)),(0,s.logger)(`${s.v} Updated ${(0,s.colorizePath)(e)} to include intlayer types`))}catch{(0,s.logger)(`${s.x} Could not parse or update ${(0,s.colorizePath)(e)}. You may need to add ${(0,s.colorizePath)(`.intlayer/types/**/*.ts`)} manually.`,{level:`warn`})}}await e.initConfig(b?`intlayer.config.ts`:`intlayer.config.mjs`,l);let x=!1;for(let e of[`vite.config.ts`,`vite.config.js`,`vite.config.mjs`])if(await n.exists(l,e)){x=!0;let r=await n.readFileFromRoot(l,e);r.includes(`vite-intlayer`)||(await n.writeFileToRoot(l,e,t.updateViteConfig(r,e.split(`.`).pop())),(0,s.logger)(`${s.v} Updated ${(0,s.colorizePath)(e)} to include Intlayer plugin`));break}for(let e of[`next.config.js`,`next.config.mjs`,`next.config.ts`])if(await n.exists(l,e)){x=!0;let r=await n.readFileFromRoot(l,e);r.includes(`next-intlayer`)||(await n.writeFileToRoot(l,e,t.updateNextConfig(r,e.split(`.`).pop())),(0,s.logger)(`${s.v} Updated ${(0,s.colorizePath)(e)} to include Intlayer plugin`));break}for(let e of[`webpack.config.js`,`webpack.config.ts`,`webpack.config.mjs`,`webpack.config.cjs`])if(await n.exists(l,e)){x=!0,(0,s.logger)(`${s.v} Found ${(0,s.colorizePath)(e)}. Make sure to configure aliases manually or use the Intlayer Webpack plugin.`);break}if(!x){let e=(0,c.getAlias)({configuration:(0,a.getConfiguration)({baseDir:l})});if(b&&y.length>0){let t=y.find(e=>e===`tsconfig.json`)||y[0],i=r.parseJSONWithComments(await n.readFileFromRoot(l,t));i.compilerOptions??={},i.compilerOptions.paths??={};let a=!1;Object.entries(e).forEach(([e,t])=>{i.compilerOptions.paths[e]||(i.compilerOptions.paths[e]=[t],a=!0)}),a&&(await n.writeFileToRoot(l,t,JSON.stringify(i,null,2)),(0,s.logger)(`${s.v} Updated ${(0,s.colorizePath)(t)} to include Intlayer aliases`))}else{let t=`jsconfig.json`;if(await n.exists(l,t)){let i=r.parseJSONWithComments(await n.readFileFromRoot(l,t));i.compilerOptions??={},i.compilerOptions.paths??={};let a=!1;Object.entries(e).forEach(([e,t])=>{i.compilerOptions.paths[e]||(i.compilerOptions.paths[e]=[t],a=!0)}),a&&(await n.writeFileToRoot(l,t,JSON.stringify(i,null,2)),(0,s.logger)(`${s.v} Updated ${(0,s.colorizePath)(t)} to include Intlayer aliases`))}else{p.imports??={};let t=!1;Object.entries(e).forEach(([e,n])=>{let r=e.replace(`@`,`#`),i=n.startsWith(`.`)?n:`./${n}`;p.imports[r]||(p.imports[r]=i,t=!0)}),t&&(await n.writeFileToRoot(l,d,JSON.stringify(p,null,2)),(0,s.logger)(`${s.v} Updated ${(0,s.colorizePath)(d)} to include Intlayer imports`))}}}(0,s.logger)(`${s.v} ${(0,s.colorize)(`Intlayer init setup complete.`,s.ANSIColors.GREEN)}`),(0,s.logger)([(0,s.colorize)(`Next →`,s.ANSIColors.MAGENTA),(0,s.colorize)(`Follow the instructions in the documentation to complete the setup:`,s.ANSIColors.GREY_LIGHT),(0,s.colorizePath)(m)])};exports.initIntlayer=d;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["ANSIColors","exists","x","readFileFromRoot","writeFileToRoot","v","findTsConfigFiles","parseJSONWithComments","initConfig","updateViteConfig","updateNextConfig"],"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.cjs","names":["ANSIColors","exists","x","readFileFromRoot","writeFileToRoot","v","parseJSONWithComments","ensureDirectory","findTsConfigFiles","initConfig","updateViteConfig","updateNextConfig"],"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
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`../../_virtual/_rolldown/runtime.cjs`);let e=require(`node:fs/promises`),t=require(`node:path`);const n=async(n,r)=>{try{return await(0,e.access)((0,t.join)(n,r)),!0}catch{return!1}},r=async(n,r)=>await(0,e.readFile)((0,t.join)(n,r),`utf8`),i=async(n,r,i)=>await(0,e.writeFile)((0,t.join)(n,r),i,`utf8`);exports.exists=n,exports.readFileFromRoot=r,exports.writeFileToRoot=i;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`../../_virtual/_rolldown/runtime.cjs`);let e=require(`node:fs/promises`),t=require(`node:path`);const n=async(n,r)=>{try{return await(0,e.access)((0,t.join)(n,r)),!0}catch{return!1}},r=async(n,r)=>await(0,e.readFile)((0,t.join)(n,r),`utf8`),i=async(n,r,i)=>await(0,e.writeFile)((0,t.join)(n,r),i,`utf8`),a=async(n,r)=>{try{await(0,e.mkdir)((0,t.join)(n,r),{recursive:!0})}catch{}};exports.ensureDirectory=a,exports.exists=n,exports.readFileFromRoot=r,exports.writeFileToRoot=i;
2
2
  //# sourceMappingURL=fileSystem.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"fileSystem.cjs","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":"4KAMA,MAAa,EAAS,MAAO,EAAiB,IAAqB,CACjE,GAAI,CAEF,OADA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,MAAkB,EAAS,EAAS,CAAC,CAC9B,QACD,CACN,MAAO,KAOE,EAAmB,MAAO,EAAiB,IACtD,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,MAAoB,EAAS,EAAS,CAAE,OAAO,CAKpC,EAAkB,MAC7B,EACA,EACA,IACG,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,MAAqB,EAAS,EAAS,CAAE,EAAS,OAAO"}
1
+ {"version":3,"file":"fileSystem.cjs","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":"4KAMA,MAAa,EAAS,MAAO,EAAiB,IAAqB,CACjE,GAAI,CAEF,OADA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,MAAkB,EAAS,EAAS,CAAC,CAC9B,QACD,CACN,MAAO,KAOE,EAAmB,MAAO,EAAiB,IACtD,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,MAAoB,EAAS,EAAS,CAAE,OAAO,CAKpC,EAAkB,MAC7B,EACA,EACA,IACG,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,MAAqB,EAAS,EAAS,CAAE,EAAS,OAAO,CAKjD,EAAkB,MAAO,EAAiB,IAAoB,CACzE,GAAI,CACF,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,MAAiB,EAAS,EAAQ,CAAE,CAAE,UAAW,GAAM,CAAC,MAClD"}
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./configManipulation.cjs`),t=require(`./fileSystem.cjs`),n=require(`./jsonParser.cjs`),r=require(`./tsConfig.cjs`);exports.exists=t.exists,exports.findTsConfigFiles=r.findTsConfigFiles,exports.parseJSONWithComments=n.parseJSONWithComments,exports.readFileFromRoot=t.readFileFromRoot,exports.updateNextConfig=e.updateNextConfig,exports.updateViteConfig=e.updateViteConfig,exports.writeFileToRoot=t.writeFileToRoot;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./configManipulation.cjs`),t=require(`./fileSystem.cjs`),n=require(`./jsonParser.cjs`),r=require(`./tsConfig.cjs`);exports.ensureDirectory=t.ensureDirectory,exports.exists=t.exists,exports.findTsConfigFiles=r.findTsConfigFiles,exports.parseJSONWithComments=n.parseJSONWithComments,exports.readFileFromRoot=t.readFileFromRoot,exports.updateNextConfig=e.updateNextConfig,exports.updateViteConfig=e.updateViteConfig,exports.writeFileToRoot=t.writeFileToRoot;
@@ -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":"gnBA2BA,MAAM,EAAsB,CAC1B,OAAQ,iDACR,UAAW,oDACX,UAAW,oDACX,IAAK,2DACL,MAAO,gDACP,aAAc,yDACd,2BACE,yEACF,oCACE,mFACF,WAAY,uDACZ,aAAc,yDACd,cAAe,0DACf,cAAe,0DACf,eAAgB,mDAChB,WAAY,uDACZ,QAAS,kDACT,UAAW,oDACX,mBACE,gEACF,KAAM,yDACN,QAAS,kDACT,OAAQ,iDACR,QAAS,kDACT,QAAS,uCAGT,SAAU,uDACV,aAAc,2DACd,UAAW,wDACX,YAAa,0DACb,QAAS,sDACV,CAKK,EAAuB,GAA6B,CACxD,IAAM,EAAO,CACX,GAAG,EAAY,aACf,GAAG,EAAY,gBAChB,CAMK,GAAa,EAAuB,IACpC,CAAC,GAAiB,OAAO,GAAkB,SAAiB,GAC9C,OAAO,WAAW,EAAM,WAAW,CACxC,KAAK,EAAc,CAIlC,GAAI,EAAK,mBAAqB,EAAK,iBACjC,OAAO,EAAoB,KAE7B,GAAI,EAAK,iBAAmB,EAAK,KAC/B,OAAO,EAAoB,mBAI7B,GAAI,EAAK,KAAM,CACb,IAAM,EAAU,EAAK,KAUrB,OARI,EAAU,EAAS,GAAG,CACjB,EAAoB,UAGzB,EAAU,EAAS,GAAG,CACjB,EAAoB,UAGtB,EAAoB,OAG7B,GAAI,EAAK,KAAM,OAAO,EAAoB,WAC1C,GAAI,EAAK,MAAO,OAAO,EAAoB,MAC3C,GAAI,EAAK,iBAAkB,OAAO,EAAoB,UAGtD,GAAI,EAAK,0BACP,OAAO,EAAoB,eAI7B,IAAM,EAAqB,EAAK,gBAChC,GAAI,GAAsB,OAAO,GAAuB,SAAU,CAEhE,GAAI,EAAK,2BACP,OAAO,EAAoB,oCAI7B,GAAI,EAAU,EAAoB,EAAE,CAClC,OAAO,EAAoB,2BAkC/B,OA7BI,EAAK,KACH,EAAK,IAAY,EAAoB,WACrC,EAAK,YAAoB,EAAoB,aAC7C,EAAK,OAAe,EAAoB,cACxC,EAAK,OAAe,EAAoB,cAGrC,EAAoB,aAIzB,EAAK,iBAAyB,EAAoB,IAClD,EAAK,iBAAyB,EAAoB,QAGlD,EAAK,gBAAwB,EAAoB,OACjD,EAAK,QAAgB,EAAoB,QACzC,EAAK,QAAgB,EAAoB,QAKzC,EAAK,aAAqB,EAAoB,SAC9C,EAAK,kBAAoB,EAAK,QACzB,EAAoB,aACzB,EAAK,cAAsB,EAAoB,UAC/C,EAAK,gBAAwB,EAAoB,YACjD,EAAK,YAAoB,EAAoB,QAE1C,EAAoB,SAMhB,EAAe,KAAO,IAAoB,CACrD,EAAO,EAAS,qCAAsC,EAAW,KAAK,CAAC,CAGvE,IAAM,EAAkB,eAClB,MAAM,EAAO,EAAS,EAAgB,GAC1C,EACE,GAAG,EAAE,MAAM,EAAa,eAAe,CAAC,uDACxC,CAAE,MAAO,QAAS,CACnB,CACD,QAAQ,KAAK,EAAE,EAGjB,IAAM,EAAqB,MAAM,EAAiB,EAAS,EAAgB,CACvE,EACJ,GAAI,CACF,EAAc,KAAK,MAAM,EAAmB,MACtC,CACN,EAAO,GAAG,EAAE,mBAAmB,EAAa,eAAe,CAAC,GAAI,CAC9D,MAAO,QACR,CAAC,CACF,QAAQ,KAAK,EAAE,CAIjB,IAAM,EAAW,EAAoB,EAAY,CAG3C,EAAgB,aACtB,GAAI,MAAM,EAAO,EAAS,EAAc,CAAE,CACxC,IAAM,EAAmB,MAAM,EAAiB,EAAS,EAAc,CAElE,EAAiB,SAAS,WAAW,CAOxC,EAAO,GAAG,EAAE,GAAG,EAAa,EAAc,CAAC,6BAA6B,EALxE,MAAM,EAAgB,EAAS,EADZ,GAAG,EAAiB,2BACkB,CACzD,EACE,GAAG,EAAE,SAAS,EAAa,YAAY,CAAC,MAAM,EAAa,EAAc,GAC1E,EAOL,IAAM,EAAY,UACZ,EAAqB,EAAK,EAAW,kBAAkB,CACvD,EAAc,sCAEpB,GAAI,CACF,IAAI,EAAkD,CACpD,gBAAiB,EAAE,CACpB,CAEG,MAAM,EAAO,EAAS,EAAmB,CAE3C,EAAmB,EADH,MAAM,EAAiB,EAAS,EAAmB,CAClB,CAEjD,MAAM,EAAgB,EAAS,EAAU,CAG3C,AACE,EAAiB,kBAAkB,EAAE,CAGlC,EAAiB,gBAAgB,SAAS,EAAY,CAWzD,EACE,GAAG,EAAE,GAAG,EAAa,EAAmB,CAAC,oBAAoB,EAAS,EAAa,EAAW,QAAQ,GACvG,EAZD,EAAiB,gBAAgB,KAAK,EAAY,CAClD,MAAM,EACJ,EACA,EACA,KAAK,UAAU,EAAkB,KAAM,EAAE,CAC1C,CACD,EACE,GAAG,EAAE,SAAS,EAAS,EAAa,EAAW,QAAQ,CAAC,MAAM,EAAa,EAAmB,GAC/F,OAMG,CACN,EACE,GAAG,EAAE,oBAAoB,EAAa,EAAmB,CAAC,wBAAwB,EAAS,EAAa,EAAW,QAAQ,CAAC,YAC5H,CAAE,MAAO,OAAQ,CAClB,CAIH,IAAM,EAAgB,MAAM,EAAkB,EAAQ,CAClD,EAAc,GAElB,IAAK,IAAM,KAAY,EACrB,GAAI,MAAM,EAAO,EAAS,EAAS,CAAE,CACnC,EAAc,GACd,GAAI,CAEF,IAAM,EAAS,EADK,MAAM,EAAiB,EAAS,EAAS,CACZ,CAC3C,EAAiB,oBAEnB,EAAU,GAET,EAAO,UAGV,MAAM,QAAQ,EAAO,QAAQ,EAC7B,CAAE,EAAO,QAAqB,KAAM,GAClC,EAAQ,SAAS,YAAY,CAC9B,EAED,EAAO,QAAQ,KAAK,EAAe,CACnC,EAAU,IACD,EAAO,QAAQ,SAAS,EAAe,EAChD,EACE,GAAG,EAAE,GAAG,EAAa,EAAS,CAAC,kCAChC,EAGC,IACF,MAAM,EACJ,EACA,EACA,KAAK,UAAU,EAAQ,KAAM,EAAE,CAChC,CACD,EACE,GAAG,EAAE,WAAW,EAAa,EAAS,CAAC,4BACxC,OAEG,CACN,EACE,GAAG,EAAE,6BAA6B,EAAa,EAAS,CAAC,wBAAwB,EAAa,0BAA0B,CAAC,YACzH,CAAE,MAAO,OAAQ,CAClB,EAOP,MAAM,EADS,EAAc,qBAAuB,sBAC3B,EAAQ,CAEjC,IAAI,EAAwB,GAI5B,IAAK,IAAM,IADS,CAAC,iBAAkB,iBAAkB,kBAAkB,CAEzE,GAAI,MAAM,EAAO,EAAS,EAAK,CAAE,CAC/B,EAAwB,GACxB,IAAM,EAAU,MAAM,EAAiB,EAAS,EAAK,CAEhD,EAAQ,SAAS,gBAAgB,GAGpC,MAAM,EAAgB,EAAS,EADR,EAAiB,EADtB,EAAK,MAAM,IAAI,CAAC,KAAK,CACoB,CACP,CACpD,EAAO,GAAG,EAAE,WAAW,EAAa,EAAK,CAAC,6BAA6B,EAEzE,MAMJ,IAAK,IAAM,IADS,CAAC,iBAAkB,kBAAmB,iBAAiB,CAEzE,GAAI,MAAM,EAAO,EAAS,EAAK,CAAE,CAC/B,EAAwB,GACxB,IAAM,EAAU,MAAM,EAAiB,EAAS,EAAK,CAEhD,EAAQ,SAAS,gBAAgB,GAGpC,MAAM,EAAgB,EAAS,EADR,EAAiB,EADtB,EAAK,MAAM,IAAI,CAAC,KAAK,CACoB,CACP,CACpD,EAAO,GAAG,EAAE,WAAW,EAAa,EAAK,CAAC,6BAA6B,EAEzE,MAWJ,IAAK,IAAM,IANY,CACrB,oBACA,oBACA,qBACA,qBACD,CAEC,GAAI,MAAM,EAAO,EAAS,EAAK,CAAE,CAC/B,EAAwB,GACxB,EACE,GAAG,EAAE,SAAS,EACZ,EACD,CAAC,+EACH,CACD,MAIJ,GAAI,CAAC,EAAuB,CAE1B,IAAM,EAAU,EAAS,CAAE,cADL,EAAiB,CAAE,QAAS,EAAS,CAAC,CAClB,CAAC,CAE3C,GAAI,GAAe,EAAc,OAAS,EAAG,CAC3C,IAAM,EACJ,EAAc,KAAM,GAAM,IAAM,gBAAgB,EAAI,EAAc,GAE9D,EAAS,EADS,MAAM,EAAiB,EAAS,EAAa,CAChB,CAErD,EAAO,kBAAoB,EAAE,CAC7B,EAAO,gBAAgB,QAAU,EAAE,CAEnC,IAAI,EAAU,GAEd,OAAO,QAAQ,EAAQ,CAAC,SAAS,CAAC,EAAO,KAAU,CAC5C,EAAO,gBAAgB,MAAM,KAChC,EAAO,gBAAgB,MAAM,GAAS,CAAC,EAAK,CAC5C,EAAU,KAEZ,CAEE,IACF,MAAM,EACJ,EACA,EACA,KAAK,UAAU,EAAQ,KAAM,EAAE,CAChC,CACD,EACE,GAAG,EAAE,WAAW,EACd,EACD,CAAC,8BACH,MAEE,CACL,IAAM,EAAe,gBACrB,GAAI,MAAM,EAAO,EAAS,EAAa,CAAE,CAEvC,IAAM,EAAS,EADS,MAAM,EAAiB,EAAS,EAAa,CAChB,CAErD,EAAO,kBAAoB,EAAE,CAC7B,EAAO,gBAAgB,QAAU,EAAE,CAEnC,IAAI,EAAU,GAEd,OAAO,QAAQ,EAAQ,CAAC,SAAS,CAAC,EAAO,KAAU,CAC5C,EAAO,gBAAgB,MAAM,KAChC,EAAO,gBAAgB,MAAM,GAAS,CAAC,EAAK,CAC5C,EAAU,KAEZ,CAEE,IACF,MAAM,EACJ,EACA,EACA,KAAK,UAAU,EAAQ,KAAM,EAAE,CAChC,CACD,EACE,GAAG,EAAE,WAAW,EACd,EACD,CAAC,8BACH,MAEE,CACL,EAAY,UAAY,EAAE,CAE1B,IAAI,EAAU,GAEd,OAAO,QAAQ,EAAQ,CAAC,SAAS,CAAC,EAAO,KAAU,CACjD,IAAM,EAAc,EAAM,QAAQ,IAAK,IAAI,CACrC,EAAa,EAAK,WAAW,IAAI,CAAG,EAAO,KAAK,IAEjD,EAAY,QAAQ,KACvB,EAAY,QAAQ,GAAe,EACnC,EAAU,KAEZ,CAEE,IACF,MAAM,EACJ,EACA,EACA,KAAK,UAAU,EAAa,KAAM,EAAE,CACrC,CACD,EACE,GAAG,EAAE,WAAW,EACd,EACD,CAAC,8BACH,IAOT,EAAO,GAAG,EAAE,GAAG,EAAS,gCAAiC,EAAW,MAAM,GAAG,CAC7E,EAAO,CACL,EAAS,SAAU,EAAW,QAAQ,CACtC,EACE,sEACA,EAAW,WACZ,CACD,EAAa,EAAS,CACvB,CAAC"}
@@ -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{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
@@ -1 +1 @@
1
- {"version":3,"file":"transformFiles.mjs","names":[],"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.mjs","names":[],"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
- import{detectExportedComponentName as e}from"./detectExportedComponentName.mjs";import{detectFormatCommand as t}from"./detectFormatCommand.mjs";import{transformJSFile as n}from"./transformJSFile.mjs";import{writeJSFile as r}from"./writeJSFile.mjs";import{writeContentDeclaration as i}from"./writeContentDeclaration.mjs";export{e as detectExportedComponentName,t as detectFormatCommand,n as transformJSFile,i as writeContentDeclaration,r as writeJSFile};
1
+ import{detectExportedComponentName as e}from"./detectExportedComponentName.mjs";import{transformJSFile as t}from"./transformJSFile.mjs";import{writeJSFile as n}from"./writeJSFile.mjs";import{writeContentDeclaration as r}from"./writeContentDeclaration.mjs";export{e as detectExportedComponentName,t as transformJSFile,r as writeContentDeclaration,n as writeJSFile};
@@ -1,2 +1,2 @@
1
- import{detectFormatCommand as e}from"./detectFormatCommand.mjs";import{transformJSFile as t}from"./transformJSFile.mjs";import{getFormatFromExtension as n}from"../utils/getFormatFromExtension.mjs";import{getContentDeclarationFileTemplate as r}from"../getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.mjs";import{mkdir as i,readFile as a,rename as o,rm as s,writeFile as c}from"node:fs/promises";import{basename as l,extname as u,join as d}from"node:path";import{getAppLogger as f,logger as p}from"@intlayer/config/logger";import{existsSync as m}from"node:fs";import{execSync as h}from"node:child_process";const g=async(g,_,v)=>{let y={...v.dictionary,..._},b=f(v);if(!m(g)){let e=n(u(g));b(`File does not exist, creating it`,{isVerbose:!0});let t=await r(y.key,e,Object.fromEntries(Object.entries({id:y.id,locale:y.locale,filled:y.filled,fill:y.fill,description:y.description,title:y.title,tags:y.tags,version:y.version,priority:y.priority,importMode:y.importMode}).filter(([,e])=>e!==void 0))),a=v.system?.tempDir;a&&await i(a,{recursive:!0});let f=`${l(g)}.${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`,p=a?d(a,f):`${g}.${f}`;try{await c(p,t,`utf-8`),await o(p,g)}catch(e){try{await s(p,{force:!0})}catch{}throw e}}let x=await a(g,`utf-8`);if(x===``){let e=n(u(g));x=await r(y.key,e)}let S=await t(x,_),C=v.system?.tempDir;C&&await i(C,{recursive:!0});let w=`${l(g)}.${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`,T=C?d(C,w):`${g}.${w}`;try{await c(T,S,`utf-8`),await o(T,g),p(`Successfully updated ${g}`,{level:`info`,isVerbose:!0})}catch(e){try{await s(T,{force:!0})}catch{}let t=e;throw p(`Failed to write updated file: ${g}`,{level:`error`}),Error(`Failed to write updated file ${g}: ${t.message}`)}let E=e(v);if(E)try{h(E.replace(`{{file}}`,g),{stdio:`inherit`,cwd:v.content.baseDir})}catch(e){console.error(e)}};export{g as writeJSFile};
1
+ import{transformJSFile as e}from"./transformJSFile.mjs";import{getFormatFromExtension as t}from"../utils/getFormatFromExtension.mjs";import{detectFormatCommand as n}from"../detectFormatCommand.mjs";import{getContentDeclarationFileTemplate as r}from"../getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.mjs";import{mkdir as i,readFile as a,rename as o,rm as s,writeFile as c}from"node:fs/promises";import{basename as l,extname as u,join as d}from"node:path";import{getAppLogger as f,logger as p}from"@intlayer/config/logger";import{existsSync as m}from"node:fs";import{execSync as h}from"node:child_process";const g=async(g,_,v)=>{let y={...v.dictionary,..._},b=f(v);if(!m(g)){let e=t(u(g));b(`File does not exist, creating it`,{isVerbose:!0});let n=await r(y.key,e,Object.fromEntries(Object.entries({id:y.id,locale:y.locale,filled:y.filled,fill:y.fill,description:y.description,title:y.title,tags:y.tags,version:y.version,priority:y.priority,importMode:y.importMode}).filter(([,e])=>e!==void 0))),a=v.system?.tempDir;a&&await i(a,{recursive:!0});let f=`${l(g)}.${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`,p=a?d(a,f):`${g}.${f}`;try{await c(p,n,`utf-8`),await o(p,g)}catch(e){try{await s(p,{force:!0})}catch{}throw e}}let x=await a(g,`utf-8`);if(x===``){let e=t(u(g));x=await r(y.key,e)}let S=await e(x,_),C=v.system?.tempDir;C&&await i(C,{recursive:!0});let w=`${l(g)}.${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`,T=C?d(C,w):`${g}.${w}`;try{await c(T,S,`utf-8`),await o(T,g),p(`Successfully updated ${g}`,{level:`info`,isVerbose:!0})}catch(e){try{await s(T,{force:!0})}catch{}let t=e;throw p(`Failed to write updated file: ${g}`,{level:`error`}),Error(`Failed to write updated file ${g}: ${t.message}`)}let E=n(v);if(E)try{h(E.replace(`{{file}}`,g),{stdio:`inherit`,cwd:v.content.baseDir})}catch(e){console.error(e)}};export{g as writeJSFile};
2
2
  //# sourceMappingURL=writeJSFile.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"writeJSFile.mjs","names":[],"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":"gnBAoBA,MAAa,EAAc,MACzB,EACA,EACA,IACkB,CAClB,IAAM,EAAmB,CACvB,GAAG,EAAc,WACjB,GAAG,EACJ,CAEK,EAAY,EAAa,EAAc,CAG7C,GAAI,CAAC,EAAW,EAAS,CAAE,CAGzB,IAAM,EAAS,EAFO,EAAQ,EAAS,CAEa,CAEpD,EAAU,mCAAoC,CAC5C,UAAW,GACZ,CAAC,CACF,IAAM,EAAW,MAAM,EACrB,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,MAAM,EAAM,EAAS,CAAE,UAAW,GAAM,CAAC,CAG3C,IAAM,EAAe,GAAG,EAAS,EAAS,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE,CAAC,MAC1F,EAAW,EACb,EAAK,EAAS,EAAa,CAC3B,GAAG,EAAS,GAAG,IACnB,GAAI,CACF,MAAM,EAAU,EAAU,EAAU,QAAQ,CAC5C,MAAM,EAAO,EAAU,EAAS,OACzB,EAAO,CACd,GAAI,CACF,MAAM,EAAG,EAAU,CAAE,MAAO,GAAM,CAAC,MAC7B,EAGR,MAAM,GAIV,IAAI,EAAc,MAAM,EAAS,EAAU,QAAQ,CAEnD,GAAI,IAAgB,GAAI,CACtB,IAAM,EAAS,EAAuB,EAAQ,EAAS,CAAc,CAErE,EAAc,MAAM,EAClB,EAAiB,IACjB,EACD,CAGH,IAAM,EAAY,MAAM,EAAgB,EAAa,EAAW,CAG1D,EAAU,EAAc,QAAQ,QAClC,GACF,MAAM,EAAM,EAAS,CAAE,UAAW,GAAM,CAAC,CAG3C,IAAM,EAAe,GAAG,EAAS,EAAS,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE,CAAC,MAC1F,EAAW,EACb,EAAK,EAAS,EAAa,CAC3B,GAAG,EAAS,GAAG,IACnB,GAAI,CACF,MAAM,EAAU,EAAU,EAAW,QAAQ,CAC7C,MAAM,EAAO,EAAU,EAAS,CAChC,EAAO,wBAAwB,IAAY,CACzC,MAAO,OACP,UAAW,GACZ,CAAC,OACK,EAAO,CACd,GAAI,CACF,MAAM,EAAG,EAAU,CAAE,MAAO,GAAM,CAAC,MAC7B,EAGR,IAAM,EAAM,EAIZ,MAHA,EAAO,iCAAiC,IAAY,CAClD,MAAO,QACR,CAAC,CACQ,MAAM,gCAAgC,EAAS,IAAI,EAAI,UAAU,CAG7E,IAAM,EAAgB,EAAoB,EAAc,CAExD,GAAI,EACF,GAAI,CACF,EAAS,EAAc,QAAQ,WAAY,EAAS,CAAE,CACpD,MAAO,UACP,IAAK,EAAc,QAAQ,QAC5B,CAAC,OACK,EAAO,CACd,QAAQ,MAAM,EAAM"}
1
+ {"version":3,"file":"writeJSFile.mjs","names":[],"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":"inBAoBA,MAAa,EAAc,MACzB,EACA,EACA,IACkB,CAClB,IAAM,EAAmB,CACvB,GAAG,EAAc,WACjB,GAAG,EACJ,CAEK,EAAY,EAAa,EAAc,CAG7C,GAAI,CAAC,EAAW,EAAS,CAAE,CAGzB,IAAM,EAAS,EAFO,EAAQ,EAAS,CAEa,CAEpD,EAAU,mCAAoC,CAC5C,UAAW,GACZ,CAAC,CACF,IAAM,EAAW,MAAM,EACrB,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,MAAM,EAAM,EAAS,CAAE,UAAW,GAAM,CAAC,CAG3C,IAAM,EAAe,GAAG,EAAS,EAAS,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE,CAAC,MAC1F,EAAW,EACb,EAAK,EAAS,EAAa,CAC3B,GAAG,EAAS,GAAG,IACnB,GAAI,CACF,MAAM,EAAU,EAAU,EAAU,QAAQ,CAC5C,MAAM,EAAO,EAAU,EAAS,OACzB,EAAO,CACd,GAAI,CACF,MAAM,EAAG,EAAU,CAAE,MAAO,GAAM,CAAC,MAC7B,EAGR,MAAM,GAIV,IAAI,EAAc,MAAM,EAAS,EAAU,QAAQ,CAEnD,GAAI,IAAgB,GAAI,CACtB,IAAM,EAAS,EAAuB,EAAQ,EAAS,CAAc,CAErE,EAAc,MAAM,EAClB,EAAiB,IACjB,EACD,CAGH,IAAM,EAAY,MAAM,EAAgB,EAAa,EAAW,CAG1D,EAAU,EAAc,QAAQ,QAClC,GACF,MAAM,EAAM,EAAS,CAAE,UAAW,GAAM,CAAC,CAG3C,IAAM,EAAe,GAAG,EAAS,EAAS,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE,CAAC,MAC1F,EAAW,EACb,EAAK,EAAS,EAAa,CAC3B,GAAG,EAAS,GAAG,IACnB,GAAI,CACF,MAAM,EAAU,EAAU,EAAW,QAAQ,CAC7C,MAAM,EAAO,EAAU,EAAS,CAChC,EAAO,wBAAwB,IAAY,CACzC,MAAO,OACP,UAAW,GACZ,CAAC,OACK,EAAO,CACd,GAAI,CACF,MAAM,EAAG,EAAU,CAAE,MAAO,GAAM,CAAC,MAC7B,EAGR,IAAM,EAAM,EAIZ,MAHA,EAAO,iCAAiC,IAAY,CAClD,MAAO,QACR,CAAC,CACQ,MAAM,gCAAgC,EAAS,IAAI,EAAI,UAAU,CAG7E,IAAM,EAAgB,EAAoB,EAAc,CAExD,GAAI,EACF,GAAI,CACF,EAAS,EAAc,QAAQ,WAAY,EAAS,CAAE,CACpD,MAAO,UACP,IAAK,EAAc,QAAQ,QAC5B,CAAC,OACK,EAAO,CACd,QAAQ,MAAM,EAAM"}
@@ -22,10 +22,9 @@ import "./loadDictionaries/index.js";
22
22
  import { prepareIntlayer } from "./prepareIntlayer.js";
23
23
  import { isCachedConfigurationUpToDate, writeConfiguration } from "./writeConfiguration/index.js";
24
24
  import { detectExportedComponentName } from "./writeContentDeclaration/detectExportedComponentName.js";
25
- import { detectFormatCommand } from "./writeContentDeclaration/detectFormatCommand.js";
26
25
  import { DictionaryStatus } from "./writeContentDeclaration/dictionaryStatus.js";
27
26
  import { transformJSFile } from "./writeContentDeclaration/transformJSFile.js";
28
27
  import { writeContentDeclaration } from "./writeContentDeclaration/writeContentDeclaration.js";
29
28
  import { writeJSFile } from "./writeContentDeclaration/writeJSFile.js";
30
29
  import "./writeContentDeclaration/index.js";
31
- export { CreateDictionaryEntryPointOptions, DictionariesStatus, DictionaryStatus, buildDictionary, cleanOutputDir, createDictionaryEntryPoint, createModuleAugmentation, createTypes, detectExportedComponentName, detectFormatCommand, formatDictionaries, formatDictionariesOutput, formatDictionary, formatDictionaryOutput, formatDistantDictionaries, formatLocalDictionaries, generateDictionaryListContent, generateTypeScriptType, getBuiltDictionariesPath, getBuiltDynamicDictionariesPath, getBuiltFetchDictionariesPath, getBuiltRemoteDictionariesPath, getBuiltUnmergedDictionariesPath, getTypeName, isCachedConfigurationUpToDate, loadContentDeclarations, loadDictionaries, loadLocalDictionaries, loadRemoteDictionaries, prepareIntlayer, processContentDeclaration, transformJSFile, writeConfiguration, writeContentDeclaration, writeJSFile };
30
+ export { CreateDictionaryEntryPointOptions, DictionariesStatus, DictionaryStatus, buildDictionary, cleanOutputDir, createDictionaryEntryPoint, createModuleAugmentation, createTypes, detectExportedComponentName, formatDictionaries, formatDictionariesOutput, formatDictionary, formatDictionaryOutput, formatDistantDictionaries, formatLocalDictionaries, generateDictionaryListContent, generateTypeScriptType, getBuiltDictionariesPath, getBuiltDynamicDictionariesPath, getBuiltFetchDictionariesPath, getBuiltRemoteDictionariesPath, getBuiltUnmergedDictionariesPath, getTypeName, isCachedConfigurationUpToDate, loadContentDeclarations, loadDictionaries, loadLocalDictionaries, loadRemoteDictionaries, prepareIntlayer, processContentDeclaration, transformJSFile, writeConfiguration, writeContentDeclaration, writeJSFile };
@@ -1,3 +1,4 @@
1
+ import { detectFormatCommand } from "./detectFormatCommand.js";
1
2
  import { getContentDeclarationFileTemplate } from "./getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.js";
2
3
  import { initIntlayer } from "./init/index.js";
3
4
  import { Platform, SKILLS, SKILLS_METADATA, Skill, installSkills } from "./installSkills/index.js";
@@ -7,4 +8,4 @@ import { ListProjectsOptions, listProjects } from "./listProjects.js";
7
8
  import { extractDictionaryKey } from "./transformFiles/extractDictionaryKey.js";
8
9
  import { ATTRIBUTES_TO_EXTRACT, ExtractIntlayerOptions, PackageName, extractIntlayer, shouldExtract, transformFiles } from "./transformFiles/transformFiles.js";
9
10
  import "./transformFiles/index.js";
10
- export { ATTRIBUTES_TO_EXTRACT, DiffMode, ExtractIntlayerOptions, ListGitFilesOptions, ListGitLinesOptions, ListProjectsOptions, PackageName, Platform, SKILLS, SKILLS_METADATA, Skill, extractDictionaryKey, extractIntlayer, getContentDeclarationFileTemplate, initIntlayer, installSkills, listDictionaries, listDictionariesWithStats, listGitFiles, listGitLines, listProjects, shouldExtract, transformFiles };
11
+ export { ATTRIBUTES_TO_EXTRACT, DiffMode, ExtractIntlayerOptions, ListGitFilesOptions, ListGitLinesOptions, ListProjectsOptions, PackageName, Platform, SKILLS, SKILLS_METADATA, Skill, detectFormatCommand, extractDictionaryKey, extractIntlayer, getContentDeclarationFileTemplate, initIntlayer, installSkills, listDictionaries, listDictionariesWithStats, listGitFiles, listGitLines, listProjects, shouldExtract, transformFiles };
@@ -1,6 +1,6 @@
1
1
  import { IntlayerConfig } from "@intlayer/types";
2
2
 
3
- //#region src/writeContentDeclaration/detectFormatCommand.d.ts
3
+ //#region src/detectFormatCommand.d.ts
4
4
  declare const detectFormatCommand: (configuration: IntlayerConfig, projectRequireProp?: NodeJS.Require) => string;
5
5
  //#endregion
6
6
  export { detectFormatCommand };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detectFormatCommand.d.ts","names":[],"sources":["../../src/detectFormatCommand.ts"],"mappings":";;;cAKa,mBAAA,GACX,aAAA,EAAe,cAAA,EACf,kBAAA,GAAqB,MAAA,CAAO,OAAA"}
@@ -18,12 +18,12 @@ import { formatDistantDictionaries, loadRemoteDictionaries } from "./loadDiction
18
18
  import { prepareIntlayer } from "./prepareIntlayer.js";
19
19
  import { isCachedConfigurationUpToDate, writeConfiguration } from "./writeConfiguration/index.js";
20
20
  import { detectExportedComponentName } from "./writeContentDeclaration/detectExportedComponentName.js";
21
- import { detectFormatCommand } from "./writeContentDeclaration/detectFormatCommand.js";
22
21
  import { DictionaryStatus } from "./writeContentDeclaration/dictionaryStatus.js";
23
22
  import { transformJSFile } from "./writeContentDeclaration/transformJSFile.js";
24
23
  import { writeContentDeclaration } from "./writeContentDeclaration/writeContentDeclaration.js";
25
24
  import { writeJSFile } from "./writeContentDeclaration/writeJSFile.js";
26
25
  import "./build.js";
26
+ import { detectFormatCommand } from "./detectFormatCommand.js";
27
27
  import { Extension, Format, getExtensionFromFormat, getFormatFromExtension } from "./utils/getFormatFromExtension.js";
28
28
  import { getContentDeclarationFileTemplate } from "./getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.js";
29
29
  import { initIntlayer } from "./init/index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/init/index.ts"],"mappings":";;AAgKA;;cAAa,YAAA,GAAsB,OAAA,aAAe,OAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/init/index.ts"],"mappings":";;AAmKA;;cAAa,YAAA,GAAsB,OAAA,aAAe,OAAA"}
@@ -11,6 +11,10 @@ declare const readFileFromRoot: (rootDir: string, filePath: string) => Promise<s
11
11
  * Helper to write a file
12
12
  */
13
13
  declare const writeFileToRoot: (rootDir: string, filePath: string, content: string) => Promise<void>;
14
+ /**
15
+ * Helper to ensure a directory exists
16
+ */
17
+ declare const ensureDirectory: (rootDir: string, dirPath: string) => Promise<void>;
14
18
  //#endregion
15
- export { exists, readFileFromRoot, writeFileToRoot };
19
+ export { ensureDirectory, exists, readFileFromRoot, writeFileToRoot };
16
20
  //# sourceMappingURL=fileSystem.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fileSystem.d.ts","names":[],"sources":["../../../../src/init/utils/fileSystem.ts"],"mappings":";;AAMA;;cAAa,MAAA,GAAgB,OAAA,UAAiB,QAAA,aAAgB,OAAA;;;;cAYjD,gBAAA,GAA0B,OAAA,UAAiB,QAAA,aAAgB,OAAA;;;AAAxE;cAMa,eAAA,GACX,OAAA,UACA,QAAA,UACA,OAAA,aAAe,OAAA"}
1
+ {"version":3,"file":"fileSystem.d.ts","names":[],"sources":["../../../../src/init/utils/fileSystem.ts"],"mappings":";;AAMA;;cAAa,MAAA,GAAgB,OAAA,UAAiB,QAAA,aAAgB,OAAA;;;;cAYjD,gBAAA,GAA0B,OAAA,UAAiB,QAAA,aAAgB,OAAA;;;AAAxE;cAMa,eAAA,GACX,OAAA,UACA,QAAA,UACA,OAAA,aAAe,OAAA;;;;cAMJ,eAAA,GAAyB,OAAA,UAAiB,OAAA,aAAe,OAAA"}
@@ -1,5 +1,5 @@
1
1
  import { updateNextConfig, updateViteConfig } from "./configManipulation.js";
2
- import { exists, readFileFromRoot, writeFileToRoot } from "./fileSystem.js";
2
+ import { ensureDirectory, exists, readFileFromRoot, writeFileToRoot } from "./fileSystem.js";
3
3
  import { parseJSONWithComments } from "./jsonParser.js";
4
4
  import { findTsConfigFiles } from "./tsConfig.js";
5
- export { exists, findTsConfigFiles, parseJSONWithComments, readFileFromRoot, updateNextConfig, updateViteConfig, writeFileToRoot };
5
+ export { ensureDirectory, exists, findTsConfigFiles, parseJSONWithComments, readFileFromRoot, updateNextConfig, updateViteConfig, writeFileToRoot };
@@ -1,7 +1,6 @@
1
1
  import { detectExportedComponentName } from "./detectExportedComponentName.js";
2
- import { detectFormatCommand } from "./detectFormatCommand.js";
3
2
  import { DictionaryStatus } from "./dictionaryStatus.js";
4
3
  import { transformJSFile } from "./transformJSFile.js";
5
4
  import { writeContentDeclaration } from "./writeContentDeclaration.js";
6
5
  import { writeJSFile } from "./writeJSFile.js";
7
- export { DictionaryStatus, detectExportedComponentName, detectFormatCommand, transformJSFile, writeContentDeclaration, writeJSFile };
6
+ export { DictionaryStatus, detectExportedComponentName, transformJSFile, writeContentDeclaration, writeJSFile };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intlayer/chokidar",
3
- "version": "8.1.7",
3
+ "version": "8.1.8",
4
4
  "private": false,
5
5
  "description": "Uses chokidar to scan and build Intlayer declaration files into dictionaries based on Intlayer configuration.",
6
6
  "keywords": [
@@ -101,13 +101,13 @@
101
101
  "typecheck": "tsc --noEmit --project tsconfig.types.json"
102
102
  },
103
103
  "dependencies": {
104
- "@intlayer/api": "8.1.7",
105
- "@intlayer/config": "8.1.7",
106
- "@intlayer/core": "8.1.7",
107
- "@intlayer/dictionaries-entry": "8.1.7",
108
- "@intlayer/remote-dictionaries-entry": "8.1.7",
109
- "@intlayer/types": "8.1.7",
110
- "@intlayer/unmerged-dictionaries-entry": "8.1.7",
104
+ "@intlayer/api": "8.1.8",
105
+ "@intlayer/config": "8.1.8",
106
+ "@intlayer/core": "8.1.8",
107
+ "@intlayer/dictionaries-entry": "8.1.8",
108
+ "@intlayer/remote-dictionaries-entry": "8.1.8",
109
+ "@intlayer/types": "8.1.8",
110
+ "@intlayer/unmerged-dictionaries-entry": "8.1.8",
111
111
  "chokidar": "3.6.0",
112
112
  "crypto-js": "4.2.0",
113
113
  "defu": "6.1.4",
@@ -129,8 +129,8 @@
129
129
  "zod": "4.3.6"
130
130
  },
131
131
  "peerDependencies": {
132
- "@intlayer/svelte-transformer": "8.1.7",
133
- "@intlayer/vue-transformer": "8.1.7"
132
+ "@intlayer/svelte-transformer": "8.1.8",
133
+ "@intlayer/vue-transformer": "8.1.8"
134
134
  },
135
135
  "peerDependenciesMeta": {
136
136
  "@intlayer/svelte-transformer": {
@@ -1,2 +0,0 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`../_virtual/_rolldown/runtime.cjs`);let e=require(`@intlayer/config/utils`),t=null;const n=(n,r)=>{let{formatCommand:i,baseDir:a}=n.content,o=r??(0,e.getProjectRequire)(a);if(i)return i;if(t!==null)return t;try{return o.resolve(`prettier`),t=`prettier --write "{{file}}" --log-level silent`,t}catch{}try{return o.resolve(`biome`),t=`biome format "{{file}}" --write --log-level none`,t}catch{}try{return o.resolve(`eslint`),t=`eslint --fix "{{file}}" --quiet`,t}catch{}t=void 0};exports.detectFormatCommand=n;
2
- //# sourceMappingURL=detectFormatCommand.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"detectFormatCommand.cjs","names":[],"sources":["../../../src/writeContentDeclaration/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":"wJAGI,EAAiD,KAErD,MAAa,GACX,EACA,IACG,CACH,GAAM,CAAE,gBAAe,WAAY,EAAc,QAC3C,EAAiB,IAAA,EAAA,EAAA,mBAAwC,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 +0,0 @@
1
- {"version":3,"file":"detectFormatCommand.mjs","names":[],"sources":["../../../src/writeContentDeclaration/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 +0,0 @@
1
- {"version":3,"file":"detectFormatCommand.d.ts","names":[],"sources":["../../../src/writeContentDeclaration/detectFormatCommand.ts"],"mappings":";;;cAKa,mBAAA,GACX,aAAA,EAAe,cAAA,EACf,kBAAA,GAAqB,MAAA,CAAO,OAAA"}