@intlayer/chokidar 8.1.7 → 8.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/assets/installSkills/skills/astro.md +2 -2
- package/dist/assets/installSkills/skills/cli.md +1 -1
- package/dist/assets/installSkills/skills/{next_js.md → next-js.md} +1 -2
- package/dist/cjs/build.cjs +1 -1
- package/dist/cjs/cli.cjs +1 -1
- package/dist/cjs/detectFormatCommand.cjs +2 -0
- package/dist/cjs/detectFormatCommand.cjs.map +1 -0
- package/dist/cjs/index.cjs +1 -1
- package/dist/cjs/init/index.cjs +1 -1
- package/dist/cjs/init/index.cjs.map +1 -1
- package/dist/cjs/init/utils/fileSystem.cjs +1 -1
- package/dist/cjs/init/utils/fileSystem.cjs.map +1 -1
- package/dist/cjs/init/utils/index.cjs +1 -1
- package/dist/cjs/transformFiles/transformFiles.cjs +1 -1
- package/dist/cjs/transformFiles/transformFiles.cjs.map +1 -1
- package/dist/cjs/watcher.cjs +1 -1
- package/dist/cjs/watcher.cjs.map +1 -1
- package/dist/cjs/writeContentDeclaration/index.cjs +1 -1
- package/dist/cjs/writeContentDeclaration/writeJSFile.cjs +1 -1
- package/dist/cjs/writeContentDeclaration/writeJSFile.cjs.map +1 -1
- package/dist/esm/build.mjs +1 -1
- package/dist/esm/cli.mjs +1 -1
- package/dist/esm/detectFormatCommand.mjs.map +1 -0
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/init/index.mjs +1 -1
- package/dist/esm/init/index.mjs.map +1 -1
- package/dist/esm/init/utils/fileSystem.mjs +1 -1
- package/dist/esm/init/utils/fileSystem.mjs.map +1 -1
- package/dist/esm/init/utils/index.mjs +1 -1
- package/dist/esm/transformFiles/transformFiles.mjs +1 -1
- package/dist/esm/transformFiles/transformFiles.mjs.map +1 -1
- package/dist/esm/watcher.mjs +1 -1
- package/dist/esm/watcher.mjs.map +1 -1
- package/dist/esm/writeContentDeclaration/index.mjs +1 -1
- package/dist/esm/writeContentDeclaration/writeJSFile.mjs +1 -1
- package/dist/esm/writeContentDeclaration/writeJSFile.mjs.map +1 -1
- package/dist/types/build.d.ts +1 -2
- package/dist/types/cli.d.ts +2 -1
- package/dist/types/{writeContentDeclaration/detectFormatCommand.d.ts → detectFormatCommand.d.ts} +1 -1
- package/dist/types/detectFormatCommand.d.ts.map +1 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/init/index.d.ts.map +1 -1
- package/dist/types/init/utils/fileSystem.d.ts +5 -1
- package/dist/types/init/utils/fileSystem.d.ts.map +1 -1
- package/dist/types/init/utils/index.d.ts +2 -2
- package/dist/types/watcher.d.ts.map +1 -1
- package/dist/types/writeContentDeclaration/index.d.ts +1 -2
- package/package.json +10 -10
- package/dist/cjs/writeContentDeclaration/detectFormatCommand.cjs +0 -2
- package/dist/cjs/writeContentDeclaration/detectFormatCommand.cjs.map +0 -1
- package/dist/esm/writeContentDeclaration/detectFormatCommand.mjs.map +0 -1
- package/dist/types/writeContentDeclaration/detectFormatCommand.d.ts.map +0 -1
- /package/dist/assets/installSkills/skills/{remote_content.md → remote-content.md} +0 -0
- /package/dist/esm/{writeContentDeclaration/detectFormatCommand.mjs → detectFormatCommand.mjs} +0 -0
package/dist/esm/cli.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{listDictionaries as e,listDictionariesWithStats as t}from"./listDictionariesPath.mjs";import{
|
|
1
|
+
import{listDictionaries as e,listDictionariesWithStats as t}from"./listDictionariesPath.mjs";import{detectFormatCommand as n}from"./detectFormatCommand.mjs";import{getContentDeclarationFileTemplate as r}from"./getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.mjs";import{initIntlayer as i}from"./init/index.mjs";import{SKILLS as a,SKILLS_METADATA as o,installSkills as s}from"./installSkills/index.mjs";import{listGitFiles as c,listGitLines as l}from"./listGitFiles.mjs";import{listProjects as u}from"./listProjects.mjs";import{extractDictionaryKey as d}from"./transformFiles/extractDictionaryKey.mjs";import{ATTRIBUTES_TO_EXTRACT as f,extractIntlayer as p,shouldExtract as m,transformFiles as h}from"./transformFiles/transformFiles.mjs";export{f as ATTRIBUTES_TO_EXTRACT,a as SKILLS,o as SKILLS_METADATA,n as detectFormatCommand,d as extractDictionaryKey,p as extractIntlayer,r as getContentDeclarationFileTemplate,i as initIntlayer,s as installSkills,e as listDictionaries,t as listDictionariesWithStats,c as listGitFiles,l as listGitLines,u as listProjects,m as shouldExtract,h as transformFiles};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectFormatCommand.mjs","names":[],"sources":["../../src/detectFormatCommand.ts"],"sourcesContent":["import { getProjectRequire } from '@intlayer/config/utils';\nimport type { IntlayerConfig } from '@intlayer/types';\n\nlet cachedFormatCommand: string | undefined | null = null;\n\nexport const detectFormatCommand = (\n configuration: IntlayerConfig,\n projectRequireProp?: NodeJS.Require\n) => {\n const { formatCommand, baseDir } = configuration.content;\n const projectRequire = projectRequireProp ?? getProjectRequire(baseDir);\n\n // Priority: Explicit configuration\n // We do not cache this because the user might change their config file active-session.\n if (formatCommand) {\n return formatCommand;\n }\n\n // Priority: Cached detection\n // If not null, we have already performed the expensive checks.\n if (cachedFormatCommand !== null) {\n return cachedFormatCommand;\n }\n\n // Perform Detection\n\n // Try Prettier\n try {\n projectRequire.resolve('prettier');\n cachedFormatCommand = 'prettier --write \"{{file}}\" --log-level silent';\n return cachedFormatCommand;\n } catch (_error) {\n // Prettier not found, continue\n }\n\n // Try Biome\n try {\n projectRequire.resolve('biome');\n cachedFormatCommand = 'biome format \"{{file}}\" --write --log-level none';\n return cachedFormatCommand;\n } catch (_error) {\n // Biome not found, continue\n }\n\n // Try ESLint\n try {\n projectRequire.resolve('eslint');\n cachedFormatCommand = 'eslint --fix \"{{file}}\" --quiet';\n return cachedFormatCommand;\n } catch (_error) {\n // ESLint not found\n }\n\n // No formatter found\n // Set to undefined (not null) so we know we checked and found nothing.\n cachedFormatCommand = undefined;\n return undefined;\n};\n"],"mappings":"2DAGA,IAAI,EAAiD,KAErD,MAAa,GACX,EACA,IACG,CACH,GAAM,CAAE,gBAAe,WAAY,EAAc,QAC3C,EAAiB,GAAsB,EAAkB,EAAQ,CAIvE,GAAI,EACF,OAAO,EAKT,GAAI,IAAwB,KAC1B,OAAO,EAMT,GAAI,CAGF,OAFA,EAAe,QAAQ,WAAW,CAClC,EAAsB,iDACf,OACQ,EAKjB,GAAI,CAGF,OAFA,EAAe,QAAQ,QAAQ,CAC/B,EAAsB,mDACf,OACQ,EAKjB,GAAI,CAGF,OAFA,EAAe,QAAQ,SAAS,CAChC,EAAsB,kCACf,OACQ,EAMjB,EAAsB,IAAA"}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Queue as e,pLimit as t}from"./utils/pLimit.mjs";import{parallelize as n}from"./utils/parallelize.mjs";import{formatLocale as r,formatPath as i}from"./utils/formatter.mjs";import{buildDictionary as a}from"./buildIntlayerDictionary/buildIntlayerDictionary.mjs";import{autoDecorateContent as o}from"./utils/autoDecorateContent.mjs";import{resolveObjectPromises as s}from"./utils/resolveObjectPromises.mjs";import{processContentDeclaration as c}from"./buildIntlayerDictionary/processContentDeclaration.mjs";import{cleanOutputDir as l}from"./cleanOutputDir.mjs";import{getFileHash as u}from"./utils/getFileHash.mjs";import{generateDictionaryListContent as d}from"./createDictionaryEntryPoint/generateDictionaryListContent.mjs";import{getBuiltDictionariesPath as f}from"./createDictionaryEntryPoint/getBuiltDictionariesPath.mjs";import{getBuiltDynamicDictionariesPath as p}from"./createDictionaryEntryPoint/getBuiltDynamicDictionariesPath.mjs";import{getBuiltFetchDictionariesPath as m}from"./createDictionaryEntryPoint/getBuiltFetchDictionariesPath.mjs";import{getBuiltRemoteDictionariesPath as h}from"./createDictionaryEntryPoint/getBuiltRemoteDictionariesPath.mjs";import{getBuiltUnmergedDictionariesPath as g}from"./createDictionaryEntryPoint/getBuiltUnmergedDictionariesPath.mjs";import{createDictionaryEntryPoint as _}from"./createDictionaryEntryPoint/createDictionaryEntryPoint.mjs";import{createModuleAugmentation as v,getTypeName as y}from"./createType/createModuleAugmentation.mjs";import{createTypes as b,generateTypeScriptType as x}from"./createType/createType.mjs";import{formatDictionaries as S,formatDictionariesOutput as C,formatDictionary as w,formatDictionaryOutput as T}from"./formatDictionary.mjs";import{formatLocalDictionaries as E,loadContentDeclarations as D}from"./loadDictionaries/loadContentDeclaration.mjs";import{sortAlphabetically as O}from"./utils/sortAlphabetically.mjs";import{formatDistantDictionaries as k,loadRemoteDictionaries as A}from"./loadDictionaries/loadRemoteDictionaries.mjs";import{loadDictionaries as j}from"./loadDictionaries/loadDictionaries.mjs";import{loadLocalDictionaries as M}from"./loadDictionaries/loadLocalDictionaries.mjs";import{listDictionaries as N,listDictionariesWithStats as P}from"./listDictionariesPath.mjs";import{runOnce as F}from"./utils/runOnce.mjs";import{isCachedConfigurationUpToDate as I,writeConfiguration as L}from"./writeConfiguration/index.mjs";import{prepareIntlayer as R}from"./prepareIntlayer.mjs";import{detectExportedComponentName as z}from"./writeContentDeclaration/detectExportedComponentName.mjs";import{
|
|
1
|
+
import{Queue as e,pLimit as t}from"./utils/pLimit.mjs";import{parallelize as n}from"./utils/parallelize.mjs";import{formatLocale as r,formatPath as i}from"./utils/formatter.mjs";import{buildDictionary as a}from"./buildIntlayerDictionary/buildIntlayerDictionary.mjs";import{autoDecorateContent as o}from"./utils/autoDecorateContent.mjs";import{resolveObjectPromises as s}from"./utils/resolveObjectPromises.mjs";import{processContentDeclaration as c}from"./buildIntlayerDictionary/processContentDeclaration.mjs";import{cleanOutputDir as l}from"./cleanOutputDir.mjs";import{getFileHash as u}from"./utils/getFileHash.mjs";import{generateDictionaryListContent as d}from"./createDictionaryEntryPoint/generateDictionaryListContent.mjs";import{getBuiltDictionariesPath as f}from"./createDictionaryEntryPoint/getBuiltDictionariesPath.mjs";import{getBuiltDynamicDictionariesPath as p}from"./createDictionaryEntryPoint/getBuiltDynamicDictionariesPath.mjs";import{getBuiltFetchDictionariesPath as m}from"./createDictionaryEntryPoint/getBuiltFetchDictionariesPath.mjs";import{getBuiltRemoteDictionariesPath as h}from"./createDictionaryEntryPoint/getBuiltRemoteDictionariesPath.mjs";import{getBuiltUnmergedDictionariesPath as g}from"./createDictionaryEntryPoint/getBuiltUnmergedDictionariesPath.mjs";import{createDictionaryEntryPoint as _}from"./createDictionaryEntryPoint/createDictionaryEntryPoint.mjs";import{createModuleAugmentation as v,getTypeName as y}from"./createType/createModuleAugmentation.mjs";import{createTypes as b,generateTypeScriptType as x}from"./createType/createType.mjs";import{formatDictionaries as S,formatDictionariesOutput as C,formatDictionary as w,formatDictionaryOutput as T}from"./formatDictionary.mjs";import{formatLocalDictionaries as E,loadContentDeclarations as D}from"./loadDictionaries/loadContentDeclaration.mjs";import{sortAlphabetically as O}from"./utils/sortAlphabetically.mjs";import{formatDistantDictionaries as k,loadRemoteDictionaries as A}from"./loadDictionaries/loadRemoteDictionaries.mjs";import{loadDictionaries as j}from"./loadDictionaries/loadDictionaries.mjs";import{loadLocalDictionaries as M}from"./loadDictionaries/loadLocalDictionaries.mjs";import{listDictionaries as N,listDictionariesWithStats as P}from"./listDictionariesPath.mjs";import{runOnce as F}from"./utils/runOnce.mjs";import{isCachedConfigurationUpToDate as I,writeConfiguration as L}from"./writeConfiguration/index.mjs";import{prepareIntlayer as R}from"./prepareIntlayer.mjs";import{detectExportedComponentName as z}from"./writeContentDeclaration/detectExportedComponentName.mjs";import{transformJSFile as B}from"./writeContentDeclaration/transformJSFile.mjs";import{getExtensionFromFormat as V,getFormatFromExtension as H}from"./utils/getFormatFromExtension.mjs";import{detectFormatCommand as U}from"./detectFormatCommand.mjs";import{getContentDeclarationFileTemplate as W}from"./getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.mjs";import{writeJSFile as G}from"./writeContentDeclaration/writeJSFile.mjs";import{writeContentDeclaration as K}from"./writeContentDeclaration/writeContentDeclaration.mjs";import{initIntlayer as q}from"./init/index.mjs";import{SKILLS as J,SKILLS_METADATA as Y,installSkills as X}from"./installSkills/index.mjs";import{listGitFiles as Z,listGitLines as Q}from"./listGitFiles.mjs";import{listProjects as $}from"./listProjects.mjs";import{extractDictionaryKey as ee}from"./transformFiles/extractDictionaryKey.mjs";import{ATTRIBUTES_TO_EXTRACT as te,extractIntlayer as ne,shouldExtract as re,transformFiles as ie}from"./transformFiles/transformFiles.mjs";import{buildFilesList as ae}from"./utils/buildFilesList.mjs";import{splitTextByLines as oe}from"./utils/splitTextByLine.mjs";import{getChunk as se}from"./utils/getChunk.mjs";import{assembleJSON as ce,chunkJSON as le,reconstructFromSingleChunk as ue}from"./utils/chunkJSON.mjs";import{getComponentTransformPattern as de,getComponentTransformPatternSync as fe}from"./utils/getComponentTransformPattern.mjs";import{mergeChunks as pe}from"./utils/mergeChunks.mjs";import{getGlobalLimiter as me,getTaskLimiter as he,parallelizeGlobal as ge}from"./utils/parallelizeGlobal.mjs";import{reduceObjectFormat as _e}from"./utils/reduceObjectFormat.mjs";import{runParallel as ve}from"./utils/runParallel/index.mjs";import{verifyIdenticObjectFormat as ye}from"./utils/verifyIdenticObjectFormat.mjs";import{buildAndWatchIntlayer as be,watch as xe}from"./watcher.mjs";export{te as ATTRIBUTES_TO_EXTRACT,e as Queue,J as SKILLS,Y as SKILLS_METADATA,ce as assembleJSON,o as autoDecorateContent,be as buildAndWatchIntlayer,a as buildDictionary,ae as buildFilesList,le as chunkJSON,l as cleanOutputDir,_ as createDictionaryEntryPoint,v as createModuleAugmentation,b as createTypes,z as detectExportedComponentName,U as detectFormatCommand,ee as extractDictionaryKey,ne as extractIntlayer,S as formatDictionaries,C as formatDictionariesOutput,w as formatDictionary,T as formatDictionaryOutput,k as formatDistantDictionaries,E as formatLocalDictionaries,r as formatLocale,i as formatPath,d as generateDictionaryListContent,x as generateTypeScriptType,f as getBuiltDictionariesPath,p as getBuiltDynamicDictionariesPath,m as getBuiltFetchDictionariesPath,h as getBuiltRemoteDictionariesPath,g as getBuiltUnmergedDictionariesPath,se as getChunk,de as getComponentTransformPattern,fe as getComponentTransformPatternSync,W as getContentDeclarationFileTemplate,V as getExtensionFromFormat,u as getFileHash,H as getFormatFromExtension,me as getGlobalLimiter,he as getTaskLimiter,y as getTypeName,q as initIntlayer,X as installSkills,I as isCachedConfigurationUpToDate,N as listDictionaries,P as listDictionariesWithStats,Z as listGitFiles,Q as listGitLines,$ as listProjects,D as loadContentDeclarations,j as loadDictionaries,M as loadLocalDictionaries,A as loadRemoteDictionaries,pe as mergeChunks,t as pLimit,n as parallelize,ge as parallelizeGlobal,R as prepareIntlayer,c as processContentDeclaration,ue as reconstructFromSingleChunk,_e as reduceObjectFormat,s as resolveObjectPromises,F as runOnce,ve as runParallel,re as shouldExtract,O as sortAlphabetically,oe as splitTextByLines,ie as transformFiles,B as transformJSFile,ye as verifyIdenticObjectFormat,xe as watch,L as writeConfiguration,K as writeContentDeclaration,G as writeJSFile};
|
package/dist/esm/init/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{initConfig as e}from"../initConfig/index.mjs";import{updateNextConfig as t,updateViteConfig as n}from"./utils/configManipulation.mjs";import{
|
|
1
|
+
import{initConfig as e}from"../initConfig/index.mjs";import{updateNextConfig as t,updateViteConfig as n}from"./utils/configManipulation.mjs";import{ensureDirectory as r,exists as i,readFileFromRoot as a,writeFileToRoot as o}from"./utils/fileSystem.mjs";import{parseJSONWithComments as s}from"./utils/jsonParser.mjs";import{findTsConfigFiles as c}from"./utils/tsConfig.mjs";import{getConfiguration as l}from"@intlayer/config/node";import{join as u}from"node:path";import{ANSIColors as d,colorize as f,colorizePath as p,logger as m,v as h,x as g}from"@intlayer/config/logger";import{getAlias as _}from"@intlayer/config/utils";const v={NextJS:`https://intlayer.org/doc/environment/nextjs.md`,NextJS_15:`https://intlayer.org/doc/environment/nextjs/15.md`,NextJS_14:`https://intlayer.org/doc/environment/nextjs/14.md`,CRA:`https://intlayer.org/doc/environment/create-react-app.md`,Astro:`https://intlayer.org/doc/environment/astro.md`,ViteAndReact:`https://intlayer.org/doc/environment/vite-and-react.md`,ViteAndReact_ReactRouterV7:`https://intlayer.org/doc/environment/vite-and-react/react-router-v7.md`,ViteAndReact_ReactRouterV7_FSRoutes:`https://intlayer.org/doc/environment/vite-and-react/react-router-v7-fs-routes.md`,ViteAndVue:`https://intlayer.org/doc/environment/vite-and-vue.md`,ViteAndSolid:`https://intlayer.org/doc/environment/vite-and-solid.md`,ViteAndSvelte:`https://intlayer.org/doc/environment/vite-and-svelte.md`,ViteAndPreact:`https://intlayer.org/doc/environment/vite-and-preact.md`,TanStackRouter:`https://intlayer.org/doc/environment/tanstack.md`,NuxtAndVue:`https://intlayer.org/doc/environment/nuxt-and-vue.md`,Angular:`https://intlayer.org/doc/environment/angular.md`,SvelteKit:`https://intlayer.org/doc/environment/sveltekit.md`,ReactNativeAndExpo:`https://intlayer.org/doc/environment/react-native-and-expo.md`,Lynx:`https://intlayer.org/doc/environment/lynx-and-react.md`,Express:`https://intlayer.org/doc/environment/express.md`,NestJS:`https://intlayer.org/doc/environment/nestjs.md`,Fastify:`https://intlayer.org/doc/environment/fastify.md`,Default:`https://intlayer.org/doc/get-started`,NextIntl:`https://intlayer.org/blog/intlayer-with-next-intl.md`,ReactI18Next:`https://intlayer.org/blog/intlayer-with-react-i18next.md`,ReactIntl:`https://intlayer.org/blog/intlayer-with-react-intl.md`,NextI18Next:`https://intlayer.org/blog/intlayer-with-next-i18next.md`,VueI18n:`https://intlayer.org/blog/intlayer-with-vue-i18n.md`},y=e=>{let t={...e.dependencies,...e.devDependencies},n=(e,t)=>!e||typeof e!=`string`?!1:RegExp(`^[\\^~]?${t}(?:\\.|$)`).test(e);if(t[`@lynx-js/react`]||t[`@lynx-js/core`])return v.Lynx;if(t[`react-native`]||t.expo)return v.ReactNativeAndExpo;if(t.next){let e=t.next;return n(e,14)?v.NextJS_14:n(e,15)?v.NextJS_15:v.NextJS}if(t.nuxt)return v.NuxtAndVue;if(t.astro)return v.Astro;if(t[`@sveltejs/kit`])return v.SvelteKit;if(t[`@tanstack/react-router`])return v.TanStackRouter;let r=t[`react-router`];if(r&&typeof r==`string`){if(t[`@react-router/fs-routes`])return v.ViteAndReact_ReactRouterV7_FSRoutes;if(n(r,7))return v.ViteAndReact_ReactRouterV7}return t.vite?t.vue?v.ViteAndVue:t[`solid-js`]?v.ViteAndSolid:t.svelte?v.ViteAndSvelte:t.preact?v.ViteAndPreact:v.ViteAndReact:t[`react-scripts`]?v.CRA:t[`@angular/core`]?v.Angular:t[`@nestjs/core`]?v.NestJS:t.express?v.Express:t.fastify?v.Fastify:t[`next-intl`]?v.NextIntl:t[`react-i18next`]||t.i18next?v.ReactI18Next:t[`react-intl`]?v.ReactIntl:t[`next-i18next`]?v.NextI18Next:t[`vue-i18n`]?v.VueI18n:v.Default},b=async v=>{m(f(`Checking Intlayer configuration...`,d.CYAN));let b=`package.json`;await i(v,b)||(m(`${g} No ${p(`package.json`)} found. Please run this script from the project root.`,{level:`error`}),process.exit(1));let x=await a(v,b),S;try{S=JSON.parse(x)}catch{m(`${g} Could not parse ${p(`package.json`)}.`,{level:`error`}),process.exit(1)}let C=y(S),w=`.gitignore`;if(await i(v,w)){let e=await a(v,w);e.includes(`intlayer`)?m(`${h} ${p(w)} already includes .intlayer`):(await o(v,w,`${e}\n# Intlayer\n.intlayer\n`),m(`${h} Added ${p(`.intlayer`)} to ${p(w)}`))}let T=`.vscode`,E=u(T,`extensions.json`),D=`intlayer.intlayer-vs-code-extension`;try{let e={recommendations:[]};await i(v,E)?e=s(await a(v,E)):await r(v,T),e.recommendations||=[],e.recommendations.includes(D)?m(`${h} ${p(E)} already includes ${f(D,d.MAGENTA)}`):(e.recommendations.push(D),await o(v,E,JSON.stringify(e,null,2)),m(`${h} Added ${f(D,d.MAGENTA)} to ${p(E)}`))}catch{m(`${g} Could not update ${p(E)}. You may need to add ${f(D,d.MAGENTA)} manually.`,{level:`warn`})}let O=await c(v),k=!1;for(let e of O)if(await i(v,e)){k=!0;try{let t=s(await a(v,e)),n=`.intlayer/**/*.ts`,r=!1;t.include&&(Array.isArray(t.include)&&!t.include.some(e=>e.includes(`.intlayer`))?(t.include.push(n),r=!0):t.include.includes(n)&&m(`${h} ${p(e)} already includes intlayer types`)),r&&(await o(v,e,JSON.stringify(t,null,2)),m(`${h} Updated ${p(e)} to include intlayer types`))}catch{m(`${g} Could not parse or update ${p(e)}. You may need to add ${p(`.intlayer/types/**/*.ts`)} manually.`,{level:`warn`})}}await e(k?`intlayer.config.ts`:`intlayer.config.mjs`,v);let A=!1;for(let e of[`vite.config.ts`,`vite.config.js`,`vite.config.mjs`])if(await i(v,e)){A=!0;let t=await a(v,e);t.includes(`vite-intlayer`)||(await o(v,e,n(t,e.split(`.`).pop())),m(`${h} Updated ${p(e)} to include Intlayer plugin`));break}for(let e of[`next.config.js`,`next.config.mjs`,`next.config.ts`])if(await i(v,e)){A=!0;let n=await a(v,e);n.includes(`next-intlayer`)||(await o(v,e,t(n,e.split(`.`).pop())),m(`${h} Updated ${p(e)} to include Intlayer plugin`));break}for(let e of[`webpack.config.js`,`webpack.config.ts`,`webpack.config.mjs`,`webpack.config.cjs`])if(await i(v,e)){A=!0,m(`${h} Found ${p(e)}. Make sure to configure aliases manually or use the Intlayer Webpack plugin.`);break}if(!A){let e=_({configuration:l({baseDir:v})});if(k&&O.length>0){let t=O.find(e=>e===`tsconfig.json`)||O[0],n=s(await a(v,t));n.compilerOptions??={},n.compilerOptions.paths??={};let r=!1;Object.entries(e).forEach(([e,t])=>{n.compilerOptions.paths[e]||(n.compilerOptions.paths[e]=[t],r=!0)}),r&&(await o(v,t,JSON.stringify(n,null,2)),m(`${h} Updated ${p(t)} to include Intlayer aliases`))}else{let t=`jsconfig.json`;if(await i(v,t)){let n=s(await a(v,t));n.compilerOptions??={},n.compilerOptions.paths??={};let r=!1;Object.entries(e).forEach(([e,t])=>{n.compilerOptions.paths[e]||(n.compilerOptions.paths[e]=[t],r=!0)}),r&&(await o(v,t,JSON.stringify(n,null,2)),m(`${h} Updated ${p(t)} to include Intlayer aliases`))}else{S.imports??={};let t=!1;Object.entries(e).forEach(([e,n])=>{let r=e.replace(`@`,`#`),i=n.startsWith(`.`)?n:`./${n}`;S.imports[r]||(S.imports[r]=i,t=!0)}),t&&(await o(v,b,JSON.stringify(S,null,2)),m(`${h} Updated ${p(b)} to include Intlayer imports`))}}}m(`${h} ${f(`Intlayer init setup complete.`,d.GREEN)}`),m([f(`Next →`,d.MAGENTA),f(`Follow the instructions in the documentation to complete the setup:`,d.GREY_LIGHT),p(C)])};export{b as initIntlayer};
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/init/index.ts"],"sourcesContent":["import {\n ANSIColors,\n colorize,\n colorizePath,\n logger,\n v,\n x,\n} from '@intlayer/config/logger';\nimport { getConfiguration } from '@intlayer/config/node';\nimport { getAlias } from '@intlayer/config/utils';\nimport { initConfig } from '../initConfig';\nimport {\n exists,\n findTsConfigFiles,\n parseJSONWithComments,\n readFileFromRoot,\n updateNextConfig,\n updateViteConfig,\n writeFileToRoot,\n} from './utils';\n\n/**\n * Documentation URL Constants\n */\nconst DocumentationRouter = {\n NextJS: 'https://intlayer.org/doc/environment/nextjs.md',\n NextJS_15: 'https://intlayer.org/doc/environment/nextjs/15.md',\n NextJS_14: 'https://intlayer.org/doc/environment/nextjs/14.md',\n CRA: 'https://intlayer.org/doc/environment/create-react-app.md',\n Astro: 'https://intlayer.org/doc/environment/astro.md',\n ViteAndReact: 'https://intlayer.org/doc/environment/vite-and-react.md',\n ViteAndReact_ReactRouterV7:\n 'https://intlayer.org/doc/environment/vite-and-react/react-router-v7.md',\n ViteAndReact_ReactRouterV7_FSRoutes:\n 'https://intlayer.org/doc/environment/vite-and-react/react-router-v7-fs-routes.md',\n ViteAndVue: 'https://intlayer.org/doc/environment/vite-and-vue.md',\n ViteAndSolid: 'https://intlayer.org/doc/environment/vite-and-solid.md',\n ViteAndSvelte: 'https://intlayer.org/doc/environment/vite-and-svelte.md',\n ViteAndPreact: 'https://intlayer.org/doc/environment/vite-and-preact.md',\n TanStackRouter: 'https://intlayer.org/doc/environment/tanstack.md',\n NuxtAndVue: 'https://intlayer.org/doc/environment/nuxt-and-vue.md',\n Angular: 'https://intlayer.org/doc/environment/angular.md',\n SvelteKit: 'https://intlayer.org/doc/environment/sveltekit.md',\n ReactNativeAndExpo:\n 'https://intlayer.org/doc/environment/react-native-and-expo.md',\n Lynx: 'https://intlayer.org/doc/environment/lynx-and-react.md',\n Express: 'https://intlayer.org/doc/environment/express.md',\n NestJS: 'https://intlayer.org/doc/environment/nestjs.md',\n Fastify: 'https://intlayer.org/doc/environment/fastify.md',\n Default: 'https://intlayer.org/doc/get-started',\n\n // Check for competitors libs\n NextIntl: 'https://intlayer.org/blog/intlayer-with-next-intl.md',\n ReactI18Next: 'https://intlayer.org/blog/intlayer-with-react-i18next.md',\n ReactIntl: 'https://intlayer.org/blog/intlayer-with-react-intl.md',\n NextI18Next: 'https://intlayer.org/blog/intlayer-with-next-i18next.md',\n VueI18n: 'https://intlayer.org/blog/intlayer-with-vue-i18n.md',\n};\n\n/**\n * Helper: Detects the environment and returns the doc URL\n */\nconst getDocumentationUrl = (packageJson: any): string => {\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n /**\n * Helper to check if a version string matches a specific major version\n * Matches: \"15\", \"^15.0.0\", \"~15.2\", \"15.0.0-beta\"\n */\n const isVersion = (versionString: string, major: number): boolean => {\n if (!versionString || typeof versionString !== 'string') return false;\n const regex = new RegExp(`^[\\\\^~]?${major}(?:\\\\.|$)`);\n return regex.test(versionString);\n };\n\n // Mobile / Cross-platform\n if (deps['@lynx-js/react'] || deps['@lynx-js/core']) {\n return DocumentationRouter.Lynx;\n }\n if (deps['react-native'] || deps.expo) {\n return DocumentationRouter.ReactNativeAndExpo;\n }\n\n // Meta-frameworks (Next, Nuxt, Astro, SvelteKit)\n if (deps.next) {\n const version = deps.next;\n\n if (isVersion(version, 14)) {\n return DocumentationRouter.NextJS_14;\n }\n\n if (isVersion(version, 15)) {\n return DocumentationRouter.NextJS_15;\n }\n\n return DocumentationRouter.NextJS;\n }\n\n if (deps.nuxt) return DocumentationRouter.NuxtAndVue;\n if (deps.astro) return DocumentationRouter.Astro;\n if (deps['@sveltejs/kit']) return DocumentationRouter.SvelteKit;\n\n // Routers (TanStack & React Router v7)\n if (deps['@tanstack/react-router']) {\n return DocumentationRouter.TanStackRouter;\n }\n\n // Check for React Router v7\n const reactRouterVersion = deps['react-router'];\n if (reactRouterVersion && typeof reactRouterVersion === 'string') {\n // Distinguish between standard v7 and v7 with FS routes\n if (deps['@react-router/fs-routes']) {\n return DocumentationRouter.ViteAndReact_ReactRouterV7_FSRoutes;\n }\n\n // Use Regex to ensure it is v7\n if (isVersion(reactRouterVersion, 7)) {\n return DocumentationRouter.ViteAndReact_ReactRouterV7;\n }\n }\n\n // Vite Ecosystem (General)\n if (deps.vite) {\n if (deps.vue) return DocumentationRouter.ViteAndVue;\n if (deps['solid-js']) return DocumentationRouter.ViteAndSolid;\n if (deps.svelte) return DocumentationRouter.ViteAndSvelte;\n if (deps.preact) return DocumentationRouter.ViteAndPreact;\n\n // Default to React if Vite is present but specific other frameworks aren't found\n return DocumentationRouter.ViteAndReact;\n }\n\n // Other Web Frameworks\n if (deps['react-scripts']) return DocumentationRouter.CRA;\n if (deps['@angular/core']) return DocumentationRouter.Angular;\n\n // Backend\n if (deps['@nestjs/core']) return DocumentationRouter.NestJS;\n if (deps.express) return DocumentationRouter.Express;\n if (deps.fastify) return DocumentationRouter.Fastify;\n\n // Competitor Libs (Migration Guides)\n // We check these last as specific environment setup is usually higher priority,\n // but if no specific framework logic matched (or as a fallback), we guide to migration.\n if (deps['next-intl']) return DocumentationRouter.NextIntl;\n if (deps['react-i18next'] || deps.i18next)\n return DocumentationRouter.ReactI18Next;\n if (deps['react-intl']) return DocumentationRouter.ReactIntl;\n if (deps['next-i18next']) return DocumentationRouter.NextI18Next;\n if (deps['vue-i18n']) return DocumentationRouter.VueI18n;\n\n return DocumentationRouter.Default;\n};\n\n/**\n * MAIN LOGIC\n */\nexport const initIntlayer = async (rootDir: string) => {\n logger(colorize('Checking Intlayer configuration...', ANSIColors.CYAN));\n\n // READ PACKAGE.JSON\n const packageJsonPath = 'package.json';\n if (!(await exists(rootDir, packageJsonPath))) {\n logger(\n `${x} No ${colorizePath('package.json')} found. Please run this script from the project root.`,\n { level: 'error' }\n );\n process.exit(1);\n }\n\n const packageJsonContent = await readFileFromRoot(rootDir, packageJsonPath);\n let packageJson: Record<string, any>;\n try {\n packageJson = JSON.parse(packageJsonContent);\n } catch {\n logger(`${x} Could not parse ${colorizePath('package.json')}.`, {\n level: 'error',\n });\n process.exit(1);\n }\n\n // Determine the correct documentation URL based on dependencies\n const guideUrl = getDocumentationUrl(packageJson);\n\n // 2. CHECK .GITIGNORE\n const gitignorePath = '.gitignore';\n if (await exists(rootDir, gitignorePath)) {\n const gitignoreContent = await readFileFromRoot(rootDir, gitignorePath);\n\n if (!gitignoreContent.includes('intlayer')) {\n const newContent = `${gitignoreContent}\\n# Intlayer\\n.intlayer\\n`;\n await writeFileToRoot(rootDir, gitignorePath, newContent);\n logger(\n `${v} Added ${colorizePath('.intlayer')} to ${colorizePath(gitignorePath)}`\n );\n } else {\n logger(`${v} ${colorizePath(gitignorePath)} already includes .intlayer`);\n }\n }\n\n // CHECK TSCONFIGS\n const tsConfigFiles = await findTsConfigFiles(rootDir);\n let hasTsConfig = false;\n\n for (const fileName of tsConfigFiles) {\n if (await exists(rootDir, fileName)) {\n hasTsConfig = true;\n try {\n const fileContent = await readFileFromRoot(rootDir, fileName);\n const config = parseJSONWithComments(fileContent);\n const typeDefinition = '.intlayer/**/*.ts';\n\n let updated = false;\n\n if (!config.include) {\n // Skip if no include array (solution-style)\n } else if (\n Array.isArray(config.include) &&\n !(config.include as string[]).some((pattern: string) =>\n pattern.includes('.intlayer')\n )\n ) {\n config.include.push(typeDefinition);\n updated = true;\n } else if (config.include.includes(typeDefinition)) {\n logger(\n `${v} ${colorizePath(fileName)} already includes intlayer types`\n );\n }\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n fileName,\n JSON.stringify(config, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(fileName)} to include intlayer types`\n );\n }\n } catch {\n logger(\n `${x} Could not parse or update ${colorizePath(fileName)}. You may need to add ${colorizePath('.intlayer/types/**/*.ts')} manually.`,\n { level: 'warn' }\n );\n }\n }\n }\n\n // INITIALIZE CONFIG FILE\n const format = hasTsConfig ? 'intlayer.config.ts' : 'intlayer.config.mjs';\n await initConfig(format, rootDir);\n\n let hasAliasConfiguration = false;\n\n // CHECK VITE CONFIG\n const viteConfigs = ['vite.config.ts', 'vite.config.js', 'vite.config.mjs'];\n for (const file of viteConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n const content = await readFileFromRoot(rootDir, file);\n\n if (!content.includes('vite-intlayer')) {\n const extension = file.split('.').pop()!;\n const updatedContent = updateViteConfig(content, extension);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(`${v} Updated ${colorizePath(file)} to include Intlayer plugin`);\n }\n break;\n }\n }\n\n // CHECK NEXT CONFIG\n const nextConfigs = ['next.config.js', 'next.config.mjs', 'next.config.ts'];\n for (const file of nextConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n const content = await readFileFromRoot(rootDir, file);\n\n if (!content.includes('next-intlayer')) {\n const extension = file.split('.').pop()!;\n const updatedContent = updateNextConfig(content, extension);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(`${v} Updated ${colorizePath(file)} to include Intlayer plugin`);\n }\n break;\n }\n }\n\n // CHECK WEBPACK CONFIG\n const webpackConfigs = [\n 'webpack.config.js',\n 'webpack.config.ts',\n 'webpack.config.mjs',\n 'webpack.config.cjs',\n ];\n for (const file of webpackConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n logger(\n `${v} Found ${colorizePath(\n file\n )}. Make sure to configure aliases manually or use the Intlayer Webpack plugin.`\n );\n break;\n }\n }\n\n if (!hasAliasConfiguration) {\n const configuration = getConfiguration({ baseDir: rootDir });\n const aliases = getAlias({ configuration });\n\n if (hasTsConfig && tsConfigFiles.length > 0) {\n const tsConfigPath =\n tsConfigFiles.find((f) => f === 'tsconfig.json') || tsConfigFiles[0];\n const tsConfigContent = await readFileFromRoot(rootDir, tsConfigPath);\n const config = parseJSONWithComments(tsConfigContent);\n\n config.compilerOptions ??= {};\n config.compilerOptions.paths ??= {};\n\n let updated = false;\n\n Object.entries(aliases).forEach(([alias, path]) => {\n if (!config.compilerOptions.paths[alias]) {\n config.compilerOptions.paths[alias] = [path];\n updated = true;\n }\n });\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n tsConfigPath,\n JSON.stringify(config, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(\n tsConfigPath\n )} to include Intlayer aliases`\n );\n }\n } else {\n const jsConfigPath = 'jsconfig.json';\n if (await exists(rootDir, jsConfigPath)) {\n const jsConfigContent = await readFileFromRoot(rootDir, jsConfigPath);\n const config = parseJSONWithComments(jsConfigContent);\n\n config.compilerOptions ??= {};\n config.compilerOptions.paths ??= {};\n\n let updated = false;\n\n Object.entries(aliases).forEach(([alias, path]) => {\n if (!config.compilerOptions.paths[alias]) {\n config.compilerOptions.paths[alias] = [path];\n updated = true;\n }\n });\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n jsConfigPath,\n JSON.stringify(config, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(\n jsConfigPath\n )} to include Intlayer aliases`\n );\n }\n } else {\n packageJson.imports ??= {};\n\n let updated = false;\n\n Object.entries(aliases).forEach(([alias, path]) => {\n const importAlias = alias.replace('@', '#');\n const importPath = path.startsWith('.') ? path : `./${path}`;\n\n if (!packageJson.imports[importAlias]) {\n packageJson.imports[importAlias] = importPath;\n updated = true;\n }\n });\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n packageJsonPath,\n JSON.stringify(packageJson, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(\n packageJsonPath\n )} to include Intlayer imports`\n );\n }\n }\n }\n }\n\n // FINAL SUCCESS MESSAGE\n logger(`${v} ${colorize('Intlayer init setup complete.', ANSIColors.GREEN)}`);\n logger([\n colorize('Next →', ANSIColors.MAGENTA),\n colorize(\n `Follow the instructions in the documentation to complete the setup:`,\n ANSIColors.GREY_LIGHT\n ),\n colorizePath(guideUrl),\n ]);\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/init/index.ts"],"sourcesContent":["import { join } from 'node:path';\nimport {\n ANSIColors,\n colorize,\n colorizePath,\n logger,\n v,\n x,\n} from '@intlayer/config/logger';\nimport { getConfiguration } from '@intlayer/config/node';\n\nimport { getAlias } from '@intlayer/config/utils';\nimport { initConfig } from '../initConfig';\nimport {\n ensureDirectory,\n exists,\n findTsConfigFiles,\n parseJSONWithComments,\n readFileFromRoot,\n updateNextConfig,\n updateViteConfig,\n writeFileToRoot,\n} from './utils';\n\n/**\n * Documentation URL Constants\n */\nconst DocumentationRouter = {\n NextJS: 'https://intlayer.org/doc/environment/nextjs.md',\n NextJS_15: 'https://intlayer.org/doc/environment/nextjs/15.md',\n NextJS_14: 'https://intlayer.org/doc/environment/nextjs/14.md',\n CRA: 'https://intlayer.org/doc/environment/create-react-app.md',\n Astro: 'https://intlayer.org/doc/environment/astro.md',\n ViteAndReact: 'https://intlayer.org/doc/environment/vite-and-react.md',\n ViteAndReact_ReactRouterV7:\n 'https://intlayer.org/doc/environment/vite-and-react/react-router-v7.md',\n ViteAndReact_ReactRouterV7_FSRoutes:\n 'https://intlayer.org/doc/environment/vite-and-react/react-router-v7-fs-routes.md',\n ViteAndVue: 'https://intlayer.org/doc/environment/vite-and-vue.md',\n ViteAndSolid: 'https://intlayer.org/doc/environment/vite-and-solid.md',\n ViteAndSvelte: 'https://intlayer.org/doc/environment/vite-and-svelte.md',\n ViteAndPreact: 'https://intlayer.org/doc/environment/vite-and-preact.md',\n TanStackRouter: 'https://intlayer.org/doc/environment/tanstack.md',\n NuxtAndVue: 'https://intlayer.org/doc/environment/nuxt-and-vue.md',\n Angular: 'https://intlayer.org/doc/environment/angular.md',\n SvelteKit: 'https://intlayer.org/doc/environment/sveltekit.md',\n ReactNativeAndExpo:\n 'https://intlayer.org/doc/environment/react-native-and-expo.md',\n Lynx: 'https://intlayer.org/doc/environment/lynx-and-react.md',\n Express: 'https://intlayer.org/doc/environment/express.md',\n NestJS: 'https://intlayer.org/doc/environment/nestjs.md',\n Fastify: 'https://intlayer.org/doc/environment/fastify.md',\n Default: 'https://intlayer.org/doc/get-started',\n\n // Check for competitors libs\n NextIntl: 'https://intlayer.org/blog/intlayer-with-next-intl.md',\n ReactI18Next: 'https://intlayer.org/blog/intlayer-with-react-i18next.md',\n ReactIntl: 'https://intlayer.org/blog/intlayer-with-react-intl.md',\n NextI18Next: 'https://intlayer.org/blog/intlayer-with-next-i18next.md',\n VueI18n: 'https://intlayer.org/blog/intlayer-with-vue-i18n.md',\n};\n\n/**\n * Helper: Detects the environment and returns the doc URL\n */\nconst getDocumentationUrl = (packageJson: any): string => {\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n /**\n * Helper to check if a version string matches a specific major version\n * Matches: \"15\", \"^15.0.0\", \"~15.2\", \"15.0.0-beta\"\n */\n const isVersion = (versionString: string, major: number): boolean => {\n if (!versionString || typeof versionString !== 'string') return false;\n const regex = new RegExp(`^[\\\\^~]?${major}(?:\\\\.|$)`);\n return regex.test(versionString);\n };\n\n // Mobile / Cross-platform\n if (deps['@lynx-js/react'] || deps['@lynx-js/core']) {\n return DocumentationRouter.Lynx;\n }\n if (deps['react-native'] || deps.expo) {\n return DocumentationRouter.ReactNativeAndExpo;\n }\n\n // Meta-frameworks (Next, Nuxt, Astro, SvelteKit)\n if (deps.next) {\n const version = deps.next;\n\n if (isVersion(version, 14)) {\n return DocumentationRouter.NextJS_14;\n }\n\n if (isVersion(version, 15)) {\n return DocumentationRouter.NextJS_15;\n }\n\n return DocumentationRouter.NextJS;\n }\n\n if (deps.nuxt) return DocumentationRouter.NuxtAndVue;\n if (deps.astro) return DocumentationRouter.Astro;\n if (deps['@sveltejs/kit']) return DocumentationRouter.SvelteKit;\n\n // Routers (TanStack & React Router v7)\n if (deps['@tanstack/react-router']) {\n return DocumentationRouter.TanStackRouter;\n }\n\n // Check for React Router v7\n const reactRouterVersion = deps['react-router'];\n if (reactRouterVersion && typeof reactRouterVersion === 'string') {\n // Distinguish between standard v7 and v7 with FS routes\n if (deps['@react-router/fs-routes']) {\n return DocumentationRouter.ViteAndReact_ReactRouterV7_FSRoutes;\n }\n\n // Use Regex to ensure it is v7\n if (isVersion(reactRouterVersion, 7)) {\n return DocumentationRouter.ViteAndReact_ReactRouterV7;\n }\n }\n\n // Vite Ecosystem (General)\n if (deps.vite) {\n if (deps.vue) return DocumentationRouter.ViteAndVue;\n if (deps['solid-js']) return DocumentationRouter.ViteAndSolid;\n if (deps.svelte) return DocumentationRouter.ViteAndSvelte;\n if (deps.preact) return DocumentationRouter.ViteAndPreact;\n\n // Default to React if Vite is present but specific other frameworks aren't found\n return DocumentationRouter.ViteAndReact;\n }\n\n // Other Web Frameworks\n if (deps['react-scripts']) return DocumentationRouter.CRA;\n if (deps['@angular/core']) return DocumentationRouter.Angular;\n\n // Backend\n if (deps['@nestjs/core']) return DocumentationRouter.NestJS;\n if (deps.express) return DocumentationRouter.Express;\n if (deps.fastify) return DocumentationRouter.Fastify;\n\n // Competitor Libs (Migration Guides)\n // We check these last as specific environment setup is usually higher priority,\n // but if no specific framework logic matched (or as a fallback), we guide to migration.\n if (deps['next-intl']) return DocumentationRouter.NextIntl;\n if (deps['react-i18next'] || deps.i18next)\n return DocumentationRouter.ReactI18Next;\n if (deps['react-intl']) return DocumentationRouter.ReactIntl;\n if (deps['next-i18next']) return DocumentationRouter.NextI18Next;\n if (deps['vue-i18n']) return DocumentationRouter.VueI18n;\n\n return DocumentationRouter.Default;\n};\n\n/**\n * MAIN LOGIC\n */\nexport const initIntlayer = async (rootDir: string) => {\n logger(colorize('Checking Intlayer configuration...', ANSIColors.CYAN));\n\n // READ PACKAGE.JSON\n const packageJsonPath = 'package.json';\n if (!(await exists(rootDir, packageJsonPath))) {\n logger(\n `${x} No ${colorizePath('package.json')} found. Please run this script from the project root.`,\n { level: 'error' }\n );\n process.exit(1);\n }\n\n const packageJsonContent = await readFileFromRoot(rootDir, packageJsonPath);\n let packageJson: Record<string, any>;\n try {\n packageJson = JSON.parse(packageJsonContent);\n } catch {\n logger(`${x} Could not parse ${colorizePath('package.json')}.`, {\n level: 'error',\n });\n process.exit(1);\n }\n\n // Determine the correct documentation URL based on dependencies\n const guideUrl = getDocumentationUrl(packageJson);\n\n // 2. CHECK .GITIGNORE\n const gitignorePath = '.gitignore';\n if (await exists(rootDir, gitignorePath)) {\n const gitignoreContent = await readFileFromRoot(rootDir, gitignorePath);\n\n if (!gitignoreContent.includes('intlayer')) {\n const newContent = `${gitignoreContent}\\n# Intlayer\\n.intlayer\\n`;\n await writeFileToRoot(rootDir, gitignorePath, newContent);\n logger(\n `${v} Added ${colorizePath('.intlayer')} to ${colorizePath(gitignorePath)}`\n );\n } else {\n logger(`${v} ${colorizePath(gitignorePath)} already includes .intlayer`);\n }\n }\n\n // 3. CHECK VS CODE EXTENSION RECOMMENDATIONS\n const vscodeDir = '.vscode';\n const extensionsJsonPath = join(vscodeDir, 'extensions.json');\n const extensionId = 'intlayer.intlayer-vs-code-extension';\n\n try {\n let extensionsConfig: { recommendations: string[] } = {\n recommendations: [],\n };\n\n if (await exists(rootDir, extensionsJsonPath)) {\n const content = await readFileFromRoot(rootDir, extensionsJsonPath);\n extensionsConfig = parseJSONWithComments(content);\n } else {\n await ensureDirectory(rootDir, vscodeDir);\n }\n\n if (!extensionsConfig.recommendations) {\n extensionsConfig.recommendations = [];\n }\n\n if (!extensionsConfig.recommendations.includes(extensionId)) {\n extensionsConfig.recommendations.push(extensionId);\n await writeFileToRoot(\n rootDir,\n extensionsJsonPath,\n JSON.stringify(extensionsConfig, null, 2)\n );\n logger(\n `${v} Added ${colorize(extensionId, ANSIColors.MAGENTA)} to ${colorizePath(extensionsJsonPath)}`\n );\n } else {\n logger(\n `${v} ${colorizePath(extensionsJsonPath)} already includes ${colorize(extensionId, ANSIColors.MAGENTA)}`\n );\n }\n } catch {\n logger(\n `${x} Could not update ${colorizePath(extensionsJsonPath)}. You may need to add ${colorize(extensionId, ANSIColors.MAGENTA)} manually.`,\n { level: 'warn' }\n );\n }\n\n // CHECK TSCONFIGS\n const tsConfigFiles = await findTsConfigFiles(rootDir);\n let hasTsConfig = false;\n\n for (const fileName of tsConfigFiles) {\n if (await exists(rootDir, fileName)) {\n hasTsConfig = true;\n try {\n const fileContent = await readFileFromRoot(rootDir, fileName);\n const config = parseJSONWithComments(fileContent);\n const typeDefinition = '.intlayer/**/*.ts';\n\n let updated = false;\n\n if (!config.include) {\n // Skip if no include array (solution-style)\n } else if (\n Array.isArray(config.include) &&\n !(config.include as string[]).some((pattern: string) =>\n pattern.includes('.intlayer')\n )\n ) {\n config.include.push(typeDefinition);\n updated = true;\n } else if (config.include.includes(typeDefinition)) {\n logger(\n `${v} ${colorizePath(fileName)} already includes intlayer types`\n );\n }\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n fileName,\n JSON.stringify(config, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(fileName)} to include intlayer types`\n );\n }\n } catch {\n logger(\n `${x} Could not parse or update ${colorizePath(fileName)}. You may need to add ${colorizePath('.intlayer/types/**/*.ts')} manually.`,\n { level: 'warn' }\n );\n }\n }\n }\n\n // INITIALIZE CONFIG FILE\n const format = hasTsConfig ? 'intlayer.config.ts' : 'intlayer.config.mjs';\n await initConfig(format, rootDir);\n\n let hasAliasConfiguration = false;\n\n // CHECK VITE CONFIG\n const viteConfigs = ['vite.config.ts', 'vite.config.js', 'vite.config.mjs'];\n for (const file of viteConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n const content = await readFileFromRoot(rootDir, file);\n\n if (!content.includes('vite-intlayer')) {\n const extension = file.split('.').pop()!;\n const updatedContent = updateViteConfig(content, extension);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(`${v} Updated ${colorizePath(file)} to include Intlayer plugin`);\n }\n break;\n }\n }\n\n // CHECK NEXT CONFIG\n const nextConfigs = ['next.config.js', 'next.config.mjs', 'next.config.ts'];\n for (const file of nextConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n const content = await readFileFromRoot(rootDir, file);\n\n if (!content.includes('next-intlayer')) {\n const extension = file.split('.').pop()!;\n const updatedContent = updateNextConfig(content, extension);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(`${v} Updated ${colorizePath(file)} to include Intlayer plugin`);\n }\n break;\n }\n }\n\n // CHECK WEBPACK CONFIG\n const webpackConfigs = [\n 'webpack.config.js',\n 'webpack.config.ts',\n 'webpack.config.mjs',\n 'webpack.config.cjs',\n ];\n for (const file of webpackConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n logger(\n `${v} Found ${colorizePath(\n file\n )}. Make sure to configure aliases manually or use the Intlayer Webpack plugin.`\n );\n break;\n }\n }\n\n if (!hasAliasConfiguration) {\n const configuration = getConfiguration({ baseDir: rootDir });\n const aliases = getAlias({ configuration });\n\n if (hasTsConfig && tsConfigFiles.length > 0) {\n const tsConfigPath =\n tsConfigFiles.find((f) => f === 'tsconfig.json') || tsConfigFiles[0];\n const tsConfigContent = await readFileFromRoot(rootDir, tsConfigPath);\n const config = parseJSONWithComments(tsConfigContent);\n\n config.compilerOptions ??= {};\n config.compilerOptions.paths ??= {};\n\n let updated = false;\n\n Object.entries(aliases).forEach(([alias, path]) => {\n if (!config.compilerOptions.paths[alias]) {\n config.compilerOptions.paths[alias] = [path];\n updated = true;\n }\n });\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n tsConfigPath,\n JSON.stringify(config, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(\n tsConfigPath\n )} to include Intlayer aliases`\n );\n }\n } else {\n const jsConfigPath = 'jsconfig.json';\n if (await exists(rootDir, jsConfigPath)) {\n const jsConfigContent = await readFileFromRoot(rootDir, jsConfigPath);\n const config = parseJSONWithComments(jsConfigContent);\n\n config.compilerOptions ??= {};\n config.compilerOptions.paths ??= {};\n\n let updated = false;\n\n Object.entries(aliases).forEach(([alias, path]) => {\n if (!config.compilerOptions.paths[alias]) {\n config.compilerOptions.paths[alias] = [path];\n updated = true;\n }\n });\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n jsConfigPath,\n JSON.stringify(config, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(\n jsConfigPath\n )} to include Intlayer aliases`\n );\n }\n } else {\n packageJson.imports ??= {};\n\n let updated = false;\n\n Object.entries(aliases).forEach(([alias, path]) => {\n const importAlias = alias.replace('@', '#');\n const importPath = path.startsWith('.') ? path : `./${path}`;\n\n if (!packageJson.imports[importAlias]) {\n packageJson.imports[importAlias] = importPath;\n updated = true;\n }\n });\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n packageJsonPath,\n JSON.stringify(packageJson, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(\n packageJsonPath\n )} to include Intlayer imports`\n );\n }\n }\n }\n }\n\n // FINAL SUCCESS MESSAGE\n logger(`${v} ${colorize('Intlayer init setup complete.', ANSIColors.GREEN)}`);\n logger([\n colorize('Next →', ANSIColors.MAGENTA),\n colorize(\n `Follow the instructions in the documentation to complete the setup:`,\n ANSIColors.GREY_LIGHT\n ),\n colorizePath(guideUrl),\n ]);\n};\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{access as e,
|
|
1
|
+
import{access as e,mkdir as t,readFile as n,writeFile as r}from"node:fs/promises";import{join as i}from"node:path";const a=async(t,n)=>{try{return await e(i(t,n)),!0}catch{return!1}},o=async(e,t)=>await n(i(e,t),`utf8`),s=async(e,t,n)=>await r(i(e,t),n,`utf8`),c=async(e,n)=>{try{await t(i(e,n),{recursive:!0})}catch{}};export{c as ensureDirectory,a as exists,o as readFileFromRoot,s as writeFileToRoot};
|
|
2
2
|
//# sourceMappingURL=fileSystem.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileSystem.mjs","names":[],"sources":["../../../../src/init/utils/fileSystem.ts"],"sourcesContent":["import { access, readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\n/**\n * Helper to check if a file exists\n */\nexport const exists = async (rootDir: string, filePath: string) => {\n try {\n await access(join(rootDir, filePath));\n return true;\n } catch {\n return false;\n }\n};\n\n/**\n * Helper to read a file\n */\nexport const readFileFromRoot = async (rootDir: string, filePath: string) =>\n await readFile(join(rootDir, filePath), 'utf8');\n\n/**\n * Helper to write a file\n */\nexport const writeFileToRoot = async (\n rootDir: string,\n filePath: string,\n content: string\n) => await writeFile(join(rootDir, filePath), content, 'utf8');\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"fileSystem.mjs","names":[],"sources":["../../../../src/init/utils/fileSystem.ts"],"sourcesContent":["import { access, mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\n/**\n * Helper to check if a file exists\n */\nexport const exists = async (rootDir: string, filePath: string) => {\n try {\n await access(join(rootDir, filePath));\n return true;\n } catch {\n return false;\n }\n};\n\n/**\n * Helper to read a file\n */\nexport const readFileFromRoot = async (rootDir: string, filePath: string) =>\n await readFile(join(rootDir, filePath), 'utf8');\n\n/**\n * Helper to write a file\n */\nexport const writeFileToRoot = async (\n rootDir: string,\n filePath: string,\n content: string\n) => await writeFile(join(rootDir, filePath), content, 'utf8');\n\n/**\n * Helper to ensure a directory exists\n */\nexport const ensureDirectory = async (rootDir: string, dirPath: string) => {\n try {\n await mkdir(join(rootDir, dirPath), { recursive: true });\n } catch {\n // Directory already exists or could not be created\n }\n};\n"],"mappings":"mHAMA,MAAa,EAAS,MAAO,EAAiB,IAAqB,CACjE,GAAI,CAEF,OADA,MAAM,EAAO,EAAK,EAAS,EAAS,CAAC,CAC9B,QACD,CACN,MAAO,KAOE,EAAmB,MAAO,EAAiB,IACtD,MAAM,EAAS,EAAK,EAAS,EAAS,CAAE,OAAO,CAKpC,EAAkB,MAC7B,EACA,EACA,IACG,MAAM,EAAU,EAAK,EAAS,EAAS,CAAE,EAAS,OAAO,CAKjD,EAAkB,MAAO,EAAiB,IAAoB,CACzE,GAAI,CACF,MAAM,EAAM,EAAK,EAAS,EAAQ,CAAE,CAAE,UAAW,GAAM,CAAC,MAClD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{updateNextConfig as e,updateViteConfig as t}from"./configManipulation.mjs";import{
|
|
1
|
+
import{updateNextConfig as e,updateViteConfig as t}from"./configManipulation.mjs";import{ensureDirectory as n,exists as r,readFileFromRoot as i,writeFileToRoot as a}from"./fileSystem.mjs";import{parseJSONWithComments as o}from"./jsonParser.mjs";import{findTsConfigFiles as s}from"./tsConfig.mjs";export{n as ensureDirectory,r as exists,s as findTsConfigFiles,o as parseJSONWithComments,i as readFileFromRoot,e as updateNextConfig,t as updateViteConfig,a as writeFileToRoot};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{detectFormatCommand as e}from"../
|
|
1
|
+
import{detectFormatCommand as e}from"../detectFormatCommand.mjs";import{writeContentDeclaration as t}from"../writeContentDeclaration/writeContentDeclaration.mjs";import{extractDictionaryKey as n}from"./extractDictionaryKey.mjs";import{getConfiguration as r}from"@intlayer/config/node";import i from"node:fs/promises";import{basename as a,dirname as o,extname as s,join as c,relative as l,resolve as u}from"node:path";import{ANSIColors as d,colorizePath as f,getAppLogger as p}from"@intlayer/config/logger";import{camelCaseToKebabCase as m}from"@intlayer/config/utils";import{Node as h,Project as g,SyntaxKind as _}from"ts-morph";import{execSync as v}from"node:child_process";import{generateKey as y}from"@intlayer/core/utils";const b=[`title`,`placeholder`,`alt`,`aria-label`,`label`],x=e=>{let t=e.trim();return!(!t||!t.includes(` `)||!/^[A-Z]/.test(t)||t.startsWith(`{`)||t.startsWith(`v-`))},S=async(e,n,r,i,d)=>{let{defaultLocale:f}=i.internationalization,{baseDir:p,fileExtensions:m}=i.content,h=i?.dictionary?.locale,g=d?u(d):o(r),_=a(r,s(r)),v=c(g,`${_.charAt(0).toLowerCase()+_.slice(1)}.${m[0]}`),y=l(p,v),b;if(h)b={key:n,content:e,locale:f,filePath:y};else{let t={};for(let[n,r]of Object.entries(e))t[n]={nodeType:`translation`,translation:{[f]:r}};b={key:n,content:t,filePath:y}}let x=l(p,g);return await t(b,i,{newDictionariesPath:x}),v},C=(e,t)=>{let n={},r=[];return e.forEachDescendant(e=>{if(h.isJsxText(e)){let i=e.getText();if(x(i)){let a=y(i,t);t.add(a),n[a]=i.replace(/\s+/g,` `).trim(),r.push({node:e,key:a,type:`jsx-text`})}}else if(h.isJsxAttribute(e)){let i=e.getNameNode().getText();if(b.includes(i)){let i=e.getInitializer();if(h.isStringLiteral(i)){let a=i.getLiteralValue();if(x(a)){let i=y(a,t);t.add(i),n[i]=a.trim(),r.push({node:e,key:i,type:`jsx-attribute`})}}}}else if(h.isStringLiteral(e)){let i=e.getLiteralValue();if(x(i)){let a=e.getParent();if(a?.getKindName()===`ImportDeclaration`||a?.getKindName()===`ImportSpecifier`||a?.getKindName()===`ModuleSpecifier`||h.isJsxAttribute(a)||h.isCallExpression(a)&&a.getExpression().getText().includes(`console.log`)||h.isPropertyAssignment(a)&&a.getNameNode()===e)return;let o=y(i,t);t.add(o),n[o]=i.trim(),r.push({node:e,key:o,type:`string-literal`})}}}),{extractedContent:n,replacements:r}},w=async(e,t,n,r,i=!0)=>{let a;try{a=r.addSourceFileAtPath(e)}catch{a=r.getSourceFileOrThrow(e)}let o=n===`solid-intlayer`,{extractedContent:s,replacements:c}=C(a,new Set);if(Object.keys(s).length===0)return null;for(let{node:e,key:t,type:n}of c){let r=o?`content().${t}`:`content.${t}`;n===`jsx-text`&&h.isJsxText(e)?e.replaceWithText(`{${r}}`):n===`jsx-attribute`&&h.isJsxAttribute(e)?e.setInitializer(`{${r}.value}`):n===`string-literal`&&h.isStringLiteral(e)&&e.replaceWithText(`${r}.value`)}let l=a.getImportDeclaration(e=>e.getModuleSpecifierValue()===n);return l?l.getNamedImports().some(e=>e.getName()===`useIntlayer`)||l.addNamedImport(`useIntlayer`):a.addImportDeclaration({namedImports:[`useIntlayer`],moduleSpecifier:n}),a.getFunctions().forEach(e=>{e.getBody()?.asKind(_.Block)?.insertStatements(0,`const content = useIntlayer("${t}");`)}),a.getVariableDeclarations().forEach(e=>{let n=e.getInitializer();if(h.isArrowFunction(n)||h.isFunctionExpression(n)){let e=n.getBody();h.isBlock(e)&&(e.getText().includes(`return`)||e.getText().includes(`use`))&&e.insertStatements(0,`const content = useIntlayer("${t}");`)}}),i&&await a.save(),s},T=async(t,a,o,c)=>{let u=!o?.declarationOnly,h=!o?.codeOnly,_=r(o?.configOptions),b=p(_),{baseDir:T}=_.content,E=c||new g({skipAddingFilesFromTsConfig:!0}),D=n(t,(await i.readFile(t)).toString()),O=m(D),k=s(t),A=null;if(k===`.vue`)try{let{processVueFile:e}=await import(`@intlayer/vue-transformer`);A=await e(t,O,a,{generateKey:y,shouldExtract:x,extractTsContent:C},u)}catch(e){throw e.code===`ERR_MODULE_NOT_FOUND`||e.message?.includes(`Cannot find module`)?Error(`Please install ${f(`@intlayer/vue-transformer`,d.YELLOW)} to process Vue files.`):e}else if(k===`.svelte`)try{let{processSvelteFile:e}=await import(`@intlayer/svelte-transformer`);A=await e(t,O,a,{generateKey:y,shouldExtract:x,extractTsContent:C},u)}catch(e){throw e.code===`ERR_MODULE_NOT_FOUND`||e.message?.includes(`Cannot find module`)?Error(`Please install ${f(`@intlayer/svelte-transformer`,d.YELLOW)} to process Svelte files.`):e}else [`.tsx`,`.jsx`,`.ts`,`.js`].includes(k)&&(A=await w(t,O,a,E,u));if(!A){b(`No extractable text found in ${D}`);return}if(h){let e=await S(A,O,t,_,o?.outputDir);b(`Created content file: ${f(l(_.content.baseDir,e))}`)}if(u){try{let n=e(_);n&&v(n.replace(`{{file}}`,t),{stdio:`ignore`,cwd:T})}catch{}b(`Updated component: ${f(l(T,t))}`)}},E=async(e,t,n)=>{let i=p(r(n?.configOptions)),a=new g({skipAddingFilesFromTsConfig:!0});for(let r of e)try{await T(r,t,n,a)}catch(e){i(`Failed to transform ${r}: ${e.message}`)}};export{b as ATTRIBUTES_TO_EXTRACT,T as extractIntlayer,x as shouldExtract,E as transformFiles};
|
|
2
2
|
//# sourceMappingURL=transformFiles.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformFiles.mjs","names":[],"sources":["../../../src/transformFiles/transformFiles.ts"],"sourcesContent":["import { execSync } from 'node:child_process';\nimport fs from 'node:fs/promises';\nimport { basename, dirname, extname, join, relative, resolve } from 'node:path';\nimport {\n ANSIColors,\n colorizePath,\n getAppLogger,\n} from '@intlayer/config/logger';\nimport {\n type GetConfigurationOptions,\n getConfiguration,\n} from '@intlayer/config/node';\nimport { camelCaseToKebabCase } from '@intlayer/config/utils';\nimport { generateKey } from '@intlayer/core/utils';\nimport type { Dictionary, IntlayerConfig } from '@intlayer/types';\nimport { Node, Project, type SourceFile, SyntaxKind } from 'ts-morph';\nimport { writeContentDeclaration } from '../writeContentDeclaration';\nimport { detectFormatCommand } from '../writeContentDeclaration/detectFormatCommand';\nimport { extractDictionaryKey } from './extractDictionaryKey';\n\n// ==========================================\n// Shared Utilities (exported for reuse in babel plugin)\n// ==========================================\n\n/**\n * Attributes that should be extracted for localization\n */\nexport const ATTRIBUTES_TO_EXTRACT = [\n 'title',\n 'placeholder',\n 'alt',\n 'aria-label',\n 'label',\n];\n\n/**\n * Default function to determine if a string should be extracted for localization\n */\nexport const shouldExtract = (text: string): boolean => {\n const trimmed = text.trim();\n if (!trimmed) return false;\n if (!trimmed.includes(' ')) return false;\n // Starts with Capital letter\n if (!/^[A-Z]/.test(trimmed)) return false;\n // Filter out template logic identifiers (simple check)\n if (trimmed.startsWith('{') || trimmed.startsWith('v-')) return false;\n return true;\n};\n\n/**\n * Translation node structure used in multilingual dictionaries\n */\ntype TranslationNode = {\n nodeType: 'translation';\n translation: Record<string, string>;\n};\n\nconst writeContentHelper = async (\n extractedContent: Record<string, string>,\n componentKey: string,\n filePath: string,\n configuration: IntlayerConfig,\n outputDir?: string\n) => {\n const { defaultLocale } = configuration.internationalization;\n const { baseDir, fileExtensions } = configuration.content;\n\n const isPerLocaleFile = configuration?.dictionary?.locale;\n\n const dirName = outputDir ? resolve(outputDir) : dirname(filePath);\n const ext = extname(filePath);\n const baseName = basename(filePath, ext);\n const contentBaseName = baseName.charAt(0).toLowerCase() + baseName.slice(1);\n\n const contentFilePath = join(\n dirName,\n `${contentBaseName}.${fileExtensions[0]}`\n );\n const relativeContentFilePath = relative(baseDir, contentFilePath);\n\n let dictionary: Dictionary;\n\n if (isPerLocaleFile) {\n // Per-locale format: simple string content with locale property\n dictionary = {\n key: componentKey,\n content: extractedContent,\n locale: defaultLocale,\n filePath: relativeContentFilePath,\n };\n } else {\n // Multilingual format: content wrapped in translation nodes, no locale property\n const multilingualContent: Record<string, TranslationNode> = {};\n for (const [key, value] of Object.entries(extractedContent)) {\n multilingualContent[key] = {\n nodeType: 'translation',\n translation: {\n [defaultLocale]: value,\n },\n };\n }\n\n dictionary = {\n key: componentKey,\n content: multilingualContent,\n filePath: relativeContentFilePath,\n };\n }\n\n const relativeDir = relative(baseDir, dirName);\n await writeContentDeclaration(dictionary, configuration, {\n newDictionariesPath: relativeDir,\n });\n\n return contentFilePath;\n};\n\ntype TsReplacement = {\n node: Node;\n key: string;\n type: 'jsx-text' | 'jsx-attribute' | 'string-literal';\n};\n\nconst extractTsContent = (\n sourceFile: SourceFile,\n existingKeys: Set<string>\n): {\n extractedContent: Record<string, string>;\n replacements: TsReplacement[];\n} => {\n const extractedContent: Record<string, string> = {};\n const replacements: TsReplacement[] = [];\n\n sourceFile.forEachDescendant((node) => {\n // 1. JSX Text\n if (Node.isJsxText(node)) {\n const text = node.getText();\n if (shouldExtract(text)) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n extractedContent[key] = text.replace(/\\s+/g, ' ').trim();\n replacements.push({ node, key, type: 'jsx-text' });\n }\n }\n\n // 2. JSX Attributes\n else if (Node.isJsxAttribute(node)) {\n const name = node.getNameNode().getText();\n if (ATTRIBUTES_TO_EXTRACT.includes(name)) {\n const initializer = node.getInitializer();\n if (Node.isStringLiteral(initializer)) {\n const text = initializer.getLiteralValue();\n if (shouldExtract(text)) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n extractedContent[key] = text.trim();\n replacements.push({ node, key, type: 'jsx-attribute' });\n }\n }\n }\n }\n\n // 3. String Literals (Variables, Arrays, etc.)\n else if (Node.isStringLiteral(node)) {\n const text = node.getLiteralValue();\n if (shouldExtract(text)) {\n const parent = node.getParent();\n\n // Skip if inside ImportDeclaration\n if (\n parent?.getKindName() === 'ImportDeclaration' ||\n parent?.getKindName() === 'ImportSpecifier' ||\n parent?.getKindName() === 'ModuleSpecifier'\n ) {\n return;\n }\n\n // Skip if it's a JSX Attribute value (handled above)\n if (Node.isJsxAttribute(parent)) return;\n\n // Skip console.log\n if (Node.isCallExpression(parent)) {\n const expression = parent.getExpression();\n if (expression.getText().includes('console.log')) return;\n }\n\n // Skip Object Keys: { key: \"value\" } -> \"key\" is PropertyAssignment name if not computed\n if (Node.isPropertyAssignment(parent)) {\n if (parent.getNameNode() === node) return; // It's the key\n }\n\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n extractedContent[key] = text.trim();\n replacements.push({ node, key, type: 'string-literal' });\n }\n }\n });\n\n return { extractedContent, replacements };\n};\n\n// ==========================================\n// React (TS-Morph) Strategy\n// ==========================================\n\nconst processTsxFile = async (\n filePath: string,\n componentKey: string,\n packageName: PackageName,\n project: Project,\n save: boolean = true\n) => {\n let sourceFile: SourceFile;\n try {\n sourceFile = project.addSourceFileAtPath(filePath);\n } catch {\n sourceFile = project.getSourceFileOrThrow(filePath);\n }\n\n const isSolid = packageName === 'solid-intlayer';\n\n const existingKeys = new Set<string>();\n const { extractedContent, replacements } = extractTsContent(\n sourceFile,\n existingKeys\n );\n\n if (Object.keys(extractedContent).length === 0) return null;\n\n for (const { node, key, type } of replacements) {\n const contentAccess = isSolid ? `content().${key}` : `content.${key}`;\n\n if (type === 'jsx-text' && Node.isJsxText(node)) {\n node.replaceWithText(`{${contentAccess}}`);\n } else if (type === 'jsx-attribute' && Node.isJsxAttribute(node)) {\n node.setInitializer(`{${contentAccess}.value}`);\n } else if (type === 'string-literal' && Node.isStringLiteral(node)) {\n // For React/JS variables, we usually want the value\n node.replaceWithText(`${contentAccess}.value`);\n }\n }\n\n // Inject hook\n const importDecl = sourceFile.getImportDeclaration(\n (d) => d.getModuleSpecifierValue() === packageName\n );\n if (!importDecl) {\n sourceFile.addImportDeclaration({\n namedImports: ['useIntlayer'],\n moduleSpecifier: packageName,\n });\n } else if (\n !importDecl.getNamedImports().some((n) => n.getName() === 'useIntlayer')\n ) {\n importDecl.addNamedImport('useIntlayer');\n }\n\n // Insert hook at start of component\n sourceFile.getFunctions().forEach((f) => {\n f.getBody()\n ?.asKind(SyntaxKind.Block)\n ?.insertStatements(0, `const content = useIntlayer(\"${componentKey}\");`);\n });\n\n // Also handle const/arrow components\n sourceFile.getVariableDeclarations().forEach((v) => {\n const init = v.getInitializer();\n if (Node.isArrowFunction(init) || Node.isFunctionExpression(init)) {\n const body = init.getBody();\n if (Node.isBlock(body)) {\n // Heuristic: check if it returns JSX or uses hooks\n if (\n body.getText().includes('return') ||\n body.getText().includes('use')\n ) {\n body.insertStatements(\n 0,\n `const content = useIntlayer(\"${componentKey}\");`\n );\n }\n }\n }\n });\n\n if (save) {\n await sourceFile.save();\n }\n return extractedContent;\n};\n\n// ==========================================\n// 5. Main Dispatcher\n// ==========================================\n\nexport type PackageName =\n | 'next-intlayer'\n | 'react-intlayer'\n | 'vue-intlayer'\n | 'svelte-intlayer'\n | 'preact-intlayer'\n | 'solid-intlayer'\n | 'angular-intlayer'\n | 'express-intlayer';\n\nexport type ExtractIntlayerOptions = {\n configOptions?: GetConfigurationOptions;\n outputDir?: string;\n codeOnly?: boolean;\n declarationOnly?: boolean;\n};\n\nexport const extractIntlayer = async (\n filePath: string,\n packageName: PackageName,\n options?: ExtractIntlayerOptions,\n project?: Project\n) => {\n const saveComponent = !options?.declarationOnly;\n const writeContent = !options?.codeOnly;\n\n const configuration = getConfiguration(options?.configOptions);\n const appLogger = getAppLogger(configuration);\n const { baseDir } = configuration.content;\n\n // Setup Project for TS/React files if needed\n const _project =\n project || new Project({ skipAddingFilesFromTsConfig: true });\n\n const baseName = extractDictionaryKey(\n filePath,\n (await fs.readFile(filePath)).toString()\n );\n const componentKey = camelCaseToKebabCase(baseName);\n const ext = extname(filePath);\n\n let extractedContent: Record<string, string> | null = null;\n\n if (ext === '.vue') {\n try {\n const { processVueFile } = await import('@intlayer/vue-transformer');\n extractedContent = await processVueFile(\n filePath,\n componentKey,\n packageName,\n {\n generateKey,\n shouldExtract,\n extractTsContent,\n },\n saveComponent\n );\n } catch (error: any) {\n if (\n error.code === 'ERR_MODULE_NOT_FOUND' ||\n error.message?.includes('Cannot find module')\n ) {\n throw new Error(\n `Please install ${colorizePath('@intlayer/vue-transformer', ANSIColors.YELLOW)} to process Vue files.`\n );\n }\n throw error;\n }\n } else if (ext === '.svelte') {\n try {\n const { processSvelteFile } = (await import(\n '@intlayer/svelte-transformer'\n )) as any;\n extractedContent = await processSvelteFile(\n filePath,\n componentKey,\n packageName,\n {\n generateKey,\n shouldExtract,\n extractTsContent,\n },\n saveComponent\n );\n } catch (error: any) {\n if (\n error.code === 'ERR_MODULE_NOT_FOUND' ||\n error.message?.includes('Cannot find module')\n ) {\n throw new Error(\n `Please install ${colorizePath('@intlayer/svelte-transformer', ANSIColors.YELLOW)} to process Svelte files.`\n );\n }\n throw error;\n }\n } else if (['.tsx', '.jsx', '.ts', '.js'].includes(ext)) {\n extractedContent = await processTsxFile(\n filePath,\n componentKey,\n packageName,\n _project,\n saveComponent\n );\n }\n\n if (!extractedContent) {\n appLogger(`No extractable text found in ${baseName}`);\n return;\n }\n\n // Shared Write Logic\n if (writeContent) {\n const contentFilePath = await writeContentHelper(\n extractedContent,\n componentKey,\n filePath,\n configuration,\n options?.outputDir\n );\n\n const relativeContentFilePath = relative(\n configuration.content.baseDir,\n contentFilePath\n );\n appLogger(`Created content file: ${colorizePath(relativeContentFilePath)}`);\n }\n\n // Optional: Format\n if (saveComponent) {\n try {\n const formatCommand = detectFormatCommand(configuration);\n if (formatCommand) {\n execSync(formatCommand.replace('{{file}}', filePath), {\n stdio: 'ignore', // Silent\n cwd: baseDir,\n });\n }\n } catch {\n // Ignore format errors\n }\n\n appLogger(\n `Updated component: ${colorizePath(relative(baseDir, filePath))}`\n );\n }\n};\n\nexport const transformFiles = async (\n filePaths: string[],\n packageName: PackageName,\n options?: ExtractIntlayerOptions\n) => {\n const configuration = getConfiguration(options?.configOptions);\n const appLogger = getAppLogger(configuration);\n\n const project = new Project({\n skipAddingFilesFromTsConfig: true,\n });\n\n for (const filePath of filePaths) {\n try {\n await extractIntlayer(filePath, packageName, options, project);\n } catch (error) {\n appLogger(`Failed to transform ${filePath}: ${(error as Error).message}`);\n }\n }\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"transformFiles.mjs","names":[],"sources":["../../../src/transformFiles/transformFiles.ts"],"sourcesContent":["import { execSync } from 'node:child_process';\nimport fs from 'node:fs/promises';\nimport { basename, dirname, extname, join, relative, resolve } from 'node:path';\nimport {\n ANSIColors,\n colorizePath,\n getAppLogger,\n} from '@intlayer/config/logger';\nimport {\n type GetConfigurationOptions,\n getConfiguration,\n} from '@intlayer/config/node';\nimport { camelCaseToKebabCase } from '@intlayer/config/utils';\nimport { generateKey } from '@intlayer/core/utils';\nimport type { Dictionary, IntlayerConfig } from '@intlayer/types';\nimport { Node, Project, type SourceFile, SyntaxKind } from 'ts-morph';\nimport { detectFormatCommand } from '../detectFormatCommand';\nimport { writeContentDeclaration } from '../writeContentDeclaration';\nimport { extractDictionaryKey } from './extractDictionaryKey';\n\n// ==========================================\n// Shared Utilities (exported for reuse in babel plugin)\n// ==========================================\n\n/**\n * Attributes that should be extracted for localization\n */\nexport const ATTRIBUTES_TO_EXTRACT = [\n 'title',\n 'placeholder',\n 'alt',\n 'aria-label',\n 'label',\n];\n\n/**\n * Default function to determine if a string should be extracted for localization\n */\nexport const shouldExtract = (text: string): boolean => {\n const trimmed = text.trim();\n if (!trimmed) return false;\n if (!trimmed.includes(' ')) return false;\n // Starts with Capital letter\n if (!/^[A-Z]/.test(trimmed)) return false;\n // Filter out template logic identifiers (simple check)\n if (trimmed.startsWith('{') || trimmed.startsWith('v-')) return false;\n return true;\n};\n\n/**\n * Translation node structure used in multilingual dictionaries\n */\ntype TranslationNode = {\n nodeType: 'translation';\n translation: Record<string, string>;\n};\n\nconst writeContentHelper = async (\n extractedContent: Record<string, string>,\n componentKey: string,\n filePath: string,\n configuration: IntlayerConfig,\n outputDir?: string\n) => {\n const { defaultLocale } = configuration.internationalization;\n const { baseDir, fileExtensions } = configuration.content;\n\n const isPerLocaleFile = configuration?.dictionary?.locale;\n\n const dirName = outputDir ? resolve(outputDir) : dirname(filePath);\n const ext = extname(filePath);\n const baseName = basename(filePath, ext);\n const contentBaseName = baseName.charAt(0).toLowerCase() + baseName.slice(1);\n\n const contentFilePath = join(\n dirName,\n `${contentBaseName}.${fileExtensions[0]}`\n );\n const relativeContentFilePath = relative(baseDir, contentFilePath);\n\n let dictionary: Dictionary;\n\n if (isPerLocaleFile) {\n // Per-locale format: simple string content with locale property\n dictionary = {\n key: componentKey,\n content: extractedContent,\n locale: defaultLocale,\n filePath: relativeContentFilePath,\n };\n } else {\n // Multilingual format: content wrapped in translation nodes, no locale property\n const multilingualContent: Record<string, TranslationNode> = {};\n for (const [key, value] of Object.entries(extractedContent)) {\n multilingualContent[key] = {\n nodeType: 'translation',\n translation: {\n [defaultLocale]: value,\n },\n };\n }\n\n dictionary = {\n key: componentKey,\n content: multilingualContent,\n filePath: relativeContentFilePath,\n };\n }\n\n const relativeDir = relative(baseDir, dirName);\n await writeContentDeclaration(dictionary, configuration, {\n newDictionariesPath: relativeDir,\n });\n\n return contentFilePath;\n};\n\ntype TsReplacement = {\n node: Node;\n key: string;\n type: 'jsx-text' | 'jsx-attribute' | 'string-literal';\n};\n\nconst extractTsContent = (\n sourceFile: SourceFile,\n existingKeys: Set<string>\n): {\n extractedContent: Record<string, string>;\n replacements: TsReplacement[];\n} => {\n const extractedContent: Record<string, string> = {};\n const replacements: TsReplacement[] = [];\n\n sourceFile.forEachDescendant((node) => {\n // 1. JSX Text\n if (Node.isJsxText(node)) {\n const text = node.getText();\n if (shouldExtract(text)) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n extractedContent[key] = text.replace(/\\s+/g, ' ').trim();\n replacements.push({ node, key, type: 'jsx-text' });\n }\n }\n\n // 2. JSX Attributes\n else if (Node.isJsxAttribute(node)) {\n const name = node.getNameNode().getText();\n if (ATTRIBUTES_TO_EXTRACT.includes(name)) {\n const initializer = node.getInitializer();\n if (Node.isStringLiteral(initializer)) {\n const text = initializer.getLiteralValue();\n if (shouldExtract(text)) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n extractedContent[key] = text.trim();\n replacements.push({ node, key, type: 'jsx-attribute' });\n }\n }\n }\n }\n\n // 3. String Literals (Variables, Arrays, etc.)\n else if (Node.isStringLiteral(node)) {\n const text = node.getLiteralValue();\n if (shouldExtract(text)) {\n const parent = node.getParent();\n\n // Skip if inside ImportDeclaration\n if (\n parent?.getKindName() === 'ImportDeclaration' ||\n parent?.getKindName() === 'ImportSpecifier' ||\n parent?.getKindName() === 'ModuleSpecifier'\n ) {\n return;\n }\n\n // Skip if it's a JSX Attribute value (handled above)\n if (Node.isJsxAttribute(parent)) return;\n\n // Skip console.log\n if (Node.isCallExpression(parent)) {\n const expression = parent.getExpression();\n if (expression.getText().includes('console.log')) return;\n }\n\n // Skip Object Keys: { key: \"value\" } -> \"key\" is PropertyAssignment name if not computed\n if (Node.isPropertyAssignment(parent)) {\n if (parent.getNameNode() === node) return; // It's the key\n }\n\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n extractedContent[key] = text.trim();\n replacements.push({ node, key, type: 'string-literal' });\n }\n }\n });\n\n return { extractedContent, replacements };\n};\n\n// ==========================================\n// React (TS-Morph) Strategy\n// ==========================================\n\nconst processTsxFile = async (\n filePath: string,\n componentKey: string,\n packageName: PackageName,\n project: Project,\n save: boolean = true\n) => {\n let sourceFile: SourceFile;\n try {\n sourceFile = project.addSourceFileAtPath(filePath);\n } catch {\n sourceFile = project.getSourceFileOrThrow(filePath);\n }\n\n const isSolid = packageName === 'solid-intlayer';\n\n const existingKeys = new Set<string>();\n const { extractedContent, replacements } = extractTsContent(\n sourceFile,\n existingKeys\n );\n\n if (Object.keys(extractedContent).length === 0) return null;\n\n for (const { node, key, type } of replacements) {\n const contentAccess = isSolid ? `content().${key}` : `content.${key}`;\n\n if (type === 'jsx-text' && Node.isJsxText(node)) {\n node.replaceWithText(`{${contentAccess}}`);\n } else if (type === 'jsx-attribute' && Node.isJsxAttribute(node)) {\n node.setInitializer(`{${contentAccess}.value}`);\n } else if (type === 'string-literal' && Node.isStringLiteral(node)) {\n // For React/JS variables, we usually want the value\n node.replaceWithText(`${contentAccess}.value`);\n }\n }\n\n // Inject hook\n const importDecl = sourceFile.getImportDeclaration(\n (d) => d.getModuleSpecifierValue() === packageName\n );\n if (!importDecl) {\n sourceFile.addImportDeclaration({\n namedImports: ['useIntlayer'],\n moduleSpecifier: packageName,\n });\n } else if (\n !importDecl.getNamedImports().some((n) => n.getName() === 'useIntlayer')\n ) {\n importDecl.addNamedImport('useIntlayer');\n }\n\n // Insert hook at start of component\n sourceFile.getFunctions().forEach((f) => {\n f.getBody()\n ?.asKind(SyntaxKind.Block)\n ?.insertStatements(0, `const content = useIntlayer(\"${componentKey}\");`);\n });\n\n // Also handle const/arrow components\n sourceFile.getVariableDeclarations().forEach((v) => {\n const init = v.getInitializer();\n if (Node.isArrowFunction(init) || Node.isFunctionExpression(init)) {\n const body = init.getBody();\n if (Node.isBlock(body)) {\n // Heuristic: check if it returns JSX or uses hooks\n if (\n body.getText().includes('return') ||\n body.getText().includes('use')\n ) {\n body.insertStatements(\n 0,\n `const content = useIntlayer(\"${componentKey}\");`\n );\n }\n }\n }\n });\n\n if (save) {\n await sourceFile.save();\n }\n return extractedContent;\n};\n\n// ==========================================\n// 5. Main Dispatcher\n// ==========================================\n\nexport type PackageName =\n | 'next-intlayer'\n | 'react-intlayer'\n | 'vue-intlayer'\n | 'svelte-intlayer'\n | 'preact-intlayer'\n | 'solid-intlayer'\n | 'angular-intlayer'\n | 'express-intlayer';\n\nexport type ExtractIntlayerOptions = {\n configOptions?: GetConfigurationOptions;\n outputDir?: string;\n codeOnly?: boolean;\n declarationOnly?: boolean;\n};\n\nexport const extractIntlayer = async (\n filePath: string,\n packageName: PackageName,\n options?: ExtractIntlayerOptions,\n project?: Project\n) => {\n const saveComponent = !options?.declarationOnly;\n const writeContent = !options?.codeOnly;\n\n const configuration = getConfiguration(options?.configOptions);\n const appLogger = getAppLogger(configuration);\n const { baseDir } = configuration.content;\n\n // Setup Project for TS/React files if needed\n const _project =\n project || new Project({ skipAddingFilesFromTsConfig: true });\n\n const baseName = extractDictionaryKey(\n filePath,\n (await fs.readFile(filePath)).toString()\n );\n const componentKey = camelCaseToKebabCase(baseName);\n const ext = extname(filePath);\n\n let extractedContent: Record<string, string> | null = null;\n\n if (ext === '.vue') {\n try {\n const { processVueFile } = await import('@intlayer/vue-transformer');\n extractedContent = await processVueFile(\n filePath,\n componentKey,\n packageName,\n {\n generateKey,\n shouldExtract,\n extractTsContent,\n },\n saveComponent\n );\n } catch (error: any) {\n if (\n error.code === 'ERR_MODULE_NOT_FOUND' ||\n error.message?.includes('Cannot find module')\n ) {\n throw new Error(\n `Please install ${colorizePath('@intlayer/vue-transformer', ANSIColors.YELLOW)} to process Vue files.`\n );\n }\n throw error;\n }\n } else if (ext === '.svelte') {\n try {\n const { processSvelteFile } = (await import(\n '@intlayer/svelte-transformer'\n )) as any;\n extractedContent = await processSvelteFile(\n filePath,\n componentKey,\n packageName,\n {\n generateKey,\n shouldExtract,\n extractTsContent,\n },\n saveComponent\n );\n } catch (error: any) {\n if (\n error.code === 'ERR_MODULE_NOT_FOUND' ||\n error.message?.includes('Cannot find module')\n ) {\n throw new Error(\n `Please install ${colorizePath('@intlayer/svelte-transformer', ANSIColors.YELLOW)} to process Svelte files.`\n );\n }\n throw error;\n }\n } else if (['.tsx', '.jsx', '.ts', '.js'].includes(ext)) {\n extractedContent = await processTsxFile(\n filePath,\n componentKey,\n packageName,\n _project,\n saveComponent\n );\n }\n\n if (!extractedContent) {\n appLogger(`No extractable text found in ${baseName}`);\n return;\n }\n\n // Shared Write Logic\n if (writeContent) {\n const contentFilePath = await writeContentHelper(\n extractedContent,\n componentKey,\n filePath,\n configuration,\n options?.outputDir\n );\n\n const relativeContentFilePath = relative(\n configuration.content.baseDir,\n contentFilePath\n );\n appLogger(`Created content file: ${colorizePath(relativeContentFilePath)}`);\n }\n\n // Optional: Format\n if (saveComponent) {\n try {\n const formatCommand = detectFormatCommand(configuration);\n if (formatCommand) {\n execSync(formatCommand.replace('{{file}}', filePath), {\n stdio: 'ignore', // Silent\n cwd: baseDir,\n });\n }\n } catch {\n // Ignore format errors\n }\n\n appLogger(\n `Updated component: ${colorizePath(relative(baseDir, filePath))}`\n );\n }\n};\n\nexport const transformFiles = async (\n filePaths: string[],\n packageName: PackageName,\n options?: ExtractIntlayerOptions\n) => {\n const configuration = getConfiguration(options?.configOptions);\n const appLogger = getAppLogger(configuration);\n\n const project = new Project({\n skipAddingFilesFromTsConfig: true,\n });\n\n for (const filePath of filePaths) {\n try {\n await extractIntlayer(filePath, packageName, options, project);\n } catch (error) {\n appLogger(`Failed to transform ${filePath}: ${(error as Error).message}`);\n }\n }\n};\n"],"mappings":"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"}
|
package/dist/esm/watcher.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{prepareIntlayer as e}from"./prepareIntlayer.mjs";import{writeContentDeclaration as t}from"./writeContentDeclaration/writeContentDeclaration.mjs";import{handleAdditionalContentDeclarationFile as n}from"./handleAdditionalContentDeclarationFile.mjs";import{handleContentDeclarationFileChange as r}from"./handleContentDeclarationFileChange.mjs";import{handleContentDeclarationFileMoved as i}from"./handleContentDeclarationFileMoved.mjs";import{handleUnlinkedContentDeclarationFile as a}from"./handleUnlinkedContentDeclarationFile.mjs";import{getConfiguration as o}from"@intlayer/config/node";import{readFile as
|
|
1
|
+
import{prepareIntlayer as e}from"./prepareIntlayer.mjs";import{writeContentDeclaration as t}from"./writeContentDeclaration/writeContentDeclaration.mjs";import{handleAdditionalContentDeclarationFile as n}from"./handleAdditionalContentDeclarationFile.mjs";import{handleContentDeclarationFileChange as r}from"./handleContentDeclarationFileChange.mjs";import{handleContentDeclarationFileMoved as i}from"./handleContentDeclarationFileMoved.mjs";import{handleUnlinkedContentDeclarationFile as a}from"./handleUnlinkedContentDeclarationFile.mjs";import{getConfiguration as o,getConfigurationAndFilePath as s}from"@intlayer/config/node";import{readFile as c}from"node:fs/promises";import{basename as l}from"node:path";import{getAppLogger as u}from"@intlayer/config/logger";import{clearAllCache as d,clearModuleCache as f}from"@intlayer/config/utils";import{watch as p}from"chokidar";const m=new Map;let h=Promise.resolve();const g=e=>{h=h.then(async()=>{try{await e()}catch(e){console.error(e)}})},_=o=>{let h=s(o?.configOptions),_=h.configurationFilePath,v=o?.configuration??h.configuration,y=u(v);console.log({configuration:v});let{watch:b,watchedFilesPatternWithPath:x,fileExtensions:S}=v.content;return p([...Array.isArray(x)?x:[x],..._?[_]:[]],{persistent:b,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:1e3,pollInterval:100},ignored:[`**/node_modules/**`,`**/dist/**`,`**/build/**`,`**/.intlayer/**`],...o}).on(`add`,async e=>{let r=l(e),a=!1,o;for(let[e]of m)if(l(e)===r){o=e;break}if(!o&&m.size===1&&(o=m.keys().next().value),o){let t=m.get(o);t&&(clearTimeout(t.timer),m.delete(o)),a=!0,y(`File moved from ${o} to ${e}`)}g(async()=>{if(a&&o)await i(o,e,v);else{if(await c(e,`utf-8`)===``){let n=S.map(e=>e.replace(/\./g,`\\.`)).join(`|`);await t({key:r.replace(RegExp(`(${n})$`),``),content:{},filePath:e},v)}await n(e,v)}})}).on(`change`,async t=>g(async()=>{if(_&&t===_){y(`Configuration file changed, repreparing Intlayer`),f(_),d();let{configuration:t}=s(o?.configOptions);v=o?.configuration??t,await e(v,{clean:!1})}else await r(t,v)})).on(`unlink`,async e=>{let t=setTimeout(async()=>{m.delete(e),g(async()=>a(e,v))},200);m.set(e,{timer:t,oldPath:e})}).on(`error`,async t=>{y(`Watcher error: ${t}`,{level:`error`}),y(`Restarting watcher`),await e(v)})},v=async t=>{let{skipPrepare:n,...r}=t??{},i=t?.configuration??o(t?.configOptions);n||await e(i,{forceRun:!0}),(i.content.watch||t?.persistent)&&(u(i)(`Watching Intlayer content declarations`),_({...r,configuration:i}))};export{v as buildAndWatchIntlayer,_ as watch};
|
|
2
2
|
//# sourceMappingURL=watcher.mjs.map
|
package/dist/esm/watcher.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.mjs","names":["chokidarWatch"],"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 ??
|
|
1
|
+
{"version":3,"file":"watcher.mjs","names":["chokidarWatch"],"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 getConfigurationAndFilePath,\n} from '@intlayer/config/node';\nimport { clearAllCache, clearModuleCache } from '@intlayer/config/utils';\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 configResult = getConfigurationAndFilePath(options?.configOptions);\n const configurationFilePath = configResult.configurationFilePath;\n let configuration: IntlayerConfig =\n options?.configuration ?? configResult.configuration;\n const appLogger = getAppLogger(configuration);\n\n console.log({ configuration });\n\n const {\n watch: isWatchMode,\n watchedFilesPatternWithPath,\n fileExtensions,\n } = configuration.content;\n\n const pathsToWatch = [\n ...(Array.isArray(watchedFilesPatternWithPath)\n ? watchedFilesPatternWithPath\n : [watchedFilesPatternWithPath]),\n ...(configurationFilePath ? [configurationFilePath] : []),\n ];\n\n return chokidarWatch(pathsToWatch, {\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 if (configurationFilePath && filePath === configurationFilePath) {\n appLogger('Configuration file changed, repreparing Intlayer');\n\n clearModuleCache(configurationFilePath);\n clearAllCache();\n\n const { configuration: newConfiguration } =\n getConfigurationAndFilePath(options?.configOptions);\n\n configuration = options?.configuration ?? newConfiguration;\n\n await prepareIntlayer(configuration, { clean: false });\n } else {\n await handleContentDeclarationFileChange(filePath, configuration);\n }\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":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{detectExportedComponentName as e}from"./detectExportedComponentName.mjs";import{
|
|
1
|
+
import{detectExportedComponentName as e}from"./detectExportedComponentName.mjs";import{transformJSFile as t}from"./transformJSFile.mjs";import{writeJSFile as n}from"./writeJSFile.mjs";import{writeContentDeclaration as r}from"./writeContentDeclaration.mjs";export{e as detectExportedComponentName,t as transformJSFile,r as writeContentDeclaration,n as writeJSFile};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{transformJSFile as e}from"./transformJSFile.mjs";import{getFormatFromExtension as t}from"../utils/getFormatFromExtension.mjs";import{detectFormatCommand as n}from"../detectFormatCommand.mjs";import{getContentDeclarationFileTemplate as r}from"../getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.mjs";import{mkdir as i,readFile as a,rename as o,rm as s,writeFile as c}from"node:fs/promises";import{basename as l,extname as u,join as d}from"node:path";import{getAppLogger as f,logger as p}from"@intlayer/config/logger";import{existsSync as m}from"node:fs";import{execSync as h}from"node:child_process";const g=async(g,_,v)=>{let y={...v.dictionary,..._},b=f(v);if(!m(g)){let e=t(u(g));b(`File does not exist, creating it`,{isVerbose:!0});let n=await r(y.key,e,Object.fromEntries(Object.entries({id:y.id,locale:y.locale,filled:y.filled,fill:y.fill,description:y.description,title:y.title,tags:y.tags,version:y.version,priority:y.priority,importMode:y.importMode}).filter(([,e])=>e!==void 0))),a=v.system?.tempDir;a&&await i(a,{recursive:!0});let f=`${l(g)}.${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`,p=a?d(a,f):`${g}.${f}`;try{await c(p,n,`utf-8`),await o(p,g)}catch(e){try{await s(p,{force:!0})}catch{}throw e}}let x=await a(g,`utf-8`);if(x===``){let e=t(u(g));x=await r(y.key,e)}let S=await e(x,_),C=v.system?.tempDir;C&&await i(C,{recursive:!0});let w=`${l(g)}.${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`,T=C?d(C,w):`${g}.${w}`;try{await c(T,S,`utf-8`),await o(T,g),p(`Successfully updated ${g}`,{level:`info`,isVerbose:!0})}catch(e){try{await s(T,{force:!0})}catch{}let t=e;throw p(`Failed to write updated file: ${g}`,{level:`error`}),Error(`Failed to write updated file ${g}: ${t.message}`)}let E=n(v);if(E)try{h(E.replace(`{{file}}`,g),{stdio:`inherit`,cwd:v.content.baseDir})}catch(e){console.error(e)}};export{g as writeJSFile};
|
|
2
2
|
//# sourceMappingURL=writeJSFile.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writeJSFile.mjs","names":[],"sources":["../../../src/writeContentDeclaration/writeJSFile.ts"],"sourcesContent":["import { execSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';\nimport { basename, extname, join } from 'node:path';\nimport { getAppLogger, logger } from '@intlayer/config/logger';\nimport type { Dictionary, IntlayerConfig } from '@intlayer/types';\nimport { getContentDeclarationFileTemplate } from '../getContentDeclarationFileTemplate/getContentDeclarationFileTemplate';\nimport {\n type Extension,\n getFormatFromExtension,\n} from '../utils/getFormatFromExtension';\nimport {
|
|
1
|
+
{"version":3,"file":"writeJSFile.mjs","names":[],"sources":["../../../src/writeContentDeclaration/writeJSFile.ts"],"sourcesContent":["import { execSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';\nimport { basename, extname, join } from 'node:path';\nimport { getAppLogger, logger } from '@intlayer/config/logger';\nimport type { Dictionary, IntlayerConfig } from '@intlayer/types';\nimport { detectFormatCommand } from '../detectFormatCommand';\nimport { getContentDeclarationFileTemplate } from '../getContentDeclarationFileTemplate/getContentDeclarationFileTemplate';\nimport {\n type Extension,\n getFormatFromExtension,\n} from '../utils/getFormatFromExtension';\nimport { transformJSFile } from './transformJSFile';\n\n/**\n * Updates a JavaScript/TypeScript file based on the provided JSON instructions.\n * It targets a specific dictionary object within the file (identified by its 'key' property)\n * and updates its 'content' entries. Currently, it focuses on modifying arguments\n * of 't' (translation) function calls.\n */\nexport const writeJSFile = async (\n filePath: string,\n dictionary: Dictionary,\n configuration: IntlayerConfig\n): Promise<void> => {\n const mergedDictionary = {\n ...configuration.dictionary,\n ...dictionary,\n };\n\n const appLogger = getAppLogger(configuration);\n\n // Check if the file exist\n if (!existsSync(filePath)) {\n const fileExtension = extname(filePath) as Extension;\n\n const format = getFormatFromExtension(fileExtension);\n\n appLogger('File does not exist, creating it', {\n isVerbose: true,\n });\n const template = await getContentDeclarationFileTemplate(\n mergedDictionary.key,\n format,\n // Filter out undefined values\n Object.fromEntries(\n Object.entries({\n id: mergedDictionary.id,\n locale: mergedDictionary.locale,\n filled: mergedDictionary.filled,\n fill: mergedDictionary.fill,\n description: mergedDictionary.description,\n title: mergedDictionary.title,\n tags: mergedDictionary.tags,\n version: mergedDictionary.version,\n priority: mergedDictionary.priority,\n importMode: mergedDictionary.importMode,\n }).filter(([, value]) => value !== undefined)\n )\n );\n\n const tempDir = configuration.system?.tempDir;\n if (tempDir) {\n await mkdir(tempDir, { recursive: true });\n }\n\n const tempFileName = `${basename(filePath)}.${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`;\n const tempPath = tempDir\n ? join(tempDir, tempFileName)\n : `${filePath}.${tempFileName}`;\n try {\n await writeFile(tempPath, template, 'utf-8');\n await rename(tempPath, filePath);\n } catch (error) {\n try {\n await rm(tempPath, { force: true });\n } catch {\n // Ignore\n }\n throw error;\n }\n }\n\n let fileContent = await readFile(filePath, 'utf-8');\n\n if (fileContent === '') {\n const format = getFormatFromExtension(extname(filePath) as Extension);\n\n fileContent = await getContentDeclarationFileTemplate(\n mergedDictionary.key,\n format\n );\n }\n\n const finalCode = await transformJSFile(fileContent, dictionary);\n\n // Write the modified code back to the file\n const tempDir = configuration.system?.tempDir;\n if (tempDir) {\n await mkdir(tempDir, { recursive: true });\n }\n\n const tempFileName = `${basename(filePath)}.${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`;\n const tempPath = tempDir\n ? join(tempDir, tempFileName)\n : `${filePath}.${tempFileName}`;\n try {\n await writeFile(tempPath, finalCode, 'utf-8');\n await rename(tempPath, filePath);\n logger(`Successfully updated ${filePath}`, {\n level: 'info',\n isVerbose: true,\n });\n } catch (error) {\n try {\n await rm(tempPath, { force: true });\n } catch {\n // Ignore\n }\n const err = error as Error;\n logger(`Failed to write updated file: ${filePath}`, {\n level: 'error',\n });\n throw new Error(`Failed to write updated file ${filePath}: ${err.message}`);\n }\n\n const formatCommand = detectFormatCommand(configuration);\n\n if (formatCommand) {\n try {\n execSync(formatCommand.replace('{{file}}', filePath), {\n stdio: 'inherit',\n cwd: configuration.content.baseDir,\n });\n } catch (error) {\n console.error(error);\n }\n }\n};\n"],"mappings":"inBAoBA,MAAa,EAAc,MACzB,EACA,EACA,IACkB,CAClB,IAAM,EAAmB,CACvB,GAAG,EAAc,WACjB,GAAG,EACJ,CAEK,EAAY,EAAa,EAAc,CAG7C,GAAI,CAAC,EAAW,EAAS,CAAE,CAGzB,IAAM,EAAS,EAFO,EAAQ,EAAS,CAEa,CAEpD,EAAU,mCAAoC,CAC5C,UAAW,GACZ,CAAC,CACF,IAAM,EAAW,MAAM,EACrB,EAAiB,IACjB,EAEA,OAAO,YACL,OAAO,QAAQ,CACb,GAAI,EAAiB,GACrB,OAAQ,EAAiB,OACzB,OAAQ,EAAiB,OACzB,KAAM,EAAiB,KACvB,YAAa,EAAiB,YAC9B,MAAO,EAAiB,MACxB,KAAM,EAAiB,KACvB,QAAS,EAAiB,QAC1B,SAAU,EAAiB,SAC3B,WAAY,EAAiB,WAC9B,CAAC,CAAC,QAAQ,EAAG,KAAW,IAAU,IAAA,GAAU,CAC9C,CACF,CAEK,EAAU,EAAc,QAAQ,QAClC,GACF,MAAM,EAAM,EAAS,CAAE,UAAW,GAAM,CAAC,CAG3C,IAAM,EAAe,GAAG,EAAS,EAAS,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE,CAAC,MAC1F,EAAW,EACb,EAAK,EAAS,EAAa,CAC3B,GAAG,EAAS,GAAG,IACnB,GAAI,CACF,MAAM,EAAU,EAAU,EAAU,QAAQ,CAC5C,MAAM,EAAO,EAAU,EAAS,OACzB,EAAO,CACd,GAAI,CACF,MAAM,EAAG,EAAU,CAAE,MAAO,GAAM,CAAC,MAC7B,EAGR,MAAM,GAIV,IAAI,EAAc,MAAM,EAAS,EAAU,QAAQ,CAEnD,GAAI,IAAgB,GAAI,CACtB,IAAM,EAAS,EAAuB,EAAQ,EAAS,CAAc,CAErE,EAAc,MAAM,EAClB,EAAiB,IACjB,EACD,CAGH,IAAM,EAAY,MAAM,EAAgB,EAAa,EAAW,CAG1D,EAAU,EAAc,QAAQ,QAClC,GACF,MAAM,EAAM,EAAS,CAAE,UAAW,GAAM,CAAC,CAG3C,IAAM,EAAe,GAAG,EAAS,EAAS,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE,CAAC,MAC1F,EAAW,EACb,EAAK,EAAS,EAAa,CAC3B,GAAG,EAAS,GAAG,IACnB,GAAI,CACF,MAAM,EAAU,EAAU,EAAW,QAAQ,CAC7C,MAAM,EAAO,EAAU,EAAS,CAChC,EAAO,wBAAwB,IAAY,CACzC,MAAO,OACP,UAAW,GACZ,CAAC,OACK,EAAO,CACd,GAAI,CACF,MAAM,EAAG,EAAU,CAAE,MAAO,GAAM,CAAC,MAC7B,EAGR,IAAM,EAAM,EAIZ,MAHA,EAAO,iCAAiC,IAAY,CAClD,MAAO,QACR,CAAC,CACQ,MAAM,gCAAgC,EAAS,IAAI,EAAI,UAAU,CAG7E,IAAM,EAAgB,EAAoB,EAAc,CAExD,GAAI,EACF,GAAI,CACF,EAAS,EAAc,QAAQ,WAAY,EAAS,CAAE,CACpD,MAAO,UACP,IAAK,EAAc,QAAQ,QAC5B,CAAC,OACK,EAAO,CACd,QAAQ,MAAM,EAAM"}
|
package/dist/types/build.d.ts
CHANGED
|
@@ -22,10 +22,9 @@ import "./loadDictionaries/index.js";
|
|
|
22
22
|
import { prepareIntlayer } from "./prepareIntlayer.js";
|
|
23
23
|
import { isCachedConfigurationUpToDate, writeConfiguration } from "./writeConfiguration/index.js";
|
|
24
24
|
import { detectExportedComponentName } from "./writeContentDeclaration/detectExportedComponentName.js";
|
|
25
|
-
import { detectFormatCommand } from "./writeContentDeclaration/detectFormatCommand.js";
|
|
26
25
|
import { DictionaryStatus } from "./writeContentDeclaration/dictionaryStatus.js";
|
|
27
26
|
import { transformJSFile } from "./writeContentDeclaration/transformJSFile.js";
|
|
28
27
|
import { writeContentDeclaration } from "./writeContentDeclaration/writeContentDeclaration.js";
|
|
29
28
|
import { writeJSFile } from "./writeContentDeclaration/writeJSFile.js";
|
|
30
29
|
import "./writeContentDeclaration/index.js";
|
|
31
|
-
export { CreateDictionaryEntryPointOptions, DictionariesStatus, DictionaryStatus, buildDictionary, cleanOutputDir, createDictionaryEntryPoint, createModuleAugmentation, createTypes, detectExportedComponentName,
|
|
30
|
+
export { CreateDictionaryEntryPointOptions, DictionariesStatus, DictionaryStatus, buildDictionary, cleanOutputDir, createDictionaryEntryPoint, createModuleAugmentation, createTypes, detectExportedComponentName, formatDictionaries, formatDictionariesOutput, formatDictionary, formatDictionaryOutput, formatDistantDictionaries, formatLocalDictionaries, generateDictionaryListContent, generateTypeScriptType, getBuiltDictionariesPath, getBuiltDynamicDictionariesPath, getBuiltFetchDictionariesPath, getBuiltRemoteDictionariesPath, getBuiltUnmergedDictionariesPath, getTypeName, isCachedConfigurationUpToDate, loadContentDeclarations, loadDictionaries, loadLocalDictionaries, loadRemoteDictionaries, prepareIntlayer, processContentDeclaration, transformJSFile, writeConfiguration, writeContentDeclaration, writeJSFile };
|
package/dist/types/cli.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { detectFormatCommand } from "./detectFormatCommand.js";
|
|
1
2
|
import { getContentDeclarationFileTemplate } from "./getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.js";
|
|
2
3
|
import { initIntlayer } from "./init/index.js";
|
|
3
4
|
import { Platform, SKILLS, SKILLS_METADATA, Skill, installSkills } from "./installSkills/index.js";
|
|
@@ -7,4 +8,4 @@ import { ListProjectsOptions, listProjects } from "./listProjects.js";
|
|
|
7
8
|
import { extractDictionaryKey } from "./transformFiles/extractDictionaryKey.js";
|
|
8
9
|
import { ATTRIBUTES_TO_EXTRACT, ExtractIntlayerOptions, PackageName, extractIntlayer, shouldExtract, transformFiles } from "./transformFiles/transformFiles.js";
|
|
9
10
|
import "./transformFiles/index.js";
|
|
10
|
-
export { ATTRIBUTES_TO_EXTRACT, DiffMode, ExtractIntlayerOptions, ListGitFilesOptions, ListGitLinesOptions, ListProjectsOptions, PackageName, Platform, SKILLS, SKILLS_METADATA, Skill, extractDictionaryKey, extractIntlayer, getContentDeclarationFileTemplate, initIntlayer, installSkills, listDictionaries, listDictionariesWithStats, listGitFiles, listGitLines, listProjects, shouldExtract, transformFiles };
|
|
11
|
+
export { ATTRIBUTES_TO_EXTRACT, DiffMode, ExtractIntlayerOptions, ListGitFilesOptions, ListGitLinesOptions, ListProjectsOptions, PackageName, Platform, SKILLS, SKILLS_METADATA, Skill, detectFormatCommand, extractDictionaryKey, extractIntlayer, getContentDeclarationFileTemplate, initIntlayer, installSkills, listDictionaries, listDictionariesWithStats, listGitFiles, listGitLines, listProjects, shouldExtract, transformFiles };
|
package/dist/types/{writeContentDeclaration/detectFormatCommand.d.ts → detectFormatCommand.d.ts}
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { IntlayerConfig } from "@intlayer/types";
|
|
2
2
|
|
|
3
|
-
//#region src/
|
|
3
|
+
//#region src/detectFormatCommand.d.ts
|
|
4
4
|
declare const detectFormatCommand: (configuration: IntlayerConfig, projectRequireProp?: NodeJS.Require) => string;
|
|
5
5
|
//#endregion
|
|
6
6
|
export { detectFormatCommand };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectFormatCommand.d.ts","names":[],"sources":["../../src/detectFormatCommand.ts"],"mappings":";;;cAKa,mBAAA,GACX,aAAA,EAAe,cAAA,EACf,kBAAA,GAAqB,MAAA,CAAO,OAAA"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -18,12 +18,12 @@ import { formatDistantDictionaries, loadRemoteDictionaries } from "./loadDiction
|
|
|
18
18
|
import { prepareIntlayer } from "./prepareIntlayer.js";
|
|
19
19
|
import { isCachedConfigurationUpToDate, writeConfiguration } from "./writeConfiguration/index.js";
|
|
20
20
|
import { detectExportedComponentName } from "./writeContentDeclaration/detectExportedComponentName.js";
|
|
21
|
-
import { detectFormatCommand } from "./writeContentDeclaration/detectFormatCommand.js";
|
|
22
21
|
import { DictionaryStatus } from "./writeContentDeclaration/dictionaryStatus.js";
|
|
23
22
|
import { transformJSFile } from "./writeContentDeclaration/transformJSFile.js";
|
|
24
23
|
import { writeContentDeclaration } from "./writeContentDeclaration/writeContentDeclaration.js";
|
|
25
24
|
import { writeJSFile } from "./writeContentDeclaration/writeJSFile.js";
|
|
26
25
|
import "./build.js";
|
|
26
|
+
import { detectFormatCommand } from "./detectFormatCommand.js";
|
|
27
27
|
import { Extension, Format, getExtensionFromFormat, getFormatFromExtension } from "./utils/getFormatFromExtension.js";
|
|
28
28
|
import { getContentDeclarationFileTemplate } from "./getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.js";
|
|
29
29
|
import { initIntlayer } from "./init/index.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/init/index.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/init/index.ts"],"mappings":";;AAmKA;;cAAa,YAAA,GAAsB,OAAA,aAAe,OAAA"}
|
|
@@ -11,6 +11,10 @@ declare const readFileFromRoot: (rootDir: string, filePath: string) => Promise<s
|
|
|
11
11
|
* Helper to write a file
|
|
12
12
|
*/
|
|
13
13
|
declare const writeFileToRoot: (rootDir: string, filePath: string, content: string) => Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Helper to ensure a directory exists
|
|
16
|
+
*/
|
|
17
|
+
declare const ensureDirectory: (rootDir: string, dirPath: string) => Promise<void>;
|
|
14
18
|
//#endregion
|
|
15
|
-
export { exists, readFileFromRoot, writeFileToRoot };
|
|
19
|
+
export { ensureDirectory, exists, readFileFromRoot, writeFileToRoot };
|
|
16
20
|
//# sourceMappingURL=fileSystem.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileSystem.d.ts","names":[],"sources":["../../../../src/init/utils/fileSystem.ts"],"mappings":";;AAMA;;cAAa,MAAA,GAAgB,OAAA,UAAiB,QAAA,aAAgB,OAAA;;;;cAYjD,gBAAA,GAA0B,OAAA,UAAiB,QAAA,aAAgB,OAAA;;;AAAxE;cAMa,eAAA,GACX,OAAA,UACA,QAAA,UACA,OAAA,aAAe,OAAA"}
|
|
1
|
+
{"version":3,"file":"fileSystem.d.ts","names":[],"sources":["../../../../src/init/utils/fileSystem.ts"],"mappings":";;AAMA;;cAAa,MAAA,GAAgB,OAAA,UAAiB,QAAA,aAAgB,OAAA;;;;cAYjD,gBAAA,GAA0B,OAAA,UAAiB,QAAA,aAAgB,OAAA;;;AAAxE;cAMa,eAAA,GACX,OAAA,UACA,QAAA,UACA,OAAA,aAAe,OAAA;;;;cAMJ,eAAA,GAAyB,OAAA,UAAiB,OAAA,aAAe,OAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { updateNextConfig, updateViteConfig } from "./configManipulation.js";
|
|
2
|
-
import { exists, readFileFromRoot, writeFileToRoot } from "./fileSystem.js";
|
|
2
|
+
import { ensureDirectory, exists, readFileFromRoot, writeFileToRoot } from "./fileSystem.js";
|
|
3
3
|
import { parseJSONWithComments } from "./jsonParser.js";
|
|
4
4
|
import { findTsConfigFiles } from "./tsConfig.js";
|
|
5
|
-
export { exists, findTsConfigFiles, parseJSONWithComments, readFileFromRoot, updateNextConfig, updateViteConfig, writeFileToRoot };
|
|
5
|
+
export { ensureDirectory, exists, findTsConfigFiles, parseJSONWithComments, readFileFromRoot, updateNextConfig, updateViteConfig, writeFileToRoot };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.d.ts","names":[],"sources":["../../src/watcher.ts"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","names":[],"sources":["../../src/watcher.ts"],"mappings":";;;;;;KAqCK,YAAA,GAAe,eAAA;EAClB,aAAA,GAAgB,cAAA;EAChB,aAAA,GAAgB,uBAAA;EAChB,WAAA;AAAA;AAAA,cAIW,KAAA,GAAS,OAAA,GAAU,YAAA,KAAY,QAAA,CAAA,SAAA;AAAA,cAqJ/B,qBAAA,GAA+B,OAAA,GAAU,YAAA,KAAY,OAAA"}
|