@intlayer/engine 9.5.5 → 9.5.7

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 (131) hide show
  1. package/README.md +0 -1
  2. package/dist/cjs/_virtual/_utils_asset.cjs +1 -1
  3. package/dist/cjs/build.cjs +4 -4
  4. package/dist/cjs/buildIntlayerDictionary/writeDynamicDictionary.cjs +2 -2
  5. package/dist/cjs/buildIntlayerDictionary/writeFetchDictionary.cjs +3 -3
  6. package/dist/cjs/buildIntlayerDictionary/writeMergedDictionary.cjs +1 -1
  7. package/dist/cjs/buildIntlayerDictionary/writeNestedDictionary.cjs +3 -3
  8. package/dist/cjs/buildIntlayerDictionary/writeRemoteDictionary.cjs +2 -2
  9. package/dist/cjs/buildIntlayerDictionary/writeUnmergedDictionary.cjs +2 -2
  10. package/dist/cjs/cleanOutputDir.cjs +1 -1
  11. package/dist/cjs/cleanRemovedContentDeclaration.cjs +1 -1
  12. package/dist/cjs/cli.cjs +3 -3
  13. package/dist/cjs/createDictionaryEntryPoint/createDictionaryEntryPoint.cjs +1 -1
  14. package/dist/cjs/createDictionaryEntryPoint/getBuiltDictionariesPath.cjs +2 -2
  15. package/dist/cjs/createDictionaryEntryPoint/getBuiltDynamicDictionariesPath.cjs +2 -2
  16. package/dist/cjs/createDictionaryEntryPoint/getBuiltFetchDictionariesPath.cjs +2 -2
  17. package/dist/cjs/createDictionaryEntryPoint/getBuiltRemoteDictionariesPath.cjs +2 -2
  18. package/dist/cjs/createDictionaryEntryPoint/getBuiltUnmergedDictionariesPath.cjs +2 -2
  19. package/dist/cjs/createType/createModuleAugmentation.cjs +3 -3
  20. package/dist/cjs/createType/createType.cjs +1 -1
  21. package/dist/cjs/docReview/index.cjs +5 -5
  22. package/dist/cjs/docReview/pipeline.cjs +4 -4
  23. package/dist/cjs/fetchDistantDictionaries.cjs +1 -1
  24. package/dist/cjs/handleContentDeclarationFileChange.cjs +2 -2
  25. package/dist/cjs/handleUnlinkedContentDeclarationFile.cjs +1 -1
  26. package/dist/cjs/init/frameworkSetup/nextAppRouter/restructure.cjs +1 -1
  27. package/dist/cjs/init/frameworkSetup/tanstackStart/restructure.cjs +1 -1
  28. package/dist/cjs/init/utils/fileSystem.cjs +1 -1
  29. package/dist/cjs/init/utils/githubActions.cjs +1 -1
  30. package/dist/cjs/init/utils/packageManager.cjs +1 -1
  31. package/dist/cjs/initConfig/index.cjs +1 -1
  32. package/dist/cjs/installLSP.cjs +1 -1
  33. package/dist/cjs/installMCP/installMCP.cjs +1 -1
  34. package/dist/cjs/installSkills/index.cjs +1 -1
  35. package/dist/cjs/listDictionariesPath.cjs +1 -1
  36. package/dist/cjs/listGitFiles.cjs +1 -1
  37. package/dist/cjs/loadDictionaries/getIntlayerBundle.cjs +2 -2
  38. package/dist/cjs/loadDictionaries/index.cjs +1 -1
  39. package/dist/cjs/loadDictionaries/loadContentDeclaration.cjs +2 -2
  40. package/dist/cjs/loadDictionaries/loadDictionaries.cjs +1 -1
  41. package/dist/cjs/loadDictionaries/loadLocalDictionaries.cjs +1 -1
  42. package/dist/cjs/loadDictionaries/loadMarkdownContentDeclaration.cjs +1 -1
  43. package/dist/cjs/logConfigDetails.cjs +1 -1
  44. package/dist/cjs/prepareIntlayer.cjs +4 -4
  45. package/dist/cjs/scan/index.cjs +1 -1
  46. package/dist/cjs/scan/scanWebsite.cjs +1 -1
  47. package/dist/cjs/syncPluginKit/createFileAdapter.cjs +1 -1
  48. package/dist/cjs/syncPluginKit/index.cjs +1 -1
  49. package/dist/cjs/utils/buildComponentFilesList.cjs +1 -1
  50. package/dist/cjs/utils/contentWatcherLock.cjs +2 -2
  51. package/dist/cjs/utils/index.cjs +4 -4
  52. package/dist/cjs/utils/readDictionariesFromDisk.cjs +1 -1
  53. package/dist/cjs/utils/runOnce.cjs +67 -16
  54. package/dist/cjs/utils/runOnce.cjs.map +1 -1
  55. package/dist/cjs/utils/runParallel/pidTree.cjs +1 -1
  56. package/dist/cjs/utils/withFileLock.cjs +1 -1
  57. package/dist/cjs/watcher.cjs +6 -6
  58. package/dist/cjs/writeConfiguration/index.cjs +1 -1
  59. package/dist/cjs/writeContentDeclaration/processContentDeclarationContent.cjs +2 -2
  60. package/dist/cjs/writeContentDeclaration/transformJSFile.cjs +1 -1
  61. package/dist/cjs/writeContentDeclaration/writeContentDeclaration.cjs +4 -4
  62. package/dist/cjs/writeContentDeclaration/writeJSFile.cjs +3 -3
  63. package/dist/cjs/writeContentDeclaration/writeMarkdownFile.cjs +1 -1
  64. package/dist/cjs/writeContentDeclaration/writeYamlFile.cjs +1 -1
  65. package/dist/cjs/writeFileIfChanged.cjs +1 -1
  66. package/dist/esm/_virtual/_utils_asset.mjs +1 -1
  67. package/dist/esm/build.mjs +4 -4
  68. package/dist/esm/buildIntlayerDictionary/writeDynamicDictionary.mjs +2 -2
  69. package/dist/esm/buildIntlayerDictionary/writeFetchDictionary.mjs +3 -3
  70. package/dist/esm/buildIntlayerDictionary/writeMergedDictionary.mjs +1 -1
  71. package/dist/esm/buildIntlayerDictionary/writeNestedDictionary.mjs +3 -3
  72. package/dist/esm/buildIntlayerDictionary/writeRemoteDictionary.mjs +2 -2
  73. package/dist/esm/buildIntlayerDictionary/writeUnmergedDictionary.mjs +2 -2
  74. package/dist/esm/cleanOutputDir.mjs +1 -1
  75. package/dist/esm/cleanRemovedContentDeclaration.mjs +1 -1
  76. package/dist/esm/cli.mjs +3 -3
  77. package/dist/esm/createDictionaryEntryPoint/createDictionaryEntryPoint.mjs +1 -1
  78. package/dist/esm/createDictionaryEntryPoint/getBuiltDictionariesPath.mjs +2 -2
  79. package/dist/esm/createDictionaryEntryPoint/getBuiltDynamicDictionariesPath.mjs +2 -2
  80. package/dist/esm/createDictionaryEntryPoint/getBuiltFetchDictionariesPath.mjs +2 -2
  81. package/dist/esm/createDictionaryEntryPoint/getBuiltRemoteDictionariesPath.mjs +2 -2
  82. package/dist/esm/createDictionaryEntryPoint/getBuiltUnmergedDictionariesPath.mjs +2 -2
  83. package/dist/esm/createType/createModuleAugmentation.mjs +3 -3
  84. package/dist/esm/createType/createType.mjs +1 -1
  85. package/dist/esm/docReview/index.mjs +5 -5
  86. package/dist/esm/docReview/pipeline.mjs +4 -4
  87. package/dist/esm/fetchDistantDictionaries.mjs +1 -1
  88. package/dist/esm/handleContentDeclarationFileChange.mjs +2 -2
  89. package/dist/esm/handleUnlinkedContentDeclarationFile.mjs +1 -1
  90. package/dist/esm/init/frameworkSetup/nextAppRouter/restructure.mjs +1 -1
  91. package/dist/esm/init/frameworkSetup/tanstackStart/restructure.mjs +1 -1
  92. package/dist/esm/init/utils/fileSystem.mjs +1 -1
  93. package/dist/esm/init/utils/githubActions.mjs +1 -1
  94. package/dist/esm/init/utils/packageManager.mjs +1 -1
  95. package/dist/esm/initConfig/index.mjs +1 -1
  96. package/dist/esm/installLSP.mjs +1 -1
  97. package/dist/esm/installMCP/installMCP.mjs +1 -1
  98. package/dist/esm/installSkills/index.mjs +1 -1
  99. package/dist/esm/listDictionariesPath.mjs +1 -1
  100. package/dist/esm/listGitFiles.mjs +1 -1
  101. package/dist/esm/loadDictionaries/getIntlayerBundle.mjs +2 -2
  102. package/dist/esm/loadDictionaries/index.mjs +1 -1
  103. package/dist/esm/loadDictionaries/loadContentDeclaration.mjs +2 -2
  104. package/dist/esm/loadDictionaries/loadDictionaries.mjs +1 -1
  105. package/dist/esm/loadDictionaries/loadLocalDictionaries.mjs +1 -1
  106. package/dist/esm/loadDictionaries/loadMarkdownContentDeclaration.mjs +1 -1
  107. package/dist/esm/logConfigDetails.mjs +1 -1
  108. package/dist/esm/prepareIntlayer.mjs +4 -4
  109. package/dist/esm/scan/index.mjs +1 -1
  110. package/dist/esm/scan/scanWebsite.mjs +1 -1
  111. package/dist/esm/syncPluginKit/createFileAdapter.mjs +1 -1
  112. package/dist/esm/syncPluginKit/index.mjs +1 -1
  113. package/dist/esm/utils/buildComponentFilesList.mjs +1 -1
  114. package/dist/esm/utils/contentWatcherLock.mjs +2 -2
  115. package/dist/esm/utils/index.mjs +4 -4
  116. package/dist/esm/utils/readDictionariesFromDisk.mjs +1 -1
  117. package/dist/esm/utils/runOnce.mjs +68 -17
  118. package/dist/esm/utils/runOnce.mjs.map +1 -1
  119. package/dist/esm/utils/runParallel/pidTree.mjs +1 -1
  120. package/dist/esm/utils/withFileLock.mjs +1 -1
  121. package/dist/esm/watcher.mjs +6 -6
  122. package/dist/esm/writeConfiguration/index.mjs +1 -1
  123. package/dist/esm/writeContentDeclaration/processContentDeclarationContent.mjs +2 -2
  124. package/dist/esm/writeContentDeclaration/transformJSFile.mjs +1 -1
  125. package/dist/esm/writeContentDeclaration/writeContentDeclaration.mjs +4 -4
  126. package/dist/esm/writeContentDeclaration/writeJSFile.mjs +3 -3
  127. package/dist/esm/writeContentDeclaration/writeMarkdownFile.mjs +1 -1
  128. package/dist/esm/writeContentDeclaration/writeYamlFile.mjs +1 -1
  129. package/dist/esm/writeFileIfChanged.mjs +1 -1
  130. package/dist/types/utils/runOnce.d.ts.map +1 -1
  131. package/package.json +7 -7
@@ -1,10 +1,10 @@
1
1
  import { readDictionariesFromDisk } from "./utils/readDictionariesFromDisk.mjs";
2
2
  import { writeJsonIfChanged } from "./writeJsonIfChanged.mjs";
3
3
  import { createDictionaryEntryPoint } from "./createDictionaryEntryPoint/createDictionaryEntryPoint.mjs";
4
- import { readFile, rm } from "node:fs/promises";
5
4
  import { join, normalize, relative } from "node:path";
6
5
  import { colorizeKey, colorizePath, getAppLogger } from "@intlayer/config/logger";
7
6
  import fg from "fast-glob";
7
+ import { readFile, rm } from "node:fs/promises";
8
8
  import { normalizePath } from "@intlayer/config/client";
9
9
 
10
10
  //#region src/cleanRemovedContentDeclaration.ts
package/dist/esm/cli.mjs CHANGED
@@ -1,20 +1,20 @@
1
+ import { logConfigDetails } from "./logConfigDetails.mjs";
2
+ import { detectFormatCommand } from "./detectFormatCommand.mjs";
1
3
  import { listDictionaries, listDictionariesWithStats } from "./listDictionariesPath.mjs";
2
4
  import { prepareIntlayer } from "./prepareIntlayer.mjs";
3
5
  import { detectExportedComponentName } from "./writeContentDeclaration/detectExportedComponentName.mjs";
4
6
  import { transformJSFile } from "./writeContentDeclaration/transformJSFile.mjs";
5
- import { detectFormatCommand } from "./detectFormatCommand.mjs";
6
7
  import { getContentDeclarationFileTemplate } from "./getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.mjs";
7
8
  import { writeJSFile } from "./writeContentDeclaration/writeJSFile.mjs";
8
9
  import { writeContentDeclaration } from "./writeContentDeclaration/writeContentDeclaration.mjs";
9
- import { installLSP } from "./installLSP.mjs";
10
10
  import { getGitRootDir, listProjects } from "./listProjects.mjs";
11
11
  import { enableEditorInConfig, setupCmsCredentials, writeCmsCredentialsToEnv } from "./init/cms.mjs";
12
12
  import { COMPAT_I18N_LIBRARIES, detectCompatI18nLibraries, detectPackageManager, installPackages } from "./init/utils/packageManager.mjs";
13
13
  import { NEXT_INTLAYER_BABEL_CONFIG_CONTENT } from "./init/utils/nextCompilerBabel.mjs";
14
14
  import { getDefaultApplicationURL, initIntlayer } from "./init/index.mjs";
15
+ import { installLSP } from "./installLSP.mjs";
15
16
  import { PLATFORMS, PLATFORMS_METADATA, SKILLS, SKILLS_METADATA, getInitialSkills, installSkills } from "./installSkills/index.mjs";
16
17
  import { installMCP } from "./installMCP/installMCP.mjs";
17
18
  import { listGitFiles, listGitLines } from "./listGitFiles.mjs";
18
- import { logConfigDetails } from "./logConfigDetails.mjs";
19
19
 
20
20
  export { COMPAT_I18N_LIBRARIES, NEXT_INTLAYER_BABEL_CONFIG_CONTENT, PLATFORMS, PLATFORMS_METADATA, SKILLS, SKILLS_METADATA, detectCompatI18nLibraries, detectExportedComponentName, detectFormatCommand, detectPackageManager, enableEditorInConfig, getContentDeclarationFileTemplate, getDefaultApplicationURL, getGitRootDir, getInitialSkills, initIntlayer, installLSP, installMCP, installPackages, installSkills, listDictionaries, listDictionariesWithStats, listGitFiles, listGitLines, listProjects, logConfigDetails, prepareIntlayer, setupCmsCredentials, transformJSFile, writeCmsCredentialsToEnv, writeContentDeclaration, writeJSFile };
@@ -6,9 +6,9 @@ import { getBuiltDynamicDictionariesPath } from "./getBuiltDynamicDictionariesPa
6
6
  import { getBuiltFetchDictionariesPath } from "./getBuiltFetchDictionariesPath.mjs";
7
7
  import { getBuiltRemoteDictionariesPath } from "./getBuiltRemoteDictionariesPath.mjs";
8
8
  import { getBuiltUnmergedDictionariesPath } from "./getBuiltUnmergedDictionariesPath.mjs";
9
- import { mkdir } from "node:fs/promises";
10
9
  import { resolve } from "node:path";
11
10
  import { getConfiguration } from "@intlayer/config/node";
11
+ import { mkdir } from "node:fs/promises";
12
12
 
13
13
  //#region src/createDictionaryEntryPoint/createDictionaryEntryPoint.ts
14
14
  const writeDictionaryFiles = async (paths, fileName, importType, functionName, format, configuration = getConfiguration()) => {
@@ -1,8 +1,8 @@
1
- import { existsSync } from "node:fs";
2
- import { mkdir } from "node:fs/promises";
3
1
  import { basename } from "node:path";
4
2
  import { normalizePath } from "@intlayer/config/utils";
5
3
  import fg from "fast-glob";
4
+ import { existsSync } from "node:fs";
5
+ import { mkdir } from "node:fs/promises";
6
6
 
7
7
  //#region src/createDictionaryEntryPoint/getBuiltDictionariesPath.ts
8
8
  /**
@@ -1,8 +1,8 @@
1
- import { existsSync } from "node:fs";
2
- import { mkdir } from "node:fs/promises";
3
1
  import { basename } from "node:path";
4
2
  import { normalizePath } from "@intlayer/config/utils";
5
3
  import fg from "fast-glob";
4
+ import { existsSync } from "node:fs";
5
+ import { mkdir } from "node:fs/promises";
6
6
 
7
7
  //#region src/createDictionaryEntryPoint/getBuiltDynamicDictionariesPath.ts
8
8
  /**
@@ -1,8 +1,8 @@
1
- import { existsSync } from "node:fs";
2
- import { mkdir } from "node:fs/promises";
3
1
  import { basename } from "node:path";
4
2
  import { normalizePath } from "@intlayer/config/utils";
5
3
  import fg from "fast-glob";
4
+ import { existsSync } from "node:fs";
5
+ import { mkdir } from "node:fs/promises";
6
6
 
7
7
  //#region src/createDictionaryEntryPoint/getBuiltFetchDictionariesPath.ts
8
8
  /**
@@ -1,8 +1,8 @@
1
- import { existsSync } from "node:fs";
2
- import { mkdir } from "node:fs/promises";
3
1
  import { basename } from "node:path";
4
2
  import { normalizePath } from "@intlayer/config/utils";
5
3
  import fg from "fast-glob";
4
+ import { existsSync } from "node:fs";
5
+ import { mkdir } from "node:fs/promises";
6
6
 
7
7
  //#region src/createDictionaryEntryPoint/getBuiltRemoteDictionariesPath.ts
8
8
  /**
@@ -1,8 +1,8 @@
1
- import { existsSync } from "node:fs";
2
- import { mkdir } from "node:fs/promises";
3
1
  import { basename } from "node:path";
4
2
  import { normalizePath } from "@intlayer/config/utils";
5
3
  import fg from "fast-glob";
4
+ import { existsSync } from "node:fs";
5
+ import { mkdir } from "node:fs/promises";
6
6
 
7
7
  //#region src/createDictionaryEntryPoint/getBuiltUnmergedDictionariesPath.ts
8
8
  /**
@@ -1,10 +1,10 @@
1
- import { writeFileIfChanged } from "../writeFileIfChanged.mjs";
2
1
  import { getPathHash } from "../utils/getPathHash.mjs";
3
- import { mkdir } from "node:fs/promises";
2
+ import { writeFileIfChanged } from "../writeFileIfChanged.mjs";
4
3
  import { basename, extname, join, relative } from "node:path";
5
4
  import { kebabCaseToCamelCase, normalizePath } from "@intlayer/config/utils";
6
- import { getDomainOrigin, getRewriteRules, isLocaleExclusiveOnDomain } from "@intlayer/core/localization";
7
5
  import fg from "fast-glob";
6
+ import { mkdir } from "node:fs/promises";
7
+ import { getDomainOrigin, getRewriteRules, isLocaleExclusiveOnDomain } from "@intlayer/core/localization";
8
8
 
9
9
  //#region src/createType/createModuleAugmentation.ts
10
10
  const getTypeName = (key) => `${kebabCaseToCamelCase(key)}Content`;
@@ -1,7 +1,7 @@
1
1
  import { parallelize } from "../utils/parallelize.mjs";
2
2
  import { writeFileIfChanged } from "../writeFileIfChanged.mjs";
3
- import { mkdir } from "node:fs/promises";
4
3
  import { resolve } from "node:path";
4
+ import { mkdir } from "node:fs/promises";
5
5
 
6
6
  //#region src/createType/createType.ts
7
7
  const generateTypeScriptType = (dictionary) => {
@@ -1,12 +1,12 @@
1
- import { mapChangedLinesToBlocks } from "./mapChangedLinesToBlocks.mjs";
1
+ import { normalizeBlock } from "./normalizeBlock.mjs";
2
+ import { fingerprintBlock } from "./fingerprintBlock.mjs";
3
+ import { segmentDocument } from "./segmentDocument.mjs";
4
+ import { planAlignmentActions } from "./planActions.mjs";
2
5
  import { computeJaccardSimilarity, generateCharacterShingles } from "./computeSimilarity.mjs";
3
6
  import { alignBaseAndTargetBlocks } from "./alignBlocks.mjs";
4
- import { fingerprintBlock } from "./fingerprintBlock.mjs";
5
- import { normalizeBlock } from "./normalizeBlock.mjs";
7
+ import { mapChangedLinesToBlocks } from "./mapChangedLinesToBlocks.mjs";
6
8
  import { identifySegmentsToReview, mergeReviewedSegments } from "./rebuildDocument.mjs";
7
- import { segmentDocument } from "./segmentDocument.mjs";
8
9
  import { buildAlignmentPlan } from "./pipeline.mjs";
9
- import { planAlignmentActions } from "./planActions.mjs";
10
10
  import { buildReviewReport, formatReviewReport } from "./reviewReport.mjs";
11
11
 
12
12
  export { alignBaseAndTargetBlocks, buildAlignmentPlan, buildReviewReport, computeJaccardSimilarity, fingerprintBlock, formatReviewReport, generateCharacterShingles, identifySegmentsToReview, mapChangedLinesToBlocks, mergeReviewedSegments, normalizeBlock, planAlignmentActions, segmentDocument };
@@ -1,9 +1,9 @@
1
- import { mapChangedLinesToBlocks } from "./mapChangedLinesToBlocks.mjs";
2
- import { alignBaseAndTargetBlocks } from "./alignBlocks.mjs";
3
- import { fingerprintBlock } from "./fingerprintBlock.mjs";
4
1
  import { normalizeBlock } from "./normalizeBlock.mjs";
5
- import { identifySegmentsToReview, mergeReviewedSegments } from "./rebuildDocument.mjs";
2
+ import { fingerprintBlock } from "./fingerprintBlock.mjs";
6
3
  import { segmentDocument, segmentSections } from "./segmentDocument.mjs";
4
+ import { alignBaseAndTargetBlocks } from "./alignBlocks.mjs";
5
+ import { mapChangedLinesToBlocks } from "./mapChangedLinesToBlocks.mjs";
6
+ import { identifySegmentsToReview, mergeReviewedSegments } from "./rebuildDocument.mjs";
7
7
 
8
8
  //#region src/docReview/pipeline.ts
9
9
  /** Fingerprint a list of already-segmented blocks (context = neighbours). */
@@ -1,5 +1,5 @@
1
- import { parallelize } from "./utils/parallelize.mjs";
2
1
  import { chunkArray } from "./utils/chunkArray.mjs";
2
+ import { parallelize } from "./utils/parallelize.mjs";
3
3
  import { getAppLogger, x } from "@intlayer/config/logger";
4
4
  import { getConfiguration } from "@intlayer/config/node";
5
5
  import { retryManager } from "@intlayer/config/utils";
@@ -6,10 +6,10 @@ import { createModuleAugmentation } from "./createType/createModuleAugmentation.
6
6
  import { createTypes } from "./createType/createType.mjs";
7
7
  import { loadLocalDictionaries } from "./loadDictionaries/loadLocalDictionaries.mjs";
8
8
  import { cleanRemovedContentDeclaration } from "./cleanRemovedContentDeclaration.mjs";
9
- import { existsSync } from "node:fs";
10
- import { readFile, writeFile } from "node:fs/promises";
11
9
  import { join } from "node:path";
12
10
  import { getAppLogger } from "@intlayer/config/logger";
11
+ import { existsSync } from "node:fs";
12
+ import { readFile, writeFile } from "node:fs/promises";
13
13
 
14
14
  //#region src/handleContentDeclarationFileChange.ts
15
15
  const handleContentDeclarationFileChange = async (filePath, config) => {
@@ -3,8 +3,8 @@ import { buildDictionary } from "./buildIntlayerDictionary/buildIntlayerDictiona
3
3
  import { createModuleAugmentation } from "./createType/createModuleAugmentation.mjs";
4
4
  import { createTypes } from "./createType/createType.mjs";
5
5
  import { loadLocalDictionaries } from "./loadDictionaries/loadLocalDictionaries.mjs";
6
- import { cleanRemovedContentDeclaration } from "./cleanRemovedContentDeclaration.mjs";
7
6
  import { listDictionaries } from "./listDictionariesPath.mjs";
7
+ import { cleanRemovedContentDeclaration } from "./cleanRemovedContentDeclaration.mjs";
8
8
  import { normalize } from "node:path";
9
9
  import { getAppLogger } from "@intlayer/config/logger";
10
10
 
@@ -1,7 +1,7 @@
1
1
  import { babelTsParser } from "../../../utils/babelParser.mjs";
2
- import { mkdir, readFile, readdir, rename, writeFile } from "node:fs/promises";
3
2
  import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
4
3
  import fg from "fast-glob";
4
+ import { mkdir, readFile, readdir, rename, writeFile } from "node:fs/promises";
5
5
  import * as recast from "recast";
6
6
 
7
7
  //#region src/init/frameworkSetup/nextAppRouter/restructure.ts
@@ -1,7 +1,7 @@
1
1
  import { rewriteRelativeImports } from "../nextAppRouter/restructure.mjs";
2
- import { mkdir, readFile, readdir, rename, writeFile } from "node:fs/promises";
3
2
  import { join, relative } from "node:path";
4
3
  import fg from "fast-glob";
4
+ import { mkdir, readFile, readdir, rename, writeFile } from "node:fs/promises";
5
5
 
6
6
  //#region src/init/frameworkSetup/tanstackStart/restructure.ts
7
7
  /** Source file extensions whose relative imports must be rewritten after a move. */
@@ -1,7 +1,7 @@
1
- import { access, mkdir, readFile, writeFile } from "node:fs/promises";
2
1
  import { dirname, join, relative, resolve, sep } from "node:path";
3
2
  import { EXCLUDED_PATHS } from "@intlayer/config/defaultValues";
4
3
  import fg from "fast-glob";
4
+ import { access, mkdir, readFile, writeFile } from "node:fs/promises";
5
5
  import { ALL_LOCALES } from "@intlayer/types/allLocales";
6
6
 
7
7
  //#region src/init/utils/fileSystem.ts
@@ -1,7 +1,7 @@
1
1
  import { getGitRootDir, listProjects } from "../../listProjects.mjs";
2
2
  import { detectPackageManager } from "./packageManager.mjs";
3
- import { existsSync, readFileSync } from "node:fs";
4
3
  import { join, relative, resolve, sep } from "node:path";
4
+ import { existsSync, readFileSync } from "node:fs";
5
5
 
6
6
  //#region src/init/utils/githubActions.ts
7
7
  /**
@@ -1,6 +1,6 @@
1
- import { existsSync, readFileSync } from "node:fs";
2
1
  import { join } from "node:path";
3
2
  import { compareVersions } from "@intlayer/config/utils";
3
+ import { existsSync, readFileSync } from "node:fs";
4
4
  import { execSync } from "node:child_process";
5
5
 
6
6
  //#region src/init/utils/packageManager.ts
@@ -1,8 +1,8 @@
1
1
  import { readAsset } from "../_virtual/_utils_asset.mjs";
2
- import { writeFile } from "node:fs/promises";
3
2
  import { join, relative } from "node:path";
4
3
  import { colorizePath, logger, v } from "@intlayer/config/logger";
5
4
  import { searchConfigurationFile } from "@intlayer/config/node";
5
+ import { writeFile } from "node:fs/promises";
6
6
 
7
7
  //#region src/initConfig/index.ts
8
8
  const getTemplatePath = (format) => {
@@ -1,5 +1,5 @@
1
- import { promises } from "node:fs";
2
1
  import path from "node:path";
2
+ import { promises } from "node:fs";
3
3
 
4
4
  //#region src/installLSP.ts
5
5
  const VSCODE_DIR = ".vscode";
@@ -1,6 +1,6 @@
1
1
  import { PLATFORMS_METADATA } from "../installSkills/index.mjs";
2
- import { promises } from "node:fs";
3
2
  import path from "node:path";
3
+ import { promises } from "node:fs";
4
4
  import os from "node:os";
5
5
 
6
6
  //#region src/installMCP/installMCP.ts
@@ -1,8 +1,8 @@
1
1
  import { readAsset } from "../_virtual/_utils_asset.mjs";
2
- import { promises } from "node:fs";
3
2
  import path from "node:path";
4
3
  import { v } from "@intlayer/config/logger";
5
4
  import { getMarkdownMetadata } from "@intlayer/core/markdown";
5
+ import { promises } from "node:fs";
6
6
 
7
7
  //#region src/installSkills/index.ts
8
8
  /**
@@ -1,6 +1,6 @@
1
- import { stat } from "node:fs/promises";
2
1
  import { normalizePath } from "@intlayer/config/utils";
3
2
  import fg from "fast-glob";
3
+ import { stat } from "node:fs/promises";
4
4
 
5
5
  //#region src/listDictionariesPath.ts
6
6
  /**
@@ -1,6 +1,6 @@
1
- import { readFileSync } from "node:fs";
2
1
  import { join } from "node:path";
3
2
  import { getAppLogger } from "@intlayer/config/logger";
3
+ import { readFileSync } from "node:fs";
4
4
  import { log } from "@intlayer/config/built";
5
5
  import simpleGit from "simple-git";
6
6
 
@@ -1,7 +1,7 @@
1
- import { readFile } from "node:fs/promises";
2
1
  import { join } from "node:path";
3
- import { bundleFile } from "@intlayer/config/file";
4
2
  import { getProjectRequire } from "@intlayer/config/utils";
3
+ import { readFile } from "node:fs/promises";
4
+ import { bundleFile } from "@intlayer/config/file";
5
5
  import { builtinModules, createRequire } from "node:module";
6
6
 
7
7
  //#region src/loadDictionaries/getIntlayerBundle.ts
@@ -1,6 +1,6 @@
1
1
  import { ensureIntlayerBundle, formatLocalDictionaries, loadContentDeclaration, loadContentDeclarations } from "./loadContentDeclaration.mjs";
2
- import { loadLocalDictionaries } from "./loadLocalDictionaries.mjs";
3
2
  import { formatDistantDictionaries, loadRemoteDictionaries } from "./loadRemoteDictionaries.mjs";
4
3
  import { loadDictionaries } from "./loadDictionaries.mjs";
4
+ import { loadLocalDictionaries } from "./loadLocalDictionaries.mjs";
5
5
 
6
6
  export { ensureIntlayerBundle, formatDistantDictionaries, formatLocalDictionaries, loadContentDeclaration, loadContentDeclarations, loadDictionaries, loadLocalDictionaries, loadRemoteDictionaries };
@@ -5,10 +5,10 @@ import { getIntlayerBundle } from "./getIntlayerBundle.mjs";
5
5
  import { loadMarkdownContentDeclaration } from "./loadMarkdownContentDeclaration.mjs";
6
6
  import { loadYamlContentDeclaration } from "./loadYamlContentDeclaration.mjs";
7
7
  import { logTypeScriptErrors } from "./logTypeScriptErrors.mjs";
8
- import { readFile, writeFile } from "node:fs/promises";
9
8
  import { dirname, extname, join, relative } from "node:path";
10
- import { loadExternalFile } from "@intlayer/config/file";
11
9
  import { cacheDisk, getPackageJsonPath, getProjectRequire } from "@intlayer/config/utils";
10
+ import { readFile, writeFile } from "node:fs/promises";
11
+ import { loadExternalFile } from "@intlayer/config/file";
12
12
 
13
13
  //#region src/loadDictionaries/loadContentDeclaration.ts
14
14
  const formatLocalDictionaries = (dictionariesRecord, configuration) => Object.entries(dictionariesRecord).map(([relativePath, dict]) => ({
@@ -1,6 +1,6 @@
1
1
  import { filterInvalidDictionaries } from "../filterInvalidDictionaries.mjs";
2
- import { loadContentDeclarations } from "./loadContentDeclaration.mjs";
3
2
  import { formatDictionaries } from "../formatDictionary.mjs";
3
+ import { loadContentDeclarations } from "./loadContentDeclaration.mjs";
4
4
  import { loadRemoteDictionaries } from "./loadRemoteDictionaries.mjs";
5
5
  import { DictionariesLogger } from "./log.mjs";
6
6
  import * as ANSIColors from "@intlayer/config/colors";
@@ -1,6 +1,6 @@
1
1
  import { loadContentDeclarations } from "./loadContentDeclaration.mjs";
2
- import { mkdir } from "node:fs/promises";
3
2
  import { relative, resolve } from "node:path";
3
+ import { mkdir } from "node:fs/promises";
4
4
 
5
5
  //#region src/loadDictionaries/loadLocalDictionaries.ts
6
6
  const loadLocalDictionaries = async (contentDeclarationsPaths, configuration) => {
@@ -1,7 +1,7 @@
1
1
  import { parseContentDeclarationFileName } from "../utils/parseContentDeclarationFileName.mjs";
2
- import { readFile } from "node:fs/promises";
3
2
  import { getMarkdownMetadata } from "@intlayer/core/markdown";
4
3
  import { MARKDOWN } from "@intlayer/types/nodeType";
4
+ import { readFile } from "node:fs/promises";
5
5
 
6
6
  //#region src/loadDictionaries/loadMarkdownContentDeclaration.ts
7
7
  const loadMarkdownContentDeclaration = async (path, configuration) => {
@@ -2,9 +2,9 @@ import { formatPath } from "./utils/formatter.mjs";
2
2
  import { runOnce } from "./utils/runOnce.mjs";
3
3
  import { join, relative } from "node:path";
4
4
  import * as ANSIColors from "@intlayer/config/colors";
5
+ import { getEnvFilePath } from "@intlayer/config/env";
5
6
  import { colorize, colorizePath, getAppLogger, x } from "@intlayer/config/logger";
6
7
  import { getConfigurationAndFilePath, intlayerConfigSchema, intlayerConfigSchemaParseContext } from "@intlayer/config/node";
7
- import { getEnvFilePath } from "@intlayer/config/env";
8
8
 
9
9
  //#region src/logConfigDetails.ts
10
10
  const logConfigDetails = (options) => {
@@ -1,18 +1,18 @@
1
+ import { runOnce } from "./utils/runOnce.mjs";
1
2
  import { buildDictionary } from "./buildIntlayerDictionary/buildIntlayerDictionary.mjs";
3
+ import { cleanOutputDir } from "./cleanOutputDir.mjs";
2
4
  import { createDictionaryEntryPoint } from "./createDictionaryEntryPoint/createDictionaryEntryPoint.mjs";
3
- import { runOnce } from "./utils/runOnce.mjs";
4
5
  import { createModuleAugmentation } from "./createType/createModuleAugmentation.mjs";
5
6
  import { createTypes } from "./createType/createType.mjs";
6
- import { listDictionariesWithStats } from "./listDictionariesPath.mjs";
7
7
  import { loadDictionaries } from "./loadDictionaries/loadDictionaries.mjs";
8
8
  import { writeRemoteDictionary } from "./buildIntlayerDictionary/writeRemoteDictionary.mjs";
9
- import { cleanOutputDir } from "./cleanOutputDir.mjs";
9
+ import { listDictionariesWithStats } from "./listDictionariesPath.mjs";
10
10
  import { isCachedConfigurationUpToDate, writeConfiguration } from "./writeConfiguration/index.mjs";
11
- import { stat } from "node:fs/promises";
12
11
  import { join } from "node:path";
13
12
  import * as ANSIColors from "@intlayer/config/colors";
14
13
  import { colorize, getAppLogger } from "@intlayer/config/logger";
15
14
  import { cacheDisk } from "@intlayer/config/utils";
15
+ import { stat } from "node:fs/promises";
16
16
  import packageJson from "@intlayer/config/package.json" with { type: "json" };
17
17
 
18
18
  //#region src/prepareIntlayer.ts
@@ -1,5 +1,5 @@
1
- import { byteLength, extractAnchors, extractHreflangs, extractHtmlDir, extractHtmlLang, extractMetaDescription, extractOgImage, extractScriptUrls, extractTitle, extractVisibleTextStrings, hasCanonical } from "./parseHtml.mjs";
2
1
  import { mutateScore, scoreRecord, toScorePercent } from "./calculateScore.mjs";
2
+ import { byteLength, extractAnchors, extractHreflangs, extractHtmlDir, extractHtmlLang, extractMetaDescription, extractOgImage, extractScriptUrls, extractTitle, extractVisibleTextStrings, hasCanonical } from "./parseHtml.mjs";
3
3
  import { analyzeBundleContent } from "./analyzeBundleContent.mjs";
4
4
  import { checkBundleContent, checkCanonical, checkHtmlAttributes, checkLinguisticStructure, checkRobots, checkSitemap, checkUrlStructure, formatSize } from "./checks.mjs";
5
5
  import { scanWebsite } from "./scanWebsite.mjs";
@@ -1,5 +1,5 @@
1
- import { byteLength, extractAnchors, extractScriptUrls } from "./parseHtml.mjs";
2
1
  import { mutateScore, toScorePercent } from "./calculateScore.mjs";
2
+ import { byteLength, extractAnchors, extractScriptUrls } from "./parseHtml.mjs";
3
3
  import { checkBundleContent, checkCanonical, checkHtmlAttributes, checkLinguisticStructure, checkRobots, checkSitemap, checkUrlStructure } from "./checks.mjs";
4
4
  import { GREY, GREY_LIGHT } from "@intlayer/config/colors";
5
5
  import { colorize, logger } from "@intlayer/config/logger";
@@ -1,10 +1,10 @@
1
1
  import { writeFileIfChanged } from "../writeFileIfChanged.mjs";
2
2
  import { extractKeyAndLocaleFromPath } from "./extractKeyAndLocaleFromPath.mjs";
3
3
  import { buildFilePathPatternContext } from "./filePathPatternHelpers.mjs";
4
- import { mkdir, readFile } from "node:fs/promises";
5
4
  import { dirname, isAbsolute, resolve } from "node:path";
6
5
  import { parseFilePathPattern } from "@intlayer/config/utils";
7
6
  import fg from "fast-glob";
7
+ import { mkdir, readFile } from "node:fs/promises";
8
8
 
9
9
  //#region src/syncPluginKit/createFileAdapter.ts
10
10
  /**
@@ -1,6 +1,6 @@
1
- import { createSyncPlugin } from "./createSyncPlugin.mjs";
2
1
  import { extractKeyAndLocaleFromPath } from "./extractKeyAndLocaleFromPath.mjs";
3
2
  import { buildFilePathPatternContext } from "./filePathPatternHelpers.mjs";
4
3
  import { createFileAdapter, createFileReader } from "./createFileAdapter.mjs";
4
+ import { createSyncPlugin } from "./createSyncPlugin.mjs";
5
5
 
6
6
  export { buildFilePathPatternContext, createFileAdapter, createFileReader, createSyncPlugin, extractKeyAndLocaleFromPath };
@@ -1,6 +1,6 @@
1
1
  import { isAbsolute, relative, resolve, sep } from "node:path";
2
- import { normalizePath } from "@intlayer/config/utils";
3
2
  import { TRAVERSE_PATTERN } from "@intlayer/config/defaultValues";
3
+ import { normalizePath } from "@intlayer/config/utils";
4
4
  import fg from "fast-glob";
5
5
 
6
6
  //#region src/utils/buildComponentFilesList.ts
@@ -1,8 +1,8 @@
1
- import { rmSync } from "node:fs";
2
- import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
3
1
  import { dirname, join } from "node:path";
4
2
  import * as ANSIColors from "@intlayer/config/colors";
5
3
  import { colorize, getAppLogger } from "@intlayer/config/logger";
4
+ import { rmSync } from "node:fs";
5
+ import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
6
6
 
7
7
  //#region src/utils/contentWatcherLock.ts
8
8
  /**
@@ -1,7 +1,3 @@
1
- import { Queue, pLimit } from "./pLimit.mjs";
2
- import { parallelize } from "./parallelize.mjs";
3
- import { getPathHash } from "./getPathHash.mjs";
4
- import { formatLocale, formatPath } from "./formatter.mjs";
5
1
  import { autoDecorateContent } from "./autoDecorateContent.mjs";
6
2
  import { buildComponentFilesList } from "./buildComponentFilesList.mjs";
7
3
  import { chunkArray } from "./chunkArray.mjs";
@@ -9,9 +5,13 @@ import { splitTextByLines } from "./splitTextByLine.mjs";
9
5
  import { getChunk } from "./getChunk.mjs";
10
6
  import { assembleJSON, chunkJSON, reconstructFromSingleChunk } from "./chunkJSON.mjs";
11
7
  import { CLI_CONTENT_WATCHER_ENV_VAR, acquireContentWatcherLock, claimCliContentWatcher, getCliContentWatcherLabel, getContentWatcherLockFilePath, getContentWatcherOwner, reportRedundantContentWatcher } from "./contentWatcherLock.mjs";
8
+ import { formatLocale, formatPath } from "./formatter.mjs";
12
9
  import { getContentExtension } from "./getContentExtension.mjs";
13
10
  import { getExtensionFromFormat, getFormatFromExtension } from "./getFormatFromExtension.mjs";
11
+ import { getPathHash } from "./getPathHash.mjs";
14
12
  import { mergeChunks } from "./mergeChunks.mjs";
13
+ import { Queue, pLimit } from "./pLimit.mjs";
14
+ import { parallelize } from "./parallelize.mjs";
15
15
  import { getGlobalLimiter, getTaskLimiter, parallelizeGlobal } from "./parallelizeGlobal.mjs";
16
16
  import { parseContentDeclarationFileName } from "./parseContentDeclarationFileName.mjs";
17
17
  import { excludeObjectFormat, reduceObjectFormat } from "./reduceObjectFormat.mjs";
@@ -1,5 +1,5 @@
1
- import { existsSync, readFileSync, readdirSync } from "node:fs";
2
1
  import { basename, extname, join } from "node:path";
2
+ import { existsSync, readFileSync, readdirSync } from "node:fs";
3
3
 
4
4
  //#region src/utils/readDictionariesFromDisk.ts
5
5
  /**
@@ -1,6 +1,6 @@
1
- import { rmSync } from "node:fs";
2
- import { mkdir, readFile, stat, unlink, writeFile } from "node:fs/promises";
3
1
  import { dirname } from "node:path";
2
+ import { rmSync } from "node:fs";
3
+ import { mkdir, readFile, rmdir, stat, unlink, writeFile } from "node:fs/promises";
4
4
  import packageJson from "@intlayer/core/package.json" with { type: "json" };
5
5
 
6
6
  //#region src/utils/runOnce.ts
@@ -20,6 +20,12 @@ process.on("exit", () => {
20
20
  for (const sentinelFilePath of ownedSentinelFilePaths) try {
21
21
  rmSync(sentinelFilePath, { force: true });
22
22
  } catch {}
23
+ for (const mutexDirPath of ownedMutexDirPaths) try {
24
+ rmSync(mutexDirPath, {
25
+ recursive: true,
26
+ force: true
27
+ });
28
+ } catch {}
23
29
  });
24
30
  /**
25
31
  * Reads the sentinel file, returning `undefined` when it does not exist or
@@ -100,6 +106,53 @@ const removeSentinel = async (sentinelFilePath) => {
100
106
  await unlink(sentinelFilePath);
101
107
  } catch {}
102
108
  };
109
+ /** Delay between two attempts to enter the sentinel critical section. */
110
+ const MUTEX_POLL_INTERVAL_MS = 10;
111
+ /**
112
+ * A critical-section mutex older than this was left behind by a process that
113
+ * died while holding it, and can be taken over.
114
+ */
115
+ const MUTEX_STALE_MS = 1e4;
116
+ /** Mutex directories owned by this process, released on exit like sentinels. */
117
+ const ownedMutexDirPaths = /* @__PURE__ */ new Set();
118
+ /**
119
+ * Serializes the "read the sentinel, decide, replace it" sequence across
120
+ * processes so it behaves as a compare-and-swap.
121
+ *
122
+ * Without it, two contenders reading the same stale sentinel could both remove
123
+ * it, and the slower one would delete the `running` sentinel the faster one
124
+ * had just created — letting two callbacks run at once. A directory is used
125
+ * because `mkdir` is atomic on every platform.
126
+ */
127
+ const withSentinelMutex = async (sentinelFilePath, criticalSection) => {
128
+ const mutexDirPath = `${sentinelFilePath}.mutex`;
129
+ while (true) try {
130
+ await mkdir(dirname(sentinelFilePath), { recursive: true });
131
+ await mkdir(mutexDirPath);
132
+ break;
133
+ } catch (error) {
134
+ const code = error.code;
135
+ if (code === "ENOENT") continue;
136
+ if (code !== "EEXIST") throw error;
137
+ try {
138
+ const mutexStats = await stat(mutexDirPath);
139
+ if (Date.now() - mutexStats.mtime.getTime() > MUTEX_STALE_MS) {
140
+ await rmdir(mutexDirPath).catch(() => {});
141
+ continue;
142
+ }
143
+ } catch {
144
+ continue;
145
+ }
146
+ await delay(MUTEX_POLL_INTERVAL_MS);
147
+ }
148
+ ownedMutexDirPaths.add(mutexDirPath);
149
+ try {
150
+ return await criticalSection();
151
+ } finally {
152
+ ownedMutexDirPaths.delete(mutexDirPath);
153
+ await rmdir(mutexDirPath).catch(() => {});
154
+ }
155
+ };
103
156
  /**
104
157
  * Ensures a callback function runs only once within a specified time window across multiple processes.
105
158
  * Uses a sentinel file to coordinate execution and prevent duplicate work.
@@ -135,24 +188,22 @@ const runOnce = async (sentinelFilePath, callback, options) => {
135
188
  const currentTimestamp = Date.now();
136
189
  const waitDeadline = currentTimestamp + lockWaitTimeoutMs;
137
190
  while (true) {
138
- const sentinelState = await readSentinelState(sentinelFilePath);
139
- if (sentinelState) {
140
- const sentinelAge = Date.now() - sentinelState.mtimeMs;
141
- if (sentinelState.status === "running") {
142
- if (!(sentinelAge > lockWaitTimeoutMs || !isOwnerProcessAlive(sentinelState.pid)) && Date.now() < waitDeadline) {
143
- await delay(LOCK_POLL_INTERVAL_MS);
144
- continue;
145
- }
191
+ const outcome = await withSentinelMutex(sentinelFilePath, async () => {
192
+ const sentinelState = await readSentinelState(sentinelFilePath);
193
+ if (sentinelState) {
194
+ const sentinelAge = Date.now() - sentinelState.mtimeMs;
195
+ if (sentinelState.status === "running") {
196
+ if (!(sentinelAge > lockWaitTimeoutMs || !isOwnerProcessAlive(sentinelState.pid)) && Date.now() < waitDeadline) return "wait";
197
+ } else if (!forceRun && sentinelAge <= cacheTimeoutMs && sentinelState.version === packageJson.version) return "cached";
146
198
  await removeSentinel(sentinelFilePath);
147
- continue;
148
- }
149
- if (!forceRun && sentinelAge <= cacheTimeoutMs && sentinelState.version === packageJson.version) {
150
- await onIsCached?.();
151
- return;
152
199
  }
153
- await removeSentinel(sentinelFilePath);
200
+ return await acquireSentinel(sentinelFilePath, currentTimestamp) ? "acquired" : "wait";
201
+ });
202
+ if (outcome === "cached") {
203
+ await onIsCached?.();
204
+ return;
154
205
  }
155
- if (await acquireSentinel(sentinelFilePath, currentTimestamp)) break;
206
+ if (outcome === "acquired") break;
156
207
  await delay(LOCK_POLL_INTERVAL_MS);
157
208
  }
158
209
  ownedSentinelFilePaths.add(sentinelFilePath);