@intlayer/config 8.4.4 → 8.4.6

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 (227) hide show
  1. package/dist/cjs/_virtual/_rolldown/runtime.cjs +29 -0
  2. package/dist/cjs/built.cjs +7 -1
  3. package/dist/cjs/built.cjs.map +1 -1
  4. package/dist/cjs/client.cjs +16 -1
  5. package/dist/cjs/colors.cjs +33 -1
  6. package/dist/cjs/colors.cjs.map +1 -1
  7. package/dist/cjs/configFile/buildConfigurationFields.cjs +199 -1
  8. package/dist/cjs/configFile/buildConfigurationFields.cjs.map +1 -1
  9. package/dist/cjs/configFile/configurationSchema.cjs +210 -1
  10. package/dist/cjs/configFile/configurationSchema.cjs.map +1 -1
  11. package/dist/cjs/configFile/getConfiguration.cjs +69 -1
  12. package/dist/cjs/configFile/getConfiguration.cjs.map +1 -1
  13. package/dist/cjs/configFile/index.cjs +28 -1
  14. package/dist/cjs/configFile/loadConfigurationFile.cjs +30 -1
  15. package/dist/cjs/configFile/loadConfigurationFile.cjs.map +1 -1
  16. package/dist/cjs/configFile/searchConfigurationFile.cjs +53 -1
  17. package/dist/cjs/configFile/searchConfigurationFile.cjs.map +1 -1
  18. package/dist/cjs/defaultValues/build.cjs +35 -1
  19. package/dist/cjs/defaultValues/build.cjs.map +1 -1
  20. package/dist/cjs/defaultValues/compiler.cjs +13 -1
  21. package/dist/cjs/defaultValues/compiler.cjs.map +1 -1
  22. package/dist/cjs/defaultValues/content.cjs +40 -1
  23. package/dist/cjs/defaultValues/content.cjs.map +1 -1
  24. package/dist/cjs/defaultValues/dictionary.cjs +13 -1
  25. package/dist/cjs/defaultValues/dictionary.cjs.map +1 -1
  26. package/dist/cjs/defaultValues/editor.cjs +23 -1
  27. package/dist/cjs/defaultValues/editor.cjs.map +1 -1
  28. package/dist/cjs/defaultValues/index.cjs +66 -1
  29. package/dist/cjs/defaultValues/internationalization.cjs +15 -1
  30. package/dist/cjs/defaultValues/internationalization.cjs.map +1 -1
  31. package/dist/cjs/defaultValues/log.cjs +10 -1
  32. package/dist/cjs/defaultValues/log.cjs.map +1 -1
  33. package/dist/cjs/defaultValues/routing.cjs +19 -1
  34. package/dist/cjs/defaultValues/routing.cjs.map +1 -1
  35. package/dist/cjs/defaultValues/system.cjs +29 -1
  36. package/dist/cjs/defaultValues/system.cjs.map +1 -1
  37. package/dist/cjs/loadEnvFile.cjs +31 -1
  38. package/dist/cjs/loadEnvFile.cjs.map +1 -1
  39. package/dist/cjs/loadExternalFile/bundleFile.cjs +71 -1
  40. package/dist/cjs/loadExternalFile/bundleFile.cjs.map +1 -1
  41. package/dist/cjs/loadExternalFile/bundleJSFile.cjs +33 -1
  42. package/dist/cjs/loadExternalFile/bundleJSFile.cjs.map +1 -1
  43. package/dist/cjs/loadExternalFile/index.cjs +17 -1
  44. package/dist/cjs/loadExternalFile/loadExternalFile.cjs +77 -1
  45. package/dist/cjs/loadExternalFile/loadExternalFile.cjs.map +1 -1
  46. package/dist/cjs/loadExternalFile/parseFileContent.cjs +77 -1
  47. package/dist/cjs/loadExternalFile/parseFileContent.cjs.map +1 -1
  48. package/dist/cjs/loadExternalFile/transpileTSToCJS.cjs +67 -1
  49. package/dist/cjs/loadExternalFile/transpileTSToCJS.cjs.map +1 -1
  50. package/dist/cjs/logger.cjs +133 -1
  51. package/dist/cjs/logger.cjs.map +1 -1
  52. package/dist/cjs/node.cjs +28 -1
  53. package/dist/cjs/utils/ESMxCJSHelpers.cjs +27 -1
  54. package/dist/cjs/utils/ESMxCJSHelpers.cjs.map +1 -1
  55. package/dist/cjs/utils/alias.cjs +29 -1
  56. package/dist/cjs/utils/alias.cjs.map +1 -1
  57. package/dist/cjs/utils/cacheDisk.cjs +173 -1
  58. package/dist/cjs/utils/cacheDisk.cjs.map +1 -1
  59. package/dist/cjs/utils/cacheMemory.cjs +269 -1
  60. package/dist/cjs/utils/cacheMemory.cjs.map +1 -1
  61. package/dist/cjs/utils/clearModuleCache.cjs +26 -1
  62. package/dist/cjs/utils/clearModuleCache.cjs.map +1 -1
  63. package/dist/cjs/utils/compareVersions.cjs +38 -1
  64. package/dist/cjs/utils/compareVersions.cjs.map +1 -1
  65. package/dist/cjs/utils/extractErrorMessage.cjs +95 -1
  66. package/dist/cjs/utils/extractErrorMessage.cjs.map +1 -1
  67. package/dist/cjs/utils/getExtension.cjs +14 -1
  68. package/dist/cjs/utils/getExtension.cjs.map +1 -1
  69. package/dist/cjs/utils/getPackageJsonPath.cjs +33 -1
  70. package/dist/cjs/utils/getPackageJsonPath.cjs.map +1 -1
  71. package/dist/cjs/utils/index.cjs +45 -1
  72. package/dist/cjs/utils/logStack.cjs +17 -1
  73. package/dist/cjs/utils/logStack.cjs.map +1 -1
  74. package/dist/cjs/utils/normalizePath.cjs +17 -1
  75. package/dist/cjs/utils/normalizePath.cjs.map +1 -1
  76. package/dist/cjs/utils/parseFilePathPattern.cjs +24 -1
  77. package/dist/cjs/utils/parseFilePathPattern.cjs.map +1 -1
  78. package/dist/cjs/utils/retryManager.cjs +45 -1
  79. package/dist/cjs/utils/retryManager.cjs.map +1 -1
  80. package/dist/cjs/utils/stringFormatter/camelCaseToKebabCase.cjs +13 -1
  81. package/dist/cjs/utils/stringFormatter/camelCaseToKebabCase.cjs.map +1 -1
  82. package/dist/cjs/utils/stringFormatter/camelCaseToSentence.cjs +16 -1
  83. package/dist/cjs/utils/stringFormatter/camelCaseToSentence.cjs.map +1 -1
  84. package/dist/cjs/utils/stringFormatter/index.cjs +10 -1
  85. package/dist/cjs/utils/stringFormatter/kebabCaseToCamelCase.cjs +14 -1
  86. package/dist/cjs/utils/stringFormatter/kebabCaseToCamelCase.cjs.map +1 -1
  87. package/dist/cjs/utils/stringFormatter/toLowerCamelCase.cjs +19 -1
  88. package/dist/cjs/utils/stringFormatter/toLowerCamelCase.cjs.map +1 -1
  89. package/dist/esm/_virtual/_rolldown/runtime.mjs +8 -0
  90. package/dist/esm/built.mjs +7 -1
  91. package/dist/esm/built.mjs.map +1 -1
  92. package/dist/esm/client.mjs +9 -1
  93. package/dist/esm/colors.mjs +18 -1
  94. package/dist/esm/colors.mjs.map +1 -1
  95. package/dist/esm/configFile/buildConfigurationFields.mjs +197 -1
  96. package/dist/esm/configFile/buildConfigurationFields.mjs.map +1 -1
  97. package/dist/esm/configFile/configurationSchema.mjs +191 -1
  98. package/dist/esm/configFile/configurationSchema.mjs.map +1 -1
  99. package/dist/esm/configFile/getConfiguration.mjs +66 -1
  100. package/dist/esm/configFile/getConfiguration.mjs.map +1 -1
  101. package/dist/esm/configFile/index.mjs +6 -1
  102. package/dist/esm/configFile/loadConfigurationFile.mjs +29 -1
  103. package/dist/esm/configFile/loadConfigurationFile.mjs.map +1 -1
  104. package/dist/esm/configFile/searchConfigurationFile.mjs +50 -1
  105. package/dist/esm/configFile/searchConfigurationFile.mjs.map +1 -1
  106. package/dist/esm/defaultValues/build.mjs +28 -1
  107. package/dist/esm/defaultValues/build.mjs.map +1 -1
  108. package/dist/esm/defaultValues/compiler.mjs +8 -1
  109. package/dist/esm/defaultValues/compiler.mjs.map +1 -1
  110. package/dist/esm/defaultValues/content.mjs +32 -1
  111. package/dist/esm/defaultValues/content.mjs.map +1 -1
  112. package/dist/esm/defaultValues/dictionary.mjs +8 -1
  113. package/dist/esm/defaultValues/dictionary.mjs.map +1 -1
  114. package/dist/esm/defaultValues/editor.mjs +13 -1
  115. package/dist/esm/defaultValues/editor.mjs.map +1 -1
  116. package/dist/esm/defaultValues/index.mjs +11 -1
  117. package/dist/esm/defaultValues/internationalization.mjs +10 -1
  118. package/dist/esm/defaultValues/internationalization.mjs.map +1 -1
  119. package/dist/esm/defaultValues/log.mjs +8 -1
  120. package/dist/esm/defaultValues/log.mjs.map +1 -1
  121. package/dist/esm/defaultValues/routing.mjs +11 -1
  122. package/dist/esm/defaultValues/routing.mjs.map +1 -1
  123. package/dist/esm/defaultValues/system.mjs +16 -1
  124. package/dist/esm/defaultValues/system.mjs.map +1 -1
  125. package/dist/esm/loadEnvFile.mjs +27 -1
  126. package/dist/esm/loadEnvFile.mjs.map +1 -1
  127. package/dist/esm/loadExternalFile/bundleFile.mjs +67 -1
  128. package/dist/esm/loadExternalFile/bundleFile.mjs.map +1 -1
  129. package/dist/esm/loadExternalFile/bundleJSFile.mjs +31 -1
  130. package/dist/esm/loadExternalFile/bundleJSFile.mjs.map +1 -1
  131. package/dist/esm/loadExternalFile/index.mjs +7 -1
  132. package/dist/esm/loadExternalFile/loadExternalFile.mjs +73 -1
  133. package/dist/esm/loadExternalFile/loadExternalFile.mjs.map +1 -1
  134. package/dist/esm/loadExternalFile/parseFileContent.mjs +73 -1
  135. package/dist/esm/loadExternalFile/parseFileContent.mjs.map +1 -1
  136. package/dist/esm/loadExternalFile/transpileTSToCJS.mjs +64 -1
  137. package/dist/esm/loadExternalFile/transpileTSToCJS.mjs.map +1 -1
  138. package/dist/esm/logger.mjs +118 -1
  139. package/dist/esm/logger.mjs.map +1 -1
  140. package/dist/esm/node.mjs +6 -1
  141. package/dist/esm/utils/ESMxCJSHelpers.mjs +25 -1
  142. package/dist/esm/utils/ESMxCJSHelpers.mjs.map +1 -0
  143. package/dist/esm/utils/alias.mjs +27 -1
  144. package/dist/esm/utils/alias.mjs.map +1 -1
  145. package/dist/esm/utils/cacheDisk.mjs +170 -1
  146. package/dist/esm/utils/cacheDisk.mjs.map +1 -1
  147. package/dist/esm/utils/cacheMemory.mjs +261 -1
  148. package/dist/esm/utils/cacheMemory.mjs.map +1 -1
  149. package/dist/esm/utils/clearModuleCache.mjs +25 -1
  150. package/dist/esm/utils/clearModuleCache.mjs.map +1 -1
  151. package/dist/esm/utils/compareVersions.mjs +36 -1
  152. package/dist/esm/utils/compareVersions.mjs.map +1 -1
  153. package/dist/esm/utils/extractErrorMessage.mjs +93 -1
  154. package/dist/esm/utils/extractErrorMessage.mjs.map +1 -1
  155. package/dist/esm/utils/getExtension.mjs +12 -1
  156. package/dist/esm/utils/getExtension.mjs.map +1 -1
  157. package/dist/esm/utils/getPackageJsonPath.mjs +31 -1
  158. package/dist/esm/utils/getPackageJsonPath.mjs.map +1 -1
  159. package/dist/esm/utils/index.mjs +19 -1
  160. package/dist/esm/utils/logStack.mjs +16 -1
  161. package/dist/esm/utils/logStack.mjs.map +1 -1
  162. package/dist/esm/utils/normalizePath.mjs +15 -1
  163. package/dist/esm/utils/normalizePath.mjs.map +1 -1
  164. package/dist/esm/utils/parseFilePathPattern.mjs +21 -1
  165. package/dist/esm/utils/parseFilePathPattern.mjs.map +1 -1
  166. package/dist/esm/utils/retryManager.mjs +44 -1
  167. package/dist/esm/utils/retryManager.mjs.map +1 -1
  168. package/dist/esm/utils/stringFormatter/camelCaseToKebabCase.mjs +11 -1
  169. package/dist/esm/utils/stringFormatter/camelCaseToKebabCase.mjs.map +1 -1
  170. package/dist/esm/utils/stringFormatter/camelCaseToSentence.mjs +14 -1
  171. package/dist/esm/utils/stringFormatter/camelCaseToSentence.mjs.map +1 -1
  172. package/dist/esm/utils/stringFormatter/index.mjs +6 -1
  173. package/dist/esm/utils/stringFormatter/kebabCaseToCamelCase.mjs +12 -1
  174. package/dist/esm/utils/stringFormatter/kebabCaseToCamelCase.mjs.map +1 -1
  175. package/dist/esm/utils/stringFormatter/toLowerCamelCase.mjs +17 -1
  176. package/dist/esm/utils/stringFormatter/toLowerCamelCase.mjs.map +1 -1
  177. package/dist/types/client.d.ts +4 -4
  178. package/dist/types/colors.d.ts +20 -2
  179. package/dist/types/colors.d.ts.map +1 -0
  180. package/dist/types/configFile/buildConfigurationFields.d.ts.map +1 -1
  181. package/dist/types/configFile/configurationSchema.d.ts +10 -10
  182. package/dist/types/configFile/getConfiguration.d.ts +2 -2
  183. package/dist/types/configFile/loadConfigurationFile.d.ts +1 -1
  184. package/dist/types/configFile/loadConfigurationFile.d.ts.map +1 -1
  185. package/dist/types/loadEnvFile.d.ts +10 -2
  186. package/dist/types/loadEnvFile.d.ts.map +1 -0
  187. package/dist/types/loadExternalFile/index.d.ts +3 -3
  188. package/dist/types/loadExternalFile/loadExternalFile.d.ts +25 -2
  189. package/dist/types/loadExternalFile/loadExternalFile.d.ts.map +1 -0
  190. package/dist/types/loadExternalFile/parseFileContent.d.ts +29 -2
  191. package/dist/types/loadExternalFile/parseFileContent.d.ts.map +1 -0
  192. package/dist/types/loadExternalFile/transpileTSToCJS.d.ts +19 -2
  193. package/dist/types/loadExternalFile/transpileTSToCJS.d.ts.map +1 -0
  194. package/dist/types/logger.d.ts +4 -4
  195. package/dist/types/logger.d.ts.map +1 -1
  196. package/dist/types/utils/index.d.ts +4 -4
  197. package/dist/types/utils/stringFormatter/camelCaseToKebabCase.d.ts +9 -2
  198. package/dist/types/utils/stringFormatter/camelCaseToKebabCase.d.ts.map +1 -0
  199. package/dist/types/utils/stringFormatter/camelCaseToSentence.d.ts +9 -2
  200. package/dist/types/utils/stringFormatter/camelCaseToSentence.d.ts.map +1 -0
  201. package/dist/types/utils/stringFormatter/index.d.ts +4 -4
  202. package/dist/types/utils/stringFormatter/kebabCaseToCamelCase.d.ts +5 -2
  203. package/dist/types/utils/stringFormatter/kebabCaseToCamelCase.d.ts.map +1 -0
  204. package/dist/types/utils/stringFormatter/toLowerCamelCase.d.ts +10 -2
  205. package/dist/types/utils/stringFormatter/toLowerCamelCase.d.ts.map +1 -0
  206. package/package.json +2 -2
  207. package/dist/cjs/chunk-Bmb41Sf3.cjs +0 -1
  208. package/dist/esm/ESMxCJSHelpers-BAuqwNXV.mjs +0 -2
  209. package/dist/esm/ESMxCJSHelpers-BAuqwNXV.mjs.map +0 -1
  210. package/dist/types/camelCaseToKebabCase-BV_lLJHR.d.ts +0 -9
  211. package/dist/types/camelCaseToKebabCase-BV_lLJHR.d.ts.map +0 -1
  212. package/dist/types/camelCaseToSentence-DAbbkwe6.d.ts +0 -9
  213. package/dist/types/camelCaseToSentence-DAbbkwe6.d.ts.map +0 -1
  214. package/dist/types/colors-BbZeGWYU.d.ts +0 -20
  215. package/dist/types/colors-BbZeGWYU.d.ts.map +0 -1
  216. package/dist/types/kebabCaseToCamelCase-h9PkNVuO.d.ts +0 -5
  217. package/dist/types/kebabCaseToCamelCase-h9PkNVuO.d.ts.map +0 -1
  218. package/dist/types/loadEnvFile-BiTBX4fe.d.ts +0 -10
  219. package/dist/types/loadEnvFile-BiTBX4fe.d.ts.map +0 -1
  220. package/dist/types/loadExternalFile-DmM_TGcA.d.ts +0 -25
  221. package/dist/types/loadExternalFile-DmM_TGcA.d.ts.map +0 -1
  222. package/dist/types/parseFileContent--o_QlW5j.d.ts +0 -29
  223. package/dist/types/parseFileContent--o_QlW5j.d.ts.map +0 -1
  224. package/dist/types/toLowerCamelCase-DUdT00I1.d.ts +0 -10
  225. package/dist/types/toLowerCamelCase-DUdT00I1.d.ts.map +0 -1
  226. package/dist/types/transpileTSToCJS-OifpV3zk.d.ts +0 -19
  227. package/dist/types/transpileTSToCJS-OifpV3zk.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"transpileTSToCJS.mjs","names":[],"sources":["../../../src/loadExternalFile/transpileTSToCJS.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { dirname, extname, join } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { type BuildOptions, type BuildResult, build, buildSync } from 'esbuild';\nimport { getPackageJsonPath } from '../utils/getPackageJsonPath';\nimport { getLoader } from './bundleFile';\n\nexport type TranspileOptions = BuildOptions & {\n /**\n * Optional custom esbuild instance to use for transpilation.\n * Useful in environments (e.g. VS Code extensions) where the bundled\n * esbuild binary may not match the host platform.\n * When provided, its `buildSync`/`build` methods are used instead of\n * the ones imported from the `esbuild` package.\n */\n esbuildInstance?: typeof import('esbuild');\n};\n\nconst getTsConfigPath = (filePath: string): string | undefined => {\n const tsconfigPath = join(\n getPackageJsonPath(dirname(filePath)).baseDir,\n 'tsconfig.json'\n );\n\n // Only return the tsconfig path if it exists\n return existsSync(tsconfigPath) ? tsconfigPath : undefined;\n};\n\nconst getTransformationOptions = (filePath: string): BuildOptions => ({\n loader: {\n '.js': 'js',\n '.jsx': 'jsx',\n '.mjs': 'js',\n '.ts': 'ts',\n '.tsx': 'tsx',\n '.cjs': 'js',\n '.json': 'json',\n '.md': 'text',\n '.mdx': 'text',\n },\n format: 'cjs',\n target: 'node20',\n platform: 'node',\n write: false,\n packages: 'external',\n bundle: true,\n tsconfig: getTsConfigPath(filePath),\n define: {\n 'import.meta.url': JSON.stringify(pathToFileURL(filePath).href),\n },\n});\n\nexport const transpileTSToCJSSync = (\n code: string,\n filePath: string,\n options?: TranspileOptions\n): string | undefined => {\n const extension = extname(filePath);\n const loader = getLoader(extension);\n\n const { esbuildInstance, ...buildOptions } = options ?? {};\n const esbuildBuildSync = esbuildInstance?.buildSync ?? buildSync;\n\n const moduleResult: BuildResult = esbuildBuildSync({\n stdin: {\n contents: code,\n loader,\n resolveDir: dirname(filePath), // Add resolveDir to resolve imports relative to the file's location\n sourcefile: filePath, // Add sourcefile for better error messages\n },\n ...getTransformationOptions(filePath),\n ...buildOptions,\n });\n\n const moduleResultString = moduleResult.outputFiles?.[0].text;\n\n return moduleResultString;\n};\n\nexport const transpileTSToCJS = async (\n code: string,\n filePath: string,\n options?: TranspileOptions\n): Promise<string | undefined> => {\n const extension = extname(filePath);\n const loader = getLoader(extension);\n\n const { esbuildInstance, ...buildOptions } = options ?? {};\n const esbuildBuild = esbuildInstance?.build ?? build;\n\n const moduleResult: BuildResult = await esbuildBuild({\n stdin: {\n contents: code,\n loader,\n resolveDir: dirname(filePath), // Add resolveDir to resolve imports relative to the file's location\n sourcefile: filePath, // Add sourcefile for better error messages\n },\n ...getTransformationOptions(filePath),\n ...buildOptions,\n });\n\n const moduleResultString = moduleResult.outputFiles?.[0].text;\n\n return moduleResultString;\n};\n"],"mappings":"0SAkBA,MAAM,EAAmB,GAAyC,CAChE,IAAM,EAAe,EACnB,EAAmB,EAAQ,EAAS,CAAC,CAAC,QACtC,gBACD,CAGD,OAAO,EAAW,EAAa,CAAG,EAAe,IAAA,IAG7C,EAA4B,IAAoC,CACpE,OAAQ,CACN,MAAO,KACP,OAAQ,MACR,OAAQ,KACR,MAAO,KACP,OAAQ,MACR,OAAQ,KACR,QAAS,OACT,MAAO,OACP,OAAQ,OACT,CACD,OAAQ,MACR,OAAQ,SACR,SAAU,OACV,MAAO,GACP,SAAU,WACV,OAAQ,GACR,SAAU,EAAgB,EAAS,CACnC,OAAQ,CACN,kBAAmB,KAAK,UAAU,EAAc,EAAS,CAAC,KAAK,CAChE,CACF,EAEY,GACX,EACA,EACA,IACuB,CAEvB,IAAM,EAAS,EADG,EAAQ,EAAS,CACA,CAE7B,CAAE,kBAAiB,GAAG,GAAiB,GAAW,EAAE,CAgB1D,OAfyB,GAAiB,WAAa,GAEJ,CACjD,MAAO,CACL,SAAU,EACV,SACA,WAAY,EAAQ,EAAS,CAC7B,WAAY,EACb,CACD,GAAG,EAAyB,EAAS,CACrC,GAAG,EACJ,CAAC,CAEsC,cAAc,GAAG,MAK9C,EAAmB,MAC9B,EACA,EACA,IACgC,CAEhC,IAAM,EAAS,EADG,EAAQ,EAAS,CACA,CAE7B,CAAE,kBAAiB,GAAG,GAAiB,GAAW,EAAE,CAgB1D,OAbkC,MAFb,GAAiB,OAAS,GAEM,CACnD,MAAO,CACL,SAAU,EACV,SACA,WAAY,EAAQ,EAAS,CAC7B,WAAY,EACb,CACD,GAAG,EAAyB,EAAS,CACrC,GAAG,EACJ,CAAC,EAEsC,cAAc,GAAG"}
1
+ {"version":3,"file":"transpileTSToCJS.mjs","names":[],"sources":["../../../src/loadExternalFile/transpileTSToCJS.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { dirname, extname, join } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { type BuildOptions, type BuildResult, build, buildSync } from 'esbuild';\nimport { getPackageJsonPath } from '../utils/getPackageJsonPath';\nimport { getLoader } from './bundleFile';\n\nexport type TranspileOptions = BuildOptions & {\n /**\n * Optional custom esbuild instance to use for transpilation.\n * Useful in environments (e.g. VS Code extensions) where the bundled\n * esbuild binary may not match the host platform.\n * When provided, its `buildSync`/`build` methods are used instead of\n * the ones imported from the `esbuild` package.\n */\n esbuildInstance?: typeof import('esbuild');\n};\n\nconst getTsConfigPath = (filePath: string): string | undefined => {\n const tsconfigPath = join(\n getPackageJsonPath(dirname(filePath)).baseDir,\n 'tsconfig.json'\n );\n\n // Only return the tsconfig path if it exists\n return existsSync(tsconfigPath) ? tsconfigPath : undefined;\n};\n\nconst getTransformationOptions = (filePath: string): BuildOptions => ({\n loader: {\n '.js': 'js',\n '.jsx': 'jsx',\n '.mjs': 'js',\n '.ts': 'ts',\n '.tsx': 'tsx',\n '.cjs': 'js',\n '.json': 'json',\n '.md': 'text',\n '.mdx': 'text',\n },\n format: 'cjs',\n target: 'node20',\n platform: 'node',\n write: false,\n packages: 'external',\n bundle: true,\n tsconfig: getTsConfigPath(filePath),\n define: {\n 'import.meta.url': JSON.stringify(pathToFileURL(filePath).href),\n },\n});\n\nexport const transpileTSToCJSSync = (\n code: string,\n filePath: string,\n options?: TranspileOptions\n): string | undefined => {\n const extension = extname(filePath);\n const loader = getLoader(extension);\n\n const { esbuildInstance, ...buildOptions } = options ?? {};\n const esbuildBuildSync = esbuildInstance?.buildSync ?? buildSync;\n\n const moduleResult: BuildResult = esbuildBuildSync({\n stdin: {\n contents: code,\n loader,\n resolveDir: dirname(filePath), // Add resolveDir to resolve imports relative to the file's location\n sourcefile: filePath, // Add sourcefile for better error messages\n },\n ...getTransformationOptions(filePath),\n ...buildOptions,\n });\n\n const moduleResultString = moduleResult.outputFiles?.[0].text;\n\n return moduleResultString;\n};\n\nexport const transpileTSToCJS = async (\n code: string,\n filePath: string,\n options?: TranspileOptions\n): Promise<string | undefined> => {\n const extension = extname(filePath);\n const loader = getLoader(extension);\n\n const { esbuildInstance, ...buildOptions } = options ?? {};\n const esbuildBuild = esbuildInstance?.build ?? build;\n\n const moduleResult: BuildResult = await esbuildBuild({\n stdin: {\n contents: code,\n loader,\n resolveDir: dirname(filePath), // Add resolveDir to resolve imports relative to the file's location\n sourcefile: filePath, // Add sourcefile for better error messages\n },\n ...getTransformationOptions(filePath),\n ...buildOptions,\n });\n\n const moduleResultString = moduleResult.outputFiles?.[0].text;\n\n return moduleResultString;\n};\n"],"mappings":";;;;;;;;AAkBA,MAAM,mBAAmB,aAAyC;CAChE,MAAM,eAAe,KACnB,mBAAmB,QAAQ,SAAS,CAAC,CAAC,SACtC,gBACD;AAGD,QAAO,WAAW,aAAa,GAAG,eAAe;;AAGnD,MAAM,4BAA4B,cAAoC;CACpE,QAAQ;EACN,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,SAAS;EACT,OAAO;EACP,QAAQ;EACT;CACD,QAAQ;CACR,QAAQ;CACR,UAAU;CACV,OAAO;CACP,UAAU;CACV,QAAQ;CACR,UAAU,gBAAgB,SAAS;CACnC,QAAQ,EACN,mBAAmB,KAAK,UAAU,cAAc,SAAS,CAAC,KAAK,EAChE;CACF;AAED,MAAa,wBACX,MACA,UACA,YACuB;CAEvB,MAAM,SAAS,UADG,QAAQ,SAAS,CACA;CAEnC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,WAAW,EAAE;AAgB1D,SAfyB,iBAAiB,aAAa,WAEJ;EACjD,OAAO;GACL,UAAU;GACV;GACA,YAAY,QAAQ,SAAS;GAC7B,YAAY;GACb;EACD,GAAG,yBAAyB,SAAS;EACrC,GAAG;EACJ,CAAC,CAEsC,cAAc,GAAG;;AAK3D,MAAa,mBAAmB,OAC9B,MACA,UACA,YACgC;CAEhC,MAAM,SAAS,UADG,QAAQ,SAAS,CACA;CAEnC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,WAAW,EAAE;AAgB1D,SAbkC,OAFb,iBAAiB,SAAS,OAEM;EACnD,OAAO;GACL,UAAU;GACV;GACA,YAAY,QAAQ,SAAS;GAC7B,YAAY;GACb;EACD,GAAG,yBAAyB,SAAS;EACrC,GAAG;EACJ,CAAC,EAEsC,cAAc,GAAG"}
@@ -1,2 +1,119 @@
1
- import{BEIGE as e,BLUE as t,GREEN as n,GREY as r,RED as i,RESET as a}from"./colors.mjs";let o;const s=e=>{o=e},c=e=>o===void 0?e:o,l=(e,t)=>{let n=t?.isVerbose??!1,r=t?.config?.mode??`default`,i=t?.level??`info`,a=c(t?.config?.prefix),o=t?.config?.log??console.log,s=t?.config?.info??console.info,l=t?.config?.warn??console.warn,u=t?.config?.error??console.error,d=t?.config?.debug??console.debug;if(r===`disabled`||n&&r!==`verbose`)return;let f=a?[a,...[e].flat()]:[e].flat();if(i===`debug`)return d(...f);if(i===`info`)return s(...f);if(i===`warn`)return l(...f);if(i===`error`)return u(...f);o(...f)},u=[`⠋`,`⠙`,`⠹`,`⠸`,`⠼`,`⠴`,`⠦`,`⠧`,`⠇`,`⠏`],d=(e,t)=>(n,r)=>l(n,{...r??{},config:{...e?.log,...t?.config,...r?.config??{}}}),f=(e,t,n)=>t?`${t}${e}${n?typeof n==`boolean`?a:n:a}`:e,p=(e,t=n,r=a)=>[e].flat().map(e=>f(e,t,r)).join(`, `),m=(t,n=e,r=a)=>[t].flat().map(e=>f(e,n,r)).join(`, `),h=(e,t=r,n=a)=>[e].flat().map(e=>f(e,t,n)).join(`, `),g=(e,n={zero:t,one:t,two:t,few:t,many:t,other:t})=>{if(e===0){let t=n.zero??`\x1B[32m`;return f(e.toString(),t)}let r=n[new Intl.PluralRules(`en`).select(Number(e))];return f(e.toString(),r)},_=e=>e.replace(/\x1b\[[0-9;]*m/g,``),v=e=>{let t=0;return typeof e==`number`&&(t=e),typeof e==`string`&&(t=e.length),Array.isArray(e)&&e.every(e=>typeof e==`string`)&&(t=Math.max(...e.map(e=>e.length))),Array.isArray(e)&&e.every(e=>typeof e==`number`)&&(t=Math.max(...e)),Math.max(t,0)},y={colSize:0,minSize:0,maxSize:1/0,pad:`right`,padChar:`0`},b=(e,t)=>[e].flat().map(e=>{let{colSize:n,minSize:r,maxSize:i,pad:a}={...y,...t??{}},o=v(n),s=Math.max(r,Math.min(i,o-_(e).length));return a===`left`?`${` `.repeat(s)}${e}`:`${e}${` `.repeat(s)}`}).join(``),x=f(`✗`,i),S=f(`✓`,n),C=f(`⏲`,t);export{C as clock,b as colon,f as colorize,m as colorizeKey,p as colorizeLocales,g as colorizeNumber,h as colorizePath,d as getAppLogger,c as getPrefix,l as logger,_ as removeColor,s as setPrefix,u as spinnerFrames,S as v,x};
1
+ import { BEIGE, BLUE, GREEN, GREY, RED, RESET } from "./colors.mjs";
2
+
3
+ //#region src/logger.ts
4
+ let loggerPrefix;
5
+ const setPrefix = (prefix) => {
6
+ loggerPrefix = prefix;
7
+ };
8
+ const getPrefix = (configPrefix) => {
9
+ if (typeof loggerPrefix !== "undefined") return loggerPrefix;
10
+ return configPrefix;
11
+ };
12
+ const logger = (content, details) => {
13
+ const isVerbose = details?.isVerbose ?? false;
14
+ const mode = details?.config?.mode ?? "default";
15
+ const level = details?.level ?? "info";
16
+ const prefix = getPrefix(details?.config?.prefix);
17
+ const log = details?.config?.log ?? console.log;
18
+ const info = details?.config?.info ?? console.info;
19
+ const warn = details?.config?.warn ?? console.warn;
20
+ const error = details?.config?.error ?? console.error;
21
+ const debug = details?.config?.debug ?? console.debug;
22
+ if (mode === "disabled") return;
23
+ if (isVerbose && mode !== "verbose") return;
24
+ const flatContent = prefix ? [prefix, ...[content].flat()] : [content].flat();
25
+ if (level === "debug") return debug(...flatContent);
26
+ if (level === "info") return info(...flatContent);
27
+ if (level === "warn") return warn(...flatContent);
28
+ if (level === "error") return error(...flatContent);
29
+ log(...flatContent);
30
+ };
31
+ const spinnerFrames = [
32
+ "⠋",
33
+ "⠙",
34
+ "⠹",
35
+ "⠸",
36
+ "⠼",
37
+ "⠴",
38
+ "⠦",
39
+ "⠧",
40
+ "⠇",
41
+ "⠏"
42
+ ];
43
+ /**
44
+ * The appLogger function takes the logger and merges it with the configuration from the intlayer config file.
45
+ * It allows overriding the default configuration by passing a config object in the details parameter.
46
+ * The configuration is merged with the default configuration from the intlayer config file.
47
+ */
48
+ const getAppLogger = (configuration, globalDetails) => (content, details) => logger(content, {
49
+ ...details ?? {},
50
+ config: {
51
+ ...configuration?.log,
52
+ ...globalDetails?.config,
53
+ ...details?.config ?? {}
54
+ }
55
+ });
56
+ const colorize = (s, color, reset) => color ? `${color}${s}${reset ? typeof reset === "boolean" ? RESET : reset : RESET}` : s;
57
+ const colorizeLocales = (locales, color = GREEN, reset = RESET) => [locales].flat().map((locale) => colorize(locale, color, reset)).join(`, `);
58
+ const colorizeKey = (keyPath, color = BEIGE, reset = RESET) => [keyPath].flat().map((key) => colorize(key, color, reset)).join(`, `);
59
+ const colorizePath = (path, color = GREY, reset = RESET) => [path].flat().map((path) => colorize(path, color, reset)).join(`, `);
60
+ /**
61
+ * Colorize numeric value using Intl.NumberFormat and optional ANSI colors.
62
+ *
63
+ * Examples:
64
+ * colorizeNumber(2, [{ pluralRule: 'one' , color: ANSIColors.GREEN}, { pluralRule: 'other' , color: ANSIColors.RED}]) // "'\x1b[31m2\x1b[0m"
65
+ */
66
+ const colorizeNumber = (number, options = {
67
+ zero: BLUE,
68
+ one: BLUE,
69
+ two: BLUE,
70
+ few: BLUE,
71
+ many: BLUE,
72
+ other: BLUE
73
+ }) => {
74
+ if (number === 0) {
75
+ const color = options.zero ?? "\x1B[32m";
76
+ return colorize(number.toString(), color);
77
+ }
78
+ const color = options[new Intl.PluralRules("en").select(Number(number))];
79
+ return colorize(number.toString(), color);
80
+ };
81
+ const removeColor = (text) => text.replace(/\x1b\[[0-9;]*m/g, "");
82
+ const getLength = (length) => {
83
+ let value = 0;
84
+ if (typeof length === "number") value = length;
85
+ if (typeof length === "string") value = length.length;
86
+ if (Array.isArray(length) && length.every((l) => typeof l === "string")) value = Math.max(...length.map((str) => str.length));
87
+ if (Array.isArray(length) && length.every((l) => typeof l === "number")) value = Math.max(...length);
88
+ return Math.max(value, 0);
89
+ };
90
+ const defaultColonOptions = {
91
+ colSize: 0,
92
+ minSize: 0,
93
+ maxSize: Infinity,
94
+ pad: "right",
95
+ padChar: "0"
96
+ };
97
+ /**
98
+ * Create a string of spaces of a given length.
99
+ *
100
+ * @param colSize - The length of the string to create.
101
+ * @returns A string of spaces.
102
+ */
103
+ const colon = (text, options) => [text].flat().map((text) => {
104
+ const { colSize, minSize, maxSize, pad } = {
105
+ ...defaultColonOptions,
106
+ ...options ?? {}
107
+ };
108
+ const length = getLength(colSize);
109
+ const spacesLength = Math.max(minSize, Math.min(maxSize, length - removeColor(text).length));
110
+ if (pad === "left") return `${" ".repeat(spacesLength)}${text}`;
111
+ return `${text}${" ".repeat(spacesLength)}`;
112
+ }).join("");
113
+ const x = colorize("✗", RED);
114
+ const v = colorize("✓", GREEN);
115
+ const clock = colorize("⏲", BLUE);
116
+
117
+ //#endregion
118
+ export { clock, colon, colorize, colorizeKey, colorizeLocales, colorizeNumber, colorizePath, getAppLogger, getPrefix, logger, removeColor, setPrefix, spinnerFrames, v, x };
2
119
  //# sourceMappingURL=logger.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.mjs","names":["ANSIColors.RESET","ANSIColors.GREEN","ANSIColors.BEIGE","ANSIColors.GREY","ANSIColors.BLUE","ANSIColors.RED"],"sources":["../../src/logger.ts"],"sourcesContent":["import type { Locale } from '@intlayer/types/allLocales';\nimport type { CustomIntlayerConfig } from '@intlayer/types/config';\nimport * as ANSIColors from './colors';\n\nexport type ANSIColorsType = (typeof ANSIColors)[keyof typeof ANSIColors];\n\nexport type Details = {\n isVerbose?: boolean;\n level?: 'info' | 'warn' | 'error' | 'debug';\n config?: CustomIntlayerConfig['log'];\n};\n\nexport type Logger = (content: any, details?: Details) => void;\n\nlet loggerPrefix: string | undefined;\n\nexport const setPrefix = (prefix: string | undefined) => {\n loggerPrefix = prefix;\n};\n\nexport const getPrefix = (configPrefix?: string): string | undefined => {\n if (typeof loggerPrefix !== 'undefined') {\n return loggerPrefix;\n }\n\n return configPrefix;\n};\n\nexport const logger: Logger = (content, details) => {\n const isVerbose = details?.isVerbose ?? false;\n const mode = details?.config?.mode ?? 'default';\n const level = details?.level ?? 'info';\n const prefix = getPrefix(details?.config?.prefix);\n const log = details?.config?.log ?? console.log;\n const info = details?.config?.info ?? console.info;\n const warn = details?.config?.warn ?? console.warn;\n const error = details?.config?.error ?? console.error;\n const debug = details?.config?.debug ?? console.debug;\n\n if (mode === 'disabled') return;\n\n if (isVerbose && mode !== 'verbose') return;\n\n const flatContent = prefix ? [prefix, ...[content].flat()] : [content].flat();\n\n if (level === 'debug') {\n return debug(...flatContent);\n }\n\n if (level === 'info') {\n return info(...flatContent);\n }\n\n if (level === 'warn') {\n return warn(...flatContent);\n }\n\n if (level === 'error') {\n return error(...flatContent);\n }\n\n log(...flatContent);\n};\n\nexport const spinnerFrames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\n/**\n * The appLogger function takes the logger and merges it with the configuration from the intlayer config file.\n * It allows overriding the default configuration by passing a config object in the details parameter.\n * The configuration is merged with the default configuration from the intlayer config file.\n */\nexport const getAppLogger =\n (configuration?: CustomIntlayerConfig, globalDetails?: Details) =>\n (content: any, details?: Details) =>\n logger(content, {\n ...(details ?? {}),\n config: {\n ...configuration?.log,\n ...globalDetails?.config,\n ...(details?.config ?? {}),\n },\n });\n\nexport const colorize = (\n s: string,\n color?: ANSIColorsType,\n reset?: boolean | ANSIColorsType\n): string =>\n color\n ? `${color}${s}${reset ? (typeof reset === 'boolean' ? ANSIColors.RESET : reset) : ANSIColors.RESET}`\n : s;\n\nexport const colorizeLocales = (\n locales: Locale | Locale[],\n color = ANSIColors.GREEN,\n reset: boolean | ANSIColorsType = ANSIColors.RESET\n) =>\n [locales]\n .flat()\n .map((locale) => colorize(locale, color, reset))\n .join(`, `);\n\nexport const colorizeKey = (\n keyPath: string | string[],\n color = ANSIColors.BEIGE,\n reset: boolean | ANSIColorsType = ANSIColors.RESET\n) =>\n [keyPath]\n .flat()\n .map((key) => colorize(key, color, reset))\n .join(`, `);\n\nexport const colorizePath = (\n path: string | string[],\n color = ANSIColors.GREY,\n reset: boolean | ANSIColorsType = ANSIColors.RESET\n) =>\n [path]\n .flat()\n .map((path) => colorize(path, color, reset))\n .join(`, `);\n\n/**\n * Colorize numeric value using Intl.NumberFormat and optional ANSI colors.\n *\n * Examples:\n * colorizeNumber(2, [{ pluralRule: 'one' , color: ANSIColors.GREEN}, { pluralRule: 'other' , color: ANSIColors.RED}]) // \"'\\x1b[31m2\\x1b[0m\"\n */\nexport const colorizeNumber = (\n number: number | string,\n options: Partial<Record<Intl.LDMLPluralRule, ANSIColorsType>> = {\n zero: ANSIColors.BLUE,\n one: ANSIColors.BLUE,\n two: ANSIColors.BLUE,\n few: ANSIColors.BLUE,\n many: ANSIColors.BLUE,\n other: ANSIColors.BLUE,\n }\n): string => {\n if (number === 0) {\n const color = options.zero ?? ANSIColors.GREEN;\n return colorize(number.toString(), color);\n }\n\n const rule = new Intl.PluralRules('en').select(Number(number));\n const color = options[rule];\n return colorize(number.toString(), color);\n};\n\nexport const removeColor = (text: string) =>\n // biome-ignore lint/suspicious/noControlCharactersInRegex: we need to remove the color codes\n text.replace(/\\x1b\\[[0-9;]*m/g, '');\n\nconst getLength = (length: number | number[] | string | string[]): number => {\n let value: number = 0;\n if (typeof length === 'number') {\n value = length;\n }\n if (typeof length === 'string') {\n value = length.length;\n }\n if (Array.isArray(length) && length.every((l) => typeof l === 'string')) {\n value = Math.max(...length.map((str) => str.length));\n }\n if (Array.isArray(length) && length.every((l) => typeof l === 'number')) {\n value = Math.max(...length);\n }\n return Math.max(value, 0);\n};\n\nconst defaultColonOptions = {\n colSize: 0,\n minSize: 0,\n maxSize: Infinity,\n pad: 'right',\n padChar: '0',\n};\n\n/**\n * Create a string of spaces of a given length.\n *\n * @param colSize - The length of the string to create.\n * @returns A string of spaces.\n */\nexport const colon = (\n text: string | string[],\n options?: {\n colSize?: number | number[] | string | string[];\n minSize?: number;\n maxSize?: number;\n pad?: 'left' | 'right';\n padChar?: string;\n }\n): string =>\n [text]\n .flat()\n .map((text) => {\n const { colSize, minSize, maxSize, pad } = {\n ...defaultColonOptions,\n ...(options ?? {}),\n };\n\n const length = getLength(colSize);\n const spacesLength = Math.max(\n minSize!,\n Math.min(maxSize!, length - removeColor(text).length)\n );\n\n if (pad === 'left') {\n return `${' '.repeat(spacesLength)}${text}`;\n }\n\n return `${text}${' '.repeat(spacesLength)}`;\n })\n .join('');\n\nexport const x = colorize('✗', ANSIColors.RED);\nexport const v = colorize('✓', ANSIColors.GREEN);\nexport const clock = colorize('⏲', ANSIColors.BLUE);\n"],"mappings":"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"}
1
+ {"version":3,"file":"logger.mjs","names":["ANSIColors.RESET","ANSIColors.GREEN","ANSIColors.BEIGE","ANSIColors.GREY","ANSIColors.BLUE","ANSIColors.RED"],"sources":["../../src/logger.ts"],"sourcesContent":["import type { Locale } from '@intlayer/types/allLocales';\nimport type { CustomIntlayerConfig } from '@intlayer/types/config';\nimport * as ANSIColors from './colors';\n\nexport type ANSIColorsType = (typeof ANSIColors)[keyof typeof ANSIColors];\n\nexport type Details = {\n isVerbose?: boolean;\n level?: 'info' | 'warn' | 'error' | 'debug';\n config?: CustomIntlayerConfig['log'];\n};\n\nexport type Logger = (content: any, details?: Details) => void;\n\nlet loggerPrefix: string | undefined;\n\nexport const setPrefix = (prefix: string | undefined) => {\n loggerPrefix = prefix;\n};\n\nexport const getPrefix = (configPrefix?: string): string | undefined => {\n if (typeof loggerPrefix !== 'undefined') {\n return loggerPrefix;\n }\n\n return configPrefix;\n};\n\nexport const logger: Logger = (content, details) => {\n const isVerbose = details?.isVerbose ?? false;\n const mode = details?.config?.mode ?? 'default';\n const level = details?.level ?? 'info';\n const prefix = getPrefix(details?.config?.prefix);\n const log = details?.config?.log ?? console.log;\n const info = details?.config?.info ?? console.info;\n const warn = details?.config?.warn ?? console.warn;\n const error = details?.config?.error ?? console.error;\n const debug = details?.config?.debug ?? console.debug;\n\n if (mode === 'disabled') return;\n\n if (isVerbose && mode !== 'verbose') return;\n\n const flatContent = prefix ? [prefix, ...[content].flat()] : [content].flat();\n\n if (level === 'debug') {\n return debug(...flatContent);\n }\n\n if (level === 'info') {\n return info(...flatContent);\n }\n\n if (level === 'warn') {\n return warn(...flatContent);\n }\n\n if (level === 'error') {\n return error(...flatContent);\n }\n\n log(...flatContent);\n};\n\nexport const spinnerFrames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\n/**\n * The appLogger function takes the logger and merges it with the configuration from the intlayer config file.\n * It allows overriding the default configuration by passing a config object in the details parameter.\n * The configuration is merged with the default configuration from the intlayer config file.\n */\nexport const getAppLogger =\n (configuration?: CustomIntlayerConfig, globalDetails?: Details) =>\n (content: any, details?: Details) =>\n logger(content, {\n ...(details ?? {}),\n config: {\n ...configuration?.log,\n ...globalDetails?.config,\n ...(details?.config ?? {}),\n },\n });\n\nexport const colorize = (\n s: string,\n color?: ANSIColorsType,\n reset?: boolean | ANSIColorsType\n): string =>\n color\n ? `${color}${s}${reset ? (typeof reset === 'boolean' ? ANSIColors.RESET : reset) : ANSIColors.RESET}`\n : s;\n\nexport const colorizeLocales = (\n locales: Locale | Locale[],\n color: ANSIColorsType = ANSIColors.GREEN,\n reset: boolean | ANSIColorsType = ANSIColors.RESET\n) =>\n [locales]\n .flat()\n .map((locale) => colorize(locale, color, reset))\n .join(`, `);\n\nexport const colorizeKey = (\n keyPath: string | string[],\n color: ANSIColorsType = ANSIColors.BEIGE,\n reset: boolean | ANSIColorsType = ANSIColors.RESET\n) =>\n [keyPath]\n .flat()\n .map((key) => colorize(key, color, reset))\n .join(`, `);\n\nexport const colorizePath = (\n path: string | string[],\n color: ANSIColorsType = ANSIColors.GREY,\n reset: boolean | ANSIColorsType = ANSIColors.RESET\n) =>\n [path]\n .flat()\n .map((path) => colorize(path, color, reset))\n .join(`, `);\n\n/**\n * Colorize numeric value using Intl.NumberFormat and optional ANSI colors.\n *\n * Examples:\n * colorizeNumber(2, [{ pluralRule: 'one' , color: ANSIColors.GREEN}, { pluralRule: 'other' , color: ANSIColors.RED}]) // \"'\\x1b[31m2\\x1b[0m\"\n */\nexport const colorizeNumber = (\n number: number | string,\n options: Partial<Record<Intl.LDMLPluralRule, ANSIColorsType>> = {\n zero: ANSIColors.BLUE,\n one: ANSIColors.BLUE,\n two: ANSIColors.BLUE,\n few: ANSIColors.BLUE,\n many: ANSIColors.BLUE,\n other: ANSIColors.BLUE,\n }\n): string => {\n if (number === 0) {\n const color = options.zero ?? ANSIColors.GREEN;\n return colorize(number.toString(), color);\n }\n\n const rule = new Intl.PluralRules('en').select(Number(number));\n const color = options[rule];\n return colorize(number.toString(), color);\n};\n\nexport const removeColor = (text: string) =>\n // biome-ignore lint/suspicious/noControlCharactersInRegex: we need to remove the color codes\n text.replace(/\\x1b\\[[0-9;]*m/g, '');\n\nconst getLength = (length: number | number[] | string | string[]): number => {\n let value: number = 0;\n if (typeof length === 'number') {\n value = length;\n }\n if (typeof length === 'string') {\n value = length.length;\n }\n if (Array.isArray(length) && length.every((l) => typeof l === 'string')) {\n value = Math.max(...length.map((str) => str.length));\n }\n if (Array.isArray(length) && length.every((l) => typeof l === 'number')) {\n value = Math.max(...length);\n }\n return Math.max(value, 0);\n};\n\nconst defaultColonOptions = {\n colSize: 0,\n minSize: 0,\n maxSize: Infinity,\n pad: 'right',\n padChar: '0',\n};\n\n/**\n * Create a string of spaces of a given length.\n *\n * @param colSize - The length of the string to create.\n * @returns A string of spaces.\n */\nexport const colon = (\n text: string | string[],\n options?: {\n colSize?: number | number[] | string | string[];\n minSize?: number;\n maxSize?: number;\n pad?: 'left' | 'right';\n padChar?: string;\n }\n): string =>\n [text]\n .flat()\n .map((text) => {\n const { colSize, minSize, maxSize, pad } = {\n ...defaultColonOptions,\n ...(options ?? {}),\n };\n\n const length = getLength(colSize);\n const spacesLength = Math.max(\n minSize!,\n Math.min(maxSize!, length - removeColor(text).length)\n );\n\n if (pad === 'left') {\n return `${' '.repeat(spacesLength)}${text}`;\n }\n\n return `${text}${' '.repeat(spacesLength)}`;\n })\n .join('');\n\nexport const x = colorize('✗', ANSIColors.RED);\nexport const v = colorize('✓', ANSIColors.GREEN);\nexport const clock = colorize('⏲', ANSIColors.BLUE);\n"],"mappings":"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"}
package/dist/esm/node.mjs CHANGED
@@ -1 +1,6 @@
1
- import{buildConfigurationFields as e}from"./configFile/buildConfigurationFields.mjs";import{aiSchema as t,buildSchema as n,compilerSchema as r,contentSchema as i,cookiesAttributesSchema as a,dictionarySchema as o,editorSchema as s,internationalizationSchema as c,intlayerConfigSchema as l,logSchema as u,rewriteObjectSchema as d,rewriteRuleSchema as f,rewriteRulesSchema as p,routingSchema as m,storageAttributesSchema as h,storageSchema as g,systemSchema as _}from"./configFile/configurationSchema.mjs";import{configurationFilesCandidates as v,searchConfigurationFile as y}from"./configFile/searchConfigurationFile.mjs";import{getConfiguration as b,getConfigurationAndFilePath as x}from"./configFile/getConfiguration.mjs";export{t as aiSchema,e as buildConfigurationFields,n as buildSchema,r as compilerSchema,v as configurationFilesCandidates,i as contentSchema,a as cookiesAttributesSchema,o as dictionarySchema,s as editorSchema,b as getConfiguration,x as getConfigurationAndFilePath,c as internationalizationSchema,l as intlayerConfigSchema,u as logSchema,d as rewriteObjectSchema,f as rewriteRuleSchema,p as rewriteRulesSchema,m as routingSchema,y as searchConfigurationFile,h as storageAttributesSchema,g as storageSchema,_ as systemSchema};
1
+ import { aiSchema, buildSchema, compilerSchema, contentSchema, cookiesAttributesSchema, dictionarySchema, editorSchema, internationalizationSchema, intlayerConfigSchema, logSchema, rewriteObjectSchema, rewriteRuleSchema, rewriteRulesSchema, routingSchema, storageAttributesSchema, storageSchema, systemSchema } from "./configFile/configurationSchema.mjs";
2
+ import { buildConfigurationFields } from "./configFile/buildConfigurationFields.mjs";
3
+ import { configurationFilesCandidates, searchConfigurationFile } from "./configFile/searchConfigurationFile.mjs";
4
+ import { getConfiguration, getConfigurationAndFilePath } from "./configFile/getConfiguration.mjs";
5
+
6
+ export { aiSchema, buildConfigurationFields, buildSchema, compilerSchema, configurationFilesCandidates, contentSchema, cookiesAttributesSchema, dictionarySchema, editorSchema, getConfiguration, getConfigurationAndFilePath, internationalizationSchema, intlayerConfigSchema, logSchema, rewriteObjectSchema, rewriteRuleSchema, rewriteRulesSchema, routingSchema, searchConfigurationFile, storageAttributesSchema, storageSchema, systemSchema };
@@ -1 +1,25 @@
1
- import{n as e,r as t,t as n}from"../ESMxCJSHelpers-BAuqwNXV.mjs";export{n as configESMxCJSRequire,e as getProjectRequire,t as isESModule};
1
+ import { __require } from "../_virtual/_rolldown/runtime.mjs";
2
+ import { getPackageJsonPath } from "./getPackageJsonPath.mjs";
3
+ import { createRequire } from "node:module";
4
+
5
+ //#region src/utils/ESMxCJSHelpers.ts
6
+ const isESModule = typeof import.meta.url === "string";
7
+ /**
8
+ * Require relative to the user project
9
+ *
10
+ * Note: Can resolve package that are installed in the user project, ex `'intlayer'`
11
+ */
12
+ const getProjectRequire = (startDir) => {
13
+ const { packageJsonPath } = getPackageJsonPath(startDir);
14
+ return createRequire(packageJsonPath);
15
+ };
16
+ /**
17
+ * Require relative to the @intlayer/config package
18
+ *
19
+ * Note: Can resolve package that are installed in the config package, ex `'@intlayer/types'`
20
+ */
21
+ const configESMxCJSRequire = isESModule ? createRequire(import.meta.url) : __require;
22
+
23
+ //#endregion
24
+ export { configESMxCJSRequire, getProjectRequire, isESModule };
25
+ //# sourceMappingURL=ESMxCJSHelpers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ESMxCJSHelpers.mjs","names":[],"sources":["../../../src/utils/ESMxCJSHelpers.ts"],"sourcesContent":["import { createRequire } from 'node:module';\nimport { getPackageJsonPath } from './getPackageJsonPath';\n\nexport const isESModule = typeof import.meta.url === 'string';\n\n/**\n * Require relative to the user project\n *\n * Note: Can resolve package that are installed in the user project, ex `'intlayer'`\n */\nexport const getProjectRequire = (startDir?: string): NodeJS.Require => {\n // Can fail on VSCode extensions\n const { packageJsonPath } = getPackageJsonPath(startDir);\n\n return createRequire(packageJsonPath);\n};\n\n/**\n * Require relative to the @intlayer/config package\n *\n * Note: Can resolve package that are installed in the config package, ex `'@intlayer/types'`\n */\nexport const configESMxCJSRequire: NodeJS.Require = isESModule\n ? createRequire(import.meta.url)\n : require;\n"],"mappings":";;;;;AAGA,MAAa,aAAa,OAAO,OAAO,KAAK,QAAQ;;;;;;AAOrD,MAAa,qBAAqB,aAAsC;CAEtE,MAAM,EAAE,oBAAoB,mBAAmB,SAAS;AAExD,QAAO,cAAc,gBAAgB;;;;;;;AAQvC,MAAa,uBAAuC,aAChD,cAAc,OAAO,KAAK,IAAI"}
@@ -1,2 +1,28 @@
1
- import{getExtension as e}from"./getExtension.mjs";import{normalizePath as t}from"./normalizePath.mjs";import{join as n,relative as r}from"node:path";const i=({configuration:i,format:a,formatter:o=e=>e})=>{let s=e(i,a??i.build.outputFormat[0]??`esm`),{baseDir:c}=i.system,{mainDir:l,configDir:u}=i.system,d=o(t(r(c,n(l,`dictionaries.${s}`)))),f=o(t(r(c,n(l,`unmerged_dictionaries.${s}`)))),p=o(t(r(c,n(l,`remote_dictionaries.${s}`)))),m=o(t(r(c,n(l,`dynamic_dictionaries.${s}`)))),h=o(t(r(c,n(l,`fetch_dictionaries.${s}`)))),g=o(t(r(c,n(u,`configuration.json`))));return{"@intlayer/dictionaries-entry":d,"@intlayer/unmerged-dictionaries-entry":f,"@intlayer/remote-dictionaries-entry":p,"@intlayer/dynamic-dictionaries-entry":m,"@intlayer/fetch-dictionaries-entry":h,"@intlayer/config/built":g}};export{i as getAlias};
1
+ import { getExtension } from "./getExtension.mjs";
2
+ import { normalizePath } from "./normalizePath.mjs";
3
+ import { join, relative } from "node:path";
4
+
5
+ //#region src/utils/alias.ts
6
+ const getAlias = ({ configuration, format, formatter = (value) => value }) => {
7
+ const extension = getExtension(configuration, format ?? configuration.build.outputFormat[0] ?? "esm");
8
+ const { baseDir } = configuration.system;
9
+ const { mainDir, configDir } = configuration.system;
10
+ const fixedDictionariesPath = formatter(normalizePath(relative(baseDir, join(mainDir, `dictionaries.${extension}`))));
11
+ const fixedUnmergedDictionariesPath = formatter(normalizePath(relative(baseDir, join(mainDir, `unmerged_dictionaries.${extension}`))));
12
+ const fixedRemoteDictionariesPath = formatter(normalizePath(relative(baseDir, join(mainDir, `remote_dictionaries.${extension}`))));
13
+ const fixedDynamicDictionariesPath = formatter(normalizePath(relative(baseDir, join(mainDir, `dynamic_dictionaries.${extension}`))));
14
+ const fixedFetchDictionariesPath = formatter(normalizePath(relative(baseDir, join(mainDir, `fetch_dictionaries.${extension}`))));
15
+ const fixedConfigurationPath = formatter(normalizePath(relative(baseDir, join(configDir, `configuration.json`))));
16
+ return {
17
+ "@intlayer/dictionaries-entry": fixedDictionariesPath,
18
+ "@intlayer/unmerged-dictionaries-entry": fixedUnmergedDictionariesPath,
19
+ "@intlayer/remote-dictionaries-entry": fixedRemoteDictionariesPath,
20
+ "@intlayer/dynamic-dictionaries-entry": fixedDynamicDictionariesPath,
21
+ "@intlayer/fetch-dictionaries-entry": fixedFetchDictionariesPath,
22
+ "@intlayer/config/built": fixedConfigurationPath
23
+ };
24
+ };
25
+
26
+ //#endregion
27
+ export { getAlias };
2
28
  //# sourceMappingURL=alias.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"alias.mjs","names":[],"sources":["../../../src/utils/alias.ts"],"sourcesContent":["import { join, relative } from 'node:path';\nimport type { IntlayerConfig } from '@intlayer/types/config';\nimport { getExtension } from './getExtension';\nimport { normalizePath } from './normalizePath';\n\nexport type GetAliasOptions = {\n configuration: IntlayerConfig;\n format?: 'esm' | 'cjs';\n formatter?: (value: string) => string;\n};\n\nexport const getAlias = ({\n configuration,\n format,\n formatter = (value: string) => value,\n}: GetAliasOptions) => {\n const extension = getExtension(\n configuration,\n format ?? configuration.build.outputFormat[0] ?? 'esm'\n );\n\n const { baseDir } = configuration.system;\n const { mainDir, configDir } = configuration.system;\n\n /**\n * Dictionaries\n */\n const dictionariesPath = join(mainDir, `dictionaries.${extension}`);\n const relativeDictionariesPath = relative(baseDir, dictionariesPath);\n const fixedDictionariesPath = formatter(\n normalizePath(relativeDictionariesPath)\n );\n\n /**\n * Unmerged dictionaries\n */\n const unmergedDictionariesPath = join(\n mainDir,\n `unmerged_dictionaries.${extension}`\n );\n const relativeUnmergedDictionariesPath = relative(\n baseDir,\n unmergedDictionariesPath\n );\n const fixedUnmergedDictionariesPath = formatter(\n normalizePath(relativeUnmergedDictionariesPath)\n );\n\n /**\n * Remote dictionaries\n */\n const remoteDictionariesPath = join(\n mainDir,\n `remote_dictionaries.${extension}`\n );\n const relativeRemoteDictionariesPath = relative(\n baseDir,\n remoteDictionariesPath\n );\n const fixedRemoteDictionariesPath = formatter(\n normalizePath(relativeRemoteDictionariesPath)\n );\n\n /**\n * Dynamic dictionaries\n */\n const dynamicDictionariesPath = join(\n mainDir,\n `dynamic_dictionaries.${extension}`\n );\n const relativeDynamicDictionariesPath = relative(\n baseDir,\n dynamicDictionariesPath\n );\n const fixedDynamicDictionariesPath = formatter(\n normalizePath(relativeDynamicDictionariesPath)\n );\n\n /**\n * Fetch dictionaries\n */\n const fetchDictionariesPath = join(\n mainDir,\n `fetch_dictionaries.${extension}`\n );\n const relativeFetchDictionariesPath = relative(\n baseDir,\n fetchDictionariesPath\n );\n const fixedFetchDictionariesPath = formatter(\n normalizePath(relativeFetchDictionariesPath)\n );\n\n /**\n * Configuration\n */\n const configurationPath = join(configDir, `configuration.json`);\n const relativeConfigurationPath = relative(baseDir, configurationPath);\n const fixedConfigurationPath = formatter(\n normalizePath(relativeConfigurationPath)\n );\n\n return {\n '@intlayer/dictionaries-entry': fixedDictionariesPath,\n '@intlayer/unmerged-dictionaries-entry': fixedUnmergedDictionariesPath,\n '@intlayer/remote-dictionaries-entry': fixedRemoteDictionariesPath,\n '@intlayer/dynamic-dictionaries-entry': fixedDynamicDictionariesPath,\n '@intlayer/fetch-dictionaries-entry': fixedFetchDictionariesPath,\n '@intlayer/config/built': fixedConfigurationPath,\n } as const;\n};\n"],"mappings":"qJAWA,MAAa,GAAY,CACvB,gBACA,SACA,YAAa,GAAkB,KACV,CACrB,IAAM,EAAY,EAChB,EACA,GAAU,EAAc,MAAM,aAAa,IAAM,MAClD,CAEK,CAAE,WAAY,EAAc,OAC5B,CAAE,UAAS,aAAc,EAAc,OAOvC,EAAwB,EAC5B,EAF+B,EAAS,EADjB,EAAK,EAAS,gBAAgB,IAAY,CACC,CAE3B,CACxC,CAaK,EAAgC,EACpC,EALuC,EACvC,EAL+B,EAC/B,EACA,yBAAyB,IAC1B,CAIA,CAEgD,CAChD,CAaK,EAA8B,EAClC,EALqC,EACrC,EAL6B,EAC7B,EACA,uBAAuB,IACxB,CAIA,CAE8C,CAC9C,CAaK,EAA+B,EACnC,EALsC,EACtC,EAL8B,EAC9B,EACA,wBAAwB,IACzB,CAIA,CAE+C,CAC/C,CAaK,EAA6B,EACjC,EALoC,EACpC,EAL4B,EAC5B,EACA,sBAAsB,IACvB,CAIA,CAE6C,CAC7C,CAOK,EAAyB,EAC7B,EAFgC,EAAS,EADjB,EAAK,EAAW,qBAAqB,CACO,CAE5B,CACzC,CAED,MAAO,CACL,+BAAgC,EAChC,wCAAyC,EACzC,sCAAuC,EACvC,uCAAwC,EACxC,qCAAsC,EACtC,yBAA0B,EAC3B"}
1
+ {"version":3,"file":"alias.mjs","names":[],"sources":["../../../src/utils/alias.ts"],"sourcesContent":["import { join, relative } from 'node:path';\nimport type { IntlayerConfig } from '@intlayer/types/config';\nimport { getExtension } from './getExtension';\nimport { normalizePath } from './normalizePath';\n\nexport type GetAliasOptions = {\n configuration: IntlayerConfig;\n format?: 'esm' | 'cjs';\n formatter?: (value: string) => string;\n};\n\nexport const getAlias = ({\n configuration,\n format,\n formatter = (value: string) => value,\n}: GetAliasOptions) => {\n const extension = getExtension(\n configuration,\n format ?? configuration.build.outputFormat[0] ?? 'esm'\n );\n\n const { baseDir } = configuration.system;\n const { mainDir, configDir } = configuration.system;\n\n /**\n * Dictionaries\n */\n const dictionariesPath = join(mainDir, `dictionaries.${extension}`);\n const relativeDictionariesPath = relative(baseDir, dictionariesPath);\n const fixedDictionariesPath = formatter(\n normalizePath(relativeDictionariesPath)\n );\n\n /**\n * Unmerged dictionaries\n */\n const unmergedDictionariesPath = join(\n mainDir,\n `unmerged_dictionaries.${extension}`\n );\n const relativeUnmergedDictionariesPath = relative(\n baseDir,\n unmergedDictionariesPath\n );\n const fixedUnmergedDictionariesPath = formatter(\n normalizePath(relativeUnmergedDictionariesPath)\n );\n\n /**\n * Remote dictionaries\n */\n const remoteDictionariesPath = join(\n mainDir,\n `remote_dictionaries.${extension}`\n );\n const relativeRemoteDictionariesPath = relative(\n baseDir,\n remoteDictionariesPath\n );\n const fixedRemoteDictionariesPath = formatter(\n normalizePath(relativeRemoteDictionariesPath)\n );\n\n /**\n * Dynamic dictionaries\n */\n const dynamicDictionariesPath = join(\n mainDir,\n `dynamic_dictionaries.${extension}`\n );\n const relativeDynamicDictionariesPath = relative(\n baseDir,\n dynamicDictionariesPath\n );\n const fixedDynamicDictionariesPath = formatter(\n normalizePath(relativeDynamicDictionariesPath)\n );\n\n /**\n * Fetch dictionaries\n */\n const fetchDictionariesPath = join(\n mainDir,\n `fetch_dictionaries.${extension}`\n );\n const relativeFetchDictionariesPath = relative(\n baseDir,\n fetchDictionariesPath\n );\n const fixedFetchDictionariesPath = formatter(\n normalizePath(relativeFetchDictionariesPath)\n );\n\n /**\n * Configuration\n */\n const configurationPath = join(configDir, `configuration.json`);\n const relativeConfigurationPath = relative(baseDir, configurationPath);\n const fixedConfigurationPath = formatter(\n normalizePath(relativeConfigurationPath)\n );\n\n return {\n '@intlayer/dictionaries-entry': fixedDictionariesPath,\n '@intlayer/unmerged-dictionaries-entry': fixedUnmergedDictionariesPath,\n '@intlayer/remote-dictionaries-entry': fixedRemoteDictionariesPath,\n '@intlayer/dynamic-dictionaries-entry': fixedDynamicDictionariesPath,\n '@intlayer/fetch-dictionaries-entry': fixedFetchDictionariesPath,\n '@intlayer/config/built': fixedConfigurationPath,\n } as const;\n};\n"],"mappings":";;;;;AAWA,MAAa,YAAY,EACvB,eACA,QACA,aAAa,UAAkB,YACV;CACrB,MAAM,YAAY,aAChB,eACA,UAAU,cAAc,MAAM,aAAa,MAAM,MAClD;CAED,MAAM,EAAE,YAAY,cAAc;CAClC,MAAM,EAAE,SAAS,cAAc,cAAc;CAO7C,MAAM,wBAAwB,UAC5B,cAF+B,SAAS,SADjB,KAAK,SAAS,gBAAgB,YAAY,CACC,CAE3B,CACxC;CAaD,MAAM,gCAAgC,UACpC,cALuC,SACvC,SAL+B,KAC/B,SACA,yBAAyB,YAC1B,CAIA,CAEgD,CAChD;CAaD,MAAM,8BAA8B,UAClC,cALqC,SACrC,SAL6B,KAC7B,SACA,uBAAuB,YACxB,CAIA,CAE8C,CAC9C;CAaD,MAAM,+BAA+B,UACnC,cALsC,SACtC,SAL8B,KAC9B,SACA,wBAAwB,YACzB,CAIA,CAE+C,CAC/C;CAaD,MAAM,6BAA6B,UACjC,cALoC,SACpC,SAL4B,KAC5B,SACA,sBAAsB,YACvB,CAIA,CAE6C,CAC7C;CAOD,MAAM,yBAAyB,UAC7B,cAFgC,SAAS,SADjB,KAAK,WAAW,qBAAqB,CACO,CAE5B,CACzC;AAED,QAAO;EACL,gCAAgC;EAChC,yCAAyC;EACzC,uCAAuC;EACvC,wCAAwC;EACxC,sCAAsC;EACtC,0BAA0B;EAC3B"}
@@ -1,2 +1,171 @@
1
- import{clearAllCache as e,computeKeyId as t}from"./cacheMemory.mjs";import{basename as n,dirname as r,join as i}from"node:path";import a from"@intlayer/types/package.json"with{type:"json"};import{mkdir as o,readFile as s,rename as c,rm as l,stat as u,unlink as d,writeFile as f}from"node:fs/promises";import{deserialize as p,serialize as m}from"node:v8";import{gunzipSync as h,gzipSync as g}from"node:zlib";const _={compress:!0},v=async e=>{await o(e,{recursive:!0})},y=async(e,t,r)=>{if(r)try{await v(r)}catch{}let a=`${n(e)}.tmp-${process.pid}-${Math.random().toString(36).slice(2)}`,o=r?i(r,a):`${e}.tmp-${process.pid}-${Math.random().toString(36).slice(2)}`;try{await f(o,t),await c(o,e)}catch(e){try{await l(o,{force:!0})}catch{}throw e}},b=(e,t)=>t===!0||t!==!1&&e.byteLength>1024,x=(e,t,n)=>i(e,n?i(n,t):t),S=new Map,C=(n,c,f)=>{let{cacheDir:C,tempDir:w}=n.system,T=n.build.cache??!0,E=f?.persistent===!0||f?.persistent===void 0&&T,{compress:D,ttlMs:O,maxTimeMs:k,namespace:A}={..._,...f},j=t(c),M=x(C,j,A),N=async()=>{try{let e=await u(M).catch(()=>void 0);if(!e||typeof O==`number`&&O>0&&Date.now()-e.mtimeMs>O)return;let t=await s(M),n=t[0];t=t.subarray(1);let r=p(n===1?h(t):t),i,o=r;if(o&&typeof o==`object`&&typeof o.version==`string`&&typeof o.timestamp==`number`&&Object.hasOwn(o,`data`)){let e=o;if(e.version!==a.version){try{await d(M)}catch{}return}if(typeof k==`number`&&k>0&&Date.now()-e.timestamp>k){try{await d(M)}catch{}return}i=e.data}else{if(typeof k==`number`&&k>0&&Date.now()-e.mtimeMs>k){try{await d(M)}catch{}return}i=r}return S.set(j,i),i}catch{return}},P=async e=>{try{await v(r(M));let t={version:a.version,timestamp:Date.now(),data:e},n=Buffer.from(m(t)),i=b(n,D)?g(n):n;await y(M,Buffer.concat([Buffer.from([i===n?0:1]),i]),w)}catch{}};return{get:async()=>{let e=S.get(j);if(e!==void 0)return e;if(E&&T)return await N()},set:async e=>{S.set(j,e),E&&T&&await P(e)},clear:async()=>{S.delete(j);try{await d(M)}catch{}},clearAll:async()=>{if(e(),E&&T){let e=A?i(C,A):C;try{await l(e,{recursive:!0,force:!0})}catch{}try{await o(e,{recursive:!0})}catch{}}},isValid:async()=>{if(S.get(j)!==void 0)return!0;if(!E||!T)return!1;try{let e=await u(M).catch(()=>void 0);if(!e||typeof O==`number`&&O>0&&Date.now()-e.mtimeMs>O)return!1;let t=await s(M),n=t[0];t=t.subarray(1);let r=p(n===1?h(t):t);if(r&&typeof r==`object`&&typeof r.version==`string`&&typeof r.timestamp==`number`&&Object.hasOwn(r,`data`)){let e=r;return!(e.version!==a.version||typeof k==`number`&&k>0&&Date.now()-e.timestamp>k)}return!(typeof k==`number`&&k>0&&Date.now()-e.mtimeMs>k)}catch{return!1}},id:j,filePath:M}};export{C as cacheDisk};
1
+ import { clearAllCache, computeKeyId } from "./cacheMemory.mjs";
2
+ import { basename, dirname, join } from "node:path";
3
+ import packageJson from "@intlayer/types/package.json" with { type: "json" };
4
+ import { mkdir, readFile, rename, rm, stat, unlink, writeFile } from "node:fs/promises";
5
+ import { deserialize, serialize } from "node:v8";
6
+ import { gunzipSync, gzipSync } from "node:zlib";
7
+
8
+ //#region src/utils/cacheDisk.ts
9
+ const DEFAULTS = { compress: true };
10
+ const ensureDir = async (dir) => {
11
+ await mkdir(dir, { recursive: true });
12
+ };
13
+ const atomicWriteFile = async (file, data, tempDir) => {
14
+ if (tempDir) try {
15
+ await ensureDir(tempDir);
16
+ } catch {}
17
+ const tempFileName = `${basename(file)}.tmp-${process.pid}-${Math.random().toString(36).slice(2)}`;
18
+ const tmp = tempDir ? join(tempDir, tempFileName) : `${file}.tmp-${process.pid}-${Math.random().toString(36).slice(2)}`;
19
+ try {
20
+ await writeFile(tmp, data);
21
+ await rename(tmp, file);
22
+ } catch (error) {
23
+ try {
24
+ await rm(tmp, { force: true });
25
+ } catch {}
26
+ throw error;
27
+ }
28
+ };
29
+ const shouldUseCompression = (buf, force) => force === true || force !== false && buf.byteLength > 1024;
30
+ /** Derive on-disk path from config dir + namespace + key id. */
31
+ const cachePath = (cacheDir, id, ns) => join(cacheDir, ns ? join(ns, id) : id);
32
+ /** ------------------------- Local cache facade ------------------------- **/
33
+ const cacheMap = /* @__PURE__ */ new Map();
34
+ const cacheDisk = (intlayerConfig, keys, options) => {
35
+ const { cacheDir, tempDir } = intlayerConfig.system;
36
+ const buildCacheEnabled = intlayerConfig.build.cache ?? true;
37
+ const persistent = options?.persistent === true || typeof options?.persistent === "undefined" && buildCacheEnabled;
38
+ const { compress, ttlMs, maxTimeMs, namespace } = {
39
+ ...DEFAULTS,
40
+ ...options
41
+ };
42
+ const id = computeKeyId(keys);
43
+ const filePath = cachePath(cacheDir, id, namespace);
44
+ const readFromDisk = async () => {
45
+ try {
46
+ const statValue = await stat(filePath).catch(() => void 0);
47
+ if (!statValue) return void 0;
48
+ if (typeof ttlMs === "number" && ttlMs > 0) {
49
+ if (Date.now() - statValue.mtimeMs > ttlMs) return void 0;
50
+ }
51
+ let raw = await readFile(filePath);
52
+ const flag = raw[0];
53
+ raw = raw.subarray(1);
54
+ const deserialized = deserialize(flag === 1 ? gunzipSync(raw) : raw);
55
+ let value;
56
+ const maybeObj = deserialized;
57
+ if (!!maybeObj && typeof maybeObj === "object" && typeof maybeObj.version === "string" && typeof maybeObj.timestamp === "number" && Object.hasOwn(maybeObj, "data")) {
58
+ const entry = maybeObj;
59
+ if (entry.version !== packageJson.version) {
60
+ try {
61
+ await unlink(filePath);
62
+ } catch {}
63
+ return;
64
+ }
65
+ if (typeof maxTimeMs === "number" && maxTimeMs > 0) {
66
+ if (Date.now() - entry.timestamp > maxTimeMs) {
67
+ try {
68
+ await unlink(filePath);
69
+ } catch {}
70
+ return;
71
+ }
72
+ }
73
+ value = entry.data;
74
+ } else {
75
+ if (typeof maxTimeMs === "number" && maxTimeMs > 0) {
76
+ if (Date.now() - statValue.mtimeMs > maxTimeMs) {
77
+ try {
78
+ await unlink(filePath);
79
+ } catch {}
80
+ return;
81
+ }
82
+ }
83
+ value = deserialized;
84
+ }
85
+ cacheMap.set(id, value);
86
+ return value;
87
+ } catch {
88
+ return;
89
+ }
90
+ };
91
+ const writeToDisk = async (value) => {
92
+ try {
93
+ await ensureDir(dirname(filePath));
94
+ const envelope = {
95
+ version: packageJson.version,
96
+ timestamp: Date.now(),
97
+ data: value
98
+ };
99
+ const payload = Buffer.from(serialize(envelope));
100
+ const gz = shouldUseCompression(payload, compress) ? gzipSync(payload) : payload;
101
+ await atomicWriteFile(filePath, Buffer.concat([Buffer.from([gz === payload ? 0 : 1]), gz]), tempDir);
102
+ } catch {}
103
+ };
104
+ return {
105
+ get: async () => {
106
+ const mem = cacheMap.get(id);
107
+ if (mem !== void 0) return mem;
108
+ if (persistent && buildCacheEnabled) return await readFromDisk();
109
+ },
110
+ set: async (value) => {
111
+ cacheMap.set(id, value);
112
+ if (persistent && buildCacheEnabled) await writeToDisk(value);
113
+ },
114
+ clear: async () => {
115
+ cacheMap.delete(id);
116
+ try {
117
+ await unlink(filePath);
118
+ } catch {}
119
+ },
120
+ clearAll: async () => {
121
+ clearAllCache();
122
+ if (persistent && buildCacheEnabled) {
123
+ const base = namespace ? join(cacheDir, namespace) : cacheDir;
124
+ try {
125
+ await rm(base, {
126
+ recursive: true,
127
+ force: true
128
+ });
129
+ } catch {}
130
+ try {
131
+ await mkdir(base, { recursive: true });
132
+ } catch {}
133
+ }
134
+ },
135
+ isValid: async () => {
136
+ if (cacheMap.get(id) !== void 0) return true;
137
+ if (!persistent || !buildCacheEnabled) return false;
138
+ try {
139
+ const statValue = await stat(filePath).catch(() => void 0);
140
+ if (!statValue) return false;
141
+ if (typeof ttlMs === "number" && ttlMs > 0) {
142
+ if (Date.now() - statValue.mtimeMs > ttlMs) return false;
143
+ }
144
+ let raw = await readFile(filePath);
145
+ const flag = raw[0];
146
+ raw = raw.subarray(1);
147
+ const maybeObj = deserialize(flag === 1 ? gunzipSync(raw) : raw);
148
+ if (!!maybeObj && typeof maybeObj === "object" && typeof maybeObj.version === "string" && typeof maybeObj.timestamp === "number" && Object.hasOwn(maybeObj, "data")) {
149
+ const entry = maybeObj;
150
+ if (entry.version !== packageJson.version) return false;
151
+ if (typeof maxTimeMs === "number" && maxTimeMs > 0) {
152
+ if (Date.now() - entry.timestamp > maxTimeMs) return false;
153
+ }
154
+ return true;
155
+ }
156
+ if (typeof maxTimeMs === "number" && maxTimeMs > 0) {
157
+ if (Date.now() - statValue.mtimeMs > maxTimeMs) return false;
158
+ }
159
+ return true;
160
+ } catch {
161
+ return false;
162
+ }
163
+ },
164
+ id,
165
+ filePath
166
+ };
167
+ };
168
+
169
+ //#endregion
170
+ export { cacheDisk };
2
171
  //# sourceMappingURL=cacheDisk.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cacheDisk.mjs","names":["configPackageJson"],"sources":["../../../src/utils/cacheDisk.ts"],"sourcesContent":["import {\n mkdir,\n readFile,\n rename,\n rm,\n stat,\n unlink,\n writeFile,\n} from 'node:fs/promises';\nimport { basename, dirname, join } from 'node:path';\nimport { deserialize, serialize } from 'node:v8';\nimport { gunzipSync, gzipSync } from 'node:zlib';\nimport type { IntlayerConfig } from '@intlayer/types/config';\nimport configPackageJson from '@intlayer/types/package.json' with {\n type: 'json',\n};\nimport { type CacheKey, clearAllCache, computeKeyId } from './cacheMemory';\n\n/** ------------------------- Persistence layer ------------------------- **/\n\n/** Cache envelope structure stored on disk */\ntype CacheEnvelope = {\n /** Version of the config package (for cache invalidation) */\n version: string;\n /** Timestamp when the cache entry was created (in milliseconds) */\n timestamp: number;\n /** Data payload (the actual cached value) */\n data: unknown;\n};\n\ntype LocalCacheOptions = {\n /** Preferred new option name */\n persistent?: boolean;\n /** Time-to-live in ms; if expired, disk entry is ignored. */\n ttlMs?: number;\n /** Max age in ms based on stored creation timestamp; invalidates on exceed. */\n maxTimeMs?: number;\n /** Optional namespace to separate different logical caches. */\n namespace?: string;\n /** Gzip values on disk (on by default for blobs > 1KB). */\n compress?: boolean;\n};\n\nconst DEFAULTS: Required<Pick<LocalCacheOptions, 'compress'>> = {\n compress: true,\n};\n\nconst ensureDir = async (dir: string) => {\n await mkdir(dir, { recursive: true });\n};\n\nconst atomicWriteFile = async (\n file: string,\n data: Buffer,\n tempDir?: string\n) => {\n if (tempDir) {\n try {\n await ensureDir(tempDir);\n } catch {}\n }\n\n const tempFileName = `${basename(file)}.tmp-${process.pid}-${Math.random().toString(36).slice(2)}`;\n const tmp = tempDir\n ? join(tempDir, tempFileName)\n : `${file}.tmp-${process.pid}-${Math.random().toString(36).slice(2)}`;\n try {\n await writeFile(tmp, data);\n await rename(tmp, file);\n } catch (error) {\n try {\n await rm(tmp, { force: true });\n } catch {\n // Ignore\n }\n throw error;\n }\n};\n\nconst shouldUseCompression = (buf: Buffer, force?: boolean) =>\n force === true || (force !== false && buf.byteLength > 1024);\n\n/** Derive on-disk path from config dir + namespace + key id. */\nconst cachePath = (cacheDir: string, id: string, ns?: string) =>\n join(cacheDir, ns ? join(ns, id) : id);\n\n/** ------------------------- Local cache facade ------------------------- **/\n\nconst cacheMap = new Map<string, any>();\n\nexport const cacheDisk = (\n intlayerConfig: IntlayerConfig,\n keys: CacheKey[],\n options?: LocalCacheOptions\n) => {\n const { cacheDir, tempDir } = intlayerConfig.system;\n const buildCacheEnabled = intlayerConfig.build.cache ?? true;\n const persistent =\n options?.persistent === true ||\n (typeof options?.persistent === 'undefined' && buildCacheEnabled);\n\n const { compress, ttlMs, maxTimeMs, namespace } = {\n ...DEFAULTS,\n ...options,\n };\n\n // single stable id for this key tuple (works for both memory & disk)\n const id = computeKeyId(keys);\n const filePath = cachePath(cacheDir, id, namespace);\n\n const readFromDisk = async (): Promise<unknown | undefined> => {\n try {\n const statValue = await stat(filePath).catch(() => undefined);\n\n if (!statValue) return undefined;\n\n if (typeof ttlMs === 'number' && ttlMs > 0) {\n const age = Date.now() - statValue.mtimeMs;\n if (age > ttlMs) return undefined;\n }\n let raw = await readFile(filePath);\n // header: 1 byte flag (0x00 raw, 0x01 gzip)\n const flag = raw[0];\n\n raw = raw.subarray(1);\n\n const payload = flag === 0x01 ? gunzipSync(raw) : raw;\n const deserialized = deserialize(payload) as unknown;\n\n let value: unknown;\n const maybeObj = deserialized as Record<string, unknown> | null;\n const isEnvelope =\n !!maybeObj &&\n typeof maybeObj === 'object' &&\n typeof (maybeObj as any).version === 'string' &&\n typeof (maybeObj as any).timestamp === 'number' &&\n Object.hasOwn(maybeObj, 'data');\n\n if (isEnvelope) {\n const entry = maybeObj as CacheEnvelope;\n\n if (entry.version !== configPackageJson.version) {\n try {\n await unlink(filePath);\n } catch {}\n return undefined;\n }\n\n if (typeof maxTimeMs === 'number' && maxTimeMs > 0) {\n const age = Date.now() - entry.timestamp;\n if (age > maxTimeMs) {\n try {\n await unlink(filePath);\n } catch {}\n return undefined;\n }\n }\n\n value = entry.data;\n } else {\n // Backward compatibility: old entries had raw serialized value.\n if (typeof maxTimeMs === 'number' && maxTimeMs > 0) {\n const age = Date.now() - statValue.mtimeMs;\n if (age > maxTimeMs) {\n try {\n await unlink(filePath);\n } catch {}\n return undefined;\n }\n }\n value = deserialized;\n }\n\n // hydrate memory cache as well\n cacheMap.set(id, value);\n return value;\n } catch {\n return undefined;\n }\n };\n\n const writeToDisk = async (value: unknown) => {\n try {\n await ensureDir(dirname(filePath));\n const envelope: CacheEnvelope = {\n version: configPackageJson.version,\n timestamp: Date.now(),\n data: value,\n };\n const payload = Buffer.from(serialize(envelope));\n\n const gz = shouldUseCompression(payload, compress)\n ? gzipSync(payload)\n : payload;\n\n // prepend a 1-byte header indicating compression\n const buf = Buffer.concat([\n Buffer.from([gz === payload ? 0x00 : 0x01]),\n gz,\n ]);\n\n await atomicWriteFile(filePath, buf, tempDir);\n } catch {\n // swallow disk errors for cache writes\n }\n };\n\n return {\n /** In-memory first, then disk (if enabled), otherwise undefined. */\n get: async <T>(): Promise<T | undefined> => {\n const mem = cacheMap.get(id);\n\n if (mem !== undefined) return mem as T;\n\n if (persistent && buildCacheEnabled) {\n return (await readFromDisk()) as T | undefined;\n }\n return undefined;\n },\n /** Sets in-memory (always) and persists to disk if enabled. */\n set: async (value: unknown): Promise<void> => {\n cacheMap.set(id, value);\n\n if (persistent && buildCacheEnabled) {\n await writeToDisk(value);\n }\n },\n /** Clears only this entry from memory and disk. */\n clear: async (): Promise<void> => {\n cacheMap.delete(id);\n\n try {\n await unlink(filePath);\n } catch {}\n },\n /** Clears ALL cached entries (memory Map and entire cacheDir namespace if persistent). */\n clearAll: async (): Promise<void> => {\n clearAllCache();\n if (persistent && buildCacheEnabled) {\n // remove only the current namespace (if provided), else the root dir\n const base = namespace ? join(cacheDir, namespace) : cacheDir;\n\n try {\n await rm(base, { recursive: true, force: true });\n } catch {}\n\n try {\n await mkdir(base, { recursive: true });\n } catch {}\n }\n },\n /** Expose the computed id (useful if you want to key other structures). */\n isValid: async (): Promise<boolean> => {\n const cachedValue = cacheMap.get(id);\n if (cachedValue !== undefined) return true;\n\n // If persistence is disabled or build cache disabled, only memory can be valid\n if (!persistent || !buildCacheEnabled) return false;\n\n try {\n const statValue = await stat(filePath).catch(() => undefined);\n if (!statValue) return false;\n\n if (typeof ttlMs === 'number' && ttlMs > 0) {\n const age = Date.now() - statValue.mtimeMs;\n if (age > ttlMs) return false;\n }\n\n let raw = await readFile(filePath);\n const flag = raw[0];\n raw = raw.subarray(1);\n const payload = flag === 0x01 ? gunzipSync(raw) : raw;\n const deserialized = deserialize(payload) as unknown;\n\n const maybeObj = deserialized as Record<string, unknown> | null;\n const isEnvelope =\n !!maybeObj &&\n typeof maybeObj === 'object' &&\n typeof maybeObj.version === 'string' &&\n typeof maybeObj.timestamp === 'number' &&\n Object.hasOwn(maybeObj, 'data');\n\n if (isEnvelope) {\n const entry = maybeObj as CacheEnvelope;\n if (entry.version !== configPackageJson.version) return false;\n\n if (typeof maxTimeMs === 'number' && maxTimeMs > 0) {\n const age = Date.now() - entry.timestamp;\n if (age > maxTimeMs) return false;\n }\n return true;\n }\n\n if (typeof maxTimeMs === 'number' && maxTimeMs > 0) {\n const age = Date.now() - statValue.mtimeMs;\n if (age > maxTimeMs) return false;\n }\n return true;\n } catch {\n return false;\n }\n },\n /** Expose the computed id (useful if you want to key other structures). */\n id,\n /** Expose the absolute file path for debugging. */\n filePath,\n };\n};\n"],"mappings":"uZA2CA,MAAM,EAA0D,CAC9D,SAAU,GACX,CAEK,EAAY,KAAO,IAAgB,CACvC,MAAM,EAAM,EAAK,CAAE,UAAW,GAAM,CAAC,EAGjC,EAAkB,MACtB,EACA,EACA,IACG,CACH,GAAI,EACF,GAAI,CACF,MAAM,EAAU,EAAQ,MAClB,EAGV,IAAM,EAAe,GAAG,EAAS,EAAK,CAAC,OAAO,QAAQ,IAAI,GAAG,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE,GAC1F,EAAM,EACR,EAAK,EAAS,EAAa,CAC3B,GAAG,EAAK,OAAO,QAAQ,IAAI,GAAG,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE,GACrE,GAAI,CACF,MAAM,EAAU,EAAK,EAAK,CAC1B,MAAM,EAAO,EAAK,EAAK,OAChB,EAAO,CACd,GAAI,CACF,MAAM,EAAG,EAAK,CAAE,MAAO,GAAM,CAAC,MACxB,EAGR,MAAM,IAIJ,GAAwB,EAAa,IACzC,IAAU,IAAS,IAAU,IAAS,EAAI,WAAa,KAGnD,GAAa,EAAkB,EAAY,IAC/C,EAAK,EAAU,EAAK,EAAK,EAAI,EAAG,CAAG,EAAG,CAIlC,EAAW,IAAI,IAER,GACX,EACA,EACA,IACG,CACH,GAAM,CAAE,WAAU,WAAY,EAAe,OACvC,EAAoB,EAAe,MAAM,OAAS,GAClD,EACJ,GAAS,aAAe,IAChB,GAAS,aAAe,QAAe,EAE3C,CAAE,WAAU,QAAO,YAAW,aAAc,CAChD,GAAG,EACH,GAAG,EACJ,CAGK,EAAK,EAAa,EAAK,CACvB,EAAW,EAAU,EAAU,EAAI,EAAU,CAE7C,EAAe,SAA0C,CAC7D,GAAI,CACF,IAAM,EAAY,MAAM,EAAK,EAAS,CAAC,UAAY,IAAA,GAAU,CAI7D,GAFI,CAAC,GAED,OAAO,GAAU,UAAY,EAAQ,GAC3B,KAAK,KAAK,CAAG,EAAU,QACzB,EAAO,OAEnB,IAAI,EAAM,MAAM,EAAS,EAAS,CAE5B,EAAO,EAAI,GAEjB,EAAM,EAAI,SAAS,EAAE,CAGrB,IAAM,EAAe,EADL,IAAS,EAAO,EAAW,EAAI,CAAG,EACT,CAErC,EACE,EAAW,EAQjB,GANI,GACF,OAAO,GAAa,UACpB,OAAQ,EAAiB,SAAY,UACrC,OAAQ,EAAiB,WAAc,UACvC,OAAO,OAAO,EAAU,OAAO,CAEjB,CACd,IAAM,EAAQ,EAEd,GAAI,EAAM,UAAYA,EAAkB,QAAS,CAC/C,GAAI,CACF,MAAM,EAAO,EAAS,MAChB,EACR,OAGF,GAAI,OAAO,GAAc,UAAY,EAAY,GACnC,KAAK,KAAK,CAAG,EAAM,UACrB,EAAW,CACnB,GAAI,CACF,MAAM,EAAO,EAAS,MAChB,EACR,OAIJ,EAAQ,EAAM,SACT,CAEL,GAAI,OAAO,GAAc,UAAY,EAAY,GACnC,KAAK,KAAK,CAAG,EAAU,QACzB,EAAW,CACnB,GAAI,CACF,MAAM,EAAO,EAAS,MAChB,EACR,OAGJ,EAAQ,EAKV,OADA,EAAS,IAAI,EAAI,EAAM,CAChB,OACD,CACN,SAIE,EAAc,KAAO,IAAmB,CAC5C,GAAI,CACF,MAAM,EAAU,EAAQ,EAAS,CAAC,CAClC,IAAM,EAA0B,CAC9B,QAASA,EAAkB,QAC3B,UAAW,KAAK,KAAK,CACrB,KAAM,EACP,CACK,EAAU,OAAO,KAAK,EAAU,EAAS,CAAC,CAE1C,EAAK,EAAqB,EAAS,EAAS,CAC9C,EAAS,EAAQ,CACjB,EAQJ,MAAM,EAAgB,EALV,OAAO,OAAO,CACxB,OAAO,KAAK,CAAC,IAAO,EAAU,EAAO,EAAK,CAAC,CAC3C,EACD,CAAC,CAEmC,EAAQ,MACvC,IAKV,MAAO,CAEL,IAAK,SAAuC,CAC1C,IAAM,EAAM,EAAS,IAAI,EAAG,CAE5B,GAAI,IAAQ,IAAA,GAAW,OAAO,EAE9B,GAAI,GAAc,EAChB,OAAQ,MAAM,GAAc,EAKhC,IAAK,KAAO,IAAkC,CAC5C,EAAS,IAAI,EAAI,EAAM,CAEnB,GAAc,GAChB,MAAM,EAAY,EAAM,EAI5B,MAAO,SAA2B,CAChC,EAAS,OAAO,EAAG,CAEnB,GAAI,CACF,MAAM,EAAO,EAAS,MAChB,IAGV,SAAU,SAA2B,CAEnC,GADA,GAAe,CACX,GAAc,EAAmB,CAEnC,IAAM,EAAO,EAAY,EAAK,EAAU,EAAU,CAAG,EAErD,GAAI,CACF,MAAM,EAAG,EAAM,CAAE,UAAW,GAAM,MAAO,GAAM,CAAC,MAC1C,EAER,GAAI,CACF,MAAM,EAAM,EAAM,CAAE,UAAW,GAAM,CAAC,MAChC,KAIZ,QAAS,SAA8B,CAErC,GADoB,EAAS,IAAI,EAAG,GAChB,IAAA,GAAW,MAAO,GAGtC,GAAI,CAAC,GAAc,CAAC,EAAmB,MAAO,GAE9C,GAAI,CACF,IAAM,EAAY,MAAM,EAAK,EAAS,CAAC,UAAY,IAAA,GAAU,CAG7D,GAFI,CAAC,GAED,OAAO,GAAU,UAAY,EAAQ,GAC3B,KAAK,KAAK,CAAG,EAAU,QACzB,EAAO,MAAO,GAG1B,IAAI,EAAM,MAAM,EAAS,EAAS,CAC5B,EAAO,EAAI,GACjB,EAAM,EAAI,SAAS,EAAE,CAIrB,IAAM,EAFe,EADL,IAAS,EAAO,EAAW,EAAI,CAAG,EACT,CAUzC,GANI,GACF,OAAO,GAAa,UACpB,OAAO,EAAS,SAAY,UAC5B,OAAO,EAAS,WAAc,UAC9B,OAAO,OAAO,EAAU,OAAO,CAEjB,CACd,IAAM,EAAQ,EAOd,MAJA,EAFI,EAAM,UAAYA,EAAkB,SAEpC,OAAO,GAAc,UAAY,EAAY,GACnC,KAAK,KAAK,CAAG,EAAM,UACrB,GASd,MAJA,EAAI,OAAO,GAAc,UAAY,EAAY,GACnC,KAAK,KAAK,CAAG,EAAU,QACzB,QAGN,CACN,MAAO,KAIX,KAEA,WACD"}
1
+ {"version":3,"file":"cacheDisk.mjs","names":["configPackageJson"],"sources":["../../../src/utils/cacheDisk.ts"],"sourcesContent":["import {\n mkdir,\n readFile,\n rename,\n rm,\n stat,\n unlink,\n writeFile,\n} from 'node:fs/promises';\nimport { basename, dirname, join } from 'node:path';\nimport { deserialize, serialize } from 'node:v8';\nimport { gunzipSync, gzipSync } from 'node:zlib';\nimport type { IntlayerConfig } from '@intlayer/types/config';\nimport configPackageJson from '@intlayer/types/package.json' with {\n type: 'json',\n};\nimport { type CacheKey, clearAllCache, computeKeyId } from './cacheMemory';\n\n/** ------------------------- Persistence layer ------------------------- **/\n\n/** Cache envelope structure stored on disk */\ntype CacheEnvelope = {\n /** Version of the config package (for cache invalidation) */\n version: string;\n /** Timestamp when the cache entry was created (in milliseconds) */\n timestamp: number;\n /** Data payload (the actual cached value) */\n data: unknown;\n};\n\ntype LocalCacheOptions = {\n /** Preferred new option name */\n persistent?: boolean;\n /** Time-to-live in ms; if expired, disk entry is ignored. */\n ttlMs?: number;\n /** Max age in ms based on stored creation timestamp; invalidates on exceed. */\n maxTimeMs?: number;\n /** Optional namespace to separate different logical caches. */\n namespace?: string;\n /** Gzip values on disk (on by default for blobs > 1KB). */\n compress?: boolean;\n};\n\nconst DEFAULTS: Required<Pick<LocalCacheOptions, 'compress'>> = {\n compress: true,\n};\n\nconst ensureDir = async (dir: string) => {\n await mkdir(dir, { recursive: true });\n};\n\nconst atomicWriteFile = async (\n file: string,\n data: Buffer,\n tempDir?: string\n) => {\n if (tempDir) {\n try {\n await ensureDir(tempDir);\n } catch {}\n }\n\n const tempFileName = `${basename(file)}.tmp-${process.pid}-${Math.random().toString(36).slice(2)}`;\n const tmp = tempDir\n ? join(tempDir, tempFileName)\n : `${file}.tmp-${process.pid}-${Math.random().toString(36).slice(2)}`;\n try {\n await writeFile(tmp, data);\n await rename(tmp, file);\n } catch (error) {\n try {\n await rm(tmp, { force: true });\n } catch {\n // Ignore\n }\n throw error;\n }\n};\n\nconst shouldUseCompression = (buf: Buffer, force?: boolean) =>\n force === true || (force !== false && buf.byteLength > 1024);\n\n/** Derive on-disk path from config dir + namespace + key id. */\nconst cachePath = (cacheDir: string, id: string, ns?: string) =>\n join(cacheDir, ns ? join(ns, id) : id);\n\n/** ------------------------- Local cache facade ------------------------- **/\n\nconst cacheMap = new Map<string, any>();\n\nexport const cacheDisk = (\n intlayerConfig: IntlayerConfig,\n keys: CacheKey[],\n options?: LocalCacheOptions\n) => {\n const { cacheDir, tempDir } = intlayerConfig.system;\n const buildCacheEnabled = intlayerConfig.build.cache ?? true;\n const persistent =\n options?.persistent === true ||\n (typeof options?.persistent === 'undefined' && buildCacheEnabled);\n\n const { compress, ttlMs, maxTimeMs, namespace } = {\n ...DEFAULTS,\n ...options,\n };\n\n // single stable id for this key tuple (works for both memory & disk)\n const id = computeKeyId(keys);\n const filePath = cachePath(cacheDir, id, namespace);\n\n const readFromDisk = async (): Promise<unknown | undefined> => {\n try {\n const statValue = await stat(filePath).catch(() => undefined);\n\n if (!statValue) return undefined;\n\n if (typeof ttlMs === 'number' && ttlMs > 0) {\n const age = Date.now() - statValue.mtimeMs;\n if (age > ttlMs) return undefined;\n }\n let raw = await readFile(filePath);\n // header: 1 byte flag (0x00 raw, 0x01 gzip)\n const flag = raw[0];\n\n raw = raw.subarray(1);\n\n const payload = flag === 0x01 ? gunzipSync(raw) : raw;\n const deserialized = deserialize(payload) as unknown;\n\n let value: unknown;\n const maybeObj = deserialized as Record<string, unknown> | null;\n const isEnvelope =\n !!maybeObj &&\n typeof maybeObj === 'object' &&\n typeof (maybeObj as any).version === 'string' &&\n typeof (maybeObj as any).timestamp === 'number' &&\n Object.hasOwn(maybeObj, 'data');\n\n if (isEnvelope) {\n const entry = maybeObj as CacheEnvelope;\n\n if (entry.version !== configPackageJson.version) {\n try {\n await unlink(filePath);\n } catch {}\n return undefined;\n }\n\n if (typeof maxTimeMs === 'number' && maxTimeMs > 0) {\n const age = Date.now() - entry.timestamp;\n if (age > maxTimeMs) {\n try {\n await unlink(filePath);\n } catch {}\n return undefined;\n }\n }\n\n value = entry.data;\n } else {\n // Backward compatibility: old entries had raw serialized value.\n if (typeof maxTimeMs === 'number' && maxTimeMs > 0) {\n const age = Date.now() - statValue.mtimeMs;\n if (age > maxTimeMs) {\n try {\n await unlink(filePath);\n } catch {}\n return undefined;\n }\n }\n value = deserialized;\n }\n\n // hydrate memory cache as well\n cacheMap.set(id, value);\n return value;\n } catch {\n return undefined;\n }\n };\n\n const writeToDisk = async (value: unknown) => {\n try {\n await ensureDir(dirname(filePath));\n const envelope: CacheEnvelope = {\n version: configPackageJson.version,\n timestamp: Date.now(),\n data: value,\n };\n const payload = Buffer.from(serialize(envelope));\n\n const gz = shouldUseCompression(payload, compress)\n ? gzipSync(payload)\n : payload;\n\n // prepend a 1-byte header indicating compression\n const buf = Buffer.concat([\n Buffer.from([gz === payload ? 0x00 : 0x01]),\n gz,\n ]);\n\n await atomicWriteFile(filePath, buf, tempDir);\n } catch {\n // swallow disk errors for cache writes\n }\n };\n\n return {\n /** In-memory first, then disk (if enabled), otherwise undefined. */\n get: async <T>(): Promise<T | undefined> => {\n const mem = cacheMap.get(id);\n\n if (mem !== undefined) return mem as T;\n\n if (persistent && buildCacheEnabled) {\n return (await readFromDisk()) as T | undefined;\n }\n return undefined;\n },\n /** Sets in-memory (always) and persists to disk if enabled. */\n set: async (value: unknown): Promise<void> => {\n cacheMap.set(id, value);\n\n if (persistent && buildCacheEnabled) {\n await writeToDisk(value);\n }\n },\n /** Clears only this entry from memory and disk. */\n clear: async (): Promise<void> => {\n cacheMap.delete(id);\n\n try {\n await unlink(filePath);\n } catch {}\n },\n /** Clears ALL cached entries (memory Map and entire cacheDir namespace if persistent). */\n clearAll: async (): Promise<void> => {\n clearAllCache();\n if (persistent && buildCacheEnabled) {\n // remove only the current namespace (if provided), else the root dir\n const base = namespace ? join(cacheDir, namespace) : cacheDir;\n\n try {\n await rm(base, { recursive: true, force: true });\n } catch {}\n\n try {\n await mkdir(base, { recursive: true });\n } catch {}\n }\n },\n /** Expose the computed id (useful if you want to key other structures). */\n isValid: async (): Promise<boolean> => {\n const cachedValue = cacheMap.get(id);\n if (cachedValue !== undefined) return true;\n\n // If persistence is disabled or build cache disabled, only memory can be valid\n if (!persistent || !buildCacheEnabled) return false;\n\n try {\n const statValue = await stat(filePath).catch(() => undefined);\n if (!statValue) return false;\n\n if (typeof ttlMs === 'number' && ttlMs > 0) {\n const age = Date.now() - statValue.mtimeMs;\n if (age > ttlMs) return false;\n }\n\n let raw = await readFile(filePath);\n const flag = raw[0];\n raw = raw.subarray(1);\n const payload = flag === 0x01 ? gunzipSync(raw) : raw;\n const deserialized = deserialize(payload) as unknown;\n\n const maybeObj = deserialized as Record<string, unknown> | null;\n const isEnvelope =\n !!maybeObj &&\n typeof maybeObj === 'object' &&\n typeof maybeObj.version === 'string' &&\n typeof maybeObj.timestamp === 'number' &&\n Object.hasOwn(maybeObj, 'data');\n\n if (isEnvelope) {\n const entry = maybeObj as CacheEnvelope;\n if (entry.version !== configPackageJson.version) return false;\n\n if (typeof maxTimeMs === 'number' && maxTimeMs > 0) {\n const age = Date.now() - entry.timestamp;\n if (age > maxTimeMs) return false;\n }\n return true;\n }\n\n if (typeof maxTimeMs === 'number' && maxTimeMs > 0) {\n const age = Date.now() - statValue.mtimeMs;\n if (age > maxTimeMs) return false;\n }\n return true;\n } catch {\n return false;\n }\n },\n /** Expose the computed id (useful if you want to key other structures). */\n id,\n /** Expose the absolute file path for debugging. */\n filePath,\n };\n};\n"],"mappings":"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"}