@intlayer/chokidar 8.1.3 → 8.1.5

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 (64) hide show
  1. package/dist/cjs/cli.cjs +1 -1
  2. package/dist/cjs/getContentDeclarationFileTemplate/index.cjs +1 -0
  3. package/dist/cjs/index.cjs +1 -1
  4. package/dist/cjs/installSkills/index.cjs +1 -1
  5. package/dist/cjs/listGitFiles.cjs +3 -3
  6. package/dist/cjs/loadDictionaries/loadContentDeclaration.cjs +2 -2
  7. package/dist/cjs/loadDictionaries/loadContentDeclaration.cjs.map +1 -1
  8. package/dist/cjs/loadDictionaries/logTypeScriptErrors.cjs +3 -0
  9. package/dist/cjs/loadDictionaries/logTypeScriptErrors.cjs.map +1 -0
  10. package/dist/cjs/transformFiles/index.cjs +1 -1
  11. package/dist/cjs/transformFiles/transformFiles.cjs +1 -1
  12. package/dist/cjs/transformFiles/transformFiles.cjs.map +1 -1
  13. package/dist/cjs/utils/index.cjs +1 -1
  14. package/dist/cjs/utils/mergeChunks.cjs +2 -0
  15. package/dist/cjs/utils/mergeChunks.cjs.map +1 -0
  16. package/dist/cjs/watcher.cjs +1 -1
  17. package/dist/cjs/watcher.cjs.map +1 -1
  18. package/dist/cjs/writeContentDeclaration/processContentDeclarationContent.cjs +1 -1
  19. package/dist/cjs/writeContentDeclaration/writeContentDeclaration.cjs +1 -1
  20. package/dist/cjs/writeContentDeclaration/writeContentDeclaration.cjs.map +1 -1
  21. package/dist/cjs/writeContentDeclaration/writeJSFile.cjs +1 -1
  22. package/dist/cjs/writeContentDeclaration/writeJSFile.cjs.map +1 -1
  23. package/dist/cjs/writeFileIfChanged.cjs +1 -1
  24. package/dist/cjs/writeFileIfChanged.cjs.map +1 -1
  25. package/dist/esm/cli.mjs +1 -1
  26. package/dist/esm/getContentDeclarationFileTemplate/index.mjs +1 -0
  27. package/dist/esm/index.mjs +1 -1
  28. package/dist/esm/installSkills/index.mjs +1 -1
  29. package/dist/esm/listGitFiles.mjs +3 -3
  30. package/dist/esm/loadDictionaries/loadContentDeclaration.mjs +2 -2
  31. package/dist/esm/loadDictionaries/loadContentDeclaration.mjs.map +1 -1
  32. package/dist/esm/loadDictionaries/logTypeScriptErrors.mjs +3 -0
  33. package/dist/esm/loadDictionaries/logTypeScriptErrors.mjs.map +1 -0
  34. package/dist/esm/transformFiles/index.mjs +1 -1
  35. package/dist/esm/transformFiles/transformFiles.mjs +1 -1
  36. package/dist/esm/transformFiles/transformFiles.mjs.map +1 -1
  37. package/dist/esm/utils/index.mjs +1 -1
  38. package/dist/esm/utils/mergeChunks.mjs +2 -0
  39. package/dist/esm/utils/mergeChunks.mjs.map +1 -0
  40. package/dist/esm/watcher.mjs +1 -1
  41. package/dist/esm/watcher.mjs.map +1 -1
  42. package/dist/esm/writeContentDeclaration/processContentDeclarationContent.mjs +1 -1
  43. package/dist/esm/writeContentDeclaration/writeContentDeclaration.mjs +1 -1
  44. package/dist/esm/writeContentDeclaration/writeContentDeclaration.mjs.map +1 -1
  45. package/dist/esm/writeContentDeclaration/writeJSFile.mjs +1 -1
  46. package/dist/esm/writeContentDeclaration/writeJSFile.mjs.map +1 -1
  47. package/dist/esm/writeFileIfChanged.mjs +1 -1
  48. package/dist/esm/writeFileIfChanged.mjs.map +1 -1
  49. package/dist/types/cli.d.ts +4 -2
  50. package/dist/types/getContentDeclarationFileTemplate/index.d.ts +2 -0
  51. package/dist/types/index.d.ts +6 -3
  52. package/dist/types/loadDictionaries/loadContentDeclaration.d.ts.map +1 -1
  53. package/dist/types/loadDictionaries/logTypeScriptErrors.d.ts +7 -0
  54. package/dist/types/loadDictionaries/logTypeScriptErrors.d.ts.map +1 -0
  55. package/dist/types/transformFiles/index.d.ts +2 -2
  56. package/dist/types/transformFiles/transformFiles.d.ts +1 -5
  57. package/dist/types/transformFiles/transformFiles.d.ts.map +1 -1
  58. package/dist/types/utils/index.d.ts +2 -1
  59. package/dist/types/utils/mergeChunks.d.ts +5 -0
  60. package/dist/types/utils/mergeChunks.d.ts.map +1 -0
  61. package/dist/types/watcher.d.ts.map +1 -1
  62. package/dist/types/writeFileIfChanged.d.ts +4 -2
  63. package/dist/types/writeFileIfChanged.d.ts.map +1 -1
  64. package/package.json +11 -11
package/dist/cjs/cli.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./init/index.cjs`),t=require(`./installSkills/index.cjs`),n=require(`./listGitFiles.cjs`),r=require(`./listProjects.cjs`),i=require(`./transformFiles/extractDictionaryKey.cjs`),a=require(`./transformFiles/transformFiles.cjs`);exports.ATTRIBUTES_TO_EXTRACT=a.ATTRIBUTES_TO_EXTRACT,exports.SKILLS=t.SKILLS,exports.SKILLS_METADATA=t.SKILLS_METADATA,exports.extractDictionaryKey=i.extractDictionaryKey,exports.extractIntlayer=a.extractIntlayer,exports.generateKey=a.generateKey,exports.initIntlayer=e.initIntlayer,exports.installSkills=t.installSkills,exports.listGitFiles=n.listGitFiles,exports.listGitLines=n.listGitLines,exports.listProjects=r.listProjects,exports.shouldExtract=a.shouldExtract,exports.transformFiles=a.transformFiles;
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;
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./getContentDeclarationFileTemplate.cjs`);exports.getContentDeclarationFileTemplate=e.getContentDeclarationFileTemplate;
@@ -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(`./utils/runOnce.cjs`),T=require(`./writeConfiguration/index.cjs`),E=require(`./prepareIntlayer.cjs`),D=require(`./writeContentDeclaration/detectExportedComponentName.cjs`),O=require(`./writeContentDeclaration/detectFormatCommand.cjs`),k=require(`./writeContentDeclaration/transformJSFile.cjs`),A=require(`./utils/getFormatFromExtension.cjs`),j=require(`./writeContentDeclaration/writeJSFile.cjs`),M=require(`./writeContentDeclaration/writeContentDeclaration.cjs`),N=require(`./init/index.cjs`),P=require(`./installSkills/index.cjs`),F=require(`./listGitFiles.cjs`),I=require(`./listProjects.cjs`),L=require(`./transformFiles/extractDictionaryKey.cjs`),R=require(`./transformFiles/transformFiles.cjs`),z=require(`./utils/buildFilesList.cjs`),B=require(`./utils/splitTextByLine.cjs`),V=require(`./utils/getChunk.cjs`),H=require(`./utils/chunkJSON.cjs`),U=require(`./utils/getComponentTransformPattern.cjs`),W=require(`./utils/parallelizeGlobal.cjs`),G=require(`./utils/reduceObjectFormat.cjs`),K=require(`./utils/runParallel/index.cjs`),q=require(`./utils/verifyIdenticObjectFormat.cjs`),J=require(`./watcher.cjs`);exports.ATTRIBUTES_TO_EXTRACT=R.ATTRIBUTES_TO_EXTRACT,exports.Queue=e.Queue,exports.SKILLS=P.SKILLS,exports.SKILLS_METADATA=P.SKILLS_METADATA,exports.assembleJSON=H.assembleJSON,exports.autoDecorateContent=i.autoDecorateContent,exports.buildAndWatchIntlayer=J.buildAndWatchIntlayer,exports.buildDictionary=r.buildDictionary,exports.buildFilesList=z.buildFilesList,exports.chunkJSON=H.chunkJSON,exports.cleanOutputDir=s.cleanOutputDir,exports.createDictionaryEntryPoint=h.createDictionaryEntryPoint,exports.createModuleAugmentation=g.createModuleAugmentation,exports.createTypes=_.createTypes,exports.detectExportedComponentName=D.detectExportedComponentName,exports.detectFormatCommand=O.detectFormatCommand,exports.extractDictionaryKey=L.extractDictionaryKey,exports.extractIntlayer=R.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.generateKey=R.generateKey,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=V.getChunk,exports.getComponentTransformPattern=U.getComponentTransformPattern,exports.getComponentTransformPatternSync=U.getComponentTransformPatternSync,exports.getExtensionFromFormat=A.getExtensionFromFormat,exports.getFileHash=c.getFileHash,exports.getFormatFromExtension=A.getFormatFromExtension,exports.getGlobalLimiter=W.getGlobalLimiter,exports.getTaskLimiter=W.getTaskLimiter,exports.getTypeName=g.getTypeName,exports.initIntlayer=N.initIntlayer,exports.installSkills=P.installSkills,exports.isCachedConfigurationUpToDate=T.isCachedConfigurationUpToDate,exports.listGitFiles=F.listGitFiles,exports.listGitLines=F.listGitLines,exports.listProjects=I.listProjects,exports.loadContentDeclarations=y.loadContentDeclarations,exports.loadDictionaries=S.loadDictionaries,exports.loadLocalDictionaries=C.loadLocalDictionaries,exports.loadRemoteDictionaries=x.loadRemoteDictionaries,exports.pLimit=e.pLimit,exports.parallelize=t.parallelize,exports.parallelizeGlobal=W.parallelizeGlobal,exports.prepareIntlayer=E.prepareIntlayer,exports.processContentDeclaration=o.processContentDeclaration,exports.reconstructFromSingleChunk=H.reconstructFromSingleChunk,exports.reduceObjectFormat=G.reduceObjectFormat,exports.resolveObjectPromises=a.resolveObjectPromises,exports.runOnce=w.runOnce,exports.runParallel=K.runParallel,exports.shouldExtract=R.shouldExtract,exports.sortAlphabetically=b.sortAlphabetically,exports.splitTextByLines=B.splitTextByLines,exports.transformFiles=R.transformFiles,exports.transformJSFile=k.transformJSFile,exports.verifyIdenticObjectFormat=q.verifyIdenticObjectFormat,exports.watch=J.watch,exports.writeConfiguration=T.writeConfiguration,exports.writeContentDeclaration=M.writeContentDeclaration,exports.writeJSFile=j.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/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,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`../_virtual/_utils_asset.cjs`);let n=require(`node:path`);n=e.__toESM(n);let r=require(`@intlayer/core/markdown`),i=require(`node:fs`);const a={Usage:`How to use Intlayer in your project`,RemoteContent:`How to use Intlayer with Remote/CMS/Server-side content`,Config:`Intlayer configuration documentation`,Content:`Reference for all Intlayer content node types (t, enu, etc.)`,React:`React-specific syntax and hooks usage`,Angular:`Angular-specific syntax and Injectable Function usage`,NextJS:`Next.js-specific usage (Server & Client components)`,Vue:`Vue-specific composables and syntax`,Preact:`Preact-specific syntax and hooks usage`,Solid:`Integrates Intlayer internationalization with SolidJS components. Use when the user asks to "setup SolidJS i18n", use the "useIntlayer" hook in Solid, or manage locales in a SolidJS application.`,Svelte:`Svelte-specific stores and syntax`,Astro:`Astro-specific usage and getIntlayer`,CLI:`Intlayer CLI commands and usage`},o=Object.keys(a),s={},c={Cursor:`.cursor/skills`,Windsurf:`.windsurf/skills`,Trae:`.trae/skills`,OpenCode:`.opencode/skills`,GitHub:`.github/skills`,Claude:`.claude/skills`,VSCode:`.vscode/skills`,Antigravity:`.agent/skills`,Augment:`.augment/skills`,OpenClaw:`skills`,Cline:`.cline/skills`,CodeBuddy:`.codebuddy/skills`,CommandCode:`.commandcode/skills`,Continue:`.continue/skills`,Crush:`.crush/skills`,Droid:`.factory/skills`,Goose:`.goose/skills`,Junie:`.junie/skills`,IFlow:`.iflow/skills`,KiloCode:`.kilocode/skills`,Kiro:`.kiro/skills`,Kode:`.kode/skills`,MCPJam:`.mcpjam/skills`,MistralVibe:`.vibe/skills`,Mux:`.mux/skills`,OpenHands:`.openhands/skills`,Pi:`.pi/skills`,Qoder:`.qoder/skills`,Qwen:`.qwen/skills`,RooCode:`.roo/skills`,TraeCN:`.trae/skills`,Zencoder:`.zencoder/skills`,Neovate:`.neovate/skills`,Pochi:`.pochi/skills`,Other:`skills`},l=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),u=e=>{let n=`./skills/${s[e]??l(e)}.md`;try{return t.readAsset(n)}catch{return console.warn(`Warning: Could not read asset for skill: ${e} at ${n}`),``}},d=()=>{try{return t.readAsset(`./LICENCE.md`)}catch{return console.warn(`Warning: Could not read LICENCE.md asset`),``}},f=async e=>{let t=await fetch(e);if(!t.ok)throw Error(`Failed to fetch ${e}: ${t.statusText}`);return t.text()},p=async(e,t,a)=>{let o=c[t]??`skills`,p=n.default.join(e,o),m=t!==`VSCode`;await i.promises.mkdir(p,{recursive:!0});let h=[],g=d();for(let e of a){let t=`intlayer-${s[e]??l(e)}`,a=u(e);if(!a)continue;let o=Array.from(new Set(a.match(/https:\/\/intlayer\.org\/doc\/[^\s)]+\.md/g)||[]));if(m){let s=n.default.join(p,t),c=n.default.join(s,`references`);await i.promises.mkdir(c,{recursive:!0}),g&&await i.promises.writeFile(n.default.join(s,`LICENCE.md`),g,`utf-8`);let l=a,u=o.map(async t=>{try{let e=await f(t),n=(0,r.getMarkdownMetadata)(e),i=``;return i=Array.isArray(n.slugs)?n.slugs.filter(e=>e!==`doc`).join(`_`):new URL(t).pathname.split(`/`).filter(e=>e&&e!==`doc`).map(e=>e.replace(`.md`,``)).join(`_`),i=i?`${i}.md`:`index.md`,{url:t,localRefPath:`references/${i}`,fileName:i,content:e,success:!0}}catch(n){return console.warn(`Warning: Failed to download ref ${t} for skill ${e}`,n),{url:t,success:!1}}}),d=await Promise.all(u);for(let e of d)e.success&&e.fileName&&e.content&&e.localRefPath&&(await i.promises.writeFile(n.default.join(c,e.fileName),e.content,`utf-8`),l=l.replaceAll(e.url,e.localRefPath));let m=n.default.join(s,`SKILL.md`);await i.promises.writeFile(m,l,`utf-8`),h.push(`${t}/SKILL.md`)}else{let e=`${t}.md`,r=n.default.join(p,e);await i.promises.writeFile(r,a,`utf-8`),h.push(e)}}return h.length===0?`No skill files were created. Check your asset paths.`:`Created ${h.length} skills in ${p}`};exports.SKILLS=o,exports.SKILLS_METADATA=a,exports.installSkills=p;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`../_virtual/_utils_asset.cjs`);let n=require(`node:path`);n=e.__toESM(n);let r=require(`node:fs`),i=require(`@intlayer/core/markdown`);const a={Usage:`How to use Intlayer in your project`,RemoteContent:`How to use Intlayer with Remote/CMS/Server-side content`,Config:`Intlayer configuration documentation`,Content:`Reference for all Intlayer content node types (t, enu, etc.)`,React:`React-specific syntax and hooks usage`,Angular:`Angular-specific syntax and Injectable Function usage`,NextJS:`Next.js-specific usage (Server & Client components)`,Vue:`Vue-specific composables and syntax`,Preact:`Preact-specific syntax and hooks usage`,Solid:`Integrates Intlayer internationalization with SolidJS components. Use when the user asks to "setup SolidJS i18n", use the "useIntlayer" hook in Solid, or manage locales in a SolidJS application.`,Svelte:`Svelte-specific stores and syntax`,Astro:`Astro-specific usage and getIntlayer`,CLI:`Intlayer CLI commands and usage`},o=Object.keys(a),s={},c={Cursor:`.cursor/skills`,Windsurf:`.windsurf/skills`,Trae:`.trae/skills`,OpenCode:`.opencode/skills`,GitHub:`.github/skills`,Claude:`.claude/skills`,VSCode:`.vscode/skills`,Antigravity:`.agent/skills`,Augment:`.augment/skills`,OpenClaw:`skills`,Cline:`.cline/skills`,CodeBuddy:`.codebuddy/skills`,CommandCode:`.commandcode/skills`,Continue:`.continue/skills`,Crush:`.crush/skills`,Droid:`.factory/skills`,Goose:`.goose/skills`,Junie:`.junie/skills`,IFlow:`.iflow/skills`,KiloCode:`.kilocode/skills`,Kiro:`.kiro/skills`,Kode:`.kode/skills`,MCPJam:`.mcpjam/skills`,MistralVibe:`.vibe/skills`,Mux:`.mux/skills`,OpenHands:`.openhands/skills`,Pi:`.pi/skills`,Qoder:`.qoder/skills`,Qwen:`.qwen/skills`,RooCode:`.roo/skills`,TraeCN:`.trae/skills`,Zencoder:`.zencoder/skills`,Neovate:`.neovate/skills`,Pochi:`.pochi/skills`,Other:`skills`},l=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),u=e=>{let n=`./skills/${s[e]??l(e)}.md`;try{return t.readAsset(n)}catch{return console.warn(`Warning: Could not read asset for skill: ${e} at ${n}`),``}},d=()=>{try{return t.readAsset(`./LICENCE.md`)}catch{return console.warn(`Warning: Could not read LICENCE.md asset`),``}},f=async e=>{let t=await fetch(e);if(!t.ok)throw Error(`Failed to fetch ${e}: ${t.statusText}`);return t.text()},p=async(e,t,a)=>{let o=c[t]??`skills`,p=n.default.join(e,o),m=t!==`VSCode`;await r.promises.mkdir(p,{recursive:!0});let h=[],g=d();for(let e of a){let t=`intlayer-${s[e]??l(e)}`,a=u(e);if(!a)continue;let o=Array.from(new Set(a.match(/https:\/\/intlayer\.org\/doc\/[^\s)]+\.md/g)||[]));if(m){let s=n.default.join(p,t),c=n.default.join(s,`references`);await r.promises.mkdir(c,{recursive:!0}),g&&await r.promises.writeFile(n.default.join(s,`LICENCE.md`),g,`utf-8`);let l=a,u=o.map(async t=>{try{let e=await f(t),n=(0,i.getMarkdownMetadata)(e),r=``;return r=Array.isArray(n.slugs)?n.slugs.filter(e=>e!==`doc`).join(`_`):new URL(t).pathname.split(`/`).filter(e=>e&&e!==`doc`).map(e=>e.replace(`.md`,``)).join(`_`),r=r?`${r}.md`:`index.md`,{url:t,localRefPath:`references/${r}`,fileName:r,content:e,success:!0}}catch(n){return console.warn(`Warning: Failed to download ref ${t} for skill ${e}`,n),{url:t,success:!1}}}),d=await Promise.all(u);for(let e of d)e.success&&e.fileName&&e.content&&e.localRefPath&&(await r.promises.writeFile(n.default.join(c,e.fileName),e.content,`utf-8`),l=l.replaceAll(e.url,e.localRefPath));let m=n.default.join(s,`SKILL.md`);await r.promises.writeFile(m,l,`utf-8`),h.push(`${t}/SKILL.md`)}else{let e=`${t}.md`,i=n.default.join(p,e);await r.promises.writeFile(i,a,`utf-8`),h.push(e)}}return h.length===0?`No skill files were created. Check your asset paths.`:`Created ${h.length} skills in ${p}`};exports.SKILLS=o,exports.SKILLS_METADATA=a,exports.installSkills=p;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,6 +1,6 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./_virtual/_rolldown/runtime.cjs`);let t=require(`node:path`),n=require(`@intlayer/config/logger`),r=require(`@intlayer/config/built`);r=e.__toESM(r);let i=require(`node:fs`),a=require(`simple-git`);a=e.__toESM(a);const o=async()=>{try{return(await(0,a.default)().revparse([`--show-toplevel`])).trim()}catch(e){return(0,n.getAppLogger)(r.default)(`Error getting git root directory: ${e}`,{level:`error`}),null}},s=async({mode:e,baseRef:n=`origin/main`,currentRef:r=`HEAD`,absolute:i=!0})=>{try{let s=(0,a.default)(),c=new Set;if(e.includes(`untracked`)&&(await s.status()).not_added.forEach(e=>{c.add(e)}),e.includes(`uncommitted`)&&(await s.diff([`--name-only`,`HEAD`])).split(`
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./_virtual/_rolldown/runtime.cjs`);let t=require(`node:path`),n=require(`@intlayer/config/logger`),r=require(`node:fs`),i=require(`@intlayer/config/built`);i=e.__toESM(i);let a=require(`simple-git`);a=e.__toESM(a);const o=async()=>{try{return(await(0,a.default)().revparse([`--show-toplevel`])).trim()}catch(e){return(0,n.getAppLogger)(i.default)(`Error getting git root directory: ${e}`,{level:`error`}),null}},s=async({mode:e,baseRef:n=`origin/main`,currentRef:r=`HEAD`,absolute:i=!0})=>{try{let s=(0,a.default)(),c=new Set;if(e.includes(`untracked`)&&(await s.status()).not_added.forEach(e=>{c.add(e)}),e.includes(`uncommitted`)&&(await s.diff([`--name-only`,`HEAD`])).split(`
2
2
  `).filter(Boolean).forEach(e=>{c.add(e)}),e.includes(`unpushed`)&&(await s.diff([`--name-only`,`@{push}...HEAD`])).split(`
3
3
  `).filter(Boolean).forEach(e=>{c.add(e)}),e.includes(`gitDiff`)&&(await s.fetch(n),(await s.diff([`--name-only`,`${n}...${r}`])).split(`
4
- `).filter(Boolean).forEach(e=>{c.add(e)})),i){let e=await o();return e?Array.from(c).map(n=>(0,t.join)(e,n)):[]}return Array.from(c)}catch(e){console.warn(`Failed to get changes list:`,e)}},c=async(e,{mode:t,baseRef:n=`origin/main`,currentRef:r=`HEAD`})=>{let o=(0,a.default)(),s=new Set,c=e=>{let t=/@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/g,n;for(;(n=t.exec(e))!==null;){let e=n[2]?Number(n[2]):1,t=Number(n[3]),r=n[4]?Number(n[4]):1;if(r>0)for(let e=0;e<r;e++)s.add(t+e);e>0&&r===0&&(t>1&&s.add(t-1),s.add(t))}};if(t.includes(`untracked`)&&(await o.status()).not_added.includes(e))try{(0,i.readFileSync)(e,`utf-8`).split(`
5
- `).forEach((e,t)=>{s.add(t+1)})}catch{}return t.includes(`uncommitted`)&&c(await o.diff([`--unified=0`,`HEAD`,`--`,e])),t.includes(`unpushed`)&&c(await o.diff([`--unified=0`,`@{push}...HEAD`,`--`,e])),t.includes(`gitDiff`)&&(await o.fetch(n),c(await o.diff([`--unified=0`,`${n}...${r}`,`--`,e]))),Array.from(s).sort((e,t)=>e-t)};exports.listGitFiles=s,exports.listGitLines=c;
4
+ `).filter(Boolean).forEach(e=>{c.add(e)})),i){let e=await o();return e?Array.from(c).map(n=>(0,t.join)(e,n)):[]}return Array.from(c)}catch(e){console.warn(`Failed to get changes list:`,e)}},c=async(e,{mode:t,baseRef:n=`origin/main`,currentRef:i=`HEAD`})=>{let o=(0,a.default)(),s=new Set,c=e=>{let t=/@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/g,n;for(;(n=t.exec(e))!==null;){let e=n[2]?Number(n[2]):1,t=Number(n[3]),r=n[4]?Number(n[4]):1;if(r>0)for(let e=0;e<r;e++)s.add(t+e);e>0&&r===0&&(t>1&&s.add(t-1),s.add(t))}};if(t.includes(`untracked`)&&(await o.status()).not_added.includes(e))try{(0,r.readFileSync)(e,`utf-8`).split(`
5
+ `).forEach((e,t)=>{s.add(t+1)})}catch{}return t.includes(`uncommitted`)&&c(await o.diff([`--unified=0`,`HEAD`,`--`,e])),t.includes(`unpushed`)&&c(await o.diff([`--unified=0`,`@{push}...HEAD`,`--`,e])),t.includes(`gitDiff`)&&(await o.fetch(n),c(await o.diff([`--unified=0`,`${n}...${i}`,`--`,e]))),Array.from(s).sort((e,t)=>e-t)};exports.listGitFiles=s,exports.listGitLines=c;
6
6
  //# sourceMappingURL=listGitFiles.cjs.map
@@ -1,3 +1,3 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../utils/parallelize.cjs`),t=require(`../filterInvalidDictionaries.cjs`),n=require(`../buildIntlayerDictionary/processContentDeclaration.cjs`),r=require(`./getIntlayerBundle.cjs`);let i=require(`node:fs/promises`),a=require(`node:path`),o=require(`@intlayer/config/utils`),s=require(`@intlayer/config/file`);const c=(e,t)=>Object.entries(e).map(([e,n])=>({...n,location:n.location??t.dictionary?.location??`local`,localId:`${n.key}::local::${e}`,filePath:e})),l=async(l,u,d)=>{let{build:f,system:p}=u,{set:m,isValid:h,clear:g}=(0,o.cacheDisk)(u,[`intlayer-bundle`],{ttlMs:1e3*60*60*24*5}),_=(0,a.join)(p.cacheDir,`intlayer-bundle.cjs`);await h()||(await(0,i.writeFile)(_,await r.getIntlayerBundle(u)),await m(`ok`));try{let r=l.map(async e=>({relativePath:(0,a.relative)(u.content.baseDir,e),dictionary:await(0,s.loadExternalFile)(e,{projectRequire:f.require??(0,o.getProjectRequire)(),buildOptions:{banner:{js:[`globalThis.INTLAYER_FILE_PATH = '${e}';`,`globalThis.INTLAYER_BASE_DIR = '${u.content.baseDir}';`].join(`
2
- `)}},aliases:{intlayer:_}})})),i=c((await Promise.all(r)).reduce((e,{relativePath:t,dictionary:n})=>(e[t]=n,e),{}),u).filter(e=>e.location!==`remote`),p=i.map(e=>({dictionaryKey:e.key,type:`local`,status:`found`}));return d?.(p),t.filterInvalidDictionaries(await e.parallelize(i,async e=>{if(!e)return;d?.([{dictionaryKey:e.key,type:`local`,status:`building`}]);let t=await n.processContentDeclaration(e,u);if(t)return d?.([{dictionaryKey:t.key,type:`local`,status:`built`}]),t}),u,{checkSchema:!1})}catch{console.error(`Error loading content declarations`),await g()}return[]};exports.formatLocalDictionaries=c,exports.loadContentDeclarations=l;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../utils/parallelize.cjs`),t=require(`../filterInvalidDictionaries.cjs`),n=require(`../buildIntlayerDictionary/processContentDeclaration.cjs`),r=require(`./getIntlayerBundle.cjs`),i=require(`./logTypeScriptErrors.cjs`);let a=require(`node:fs/promises`),o=require(`node:path`),s=require(`@intlayer/config/utils`),c=require(`@intlayer/config/file`);const l=(e,t)=>Object.entries(e).map(([e,n])=>({...n,location:n.location??t.dictionary?.location??`local`,localId:`${n.key}::local::${e}`,filePath:e})),u=async(u,d,f)=>{let{build:p,system:m}=d;p.checkTypes&&i.logTypeScriptErrors(u,d).catch(e=>{console.error(`Error during TypeScript validation:`,e)});let{set:h,isValid:g,clear:_}=(0,s.cacheDisk)(d,[`intlayer-bundle`],{ttlMs:1e3*60*60*24*5}),v=(0,o.join)(m.cacheDir,`intlayer-bundle.cjs`);await g()||(await(0,a.writeFile)(v,await r.getIntlayerBundle(d)),await h(`ok`));try{let r=u.map(async e=>({relativePath:(0,o.relative)(d.content.baseDir,e),dictionary:await(0,c.loadExternalFile)(e,{projectRequire:p.require??(0,s.getProjectRequire)(),buildOptions:{banner:{js:[`globalThis.INTLAYER_FILE_PATH = '${e}';`,`globalThis.INTLAYER_BASE_DIR = '${d.content.baseDir}';`].join(`
2
+ `)}},aliases:{intlayer:v}})})),i=l((await Promise.all(r)).reduce((e,{relativePath:t,dictionary:n})=>(e[t]=n,e),{}),d).filter(e=>e.location!==`remote`),a=i.map(e=>({dictionaryKey:e.key,type:`local`,status:`found`}));return f?.(a),t.filterInvalidDictionaries(await e.parallelize(i,async e=>{if(!e)return;f?.([{dictionaryKey:e.key,type:`local`,status:`building`}]);let t=await n.processContentDeclaration(e,d);if(t)return f?.([{dictionaryKey:t.key,type:`local`,status:`built`}]),t}),d,{checkSchema:!1})}catch{console.error(`Error loading content declarations`),await _()}return[]};exports.formatLocalDictionaries=l,exports.loadContentDeclarations=u;
3
3
  //# sourceMappingURL=loadContentDeclaration.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"loadContentDeclaration.cjs","names":["getIntlayerBundle","filterInvalidDictionaries","parallelize","processContentDeclaration"],"sources":["../../../src/loadDictionaries/loadContentDeclaration.ts"],"sourcesContent":["import { writeFile } from 'node:fs/promises';\nimport { join, relative } from 'node:path';\nimport { loadExternalFile } from '@intlayer/config/file';\nimport { cacheDisk, getProjectRequire } from '@intlayer/config/utils';\nimport type { Dictionary, IntlayerConfig } from '@intlayer/types';\nimport { processContentDeclaration } from '../buildIntlayerDictionary/processContentDeclaration';\nimport { filterInvalidDictionaries } from '../filterInvalidDictionaries';\nimport { parallelize } from '../utils/parallelize';\nimport { getIntlayerBundle } from './getIntlayerBundle';\nimport type { DictionariesStatus } from './loadDictionaries';\n\nexport const formatLocalDictionaries = (\n dictionariesRecord: Record<string, Dictionary>,\n configuration: IntlayerConfig\n): Dictionary[] =>\n Object.entries(dictionariesRecord).map(([relativePath, dict]) => ({\n ...dict,\n location: dict.location ?? configuration.dictionary?.location ?? 'local',\n localId: `${dict.key}::local::${relativePath}`,\n filePath: relativePath,\n }));\n\nexport const loadContentDeclarations = async (\n contentDeclarationFilePath: string[],\n configuration: IntlayerConfig,\n onStatusUpdate?: (status: DictionariesStatus[]) => void\n): Promise<Dictionary[]> => {\n const { build, system } = configuration;\n\n const { set, isValid, clear } = cacheDisk(\n configuration,\n ['intlayer-bundle'],\n {\n ttlMs: 1000 * 60 * 60 * 24 * 5, // 5 days\n }\n );\n\n const filePath = join(system.cacheDir, 'intlayer-bundle.cjs');\n const hasIntlayerBundle = await isValid();\n\n // If cache is invalid, write the intlayer bundle to the cache\n if (!hasIntlayerBundle) {\n const intlayerBundle = await getIntlayerBundle(configuration);\n await writeFile(filePath, intlayerBundle);\n await set('ok');\n }\n\n try {\n const dictionariesPromises = contentDeclarationFilePath.map(\n async (path) => {\n const relativePath = relative(configuration.content.baseDir, path);\n\n const dictionary = await loadExternalFile(path, {\n projectRequire: build.require ?? getProjectRequire(),\n buildOptions: {\n banner: {\n js: [\n `globalThis.INTLAYER_FILE_PATH = '${path}';`,\n `globalThis.INTLAYER_BASE_DIR = '${configuration.content.baseDir}';`,\n ].join('\\n'),\n },\n },\n aliases: {\n intlayer: filePath,\n },\n });\n\n return { relativePath, dictionary };\n }\n );\n\n const dictionariesArray = await Promise.all(dictionariesPromises);\n const dictionariesRecord = dictionariesArray.reduce(\n (acc, { relativePath, dictionary }) => {\n acc[relativePath] = dictionary;\n return acc;\n },\n {} as Record<string, Dictionary>\n );\n\n const contentDeclarations: Dictionary[] = formatLocalDictionaries(\n dictionariesRecord,\n configuration\n ).filter((dictionary) => dictionary.location !== 'remote');\n\n const listFoundDictionaries = contentDeclarations.map((declaration) => ({\n dictionaryKey: declaration.key,\n type: 'local' as const,\n status: 'found' as const,\n }));\n\n onStatusUpdate?.(listFoundDictionaries);\n\n const processedDictionaries = await parallelize(\n contentDeclarations,\n async (contentDeclaration): Promise<Dictionary | undefined> => {\n if (!contentDeclaration) {\n return undefined;\n }\n\n onStatusUpdate?.([\n {\n dictionaryKey: contentDeclaration.key,\n type: 'local',\n status: 'building',\n },\n ]);\n\n const processedContentDeclaration = await processContentDeclaration(\n contentDeclaration as Dictionary,\n configuration\n );\n\n if (!processedContentDeclaration) {\n return undefined;\n }\n\n onStatusUpdate?.([\n {\n dictionaryKey: processedContentDeclaration.key,\n type: 'local',\n status: 'built',\n },\n ]);\n\n return processedContentDeclaration;\n }\n );\n\n return filterInvalidDictionaries(processedDictionaries, configuration, {\n checkSchema: false,\n });\n } catch {\n console.error('Error loading content declarations');\n await clear();\n }\n\n return [];\n};\n"],"mappings":"qbAWA,MAAa,GACX,EACA,IAEA,OAAO,QAAQ,EAAmB,CAAC,KAAK,CAAC,EAAc,MAAW,CAChE,GAAG,EACH,SAAU,EAAK,UAAY,EAAc,YAAY,UAAY,QACjE,QAAS,GAAG,EAAK,IAAI,WAAW,IAChC,SAAU,EACX,EAAE,CAEQ,EAA0B,MACrC,EACA,EACA,IAC0B,CAC1B,GAAM,CAAE,QAAO,UAAW,EAEpB,CAAE,MAAK,UAAS,UAAA,EAAA,EAAA,WACpB,EACA,CAAC,kBAAkB,CACnB,CACE,MAAO,IAAO,GAAK,GAAK,GAAK,EAC9B,CACF,CAEK,GAAA,EAAA,EAAA,MAAgB,EAAO,SAAU,sBAAsB,CACnC,MAAM,GAAS,GAKvC,MAAA,EAAA,EAAA,WAAgB,EADO,MAAMA,EAAAA,kBAAkB,EAAc,CACpB,CACzC,MAAM,EAAI,KAAK,EAGjB,GAAI,CACF,IAAM,EAAuB,EAA2B,IACtD,KAAO,KAkBE,CAAE,cAAA,EAAA,EAAA,UAjBqB,EAAc,QAAQ,QAAS,EAAK,CAiB3C,WAfJ,MAAA,EAAA,EAAA,kBAAuB,EAAM,CAC9C,eAAgB,EAAM,UAAA,EAAA,EAAA,oBAA8B,CACpD,aAAc,CACZ,OAAQ,CACN,GAAI,CACF,oCAAoC,EAAK,IACzC,mCAAmC,EAAc,QAAQ,QAAQ,IAClE,CAAC,KAAK;EAAK,CACb,CACF,CACD,QAAS,CACP,SAAU,EACX,CACF,CAAC,CAEiC,EAEtC,CAWK,EAAoC,GAThB,MAAM,QAAQ,IAAI,EAAqB,EACpB,QAC1C,EAAK,CAAE,eAAc,iBACpB,EAAI,GAAgB,EACb,GAET,EAAE,CACH,CAIC,EACD,CAAC,OAAQ,GAAe,EAAW,WAAa,SAAS,CAEpD,EAAwB,EAAoB,IAAK,IAAiB,CACtE,cAAe,EAAY,IAC3B,KAAM,QACN,OAAQ,QACT,EAAE,CAwCH,OAtCA,IAAiB,EAAsB,CAsChCC,EAAAA,0BApCuB,MAAMC,EAAAA,YAClC,EACA,KAAO,IAAwD,CAC7D,GAAI,CAAC,EACH,OAGF,IAAiB,CACf,CACE,cAAe,EAAmB,IAClC,KAAM,QACN,OAAQ,WACT,CACF,CAAC,CAEF,IAAM,EAA8B,MAAMC,EAAAA,0BACxC,EACA,EACD,CAEI,KAYL,OARA,IAAiB,CACf,CACE,cAAe,EAA4B,IAC3C,KAAM,QACN,OAAQ,QACT,CACF,CAAC,CAEK,GAEV,CAEuD,EAAe,CACrE,YAAa,GACd,CAAC,MACI,CACN,QAAQ,MAAM,qCAAqC,CACnD,MAAM,GAAO,CAGf,MAAO,EAAE"}
1
+ {"version":3,"file":"loadContentDeclaration.cjs","names":["getIntlayerBundle","filterInvalidDictionaries","parallelize","processContentDeclaration"],"sources":["../../../src/loadDictionaries/loadContentDeclaration.ts"],"sourcesContent":["import { writeFile } from 'node:fs/promises';\nimport { join, relative } from 'node:path';\nimport { loadExternalFile } from '@intlayer/config/file';\nimport { cacheDisk, getProjectRequire } from '@intlayer/config/utils';\nimport type { Dictionary, IntlayerConfig } from '@intlayer/types';\nimport { processContentDeclaration } from '../buildIntlayerDictionary/processContentDeclaration';\nimport { filterInvalidDictionaries } from '../filterInvalidDictionaries';\nimport { parallelize } from '../utils/parallelize';\nimport { getIntlayerBundle } from './getIntlayerBundle';\nimport type { DictionariesStatus } from './loadDictionaries';\nimport { logTypeScriptErrors } from './logTypeScriptErrors';\n\nexport const formatLocalDictionaries = (\n dictionariesRecord: Record<string, Dictionary>,\n configuration: IntlayerConfig\n): Dictionary[] =>\n Object.entries(dictionariesRecord).map(([relativePath, dict]) => ({\n ...dict,\n location: dict.location ?? configuration.dictionary?.location ?? 'local',\n localId: `${dict.key}::local::${relativePath}`,\n filePath: relativePath,\n }));\n\nexport const loadContentDeclarations = async (\n contentDeclarationFilePath: string[],\n configuration: IntlayerConfig,\n onStatusUpdate?: (status: DictionariesStatus[]) => void\n): Promise<Dictionary[]> => {\n const { build, system } = configuration;\n\n // Check for TypeScript warnings before we build\n if (build.checkTypes) {\n logTypeScriptErrors(contentDeclarationFilePath, configuration).catch(\n (e) => {\n console.error('Error during TypeScript validation:', e);\n }\n );\n }\n\n const { set, isValid, clear } = cacheDisk(\n configuration,\n ['intlayer-bundle'],\n {\n ttlMs: 1000 * 60 * 60 * 24 * 5, // 5 days\n }\n );\n\n const filePath = join(system.cacheDir, 'intlayer-bundle.cjs');\n const hasIntlayerBundle = await isValid();\n\n // If cache is invalid, write the intlayer bundle to the cache\n if (!hasIntlayerBundle) {\n const intlayerBundle = await getIntlayerBundle(configuration);\n await writeFile(filePath, intlayerBundle);\n await set('ok');\n }\n\n try {\n const dictionariesPromises = contentDeclarationFilePath.map(\n async (path) => {\n const relativePath = relative(configuration.content.baseDir, path);\n\n const dictionary = await loadExternalFile(path, {\n projectRequire: build.require ?? getProjectRequire(),\n buildOptions: {\n banner: {\n js: [\n `globalThis.INTLAYER_FILE_PATH = '${path}';`,\n `globalThis.INTLAYER_BASE_DIR = '${configuration.content.baseDir}';`,\n ].join('\\n'),\n },\n },\n aliases: {\n intlayer: filePath,\n },\n });\n\n return { relativePath, dictionary };\n }\n );\n\n const dictionariesArray = await Promise.all(dictionariesPromises);\n const dictionariesRecord = dictionariesArray.reduce(\n (acc, { relativePath, dictionary }) => {\n acc[relativePath] = dictionary;\n return acc;\n },\n {} as Record<string, Dictionary>\n );\n\n const contentDeclarations: Dictionary[] = formatLocalDictionaries(\n dictionariesRecord,\n configuration\n ).filter((dictionary) => dictionary.location !== 'remote');\n\n const listFoundDictionaries = contentDeclarations.map((declaration) => ({\n dictionaryKey: declaration.key,\n type: 'local' as const,\n status: 'found' as const,\n }));\n\n onStatusUpdate?.(listFoundDictionaries);\n\n const processedDictionaries = await parallelize(\n contentDeclarations,\n async (contentDeclaration): Promise<Dictionary | undefined> => {\n if (!contentDeclaration) {\n return undefined;\n }\n\n onStatusUpdate?.([\n {\n dictionaryKey: contentDeclaration.key,\n type: 'local',\n status: 'building',\n },\n ]);\n\n const processedContentDeclaration = await processContentDeclaration(\n contentDeclaration as Dictionary,\n configuration\n );\n\n if (!processedContentDeclaration) {\n return undefined;\n }\n\n onStatusUpdate?.([\n {\n dictionaryKey: processedContentDeclaration.key,\n type: 'local',\n status: 'built',\n },\n ]);\n\n return processedContentDeclaration;\n }\n );\n\n return filterInvalidDictionaries(processedDictionaries, configuration, {\n checkSchema: false,\n });\n } catch {\n console.error('Error loading content declarations');\n await clear();\n }\n\n return [];\n};\n"],"mappings":"4dAYA,MAAa,GACX,EACA,IAEA,OAAO,QAAQ,EAAmB,CAAC,KAAK,CAAC,EAAc,MAAW,CAChE,GAAG,EACH,SAAU,EAAK,UAAY,EAAc,YAAY,UAAY,QACjE,QAAS,GAAG,EAAK,IAAI,WAAW,IAChC,SAAU,EACX,EAAE,CAEQ,EAA0B,MACrC,EACA,EACA,IAC0B,CAC1B,GAAM,CAAE,QAAO,UAAW,EAGtB,EAAM,YACR,EAAA,oBAAoB,EAA4B,EAAc,CAAC,MAC5D,GAAM,CACL,QAAQ,MAAM,sCAAuC,EAAE,EAE1D,CAGH,GAAM,CAAE,MAAK,UAAS,UAAA,EAAA,EAAA,WACpB,EACA,CAAC,kBAAkB,CACnB,CACE,MAAO,IAAO,GAAK,GAAK,GAAK,EAC9B,CACF,CAEK,GAAA,EAAA,EAAA,MAAgB,EAAO,SAAU,sBAAsB,CACnC,MAAM,GAAS,GAKvC,MAAA,EAAA,EAAA,WAAgB,EADO,MAAMA,EAAAA,kBAAkB,EAAc,CACpB,CACzC,MAAM,EAAI,KAAK,EAGjB,GAAI,CACF,IAAM,EAAuB,EAA2B,IACtD,KAAO,KAkBE,CAAE,cAAA,EAAA,EAAA,UAjBqB,EAAc,QAAQ,QAAS,EAAK,CAiB3C,WAfJ,MAAA,EAAA,EAAA,kBAAuB,EAAM,CAC9C,eAAgB,EAAM,UAAA,EAAA,EAAA,oBAA8B,CACpD,aAAc,CACZ,OAAQ,CACN,GAAI,CACF,oCAAoC,EAAK,IACzC,mCAAmC,EAAc,QAAQ,QAAQ,IAClE,CAAC,KAAK;EAAK,CACb,CACF,CACD,QAAS,CACP,SAAU,EACX,CACF,CAAC,CAEiC,EAEtC,CAWK,EAAoC,GAThB,MAAM,QAAQ,IAAI,EAAqB,EACpB,QAC1C,EAAK,CAAE,eAAc,iBACpB,EAAI,GAAgB,EACb,GAET,EAAE,CACH,CAIC,EACD,CAAC,OAAQ,GAAe,EAAW,WAAa,SAAS,CAEpD,EAAwB,EAAoB,IAAK,IAAiB,CACtE,cAAe,EAAY,IAC3B,KAAM,QACN,OAAQ,QACT,EAAE,CAwCH,OAtCA,IAAiB,EAAsB,CAsChCC,EAAAA,0BApCuB,MAAMC,EAAAA,YAClC,EACA,KAAO,IAAwD,CAC7D,GAAI,CAAC,EACH,OAGF,IAAiB,CACf,CACE,cAAe,EAAmB,IAClC,KAAM,QACN,OAAQ,WACT,CACF,CAAC,CAEF,IAAM,EAA8B,MAAMC,EAAAA,0BACxC,EACA,EACD,CAEI,KAYL,OARA,IAAiB,CACf,CACE,cAAe,EAA4B,IAC3C,KAAM,QACN,OAAQ,QACT,CACF,CAAC,CAEK,GAEV,CAEuD,EAAe,CACrE,YAAa,GACd,CAAC,MACI,CACN,QAAQ,MAAM,qCAAqC,CACnD,MAAM,GAAO,CAGf,MAAO,EAAE"}
@@ -0,0 +1,3 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`../_virtual/_rolldown/runtime.cjs`);let e=require(`node:path`),t=require(`@intlayer/config`);const n=async(n,r)=>{let i=(0,t.getAppLogger)(r),a=n.filter(t=>{let n=(0,e.extname)(t);return[`.ts`,`.tsx`,`.js`,`.jsx`,`.cjs`,`.mjs`,`.json`].includes(n)});if(a.length===0)return;let o;try{o=(await import(`typescript`)).default||await import(`typescript`)}catch{return}let s=o.findConfigFile(r.content?.baseDir??process.cwd(),o.sys.fileExists,`tsconfig.json`),c={noEmit:!0,allowJs:!0,resolveJsonModule:!0};if(s){let t=o.sys.readFile(s);if(t){let n=o.parseConfigFileTextToJson(s,t);if(!n.error){let{incremental:t,tsBuildInfoFile:r,...i}=o.parseJsonConfigFileContent(n.config,o.sys,(0,e.dirname)(s)).options;c={...c,...i,noEmit:!0}}}}let l=o.createProgram(a,c);a.forEach(e=>{let t=l.getSourceFile(e);t&&o.getPreEmitDiagnostics(l,t).forEach(e=>{let t=o.flattenDiagnosticMessageText(e.messageText,`
2
+ `);if(e.file&&e.start!==void 0){let{line:n,character:r}=e.file.getLineAndCharacterOfPosition(e.start);i(`TS Error in ${e.file.fileName} (${n+1},${r+1}): ${t}`,{level:`warn`})}})})};exports.logTypeScriptErrors=n;
3
+ //# sourceMappingURL=logTypeScriptErrors.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logTypeScriptErrors.cjs","names":[],"sources":["../../../src/loadDictionaries/logTypeScriptErrors.ts"],"sourcesContent":["import { dirname, extname } from 'node:path';\n\nimport { getAppLogger } from '@intlayer/config';\n\nimport type { IntlayerConfig } from '@intlayer/types';\n\nexport const logTypeScriptErrors = async (\n filePaths: string[],\n\n configuration: IntlayerConfig\n) => {\n const appLogger = getAppLogger(configuration);\n\n const filesToCheck = filePaths.filter((path) => {\n const ext = extname(path);\n\n return ['.ts', '.tsx', '.js', '.jsx', '.cjs', '.mjs', '.json'].includes(\n ext\n );\n });\n\n if (filesToCheck.length === 0) return;\n\n let ts: typeof import('typescript');\n\n try {\n ts = (await import('typescript')).default || (await import('typescript'));\n } catch {\n // TypeScript not installed, skip type checking\n\n return;\n }\n\n const configFileName = ts.findConfigFile(\n configuration.content?.baseDir ?? process.cwd(),\n\n ts.sys.fileExists,\n\n 'tsconfig.json'\n );\n\n let compilerOptions: any = {\n noEmit: true,\n\n allowJs: true,\n\n resolveJsonModule: true,\n };\n\n if (configFileName) {\n const configFileText = ts.sys.readFile(configFileName);\n\n if (configFileText) {\n const configJson = ts.parseConfigFileTextToJson(\n configFileName,\n\n configFileText\n );\n\n if (!configJson.error) {\n const parsedConfig = ts.parseJsonConfigFileContent(\n configJson.config,\n\n ts.sys,\n\n dirname(configFileName)\n );\n\n const { incremental, tsBuildInfoFile, ...restOptions } =\n parsedConfig.options;\n\n compilerOptions = { ...compilerOptions, ...restOptions, noEmit: true };\n }\n }\n }\n\n const program = ts.createProgram(filesToCheck, compilerOptions);\n\n filesToCheck.forEach((filePath) => {\n const sourceFile = program.getSourceFile(filePath);\n\n if (!sourceFile) return;\n\n const diagnostics = ts.getPreEmitDiagnostics(program, sourceFile);\n\n diagnostics.forEach((diagnostic) => {\n const message = ts.flattenDiagnosticMessageText(\n diagnostic.messageText,\n\n '\\n'\n );\n\n if (diagnostic.file && diagnostic.start !== undefined) {\n const { line, character } =\n diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start);\n\n appLogger(\n `TS Error in ${diagnostic.file.fileName} (${line + 1},${character + 1}): ${message}`,\n\n { level: 'warn' }\n );\n }\n });\n });\n};\n"],"mappings":"yKAMA,MAAa,EAAsB,MACjC,EAEA,IACG,CACH,IAAM,GAAA,EAAA,EAAA,cAAyB,EAAc,CAEvC,EAAe,EAAU,OAAQ,GAAS,CAC9C,IAAM,GAAA,EAAA,EAAA,SAAc,EAAK,CAEzB,MAAO,CAAC,MAAO,OAAQ,MAAO,OAAQ,OAAQ,OAAQ,QAAQ,CAAC,SAC7D,EACD,EACD,CAEF,GAAI,EAAa,SAAW,EAAG,OAE/B,IAAI,EAEJ,GAAI,CACF,GAAM,MAAM,OAAO,eAAe,SAAY,MAAM,OAAO,mBACrD,CAGN,OAGF,IAAM,EAAiB,EAAG,eACxB,EAAc,SAAS,SAAW,QAAQ,KAAK,CAE/C,EAAG,IAAI,WAEP,gBACD,CAEG,EAAuB,CACzB,OAAQ,GAER,QAAS,GAET,kBAAmB,GACpB,CAED,GAAI,EAAgB,CAClB,IAAM,EAAiB,EAAG,IAAI,SAAS,EAAe,CAEtD,GAAI,EAAgB,CAClB,IAAM,EAAa,EAAG,0BACpB,EAEA,EACD,CAED,GAAI,CAAC,EAAW,MAAO,CASrB,GAAM,CAAE,cAAa,kBAAiB,GAAG,GARpB,EAAG,2BACtB,EAAW,OAEX,EAAG,KAAA,EAAA,EAAA,SAEK,EAAe,CACxB,CAGc,QAEf,EAAkB,CAAE,GAAG,EAAiB,GAAG,EAAa,OAAQ,GAAM,GAK5E,IAAM,EAAU,EAAG,cAAc,EAAc,EAAgB,CAE/D,EAAa,QAAS,GAAa,CACjC,IAAM,EAAa,EAAQ,cAAc,EAAS,CAE7C,GAEe,EAAG,sBAAsB,EAAS,EAAW,CAErD,QAAS,GAAe,CAClC,IAAM,EAAU,EAAG,6BACjB,EAAW,YAEX;EACD,CAED,GAAI,EAAW,MAAQ,EAAW,QAAU,IAAA,GAAW,CACrD,GAAM,CAAE,OAAM,aACZ,EAAW,KAAK,8BAA8B,EAAW,MAAM,CAEjE,EACE,eAAe,EAAW,KAAK,SAAS,IAAI,EAAO,EAAE,GAAG,EAAY,EAAE,KAAK,IAE3E,CAAE,MAAO,OAAQ,CAClB,GAEH,EACF"}
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./extractDictionaryKey.cjs`),t=require(`./transformFiles.cjs`);exports.ATTRIBUTES_TO_EXTRACT=t.ATTRIBUTES_TO_EXTRACT,exports.extractDictionaryKey=e.extractDictionaryKey,exports.extractIntlayer=t.extractIntlayer,exports.generateKey=t.generateKey,exports.shouldExtract=t.shouldExtract,exports.transformFiles=t.transformFiles;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./extractDictionaryKey.cjs`),t=require(`./transformFiles.cjs`);exports.ATTRIBUTES_TO_EXTRACT=t.ATTRIBUTES_TO_EXTRACT,exports.extractDictionaryKey=e.extractDictionaryKey,exports.extractIntlayer=t.extractIntlayer,exports.shouldExtract=t.shouldExtract,exports.transformFiles=t.transformFiles;
@@ -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`);const d=[`title`,`placeholder`,`alt`,`aria-label`,`label`],f=e=>{let t=e.trim();return!(!t||!t.includes(` `)||!/^[A-Z]/.test(t)||t.startsWith(`{`)||t.startsWith(`v-`))},p=(e,t)=>{let n=e.replace(/\s+/g,` `).replace(/_+/g,` `).replace(/-+/g,` `).replace(/[^a-zA-Z0-9 ]/g,``).trim().split(` `).filter(Boolean).slice(0,5).map((e,t)=>t===0?e.toLowerCase():e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(``);if(n||=`content`,t.has(n)){let e=1;for(;t.has(`${n}${e}`);)e++;n=`${n}${e}`}return n},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(f(i)){let a=p(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(d.includes(i)){let i=e.getInitializer();if(l.Node.isStringLiteral(i)){let a=i.getLiteralValue();if(f(a)){let i=p(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(f(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=p(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,d,_)=>{let v=!d?.declarationOnly,y=!d?.codeOnly,b=(0,i.getConfiguration)(d?.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:p,shouldExtract:f,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:p,shouldExtract:f,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,d?.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=d,exports.extractIntlayer=_,exports.generateKey=p,exports.shouldExtract=f,exports.transformFiles=v;
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;
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 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 * Generate a unique key from text for use as a dictionary key\n */\nexport const generateKey = (\n text: string,\n existingKeys: Set<string>\n): string => {\n const maxWords = 5;\n let key = text\n .replace(/\\s+/g, ' ')\n .replace(/_+/g, ' ')\n .replace(/-+/g, ' ')\n .replace(/[^a-zA-Z0-9 ]/g, '')\n .trim()\n .split(' ')\n .filter(Boolean)\n .slice(0, maxWords)\n .map((word, index) =>\n index === 0\n ? word.toLowerCase()\n : word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n )\n .join('');\n\n if (!key) key = 'content';\n if (existingKeys.has(key)) {\n let i = 1;\n while (existingKeys.has(`${key}${i}`)) i++;\n key = `${key}${i}`;\n }\n return key;\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 { 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 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./pLimit.cjs`),t=require(`./parallelize.cjs`),n=require(`./formatter.cjs`),r=require(`./autoDecorateContent.cjs`),i=require(`./resolveObjectPromises.cjs`),a=require(`./getFileHash.cjs`),o=require(`./sortAlphabetically.cjs`),s=require(`./runOnce.cjs`),c=require(`./getFormatFromExtension.cjs`),l=require(`./buildFilesList.cjs`),u=require(`./splitTextByLine.cjs`),d=require(`./getChunk.cjs`),f=require(`./chunkJSON.cjs`),p=require(`./getComponentTransformPattern.cjs`),m=require(`./parallelizeGlobal.cjs`),h=require(`./reduceObjectFormat.cjs`),g=require(`./runParallel/index.cjs`),_=require(`./verifyIdenticObjectFormat.cjs`);exports.Queue=e.Queue,exports.assembleJSON=f.assembleJSON,exports.autoDecorateContent=r.autoDecorateContent,exports.buildFilesList=l.buildFilesList,exports.chunkJSON=f.chunkJSON,exports.formatLocale=n.formatLocale,exports.formatPath=n.formatPath,exports.getChunk=d.getChunk,exports.getComponentTransformPattern=p.getComponentTransformPattern,exports.getComponentTransformPatternSync=p.getComponentTransformPatternSync,exports.getExtensionFromFormat=c.getExtensionFromFormat,exports.getFileHash=a.getFileHash,exports.getFormatFromExtension=c.getFormatFromExtension,exports.getGlobalLimiter=m.getGlobalLimiter,exports.getTaskLimiter=m.getTaskLimiter,exports.pLimit=e.pLimit,exports.parallelize=t.parallelize,exports.parallelizeGlobal=m.parallelizeGlobal,exports.reconstructFromSingleChunk=f.reconstructFromSingleChunk,exports.reduceObjectFormat=h.reduceObjectFormat,exports.resolveObjectPromises=i.resolveObjectPromises,exports.runOnce=s.runOnce,exports.runParallel=g.runParallel,exports.sortAlphabetically=o.sortAlphabetically,exports.splitTextByLines=u.splitTextByLines,exports.verifyIdenticObjectFormat=_.verifyIdenticObjectFormat;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./pLimit.cjs`),t=require(`./parallelize.cjs`),n=require(`./formatter.cjs`),r=require(`./autoDecorateContent.cjs`),i=require(`./resolveObjectPromises.cjs`),a=require(`./getFileHash.cjs`),o=require(`./sortAlphabetically.cjs`),s=require(`./runOnce.cjs`),c=require(`./getFormatFromExtension.cjs`),l=require(`./buildFilesList.cjs`),u=require(`./splitTextByLine.cjs`),d=require(`./getChunk.cjs`),f=require(`./chunkJSON.cjs`),p=require(`./getComponentTransformPattern.cjs`),m=require(`./mergeChunks.cjs`),h=require(`./parallelizeGlobal.cjs`),g=require(`./reduceObjectFormat.cjs`),_=require(`./runParallel/index.cjs`),v=require(`./verifyIdenticObjectFormat.cjs`);exports.Queue=e.Queue,exports.assembleJSON=f.assembleJSON,exports.autoDecorateContent=r.autoDecorateContent,exports.buildFilesList=l.buildFilesList,exports.chunkJSON=f.chunkJSON,exports.formatLocale=n.formatLocale,exports.formatPath=n.formatPath,exports.getChunk=d.getChunk,exports.getComponentTransformPattern=p.getComponentTransformPattern,exports.getComponentTransformPatternSync=p.getComponentTransformPatternSync,exports.getExtensionFromFormat=c.getExtensionFromFormat,exports.getFileHash=a.getFileHash,exports.getFormatFromExtension=c.getFormatFromExtension,exports.getGlobalLimiter=h.getGlobalLimiter,exports.getTaskLimiter=h.getTaskLimiter,exports.mergeChunks=m.mergeChunks,exports.pLimit=e.pLimit,exports.parallelize=t.parallelize,exports.parallelizeGlobal=h.parallelizeGlobal,exports.reconstructFromSingleChunk=f.reconstructFromSingleChunk,exports.reduceObjectFormat=g.reduceObjectFormat,exports.resolveObjectPromises=i.resolveObjectPromises,exports.runOnce=s.runOnce,exports.runParallel=_.runParallel,exports.sortAlphabetically=o.sortAlphabetically,exports.splitTextByLines=u.splitTextByLines,exports.verifyIdenticObjectFormat=v.verifyIdenticObjectFormat;
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=e=>{if(e.length===0)return{};let n=e[0];for(let r=1;r<e.length;r++)n=t(n,e[r]);return n},t=(e,n)=>{if(e==null)return n;if(n==null)return e;if(Array.isArray(e)&&Array.isArray(n)){let r=Math.max(e.length,n.length),i=[];for(let a=0;a<r;a++)i[a]=t(e[a],n[a]);return i}if(typeof e==`object`&&typeof n==`object`){let r={...e};for(let e of Object.keys(n))r[e]=t(r[e],n[e]);return r}return e};exports.mergeChunks=e;
2
+ //# sourceMappingURL=mergeChunks.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeChunks.cjs","names":[],"sources":["../../../src/utils/mergeChunks.ts"],"sourcesContent":["export const mergeChunks = (chunks: any[]): any => {\n if (chunks.length === 0) return {};\n\n let result = chunks[0];\n\n for (let i = 1; i < chunks.length; i++) {\n result = customChunkMerge(result, chunks[i]);\n }\n\n return result;\n};\n\nconst customChunkMerge = (dest: any, source: any): any => {\n if (dest === undefined || dest === null) return source;\n if (source === undefined || source === null) return dest;\n\n if (Array.isArray(dest) && Array.isArray(source)) {\n const maxLength = Math.max(dest.length, source.length);\n const result = [];\n for (let i = 0; i < maxLength; i++) {\n result[i] = customChunkMerge(dest[i], source[i]);\n }\n return result;\n }\n\n if (typeof dest === 'object' && typeof source === 'object') {\n const result: any = { ...dest };\n for (const key of Object.keys(source)) {\n result[key] = customChunkMerge(result[key], source[key]);\n }\n return result;\n }\n\n // Primitives: if we are here, both are not null.\n // Since chunks shouldn't overlap, we can return dest.\n return dest;\n};\n"],"mappings":"mEAAA,MAAa,EAAe,GAAuB,CACjD,GAAI,EAAO,SAAW,EAAG,MAAO,EAAE,CAElC,IAAI,EAAS,EAAO,GAEpB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAO,OAAQ,IACjC,EAAS,EAAiB,EAAQ,EAAO,GAAG,CAG9C,OAAO,GAGH,GAAoB,EAAW,IAAqB,CACxD,GAAI,GAA+B,KAAM,OAAO,EAChD,GAAI,GAAmC,KAAM,OAAO,EAEpD,GAAI,MAAM,QAAQ,EAAK,EAAI,MAAM,QAAQ,EAAO,CAAE,CAChD,IAAM,EAAY,KAAK,IAAI,EAAK,OAAQ,EAAO,OAAO,CAChD,EAAS,EAAE,CACjB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAW,IAC7B,EAAO,GAAK,EAAiB,EAAK,GAAI,EAAO,GAAG,CAElD,OAAO,EAGT,GAAI,OAAO,GAAS,UAAY,OAAO,GAAW,SAAU,CAC1D,IAAM,EAAc,CAAE,GAAG,EAAM,CAC/B,IAAK,IAAM,KAAO,OAAO,KAAK,EAAO,CACnC,EAAO,GAAO,EAAiB,EAAO,GAAM,EAAO,GAAK,CAE1D,OAAO,EAKT,OAAO"}
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./_virtual/_rolldown/runtime.cjs`);const e=require(`./prepareIntlayer.cjs`),t=require(`./writeContentDeclaration/writeContentDeclaration.cjs`),n=require(`./handleAdditionalContentDeclarationFile.cjs`),r=require(`./handleContentDeclarationFileChange.cjs`),i=require(`./handleContentDeclarationFileMoved.cjs`),a=require(`./handleUnlinkedContentDeclarationFile.cjs`);let o=require(`@intlayer/config/node`),s=require(`node:fs/promises`),c=require(`node:path`),l=require(`@intlayer/config/logger`),u=require(`chokidar`);const d=new Map,f=f=>{let p=f?.configuration??(0,o.getConfiguration)(f?.configOptions),m=(0,l.getAppLogger)(p),{watch:h,watchedFilesPatternWithPath:g,fileExtensions:_}=p.content;return(0,u.watch)(g,{persistent:h,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:1e3,pollInterval:100},ignored:[`**/node_modules/**`,`**/dist/**`,`**/build/**`,`**/.intlayer/**`],...f}).on(`add`,async e=>{let r=(0,c.basename)(e),a=!1,o;for(let[e]of d)if((0,c.basename)(e)===r){o=e;break}if(!o&&d.size===1&&(o=d.keys().next().value),o){let t=d.get(o);t&&(clearTimeout(t.timer),d.delete(o)),a=!0,m(`File moved from ${o} to ${e}`),await i.handleContentDeclarationFileMoved(o,e,p)}if(!a&&await(0,s.readFile)(e,`utf-8`)===``){let n=_.map(e=>e.replace(/\./g,`\\.`)).join(`|`);await t.writeContentDeclaration({key:r.replace(RegExp(`(${n})$`),``),content:{},filePath:e},p)}await n.handleAdditionalContentDeclarationFile(e,p)}).on(`change`,async e=>await r.handleContentDeclarationFileChange(e,p)).on(`unlink`,async e=>{let t=setTimeout(async()=>{d.delete(e),await a.handleUnlinkedContentDeclarationFile(e,p)},200);d.set(e,{timer:t,oldPath:e})}).on(`error`,async t=>{m(`Watcher error: ${t}`,{level:`error`}),m(`Restarting watcher`),await e.prepareIntlayer(p)})},p=async t=>{let{skipPrepare:n,...r}=t??{},i=t?.configuration??(0,o.getConfiguration)(t?.configOptions);n||await e.prepareIntlayer(i,{forceRun:!0}),(i.content.watch||t?.persistent)&&((0,l.getAppLogger)(i)(`Watching Intlayer content declarations`),f({...r,configuration:i}))};exports.buildAndWatchIntlayer=p,exports.watch=f;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./_virtual/_rolldown/runtime.cjs`);const e=require(`./prepareIntlayer.cjs`),t=require(`./writeContentDeclaration/writeContentDeclaration.cjs`),n=require(`./handleAdditionalContentDeclarationFile.cjs`),r=require(`./handleContentDeclarationFileChange.cjs`),i=require(`./handleContentDeclarationFileMoved.cjs`),a=require(`./handleUnlinkedContentDeclarationFile.cjs`);let o=require(`@intlayer/config/node`),s=require(`node:fs/promises`),c=require(`node:path`),l=require(`@intlayer/config/logger`),u=require(`chokidar`);const d=new Map;let f=Promise.resolve();const p=e=>{f=f.then(async()=>{try{await e()}catch(e){console.error(e)}})},m=f=>{let m=f?.configuration??(0,o.getConfiguration)(f?.configOptions),h=(0,l.getAppLogger)(m),{watch:g,watchedFilesPatternWithPath:_,fileExtensions:v}=m.content;return(0,u.watch)(_,{persistent:g,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:1e3,pollInterval:100},ignored:[`**/node_modules/**`,`**/dist/**`,`**/build/**`,`**/.intlayer/**`],...f}).on(`add`,async e=>{let r=(0,c.basename)(e),a=!1,o;for(let[e]of d)if((0,c.basename)(e)===r){o=e;break}if(!o&&d.size===1&&(o=d.keys().next().value),o){let t=d.get(o);t&&(clearTimeout(t.timer),d.delete(o)),a=!0,h(`File moved from ${o} to ${e}`)}p(async()=>{if(a&&o)await i.handleContentDeclarationFileMoved(o,e,m);else{if(await(0,s.readFile)(e,`utf-8`)===``){let n=v.map(e=>e.replace(/\./g,`\\.`)).join(`|`);await t.writeContentDeclaration({key:r.replace(RegExp(`(${n})$`),``),content:{},filePath:e},m)}await n.handleAdditionalContentDeclarationFile(e,m)}})}).on(`change`,async e=>p(async()=>r.handleContentDeclarationFileChange(e,m))).on(`unlink`,async e=>{let t=setTimeout(async()=>{d.delete(e),p(async()=>a.handleUnlinkedContentDeclarationFile(e,m))},200);d.set(e,{timer:t,oldPath:e})}).on(`error`,async t=>{h(`Watcher error: ${t}`,{level:`error`}),h(`Restarting watcher`),await e.prepareIntlayer(m)})},h=async t=>{let{skipPrepare:n,...r}=t??{},i=t?.configuration??(0,o.getConfiguration)(t?.configOptions);n||await e.prepareIntlayer(i,{forceRun:!0}),(i.content.watch||t?.persistent)&&((0,l.getAppLogger)(i)(`Watching Intlayer content declarations`),m({...r,configuration:i}))};exports.buildAndWatchIntlayer=h,exports.watch=m;
2
2
  //# sourceMappingURL=watcher.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"watcher.cjs","names":["handleContentDeclarationFileMoved","writeContentDeclaration","handleAdditionalContentDeclarationFile","handleContentDeclarationFileChange","handleUnlinkedContentDeclarationFile","prepareIntlayer"],"sources":["../../src/watcher.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport { basename } from 'node:path';\nimport { getAppLogger } from '@intlayer/config/logger';\nimport {\n type GetConfigurationOptions,\n getConfiguration,\n} from '@intlayer/config/node';\nimport type { IntlayerConfig } from '@intlayer/types';\n/** @ts-ignore remove error Module '\"chokidar\"' has no exported member 'ChokidarOptions' */\nimport { type ChokidarOptions, watch as chokidarWatch } from 'chokidar';\nimport { handleAdditionalContentDeclarationFile } from './handleAdditionalContentDeclarationFile';\nimport { handleContentDeclarationFileChange } from './handleContentDeclarationFileChange';\nimport { handleContentDeclarationFileMoved } from './handleContentDeclarationFileMoved';\nimport { handleUnlinkedContentDeclarationFile } from './handleUnlinkedContentDeclarationFile';\nimport { prepareIntlayer } from './prepareIntlayer';\nimport { writeContentDeclaration } from './writeContentDeclaration';\n\n// Map to track files that were recently unlinked: oldPath -> { timer, timestamp }\nconst pendingUnlinks = new Map<\n string,\n { timer: NodeJS.Timeout; oldPath: string }\n>();\n\ntype WatchOptions = ChokidarOptions & {\n configuration?: IntlayerConfig;\n configOptions?: GetConfigurationOptions;\n skipPrepare?: boolean;\n};\n\n// Initialize chokidar watcher (non-persistent)\nexport const watch = (options?: WatchOptions) => {\n const configuration: IntlayerConfig =\n options?.configuration ?? getConfiguration(options?.configOptions);\n const appLogger = getAppLogger(configuration);\n\n const {\n watch: isWatchMode,\n watchedFilesPatternWithPath,\n fileExtensions,\n } = configuration.content;\n\n return chokidarWatch(watchedFilesPatternWithPath, {\n persistent: isWatchMode, // Make the watcher persistent\n ignoreInitial: true, // Process existing files\n awaitWriteFinish: {\n stabilityThreshold: 1000,\n pollInterval: 100,\n },\n ignored: [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/.intlayer/**',\n ],\n ...options,\n })\n .on('add', async (filePath) => {\n const fileName = basename(filePath);\n let isMove = false;\n\n // Check if this Add corresponds to a pending Unlink (Move/Rename detection)\n // Heuristic:\n // - Priority A: Exact basename match (Moved to different folder)\n // - Priority B: Single entry in pendingUnlinks (Renamed file)\n let matchedOldPath: string | undefined;\n\n // Search for basename match\n for (const [oldPath] of pendingUnlinks) {\n if (basename(oldPath) === fileName) {\n matchedOldPath = oldPath;\n break;\n }\n }\n\n // If no basename match, but exactly one file was recently unlinked, assume it's a rename\n if (!matchedOldPath && pendingUnlinks.size === 1) {\n matchedOldPath = pendingUnlinks.keys().next().value;\n }\n\n if (matchedOldPath) {\n // It is a move! Cancel the unlink handler\n const pending = pendingUnlinks.get(matchedOldPath);\n if (pending) {\n clearTimeout(pending.timer);\n pendingUnlinks.delete(matchedOldPath);\n }\n\n isMove = true;\n appLogger(`File moved from ${matchedOldPath} to ${filePath}`);\n\n await handleContentDeclarationFileMoved(\n matchedOldPath,\n filePath,\n configuration\n );\n }\n\n // If it's NOT a move, perform standard \"New File\" logic\n if (!isMove) {\n const fileContent = await readFile(filePath, 'utf-8');\n const isEmpty = fileContent === '';\n\n // Fill template content declaration file if it is empty\n if (isEmpty) {\n const extensionPattern = fileExtensions\n .map((ext) => ext.replace(/\\./g, '\\\\.'))\n .join('|');\n const name = fileName.replace(\n new RegExp(`(${extensionPattern})$`),\n ''\n );\n\n await writeContentDeclaration(\n {\n key: name,\n content: {},\n filePath,\n },\n configuration\n );\n }\n }\n\n // Always ensure the file is processed (both for moves and adds)\n await handleAdditionalContentDeclarationFile(filePath, configuration);\n })\n .on(\n 'change',\n async (filePath) =>\n await handleContentDeclarationFileChange(filePath, configuration)\n )\n .on('unlink', async (filePath) => {\n // Delay unlink processing to see if an 'add' event occurs (indicating a move)\n const timer = setTimeout(async () => {\n // If timer fires, the file was genuinely removed\n pendingUnlinks.delete(filePath);\n await handleUnlinkedContentDeclarationFile(filePath, configuration);\n }, 200); // 200ms window to catch the 'add' event\n\n pendingUnlinks.set(filePath, { timer, oldPath: filePath });\n })\n .on('error', async (error) => {\n appLogger(`Watcher error: ${error}`, {\n level: 'error',\n });\n\n appLogger('Restarting watcher');\n\n await prepareIntlayer(configuration);\n });\n};\n\nexport const buildAndWatchIntlayer = async (options?: WatchOptions) => {\n const { skipPrepare, ...rest } = options ?? {};\n const configuration =\n options?.configuration ?? getConfiguration(options?.configOptions);\n\n if (!skipPrepare) {\n await prepareIntlayer(configuration, { forceRun: true });\n }\n\n if (configuration.content.watch || options?.persistent) {\n const appLogger = getAppLogger(configuration);\n\n appLogger('Watching Intlayer content declarations');\n watch({ ...rest, configuration });\n }\n};\n"],"mappings":"+kBAkBA,MAAM,EAAiB,IAAI,IAYd,EAAS,GAA2B,CAC/C,IAAM,EACJ,GAAS,gBAAA,EAAA,EAAA,kBAAkC,GAAS,cAAc,CAC9D,GAAA,EAAA,EAAA,cAAyB,EAAc,CAEvC,CACJ,MAAO,EACP,8BACA,kBACE,EAAc,QAElB,OAAA,EAAA,EAAA,OAAqB,EAA6B,CAChD,WAAY,EACZ,cAAe,GACf,iBAAkB,CAChB,mBAAoB,IACpB,aAAc,IACf,CACD,QAAS,CACP,qBACA,aACA,cACA,kBACD,CACD,GAAG,EACJ,CAAC,CACC,GAAG,MAAO,KAAO,IAAa,CAC7B,IAAM,GAAA,EAAA,EAAA,UAAoB,EAAS,CAC/B,EAAS,GAMT,EAGJ,IAAK,GAAM,CAAC,KAAY,EACtB,IAAA,EAAA,EAAA,UAAa,EAAQ,GAAK,EAAU,CAClC,EAAiB,EACjB,MASJ,GAJI,CAAC,GAAkB,EAAe,OAAS,IAC7C,EAAiB,EAAe,MAAM,CAAC,MAAM,CAAC,OAG5C,EAAgB,CAElB,IAAM,EAAU,EAAe,IAAI,EAAe,CAC9C,IACF,aAAa,EAAQ,MAAM,CAC3B,EAAe,OAAO,EAAe,EAGvC,EAAS,GACT,EAAU,mBAAmB,EAAe,MAAM,IAAW,CAE7D,MAAMA,EAAAA,kCACJ,EACA,EACA,EACD,CAIH,GAAI,CAAC,GACiB,MAAA,EAAA,EAAA,UAAe,EAAU,QAAQ,GACrB,GAGnB,CACX,IAAM,EAAmB,EACtB,IAAK,GAAQ,EAAI,QAAQ,MAAO,MAAM,CAAC,CACvC,KAAK,IAAI,CAMZ,MAAMC,EAAAA,wBACJ,CACE,IAPS,EAAS,QAChB,OAAO,IAAI,EAAiB,IAAI,CACpC,GACD,CAKG,QAAS,EAAE,CACX,WACD,CACD,EACD,CAKL,MAAMC,EAAAA,uCAAuC,EAAU,EAAc,EACrE,CACD,GACC,SACA,KAAO,IACL,MAAMC,EAAAA,mCAAmC,EAAU,EAAc,CACpE,CACA,GAAG,SAAU,KAAO,IAAa,CAEhC,IAAM,EAAQ,WAAW,SAAY,CAEnC,EAAe,OAAO,EAAS,CAC/B,MAAMC,EAAAA,qCAAqC,EAAU,EAAc,EAClE,IAAI,CAEP,EAAe,IAAI,EAAU,CAAE,QAAO,QAAS,EAAU,CAAC,EAC1D,CACD,GAAG,QAAS,KAAO,IAAU,CAC5B,EAAU,kBAAkB,IAAS,CACnC,MAAO,QACR,CAAC,CAEF,EAAU,qBAAqB,CAE/B,MAAMC,EAAAA,gBAAgB,EAAc,EACpC,EAGO,EAAwB,KAAO,IAA2B,CACrE,GAAM,CAAE,cAAa,GAAG,GAAS,GAAW,EAAE,CACxC,EACJ,GAAS,gBAAA,EAAA,EAAA,kBAAkC,GAAS,cAAc,CAE/D,GACH,MAAMA,EAAAA,gBAAgB,EAAe,CAAE,SAAU,GAAM,CAAC,EAGtD,EAAc,QAAQ,OAAS,GAAS,eAG1C,EAAA,EAAA,cAF+B,EAAc,CAEnC,yCAAyC,CACnD,EAAM,CAAE,GAAG,EAAM,gBAAe,CAAC"}
1
+ {"version":3,"file":"watcher.cjs","names":["handleContentDeclarationFileMoved","writeContentDeclaration","handleAdditionalContentDeclarationFile","handleContentDeclarationFileChange","handleUnlinkedContentDeclarationFile","prepareIntlayer"],"sources":["../../src/watcher.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport { basename } from 'node:path';\nimport { getAppLogger } from '@intlayer/config/logger';\nimport {\n type GetConfigurationOptions,\n getConfiguration,\n} from '@intlayer/config/node';\nimport type { IntlayerConfig } from '@intlayer/types';\n/** @ts-ignore remove error Module '\"chokidar\"' has no exported member 'ChokidarOptions' */\nimport { type ChokidarOptions, watch as chokidarWatch } from 'chokidar';\nimport { handleAdditionalContentDeclarationFile } from './handleAdditionalContentDeclarationFile';\nimport { handleContentDeclarationFileChange } from './handleContentDeclarationFileChange';\nimport { handleContentDeclarationFileMoved } from './handleContentDeclarationFileMoved';\nimport { handleUnlinkedContentDeclarationFile } from './handleUnlinkedContentDeclarationFile';\nimport { prepareIntlayer } from './prepareIntlayer';\nimport { writeContentDeclaration } from './writeContentDeclaration';\n\n// Map to track files that were recently unlinked: oldPath -> { timer, timestamp }\nconst pendingUnlinks = new Map<\n string,\n { timer: NodeJS.Timeout; oldPath: string }\n>();\n\n// Task queue to ensure sequential processing of file events\nlet processingQueue = Promise.resolve();\nconst processEvent = (task: () => Promise<void>) => {\n processingQueue = processingQueue.then(async () => {\n try {\n await task();\n } catch (error) {\n console.error(error);\n }\n });\n};\n\ntype WatchOptions = ChokidarOptions & {\n configuration?: IntlayerConfig;\n configOptions?: GetConfigurationOptions;\n skipPrepare?: boolean;\n};\n\n// Initialize chokidar watcher (non-persistent)\nexport const watch = (options?: WatchOptions) => {\n const configuration: IntlayerConfig =\n options?.configuration ?? getConfiguration(options?.configOptions);\n const appLogger = getAppLogger(configuration);\n\n const {\n watch: isWatchMode,\n watchedFilesPatternWithPath,\n fileExtensions,\n } = configuration.content;\n\n return chokidarWatch(watchedFilesPatternWithPath, {\n persistent: isWatchMode, // Make the watcher persistent\n ignoreInitial: true, // Process existing files\n awaitWriteFinish: {\n stabilityThreshold: 1000,\n pollInterval: 100,\n },\n ignored: [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/.intlayer/**',\n ],\n ...options,\n })\n .on('add', async (filePath) => {\n const fileName = basename(filePath);\n let isMove = false;\n\n // Check if this Add corresponds to a pending Unlink (Move/Rename detection)\n // Heuristic:\n // - Priority A: Exact basename match (Moved to different folder)\n // - Priority B: Single entry in pendingUnlinks (Renamed file)\n let matchedOldPath: string | undefined;\n\n // Search for basename match\n for (const [oldPath] of pendingUnlinks) {\n if (basename(oldPath) === fileName) {\n matchedOldPath = oldPath;\n break;\n }\n }\n\n // If no basename match, but exactly one file was recently unlinked, assume it's a rename\n if (!matchedOldPath && pendingUnlinks.size === 1) {\n matchedOldPath = pendingUnlinks.keys().next().value;\n }\n\n if (matchedOldPath) {\n // It is a move! Cancel the unlink handler\n const pending = pendingUnlinks.get(matchedOldPath);\n if (pending) {\n clearTimeout(pending.timer);\n pendingUnlinks.delete(matchedOldPath);\n }\n\n isMove = true;\n appLogger(`File moved from ${matchedOldPath} to ${filePath}`);\n }\n\n processEvent(async () => {\n if (isMove && matchedOldPath) {\n await handleContentDeclarationFileMoved(\n matchedOldPath,\n filePath,\n configuration\n );\n } else {\n const fileContent = await readFile(filePath, 'utf-8');\n const isEmpty = fileContent === '';\n\n // Fill template content declaration file if it is empty\n if (isEmpty) {\n const extensionPattern = fileExtensions\n .map((ext) => ext.replace(/\\./g, '\\\\.'))\n .join('|');\n const name = fileName.replace(\n new RegExp(`(${extensionPattern})$`),\n ''\n );\n\n await writeContentDeclaration(\n {\n key: name,\n content: {},\n filePath,\n },\n configuration\n );\n }\n\n await handleAdditionalContentDeclarationFile(filePath, configuration);\n }\n });\n })\n .on('change', async (filePath) =>\n processEvent(async () =>\n handleContentDeclarationFileChange(filePath, configuration)\n )\n )\n .on('unlink', async (filePath) => {\n // Delay unlink processing to see if an 'add' event occurs (indicating a move)\n const timer = setTimeout(async () => {\n // If timer fires, the file was genuinely removed\n pendingUnlinks.delete(filePath);\n processEvent(async () =>\n handleUnlinkedContentDeclarationFile(filePath, configuration)\n );\n }, 200); // 200ms window to catch the 'add' event\n\n pendingUnlinks.set(filePath, { timer, oldPath: filePath });\n })\n .on('error', async (error) => {\n appLogger(`Watcher error: ${error}`, {\n level: 'error',\n });\n\n appLogger('Restarting watcher');\n\n await prepareIntlayer(configuration);\n });\n};\n\nexport const buildAndWatchIntlayer = async (options?: WatchOptions) => {\n const { skipPrepare, ...rest } = options ?? {};\n const configuration =\n options?.configuration ?? getConfiguration(options?.configOptions);\n\n if (!skipPrepare) {\n await prepareIntlayer(configuration, { forceRun: true });\n }\n\n if (configuration.content.watch || options?.persistent) {\n const appLogger = getAppLogger(configuration);\n\n appLogger('Watching Intlayer content declarations');\n watch({ ...rest, configuration });\n }\n};\n"],"mappings":"+kBAkBA,MAAM,EAAiB,IAAI,IAM3B,IAAI,EAAkB,QAAQ,SAAS,CACvC,MAAM,EAAgB,GAA8B,CAClD,EAAkB,EAAgB,KAAK,SAAY,CACjD,GAAI,CACF,MAAM,GAAM,OACL,EAAO,CACd,QAAQ,MAAM,EAAM,GAEtB,EAUS,EAAS,GAA2B,CAC/C,IAAM,EACJ,GAAS,gBAAA,EAAA,EAAA,kBAAkC,GAAS,cAAc,CAC9D,GAAA,EAAA,EAAA,cAAyB,EAAc,CAEvC,CACJ,MAAO,EACP,8BACA,kBACE,EAAc,QAElB,OAAA,EAAA,EAAA,OAAqB,EAA6B,CAChD,WAAY,EACZ,cAAe,GACf,iBAAkB,CAChB,mBAAoB,IACpB,aAAc,IACf,CACD,QAAS,CACP,qBACA,aACA,cACA,kBACD,CACD,GAAG,EACJ,CAAC,CACC,GAAG,MAAO,KAAO,IAAa,CAC7B,IAAM,GAAA,EAAA,EAAA,UAAoB,EAAS,CAC/B,EAAS,GAMT,EAGJ,IAAK,GAAM,CAAC,KAAY,EACtB,IAAA,EAAA,EAAA,UAAa,EAAQ,GAAK,EAAU,CAClC,EAAiB,EACjB,MASJ,GAJI,CAAC,GAAkB,EAAe,OAAS,IAC7C,EAAiB,EAAe,MAAM,CAAC,MAAM,CAAC,OAG5C,EAAgB,CAElB,IAAM,EAAU,EAAe,IAAI,EAAe,CAC9C,IACF,aAAa,EAAQ,MAAM,CAC3B,EAAe,OAAO,EAAe,EAGvC,EAAS,GACT,EAAU,mBAAmB,EAAe,MAAM,IAAW,CAG/D,EAAa,SAAY,CACvB,GAAI,GAAU,EACZ,MAAMA,EAAAA,kCACJ,EACA,EACA,EACD,KACI,CAKL,GAJoB,MAAA,EAAA,EAAA,UAAe,EAAU,QAAQ,GACrB,GAGnB,CACX,IAAM,EAAmB,EACtB,IAAK,GAAQ,EAAI,QAAQ,MAAO,MAAM,CAAC,CACvC,KAAK,IAAI,CAMZ,MAAMC,EAAAA,wBACJ,CACE,IAPS,EAAS,QAChB,OAAO,IAAI,EAAiB,IAAI,CACpC,GACD,CAKG,QAAS,EAAE,CACX,WACD,CACD,EACD,CAGH,MAAMC,EAAAA,uCAAuC,EAAU,EAAc,GAEvE,EACF,CACD,GAAG,SAAU,KAAO,IACnB,EAAa,SACXC,EAAAA,mCAAmC,EAAU,EAAc,CAC5D,CACF,CACA,GAAG,SAAU,KAAO,IAAa,CAEhC,IAAM,EAAQ,WAAW,SAAY,CAEnC,EAAe,OAAO,EAAS,CAC/B,EAAa,SACXC,EAAAA,qCAAqC,EAAU,EAAc,CAC9D,EACA,IAAI,CAEP,EAAe,IAAI,EAAU,CAAE,QAAO,QAAS,EAAU,CAAC,EAC1D,CACD,GAAG,QAAS,KAAO,IAAU,CAC5B,EAAU,kBAAkB,IAAS,CACnC,MAAO,QACR,CAAC,CAEF,EAAU,qBAAqB,CAE/B,MAAMC,EAAAA,gBAAgB,EAAc,EACpC,EAGO,EAAwB,KAAO,IAA2B,CACrE,GAAM,CAAE,cAAa,GAAG,GAAS,GAAW,EAAE,CACxC,EACJ,GAAS,gBAAA,EAAA,EAAA,kBAAkC,GAAS,cAAc,CAE/D,GACH,MAAMA,EAAAA,gBAAgB,EAAe,CAAE,SAAU,GAAM,CAAC,EAGtD,EAAc,QAAQ,OAAS,GAAS,eAG1C,EAAA,EAAA,cAF+B,EAAc,CAEnC,yCAAyC,CACnD,EAAM,CAAE,GAAG,EAAM,gBAAe,CAAC"}
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`../_virtual/_rolldown/runtime.cjs`);let e=require(`node:path`),t=require(`@intlayer/config/logger`),n=require(`@intlayer/core/interpreter`),r=require(`@intlayer/types`),i=require(`node:fs`);const a={id:`write-file-plugin`,canHandle:e=>typeof e==`object`&&e?.nodeType===r.NodeType.File,transform:n=>{let a=n.content,o=n.fixedPath;if(typeof a!=`string`)throw Error(`File content must be a string`);if(typeof o!=`string`)throw Error(`File path must be a string`);try{let t=(0,e.join)(process.cwd(),o),n=(0,e.dirname)(t);(0,i.existsSync)(n)||(0,i.mkdirSync)(n,{recursive:!0}),(0,i.writeFileSync)(t,a)}catch(e){throw Error(`${t.x} Error writing file to ${(0,t.colorizePath)(o)}: ${e}`)}return{nodeType:r.NodeType.File,[r.NodeType.File]:n.file}}},o={id:`markdown-file-plugin`,canHandle:e=>typeof e==`object`&&e?.nodeType===r.NodeType.Markdown,transform:(e,t,n)=>({nodeType:r.NodeType.Markdown,[r.NodeType.Markdown]:n(e.markdown,t)})},s={id:`insertion-file-plugin`,canHandle:e=>typeof e==`object`&&e?.nodeType===r.NodeType.Insertion,transform:(e,t,n)=>({nodeType:r.NodeType.Insertion,[r.NodeType.Insertion]:n(e.insertion,t)})},c={id:`html-file-plugin`,canHandle:e=>typeof e==`object`&&e?.nodeType===r.NodeType.HTML,transform:(e,t,n)=>({nodeType:r.NodeType.HTML,[r.NodeType.HTML]:n(e.html,t)})},l=async e=>(0,n.deepTransformNode)(e,{dictionaryKey:e.key,keyPath:[],plugins:[a,o,s,c]});exports.processContentDeclarationContent=l;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`../_virtual/_rolldown/runtime.cjs`);let e=require(`node:path`),t=require(`@intlayer/config/logger`),n=require(`node:fs`),r=require(`@intlayer/core/interpreter`),i=require(`@intlayer/types`);const a={id:`write-file-plugin`,canHandle:e=>typeof e==`object`&&e?.nodeType===i.NodeType.File,transform:r=>{let a=r.content,o=r.fixedPath;if(typeof a!=`string`)throw Error(`File content must be a string`);if(typeof o!=`string`)throw Error(`File path must be a string`);try{let t=(0,e.join)(process.cwd(),o),r=(0,e.dirname)(t);(0,n.existsSync)(r)||(0,n.mkdirSync)(r,{recursive:!0}),(0,n.writeFileSync)(t,a)}catch(e){throw Error(`${t.x} Error writing file to ${(0,t.colorizePath)(o)}: ${e}`)}return{nodeType:i.NodeType.File,[i.NodeType.File]:r.file}}},o={id:`markdown-file-plugin`,canHandle:e=>typeof e==`object`&&e?.nodeType===i.NodeType.Markdown,transform:(e,t,n)=>({nodeType:i.NodeType.Markdown,[i.NodeType.Markdown]:n(e.markdown,t)})},s={id:`insertion-file-plugin`,canHandle:e=>typeof e==`object`&&e?.nodeType===i.NodeType.Insertion,transform:(e,t,n)=>({nodeType:i.NodeType.Insertion,[i.NodeType.Insertion]:n(e.insertion,t)})},c={id:`html-file-plugin`,canHandle:e=>typeof e==`object`&&e?.nodeType===i.NodeType.HTML,transform:(e,t,n)=>({nodeType:i.NodeType.HTML,[i.NodeType.HTML]:n(e.html,t)})},l=async e=>(0,r.deepTransformNode)(e,{dictionaryKey:e.key,keyPath:[],plugins:[a,o,s,c]});exports.processContentDeclarationContent=l;
2
2
  //# sourceMappingURL=processContentDeclarationContent.cjs.map
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../utils/getFormatFromExtension.cjs`),t=require(`./processContentDeclarationContent.cjs`),n=require(`./transformJSONFile.cjs`),r=require(`./writeJSFile.cjs`);let i=require(`@intlayer/unmerged-dictionaries-entry`),a=require(`node:fs/promises`),o=require(`node:path`),s=require(`@intlayer/core/plugins`),c=require(`node:fs`),l=require(`node:util`);const u=async(n,r,i)=>{let a=await t.processContentDeclarationContent(n),c=a.content;n.locale?c=(0,s.getPerLocaleDictionary)(a,n.locale).content:i&&(c=(0,s.getFilteredLocalesDictionary)(a,i).content);let l={...n,content:c};for await(let e of r.plugins??[])if(e.formatOutput){let t=await e.formatOutput?.({dictionary:l,configuration:r});t&&(l=t)}if(!(l.content&&l.key))return l;let u={key:n.key,id:n.id,title:n.title,description:n.description,tags:n.tags,locale:n.locale,fill:n.fill,filled:n.filled,priority:n.priority,importMode:n.importMode,version:n.version,content:c};return e.getFormatFromExtension(n.filePath?(0,o.extname)(n.filePath):`.json`)===`json`&&l.content&&l.key&&(u={$schema:`https://intlayer.org/schema.json`,...u}),u},d={newDictionariesPath:`intlayer-dictionaries`},f=async(e,t,n)=>{let{content:r}=t,{baseDir:a}=r,{newDictionariesPath:s,localeList:c}={...d,...n},f=(0,o.join)(a,s),m=(0,i.getUnmergedDictionaries)(t)[e.key]?.find(t=>t.localId===e.localId),h=await u(e,t,c);if(m?.filePath){let n=(0,l.isDeepStrictEqual)(m,e),r=(0,o.resolve)(t.content.baseDir,m.filePath);return n?{status:`up-to-date`,path:r}:(await p(r,h,t),{status:`updated`,path:r})}if(e.filePath){let n=(0,o.resolve)(t.content.baseDir,e.filePath);return await p(n,h,t),{status:`created`,path:n}}let g=(0,o.join)(f,`${e.key}.content.json`);return await p(g,h,t),{status:`imported`,path:g}},p=async(e,t,i)=>{await(0,a.mkdir)((0,o.dirname)(e),{recursive:!0});let s=(0,o.extname)(e);if(!i.content.fileExtensions.map(e=>(0,o.extname)(e)).includes(s))throw Error(`Invalid file extension: ${s}, file: ${e}`);if(s===`.json`){await(0,a.writeFile)(e,`${JSON.stringify(t,null,2)}\n`);return}if([`.jsonc`,`.json5`].includes(s)){let r=`{}`;if((0,c.existsSync)(e))try{r=await(0,a.readFile)(e,`utf-8`)}catch{}await(0,a.writeFile)(e,n.transformJSONFile(r,t),`utf-8`);return}await r.writeJSFile(e,t,i);try{await(0,a.rm)((0,o.join)(i.system.cacheDir,`intlayer-prepared.lock`),{recursive:!0})}catch{}};exports.writeContentDeclaration=f;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../utils/getFormatFromExtension.cjs`),t=require(`./processContentDeclarationContent.cjs`),n=require(`./transformJSONFile.cjs`),r=require(`./writeJSFile.cjs`);let i=require(`@intlayer/unmerged-dictionaries-entry`),a=require(`node:fs/promises`),o=require(`node:path`),s=require(`@intlayer/core/plugins`),c=require(`node:fs`),l=require(`node:util`);const u=async(n,r,i)=>{let a=await t.processContentDeclarationContent(n),c=a.content;n.locale?c=(0,s.getPerLocaleDictionary)(a,n.locale).content:i&&(c=(0,s.getFilteredLocalesDictionary)(a,i).content);let l={...n,content:c};for await(let e of r.plugins??[])if(e.formatOutput){let t=await e.formatOutput?.({dictionary:l,configuration:r});t&&(l=t)}if(!(l.content&&l.key))return l;let u={key:n.key,id:n.id,title:n.title,description:n.description,tags:n.tags,locale:n.locale,fill:n.fill,filled:n.filled,priority:n.priority,importMode:n.importMode,version:n.version,content:c};return e.getFormatFromExtension(n.filePath?(0,o.extname)(n.filePath):`.json`)===`json`&&l.content&&l.key&&(u={$schema:`https://intlayer.org/schema.json`,...u}),u},d={newDictionariesPath:`intlayer-dictionaries`},f=async(e,t,n)=>{let{content:r}=t,{baseDir:a}=r,{newDictionariesPath:s,localeList:c}={...d,...n},f=(0,o.join)(a,s),m=(0,i.getUnmergedDictionaries)(t)[e.key]?.find(t=>t.localId===e.localId),h=await u(e,t,c);if(m?.filePath){let n=(0,l.isDeepStrictEqual)(m,e),r=(0,o.resolve)(t.content.baseDir,m.filePath);return n?{status:`up-to-date`,path:r}:(await p(r,h,t),{status:`updated`,path:r})}if(e.filePath){let n=(0,o.resolve)(t.content.baseDir,e.filePath);return await p(n,h,t),{status:`created`,path:n}}let g=(0,o.join)(f,`${e.key}.content.json`);return await p(g,h,t),{status:`imported`,path:g}},p=async(e,t,i)=>{await(0,a.mkdir)((0,o.dirname)(e),{recursive:!0});let s=(0,o.extname)(e);if(!i.content.fileExtensions.map(e=>(0,o.extname)(e)).includes(s))throw Error(`Invalid file extension: ${s}, file: ${e}`);if(s===`.json`){let n=JSON.stringify(t,null,2),r=i.system?.tempDir;r&&await(0,a.mkdir)(r,{recursive:!0});let s=`${(0,o.basename)(e)}.${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`,c=r?(0,o.join)(r,s):`${e}.${s}`;try{await(0,a.writeFile)(c,`${n}\n`),await(0,a.rename)(c,e)}catch(e){try{await(0,a.rm)(c,{force:!0})}catch{}throw e}return}if([`.jsonc`,`.json5`].includes(s)){let r=`{}`;if((0,c.existsSync)(e))try{r=await(0,a.readFile)(e,`utf-8`)}catch{}let s=n.transformJSONFile(r,t),l=i.system?.tempDir;l&&await(0,a.mkdir)(l,{recursive:!0});let u=`${(0,o.basename)(e)}.${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`,d=l?(0,o.join)(l,u):`${e}.${u}`;try{await(0,a.writeFile)(d,s,`utf-8`),await(0,a.rename)(d,e)}catch(e){try{await(0,a.rm)(d,{force:!0})}catch{}throw e}return}await r.writeJSFile(e,t,i);try{await(0,a.rm)((0,o.join)(i.system.cacheDir,`intlayer-prepared.lock`),{recursive:!0})}catch{}};exports.writeContentDeclaration=f;
2
2
  //# sourceMappingURL=writeContentDeclaration.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"writeContentDeclaration.cjs","names":["processContentDeclarationContent","getFormatFromExtension","transformJSONFile","writeJSFile"],"sources":["../../../src/writeContentDeclaration/writeContentDeclaration.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { mkdir, readFile, rm, writeFile } from 'node:fs/promises';\nimport { dirname, extname, join, resolve } from 'node:path';\nimport { isDeepStrictEqual } from 'node:util';\nimport {\n getFilteredLocalesDictionary,\n getPerLocaleDictionary,\n} from '@intlayer/core/plugins';\nimport type {\n Dictionary,\n IntlayerConfig,\n Locale,\n LocalesValues,\n} from '@intlayer/types';\nimport { getUnmergedDictionaries } from '@intlayer/unmerged-dictionaries-entry';\nimport {\n type Extension,\n getFormatFromExtension,\n} from '../utils/getFormatFromExtension';\nimport type { DictionaryStatus } from './dictionaryStatus';\nimport { processContentDeclarationContent } from './processContentDeclarationContent';\nimport { transformJSONFile } from './transformJSONFile';\nimport { writeJSFile } from './writeJSFile';\n\nconst formatContentDeclaration = async (\n dictionary: Dictionary,\n configuration: IntlayerConfig,\n localeList?: LocalesValues[]\n) => {\n /**\n * Clean Markdown, Insertion, File, etc. node metadata\n */\n const processedDictionary =\n await processContentDeclarationContent(dictionary);\n\n let content = processedDictionary.content;\n\n /**\n * Filter locales content\n */\n\n if (dictionary.locale) {\n content = getPerLocaleDictionary(\n processedDictionary,\n dictionary.locale\n ).content;\n } else if (localeList) {\n content = getFilteredLocalesDictionary(\n processedDictionary,\n localeList\n ).content;\n }\n\n let pluginFormatResult: any = {\n ...dictionary,\n content,\n } satisfies Dictionary;\n\n /**\n * Format the dictionary with the plugins\n */\n\n for await (const plugin of configuration.plugins ?? []) {\n if (plugin.formatOutput) {\n const formattedResult = await plugin.formatOutput?.({\n dictionary: pluginFormatResult,\n configuration,\n });\n\n if (formattedResult) {\n pluginFormatResult = formattedResult;\n }\n }\n }\n\n const isDictionaryFormat =\n pluginFormatResult.content && pluginFormatResult.key;\n\n if (!isDictionaryFormat) return pluginFormatResult;\n\n let result: Dictionary = {\n key: dictionary.key,\n id: dictionary.id,\n title: dictionary.title,\n description: dictionary.description,\n tags: dictionary.tags,\n locale: dictionary.locale,\n fill: dictionary.fill,\n filled: dictionary.filled,\n priority: dictionary.priority,\n importMode: dictionary.importMode,\n version: dictionary.version,\n content,\n };\n\n /**\n * Add $schema to JSON dictionaries\n */\n const extension = (\n dictionary.filePath ? extname(dictionary.filePath) : '.json'\n ) as Extension;\n const format = getFormatFromExtension(extension);\n\n if (\n format === 'json' &&\n pluginFormatResult.content &&\n pluginFormatResult.key\n ) {\n result = {\n $schema: 'https://intlayer.org/schema.json',\n ...result,\n };\n }\n\n return result;\n};\n\ntype WriteContentDeclarationOptions = {\n newDictionariesPath?: string;\n localeList?: LocalesValues[];\n fallbackLocale?: Locale;\n};\n\nconst defaultOptions = {\n newDictionariesPath: 'intlayer-dictionaries',\n} satisfies WriteContentDeclarationOptions;\n\nexport const writeContentDeclaration = async (\n dictionary: Dictionary,\n configuration: IntlayerConfig,\n options?: WriteContentDeclarationOptions\n): Promise<{ status: DictionaryStatus; path: string }> => {\n const { content } = configuration;\n const { baseDir } = content;\n const { newDictionariesPath, localeList } = {\n ...defaultOptions,\n ...options,\n };\n\n const newDictionaryLocationPath = join(baseDir, newDictionariesPath);\n\n const unmergedDictionariesRecord = getUnmergedDictionaries(configuration);\n const unmergedDictionaries = unmergedDictionariesRecord[\n dictionary.key\n ] as Dictionary[];\n\n const existingDictionary = unmergedDictionaries?.find(\n (el) => el.localId === dictionary.localId\n );\n\n const formattedContentDeclaration = await formatContentDeclaration(\n dictionary,\n configuration,\n localeList\n );\n\n if (existingDictionary?.filePath) {\n // Compare existing dictionary content with new dictionary content\n const isSameContent = isDeepStrictEqual(existingDictionary, dictionary);\n\n const filePath = resolve(\n configuration.content.baseDir,\n existingDictionary.filePath\n );\n\n // Up to date, nothing to do\n if (isSameContent) {\n return {\n status: 'up-to-date',\n path: filePath,\n };\n }\n\n await writeFileWithDirectories(\n filePath,\n formattedContentDeclaration,\n configuration\n );\n\n return { status: 'updated', path: filePath };\n }\n\n if (dictionary.filePath) {\n const filePath = resolve(\n configuration.content.baseDir,\n dictionary.filePath\n );\n\n await writeFileWithDirectories(\n filePath,\n formattedContentDeclaration,\n configuration\n );\n\n return { status: 'created', path: filePath };\n }\n\n // No existing dictionary, write to new location\n const contentDeclarationPath = join(\n newDictionaryLocationPath,\n `${dictionary.key}.content.json`\n );\n\n await writeFileWithDirectories(\n contentDeclarationPath,\n formattedContentDeclaration,\n configuration\n );\n\n return {\n status: 'imported',\n path: contentDeclarationPath,\n };\n};\n\nconst writeFileWithDirectories = async (\n absoluteFilePath: string,\n dictionary: Dictionary,\n configuration: IntlayerConfig\n): Promise<void> => {\n // Extract the directory from the file path\n const dir = dirname(absoluteFilePath);\n\n // Create the directory recursively\n await mkdir(dir, { recursive: true });\n\n const extension = extname(absoluteFilePath);\n const acceptedExtensions = configuration.content.fileExtensions.map(\n (extension) => extname(extension)\n );\n\n if (!acceptedExtensions.includes(extension)) {\n throw new Error(\n `Invalid file extension: ${extension}, file: ${absoluteFilePath}`\n );\n }\n\n if (extension === '.json') {\n const jsonDictionary = JSON.stringify(dictionary, null, 2);\n\n // Write the file\n await writeFile(absoluteFilePath, `${jsonDictionary}\\n`); // Add a new line at the end of the file to avoid formatting issues with VSCode\n\n return;\n }\n\n // Handle JSONC, and JSON5 via the AST transformer\n if (['.jsonc', '.json5'].includes(extension)) {\n let fileContent = '{}';\n\n if (existsSync(absoluteFilePath)) {\n try {\n fileContent = await readFile(absoluteFilePath, 'utf-8');\n } catch {\n // ignore read errors, start with empty object\n }\n }\n\n const transformedContent = transformJSONFile(fileContent, dictionary);\n\n // We use standard writeFile because transformedContent is already a string\n await writeFile(absoluteFilePath, transformedContent, 'utf-8');\n return;\n }\n\n await writeJSFile(absoluteFilePath, dictionary, configuration);\n\n // remove the cache as content has changed\n // Will force a new preparation of the intlayer on next build\n try {\n const sentinelPath = join(\n configuration.system.cacheDir,\n 'intlayer-prepared.lock'\n );\n await rm(sentinelPath, { recursive: true });\n } catch {}\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"writeContentDeclaration.cjs","names":["processContentDeclarationContent","getFormatFromExtension","transformJSONFile","writeJSFile"],"sources":["../../../src/writeContentDeclaration/writeContentDeclaration.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';\nimport { basename, dirname, extname, join, resolve } from 'node:path';\nimport { isDeepStrictEqual } from 'node:util';\nimport {\n getFilteredLocalesDictionary,\n getPerLocaleDictionary,\n} from '@intlayer/core/plugins';\nimport type {\n Dictionary,\n IntlayerConfig,\n Locale,\n LocalesValues,\n} from '@intlayer/types';\nimport { getUnmergedDictionaries } from '@intlayer/unmerged-dictionaries-entry';\nimport {\n type Extension,\n getFormatFromExtension,\n} from '../utils/getFormatFromExtension';\nimport type { DictionaryStatus } from './dictionaryStatus';\nimport { processContentDeclarationContent } from './processContentDeclarationContent';\nimport { transformJSONFile } from './transformJSONFile';\nimport { writeJSFile } from './writeJSFile';\n\nconst formatContentDeclaration = async (\n dictionary: Dictionary,\n configuration: IntlayerConfig,\n localeList?: LocalesValues[]\n) => {\n /**\n * Clean Markdown, Insertion, File, etc. node metadata\n */\n const processedDictionary =\n await processContentDeclarationContent(dictionary);\n\n let content = processedDictionary.content;\n\n /**\n * Filter locales content\n */\n\n if (dictionary.locale) {\n content = getPerLocaleDictionary(\n processedDictionary,\n dictionary.locale\n ).content;\n } else if (localeList) {\n content = getFilteredLocalesDictionary(\n processedDictionary,\n localeList\n ).content;\n }\n\n let pluginFormatResult: any = {\n ...dictionary,\n content,\n } satisfies Dictionary;\n\n /**\n * Format the dictionary with the plugins\n */\n\n for await (const plugin of configuration.plugins ?? []) {\n if (plugin.formatOutput) {\n const formattedResult = await plugin.formatOutput?.({\n dictionary: pluginFormatResult,\n configuration,\n });\n\n if (formattedResult) {\n pluginFormatResult = formattedResult;\n }\n }\n }\n\n const isDictionaryFormat =\n pluginFormatResult.content && pluginFormatResult.key;\n\n if (!isDictionaryFormat) return pluginFormatResult;\n\n let result: Dictionary = {\n key: dictionary.key,\n id: dictionary.id,\n title: dictionary.title,\n description: dictionary.description,\n tags: dictionary.tags,\n locale: dictionary.locale,\n fill: dictionary.fill,\n filled: dictionary.filled,\n priority: dictionary.priority,\n importMode: dictionary.importMode,\n version: dictionary.version,\n content,\n };\n\n /**\n * Add $schema to JSON dictionaries\n */\n const extension = (\n dictionary.filePath ? extname(dictionary.filePath) : '.json'\n ) as Extension;\n const format = getFormatFromExtension(extension);\n\n if (\n format === 'json' &&\n pluginFormatResult.content &&\n pluginFormatResult.key\n ) {\n result = {\n $schema: 'https://intlayer.org/schema.json',\n ...result,\n };\n }\n\n return result;\n};\n\ntype WriteContentDeclarationOptions = {\n newDictionariesPath?: string;\n localeList?: LocalesValues[];\n fallbackLocale?: Locale;\n};\n\nconst defaultOptions = {\n newDictionariesPath: 'intlayer-dictionaries',\n} satisfies WriteContentDeclarationOptions;\n\nexport const writeContentDeclaration = async (\n dictionary: Dictionary,\n configuration: IntlayerConfig,\n options?: WriteContentDeclarationOptions\n): Promise<{ status: DictionaryStatus; path: string }> => {\n const { content } = configuration;\n const { baseDir } = content;\n const { newDictionariesPath, localeList } = {\n ...defaultOptions,\n ...options,\n };\n\n const newDictionaryLocationPath = join(baseDir, newDictionariesPath);\n\n const unmergedDictionariesRecord = getUnmergedDictionaries(configuration);\n const unmergedDictionaries = unmergedDictionariesRecord[\n dictionary.key\n ] as Dictionary[];\n\n const existingDictionary = unmergedDictionaries?.find(\n (el) => el.localId === dictionary.localId\n );\n\n const formattedContentDeclaration = await formatContentDeclaration(\n dictionary,\n configuration,\n localeList\n );\n\n if (existingDictionary?.filePath) {\n // Compare existing dictionary content with new dictionary content\n const isSameContent = isDeepStrictEqual(existingDictionary, dictionary);\n\n const filePath = resolve(\n configuration.content.baseDir,\n existingDictionary.filePath\n );\n\n // Up to date, nothing to do\n if (isSameContent) {\n return {\n status: 'up-to-date',\n path: filePath,\n };\n }\n\n await writeFileWithDirectories(\n filePath,\n formattedContentDeclaration,\n configuration\n );\n\n return { status: 'updated', path: filePath };\n }\n\n if (dictionary.filePath) {\n const filePath = resolve(\n configuration.content.baseDir,\n dictionary.filePath\n );\n\n await writeFileWithDirectories(\n filePath,\n formattedContentDeclaration,\n configuration\n );\n\n return { status: 'created', path: filePath };\n }\n\n // No existing dictionary, write to new location\n const contentDeclarationPath = join(\n newDictionaryLocationPath,\n `${dictionary.key}.content.json`\n );\n\n await writeFileWithDirectories(\n contentDeclarationPath,\n formattedContentDeclaration,\n configuration\n );\n\n return {\n status: 'imported',\n path: contentDeclarationPath,\n };\n};\n\nconst writeFileWithDirectories = async (\n absoluteFilePath: string,\n dictionary: Dictionary,\n configuration: IntlayerConfig\n): Promise<void> => {\n // Extract the directory from the file path\n const dir = dirname(absoluteFilePath);\n\n // Create the directory recursively\n await mkdir(dir, { recursive: true });\n\n const extension = extname(absoluteFilePath);\n const acceptedExtensions = configuration.content.fileExtensions.map(\n (extension) => extname(extension)\n );\n\n if (!acceptedExtensions.includes(extension)) {\n throw new Error(\n `Invalid file extension: ${extension}, file: ${absoluteFilePath}`\n );\n }\n\n if (extension === '.json') {\n const jsonDictionary = JSON.stringify(dictionary, null, 2);\n\n // Write the file\n const tempDir = configuration.system?.tempDir;\n if (tempDir) {\n await mkdir(tempDir, { recursive: true });\n }\n\n const tempFileName = `${basename(absoluteFilePath)}.${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`;\n const tempPath = tempDir\n ? join(tempDir, tempFileName)\n : `${absoluteFilePath}.${tempFileName}`;\n try {\n await writeFile(tempPath, `${jsonDictionary}\\n`); // Add a new line at the end of the file to avoid formatting issues with VSCode\n await rename(tempPath, absoluteFilePath);\n } catch (error) {\n try {\n await rm(tempPath, { force: true });\n } catch {\n // Ignore\n }\n throw error;\n }\n\n return;\n }\n\n // Handle JSONC, and JSON5 via the AST transformer\n if (['.jsonc', '.json5'].includes(extension)) {\n let fileContent = '{}';\n\n if (existsSync(absoluteFilePath)) {\n try {\n fileContent = await readFile(absoluteFilePath, 'utf-8');\n } catch {\n // ignore read errors, start with empty object\n }\n }\n\n const transformedContent = transformJSONFile(fileContent, dictionary);\n\n // We use standard writeFile because transformedContent is already a string\n const tempDir = configuration.system?.tempDir;\n if (tempDir) {\n await mkdir(tempDir, { recursive: true });\n }\n\n const tempFileName = `${basename(absoluteFilePath)}.${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`;\n const tempPath = tempDir\n ? join(tempDir, tempFileName)\n : `${absoluteFilePath}.${tempFileName}`;\n try {\n await writeFile(tempPath, transformedContent, 'utf-8');\n await rename(tempPath, absoluteFilePath);\n } catch (error) {\n try {\n await rm(tempPath, { force: true });\n } catch {\n // Ignore\n }\n throw error;\n }\n return;\n }\n\n await writeJSFile(absoluteFilePath, dictionary, configuration);\n\n // remove the cache as content has changed\n // Will force a new preparation of the intlayer on next build\n try {\n const sentinelPath = join(\n configuration.system.cacheDir,\n 'intlayer-prepared.lock'\n );\n await rm(sentinelPath, { recursive: true });\n } catch {}\n};\n"],"mappings":"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"}
@@ -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}),await(0,i.writeFile)(l,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))),`utf-8`)}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);try{await(0,i.writeFile)(l,h,`utf-8`),(0,o.logger)(`Successfully updated ${l}`,{level:`info`,isVerbose:!0})}catch(e){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 g=e.detectFormatCommand(d);if(g)try{(0,c.execSync)(g.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(`./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;
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 { readFile, writeFile } from 'node:fs/promises';\nimport { extname } 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 await writeFile(filePath, template, 'utf-8');\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 try {\n await writeFile(filePath, finalCode, 'utf-8');\n logger(`Successfully updated ${filePath}`, {\n level: 'info',\n isVerbose: true,\n });\n } catch (error) {\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,CAqBF,MAAA,EAAA,EAAA,WAAgB,EApBC,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,CAEmC,QAAQ,CAG9C,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,CAGhE,GAAI,CACF,MAAA,EAAA,EAAA,WAAgB,EAAU,EAAW,QAAQ,EAC7C,EAAA,EAAA,QAAO,wBAAwB,IAAY,CACzC,MAAO,OACP,UAAW,GACZ,CAAC,OACK,EAAO,CACd,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 { 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,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./_virtual/_rolldown/runtime.cjs`);let e=require(`node:fs/promises`);const t=async(t,n,{encoding:r=`utf8`}={})=>(await(0,e.writeFile)(t,n,{encoding:r}),!0);exports.writeFileIfChanged=t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./_virtual/_rolldown/runtime.cjs`);let e=require(`node:fs/promises`),t=require(`node:path`),n=require(`node:crypto`),r=require(`node:fs`);const i=new Set;process.on(`exit`,()=>{for(let e of i)try{(0,r.rmSync)(e,{force:!0})}catch{}});const a=e=>new Promise(t=>{let i=(0,n.createHash)(`sha256`),a=(0,r.createReadStream)(e);a.on(`data`,e=>i.update(e)),a.on(`end`,()=>t(i.digest(`hex`))),a.on(`error`,()=>t(null))}),o=async(r,o,{encoding:s=`utf8`,tempDir:c}={})=>{if((0,n.createHash)(`sha256`).update(o,s).digest(`hex`)===await a(r))return!1;c&&await(0,e.mkdir)(c,{recursive:!0});let l=`${(0,t.basename)(r)}.${Date.now()}-${(0,n.randomBytes)(4).toString(`hex`)}.tmp`,u=c?(0,t.join)(c,l):`${r}.${l}`;i.add(u);try{let t;try{t=(await(0,e.stat)(r)).mode}catch{}await(0,e.writeFile)(u,o,{encoding:s}),t!==void 0&&await(0,e.chmod)(u,t),await(0,e.rename)(u,r)}catch(t){try{await(0,e.rm)(u,{force:!0})}catch{}throw t}finally{i.delete(u)}return!0};exports.writeFileIfChanged=o;
2
2
  //# sourceMappingURL=writeFileIfChanged.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"writeFileIfChanged.cjs","names":[],"sources":["../../src/writeFileIfChanged.ts"],"sourcesContent":["import { writeFile } from 'node:fs/promises';\n// import { createHash } from 'node:crypto';\n// import { createReadStream } from 'node:fs';\n// import type { Readable } from 'node:stream';\n\n// const hashFile = async (path: string) => {\n// const h = createHash('sha256');\n// const rs = createReadStream(path);\n// rs.on('data', (chunk) => h.update(chunk));\n// await new Promise<void>((res, rej) => {\n// rs.on('end', () => res());\n// rs.on('error', rej);\n// });\n// return h.digest('hex');\n// };\n\n// const isReadableStream = (value: unknown): value is Readable =>\n// !!value &&\n// typeof value === 'object' &&\n// typeof (value as any).pipe === 'function';\n\nexport const writeFileIfChanged = async (\n path: string,\n dataOrStream: string,\n { encoding = 'utf8' }: { encoding?: BufferEncoding } = {}\n): Promise<boolean> => {\n // Disabled because it's too slow. Build time increases from 3s to 7s.\n await writeFile(path, dataOrStream, { encoding });\n\n // 1) write new content to temporary file (stream-safe)\n // const tmp = `${path}.tmp`;\n\n // if (isReadableStream(dataOrStream)) {\n // await pipeline(dataOrStream, createWriteStream(tmp));\n // } else {\n // // dataOrStream = string | Buffer\n // const buf = Buffer.isBuffer(dataOrStream)\n // ? dataOrStream\n // : Buffer.from(dataOrStream, encoding);\n // await writeFile(tmp, buf);\n // }\n\n // 2) if old file exists, compare hashes (streaming)\n // let same = false;\n // try {\n // const [oldHash, newHash] = await Promise.all([\n // hashFile(path),\n // hashFile(tmp),\n // ]);\n // same = oldHash === newHash;\n // } catch {\n // // old file missing -> will replace\n // }\n\n // if (same) {\n // await rm(tmp);\n // return false; // no change\n // }\n\n // 3) atomic replacement\n // On Unix, rename is atomic. On Windows, if file exists, we can delete it first.\n // try {\n // await rename(tmp, path);\n // } catch {\n // try {\n // await rm(path);\n // } catch {}\n // await rename(tmp, path);\n // }\n\n return true; // changed\n};\n"],"mappings":"iJAqBA,MAAa,EAAqB,MAChC,EACA,EACA,CAAE,WAAW,QAA0C,EAAE,IAGzD,MAAA,EAAA,EAAA,WAAgB,EAAM,EAAc,CAAE,WAAU,CAAC,CA2C1C"}
1
+ {"version":3,"file":"writeFileIfChanged.cjs","names":[],"sources":["../../src/writeFileIfChanged.ts"],"sourcesContent":["import { createHash, randomBytes } from 'node:crypto';\nimport { createReadStream, rmSync } from 'node:fs';\nimport { chmod, mkdir, rename, rm, stat, writeFile } from 'node:fs/promises';\nimport { basename, join } from 'node:path';\n\nconst activeTempFiles = new Set<string>();\n\n// Synchronous cleanup on process exit\nprocess.on('exit', () => {\n for (const file of activeTempFiles) {\n try {\n rmSync(file, { force: true });\n } catch {}\n }\n});\n\n// Helper to hash existing file via stream\nconst getFileHash = (path: string): Promise<string | null> => {\n return new Promise((resolve) => {\n const hash = createHash('sha256');\n const stream = createReadStream(path);\n stream.on('data', (chunk) => hash.update(chunk));\n stream.on('end', () => resolve(hash.digest('hex')));\n stream.on('error', () => resolve(null));\n });\n};\n\nexport const writeFileIfChanged = async (\n path: string,\n data: string,\n {\n encoding = 'utf8',\n tempDir,\n }: { encoding?: BufferEncoding; tempDir?: string } = {}\n): Promise<boolean> => {\n const newDataHash = createHash('sha256').update(data, encoding).digest('hex');\n const existingHash = await getFileHash(path);\n\n if (newDataHash === existingHash) {\n return false;\n }\n\n if (tempDir) {\n await mkdir(tempDir, { recursive: true });\n }\n\n const tempFileName = `${basename(path)}.${Date.now()}-${randomBytes(4).toString('hex')}.tmp`;\n const tempPath = tempDir\n ? join(tempDir, tempFileName)\n : `${path}.${tempFileName}`;\n activeTempFiles.add(tempPath);\n\n try {\n let mode: number | undefined;\n try {\n mode = (await stat(path)).mode;\n } catch {}\n\n await writeFile(tempPath, data, { encoding });\n\n if (mode !== undefined) {\n await chmod(tempPath, mode);\n }\n\n await rename(tempPath, path);\n } catch (error) {\n try {\n await rm(tempPath, { force: true });\n } catch {}\n throw error;\n } finally {\n activeTempFiles.delete(tempPath);\n }\n\n return true;\n};\n"],"mappings":"sNAKA,MAAM,EAAkB,IAAI,IAG5B,QAAQ,GAAG,WAAc,CACvB,IAAK,IAAM,KAAQ,EACjB,GAAI,EACF,EAAA,EAAA,QAAO,EAAM,CAAE,MAAO,GAAM,CAAC,MACvB,IAEV,CAGF,MAAM,EAAe,GACZ,IAAI,QAAS,GAAY,CAC9B,IAAM,GAAA,EAAA,EAAA,YAAkB,SAAS,CAC3B,GAAA,EAAA,EAAA,kBAA0B,EAAK,CACrC,EAAO,GAAG,OAAS,GAAU,EAAK,OAAO,EAAM,CAAC,CAChD,EAAO,GAAG,UAAa,EAAQ,EAAK,OAAO,MAAM,CAAC,CAAC,CACnD,EAAO,GAAG,YAAe,EAAQ,KAAK,CAAC,EACvC,CAGS,EAAqB,MAChC,EACA,EACA,CACE,WAAW,OACX,WACmD,EAAE,GAClC,CAIrB,IAAA,EAAA,EAAA,YAH+B,SAAS,CAAC,OAAO,EAAM,EAAS,CAAC,OAAO,MAAM,GACxD,MAAM,EAAY,EAAK,CAG1C,MAAO,GAGL,GACF,MAAA,EAAA,EAAA,OAAY,EAAS,CAAE,UAAW,GAAM,CAAC,CAG3C,IAAM,EAAe,IAAA,EAAA,EAAA,UAAY,EAAK,CAAC,GAAG,KAAK,KAAK,CAAC,IAAA,EAAA,EAAA,aAAe,EAAE,CAAC,SAAS,MAAM,CAAC,MACjF,EAAW,GAAA,EAAA,EAAA,MACR,EAAS,EAAa,CAC3B,GAAG,EAAK,GAAG,IACf,EAAgB,IAAI,EAAS,CAE7B,GAAI,CACF,IAAI,EACJ,GAAI,CACF,GAAQ,MAAA,EAAA,EAAA,MAAW,EAAK,EAAE,UACpB,EAER,MAAA,EAAA,EAAA,WAAgB,EAAU,EAAM,CAAE,WAAU,CAAC,CAEzC,IAAS,IAAA,IACX,MAAA,EAAA,EAAA,OAAY,EAAU,EAAK,CAG7B,MAAA,EAAA,EAAA,QAAa,EAAU,EAAK,OACrB,EAAO,CACd,GAAI,CACF,MAAA,EAAA,EAAA,IAAS,EAAU,CAAE,MAAO,GAAM,CAAC,MAC7B,EACR,MAAM,SACE,CACR,EAAgB,OAAO,EAAS,CAGlC,MAAO"}
package/dist/esm/cli.mjs CHANGED
@@ -1 +1 @@
1
- import{initIntlayer as e}from"./init/index.mjs";import{SKILLS as t,SKILLS_METADATA as n,installSkills as r}from"./installSkills/index.mjs";import{listGitFiles as i,listGitLines as a}from"./listGitFiles.mjs";import{listProjects as o}from"./listProjects.mjs";import{extractDictionaryKey as s}from"./transformFiles/extractDictionaryKey.mjs";import{ATTRIBUTES_TO_EXTRACT as c,extractIntlayer as l,generateKey as u,shouldExtract as d,transformFiles as f}from"./transformFiles/transformFiles.mjs";export{c as ATTRIBUTES_TO_EXTRACT,t as SKILLS,n as SKILLS_METADATA,s as extractDictionaryKey,l as extractIntlayer,u as generateKey,e as initIntlayer,r as installSkills,i as listGitFiles,a as listGitLines,o as listProjects,d as shouldExtract,f as transformFiles};
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};
@@ -0,0 +1 @@
1
+ import{getContentDeclarationFileTemplate as e}from"./getContentDeclarationFileTemplate.mjs";export{e as getContentDeclarationFileTemplate};