@intlayer/chokidar 7.2.2 → 7.3.0-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +2 -0
  2. package/dist/cjs/getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.cjs +5 -4
  3. package/dist/cjs/getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.cjs.map +1 -1
  4. package/dist/cjs/index.cjs +12 -6
  5. package/dist/cjs/listDictionariesPath.cjs +9 -0
  6. package/dist/cjs/listDictionariesPath.cjs.map +1 -1
  7. package/dist/cjs/prepareIntlayer.cjs +9 -2
  8. package/dist/cjs/prepareIntlayer.cjs.map +1 -1
  9. package/dist/cjs/transformFiles/extractDictionaryKey.cjs +16 -0
  10. package/dist/cjs/transformFiles/extractDictionaryKey.cjs.map +1 -0
  11. package/dist/cjs/transformFiles/index.cjs +6 -0
  12. package/dist/cjs/transformFiles/transformFiles.cjs +218 -0
  13. package/dist/cjs/transformFiles/transformFiles.cjs.map +1 -0
  14. package/dist/cjs/writeContentDeclaration/detectFormatCommand.cjs +16 -14
  15. package/dist/cjs/writeContentDeclaration/detectFormatCommand.cjs.map +1 -1
  16. package/dist/cjs/writeContentDeclaration/transformJSFile.cjs +1 -1
  17. package/dist/cjs/writeContentDeclaration/transformJSFile.cjs.map +1 -1
  18. package/dist/cjs/writeContentDeclaration/writeJSFile.cjs +1 -1
  19. package/dist/esm/getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.mjs +5 -4
  20. package/dist/esm/getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.mjs.map +1 -1
  21. package/dist/esm/index.mjs +10 -8
  22. package/dist/esm/listDictionariesPath.mjs +9 -1
  23. package/dist/esm/listDictionariesPath.mjs.map +1 -1
  24. package/dist/esm/prepareIntlayer.mjs +10 -3
  25. package/dist/esm/prepareIntlayer.mjs.map +1 -1
  26. package/dist/esm/transformFiles/extractDictionaryKey.mjs +15 -0
  27. package/dist/esm/transformFiles/extractDictionaryKey.mjs.map +1 -0
  28. package/dist/esm/transformFiles/index.mjs +4 -0
  29. package/dist/esm/transformFiles/transformFiles.mjs +215 -0
  30. package/dist/esm/transformFiles/transformFiles.mjs.map +1 -0
  31. package/dist/esm/writeContentDeclaration/detectFormatCommand.mjs +16 -14
  32. package/dist/esm/writeContentDeclaration/detectFormatCommand.mjs.map +1 -1
  33. package/dist/esm/writeContentDeclaration/transformJSFile.mjs +1 -1
  34. package/dist/esm/writeContentDeclaration/transformJSFile.mjs.map +1 -1
  35. package/dist/esm/writeContentDeclaration/writeJSFile.mjs +1 -1
  36. package/dist/types/buildIntlayerDictionary/writeDynamicDictionary.d.ts +3 -3
  37. package/dist/types/buildIntlayerDictionary/writeFetchDictionary.d.ts +3 -3
  38. package/dist/types/buildIntlayerDictionary/writeMergedDictionary.d.ts +2 -2
  39. package/dist/types/buildIntlayerDictionary/writeRemoteDictionary.d.ts +2 -2
  40. package/dist/types/createDictionaryEntryPoint/createDictionaryEntryPoint.d.ts +2 -2
  41. package/dist/types/createDictionaryEntryPoint/generateDictionaryListContent.d.ts +2 -2
  42. package/dist/types/createDictionaryEntryPoint/generateDictionaryListContent.d.ts.map +1 -1
  43. package/dist/types/index.d.ts +5 -2
  44. package/dist/types/listDictionariesPath.d.ts +6 -1
  45. package/dist/types/listDictionariesPath.d.ts.map +1 -1
  46. package/dist/types/loadDictionaries/loadRemoteDictionaries.d.ts +2 -2
  47. package/dist/types/prepareIntlayer.d.ts.map +1 -1
  48. package/dist/types/transformFiles/extractDictionaryKey.d.ts +5 -0
  49. package/dist/types/transformFiles/extractDictionaryKey.d.ts.map +1 -0
  50. package/dist/types/transformFiles/index.d.ts +3 -0
  51. package/dist/types/transformFiles/transformFiles.d.ts +16 -0
  52. package/dist/types/transformFiles/transformFiles.d.ts.map +1 -0
  53. package/dist/types/writeContentDeclaration/transformJSFile.d.ts.map +1 -1
  54. package/package.json +19 -10
package/README.md CHANGED
@@ -24,6 +24,8 @@
24
24
  <a href="https://github.com/aymericzip/intlayer/blob/main/LICENSE" target="_blank" rel="noopener noreferrer nofollow"><img src="https://img.shields.io/github/license/aymericzip/intlayer?style=for-the-badge&labelColor=000000&color=FFFFFF&logoColor=000000&cacheSeconds=86400" alt="license"/></a>
25
25
  <a href="https://github.com/aymericzip/intlayer/commits/main" target="_blank" rel="noopener noreferrer nofollow"><img src="https://img.shields.io/github/last-commit/aymericzip/intlayer?style=for-the-badge&labelColor=000000&color=FFFFFF&logoColor=000000&cacheSeconds=86400" alt="last commit"/>
26
26
  </a>
27
+ <a href="https://bountyhub.dev/bounties?repo=intlayer" target="_blank" rel="noopener noreferrer nofollow"><img src="https://img.shields.io/badge/Bounties-on%20BountyHub-yellow?style=for-the-badge&labelColor=000000&color=FFFFFF&logoColor=000000&cacheSeconds=86400" alt="Bounties on BountyHub"/>
28
+ </a>
27
29
  </p>
28
30
 
29
31
  ![Watch the video](https://github.com/aymericzip/intlayer/blob/main/docs/assets/demo_video.gif)
@@ -23,10 +23,11 @@ const getContentDeclarationFileTemplate = async (key, format, fileParams = {}) =
23
23
  const camelCaseKey = (0, __intlayer_config.kebabCaseToCamelCase)(key);
24
24
  const nonCapitalizedCamelCaseKey = camelCaseKey.charAt(0).toLowerCase() + camelCaseKey.slice(1);
25
25
  const fileParamsString = Object.entries(fileParams).filter(([, value]) => value !== void 0).map(([key$1, value]) => {
26
- if (typeof value === "object") return `\n '${key$1}': ${JSON.stringify(value)},`;
27
- if (typeof value === "boolean" || typeof value === "number") return `\n '${key$1}': ${value},`;
28
- if (typeof value === "string") return `\n '${key$1}': '${value}',`;
29
- return `\n '${key$1}': ${value},`;
26
+ const formattedKey = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key$1) ? key$1 : JSON.stringify(key$1);
27
+ if (typeof value === "object") return `\n ${formattedKey}: ${JSON.stringify(value)},`;
28
+ if (typeof value === "boolean" || typeof value === "number") return `\n ${formattedKey}: ${value},`;
29
+ if (typeof value === "string") return `\n ${formattedKey}: ${JSON.stringify(value)},`;
30
+ return `\n ${formattedKey}: ${value},`;
30
31
  }).join("");
31
32
  return fileContent.replace("{{key}}", key).replaceAll("{{name}}", nonCapitalizedCamelCaseKey).replace("{{fileParams}}", fileParamsString);
32
33
  };
@@ -1 +1 @@
1
- {"version":3,"file":"getContentDeclarationFileTemplate.cjs","names":["fileTemplate: string","readAsset","key"],"sources":["../../../src/getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.ts"],"sourcesContent":["import { readAsset } from 'utils:asset';\nimport { kebabCaseToCamelCase } from '@intlayer/config';\nimport type { Format } from '../utils/getFormatFromExtension';\n\nexport const getContentDeclarationFileTemplate = async (\n key: string,\n format: Format,\n fileParams: Record<string, any> = {}\n) => {\n let fileTemplate: string;\n\n switch (format) {\n case 'ts':\n fileTemplate = './tsTemplate.txt';\n break;\n case 'cjs':\n fileTemplate = './cjsTemplate.txt';\n break;\n case 'json':\n fileTemplate = './jsonTemplate.txt';\n break;\n default:\n fileTemplate = './esmTemplate.txt';\n break;\n }\n\n const fileContent = readAsset(fileTemplate);\n const camelCaseKey = kebabCaseToCamelCase(key);\n const nonCapitalizedCamelCaseKey =\n camelCaseKey.charAt(0).toLowerCase() + camelCaseKey.slice(1);\n\n const fileParamsString = Object.entries(fileParams)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => {\n if (typeof value === 'object') {\n return `\\n '${key}': ${JSON.stringify(value)},`;\n }\n\n if (typeof value === 'boolean' || typeof value === 'number') {\n return `\\n '${key}': ${value},`;\n }\n\n if (typeof value === 'string') {\n return `\\n '${key}': '${value}',`;\n }\n\n return `\\n '${key}': ${value},`;\n })\n .join('');\n\n return fileContent\n .replace('{{key}}', key)\n .replaceAll('{{name}}', nonCapitalizedCamelCaseKey)\n .replace('{{fileParams}}', fileParamsString);\n};\n"],"mappings":";;;;;AAIA,MAAa,oCAAoC,OAC/C,KACA,QACA,aAAkC,EAAE,KACjC;CACH,IAAIA;AAEJ,SAAQ,QAAR;EACE,KAAK;AACH,kBAAe;AACf;EACF,KAAK;AACH,kBAAe;AACf;EACF,KAAK;AACH,kBAAe;AACf;EACF;AACE,kBAAe;AACf;;CAGJ,MAAM,cAAcC,+BAAU,aAAa;CAC3C,MAAM,2DAAoC,IAAI;CAC9C,MAAM,6BACJ,aAAa,OAAO,EAAE,CAAC,aAAa,GAAG,aAAa,MAAM,EAAE;CAE9D,MAAM,mBAAmB,OAAO,QAAQ,WAAW,CAChD,QAAQ,GAAG,WAAW,UAAU,OAAU,CAC1C,KAAK,CAACC,OAAK,WAAW;AACrB,MAAI,OAAO,UAAU,SACnB,QAAO,QAAQA,MAAI,KAAK,KAAK,UAAU,MAAM,CAAC;AAGhD,MAAI,OAAO,UAAU,aAAa,OAAO,UAAU,SACjD,QAAO,QAAQA,MAAI,KAAK,MAAM;AAGhC,MAAI,OAAO,UAAU,SACnB,QAAO,QAAQA,MAAI,MAAM,MAAM;AAGjC,SAAO,QAAQA,MAAI,KAAK,MAAM;GAC9B,CACD,KAAK,GAAG;AAEX,QAAO,YACJ,QAAQ,WAAW,IAAI,CACvB,WAAW,YAAY,2BAA2B,CAClD,QAAQ,kBAAkB,iBAAiB"}
1
+ {"version":3,"file":"getContentDeclarationFileTemplate.cjs","names":["fileTemplate: string","readAsset","key"],"sources":["../../../src/getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.ts"],"sourcesContent":["import { readAsset } from 'utils:asset';\nimport { kebabCaseToCamelCase } from '@intlayer/config';\nimport type { Format } from '../utils/getFormatFromExtension';\n\nexport const getContentDeclarationFileTemplate = async (\n key: string,\n format: Format,\n fileParams: Record<string, any> = {}\n) => {\n let fileTemplate: string;\n\n switch (format) {\n case 'ts':\n fileTemplate = './tsTemplate.txt';\n break;\n case 'cjs':\n fileTemplate = './cjsTemplate.txt';\n break;\n case 'json':\n fileTemplate = './jsonTemplate.txt';\n break;\n default:\n fileTemplate = './esmTemplate.txt';\n break;\n }\n\n const fileContent = readAsset(fileTemplate);\n const camelCaseKey = kebabCaseToCamelCase(key);\n const nonCapitalizedCamelCaseKey =\n camelCaseKey.charAt(0).toLowerCase() + camelCaseKey.slice(1);\n\n const fileParamsString = Object.entries(fileParams)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => {\n const formattedKey = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key)\n ? key\n : JSON.stringify(key);\n\n if (typeof value === 'object') {\n return `\\n ${formattedKey}: ${JSON.stringify(value)},`;\n }\n\n if (typeof value === 'boolean' || typeof value === 'number') {\n return `\\n ${formattedKey}: ${value},`;\n }\n\n if (typeof value === 'string') {\n return `\\n ${formattedKey}: ${JSON.stringify(value)},`;\n }\n\n return `\\n ${formattedKey}: ${value},`;\n })\n .join('');\n\n return fileContent\n .replace('{{key}}', key)\n .replaceAll('{{name}}', nonCapitalizedCamelCaseKey)\n .replace('{{fileParams}}', fileParamsString);\n};\n"],"mappings":";;;;;AAIA,MAAa,oCAAoC,OAC/C,KACA,QACA,aAAkC,EAAE,KACjC;CACH,IAAIA;AAEJ,SAAQ,QAAR;EACE,KAAK;AACH,kBAAe;AACf;EACF,KAAK;AACH,kBAAe;AACf;EACF,KAAK;AACH,kBAAe;AACf;EACF;AACE,kBAAe;AACf;;CAGJ,MAAM,cAAcC,+BAAU,aAAa;CAC3C,MAAM,2DAAoC,IAAI;CAC9C,MAAM,6BACJ,aAAa,OAAO,EAAE,CAAC,aAAa,GAAG,aAAa,MAAM,EAAE;CAE9D,MAAM,mBAAmB,OAAO,QAAQ,WAAW,CAChD,QAAQ,GAAG,WAAW,UAAU,OAAU,CAC1C,KAAK,CAACC,OAAK,WAAW;EACrB,MAAM,eAAe,6BAA6B,KAAKA,MAAI,GACvDA,QACA,KAAK,UAAUA,MAAI;AAEvB,MAAI,OAAO,UAAU,SACnB,QAAO,OAAO,aAAa,IAAI,KAAK,UAAU,MAAM,CAAC;AAGvD,MAAI,OAAO,UAAU,aAAa,OAAO,UAAU,SACjD,QAAO,OAAO,aAAa,IAAI,MAAM;AAGvC,MAAI,OAAO,UAAU,SACnB,QAAO,OAAO,aAAa,IAAI,KAAK,UAAU,MAAM,CAAC;AAGvD,SAAO,OAAO,aAAa,IAAI,MAAM;GACrC,CACD,KAAK,GAAG;AAEX,QAAO,YACJ,QAAQ,WAAW,IAAI,CACvB,WAAW,YAAY,2BAA2B,CAClD,QAAQ,kBAAkB,iBAAiB"}
@@ -30,20 +30,22 @@ const require_loadDictionaries_loadDictionaries = require('./loadDictionaries/lo
30
30
  const require_utils_runOnce = require('./utils/runOnce.cjs');
31
31
  const require_prepareIntlayer = require('./prepareIntlayer.cjs');
32
32
  const require_reduceDictionaryContent_reduceDictionaryContent = require('./reduceDictionaryContent/reduceDictionaryContent.cjs');
33
+ const require_writeContentDeclaration_detectExportedComponentName = require('./writeContentDeclaration/detectExportedComponentName.cjs');
34
+ const require_transformFiles_extractDictionaryKey = require('./transformFiles/extractDictionaryKey.cjs');
35
+ const require_writeContentDeclaration_transformJSFile = require('./writeContentDeclaration/transformJSFile.cjs');
36
+ const require_utils_getFormatFromExtension = require('./utils/getFormatFromExtension.cjs');
37
+ const require_writeContentDeclaration_detectFormatCommand = require('./writeContentDeclaration/detectFormatCommand.cjs');
38
+ const require_writeContentDeclaration_writeJSFile = require('./writeContentDeclaration/writeJSFile.cjs');
39
+ const require_writeContentDeclaration_writeContentDeclaration = require('./writeContentDeclaration/writeContentDeclaration.cjs');
40
+ const require_transformFiles_transformFiles = require('./transformFiles/transformFiles.cjs');
33
41
  const require_utils_splitTextByLine = require('./utils/splitTextByLine.cjs');
34
42
  const require_utils_getChunk = require('./utils/getChunk.cjs');
35
43
  const require_utils_chunkJSON = require('./utils/chunkJSON.cjs');
36
- const require_utils_getFormatFromExtension = require('./utils/getFormatFromExtension.cjs');
37
44
  const require_utils_parallelizeGlobal = require('./utils/parallelizeGlobal.cjs');
38
45
  const require_utils_reduceObjectFormat = require('./utils/reduceObjectFormat.cjs');
39
46
  const require_utils_runParallel_index = require('./utils/runParallel/index.cjs');
40
47
  const require_utils_verifyIdenticObjectFormat = require('./utils/verifyIdenticObjectFormat.cjs');
41
48
  const require_watcher = require('./watcher.cjs');
42
- const require_writeContentDeclaration_detectExportedComponentName = require('./writeContentDeclaration/detectExportedComponentName.cjs');
43
- const require_writeContentDeclaration_transformJSFile = require('./writeContentDeclaration/transformJSFile.cjs');
44
- const require_writeContentDeclaration_detectFormatCommand = require('./writeContentDeclaration/detectFormatCommand.cjs');
45
- const require_writeContentDeclaration_writeJSFile = require('./writeContentDeclaration/writeJSFile.cjs');
46
- const require_writeContentDeclaration_writeContentDeclaration = require('./writeContentDeclaration/writeContentDeclaration.cjs');
47
49
 
48
50
  exports.assembleJSON = require_utils_chunkJSON.assembleJSON;
49
51
  exports.buildAndWatchIntlayer = require_watcher.buildAndWatchIntlayer;
@@ -55,6 +57,8 @@ exports.createModuleAugmentation = require_createType_createModuleAugmentation.c
55
57
  exports.createTypes = require_createType_createType.createTypes;
56
58
  exports.detectExportedComponentName = require_writeContentDeclaration_detectExportedComponentName.detectExportedComponentName;
57
59
  exports.detectFormatCommand = require_writeContentDeclaration_detectFormatCommand.detectFormatCommand;
60
+ exports.extractDictionaryKey = require_transformFiles_extractDictionaryKey.extractDictionaryKey;
61
+ exports.extractIntlayer = require_transformFiles_transformFiles.extractIntlayer;
58
62
  exports.fetchDistantDictionaries = require_fetchDistantDictionaries.fetchDistantDictionaries;
59
63
  exports.formatLocale = require_utils_formatter.formatLocale;
60
64
  exports.formatPath = require_utils_formatter.formatPath;
@@ -76,6 +80,7 @@ exports.handleContentDeclarationFileChange = require_handleContentDeclarationFil
76
80
  exports.handleUnlinkedContentDeclarationFile = require_handleUnlinkedContentDeclarationFile.handleUnlinkedContentDeclarationFile;
77
81
  exports.isInvalidDictionary = require_filterInvalidDictionaries.isInvalidDictionary;
78
82
  exports.listDictionaries = require_listDictionariesPath.listDictionaries;
83
+ exports.listDictionariesWithStats = require_listDictionariesPath.listDictionariesWithStats;
79
84
  exports.listGitFiles = require_listGitFiles.listGitFiles;
80
85
  exports.listGitLines = require_listGitFiles.listGitLines;
81
86
  exports.loadContentDeclarations = require_loadDictionaries_loadContentDeclaration.loadContentDeclarations;
@@ -94,6 +99,7 @@ exports.runOnce = require_utils_runOnce.runOnce;
94
99
  exports.runParallel = require_utils_runParallel_index.runParallel;
95
100
  exports.sortAlphabetically = require_utils_sortAlphabetically.sortAlphabetically;
96
101
  exports.splitTextByLines = require_utils_splitTextByLine.splitTextByLines;
102
+ exports.transformFiles = require_transformFiles_transformFiles.transformFiles;
97
103
  exports.transformJSFile = require_writeContentDeclaration_transformJSFile.transformJSFile;
98
104
  exports.verifyIdenticObjectFormat = require_utils_verifyIdenticObjectFormat.verifyIdenticObjectFormat;
99
105
  exports.watch = require_watcher.watch;
@@ -1,4 +1,5 @@
1
1
  const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
2
+ let node_fs_promises = require("node:fs/promises");
2
3
  let fast_glob = require("fast-glob");
3
4
  fast_glob = require_rolldown_runtime.__toESM(fast_glob);
4
5
 
@@ -11,7 +12,15 @@ fast_glob = require_rolldown_runtime.__toESM(fast_glob);
11
12
  const listDictionaries = async (configuration) => {
12
13
  return await (0, fast_glob.default)(configuration.content.watchedFilesPatternWithPath, { ignore: configuration.content.excludedPath });
13
14
  };
15
+ const listDictionariesWithStats = async (configuration) => {
16
+ const files = await listDictionaries(configuration);
17
+ return Promise.all(files.map(async (file) => ({
18
+ path: file,
19
+ stats: await (0, node_fs_promises.stat)(file)
20
+ })));
21
+ };
14
22
 
15
23
  //#endregion
16
24
  exports.listDictionaries = listDictionaries;
25
+ exports.listDictionariesWithStats = listDictionariesWithStats;
17
26
  //# sourceMappingURL=listDictionariesPath.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"listDictionariesPath.cjs","names":[],"sources":["../../src/listDictionariesPath.ts"],"sourcesContent":["import type { IntlayerConfig } from '@intlayer/types';\nimport fg from 'fast-glob';\n\n/**\n * List all dictionaries absolute paths in the project\n * @param configuration - The configuration object\n * @returns An array of dictionary paths\n */\nexport const listDictionaries = async (\n configuration: IntlayerConfig\n): Promise<string[]> => {\n const files: string[] = await fg(\n configuration.content.watchedFilesPatternWithPath,\n {\n ignore: configuration.content.excludedPath,\n }\n );\n\n return files;\n};\n"],"mappings":";;;;;;;;;;AAQA,MAAa,mBAAmB,OAC9B,kBACsB;AAQtB,QAPwB,6BACtB,cAAc,QAAQ,6BACtB,EACE,QAAQ,cAAc,QAAQ,cAC/B,CACF"}
1
+ {"version":3,"file":"listDictionariesPath.cjs","names":[],"sources":["../../src/listDictionariesPath.ts"],"sourcesContent":["import { stat } from 'node:fs/promises';\nimport type { IntlayerConfig } from '@intlayer/types';\nimport fg from 'fast-glob';\n\n/**\n * List all dictionaries absolute paths in the project\n * @param configuration - The configuration object\n * @returns An array of dictionary paths\n */\nexport const listDictionaries = async (\n configuration: IntlayerConfig\n): Promise<string[]> => {\n const files: string[] = await fg(\n configuration.content.watchedFilesPatternWithPath,\n {\n ignore: configuration.content.excludedPath,\n }\n );\n\n return files;\n};\n\nexport const listDictionariesWithStats = async (\n configuration: IntlayerConfig\n) => {\n const files = await listDictionaries(configuration);\n\n return Promise.all(\n files.map(async (file) => ({ path: file, stats: await stat(file) }))\n );\n};\n"],"mappings":";;;;;;;;;;;AASA,MAAa,mBAAmB,OAC9B,kBACsB;AAQtB,QAPwB,6BACtB,cAAc,QAAQ,6BACtB,EACE,QAAQ,cAAc,QAAQ,cAC/B,CACF;;AAKH,MAAa,4BAA4B,OACvC,kBACG;CACH,MAAM,QAAQ,MAAM,iBAAiB,cAAc;AAEnD,QAAO,QAAQ,IACb,MAAM,IAAI,OAAO,UAAU;EAAE,MAAM;EAAM,OAAO,iCAAW,KAAK;EAAE,EAAE,CACrE"}
@@ -9,6 +9,7 @@ const require_loadDictionaries_loadDictionaries = require('./loadDictionaries/lo
9
9
  const require_buildIntlayerDictionary_writeRemoteDictionary = require('./buildIntlayerDictionary/writeRemoteDictionary.cjs');
10
10
  const require_utils_runOnce = require('./utils/runOnce.cjs');
11
11
  const require_writeConfiguration_index = require('./writeConfiguration/index.cjs');
12
+ let node_fs_promises = require("node:fs/promises");
12
13
  let __intlayer_config = require("@intlayer/config");
13
14
  let node_path = require("node:path");
14
15
  let __intlayer_config_package_json = require("@intlayer/config/package.json");
@@ -27,9 +28,15 @@ const prepareIntlayer = async (configuration, options) => {
27
28
  const intlayerCacheVersion = await versionCache.get();
28
29
  const isCorrectVersion = Boolean(intlayerCacheVersion && intlayerCacheVersion === __intlayer_config_package_json.default.version);
29
30
  const isConfigSimilar = await require_writeConfiguration_index.isCachedConfigurationUpToDate(configuration);
31
+ const dictionariesWithStats = await require_listDictionariesPath.listDictionariesWithStats(configuration);
32
+ let isDictionaryChanged = false;
33
+ try {
34
+ const sentinelStats = await (0, node_fs_promises.stat)(sentinelPath);
35
+ isDictionaryChanged = dictionariesWithStats.some((dictionary) => dictionary.stats.mtime.getTime() > sentinelStats.mtime.getTime());
36
+ } catch {}
30
37
  const { clean, format, forceRun, onIsCached, cacheTimeoutMs } = {
31
38
  ...DEFAULT_PREPARE_INTLAYER_OPTIONS,
32
- forceRun: !isCorrectVersion || !isConfigSimilar,
39
+ forceRun: !isCorrectVersion || !isConfigSimilar || isDictionaryChanged,
33
40
  ...options ?? {}
34
41
  };
35
42
  await require_utils_runOnce.runOnce(sentinelPath, async () => {
@@ -40,7 +47,7 @@ const prepareIntlayer = async (configuration, options) => {
40
47
  await require_writeConfiguration_index.writeConfiguration(configuration);
41
48
  const configurationWrittenTime = Date.now();
42
49
  appLogger(["Configuration written", (0, __intlayer_config.colorize)(`(${configurationWrittenTime - preparationStartMs}ms)`, __intlayer_config.ANSIColors.GREY_DARK)], { isVerbose: true });
43
- const dictionaries = await require_loadDictionaries_loadDictionaries.loadDictionaries(await require_listDictionariesPath.listDictionaries(configuration), configuration);
50
+ const dictionaries = await require_loadDictionaries_loadDictionaries.loadDictionaries(dictionariesWithStats.map((dictionary) => dictionary.path), configuration);
44
51
  const dictionariesLoadedTime = Date.now();
45
52
  appLogger(["Content loaded", (0, __intlayer_config.colorize)([dictionaries.remoteDictionaries.length + dictionaries.pluginDictionaries.length > 0 ? [
46
53
  `(Total: ${dictionariesLoadedTime - configurationWrittenTime}ms`,
@@ -1 +1 @@
1
- {"version":3,"file":"prepareIntlayer.cjs","names":["packageJson","isCachedConfigurationUpToDate","runOnce","cleanOutputDir","ANSIColors","writeConfiguration","loadDictionaries","listDictionaries","buildDictionary","writeRemoteDictionary","createTypes","createDictionaryEntryPoint","createModuleAugmentation"],"sources":["../../src/prepareIntlayer.ts"],"sourcesContent":["import { join } from 'node:path';\nimport {\n ANSIColors,\n cacheDisk,\n // checkVersionsConsistency,\n colorize,\n getAppLogger,\n} from '@intlayer/config';\nimport packageJson from '@intlayer/config/package.json' with { type: 'json' };\nimport type { IntlayerConfig } from '@intlayer/types';\nimport { buildDictionary } from './buildIntlayerDictionary/buildIntlayerDictionary';\nimport { writeRemoteDictionary } from './buildIntlayerDictionary/writeRemoteDictionary';\nimport { cleanOutputDir } from './cleanOutputDir';\nimport { createDictionaryEntryPoint } from './createDictionaryEntryPoint/createDictionaryEntryPoint';\nimport { createModuleAugmentation, createTypes } from './createType/index';\nimport { listDictionaries } from './listDictionariesPath';\nimport { loadDictionaries } from './loadDictionaries/loadDictionaries';\nimport { runOnce } from './utils/runOnce';\nimport {\n isCachedConfigurationUpToDate,\n writeConfiguration,\n} from './writeConfiguration';\n\ntype PrepareIntlayerOptions = {\n clean?: boolean;\n format?: ('cjs' | 'esm')[];\n forceRun?: boolean;\n cacheTimeoutMs?: number;\n onIsCached?: () => void | Promise<void>;\n};\n\nconst DEFAULT_PREPARE_INTLAYER_OPTIONS = {\n clean: false,\n format: ['cjs', 'esm'],\n cacheTimeoutMs: 1000 * 60 * 60, // 1 hour\n} satisfies PrepareIntlayerOptions;\n\nexport const prepareIntlayer = async (\n configuration: IntlayerConfig,\n options?: PrepareIntlayerOptions\n) => {\n const appLogger = getAppLogger(configuration);\n\n const sentinelPath = join(\n configuration.content.cacheDir,\n 'intlayer-prepared.lock'\n );\n // Clean output dir if the intlayer version has changed\n const versionCache = cacheDisk(configuration, ['intlayer-version']);\n const intlayerCacheVersion = await versionCache.get();\n const isCorrectVersion = Boolean(\n intlayerCacheVersion && intlayerCacheVersion === packageJson.version\n );\n\n const isConfigSimilar = await isCachedConfigurationUpToDate(configuration);\n\n const { clean, format, forceRun, onIsCached, cacheTimeoutMs } = {\n ...DEFAULT_PREPARE_INTLAYER_OPTIONS,\n forceRun: !isCorrectVersion || !isConfigSimilar,\n ...(options ?? {}),\n };\n\n // Skip preparation if it has already been done recently\n await runOnce(\n sentinelPath,\n async () => {\n // comment because of issue with next and webpack\n // await checkVersionsConsistency(configuration);\n\n if (clean || !isCorrectVersion) {\n await cleanOutputDir(configuration);\n }\n\n await versionCache.set(packageJson.version);\n\n const preparationStartMs = Date.now();\n\n appLogger([\n 'Preparing Intlayer',\n colorize(`(v${packageJson.version})`, ANSIColors.GREY_DARK),\n ]);\n\n await writeConfiguration(configuration);\n\n const configurationWrittenTime = Date.now();\n\n appLogger(\n [\n 'Configuration written',\n colorize(\n `(${configurationWrittenTime - preparationStartMs}ms)`,\n ANSIColors.GREY_DARK\n ),\n ],\n {\n isVerbose: true,\n }\n );\n\n const files: string[] = await listDictionaries(configuration);\n\n const dictionaries = await loadDictionaries(files, configuration);\n\n const dictionariesLoadedTime = Date.now();\n\n appLogger(\n [\n 'Content loaded',\n colorize(\n [\n dictionaries.remoteDictionaries.length +\n dictionaries.pluginDictionaries.length >\n 0\n ? [\n `(Total: ${dictionariesLoadedTime - configurationWrittenTime}ms`,\n dictionaries.localDictionaries.length > 0\n ? `- Local: ${dictionaries.time.localDictionaries}ms`\n : '',\n dictionaries.remoteDictionaries.length > 0\n ? `- Remote: ${dictionaries.time.remoteDictionaries}ms`\n : '',\n dictionaries.pluginDictionaries.length > 0\n ? `- Plugin: ${dictionaries.time.pluginDictionaries}ms`\n : '',\n `)`,\n ].join('')\n : `(${dictionariesLoadedTime - configurationWrittenTime}ms)`,\n ].join(''),\n ANSIColors.GREY_DARK\n ),\n ],\n {\n isVerbose: true,\n }\n );\n\n // Build local dictionaries\n const dictionariesOutput = await buildDictionary(\n [\n ...dictionaries.localDictionaries,\n ...dictionaries.remoteDictionaries,\n ...dictionaries.pluginDictionaries,\n ],\n configuration,\n format,\n false\n );\n\n // Write remote dictionaries\n // Used as cache for next fetch\n await writeRemoteDictionary(\n dictionaries.remoteDictionaries,\n configuration\n );\n\n const dictionariesPaths = Object.values(\n dictionariesOutput?.mergedDictionaries ?? {}\n ).map((dictionary) => dictionary.dictionaryPath);\n\n await createTypes(dictionariesPaths, configuration);\n\n await createDictionaryEntryPoint(configuration);\n\n const dictionariesBuiltTime = Date.now();\n\n appLogger([\n 'Dictionaries built',\n colorize(\n `(${dictionariesBuiltTime - preparationStartMs}ms)`,\n ANSIColors.GREY_DARK\n ),\n ]);\n\n await createModuleAugmentation(configuration);\n\n const moduleAugmentationBuiltTime = Date.now();\n\n appLogger(\n [\n 'Module augmentation built',\n colorize(\n `(${moduleAugmentationBuiltTime - dictionariesBuiltTime}ms)`,\n ANSIColors.GREY_DARK\n ),\n ],\n {\n isVerbose: true,\n }\n );\n\n // Plugin transformation\n // Allow plugins to post-process the final build output (e.g., write back ICU JSON)\n for await (const plugin of configuration.plugins ?? []) {\n const { unmergedDictionaries, mergedDictionaries } = dictionariesOutput;\n\n await plugin.afterBuild?.({\n dictionaries: {\n unmergedDictionaries,\n mergedDictionaries,\n },\n configuration,\n });\n }\n\n const preparationElapsedMs = Date.now() - preparationStartMs;\n appLogger(\n [`Done`, colorize(`${preparationElapsedMs}ms`, ANSIColors.GREEN)],\n {\n level: 'info',\n isVerbose: true,\n }\n );\n },\n {\n forceRun,\n onIsCached,\n cacheTimeoutMs,\n }\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;AA+BA,MAAM,mCAAmC;CACvC,OAAO;CACP,QAAQ,CAAC,OAAO,MAAM;CACtB,gBAAgB,MAAO,KAAK;CAC7B;AAED,MAAa,kBAAkB,OAC7B,eACA,YACG;CACH,MAAM,gDAAyB,cAAc;CAE7C,MAAM,mCACJ,cAAc,QAAQ,UACtB,yBACD;CAED,MAAM,gDAAyB,eAAe,CAAC,mBAAmB,CAAC;CACnE,MAAM,uBAAuB,MAAM,aAAa,KAAK;CACrD,MAAM,mBAAmB,QACvB,wBAAwB,yBAAyBA,uCAAY,QAC9D;CAED,MAAM,kBAAkB,MAAMC,+DAA8B,cAAc;CAE1E,MAAM,EAAE,OAAO,QAAQ,UAAU,YAAY,mBAAmB;EAC9D,GAAG;EACH,UAAU,CAAC,oBAAoB,CAAC;EAChC,GAAI,WAAW,EAAE;EAClB;AAGD,OAAMC,8BACJ,cACA,YAAY;AAIV,MAAI,SAAS,CAAC,iBACZ,OAAMC,sCAAe,cAAc;AAGrC,QAAM,aAAa,IAAIH,uCAAY,QAAQ;EAE3C,MAAM,qBAAqB,KAAK,KAAK;AAErC,YAAU,CACR,sDACS,KAAKA,uCAAY,QAAQ,IAAII,6BAAW,UAAU,CAC5D,CAAC;AAEF,QAAMC,oDAAmB,cAAc;EAEvC,MAAM,2BAA2B,KAAK,KAAK;AAE3C,YACE,CACE,yDAEE,IAAI,2BAA2B,mBAAmB,MAClDD,6BAAW,UACZ,CACF,EACD,EACE,WAAW,MACZ,CACF;EAID,MAAM,eAAe,MAAME,2DAFH,MAAMC,8CAAiB,cAAc,EAEV,cAAc;EAEjE,MAAM,yBAAyB,KAAK,KAAK;AAEzC,YACE,CACE,kDAEE,CACE,aAAa,mBAAmB,SAC9B,aAAa,mBAAmB,SAClC,IACI;GACE,WAAW,yBAAyB,yBAAyB;GAC7D,aAAa,kBAAkB,SAAS,IACpC,YAAY,aAAa,KAAK,kBAAkB,MAChD;GACJ,aAAa,mBAAmB,SAAS,IACrC,aAAa,aAAa,KAAK,mBAAmB,MAClD;GACJ,aAAa,mBAAmB,SAAS,IACrC,aAAa,aAAa,KAAK,mBAAmB,MAClD;GACJ;GACD,CAAC,KAAK,GAAG,GACV,IAAI,yBAAyB,yBAAyB,KAC3D,CAAC,KAAK,GAAG,EACVH,6BAAW,UACZ,CACF,EACD,EACE,WAAW,MACZ,CACF;EAGD,MAAM,qBAAqB,MAAMI,wEAC/B;GACE,GAAG,aAAa;GAChB,GAAG,aAAa;GAChB,GAAG,aAAa;GACjB,EACD,eACA,QACA,MACD;AAID,QAAMC,4EACJ,aAAa,oBACb,cACD;AAMD,QAAMC,0CAJoB,OAAO,OAC/B,oBAAoB,sBAAsB,EAAE,CAC7C,CAAC,KAAK,eAAe,WAAW,eAAe,EAEX,cAAc;AAEnD,QAAMC,yFAA2B,cAAc;EAE/C,MAAM,wBAAwB,KAAK,KAAK;AAExC,YAAU,CACR,sDAEE,IAAI,wBAAwB,mBAAmB,MAC/CP,6BAAW,UACZ,CACF,CAAC;AAEF,QAAMQ,qEAAyB,cAAc;AAI7C,YACE,CACE,6DAEE,IAN8B,KAAK,KAAK,GAMN,sBAAsB,MACxDR,6BAAW,UACZ,CACF,EACD,EACE,WAAW,MACZ,CACF;AAID,aAAW,MAAM,UAAU,cAAc,WAAW,EAAE,EAAE;GACtD,MAAM,EAAE,sBAAsB,uBAAuB;AAErD,SAAM,OAAO,aAAa;IACxB,cAAc;KACZ;KACA;KACD;IACD;IACD,CAAC;;AAIJ,YACE,CAAC,wCAAiB,GAFS,KAAK,KAAK,GAAG,mBAEE,KAAKA,6BAAW,MAAM,CAAC,EACjE;GACE,OAAO;GACP,WAAW;GACZ,CACF;IAEH;EACE;EACA;EACA;EACD,CACF"}
1
+ {"version":3,"file":"prepareIntlayer.cjs","names":["packageJson","isCachedConfigurationUpToDate","listDictionariesWithStats","runOnce","cleanOutputDir","ANSIColors","writeConfiguration","loadDictionaries","buildDictionary","writeRemoteDictionary","createTypes","createDictionaryEntryPoint","createModuleAugmentation"],"sources":["../../src/prepareIntlayer.ts"],"sourcesContent":["import { stat } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport {\n ANSIColors,\n cacheDisk,\n // checkVersionsConsistency,\n colorize,\n getAppLogger,\n} from '@intlayer/config';\nimport packageJson from '@intlayer/config/package.json' with { type: 'json' };\nimport type { IntlayerConfig } from '@intlayer/types';\nimport { buildDictionary } from './buildIntlayerDictionary/buildIntlayerDictionary';\nimport { writeRemoteDictionary } from './buildIntlayerDictionary/writeRemoteDictionary';\nimport { cleanOutputDir } from './cleanOutputDir';\nimport { createDictionaryEntryPoint } from './createDictionaryEntryPoint/createDictionaryEntryPoint';\nimport { createModuleAugmentation, createTypes } from './createType/index';\nimport { listDictionariesWithStats } from './listDictionariesPath';\nimport { loadDictionaries } from './loadDictionaries/loadDictionaries';\nimport { runOnce } from './utils/runOnce';\nimport {\n isCachedConfigurationUpToDate,\n writeConfiguration,\n} from './writeConfiguration';\n\ntype PrepareIntlayerOptions = {\n clean?: boolean;\n format?: ('cjs' | 'esm')[];\n forceRun?: boolean;\n cacheTimeoutMs?: number;\n onIsCached?: () => void | Promise<void>;\n};\n\nconst DEFAULT_PREPARE_INTLAYER_OPTIONS = {\n clean: false,\n format: ['cjs', 'esm'],\n cacheTimeoutMs: 1000 * 60 * 60, // 1 hour\n} satisfies PrepareIntlayerOptions;\n\nexport const prepareIntlayer = async (\n configuration: IntlayerConfig,\n options?: PrepareIntlayerOptions\n) => {\n const appLogger = getAppLogger(configuration);\n\n const sentinelPath = join(\n configuration.content.cacheDir,\n 'intlayer-prepared.lock'\n );\n // Clean output dir if the intlayer version has changed\n const versionCache = cacheDisk(configuration, ['intlayer-version']);\n const intlayerCacheVersion = await versionCache.get();\n const isCorrectVersion = Boolean(\n intlayerCacheVersion && intlayerCacheVersion === packageJson.version\n );\n\n const isConfigSimilar = await isCachedConfigurationUpToDate(configuration);\n\n // Check if any dictionary has been changed to force a new rebuild\n const dictionariesWithStats = await listDictionariesWithStats(configuration);\n let isDictionaryChanged = false;\n try {\n // Try catch as sentinel file may not exist yet\n const sentinelStats = await stat(sentinelPath);\n isDictionaryChanged = dictionariesWithStats.some(\n (dictionary) =>\n dictionary.stats.mtime.getTime() > sentinelStats.mtime.getTime()\n );\n } catch {}\n\n const { clean, format, forceRun, onIsCached, cacheTimeoutMs } = {\n ...DEFAULT_PREPARE_INTLAYER_OPTIONS,\n forceRun: !isCorrectVersion || !isConfigSimilar || isDictionaryChanged,\n ...(options ?? {}),\n };\n\n // Skip preparation if it has already been done recently\n await runOnce(\n sentinelPath,\n async () => {\n // comment because of issue with next and webpack\n // await checkVersionsConsistency(configuration);\n\n if (clean || !isCorrectVersion) {\n await cleanOutputDir(configuration);\n }\n\n await versionCache.set(packageJson.version);\n\n const preparationStartMs = Date.now();\n\n appLogger([\n 'Preparing Intlayer',\n colorize(`(v${packageJson.version})`, ANSIColors.GREY_DARK),\n ]);\n\n await writeConfiguration(configuration);\n\n const configurationWrittenTime = Date.now();\n\n appLogger(\n [\n 'Configuration written',\n colorize(\n `(${configurationWrittenTime - preparationStartMs}ms)`,\n ANSIColors.GREY_DARK\n ),\n ],\n {\n isVerbose: true,\n }\n );\n\n const contentDeclarationPaths = dictionariesWithStats.map(\n (dictionary) => dictionary.path\n );\n\n const dictionaries = await loadDictionaries(\n contentDeclarationPaths,\n configuration\n );\n\n const dictionariesLoadedTime = Date.now();\n\n appLogger(\n [\n 'Content loaded',\n colorize(\n [\n dictionaries.remoteDictionaries.length +\n dictionaries.pluginDictionaries.length >\n 0\n ? [\n `(Total: ${dictionariesLoadedTime - configurationWrittenTime}ms`,\n dictionaries.localDictionaries.length > 0\n ? `- Local: ${dictionaries.time.localDictionaries}ms`\n : '',\n dictionaries.remoteDictionaries.length > 0\n ? `- Remote: ${dictionaries.time.remoteDictionaries}ms`\n : '',\n dictionaries.pluginDictionaries.length > 0\n ? `- Plugin: ${dictionaries.time.pluginDictionaries}ms`\n : '',\n `)`,\n ].join('')\n : `(${dictionariesLoadedTime - configurationWrittenTime}ms)`,\n ].join(''),\n ANSIColors.GREY_DARK\n ),\n ],\n {\n isVerbose: true,\n }\n );\n\n // Build local dictionaries\n const dictionariesOutput = await buildDictionary(\n [\n ...dictionaries.localDictionaries,\n ...dictionaries.remoteDictionaries,\n ...dictionaries.pluginDictionaries,\n ],\n configuration,\n format,\n false\n );\n\n // Write remote dictionaries\n // Used as cache for next fetch\n await writeRemoteDictionary(\n dictionaries.remoteDictionaries,\n configuration\n );\n\n const dictionariesPaths = Object.values(\n dictionariesOutput?.mergedDictionaries ?? {}\n ).map((dictionary) => dictionary.dictionaryPath);\n\n await createTypes(dictionariesPaths, configuration);\n\n await createDictionaryEntryPoint(configuration);\n\n const dictionariesBuiltTime = Date.now();\n\n appLogger([\n 'Dictionaries built',\n colorize(\n `(${dictionariesBuiltTime - preparationStartMs}ms)`,\n ANSIColors.GREY_DARK\n ),\n ]);\n\n await createModuleAugmentation(configuration);\n\n const moduleAugmentationBuiltTime = Date.now();\n\n appLogger(\n [\n 'Module augmentation built',\n colorize(\n `(${moduleAugmentationBuiltTime - dictionariesBuiltTime}ms)`,\n ANSIColors.GREY_DARK\n ),\n ],\n {\n isVerbose: true,\n }\n );\n\n // Plugin transformation\n // Allow plugins to post-process the final build output (e.g., write back ICU JSON)\n for await (const plugin of configuration.plugins ?? []) {\n const { unmergedDictionaries, mergedDictionaries } = dictionariesOutput;\n\n await plugin.afterBuild?.({\n dictionaries: {\n unmergedDictionaries,\n mergedDictionaries,\n },\n configuration,\n });\n }\n\n const preparationElapsedMs = Date.now() - preparationStartMs;\n appLogger(\n [`Done`, colorize(`${preparationElapsedMs}ms`, ANSIColors.GREEN)],\n {\n level: 'info',\n isVerbose: true,\n }\n );\n },\n {\n forceRun,\n onIsCached,\n cacheTimeoutMs,\n }\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
+ const require_writeContentDeclaration_detectExportedComponentName = require('../writeContentDeclaration/detectExportedComponentName.cjs');
3
+ let node_path = require("node:path");
4
+
5
+ //#region src/transformFiles/extractDictionaryKey.ts
6
+ const extractDictionaryKey = (filePath, fileText) => {
7
+ const componentName = require_writeContentDeclaration_detectExportedComponentName.detectExportedComponentName(fileText);
8
+ if (componentName) return componentName;
9
+ let baseName = (0, node_path.basename)(filePath, (0, node_path.extname)(filePath));
10
+ if (baseName === "index") baseName = (0, node_path.basename)((0, node_path.dirname)(filePath));
11
+ return baseName;
12
+ };
13
+
14
+ //#endregion
15
+ exports.extractDictionaryKey = extractDictionaryKey;
16
+ //# sourceMappingURL=extractDictionaryKey.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractDictionaryKey.cjs","names":["detectExportedComponentName"],"sources":["../../../src/transformFiles/extractDictionaryKey.ts"],"sourcesContent":["import { basename, dirname, extname } from 'node:path';\nimport { detectExportedComponentName } from '../writeContentDeclaration/detectExportedComponentName';\n\nexport const extractDictionaryKey = (\n filePath: string,\n fileText: string\n): string => {\n const componentName = detectExportedComponentName(fileText);\n if (componentName) {\n return componentName;\n }\n\n const ext = extname(filePath);\n let baseName = basename(filePath, ext);\n\n if (baseName === 'index') {\n baseName = basename(dirname(filePath));\n }\n\n return baseName;\n};\n"],"mappings":";;;;;AAGA,MAAa,wBACX,UACA,aACW;CACX,MAAM,gBAAgBA,wFAA4B,SAAS;AAC3D,KAAI,cACF,QAAO;CAIT,IAAI,mCAAoB,iCADJ,SAAS,CACS;AAEtC,KAAI,aAAa,QACf,2DAA4B,SAAS,CAAC;AAGxC,QAAO"}
@@ -0,0 +1,6 @@
1
+ const require_transformFiles_extractDictionaryKey = require('./extractDictionaryKey.cjs');
2
+ const require_transformFiles_transformFiles = require('./transformFiles.cjs');
3
+
4
+ exports.extractDictionaryKey = require_transformFiles_extractDictionaryKey.extractDictionaryKey;
5
+ exports.extractIntlayer = require_transformFiles_transformFiles.extractIntlayer;
6
+ exports.transformFiles = require_transformFiles_transformFiles.transformFiles;
@@ -0,0 +1,218 @@
1
+ const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
+ const require_transformFiles_extractDictionaryKey = require('./extractDictionaryKey.cjs');
3
+ const require_writeContentDeclaration_detectFormatCommand = require('../writeContentDeclaration/detectFormatCommand.cjs');
4
+ const require_writeContentDeclaration_writeContentDeclaration = require('../writeContentDeclaration/writeContentDeclaration.cjs');
5
+ let node_fs_promises = require("node:fs/promises");
6
+ node_fs_promises = require_rolldown_runtime.__toESM(node_fs_promises);
7
+ let __intlayer_config = require("@intlayer/config");
8
+ let node_path = require("node:path");
9
+ let node_child_process = require("node:child_process");
10
+ let ts_morph = require("ts-morph");
11
+
12
+ //#region src/transformFiles/transformFiles.ts
13
+ const ATTRIBUTES_TO_EXTRACT = [
14
+ "title",
15
+ "placeholder",
16
+ "alt",
17
+ "aria-label",
18
+ "label"
19
+ ];
20
+ const shouldExtract = (text) => {
21
+ const trimmed = text.trim();
22
+ if (!trimmed) return false;
23
+ if (!trimmed.includes(" ")) return false;
24
+ if (!/^[A-Z]/.test(trimmed)) return false;
25
+ if (trimmed.startsWith("{") || trimmed.startsWith("v-")) return false;
26
+ return true;
27
+ };
28
+ const generateKey = (text, existingKeys) => {
29
+ let key = text.replace(/\s+/g, " ").replace(/_+/g, " ").replace(/-+/g, " ").replace(/[^a-zA-Z0-9 ]/g, "").trim().split(" ").filter(Boolean).slice(0, 5).map((word, index) => index === 0 ? word.toLowerCase() : word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join("");
30
+ if (!key) key = "content";
31
+ if (existingKeys.has(key)) {
32
+ let i = 1;
33
+ while (existingKeys.has(`${key}${i}`)) i++;
34
+ key = `${key}${i}`;
35
+ }
36
+ return key;
37
+ };
38
+ const writeContentHelper = async (extractedContent, componentKey, filePath, configuration, outputDir) => {
39
+ const { defaultLocale } = configuration.internationalization;
40
+ const { baseDir } = configuration.content;
41
+ const dirName = outputDir ? (0, node_path.resolve)(outputDir) : (0, node_path.dirname)(filePath);
42
+ const baseName = (0, node_path.basename)(filePath, (0, node_path.extname)(filePath));
43
+ const contentFilePath = (0, node_path.join)(dirName, `${baseName.charAt(0).toLowerCase() + baseName.slice(1)}.content.ts`);
44
+ await require_writeContentDeclaration_writeContentDeclaration.writeContentDeclaration({
45
+ key: componentKey,
46
+ content: extractedContent,
47
+ locale: defaultLocale,
48
+ filePath: (0, node_path.relative)(baseDir, contentFilePath)
49
+ }, configuration, { newDictionariesPath: (0, node_path.relative)(baseDir, dirName) });
50
+ return contentFilePath;
51
+ };
52
+ const extractTsContent = (sourceFile, existingKeys) => {
53
+ const extractedContent = {};
54
+ const replacements = [];
55
+ sourceFile.forEachDescendant((node) => {
56
+ if (ts_morph.Node.isJsxText(node)) {
57
+ const text = node.getText();
58
+ if (shouldExtract(text)) {
59
+ const key = generateKey(text, existingKeys);
60
+ existingKeys.add(key);
61
+ extractedContent[key] = text.replace(/\s+/g, " ").trim();
62
+ replacements.push({
63
+ node,
64
+ key,
65
+ type: "jsx-text"
66
+ });
67
+ }
68
+ } else if (ts_morph.Node.isJsxAttribute(node)) {
69
+ const name = node.getNameNode().getText();
70
+ if (ATTRIBUTES_TO_EXTRACT.includes(name)) {
71
+ const initializer = node.getInitializer();
72
+ if (ts_morph.Node.isStringLiteral(initializer)) {
73
+ const text = initializer.getLiteralValue();
74
+ if (shouldExtract(text)) {
75
+ const key = generateKey(text, existingKeys);
76
+ existingKeys.add(key);
77
+ extractedContent[key] = text.trim();
78
+ replacements.push({
79
+ node,
80
+ key,
81
+ type: "jsx-attribute"
82
+ });
83
+ }
84
+ }
85
+ }
86
+ } else if (ts_morph.Node.isStringLiteral(node)) {
87
+ const text = node.getLiteralValue();
88
+ if (shouldExtract(text)) {
89
+ const parent = node.getParent();
90
+ if (parent?.getKindName() === "ImportDeclaration" || parent?.getKindName() === "ImportSpecifier" || parent?.getKindName() === "ModuleSpecifier") return;
91
+ if (ts_morph.Node.isJsxAttribute(parent)) return;
92
+ if (ts_morph.Node.isCallExpression(parent)) {
93
+ if (parent.getExpression().getText().includes("console.log")) return;
94
+ }
95
+ if (ts_morph.Node.isPropertyAssignment(parent)) {
96
+ if (parent.getNameNode() === node) return;
97
+ }
98
+ const key = generateKey(text, existingKeys);
99
+ existingKeys.add(key);
100
+ extractedContent[key] = text.trim();
101
+ replacements.push({
102
+ node,
103
+ key,
104
+ type: "string-literal"
105
+ });
106
+ }
107
+ }
108
+ });
109
+ return {
110
+ extractedContent,
111
+ replacements
112
+ };
113
+ };
114
+ const processReactFile = async (filePath, componentKey, packageName, project, save = true) => {
115
+ let sourceFile;
116
+ try {
117
+ sourceFile = project.addSourceFileAtPath(filePath);
118
+ } catch {
119
+ sourceFile = project.getSourceFileOrThrow(filePath);
120
+ }
121
+ const { extractedContent, replacements } = extractTsContent(sourceFile, /* @__PURE__ */ new Set());
122
+ if (Object.keys(extractedContent).length === 0) return null;
123
+ for (const { node, key, type } of replacements) if (type === "jsx-text" && ts_morph.Node.isJsxText(node)) node.replaceWithText(`{content.${key}}`);
124
+ else if (type === "jsx-attribute" && ts_morph.Node.isJsxAttribute(node)) node.setInitializer(`{content.${key}.value}`);
125
+ else if (type === "string-literal" && ts_morph.Node.isStringLiteral(node)) node.replaceWithText(`content.${key}.value`);
126
+ const importDecl = sourceFile.getImportDeclaration((d) => d.getModuleSpecifierValue() === packageName);
127
+ if (!importDecl) sourceFile.addImportDeclaration({
128
+ namedImports: ["useIntlayer"],
129
+ moduleSpecifier: packageName
130
+ });
131
+ else if (!importDecl.getNamedImports().some((n) => n.getName() === "useIntlayer")) importDecl.addNamedImport("useIntlayer");
132
+ sourceFile.getFunctions().forEach((f) => {
133
+ f.getBody()?.asKind(ts_morph.SyntaxKind.Block)?.insertStatements(0, `const content = useIntlayer("${componentKey}");`);
134
+ });
135
+ sourceFile.getVariableDeclarations().forEach((v) => {
136
+ const init = v.getInitializer();
137
+ if (ts_morph.Node.isArrowFunction(init) || ts_morph.Node.isFunctionExpression(init)) {
138
+ const body = init.getBody();
139
+ if (ts_morph.Node.isBlock(body)) {
140
+ if (body.getText().includes("return") || body.getText().includes("use")) body.insertStatements(0, `const content = useIntlayer("${componentKey}");`);
141
+ }
142
+ }
143
+ });
144
+ if (save) await sourceFile.save();
145
+ return extractedContent;
146
+ };
147
+ const extractIntlayer = async (filePath, packageName, options, project) => {
148
+ const saveComponent = !options?.declarationOnly;
149
+ const writeContent = !options?.codeOnly;
150
+ const configuration = (0, __intlayer_config.getConfiguration)(options?.configOptions);
151
+ const appLogger = (0, __intlayer_config.getAppLogger)(configuration);
152
+ const { baseDir } = configuration.content;
153
+ const _project = project || new ts_morph.Project({ skipAddingFilesFromTsConfig: true });
154
+ const baseName = require_transformFiles_extractDictionaryKey.extractDictionaryKey(filePath, (await node_fs_promises.default.readFile(filePath)).toString());
155
+ const componentKey = (0, __intlayer_config.camelCaseToKebabCase)(baseName);
156
+ const ext = (0, node_path.extname)(filePath);
157
+ let extractedContent = null;
158
+ if (ext === ".vue") try {
159
+ const { processVueFile } = await import("@intlayer/vue-transformer");
160
+ extractedContent = await processVueFile(filePath, componentKey, packageName, {
161
+ generateKey,
162
+ shouldExtract,
163
+ extractTsContent
164
+ }, saveComponent);
165
+ } catch (error) {
166
+ if (error.code === "ERR_MODULE_NOT_FOUND" || error.message?.includes("Cannot find module")) throw new Error(`Please install ${(0, __intlayer_config.colorizePath)("@intlayer/vue-transformer", __intlayer_config.ANSIColors.YELLOW)} to process Vue files.`);
167
+ throw error;
168
+ }
169
+ else if (ext === ".svelte") try {
170
+ const { processSvelteFile } = await import("@intlayer/svelte-transformer");
171
+ extractedContent = await processSvelteFile(filePath, componentKey, packageName, {
172
+ generateKey,
173
+ shouldExtract,
174
+ extractTsContent
175
+ }, saveComponent);
176
+ } catch (error) {
177
+ if (error.code === "ERR_MODULE_NOT_FOUND" || error.message?.includes("Cannot find module")) throw new Error(`Please install ${(0, __intlayer_config.colorizePath)("@intlayer/svelte-transformer", __intlayer_config.ANSIColors.YELLOW)} to process Svelte files.`);
178
+ throw error;
179
+ }
180
+ else if ([
181
+ ".tsx",
182
+ ".jsx",
183
+ ".ts",
184
+ ".js"
185
+ ].includes(ext)) extractedContent = await processReactFile(filePath, componentKey, packageName, _project, saveComponent);
186
+ if (!extractedContent) {
187
+ appLogger(`No extractable text found in ${baseName}`);
188
+ return;
189
+ }
190
+ if (writeContent) {
191
+ const contentFilePath = await writeContentHelper(extractedContent, componentKey, filePath, configuration, options?.outputDir);
192
+ appLogger(`Created content file: ${(0, __intlayer_config.colorizePath)((0, node_path.relative)(configuration.content.baseDir, contentFilePath))}`);
193
+ }
194
+ if (saveComponent) {
195
+ try {
196
+ const formatCommand = require_writeContentDeclaration_detectFormatCommand.detectFormatCommand(configuration);
197
+ if (formatCommand) (0, node_child_process.execSync)(formatCommand.replace("{{file}}", filePath), {
198
+ stdio: "ignore",
199
+ cwd: baseDir
200
+ });
201
+ } catch {}
202
+ appLogger(`Updated component: ${(0, __intlayer_config.colorizePath)((0, node_path.relative)(baseDir, filePath))}`);
203
+ }
204
+ };
205
+ const transformFiles = async (filePaths, packageName, options) => {
206
+ const appLogger = (0, __intlayer_config.getAppLogger)((0, __intlayer_config.getConfiguration)(options?.configOptions));
207
+ const project = new ts_morph.Project({ skipAddingFilesFromTsConfig: true });
208
+ for (const filePath of filePaths) try {
209
+ await extractIntlayer(filePath, packageName, options, project);
210
+ } catch (error) {
211
+ appLogger(`Failed to transform ${filePath}: ${error.message}`);
212
+ }
213
+ };
214
+
215
+ //#endregion
216
+ exports.extractIntlayer = extractIntlayer;
217
+ exports.transformFiles = transformFiles;
218
+ //# sourceMappingURL=transformFiles.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformFiles.cjs","names":["writeContentDeclaration","extractedContent: Record<string, string>","replacements: TsReplacement[]","Node","sourceFile: SourceFile","SyntaxKind","Project","extractDictionaryKey","fs","extractedContent: Record<string, string> | null","error: any","ANSIColors","detectFormatCommand"],"sources":["../../../src/transformFiles/transformFiles.ts"],"sourcesContent":["import { execSync } from 'node:child_process';\nimport fs from 'node:fs/promises';\nimport { basename, dirname, extname, join, relative, resolve } from 'node:path';\nimport {\n ANSIColors,\n camelCaseToKebabCase,\n colorizePath,\n type GetConfigurationOptions,\n getAppLogger,\n getConfiguration,\n} from '@intlayer/config';\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// 1. Shared Utilities\n// ==========================================\n\nconst ATTRIBUTES_TO_EXTRACT = [\n 'title',\n 'placeholder',\n 'alt',\n 'aria-label',\n 'label',\n];\n\nconst 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\nconst generateKey = (text: string, existingKeys: Set<string>): string => {\n const maxWords = 5;\n let key = text\n .replace(/\\s+/g, ' ')\n .replace(/_+/g, ' ')\n .replace(/-+/g, ' ')\n .replace(/[^a-zA-Z0-9 ]/g, '')\n .trim()\n .split(' ')\n .filter(Boolean)\n .slice(0, maxWords)\n .map((word, index) =>\n index === 0\n ? word.toLowerCase()\n : word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n )\n .join('');\n\n if (!key) key = 'content';\n if (existingKeys.has(key)) {\n let i = 1;\n while (existingKeys.has(`${key}${i}`)) i++;\n key = `${key}${i}`;\n }\n return key;\n};\n\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 } = configuration.content;\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(dirName, `${contentBaseName}.content.ts`);\n const relativeContentFilePath = relative(baseDir, contentFilePath);\n\n const dictionary: Dictionary = {\n key: componentKey,\n content: extractedContent,\n locale: defaultLocale,\n filePath: relativeContentFilePath,\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// 2. React (TS-Morph) Strategy\n// ==========================================\n\nconst processReactFile = async (\n filePath: string,\n componentKey: string,\n packageName: string,\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 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 if (type === 'jsx-text' && Node.isJsxText(node)) {\n node.replaceWithText(`{content.${key}}`);\n } else if (type === 'jsx-attribute' && Node.isJsxAttribute(node)) {\n node.setInitializer(`{content.${key}.value}`);\n } else if (type === 'string-literal' && Node.isStringLiteral(node)) {\n // For React/JS variables, we usually want the value\n node.replaceWithText(`content.${key}.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(\n '@intlayer/vue-transformer'\n )) as any;\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 processReactFile(\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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"}
@@ -3,21 +3,23 @@ let __intlayer_config = require("@intlayer/config");
3
3
 
4
4
  //#region src/writeContentDeclaration/detectFormatCommand.ts
5
5
  const detectFormatCommand = (configuration) => {
6
- const { formatCommand } = configuration.content;
7
- const projectRequire = (0, __intlayer_config.getProjectRequire)();
8
- if (formatCommand) return formatCommand;
9
6
  try {
10
- projectRequire.resolve("prettier");
11
- return "prettier --write \"{{file}}\" --log-level silent";
12
- } catch (_error) {}
13
- try {
14
- projectRequire.resolve("biome");
15
- return "biome format \"{{file}}\" --write --log-level none";
16
- } catch (_error) {}
17
- try {
18
- projectRequire.resolve("eslint");
19
- return "eslint --fix \"{{file}}\" --quiet";
20
- } catch (_error) {}
7
+ const { formatCommand, baseDir } = configuration.content;
8
+ const projectRequire = (0, __intlayer_config.getProjectRequire)(baseDir);
9
+ if (formatCommand) return formatCommand;
10
+ try {
11
+ projectRequire.resolve("prettier");
12
+ return "prettier --write \"{{file}}\" --log-level silent";
13
+ } catch (_error) {}
14
+ try {
15
+ projectRequire.resolve("biome");
16
+ return "biome format \"{{file}}\" --write --log-level none";
17
+ } catch (_error) {}
18
+ try {
19
+ projectRequire.resolve("eslint");
20
+ return "eslint --fix \"{{file}}\" --quiet";
21
+ } catch (_error) {}
22
+ } catch {}
21
23
  };
22
24
 
23
25
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"detectFormatCommand.cjs","names":[],"sources":["../../../src/writeContentDeclaration/detectFormatCommand.ts"],"sourcesContent":["import { getProjectRequire } from '@intlayer/config';\nimport type { IntlayerConfig } from '@intlayer/types';\n\nexport const detectFormatCommand = (configuration: IntlayerConfig) => {\n const { formatCommand } = configuration.content;\n const projectRequire = getProjectRequire();\n\n if (formatCommand) {\n return formatCommand;\n }\n\n // Try Prettier\n try {\n projectRequire.resolve('prettier');\n\n return 'prettier --write \"{{file}}\" --log-level silent';\n } catch (_error) {\n // Prettier not found, continue to next option\n }\n\n // Try Biome\n try {\n projectRequire.resolve('biome');\n\n return 'biome format \"{{file}}\" --write --log-level none';\n } catch (_error) {\n // Biome not found, continue to next option\n }\n\n // Try ESLint\n try {\n projectRequire.resolve('eslint');\n\n return 'eslint --fix \"{{file}}\" --quiet';\n } catch (_error) {\n // ESLint not found, no formatter available\n }\n\n // No formatter found\n return undefined;\n};\n"],"mappings":";;;;AAGA,MAAa,uBAAuB,kBAAkC;CACpE,MAAM,EAAE,kBAAkB,cAAc;CACxC,MAAM,2DAAoC;AAE1C,KAAI,cACF,QAAO;AAIT,KAAI;AACF,iBAAe,QAAQ,WAAW;AAElC,SAAO;UACA,QAAQ;AAKjB,KAAI;AACF,iBAAe,QAAQ,QAAQ;AAE/B,SAAO;UACA,QAAQ;AAKjB,KAAI;AACF,iBAAe,QAAQ,SAAS;AAEhC,SAAO;UACA,QAAQ"}
1
+ {"version":3,"file":"detectFormatCommand.cjs","names":[],"sources":["../../../src/writeContentDeclaration/detectFormatCommand.ts"],"sourcesContent":["import { getProjectRequire } from '@intlayer/config';\nimport type { IntlayerConfig } from '@intlayer/types';\n\nexport const detectFormatCommand = (configuration: IntlayerConfig) => {\n try {\n const { formatCommand, baseDir } = configuration.content;\n const projectRequire = getProjectRequire(baseDir);\n\n if (formatCommand) {\n return formatCommand;\n }\n\n // Try Prettier\n try {\n projectRequire.resolve('prettier');\n\n return 'prettier --write \"{{file}}\" --log-level silent';\n } catch (_error) {\n // Prettier not found, continue to next option\n }\n\n // Try Biome\n try {\n projectRequire.resolve('biome');\n\n return 'biome format \"{{file}}\" --write --log-level none';\n } catch (_error) {\n // Biome not found, continue to next option\n }\n\n // Try ESLint\n try {\n projectRequire.resolve('eslint');\n\n return 'eslint --fix \"{{file}}\" --quiet';\n } catch (_error) {\n // ESLint not found, no formatter available\n }\n } catch {}\n\n // No formatter found\n return undefined;\n};\n"],"mappings":";;;;AAGA,MAAa,uBAAuB,kBAAkC;AACpE,KAAI;EACF,MAAM,EAAE,eAAe,YAAY,cAAc;EACjD,MAAM,0DAAmC,QAAQ;AAEjD,MAAI,cACF,QAAO;AAIT,MAAI;AACF,kBAAe,QAAQ,WAAW;AAElC,UAAO;WACA,QAAQ;AAKjB,MAAI;AACF,kBAAe,QAAQ,QAAQ;AAE/B,UAAO;WACA,QAAQ;AAKjB,MAAI;AACF,kBAAe,QAAQ,SAAS;AAEhC,UAAO;WACA,QAAQ;SAGX"}
@@ -1570,7 +1570,7 @@ const serializeMetadataValue = (value) => {
1570
1570
  * Updates a single property in the root object if the value has changed
1571
1571
  */
1572
1572
  const updateMetadataProperty = (rootObject, propertyName, value) => {
1573
- const property = rootObject.getProperty(propertyName);
1573
+ const property = rootObject.getProperty(propertyName) || rootObject.getProperty(`'${propertyName}'`) || rootObject.getProperty(`"${propertyName}"`);
1574
1574
  const serializedValue = serializeMetadataValue(value);
1575
1575
  if (property && ts_morph.Node.isPropertyAssignment(property)) {
1576
1576
  if (property.getInitializer()?.getText() !== serializedValue) {