@intlayer/config 9.7.1 → 9.7.3

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.
@@ -6,11 +6,11 @@ const require_utils_logStack = require("./utils/logStack.cjs");
6
6
  const require_utils_normalizePath = require("./utils/normalizePath.cjs");
7
7
  const require_utils_parallelize = require("./utils/parallelize.cjs");
8
8
  const require_utils_pLimit = require("./utils/pLimit.cjs");
9
+ const require_utils_setIntlayerIdentifier = require("./utils/setIntlayerIdentifier.cjs");
9
10
  const require_utils_stringFormatter_camelCaseToKebabCase = require("./utils/stringFormatter/camelCaseToKebabCase.cjs");
10
11
  const require_utils_stringFormatter_camelCaseToSentence = require("./utils/stringFormatter/camelCaseToSentence.cjs");
11
12
  const require_utils_stringFormatter_kebabCaseToCamelCase = require("./utils/stringFormatter/kebabCaseToCamelCase.cjs");
12
13
  const require_utils_stringFormatter_toLowerCamelCase = require("./utils/stringFormatter/toLowerCamelCase.cjs");
13
- const require_utils_setIntlayerIdentifier = require("./utils/setIntlayerIdentifier.cjs");
14
14
 
15
15
  exports.bindLogFunction = require_configFile_buildBrowserConfiguration.bindLogFunction;
16
16
  exports.buildAnalyticsFields = require_configFile_buildBrowserConfiguration.buildAnalyticsFields;
@@ -1 +1 @@
1
- {"version":3,"file":"transpileTSToCJS.cjs","names":["dirname","join","getPackageJsonPath","existsSync","pathToFileURL","statSync","resolve","isAbsolute","extname","getLoader","computeKeyId","buildSync","createRequire","build"],"sources":["../../../src/loadExternalFile/transpileTSToCJS.ts"],"sourcesContent":["import { existsSync, statSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { dirname, extname, isAbsolute, join, resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport {\n type BuildOptions,\n type BuildResult,\n build,\n buildSync,\n type Metafile,\n} from 'esbuild';\nimport { computeKeyId } from '../utils/cacheMemory';\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\n/**\n * Cache of resolved tsconfig paths keyed by the file's directory.\n * Avoids re-walking to package.json + existsSync on every transpilation.\n */\nconst tsConfigPathCache = new Map<string, string | undefined>();\n\nconst getTsConfigPath = (filePath: string): string | undefined => {\n const fileDirectory = dirname(filePath);\n\n if (tsConfigPathCache.has(fileDirectory)) {\n return tsConfigPathCache.get(fileDirectory);\n }\n\n let resolvedPath: string | undefined;\n try {\n const tsconfigPath = join(\n getPackageJsonPath(fileDirectory).baseDir,\n 'tsconfig.json'\n );\n\n // Only return the tsconfig path if it exists\n resolvedPath = existsSync(tsconfigPath) ? tsconfigPath : undefined;\n } catch {\n // No package.json found up the tree — transpile without a tsconfig\n resolvedPath = undefined;\n }\n\n tsConfigPathCache.set(fileDirectory, resolvedPath);\n\n return resolvedPath;\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 // The metafile lists every bundled input, which the transpile cache uses to\n // invalidate when an imported file changes (the entry itself is keyed by hash).\n metafile: true,\n tsconfig: getTsConfigPath(filePath),\n define: {\n 'import.meta.url': JSON.stringify(pathToFileURL(filePath).href),\n 'import.meta.env': 'process.env',\n },\n});\n\n/** Fingerprint of a bundled input file, used to detect changes without re-reading it. */\ntype TranspileCacheInput = {\n path: string;\n mtimeMs: number;\n size: number;\n};\n\ntype TranspileCacheEntry = {\n /** Hash of the entry file's source code. */\n codeHash: string;\n /** Hash of the build options, so different option sets don't collide. */\n optionsKey: string;\n /** The transpiled CJS output. */\n output: string;\n /** Fingerprints of every non-entry input bundled into the output. */\n inputs: TranspileCacheInput[];\n};\n\n/**\n * In-memory cache of transpiled outputs keyed by entry file path (one entry\n * per file, so re-transpilations replace rather than accumulate).\n * The entry file is validated by content hash; bundled relative imports are\n * validated by mtime + size so an edited dependency invalidates the cache.\n */\nconst transpileCache = new Map<string, TranspileCacheEntry>();\n\nconst isInputUnchanged = (input: TranspileCacheInput): boolean => {\n try {\n const stats = statSync(input.path);\n return stats.mtimeMs === input.mtimeMs && stats.size === input.size;\n } catch {\n // File removed or unreadable — treat as changed\n return false;\n }\n};\n\nconst getCachedTranspilation = (\n filePath: string,\n codeHash: string,\n optionsKey: string\n): string | undefined => {\n const cacheEntry = transpileCache.get(filePath);\n\n if (!cacheEntry) return undefined;\n if (cacheEntry.codeHash !== codeHash) return undefined;\n if (cacheEntry.optionsKey !== optionsKey) return undefined;\n if (!cacheEntry.inputs.every(isInputUnchanged)) return undefined;\n\n return cacheEntry.output;\n};\n\n/**\n * Extracts the fingerprints of every bundled input from the esbuild metafile.\n * Returns `undefined` when an input cannot be fingerprinted (the result should\n * then not be cached, as invalidation would be unreliable).\n */\nconst getInputFingerprints = (\n metafile: Metafile | undefined,\n entryFilePath: string\n): TranspileCacheInput[] | undefined => {\n if (!metafile) return undefined;\n\n const resolvedEntryFilePath = resolve(entryFilePath);\n const inputs: TranspileCacheInput[] = [];\n\n for (const inputPath of Object.keys(metafile.inputs)) {\n // The entry itself is provided via stdin and validated by content hash.\n // esbuild labels it \"<stdin>\", or with the sourcefile path when set.\n if (inputPath === '<stdin>') continue;\n // Virtual modules from plugins (e.g. \"plugin:...\") cannot be fingerprinted\n if (inputPath.includes(':') && !isAbsolute(inputPath)) return undefined;\n\n const absoluteInputPath = isAbsolute(inputPath)\n ? inputPath\n : resolve(process.cwd(), inputPath);\n\n if (absoluteInputPath === resolvedEntryFilePath) continue;\n\n try {\n const stats = statSync(absoluteInputPath);\n inputs.push({\n path: absoluteInputPath,\n mtimeMs: stats.mtimeMs,\n size: stats.size,\n });\n } catch {\n return undefined;\n }\n }\n\n return inputs;\n};\n\nconst setCachedTranspilation = (\n filePath: string,\n codeHash: string,\n optionsKey: string,\n moduleResult: BuildResult,\n output: string\n): void => {\n const inputs = getInputFingerprints(moduleResult.metafile, filePath);\n\n // Without a usable metafile the cache cannot be invalidated reliably — skip\n if (!inputs) return;\n\n transpileCache.set(filePath, { codeHash, optionsKey, output, inputs });\n};\n\n/** Clears the in-memory transpilation cache (mainly for tests). */\nexport const clearTranspileCache = (): void => {\n transpileCache.clear();\n tsConfigPathCache.clear();\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\n const codeHash = computeKeyId([code]);\n const optionsKey = computeKeyId([buildOptions]);\n\n const cachedOutput = getCachedTranspilation(filePath, codeHash, optionsKey);\n if (typeof cachedOutput === 'string') return cachedOutput;\n\n const esbuildBuildSync = esbuildInstance?.buildSync ?? buildSync;\n\n // esbuild's worker thread service calls `new Worker(__filename, …)` on first use.\n // In Vite's SSR module runner the SSR-optimised chunk is ESM and __filename is\n // never declared (confirmed: accessing it throws ReferenceError, not undefined).\n // Because there is no local declaration the bare `__filename` lookup falls\n // through to globalThis, so we set it there to esbuild's own CJS entry-point –\n // the exact path esbuild would use if it were loaded in a normal CJS context.\n //\n // IMPORTANT: We save/restore the globals so this temporary shim does not leak\n // to other Vite plugins (e.g. `@vitejs/plugin-react-swc`) that check\n // `typeof __dirname !== \"undefined\"` to locate their own assets.\n const g = globalThis as Record<string, unknown>;\n const hadFilename = typeof g.__filename === 'string';\n const prevFilename = g.__filename;\n const prevDirname = g.__dirname;\n\n if (!hadFilename) {\n try {\n const _require = createRequire(import.meta.url);\n const esbuildEntry = _require.resolve('esbuild');\n g.__filename = esbuildEntry;\n g.__dirname = dirname(esbuildEntry);\n } catch {\n // Best-effort: if esbuild can't be resolved the caller's catch handles it\n }\n }\n\n let moduleResult: BuildResult;\n try {\n moduleResult = 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 } finally {\n // Always restore the previous values so the globals don't linger.\n if (!hadFilename) {\n if (prevFilename === undefined) {\n // biome-ignore lint/performance/noDelete: the global must be truly absent — assigning undefined would leave the key present and break `typeof __filename` checks in other tools\n delete g.__filename;\n } else {\n g.__filename = prevFilename;\n }\n if (prevDirname === undefined) {\n // biome-ignore lint/performance/noDelete: same as __filename above\n delete g.__dirname;\n } else {\n g.__dirname = prevDirname;\n }\n }\n }\n\n const moduleResultString = moduleResult!.outputFiles?.[0]?.text;\n\n if (typeof moduleResultString === 'string') {\n setCachedTranspilation(\n filePath,\n codeHash,\n optionsKey,\n moduleResult!,\n moduleResultString\n );\n }\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\n const codeHash = computeKeyId([code]);\n const optionsKey = computeKeyId([buildOptions]);\n\n const cachedOutput = getCachedTranspilation(filePath, codeHash, optionsKey);\n if (typeof cachedOutput === 'string') return cachedOutput;\n\n // A one-shot build() releases its Go-side resources on completion and costs a\n // single service round-trip (context()+rebuild()+dispose() costs three).\n const esbuildBuild = esbuildInstance?.build ?? build;\n\n const moduleResult = await esbuildBuild({\n stdin: {\n contents: code,\n loader,\n resolveDir: dirname(filePath),\n sourcefile: filePath,\n },\n ...getTransformationOptions(filePath),\n ...buildOptions,\n });\n\n const moduleResultString = moduleResult.outputFiles?.[0]?.text;\n\n if (typeof moduleResultString === 'string') {\n setCachedTranspilation(\n filePath,\n codeHash,\n optionsKey,\n moduleResult,\n moduleResultString\n );\n }\n\n return moduleResultString;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"transpileTSToCJS.cjs","names":["dirname","join","getPackageJsonPath","existsSync","pathToFileURL","statSync","resolve","isAbsolute","extname","getLoader","computeKeyId","buildSync","createRequire","build"],"sources":["../../../src/loadExternalFile/transpileTSToCJS.ts"],"sourcesContent":["import { existsSync, statSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { dirname, extname, isAbsolute, join, resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport {\n type BuildOptions,\n type BuildResult,\n build,\n buildSync,\n type Metafile,\n} from 'esbuild';\nimport { computeKeyId } from '../utils/cacheMemory';\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\n/**\n * Cache of resolved tsconfig paths keyed by the file's directory.\n * Avoids re-walking to package.json + existsSync on every transpilation.\n */\nconst tsConfigPathCache = new Map<string, string | undefined>();\n\nconst getTsConfigPath = (filePath: string): string | undefined => {\n const fileDirectory = dirname(filePath);\n\n if (tsConfigPathCache.has(fileDirectory)) {\n return tsConfigPathCache.get(fileDirectory);\n }\n\n let resolvedPath: string | undefined;\n try {\n const tsconfigPath = join(\n getPackageJsonPath(fileDirectory).baseDir,\n 'tsconfig.json'\n );\n\n // Only return the tsconfig path if it exists\n resolvedPath = existsSync(tsconfigPath) ? tsconfigPath : undefined;\n } catch {\n // No package.json found up the tree — transpile without a tsconfig\n resolvedPath = undefined;\n }\n\n tsConfigPathCache.set(fileDirectory, resolvedPath);\n\n return resolvedPath;\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 // The metafile lists every bundled input, which the transpile cache uses to\n // invalidate when an imported file changes (the entry itself is keyed by hash).\n metafile: true,\n tsconfig: getTsConfigPath(filePath),\n define: {\n 'import.meta.url': JSON.stringify(pathToFileURL(filePath).href),\n 'import.meta.env': 'process.env',\n },\n});\n\n/** Fingerprint of a bundled input file, used to detect changes without re-reading it. */\ntype TranspileCacheInput = {\n path: string;\n mtimeMs: number;\n size: number;\n};\n\ntype TranspileCacheEntry = {\n /** Hash of the entry file's source code. */\n codeHash: string;\n /** Hash of the build options, so different option sets don't collide. */\n optionsKey: string;\n /** The transpiled CJS output. */\n output: string;\n /** Fingerprints of every non-entry input bundled into the output. */\n inputs: TranspileCacheInput[];\n};\n\n/**\n * In-memory cache of transpiled outputs keyed by entry file path (one entry\n * per file, so re-transpilations replace rather than accumulate).\n * The entry file is validated by content hash; bundled relative imports are\n * validated by mtime + size so an edited dependency invalidates the cache.\n */\nconst transpileCache = new Map<string, TranspileCacheEntry>();\n\nconst isInputUnchanged = (input: TranspileCacheInput): boolean => {\n try {\n const stats = statSync(input.path);\n return stats.mtimeMs === input.mtimeMs && stats.size === input.size;\n } catch {\n // File removed or unreadable — treat as changed\n return false;\n }\n};\n\nconst getCachedTranspilation = (\n filePath: string,\n codeHash: string,\n optionsKey: string\n): string | undefined => {\n const cacheEntry = transpileCache.get(filePath);\n\n if (!cacheEntry) return undefined;\n if (cacheEntry.codeHash !== codeHash) return undefined;\n if (cacheEntry.optionsKey !== optionsKey) return undefined;\n if (!cacheEntry.inputs.every(isInputUnchanged)) return undefined;\n\n return cacheEntry.output;\n};\n\n/**\n * Extracts the fingerprints of every bundled input from the esbuild metafile.\n * Returns `undefined` when an input cannot be fingerprinted (the result should\n * then not be cached, as invalidation would be unreliable).\n */\nconst getInputFingerprints = (\n metafile: Metafile | undefined,\n entryFilePath: string\n): TranspileCacheInput[] | undefined => {\n if (!metafile) return undefined;\n\n const resolvedEntryFilePath = resolve(entryFilePath);\n const inputs: TranspileCacheInput[] = [];\n\n for (const inputPath of Object.keys(metafile.inputs)) {\n // The entry itself is provided via stdin and validated by content hash.\n // esbuild labels it \"<stdin>\", or with the sourcefile path when set.\n if (inputPath === '<stdin>') continue;\n // Virtual modules from plugins (e.g. \"plugin:...\") cannot be fingerprinted\n if (inputPath.includes(':') && !isAbsolute(inputPath)) return undefined;\n\n const absoluteInputPath = isAbsolute(inputPath)\n ? inputPath\n : resolve(process.cwd(), inputPath);\n\n if (absoluteInputPath === resolvedEntryFilePath) continue;\n\n try {\n const stats = statSync(absoluteInputPath);\n inputs.push({\n path: absoluteInputPath,\n mtimeMs: stats.mtimeMs,\n size: stats.size,\n });\n } catch {\n return undefined;\n }\n }\n\n return inputs;\n};\n\nconst setCachedTranspilation = (\n filePath: string,\n codeHash: string,\n optionsKey: string,\n moduleResult: BuildResult,\n output: string\n): void => {\n const inputs = getInputFingerprints(moduleResult.metafile, filePath);\n\n // Without a usable metafile the cache cannot be invalidated reliably — skip\n if (!inputs) return;\n\n transpileCache.set(filePath, { codeHash, optionsKey, output, inputs });\n};\n\n/** Clears the in-memory transpilation cache (mainly for tests). */\nexport const clearTranspileCache = (): void => {\n transpileCache.clear();\n tsConfigPathCache.clear();\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\n const codeHash = computeKeyId([code]);\n const optionsKey = computeKeyId([buildOptions]);\n\n const cachedOutput = getCachedTranspilation(filePath, codeHash, optionsKey);\n if (typeof cachedOutput === 'string') return cachedOutput;\n\n const esbuildBuildSync = esbuildInstance?.buildSync ?? buildSync;\n\n // esbuild's worker thread service calls `new Worker(__filename, …)` on first use.\n // In Vite's SSR module runner the SSR-optimised chunk is ESM and __filename is\n // never declared (confirmed: accessing it throws ReferenceError, not undefined).\n // Because there is no local declaration the bare `__filename` lookup falls\n // through to globalThis, so we set it there to esbuild's own CJS entry-point –\n // the exact path esbuild would use if it were loaded in a normal CJS context.\n //\n // IMPORTANT: We save/restore the globals so this temporary shim does not leak\n // to other Vite plugins (e.g. `@vitejs/plugin-react-swc`) that check\n // `typeof __dirname !== \"undefined\"` to locate their own assets.\n const g = globalThis as Record<string, unknown>;\n const hadFilename = typeof g.__filename === 'string';\n const prevFilename = g.__filename;\n const prevDirname = g.__dirname;\n\n if (!hadFilename) {\n try {\n const _require = createRequire(import.meta.url);\n const esbuildEntry = _require.resolve('esbuild');\n g.__filename = esbuildEntry;\n g.__dirname = dirname(esbuildEntry);\n } catch {\n // Best-effort: if esbuild can't be resolved the caller's catch handles it\n }\n }\n\n let moduleResult: BuildResult;\n try {\n moduleResult = 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 } finally {\n // Always restore the previous values so the globals don't linger.\n if (!hadFilename) {\n if (prevFilename === undefined) {\n // oxlint-disable-next-line typescript/no-dynamic-delete -- the global must be truly absent — assigning undefined would leave the key present and break `typeof __filename` checks in other tools\n delete g.__filename;\n } else {\n g.__filename = prevFilename;\n }\n if (prevDirname === undefined) {\n // oxlint-disable-next-line typescript/no-dynamic-delete -- same as __filename above\n delete g.__dirname;\n } else {\n g.__dirname = prevDirname;\n }\n }\n }\n\n const moduleResultString = moduleResult!.outputFiles?.[0]?.text;\n\n if (typeof moduleResultString === 'string') {\n setCachedTranspilation(\n filePath,\n codeHash,\n optionsKey,\n moduleResult!,\n moduleResultString\n );\n }\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\n const codeHash = computeKeyId([code]);\n const optionsKey = computeKeyId([buildOptions]);\n\n const cachedOutput = getCachedTranspilation(filePath, codeHash, optionsKey);\n if (typeof cachedOutput === 'string') return cachedOutput;\n\n // A one-shot build() releases its Go-side resources on completion and costs a\n // single service round-trip (context()+rebuild()+dispose() costs three).\n const esbuildBuild = esbuildInstance?.build ?? build;\n\n const moduleResult = await esbuildBuild({\n stdin: {\n contents: code,\n loader,\n resolveDir: dirname(filePath),\n sourcefile: filePath,\n },\n ...getTransformationOptions(filePath),\n ...buildOptions,\n });\n\n const moduleResultString = moduleResult.outputFiles?.[0]?.text;\n\n if (typeof moduleResultString === 'string') {\n setCachedTranspilation(\n filePath,\n codeHash,\n optionsKey,\n moduleResult,\n moduleResultString\n );\n }\n\n return moduleResultString;\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"logger.cjs","names":["RESET","GREEN","BEIGE","GREY","BLUE","GREY_DARK","WHITE","GREY_LIGHT","RED"],"sources":["../../src/logger.ts"],"sourcesContent":["import type { Locale } from '@intlayer/types/allLocales';\nimport type {\n CustomIntlayerConfig,\n IntlayerConfig,\n} from '@intlayer/types/config';\nimport type * as ANSIColorsTypes from './colors';\nimport {\n BEIGE,\n BLUE,\n GREEN,\n GREY,\n GREY_DARK,\n GREY_LIGHT,\n RED,\n RESET,\n WHITE,\n} from './colors';\n\nexport type ANSIColorsType =\n (typeof ANSIColorsTypes)[keyof typeof ANSIColorsTypes];\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 config = details?.config ?? {};\n const mode = config.mode ?? 'default';\n\n if (mode === 'disabled' || (details?.isVerbose && mode !== 'verbose')) return;\n\n const prefix = getPrefix(config.prefix);\n const flatContent = prefix ? [prefix, ...[content].flat()] : [content].flat();\n const level = details?.level ?? 'info';\n\n const logMethod =\n config[level] ?? console[level] ?? config.log ?? console.log;\n\n logMethod(...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?: Pick<IntlayerConfig, 'log'>, 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 string: string,\n color?: ANSIColorsType,\n reset?: boolean | ANSIColorsType\n): string =>\n color && typeof window === 'undefined'\n ? `${color}${string}${reset ? (typeof reset === 'boolean' ? RESET : reset) : RESET}`\n : string;\n\nexport const colorizeLocales = (\n locales: Locale | Locale[],\n color: ANSIColorsType = GREEN,\n reset: boolean | ANSIColorsType = 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 = BEIGE,\n reset: boolean | ANSIColorsType = 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 = GREY,\n reset: boolean | ANSIColorsType = RESET\n) =>\n [path]\n .flat()\n .map((path) => colorize(path, color, reset))\n .join(`, `);\n\nexport const colorizeNumber = (\n number: number | string,\n options: Partial<Record<Intl.LDMLPluralRule, ANSIColorsType>> = {\n zero: BLUE,\n one: BLUE,\n two: BLUE,\n few: BLUE,\n many: BLUE,\n other: BLUE,\n }\n): string => {\n if (number === 0 || number === '0') {\n const color = options.zero ?? GREEN;\n return colorize(number.toString(), color);\n }\n\n // Kept inside the function. Top-level instantiation of classes/APIs\n // is treated as a side-effect and prevents tree-shaking if the function is unused.\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 colorizeObject = (\n obj: any,\n indentLevel = 0,\n indentSize = 2,\n key?: string\n): string => {\n const indent = ' '.repeat(indentLevel * indentSize);\n const nextIndent = ' '.repeat((indentLevel + 1) * indentSize);\n\n if (obj === null) {\n return colorize('null', BLUE);\n }\n\n if (typeof obj === 'boolean') {\n return colorize(obj.toString(), BLUE);\n }\n\n if (typeof obj === 'number') {\n return colorize(obj.toString(), BLUE);\n }\n\n if (typeof obj === 'string') {\n const isDateString = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/.test(obj);\n const isUrl = obj.startsWith('http://') || obj.startsWith('https://');\n const isGlob = obj.includes('*') || obj.includes('?') || obj.includes('{');\n const isPath =\n obj.startsWith('/') ||\n obj.startsWith('./') ||\n obj.startsWith('../') ||\n /\\.[a-zA-Z0-9]{2,5}$/.test(obj);\n const isSecret =\n /^[0-9a-fA-F]{24,}$/.test(obj) || (obj.length >= 40 && !/\\s/.test(obj));\n const hasSpaces = /\\s/.test(obj);\n\n if (isDateString) return colorize(`\"${obj}\"`, BEIGE);\n if (isUrl) return colorize(`\"${obj}\"`, GREY_DARK);\n if (isGlob) return colorize(`\"${obj}\"`, GREY);\n if (isPath) return colorize(`\"${obj}\"`, GREY_DARK);\n if (isSecret) return colorize(`\"${obj}\"`, GREY);\n if (hasSpaces) return colorize(`\"${obj}\"`, WHITE);\n return colorize(`\"${obj}\"`, BLUE);\n }\n\n if (Array.isArray(obj)) {\n if (obj.length === 0) {\n return '[]';\n }\n const items = obj\n .map(\n (item) =>\n `${nextIndent}${colorizeObject(item, indentLevel + 1, indentSize, key)}`\n )\n .join(',\\n');\n return `[\\n${items}\\n${indent}]`;\n }\n\n if (typeof obj === 'object') {\n const keys = Object.keys(obj);\n\n if (keys.length === 0) {\n return '{}';\n }\n\n const fields = keys\n .map((key) => {\n const coloredKey = colorize(`\"${key}\"`, GREY_LIGHT);\n const value = obj[key];\n const coloredValue = colorizeObject(\n value,\n indentLevel + 1,\n indentSize,\n key\n );\n return `${nextIndent}${coloredKey}: ${coloredValue}`;\n })\n .join(',\\n');\n return `{\\n${fields}\\n${indent}}`;\n }\n\n return colorize(String(obj), GREY);\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 (\n Array.isArray(length) &&\n length.every((locale) => typeof locale === 'string')\n ) {\n value = Math.max(...length.map((str) => str.length));\n }\n if (\n Array.isArray(length) &&\n length.every((locale) => typeof locale === 'number')\n ) {\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('✗', RED);\nexport const v = colorize('✓', GREEN);\nexport const clock = colorize('⏲', BLUE);\n"],"mappings":";;;;AA6BA,IAAI;AAEJ,MAAa,aAAa,WAA+B;CACvD,eAAe;AACjB;AAEA,MAAa,aAAa,iBAA8C;CACtE,IAAI,OAAO,iBAAiB,aAC1B,OAAO;CAGT,OAAO;AACT;AAEA,MAAa,UAAkB,SAAS,YAAY;CAClD,MAAM,SAAS,SAAS,UAAU,CAAC;CACnC,MAAM,OAAO,OAAO,QAAQ;CAE5B,IAAI,SAAS,cAAe,SAAS,aAAa,SAAS,WAAY;CAEvE,MAAM,SAAS,UAAU,OAAO,MAAM;CACtC,MAAM,cAAc,SAAS,CAAC,QAAQ,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK;CAC5E,MAAM,QAAQ,SAAS,SAAS;CAKhC,CAFE,OAAO,UAAU,QAAQ,UAAU,OAAO,OAAO,QAAQ,IAElD,CAAC,GAAG,WAAW;AAC1B;AAEA,MAAa,gBAAgB;CAAC;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;AAAG;;;;;;AAO9E,MAAa,gBACV,eAA6C,mBAC7C,SAAc,YACb,OAAO,SAAS;CACd,GAAI,WAAW,CAAC;CAChB,QAAQ;EACN,GAAG,eAAe;EAClB,GAAG,eAAe;EAClB,GAAI,SAAS,UAAU,CAAC;CAC1B;AACF,CAAC;AAEL,MAAa,YACX,QACA,OACA,UAEA,SAAS,OAAO,WAAW,cACvB,GAAG,QAAQ,SAAS,QAAS,OAAO,UAAU,YAAYA,uBAAQ,QAASA,yBAC3E;AAEN,MAAa,mBACX,SACA,QAAwBC,sBACxB,QAAkCD,yBAElC,CAAC,OAAO,CAAC,CACN,KAAK,CAAC,CACN,KAAK,WAAW,SAAS,QAAQ,OAAO,KAAK,CAAC,CAAC,CAC/C,KAAK,IAAI;AAEd,MAAa,eACX,SACA,QAAwBE,sBACxB,QAAkCF,yBAElC,CAAC,OAAO,CAAC,CACN,KAAK,CAAC,CACN,KAAK,QAAQ,SAAS,KAAK,OAAO,KAAK,CAAC,CAAC,CACzC,KAAK,IAAI;AAEd,MAAa,gBACX,MACA,QAAwBG,qBACxB,QAAkCH,yBAElC,CAAC,IAAI,CAAC,CACH,KAAK,CAAC,CACN,KAAK,SAAS,SAAS,MAAM,OAAO,KAAK,CAAC,CAAC,CAC3C,KAAK,IAAI;AAEd,MAAa,kBACX,QACA,UAAgE;CAC9D,MAAMI;CACN,KAAKA;CACL,KAAKA;CACL,KAAKA;CACL,MAAMA;CACN,OAAOA;AACT,MACW;CACX,IAAI,WAAW,KAAK,WAAW,KAAK;EAClC,MAAM,QAAQ,QAAQ;EACtB,OAAO,SAAS,OAAO,SAAS,GAAG,KAAK;CAC1C;CAKA,MAAM,QAAQ,QADD,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,OAAO,OAAO,MAAM,CACnC;CACzB,OAAO,SAAS,OAAO,SAAS,GAAG,KAAK;AAC1C;AAEA,MAAa,kBACX,KACA,cAAc,GACd,aAAa,GACb,QACW;CACX,MAAM,SAAS,IAAI,OAAO,cAAc,UAAU;CAClD,MAAM,aAAa,IAAI,QAAQ,cAAc,KAAK,UAAU;CAE5D,IAAI,QAAQ,MACV,OAAO,SAAS,QAAQA,mBAAI;CAG9B,IAAI,OAAO,QAAQ,WACjB,OAAO,SAAS,IAAI,SAAS,GAAGA,mBAAI;CAGtC,IAAI,OAAO,QAAQ,UACjB,OAAO,SAAS,IAAI,SAAS,GAAGA,mBAAI;CAGtC,IAAI,OAAO,QAAQ,UAAU;EAC3B,MAAM,eAAe,uCAAuC,KAAK,GAAG;EACpE,MAAM,QAAQ,IAAI,WAAW,SAAS,KAAK,IAAI,WAAW,UAAU;EACpE,MAAM,SAAS,IAAI,SAAS,GAAG,KAAK,IAAI,SAAS,GAAG,KAAK,IAAI,SAAS,GAAG;EACzE,MAAM,SACJ,IAAI,WAAW,GAAG,KAClB,IAAI,WAAW,IAAI,KACnB,IAAI,WAAW,KAAK,KACpB,sBAAsB,KAAK,GAAG;EAChC,MAAM,WACJ,qBAAqB,KAAK,GAAG,KAAM,IAAI,UAAU,MAAM,CAAC,KAAK,KAAK,GAAG;EACvE,MAAM,YAAY,KAAK,KAAK,GAAG;EAE/B,IAAI,cAAc,OAAO,SAAS,IAAI,IAAI,IAAIF,oBAAK;EACnD,IAAI,OAAO,OAAO,SAAS,IAAI,IAAI,IAAIG,wBAAS;EAChD,IAAI,QAAQ,OAAO,SAAS,IAAI,IAAI,IAAIF,mBAAI;EAC5C,IAAI,QAAQ,OAAO,SAAS,IAAI,IAAI,IAAIE,wBAAS;EACjD,IAAI,UAAU,OAAO,SAAS,IAAI,IAAI,IAAIF,mBAAI;EAC9C,IAAI,WAAW,OAAO,SAAS,IAAI,IAAI,IAAIG,oBAAK;EAChD,OAAO,SAAS,IAAI,IAAI,IAAIF,mBAAI;CAClC;CAEA,IAAI,MAAM,QAAQ,GAAG,GAAG;EACtB,IAAI,IAAI,WAAW,GACjB,OAAO;EAQT,OAAO,MANO,IACX,KACE,SACC,GAAG,aAAa,eAAe,MAAM,cAAc,GAAG,YAAY,GAAG,GACzE,CAAC,CACA,KAAK,KACS,EAAE,IAAI,OAAO;CAChC;CAEA,IAAI,OAAO,QAAQ,UAAU;EAC3B,MAAM,OAAO,OAAO,KAAK,GAAG;EAE5B,IAAI,KAAK,WAAW,GAClB,OAAO;EAgBT,OAAO,MAbQ,KACZ,KAAK,QAAQ;GACZ,MAAM,aAAa,SAAS,IAAI,IAAI,IAAIG,yBAAU;GAClD,MAAM,QAAQ,IAAI;GAClB,MAAM,eAAe,eACnB,OACA,cAAc,GACd,YACA,GACF;GACA,OAAO,GAAG,aAAa,WAAW,IAAI;EACxC,CAAC,CAAC,CACD,KAAK,KACU,EAAE,IAAI,OAAO;CACjC;CAEA,OAAO,SAAS,OAAO,GAAG,GAAGJ,mBAAI;AACnC;AAEA,MAAa,eAAe,SAE1B,KAAK,QAAQ,mBAAmB,EAAE;AAEpC,MAAM,aAAa,WAA0D;CAC3E,IAAI,QAAgB;CACpB,IAAI,OAAO,WAAW,UACpB,QAAQ;CAEV,IAAI,OAAO,WAAW,UACpB,QAAQ,OAAO;CAEjB,IACE,MAAM,QAAQ,MAAM,KACpB,OAAO,OAAO,WAAW,OAAO,WAAW,QAAQ,GAEnD,QAAQ,KAAK,IAAI,GAAG,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC;CAErD,IACE,MAAM,QAAQ,MAAM,KACpB,OAAO,OAAO,WAAW,OAAO,WAAW,QAAQ,GAEnD,QAAQ,KAAK,IAAI,GAAG,MAAM;CAE5B,OAAO,KAAK,IAAI,OAAO,CAAC;AAC1B;AAEA,MAAM,sBAAsB;CAC1B,SAAS;CACT,SAAS;CACT,SAAS;CACT,KAAK;CACL,SAAS;AACX;;;;;;;AAQA,MAAa,SACX,MACA,YAQA,CAAC,IAAI,CAAC,CACH,KAAK,CAAC,CACN,KAAK,SAAS;CACb,MAAM,EAAE,SAAS,SAAS,SAAS,QAAQ;EACzC,GAAG;EACH,GAAI,WAAW,CAAC;CAClB;CAEA,MAAM,SAAS,UAAU,OAAO;CAChC,MAAM,eAAe,KAAK,IACxB,SACA,KAAK,IAAI,SAAU,SAAS,YAAY,IAAI,CAAC,CAAC,MAAM,CACtD;CAEA,IAAI,QAAQ,QACV,OAAO,GAAG,IAAI,OAAO,YAAY,IAAI;CAGvC,OAAO,GAAG,OAAO,IAAI,OAAO,YAAY;AAC1C,CAAC,CAAC,CACD,KAAK,EAAE;AAEZ,MAAa,IAAI,SAAS,KAAKK,kBAAG;AAClC,MAAa,IAAI,SAAS,KAAKP,oBAAK;AACpC,MAAa,QAAQ,SAAS,KAAKG,mBAAI"}
1
+ {"version":3,"file":"logger.cjs","names":["RESET","GREEN","BEIGE","GREY","BLUE","GREY_DARK","WHITE","GREY_LIGHT","RED"],"sources":["../../src/logger.ts"],"sourcesContent":["import type { Locale } from '@intlayer/types/allLocales';\nimport type {\n CustomIntlayerConfig,\n IntlayerConfig,\n} from '@intlayer/types/config';\nimport type * as ANSIColorsTypes from './colors';\nimport {\n BEIGE,\n BLUE,\n GREEN,\n GREY,\n GREY_DARK,\n GREY_LIGHT,\n RED,\n RESET,\n WHITE,\n} from './colors';\n\nexport type ANSIColorsType =\n (typeof ANSIColorsTypes)[keyof typeof ANSIColorsTypes];\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 config = details?.config ?? {};\n const mode = config.mode ?? 'default';\n\n if (mode === 'disabled' || (details?.isVerbose && mode !== 'verbose')) return;\n\n const prefix = getPrefix(config.prefix);\n const flatContent = prefix ? [prefix, ...[content].flat()] : [content].flat();\n const level = details?.level ?? 'info';\n\n const logMethod =\n config[level] ?? console[level] ?? config.log ?? console.log;\n\n logMethod(...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?: Pick<IntlayerConfig, 'log'>, 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 string: string,\n color?: ANSIColorsType,\n reset?: boolean | ANSIColorsType\n): string =>\n color && typeof window === 'undefined'\n ? `${color}${string}${reset ? (typeof reset === 'boolean' ? RESET : reset) : RESET}`\n : string;\n\nexport const colorizeLocales = (\n locales: Locale | Locale[],\n color: ANSIColorsType = GREEN,\n reset: boolean | ANSIColorsType = 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 = BEIGE,\n reset: boolean | ANSIColorsType = 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 = GREY,\n reset: boolean | ANSIColorsType = RESET\n) =>\n [path]\n .flat()\n .map((path) => colorize(path, color, reset))\n .join(`, `);\n\nexport const colorizeNumber = (\n number: number | string,\n options: Partial<Record<Intl.LDMLPluralRule, ANSIColorsType>> = {\n zero: BLUE,\n one: BLUE,\n two: BLUE,\n few: BLUE,\n many: BLUE,\n other: BLUE,\n }\n): string => {\n if (number === 0 || number === '0') {\n const color = options.zero ?? GREEN;\n return colorize(number.toString(), color);\n }\n\n // Kept inside the function. Top-level instantiation of classes/APIs\n // is treated as a side-effect and prevents tree-shaking if the function is unused.\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 colorizeObject = (\n obj: any,\n indentLevel = 0,\n indentSize = 2,\n key?: string\n): string => {\n const indent = ' '.repeat(indentLevel * indentSize);\n const nextIndent = ' '.repeat((indentLevel + 1) * indentSize);\n\n if (obj === null) {\n return colorize('null', BLUE);\n }\n\n if (typeof obj === 'boolean') {\n return colorize(obj.toString(), BLUE);\n }\n\n if (typeof obj === 'number') {\n return colorize(obj.toString(), BLUE);\n }\n\n if (typeof obj === 'string') {\n const isDateString = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/.test(obj);\n const isUrl = obj.startsWith('http://') || obj.startsWith('https://');\n const isGlob = obj.includes('*') || obj.includes('?') || obj.includes('{');\n const isPath =\n obj.startsWith('/') ||\n obj.startsWith('./') ||\n obj.startsWith('../') ||\n /\\.[a-zA-Z0-9]{2,5}$/.test(obj);\n const isSecret =\n /^[0-9a-fA-F]{24,}$/.test(obj) || (obj.length >= 40 && !/\\s/.test(obj));\n const hasSpaces = /\\s/.test(obj);\n\n if (isDateString) return colorize(`\"${obj}\"`, BEIGE);\n if (isUrl) return colorize(`\"${obj}\"`, GREY_DARK);\n if (isGlob) return colorize(`\"${obj}\"`, GREY);\n if (isPath) return colorize(`\"${obj}\"`, GREY_DARK);\n if (isSecret) return colorize(`\"${obj}\"`, GREY);\n if (hasSpaces) return colorize(`\"${obj}\"`, WHITE);\n return colorize(`\"${obj}\"`, BLUE);\n }\n\n if (Array.isArray(obj)) {\n if (obj.length === 0) {\n return '[]';\n }\n const items = obj\n .map(\n (item) =>\n `${nextIndent}${colorizeObject(item, indentLevel + 1, indentSize, key)}`\n )\n .join(',\\n');\n return `[\\n${items}\\n${indent}]`;\n }\n\n if (typeof obj === 'object') {\n const keys = Object.keys(obj);\n\n if (keys.length === 0) {\n return '{}';\n }\n\n const fields = keys\n .map((key) => {\n const coloredKey = colorize(`\"${key}\"`, GREY_LIGHT);\n const value = obj[key];\n const coloredValue = colorizeObject(\n value,\n indentLevel + 1,\n indentSize,\n key\n );\n return `${nextIndent}${coloredKey}: ${coloredValue}`;\n })\n .join(',\\n');\n return `{\\n${fields}\\n${indent}}`;\n }\n\n return colorize(String(obj), GREY);\n};\n\nexport const removeColor = (text: string) =>\n // oxlint-disable-next-line no-control-regex -- 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 (\n Array.isArray(length) &&\n length.every((locale) => typeof locale === 'string')\n ) {\n value = Math.max(...length.map((str) => str.length));\n }\n if (\n Array.isArray(length) &&\n length.every((locale) => typeof locale === 'number')\n ) {\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('✗', RED);\nexport const v = colorize('✓', GREEN);\nexport const clock = colorize('⏲', BLUE);\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"alias.cjs","names":["getExtension","normalizePath","relative","join"],"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\n/**\n * Generated entry files of `.intlayer/main`, keyed by the\n * `@intlayer/dictionaries-entry` subpath that resolves to them.\n */\nconst DICTIONARIES_ENTRY_SUBPATH_FILES = {\n unmerged: 'unmerged_dictionaries',\n remote: 'remote_dictionaries',\n dynamic: 'dynamic_dictionaries',\n fetch: 'fetch_dictionaries',\n} as const;\n\ntype DictionariesEntrySubpath = keyof typeof DICTIONARIES_ENTRY_SUBPATH_FILES;\n\ntype DictionariesEntrySubpathAlias = {\n [Subpath in DictionariesEntrySubpath as `@intlayer/dictionaries-entry/${Subpath}`]: string;\n};\n\n/**\n * Maps the aliasable Intlayer packages to the generated `.intlayer` files so\n * bundlers (webpack, Vite, Turbopack, esbuild, Metro, …) resolve them to the\n * app's own dictionaries and hot reload on any content change.\n *\n * Key order matters: webpack (enhanced-resolve) and Vite match string aliases\n * by prefix and stop at the first hit, so the bare `@intlayer/dictionaries-entry`\n * key MUST come after its subpaths, otherwise `@intlayer/dictionaries-entry/remote`\n * would be rewritten to `<dictionaries entry>/remote`.\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, mainDir, configDir } = configuration.system;\n\n const toAliasPath = (absolutePath: string) =>\n formatter(normalizePath(relative(baseDir, absolutePath)));\n\n const subpathAlias = Object.fromEntries(\n Object.entries(DICTIONARIES_ENTRY_SUBPATH_FILES).map(\n ([subpath, fileName]) => [\n `@intlayer/dictionaries-entry/${subpath}`,\n toAliasPath(join(mainDir, `${fileName}.${extension}`)),\n ]\n )\n ) as DictionariesEntrySubpathAlias;\n\n return {\n ...subpathAlias,\n '@intlayer/dictionaries-entry': toAliasPath(\n join(mainDir, `dictionaries.${extension}`)\n ),\n '@intlayer/config/built': toAliasPath(\n join(configDir, `configuration.${extension}`)\n ),\n };\n};\n"],"mappings":";;;;;;;;;;AAeA,MAAM,mCAAmC;CACvC,UAAU;CACV,QAAQ;CACR,SAAS;CACT,OAAO;AACT;;;;;;;;;;;AAkBA,MAAa,YAAY,EACvB,eACA,QACA,aAAa,UAAkB,YACV;CACrB,MAAM,YAAYA,wCAChB,eACA,UAAU,cAAc,MAAM,aAAa,MAAM,KACnD;CAEA,MAAM,EAAE,SAAS,SAAS,cAAc,cAAc;CAEtD,MAAM,eAAe,iBACnB,UAAUC,8CAAcC,oBAAS,SAAS,YAAY,CAAC,CAAC;CAW1D,OAAO;EACL,GAVmB,OAAO,YAC1B,OAAO,QAAQ,gCAAgC,CAAC,CAAC,KAC9C,CAAC,SAAS,cAAc,CACvB,gCAAgC,WAChC,gBAAYC,gBAAK,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC,CACvD,CACF,CAIc;EACd,gCAAgC,gBAC9BA,gBAAK,SAAS,gBAAgB,WAAW,CAC3C;EACA,0BAA0B,gBACxBA,gBAAK,WAAW,iBAAiB,WAAW,CAC9C;CACF;AACF"}
1
+ {"version":3,"file":"alias.cjs","names":["getExtension","normalizePath","relative","join"],"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\n/**\n * Generated entry files of `.intlayer/main`, keyed by the\n * `@intlayer/dictionaries-entry` subpath that resolves to them.\n */\nconst DICTIONARIES_ENTRY_SUBPATH_FILES = {\n unmerged: 'unmerged_dictionaries',\n remote: 'remote_dictionaries',\n dynamic: 'dynamic_dictionaries',\n fetch: 'fetch_dictionaries',\n} as const;\n\ntype DictionariesEntrySubpath = keyof typeof DICTIONARIES_ENTRY_SUBPATH_FILES;\n\ntype DictionariesEntrySubpathAlias = {\n [\n Subpath in DictionariesEntrySubpath as `@intlayer/dictionaries-entry/${Subpath}`\n ]: string;\n};\n\n/**\n * Maps the aliasable Intlayer packages to the generated `.intlayer` files so\n * bundlers (webpack, Vite, Turbopack, esbuild, Metro, …) resolve them to the\n * app's own dictionaries and hot reload on any content change.\n *\n * Key order matters: webpack (enhanced-resolve) and Vite match string aliases\n * by prefix and stop at the first hit, so the bare `@intlayer/dictionaries-entry`\n * key MUST come after its subpaths, otherwise `@intlayer/dictionaries-entry/remote`\n * would be rewritten to `<dictionaries entry>/remote`.\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, mainDir, configDir } = configuration.system;\n\n const toAliasPath = (absolutePath: string) =>\n formatter(normalizePath(relative(baseDir, absolutePath)));\n\n const subpathAlias = Object.fromEntries(\n Object.entries(DICTIONARIES_ENTRY_SUBPATH_FILES).map(\n ([subpath, fileName]) => [\n `@intlayer/dictionaries-entry/${subpath}`,\n toAliasPath(join(mainDir, `${fileName}.${extension}`)),\n ]\n )\n ) as DictionariesEntrySubpathAlias;\n\n return {\n ...subpathAlias,\n '@intlayer/dictionaries-entry': toAliasPath(\n join(mainDir, `dictionaries.${extension}`)\n ),\n '@intlayer/config/built': toAliasPath(\n join(configDir, `configuration.${extension}`)\n ),\n };\n};\n"],"mappings":";;;;;;;;;;AAeA,MAAM,mCAAmC;CACvC,UAAU;CACV,QAAQ;CACR,SAAS;CACT,OAAO;AACT;;;;;;;;;;;AAoBA,MAAa,YAAY,EACvB,eACA,QACA,aAAa,UAAkB,YACV;CACrB,MAAM,YAAYA,wCAChB,eACA,UAAU,cAAc,MAAM,aAAa,MAAM,KACnD;CAEA,MAAM,EAAE,SAAS,SAAS,cAAc,cAAc;CAEtD,MAAM,eAAe,iBACnB,UAAUC,8CAAcC,oBAAS,SAAS,YAAY,CAAC,CAAC;CAW1D,OAAO;EACL,GAVmB,OAAO,YAC1B,OAAO,QAAQ,gCAAgC,CAAC,CAAC,KAC9C,CAAC,SAAS,cAAc,CACvB,gCAAgC,WAChC,gBAAYC,gBAAK,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC,CACvD,CACF,CAIc;EACd,gCAAgC,gBAC9BA,gBAAK,SAAS,gBAAgB,WAAW,CAC3C;EACA,0BAA0B,gBACxBA,gBAAK,WAAW,iBAAiB,WAAW,CAC9C;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"cacheDisk.cjs","names":["mkdir","basename","join","writeFile","rename","rm","computeKeyId","stat","readFile","gunzipSync","deserialize","configPackageJson","unlink","dirname","serialize","gzipSync"],"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\n/** Clears the in-memory portion of the disk cache without touching disk files. */\nexport const clearDiskCacheMemory = (): void => {\n cacheMap.clear();\n};\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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"}
1
+ {"version":3,"file":"cacheDisk.cjs","names":["mkdir","basename","join","writeFile","rename","rm","computeKeyId","stat","readFile","gunzipSync","deserialize","configPackageJson","unlink","dirname","serialize","gzipSync"],"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 { type: 'json' };\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\n/** Clears the in-memory portion of the disk cache without touching disk files. */\nexport const clearDiskCacheMemory = (): void => {\n cacheMap.clear();\n};\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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"}
@@ -7,6 +7,10 @@ const require_utils_chunkArray = require("./chunkArray.cjs");
7
7
  const require_utils_clearModuleCache = require("./clearModuleCache.cjs");
8
8
  const require_utils_compareVersions = require("./compareVersions.cjs");
9
9
  const require_utils_ESMxCJSHelpers = require("./ESMxCJSHelpers.cjs");
10
+ const require_utils_stringFormatter_camelCaseToKebabCase = require("./stringFormatter/camelCaseToKebabCase.cjs");
11
+ const require_utils_stringFormatter_camelCaseToSentence = require("./stringFormatter/camelCaseToSentence.cjs");
12
+ const require_utils_stringFormatter_kebabCaseToCamelCase = require("./stringFormatter/kebabCaseToCamelCase.cjs");
13
+ const require_utils_stringFormatter_toLowerCamelCase = require("./stringFormatter/toLowerCamelCase.cjs");
10
14
  const require_utils_extractErrorMessage = require("./extractErrorMessage.cjs");
11
15
  const require_utils_getDictionarySelectorUsage = require("./getDictionarySelectorUsage.cjs");
12
16
  const require_utils_getExtension = require("./getExtension.cjs");
@@ -22,10 +26,6 @@ const require_utils_pathSecurity = require("./pathSecurity.cjs");
22
26
  const require_utils_pLimit = require("./pLimit.cjs");
23
27
  const require_utils_retryManager = require("./retryManager.cjs");
24
28
  const require_utils_setIntlayerIdentifier = require("./setIntlayerIdentifier.cjs");
25
- const require_utils_stringFormatter_camelCaseToKebabCase = require("./stringFormatter/camelCaseToKebabCase.cjs");
26
- const require_utils_stringFormatter_camelCaseToSentence = require("./stringFormatter/camelCaseToSentence.cjs");
27
- const require_utils_stringFormatter_kebabCaseToCamelCase = require("./stringFormatter/kebabCaseToCamelCase.cjs");
28
- const require_utils_stringFormatter_toLowerCamelCase = require("./stringFormatter/toLowerCamelCase.cjs");
29
29
 
30
30
  exports.BUILT_CONFIG_KEYS = require_utils_builtConfigKeys.BUILT_CONFIG_KEYS;
31
31
  exports.Queue = require_utils_pLimit.Queue;
@@ -5,10 +5,10 @@ import { logStack } from "./utils/logStack.mjs";
5
5
  import { normalizePath } from "./utils/normalizePath.mjs";
6
6
  import { parallelize } from "./utils/parallelize.mjs";
7
7
  import { pLimit } from "./utils/pLimit.mjs";
8
+ import { setIntlayerIdentifier } from "./utils/setIntlayerIdentifier.mjs";
8
9
  import { camelCaseToKebabCase } from "./utils/stringFormatter/camelCaseToKebabCase.mjs";
9
10
  import { camelCaseToSentence } from "./utils/stringFormatter/camelCaseToSentence.mjs";
10
11
  import { kebabCaseToCamelCase } from "./utils/stringFormatter/kebabCaseToCamelCase.mjs";
11
12
  import { toLowerCamelCase } from "./utils/stringFormatter/toLowerCamelCase.mjs";
12
- import { setIntlayerIdentifier } from "./utils/setIntlayerIdentifier.mjs";
13
13
 
14
14
  export { bindLogFunction, buildAnalyticsFields, buildBrowserConfiguration, buildEditorFields, buildInternationalizationFields, buildLogFields, buildRoutingFields, camelCaseToKebabCase, camelCaseToSentence, chunkArray, extractBrowserConfiguration, extractErrorMessage, kebabCaseToCamelCase, logStack, normalizePath, pLimit, parallelize, setIntlayerIdentifier, toLowerCamelCase };
@@ -1 +1 @@
1
- {"version":3,"file":"transpileTSToCJS.mjs","names":[],"sources":["../../../src/loadExternalFile/transpileTSToCJS.ts"],"sourcesContent":["import { existsSync, statSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { dirname, extname, isAbsolute, join, resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport {\n type BuildOptions,\n type BuildResult,\n build,\n buildSync,\n type Metafile,\n} from 'esbuild';\nimport { computeKeyId } from '../utils/cacheMemory';\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\n/**\n * Cache of resolved tsconfig paths keyed by the file's directory.\n * Avoids re-walking to package.json + existsSync on every transpilation.\n */\nconst tsConfigPathCache = new Map<string, string | undefined>();\n\nconst getTsConfigPath = (filePath: string): string | undefined => {\n const fileDirectory = dirname(filePath);\n\n if (tsConfigPathCache.has(fileDirectory)) {\n return tsConfigPathCache.get(fileDirectory);\n }\n\n let resolvedPath: string | undefined;\n try {\n const tsconfigPath = join(\n getPackageJsonPath(fileDirectory).baseDir,\n 'tsconfig.json'\n );\n\n // Only return the tsconfig path if it exists\n resolvedPath = existsSync(tsconfigPath) ? tsconfigPath : undefined;\n } catch {\n // No package.json found up the tree — transpile without a tsconfig\n resolvedPath = undefined;\n }\n\n tsConfigPathCache.set(fileDirectory, resolvedPath);\n\n return resolvedPath;\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 // The metafile lists every bundled input, which the transpile cache uses to\n // invalidate when an imported file changes (the entry itself is keyed by hash).\n metafile: true,\n tsconfig: getTsConfigPath(filePath),\n define: {\n 'import.meta.url': JSON.stringify(pathToFileURL(filePath).href),\n 'import.meta.env': 'process.env',\n },\n});\n\n/** Fingerprint of a bundled input file, used to detect changes without re-reading it. */\ntype TranspileCacheInput = {\n path: string;\n mtimeMs: number;\n size: number;\n};\n\ntype TranspileCacheEntry = {\n /** Hash of the entry file's source code. */\n codeHash: string;\n /** Hash of the build options, so different option sets don't collide. */\n optionsKey: string;\n /** The transpiled CJS output. */\n output: string;\n /** Fingerprints of every non-entry input bundled into the output. */\n inputs: TranspileCacheInput[];\n};\n\n/**\n * In-memory cache of transpiled outputs keyed by entry file path (one entry\n * per file, so re-transpilations replace rather than accumulate).\n * The entry file is validated by content hash; bundled relative imports are\n * validated by mtime + size so an edited dependency invalidates the cache.\n */\nconst transpileCache = new Map<string, TranspileCacheEntry>();\n\nconst isInputUnchanged = (input: TranspileCacheInput): boolean => {\n try {\n const stats = statSync(input.path);\n return stats.mtimeMs === input.mtimeMs && stats.size === input.size;\n } catch {\n // File removed or unreadable — treat as changed\n return false;\n }\n};\n\nconst getCachedTranspilation = (\n filePath: string,\n codeHash: string,\n optionsKey: string\n): string | undefined => {\n const cacheEntry = transpileCache.get(filePath);\n\n if (!cacheEntry) return undefined;\n if (cacheEntry.codeHash !== codeHash) return undefined;\n if (cacheEntry.optionsKey !== optionsKey) return undefined;\n if (!cacheEntry.inputs.every(isInputUnchanged)) return undefined;\n\n return cacheEntry.output;\n};\n\n/**\n * Extracts the fingerprints of every bundled input from the esbuild metafile.\n * Returns `undefined` when an input cannot be fingerprinted (the result should\n * then not be cached, as invalidation would be unreliable).\n */\nconst getInputFingerprints = (\n metafile: Metafile | undefined,\n entryFilePath: string\n): TranspileCacheInput[] | undefined => {\n if (!metafile) return undefined;\n\n const resolvedEntryFilePath = resolve(entryFilePath);\n const inputs: TranspileCacheInput[] = [];\n\n for (const inputPath of Object.keys(metafile.inputs)) {\n // The entry itself is provided via stdin and validated by content hash.\n // esbuild labels it \"<stdin>\", or with the sourcefile path when set.\n if (inputPath === '<stdin>') continue;\n // Virtual modules from plugins (e.g. \"plugin:...\") cannot be fingerprinted\n if (inputPath.includes(':') && !isAbsolute(inputPath)) return undefined;\n\n const absoluteInputPath = isAbsolute(inputPath)\n ? inputPath\n : resolve(process.cwd(), inputPath);\n\n if (absoluteInputPath === resolvedEntryFilePath) continue;\n\n try {\n const stats = statSync(absoluteInputPath);\n inputs.push({\n path: absoluteInputPath,\n mtimeMs: stats.mtimeMs,\n size: stats.size,\n });\n } catch {\n return undefined;\n }\n }\n\n return inputs;\n};\n\nconst setCachedTranspilation = (\n filePath: string,\n codeHash: string,\n optionsKey: string,\n moduleResult: BuildResult,\n output: string\n): void => {\n const inputs = getInputFingerprints(moduleResult.metafile, filePath);\n\n // Without a usable metafile the cache cannot be invalidated reliably — skip\n if (!inputs) return;\n\n transpileCache.set(filePath, { codeHash, optionsKey, output, inputs });\n};\n\n/** Clears the in-memory transpilation cache (mainly for tests). */\nexport const clearTranspileCache = (): void => {\n transpileCache.clear();\n tsConfigPathCache.clear();\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\n const codeHash = computeKeyId([code]);\n const optionsKey = computeKeyId([buildOptions]);\n\n const cachedOutput = getCachedTranspilation(filePath, codeHash, optionsKey);\n if (typeof cachedOutput === 'string') return cachedOutput;\n\n const esbuildBuildSync = esbuildInstance?.buildSync ?? buildSync;\n\n // esbuild's worker thread service calls `new Worker(__filename, …)` on first use.\n // In Vite's SSR module runner the SSR-optimised chunk is ESM and __filename is\n // never declared (confirmed: accessing it throws ReferenceError, not undefined).\n // Because there is no local declaration the bare `__filename` lookup falls\n // through to globalThis, so we set it there to esbuild's own CJS entry-point –\n // the exact path esbuild would use if it were loaded in a normal CJS context.\n //\n // IMPORTANT: We save/restore the globals so this temporary shim does not leak\n // to other Vite plugins (e.g. `@vitejs/plugin-react-swc`) that check\n // `typeof __dirname !== \"undefined\"` to locate their own assets.\n const g = globalThis as Record<string, unknown>;\n const hadFilename = typeof g.__filename === 'string';\n const prevFilename = g.__filename;\n const prevDirname = g.__dirname;\n\n if (!hadFilename) {\n try {\n const _require = createRequire(import.meta.url);\n const esbuildEntry = _require.resolve('esbuild');\n g.__filename = esbuildEntry;\n g.__dirname = dirname(esbuildEntry);\n } catch {\n // Best-effort: if esbuild can't be resolved the caller's catch handles it\n }\n }\n\n let moduleResult: BuildResult;\n try {\n moduleResult = 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 } finally {\n // Always restore the previous values so the globals don't linger.\n if (!hadFilename) {\n if (prevFilename === undefined) {\n // biome-ignore lint/performance/noDelete: the global must be truly absent — assigning undefined would leave the key present and break `typeof __filename` checks in other tools\n delete g.__filename;\n } else {\n g.__filename = prevFilename;\n }\n if (prevDirname === undefined) {\n // biome-ignore lint/performance/noDelete: same as __filename above\n delete g.__dirname;\n } else {\n g.__dirname = prevDirname;\n }\n }\n }\n\n const moduleResultString = moduleResult!.outputFiles?.[0]?.text;\n\n if (typeof moduleResultString === 'string') {\n setCachedTranspilation(\n filePath,\n codeHash,\n optionsKey,\n moduleResult!,\n moduleResultString\n );\n }\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\n const codeHash = computeKeyId([code]);\n const optionsKey = computeKeyId([buildOptions]);\n\n const cachedOutput = getCachedTranspilation(filePath, codeHash, optionsKey);\n if (typeof cachedOutput === 'string') return cachedOutput;\n\n // A one-shot build() releases its Go-side resources on completion and costs a\n // single service round-trip (context()+rebuild()+dispose() costs three).\n const esbuildBuild = esbuildInstance?.build ?? build;\n\n const moduleResult = await esbuildBuild({\n stdin: {\n contents: code,\n loader,\n resolveDir: dirname(filePath),\n sourcefile: filePath,\n },\n ...getTransformationOptions(filePath),\n ...buildOptions,\n });\n\n const moduleResultString = moduleResult.outputFiles?.[0]?.text;\n\n if (typeof moduleResultString === 'string') {\n setCachedTranspilation(\n filePath,\n codeHash,\n optionsKey,\n moduleResult,\n moduleResultString\n );\n }\n\n return moduleResultString;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"transpileTSToCJS.mjs","names":[],"sources":["../../../src/loadExternalFile/transpileTSToCJS.ts"],"sourcesContent":["import { existsSync, statSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { dirname, extname, isAbsolute, join, resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport {\n type BuildOptions,\n type BuildResult,\n build,\n buildSync,\n type Metafile,\n} from 'esbuild';\nimport { computeKeyId } from '../utils/cacheMemory';\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\n/**\n * Cache of resolved tsconfig paths keyed by the file's directory.\n * Avoids re-walking to package.json + existsSync on every transpilation.\n */\nconst tsConfigPathCache = new Map<string, string | undefined>();\n\nconst getTsConfigPath = (filePath: string): string | undefined => {\n const fileDirectory = dirname(filePath);\n\n if (tsConfigPathCache.has(fileDirectory)) {\n return tsConfigPathCache.get(fileDirectory);\n }\n\n let resolvedPath: string | undefined;\n try {\n const tsconfigPath = join(\n getPackageJsonPath(fileDirectory).baseDir,\n 'tsconfig.json'\n );\n\n // Only return the tsconfig path if it exists\n resolvedPath = existsSync(tsconfigPath) ? tsconfigPath : undefined;\n } catch {\n // No package.json found up the tree — transpile without a tsconfig\n resolvedPath = undefined;\n }\n\n tsConfigPathCache.set(fileDirectory, resolvedPath);\n\n return resolvedPath;\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 // The metafile lists every bundled input, which the transpile cache uses to\n // invalidate when an imported file changes (the entry itself is keyed by hash).\n metafile: true,\n tsconfig: getTsConfigPath(filePath),\n define: {\n 'import.meta.url': JSON.stringify(pathToFileURL(filePath).href),\n 'import.meta.env': 'process.env',\n },\n});\n\n/** Fingerprint of a bundled input file, used to detect changes without re-reading it. */\ntype TranspileCacheInput = {\n path: string;\n mtimeMs: number;\n size: number;\n};\n\ntype TranspileCacheEntry = {\n /** Hash of the entry file's source code. */\n codeHash: string;\n /** Hash of the build options, so different option sets don't collide. */\n optionsKey: string;\n /** The transpiled CJS output. */\n output: string;\n /** Fingerprints of every non-entry input bundled into the output. */\n inputs: TranspileCacheInput[];\n};\n\n/**\n * In-memory cache of transpiled outputs keyed by entry file path (one entry\n * per file, so re-transpilations replace rather than accumulate).\n * The entry file is validated by content hash; bundled relative imports are\n * validated by mtime + size so an edited dependency invalidates the cache.\n */\nconst transpileCache = new Map<string, TranspileCacheEntry>();\n\nconst isInputUnchanged = (input: TranspileCacheInput): boolean => {\n try {\n const stats = statSync(input.path);\n return stats.mtimeMs === input.mtimeMs && stats.size === input.size;\n } catch {\n // File removed or unreadable — treat as changed\n return false;\n }\n};\n\nconst getCachedTranspilation = (\n filePath: string,\n codeHash: string,\n optionsKey: string\n): string | undefined => {\n const cacheEntry = transpileCache.get(filePath);\n\n if (!cacheEntry) return undefined;\n if (cacheEntry.codeHash !== codeHash) return undefined;\n if (cacheEntry.optionsKey !== optionsKey) return undefined;\n if (!cacheEntry.inputs.every(isInputUnchanged)) return undefined;\n\n return cacheEntry.output;\n};\n\n/**\n * Extracts the fingerprints of every bundled input from the esbuild metafile.\n * Returns `undefined` when an input cannot be fingerprinted (the result should\n * then not be cached, as invalidation would be unreliable).\n */\nconst getInputFingerprints = (\n metafile: Metafile | undefined,\n entryFilePath: string\n): TranspileCacheInput[] | undefined => {\n if (!metafile) return undefined;\n\n const resolvedEntryFilePath = resolve(entryFilePath);\n const inputs: TranspileCacheInput[] = [];\n\n for (const inputPath of Object.keys(metafile.inputs)) {\n // The entry itself is provided via stdin and validated by content hash.\n // esbuild labels it \"<stdin>\", or with the sourcefile path when set.\n if (inputPath === '<stdin>') continue;\n // Virtual modules from plugins (e.g. \"plugin:...\") cannot be fingerprinted\n if (inputPath.includes(':') && !isAbsolute(inputPath)) return undefined;\n\n const absoluteInputPath = isAbsolute(inputPath)\n ? inputPath\n : resolve(process.cwd(), inputPath);\n\n if (absoluteInputPath === resolvedEntryFilePath) continue;\n\n try {\n const stats = statSync(absoluteInputPath);\n inputs.push({\n path: absoluteInputPath,\n mtimeMs: stats.mtimeMs,\n size: stats.size,\n });\n } catch {\n return undefined;\n }\n }\n\n return inputs;\n};\n\nconst setCachedTranspilation = (\n filePath: string,\n codeHash: string,\n optionsKey: string,\n moduleResult: BuildResult,\n output: string\n): void => {\n const inputs = getInputFingerprints(moduleResult.metafile, filePath);\n\n // Without a usable metafile the cache cannot be invalidated reliably — skip\n if (!inputs) return;\n\n transpileCache.set(filePath, { codeHash, optionsKey, output, inputs });\n};\n\n/** Clears the in-memory transpilation cache (mainly for tests). */\nexport const clearTranspileCache = (): void => {\n transpileCache.clear();\n tsConfigPathCache.clear();\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\n const codeHash = computeKeyId([code]);\n const optionsKey = computeKeyId([buildOptions]);\n\n const cachedOutput = getCachedTranspilation(filePath, codeHash, optionsKey);\n if (typeof cachedOutput === 'string') return cachedOutput;\n\n const esbuildBuildSync = esbuildInstance?.buildSync ?? buildSync;\n\n // esbuild's worker thread service calls `new Worker(__filename, …)` on first use.\n // In Vite's SSR module runner the SSR-optimised chunk is ESM and __filename is\n // never declared (confirmed: accessing it throws ReferenceError, not undefined).\n // Because there is no local declaration the bare `__filename` lookup falls\n // through to globalThis, so we set it there to esbuild's own CJS entry-point –\n // the exact path esbuild would use if it were loaded in a normal CJS context.\n //\n // IMPORTANT: We save/restore the globals so this temporary shim does not leak\n // to other Vite plugins (e.g. `@vitejs/plugin-react-swc`) that check\n // `typeof __dirname !== \"undefined\"` to locate their own assets.\n const g = globalThis as Record<string, unknown>;\n const hadFilename = typeof g.__filename === 'string';\n const prevFilename = g.__filename;\n const prevDirname = g.__dirname;\n\n if (!hadFilename) {\n try {\n const _require = createRequire(import.meta.url);\n const esbuildEntry = _require.resolve('esbuild');\n g.__filename = esbuildEntry;\n g.__dirname = dirname(esbuildEntry);\n } catch {\n // Best-effort: if esbuild can't be resolved the caller's catch handles it\n }\n }\n\n let moduleResult: BuildResult;\n try {\n moduleResult = 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 } finally {\n // Always restore the previous values so the globals don't linger.\n if (!hadFilename) {\n if (prevFilename === undefined) {\n // oxlint-disable-next-line typescript/no-dynamic-delete -- the global must be truly absent — assigning undefined would leave the key present and break `typeof __filename` checks in other tools\n delete g.__filename;\n } else {\n g.__filename = prevFilename;\n }\n if (prevDirname === undefined) {\n // oxlint-disable-next-line typescript/no-dynamic-delete -- same as __filename above\n delete g.__dirname;\n } else {\n g.__dirname = prevDirname;\n }\n }\n }\n\n const moduleResultString = moduleResult!.outputFiles?.[0]?.text;\n\n if (typeof moduleResultString === 'string') {\n setCachedTranspilation(\n filePath,\n codeHash,\n optionsKey,\n moduleResult!,\n moduleResultString\n );\n }\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\n const codeHash = computeKeyId([code]);\n const optionsKey = computeKeyId([buildOptions]);\n\n const cachedOutput = getCachedTranspilation(filePath, codeHash, optionsKey);\n if (typeof cachedOutput === 'string') return cachedOutput;\n\n // A one-shot build() releases its Go-side resources on completion and costs a\n // single service round-trip (context()+rebuild()+dispose() costs three).\n const esbuildBuild = esbuildInstance?.build ?? build;\n\n const moduleResult = await esbuildBuild({\n stdin: {\n contents: code,\n loader,\n resolveDir: dirname(filePath),\n sourcefile: filePath,\n },\n ...getTransformationOptions(filePath),\n ...buildOptions,\n });\n\n const moduleResultString = moduleResult.outputFiles?.[0]?.text;\n\n if (typeof moduleResultString === 'string') {\n setCachedTranspilation(\n filePath,\n codeHash,\n optionsKey,\n moduleResult,\n moduleResultString\n );\n }\n\n return moduleResultString;\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"logger.mjs","names":[],"sources":["../../src/logger.ts"],"sourcesContent":["import type { Locale } from '@intlayer/types/allLocales';\nimport type {\n CustomIntlayerConfig,\n IntlayerConfig,\n} from '@intlayer/types/config';\nimport type * as ANSIColorsTypes from './colors';\nimport {\n BEIGE,\n BLUE,\n GREEN,\n GREY,\n GREY_DARK,\n GREY_LIGHT,\n RED,\n RESET,\n WHITE,\n} from './colors';\n\nexport type ANSIColorsType =\n (typeof ANSIColorsTypes)[keyof typeof ANSIColorsTypes];\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 config = details?.config ?? {};\n const mode = config.mode ?? 'default';\n\n if (mode === 'disabled' || (details?.isVerbose && mode !== 'verbose')) return;\n\n const prefix = getPrefix(config.prefix);\n const flatContent = prefix ? [prefix, ...[content].flat()] : [content].flat();\n const level = details?.level ?? 'info';\n\n const logMethod =\n config[level] ?? console[level] ?? config.log ?? console.log;\n\n logMethod(...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?: Pick<IntlayerConfig, 'log'>, 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 string: string,\n color?: ANSIColorsType,\n reset?: boolean | ANSIColorsType\n): string =>\n color && typeof window === 'undefined'\n ? `${color}${string}${reset ? (typeof reset === 'boolean' ? RESET : reset) : RESET}`\n : string;\n\nexport const colorizeLocales = (\n locales: Locale | Locale[],\n color: ANSIColorsType = GREEN,\n reset: boolean | ANSIColorsType = 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 = BEIGE,\n reset: boolean | ANSIColorsType = 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 = GREY,\n reset: boolean | ANSIColorsType = RESET\n) =>\n [path]\n .flat()\n .map((path) => colorize(path, color, reset))\n .join(`, `);\n\nexport const colorizeNumber = (\n number: number | string,\n options: Partial<Record<Intl.LDMLPluralRule, ANSIColorsType>> = {\n zero: BLUE,\n one: BLUE,\n two: BLUE,\n few: BLUE,\n many: BLUE,\n other: BLUE,\n }\n): string => {\n if (number === 0 || number === '0') {\n const color = options.zero ?? GREEN;\n return colorize(number.toString(), color);\n }\n\n // Kept inside the function. Top-level instantiation of classes/APIs\n // is treated as a side-effect and prevents tree-shaking if the function is unused.\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 colorizeObject = (\n obj: any,\n indentLevel = 0,\n indentSize = 2,\n key?: string\n): string => {\n const indent = ' '.repeat(indentLevel * indentSize);\n const nextIndent = ' '.repeat((indentLevel + 1) * indentSize);\n\n if (obj === null) {\n return colorize('null', BLUE);\n }\n\n if (typeof obj === 'boolean') {\n return colorize(obj.toString(), BLUE);\n }\n\n if (typeof obj === 'number') {\n return colorize(obj.toString(), BLUE);\n }\n\n if (typeof obj === 'string') {\n const isDateString = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/.test(obj);\n const isUrl = obj.startsWith('http://') || obj.startsWith('https://');\n const isGlob = obj.includes('*') || obj.includes('?') || obj.includes('{');\n const isPath =\n obj.startsWith('/') ||\n obj.startsWith('./') ||\n obj.startsWith('../') ||\n /\\.[a-zA-Z0-9]{2,5}$/.test(obj);\n const isSecret =\n /^[0-9a-fA-F]{24,}$/.test(obj) || (obj.length >= 40 && !/\\s/.test(obj));\n const hasSpaces = /\\s/.test(obj);\n\n if (isDateString) return colorize(`\"${obj}\"`, BEIGE);\n if (isUrl) return colorize(`\"${obj}\"`, GREY_DARK);\n if (isGlob) return colorize(`\"${obj}\"`, GREY);\n if (isPath) return colorize(`\"${obj}\"`, GREY_DARK);\n if (isSecret) return colorize(`\"${obj}\"`, GREY);\n if (hasSpaces) return colorize(`\"${obj}\"`, WHITE);\n return colorize(`\"${obj}\"`, BLUE);\n }\n\n if (Array.isArray(obj)) {\n if (obj.length === 0) {\n return '[]';\n }\n const items = obj\n .map(\n (item) =>\n `${nextIndent}${colorizeObject(item, indentLevel + 1, indentSize, key)}`\n )\n .join(',\\n');\n return `[\\n${items}\\n${indent}]`;\n }\n\n if (typeof obj === 'object') {\n const keys = Object.keys(obj);\n\n if (keys.length === 0) {\n return '{}';\n }\n\n const fields = keys\n .map((key) => {\n const coloredKey = colorize(`\"${key}\"`, GREY_LIGHT);\n const value = obj[key];\n const coloredValue = colorizeObject(\n value,\n indentLevel + 1,\n indentSize,\n key\n );\n return `${nextIndent}${coloredKey}: ${coloredValue}`;\n })\n .join(',\\n');\n return `{\\n${fields}\\n${indent}}`;\n }\n\n return colorize(String(obj), GREY);\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 (\n Array.isArray(length) &&\n length.every((locale) => typeof locale === 'string')\n ) {\n value = Math.max(...length.map((str) => str.length));\n }\n if (\n Array.isArray(length) &&\n length.every((locale) => typeof locale === 'number')\n ) {\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('✗', RED);\nexport const v = colorize('✓', GREEN);\nexport const clock = colorize('⏲', BLUE);\n"],"mappings":";;;AA6BA,IAAI;AAEJ,MAAa,aAAa,WAA+B;CACvD,eAAe;AACjB;AAEA,MAAa,aAAa,iBAA8C;CACtE,IAAI,OAAO,iBAAiB,aAC1B,OAAO;CAGT,OAAO;AACT;AAEA,MAAa,UAAkB,SAAS,YAAY;CAClD,MAAM,SAAS,SAAS,UAAU,CAAC;CACnC,MAAM,OAAO,OAAO,QAAQ;CAE5B,IAAI,SAAS,cAAe,SAAS,aAAa,SAAS,WAAY;CAEvE,MAAM,SAAS,UAAU,OAAO,MAAM;CACtC,MAAM,cAAc,SAAS,CAAC,QAAQ,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK;CAC5E,MAAM,QAAQ,SAAS,SAAS;CAKhC,CAFE,OAAO,UAAU,QAAQ,UAAU,OAAO,OAAO,QAAQ,IAElD,CAAC,GAAG,WAAW;AAC1B;AAEA,MAAa,gBAAgB;CAAC;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;AAAG;;;;;;AAO9E,MAAa,gBACV,eAA6C,mBAC7C,SAAc,YACb,OAAO,SAAS;CACd,GAAI,WAAW,CAAC;CAChB,QAAQ;EACN,GAAG,eAAe;EAClB,GAAG,eAAe;EAClB,GAAI,SAAS,UAAU,CAAC;CAC1B;AACF,CAAC;AAEL,MAAa,YACX,QACA,OACA,UAEA,SAAS,OAAO,WAAW,cACvB,GAAG,QAAQ,SAAS,QAAS,OAAO,UAAU,YAAY,QAAQ,QAAS,UAC3E;AAEN,MAAa,mBACX,SACA,QAAwB,OACxB,QAAkC,UAElC,CAAC,OAAO,CAAC,CACN,KAAK,CAAC,CACN,KAAK,WAAW,SAAS,QAAQ,OAAO,KAAK,CAAC,CAAC,CAC/C,KAAK,IAAI;AAEd,MAAa,eACX,SACA,QAAwB,OACxB,QAAkC,UAElC,CAAC,OAAO,CAAC,CACN,KAAK,CAAC,CACN,KAAK,QAAQ,SAAS,KAAK,OAAO,KAAK,CAAC,CAAC,CACzC,KAAK,IAAI;AAEd,MAAa,gBACX,MACA,QAAwB,MACxB,QAAkC,UAElC,CAAC,IAAI,CAAC,CACH,KAAK,CAAC,CACN,KAAK,SAAS,SAAS,MAAM,OAAO,KAAK,CAAC,CAAC,CAC3C,KAAK,IAAI;AAEd,MAAa,kBACX,QACA,UAAgE;CAC9D,MAAM;CACN,KAAK;CACL,KAAK;CACL,KAAK;CACL,MAAM;CACN,OAAO;AACT,MACW;CACX,IAAI,WAAW,KAAK,WAAW,KAAK;EAClC,MAAM,QAAQ,QAAQ;EACtB,OAAO,SAAS,OAAO,SAAS,GAAG,KAAK;CAC1C;CAKA,MAAM,QAAQ,QADD,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,OAAO,OAAO,MAAM,CACnC;CACzB,OAAO,SAAS,OAAO,SAAS,GAAG,KAAK;AAC1C;AAEA,MAAa,kBACX,KACA,cAAc,GACd,aAAa,GACb,QACW;CACX,MAAM,SAAS,IAAI,OAAO,cAAc,UAAU;CAClD,MAAM,aAAa,IAAI,QAAQ,cAAc,KAAK,UAAU;CAE5D,IAAI,QAAQ,MACV,OAAO,SAAS,QAAQ,IAAI;CAG9B,IAAI,OAAO,QAAQ,WACjB,OAAO,SAAS,IAAI,SAAS,GAAG,IAAI;CAGtC,IAAI,OAAO,QAAQ,UACjB,OAAO,SAAS,IAAI,SAAS,GAAG,IAAI;CAGtC,IAAI,OAAO,QAAQ,UAAU;EAC3B,MAAM,eAAe,uCAAuC,KAAK,GAAG;EACpE,MAAM,QAAQ,IAAI,WAAW,SAAS,KAAK,IAAI,WAAW,UAAU;EACpE,MAAM,SAAS,IAAI,SAAS,GAAG,KAAK,IAAI,SAAS,GAAG,KAAK,IAAI,SAAS,GAAG;EACzE,MAAM,SACJ,IAAI,WAAW,GAAG,KAClB,IAAI,WAAW,IAAI,KACnB,IAAI,WAAW,KAAK,KACpB,sBAAsB,KAAK,GAAG;EAChC,MAAM,WACJ,qBAAqB,KAAK,GAAG,KAAM,IAAI,UAAU,MAAM,CAAC,KAAK,KAAK,GAAG;EACvE,MAAM,YAAY,KAAK,KAAK,GAAG;EAE/B,IAAI,cAAc,OAAO,SAAS,IAAI,IAAI,IAAI,KAAK;EACnD,IAAI,OAAO,OAAO,SAAS,IAAI,IAAI,IAAI,SAAS;EAChD,IAAI,QAAQ,OAAO,SAAS,IAAI,IAAI,IAAI,IAAI;EAC5C,IAAI,QAAQ,OAAO,SAAS,IAAI,IAAI,IAAI,SAAS;EACjD,IAAI,UAAU,OAAO,SAAS,IAAI,IAAI,IAAI,IAAI;EAC9C,IAAI,WAAW,OAAO,SAAS,IAAI,IAAI,IAAI,KAAK;EAChD,OAAO,SAAS,IAAI,IAAI,IAAI,IAAI;CAClC;CAEA,IAAI,MAAM,QAAQ,GAAG,GAAG;EACtB,IAAI,IAAI,WAAW,GACjB,OAAO;EAQT,OAAO,MANO,IACX,KACE,SACC,GAAG,aAAa,eAAe,MAAM,cAAc,GAAG,YAAY,GAAG,GACzE,CAAC,CACA,KAAK,KACS,EAAE,IAAI,OAAO;CAChC;CAEA,IAAI,OAAO,QAAQ,UAAU;EAC3B,MAAM,OAAO,OAAO,KAAK,GAAG;EAE5B,IAAI,KAAK,WAAW,GAClB,OAAO;EAgBT,OAAO,MAbQ,KACZ,KAAK,QAAQ;GACZ,MAAM,aAAa,SAAS,IAAI,IAAI,IAAI,UAAU;GAClD,MAAM,QAAQ,IAAI;GAClB,MAAM,eAAe,eACnB,OACA,cAAc,GACd,YACA,GACF;GACA,OAAO,GAAG,aAAa,WAAW,IAAI;EACxC,CAAC,CAAC,CACD,KAAK,KACU,EAAE,IAAI,OAAO;CACjC;CAEA,OAAO,SAAS,OAAO,GAAG,GAAG,IAAI;AACnC;AAEA,MAAa,eAAe,SAE1B,KAAK,QAAQ,mBAAmB,EAAE;AAEpC,MAAM,aAAa,WAA0D;CAC3E,IAAI,QAAgB;CACpB,IAAI,OAAO,WAAW,UACpB,QAAQ;CAEV,IAAI,OAAO,WAAW,UACpB,QAAQ,OAAO;CAEjB,IACE,MAAM,QAAQ,MAAM,KACpB,OAAO,OAAO,WAAW,OAAO,WAAW,QAAQ,GAEnD,QAAQ,KAAK,IAAI,GAAG,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC;CAErD,IACE,MAAM,QAAQ,MAAM,KACpB,OAAO,OAAO,WAAW,OAAO,WAAW,QAAQ,GAEnD,QAAQ,KAAK,IAAI,GAAG,MAAM;CAE5B,OAAO,KAAK,IAAI,OAAO,CAAC;AAC1B;AAEA,MAAM,sBAAsB;CAC1B,SAAS;CACT,SAAS;CACT,SAAS;CACT,KAAK;CACL,SAAS;AACX;;;;;;;AAQA,MAAa,SACX,MACA,YAQA,CAAC,IAAI,CAAC,CACH,KAAK,CAAC,CACN,KAAK,SAAS;CACb,MAAM,EAAE,SAAS,SAAS,SAAS,QAAQ;EACzC,GAAG;EACH,GAAI,WAAW,CAAC;CAClB;CAEA,MAAM,SAAS,UAAU,OAAO;CAChC,MAAM,eAAe,KAAK,IACxB,SACA,KAAK,IAAI,SAAU,SAAS,YAAY,IAAI,CAAC,CAAC,MAAM,CACtD;CAEA,IAAI,QAAQ,QACV,OAAO,GAAG,IAAI,OAAO,YAAY,IAAI;CAGvC,OAAO,GAAG,OAAO,IAAI,OAAO,YAAY;AAC1C,CAAC,CAAC,CACD,KAAK,EAAE;AAEZ,MAAa,IAAI,SAAS,KAAK,GAAG;AAClC,MAAa,IAAI,SAAS,KAAK,KAAK;AACpC,MAAa,QAAQ,SAAS,KAAK,IAAI"}
1
+ {"version":3,"file":"logger.mjs","names":[],"sources":["../../src/logger.ts"],"sourcesContent":["import type { Locale } from '@intlayer/types/allLocales';\nimport type {\n CustomIntlayerConfig,\n IntlayerConfig,\n} from '@intlayer/types/config';\nimport type * as ANSIColorsTypes from './colors';\nimport {\n BEIGE,\n BLUE,\n GREEN,\n GREY,\n GREY_DARK,\n GREY_LIGHT,\n RED,\n RESET,\n WHITE,\n} from './colors';\n\nexport type ANSIColorsType =\n (typeof ANSIColorsTypes)[keyof typeof ANSIColorsTypes];\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 config = details?.config ?? {};\n const mode = config.mode ?? 'default';\n\n if (mode === 'disabled' || (details?.isVerbose && mode !== 'verbose')) return;\n\n const prefix = getPrefix(config.prefix);\n const flatContent = prefix ? [prefix, ...[content].flat()] : [content].flat();\n const level = details?.level ?? 'info';\n\n const logMethod =\n config[level] ?? console[level] ?? config.log ?? console.log;\n\n logMethod(...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?: Pick<IntlayerConfig, 'log'>, 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 string: string,\n color?: ANSIColorsType,\n reset?: boolean | ANSIColorsType\n): string =>\n color && typeof window === 'undefined'\n ? `${color}${string}${reset ? (typeof reset === 'boolean' ? RESET : reset) : RESET}`\n : string;\n\nexport const colorizeLocales = (\n locales: Locale | Locale[],\n color: ANSIColorsType = GREEN,\n reset: boolean | ANSIColorsType = 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 = BEIGE,\n reset: boolean | ANSIColorsType = 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 = GREY,\n reset: boolean | ANSIColorsType = RESET\n) =>\n [path]\n .flat()\n .map((path) => colorize(path, color, reset))\n .join(`, `);\n\nexport const colorizeNumber = (\n number: number | string,\n options: Partial<Record<Intl.LDMLPluralRule, ANSIColorsType>> = {\n zero: BLUE,\n one: BLUE,\n two: BLUE,\n few: BLUE,\n many: BLUE,\n other: BLUE,\n }\n): string => {\n if (number === 0 || number === '0') {\n const color = options.zero ?? GREEN;\n return colorize(number.toString(), color);\n }\n\n // Kept inside the function. Top-level instantiation of classes/APIs\n // is treated as a side-effect and prevents tree-shaking if the function is unused.\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 colorizeObject = (\n obj: any,\n indentLevel = 0,\n indentSize = 2,\n key?: string\n): string => {\n const indent = ' '.repeat(indentLevel * indentSize);\n const nextIndent = ' '.repeat((indentLevel + 1) * indentSize);\n\n if (obj === null) {\n return colorize('null', BLUE);\n }\n\n if (typeof obj === 'boolean') {\n return colorize(obj.toString(), BLUE);\n }\n\n if (typeof obj === 'number') {\n return colorize(obj.toString(), BLUE);\n }\n\n if (typeof obj === 'string') {\n const isDateString = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/.test(obj);\n const isUrl = obj.startsWith('http://') || obj.startsWith('https://');\n const isGlob = obj.includes('*') || obj.includes('?') || obj.includes('{');\n const isPath =\n obj.startsWith('/') ||\n obj.startsWith('./') ||\n obj.startsWith('../') ||\n /\\.[a-zA-Z0-9]{2,5}$/.test(obj);\n const isSecret =\n /^[0-9a-fA-F]{24,}$/.test(obj) || (obj.length >= 40 && !/\\s/.test(obj));\n const hasSpaces = /\\s/.test(obj);\n\n if (isDateString) return colorize(`\"${obj}\"`, BEIGE);\n if (isUrl) return colorize(`\"${obj}\"`, GREY_DARK);\n if (isGlob) return colorize(`\"${obj}\"`, GREY);\n if (isPath) return colorize(`\"${obj}\"`, GREY_DARK);\n if (isSecret) return colorize(`\"${obj}\"`, GREY);\n if (hasSpaces) return colorize(`\"${obj}\"`, WHITE);\n return colorize(`\"${obj}\"`, BLUE);\n }\n\n if (Array.isArray(obj)) {\n if (obj.length === 0) {\n return '[]';\n }\n const items = obj\n .map(\n (item) =>\n `${nextIndent}${colorizeObject(item, indentLevel + 1, indentSize, key)}`\n )\n .join(',\\n');\n return `[\\n${items}\\n${indent}]`;\n }\n\n if (typeof obj === 'object') {\n const keys = Object.keys(obj);\n\n if (keys.length === 0) {\n return '{}';\n }\n\n const fields = keys\n .map((key) => {\n const coloredKey = colorize(`\"${key}\"`, GREY_LIGHT);\n const value = obj[key];\n const coloredValue = colorizeObject(\n value,\n indentLevel + 1,\n indentSize,\n key\n );\n return `${nextIndent}${coloredKey}: ${coloredValue}`;\n })\n .join(',\\n');\n return `{\\n${fields}\\n${indent}}`;\n }\n\n return colorize(String(obj), GREY);\n};\n\nexport const removeColor = (text: string) =>\n // oxlint-disable-next-line no-control-regex -- 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 (\n Array.isArray(length) &&\n length.every((locale) => typeof locale === 'string')\n ) {\n value = Math.max(...length.map((str) => str.length));\n }\n if (\n Array.isArray(length) &&\n length.every((locale) => typeof locale === 'number')\n ) {\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('✗', RED);\nexport const v = colorize('✓', GREEN);\nexport const clock = colorize('⏲', BLUE);\n"],"mappings":"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"}
@@ -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\n/**\n * Generated entry files of `.intlayer/main`, keyed by the\n * `@intlayer/dictionaries-entry` subpath that resolves to them.\n */\nconst DICTIONARIES_ENTRY_SUBPATH_FILES = {\n unmerged: 'unmerged_dictionaries',\n remote: 'remote_dictionaries',\n dynamic: 'dynamic_dictionaries',\n fetch: 'fetch_dictionaries',\n} as const;\n\ntype DictionariesEntrySubpath = keyof typeof DICTIONARIES_ENTRY_SUBPATH_FILES;\n\ntype DictionariesEntrySubpathAlias = {\n [Subpath in DictionariesEntrySubpath as `@intlayer/dictionaries-entry/${Subpath}`]: string;\n};\n\n/**\n * Maps the aliasable Intlayer packages to the generated `.intlayer` files so\n * bundlers (webpack, Vite, Turbopack, esbuild, Metro, …) resolve them to the\n * app's own dictionaries and hot reload on any content change.\n *\n * Key order matters: webpack (enhanced-resolve) and Vite match string aliases\n * by prefix and stop at the first hit, so the bare `@intlayer/dictionaries-entry`\n * key MUST come after its subpaths, otherwise `@intlayer/dictionaries-entry/remote`\n * would be rewritten to `<dictionaries entry>/remote`.\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, mainDir, configDir } = configuration.system;\n\n const toAliasPath = (absolutePath: string) =>\n formatter(normalizePath(relative(baseDir, absolutePath)));\n\n const subpathAlias = Object.fromEntries(\n Object.entries(DICTIONARIES_ENTRY_SUBPATH_FILES).map(\n ([subpath, fileName]) => [\n `@intlayer/dictionaries-entry/${subpath}`,\n toAliasPath(join(mainDir, `${fileName}.${extension}`)),\n ]\n )\n ) as DictionariesEntrySubpathAlias;\n\n return {\n ...subpathAlias,\n '@intlayer/dictionaries-entry': toAliasPath(\n join(mainDir, `dictionaries.${extension}`)\n ),\n '@intlayer/config/built': toAliasPath(\n join(configDir, `configuration.${extension}`)\n ),\n };\n};\n"],"mappings":";;;;;;;;;AAeA,MAAM,mCAAmC;CACvC,UAAU;CACV,QAAQ;CACR,SAAS;CACT,OAAO;AACT;;;;;;;;;;;AAkBA,MAAa,YAAY,EACvB,eACA,QACA,aAAa,UAAkB,YACV;CACrB,MAAM,YAAY,aAChB,eACA,UAAU,cAAc,MAAM,aAAa,MAAM,KACnD;CAEA,MAAM,EAAE,SAAS,SAAS,cAAc,cAAc;CAEtD,MAAM,eAAe,iBACnB,UAAU,cAAc,SAAS,SAAS,YAAY,CAAC,CAAC;CAW1D,OAAO;EACL,GAVmB,OAAO,YAC1B,OAAO,QAAQ,gCAAgC,CAAC,CAAC,KAC9C,CAAC,SAAS,cAAc,CACvB,gCAAgC,WAChC,YAAY,KAAK,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC,CACvD,CACF,CAIc;EACd,gCAAgC,YAC9B,KAAK,SAAS,gBAAgB,WAAW,CAC3C;EACA,0BAA0B,YACxB,KAAK,WAAW,iBAAiB,WAAW,CAC9C;CACF;AACF"}
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\n/**\n * Generated entry files of `.intlayer/main`, keyed by the\n * `@intlayer/dictionaries-entry` subpath that resolves to them.\n */\nconst DICTIONARIES_ENTRY_SUBPATH_FILES = {\n unmerged: 'unmerged_dictionaries',\n remote: 'remote_dictionaries',\n dynamic: 'dynamic_dictionaries',\n fetch: 'fetch_dictionaries',\n} as const;\n\ntype DictionariesEntrySubpath = keyof typeof DICTIONARIES_ENTRY_SUBPATH_FILES;\n\ntype DictionariesEntrySubpathAlias = {\n [\n Subpath in DictionariesEntrySubpath as `@intlayer/dictionaries-entry/${Subpath}`\n ]: string;\n};\n\n/**\n * Maps the aliasable Intlayer packages to the generated `.intlayer` files so\n * bundlers (webpack, Vite, Turbopack, esbuild, Metro, …) resolve them to the\n * app's own dictionaries and hot reload on any content change.\n *\n * Key order matters: webpack (enhanced-resolve) and Vite match string aliases\n * by prefix and stop at the first hit, so the bare `@intlayer/dictionaries-entry`\n * key MUST come after its subpaths, otherwise `@intlayer/dictionaries-entry/remote`\n * would be rewritten to `<dictionaries entry>/remote`.\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, mainDir, configDir } = configuration.system;\n\n const toAliasPath = (absolutePath: string) =>\n formatter(normalizePath(relative(baseDir, absolutePath)));\n\n const subpathAlias = Object.fromEntries(\n Object.entries(DICTIONARIES_ENTRY_SUBPATH_FILES).map(\n ([subpath, fileName]) => [\n `@intlayer/dictionaries-entry/${subpath}`,\n toAliasPath(join(mainDir, `${fileName}.${extension}`)),\n ]\n )\n ) as DictionariesEntrySubpathAlias;\n\n return {\n ...subpathAlias,\n '@intlayer/dictionaries-entry': toAliasPath(\n join(mainDir, `dictionaries.${extension}`)\n ),\n '@intlayer/config/built': toAliasPath(\n join(configDir, `configuration.${extension}`)\n ),\n };\n};\n"],"mappings":";;;;;;;;;AAeA,MAAM,mCAAmC;CACvC,UAAU;CACV,QAAQ;CACR,SAAS;CACT,OAAO;AACT;;;;;;;;;;;AAoBA,MAAa,YAAY,EACvB,eACA,QACA,aAAa,UAAkB,YACV;CACrB,MAAM,YAAY,aAChB,eACA,UAAU,cAAc,MAAM,aAAa,MAAM,KACnD;CAEA,MAAM,EAAE,SAAS,SAAS,cAAc,cAAc;CAEtD,MAAM,eAAe,iBACnB,UAAU,cAAc,SAAS,SAAS,YAAY,CAAC,CAAC;CAW1D,OAAO;EACL,GAVmB,OAAO,YAC1B,OAAO,QAAQ,gCAAgC,CAAC,CAAC,KAC9C,CAAC,SAAS,cAAc,CACvB,gCAAgC,WAChC,YAAY,KAAK,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC,CACvD,CACF,CAIc;EACd,gCAAgC,YAC9B,KAAK,SAAS,gBAAgB,WAAW,CAC3C;EACA,0BAA0B,YACxB,KAAK,WAAW,iBAAiB,WAAW,CAC9C;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"cacheDisk.mjs","names":[],"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\n/** Clears the in-memory portion of the disk cache without touching disk files. */\nexport const clearDiskCacheMemory = (): void => {\n cacheMap.clear();\n};\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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"}
1
+ {"version":3,"file":"cacheDisk.mjs","names":[],"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 { type: 'json' };\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\n/** Clears the in-memory portion of the disk cache without touching disk files. */\nexport const clearDiskCacheMemory = (): void => {\n cacheMap.clear();\n};\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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"}
@@ -6,6 +6,10 @@ import { chunkArray } from "./chunkArray.mjs";
6
6
  import { clearModuleCache } from "./clearModuleCache.mjs";
7
7
  import { compareVersions } from "./compareVersions.mjs";
8
8
  import { configESMxCJSRequire, getProjectRequire, isESModule } from "./ESMxCJSHelpers.mjs";
9
+ import { camelCaseToKebabCase } from "./stringFormatter/camelCaseToKebabCase.mjs";
10
+ import { camelCaseToSentence } from "./stringFormatter/camelCaseToSentence.mjs";
11
+ import { kebabCaseToCamelCase } from "./stringFormatter/kebabCaseToCamelCase.mjs";
12
+ import { toLowerCamelCase } from "./stringFormatter/toLowerCamelCase.mjs";
9
13
  import { extractErrorMessage } from "./extractErrorMessage.mjs";
10
14
  import { getHasDictionarySelector } from "./getDictionarySelectorUsage.mjs";
11
15
  import { getExtension } from "./getExtension.mjs";
@@ -21,9 +25,5 @@ import { assertPathWithin } from "./pathSecurity.mjs";
21
25
  import { Queue, pLimit } from "./pLimit.mjs";
22
26
  import { retryManager } from "./retryManager.mjs";
23
27
  import { setIntlayerIdentifier } from "./setIntlayerIdentifier.mjs";
24
- import { camelCaseToKebabCase } from "./stringFormatter/camelCaseToKebabCase.mjs";
25
- import { camelCaseToSentence } from "./stringFormatter/camelCaseToSentence.mjs";
26
- import { kebabCaseToCamelCase } from "./stringFormatter/kebabCaseToCamelCase.mjs";
27
- import { toLowerCamelCase } from "./stringFormatter/toLowerCamelCase.mjs";
28
28
 
29
29
  export { BUILT_CONFIG_KEYS, Queue, assertPathWithin, cacheDisk, cacheMemory, camelCaseToKebabCase, camelCaseToSentence, chunkArray, clearAllCache, clearCache, clearDiskCacheMemory, clearModuleCache, compareVersions, computeKeyId, configESMxCJSRequire, extractErrorMessage, getAlias, getCache, getExtension, getHasDictionarySelector, getPackageJsonPath, getProjectRequire, getStorageAttributes, getUnusedNodeTypes, getUnusedNodeTypesAsync, getUsedNodeTypes, getUsedNodeTypesAsync, isESModule, isPackageInstalled, kebabCaseToCamelCase, logStack, normalizePath, pLimit, parallelize, parseFilePathPattern, parseStringPattern, retryManager, setCache, setIntlayerIdentifier, stableStringify, toLowerCamelCase };
@@ -10,4 +10,5 @@ import { camelCaseToKebabCase } from "./utils/stringFormatter/camelCaseToKebabCa
10
10
  import { camelCaseToSentence } from "./utils/stringFormatter/camelCaseToSentence.js";
11
11
  import { kebabCaseToCamelCase } from "./utils/stringFormatter/kebabCaseToCamelCase.js";
12
12
  import { toLowerCamelCase } from "./utils/stringFormatter/toLowerCamelCase.js";
13
+ import "./utils/stringFormatter/index.js";
13
14
  export { BrowserIntlayerConfig, WindowsWithIntlayer, bindLogFunction, buildAnalyticsFields, buildBrowserConfiguration, buildEditorFields, buildInternationalizationFields, buildLogFields, buildRoutingFields, camelCaseToKebabCase, camelCaseToSentence, chunkArray, extractBrowserConfiguration, extractErrorMessage, kebabCaseToCamelCase, logStack, normalizePath, pLimit, parallelize, setIntlayerIdentifier, toLowerCamelCase };
@@ -1,5 +1,5 @@
1
- import { buildConfigurationFields } from "./buildConfigurationFields.js";
2
1
  import { BrowserIntlayerConfig, buildAnalyticsFields, buildBrowserConfiguration, buildEditorFields, buildInternationalizationFields, buildLogFields, buildRoutingFields, extractBrowserConfiguration } from "./buildBrowserConfiguration.js";
2
+ import { buildConfigurationFields } from "./buildConfigurationFields.js";
3
3
  import { aiSchema, analyticsSchema, buildSchema, compilerSchema, contentSchema, cookiesAttributesSchema, dictionarySchema, editorSchema, internationalizationSchema, intlayerConfigSchema, intlayerConfigSchemaParseContext, logSchema, rewriteObjectSchema, rewriteRuleSchema, rewriteRulesSchema, routingSchema, storageAttributesSchema, storageSchema, systemSchema } from "./configurationSchema.js";
4
4
  import { EDITOR_SERVER_PORT_ENV_VAR, applyEditorServerOverride, getEditorURLForPort } from "./editorServerOverride.js";
5
5
  import { GetConfigurationAndFilePathResult, GetConfigurationOptions, getConfiguration, getConfigurationAndFilePath } from "./getConfiguration.js";
@@ -1,5 +1,5 @@
1
- import { StrictMode } from "@intlayer/types/config";
2
1
  import { Locale } from "@intlayer/types/allLocales";
2
+ import { StrictMode } from "@intlayer/types/config";
3
3
  export declare const LOCALES: Locale[];
4
4
  export declare const REQUIRED_LOCALES: Locale[];
5
5
  export declare const DEFAULT_LOCALE: Locale;
@@ -1,3 +1,14 @@
1
+ /**
2
+ * Text-extraction heuristics — which raw strings in a source file are
3
+ * user-facing copy that belongs in a dictionary.
4
+ *
5
+ * Kept in `@intlayer/config` (rather than in a compiler package) because both
6
+ * sides of the extraction story need them without pulling in Babel:
7
+ * - `@intlayer/babel` / `@intlayer/vue-compiler` / `@intlayer/svelte-compiler`
8
+ * use them to decide what `intlayer extract` rewrites.
9
+ * - `eslint-plugin-intlayer` uses the very same predicate for `no-raw-text`, so
10
+ * what the linter reports is exactly what the extractor would take.
11
+ */
1
12
  import { ATTRIBUTES_TO_EXTRACT } from "./constants.js";
2
13
  import { shouldExtract } from "./shouldExtract.js";
3
14
  export { ATTRIBUTES_TO_EXTRACT, shouldExtract };
@@ -1,6 +1,6 @@
1
1
  import { colors_d_exports } from "./colors.js";
2
- import { CustomIntlayerConfig, IntlayerConfig } from "@intlayer/types/config";
3
2
  import { Locale } from "@intlayer/types/allLocales";
3
+ import { CustomIntlayerConfig, IntlayerConfig } from "@intlayer/types/config";
4
4
  export type ANSIColorsType = (typeof colors_d_exports)[keyof typeof colors_d_exports];
5
5
  export type Details = {
6
6
  isVerbose?: boolean;
@@ -1,5 +1,5 @@
1
- import { buildConfigurationFields } from "./configFile/buildConfigurationFields.js";
2
1
  import { BrowserIntlayerConfig, buildAnalyticsFields, buildBrowserConfiguration, buildEditorFields, buildInternationalizationFields, buildLogFields, buildRoutingFields, extractBrowserConfiguration } from "./configFile/buildBrowserConfiguration.js";
2
+ import { buildConfigurationFields } from "./configFile/buildConfigurationFields.js";
3
3
  import { aiSchema, analyticsSchema, buildSchema, compilerSchema, contentSchema, cookiesAttributesSchema, dictionarySchema, editorSchema, internationalizationSchema, intlayerConfigSchema, intlayerConfigSchemaParseContext, logSchema, rewriteObjectSchema, rewriteRuleSchema, rewriteRulesSchema, routingSchema, storageAttributesSchema, storageSchema, systemSchema } from "./configFile/configurationSchema.js";
4
4
  import { EDITOR_SERVER_PORT_ENV_VAR, applyEditorServerOverride, getEditorURLForPort } from "./configFile/editorServerOverride.js";
5
5
  import { GetConfigurationAndFilePathResult, GetConfigurationOptions, getConfiguration, getConfigurationAndFilePath } from "./configFile/getConfiguration.js";
@@ -1 +1 @@
1
- {"version":3,"file":"alias.d.ts","names":[],"sources":["../../../src/utils/alias.ts"],"mappings":";YAKY;EACV,eAAe;EACf;EACA,aAAa;;;;;;;;;;;;qBA8BF,aAAQ,eAAA,QAAA,aAIlB"}
1
+ {"version":3,"file":"alias.d.ts","names":[],"sources":["../../../src/utils/alias.ts"],"mappings":";YAKY;EACV,eAAe;EACf;EACA,aAAa;;;;;;;;;;;;qBAgCF,aAAQ,eAAA,QAAA,aAIlB"}
@@ -1 +1 @@
1
- {"version":3,"file":"cacheDisk.d.ts","names":[],"sources":["../../../src/utils/cacheDisk.ts"],"mappings":";;KA8BK;;EAEH;;EAEA;;EAEA;;EAEA;;EAEA;;;qBAmDW;qBAIA,YAAS,gBACJ,gBAAc,MACxB,YAAU,UACN;;EAoHI,MAAA,QAAM,QAAQ;;EAWP,MAAA,mBAAU;;EAQZ,aAAA;;EAQG,gBAAA;;EAgBD,eAAA"}
1
+ {"version":3,"file":"cacheDisk.d.ts","names":[],"sources":["../../../src/utils/cacheDisk.ts"],"mappings":";;KA4BK;;EAEH;;EAEA;;EAEA;;EAEA;;EAEA;;;qBAmDW;qBAIA,YAAS,gBACJ,gBAAc,MACxB,YAAU,UACN;;EAoHI,MAAA,QAAM,QAAQ;;EAWP,MAAA,mBAAU;;EAQZ,aAAA;;EAQG,gBAAA;;EAgBD,eAAA"}
@@ -25,4 +25,5 @@ import { assertPathWithin } from "./pathSecurity.js";
25
25
  import { Queue, pLimit } from "./pLimit.js";
26
26
  import { RetryManagerOptions, retryManager } from "./retryManager.js";
27
27
  import { WindowsWithIntlayer, setIntlayerIdentifier } from "./setIntlayerIdentifier.js";
28
+ import "./stringFormatter/index.js";
28
29
  export { BUILT_CONFIG_KEYS, BuiltConfigKey, CacheKey, GetAliasOptions, PluginNodeType, Queue, RetryManagerOptions, WindowsWithIntlayer, assertPathWithin, cacheDisk, cacheMemory, camelCaseToKebabCase, camelCaseToSentence, chunkArray, clearAllCache, clearCache, clearDiskCacheMemory, clearModuleCache, compareVersions, computeKeyId, configESMxCJSRequire, extractErrorMessage, getAlias, getCache, getExtension, getHasDictionarySelector, getPackageJsonPath, getProjectRequire, getStorageAttributes, getUnusedNodeTypes, getUnusedNodeTypesAsync, getUsedNodeTypes, getUsedNodeTypesAsync, isESModule, isPackageInstalled, kebabCaseToCamelCase, logStack, normalizePath, pLimit, parallelize, parseFilePathPattern, parseStringPattern, retryManager, setCache, setIntlayerIdentifier, stableStringify, toLowerCamelCase };
package/package.json CHANGED
@@ -1,28 +1,24 @@
1
1
  {
2
2
  "name": "@intlayer/config",
3
- "version": "9.7.1",
3
+ "version": "9.7.3",
4
4
  "private": false,
5
5
  "description": "Retrieve Intlayer configurations and manage environment variables for both server-side and client-side environments.",
6
6
  "keywords": [
7
- "intlayer",
8
- "layer",
9
7
  "abstraction",
10
8
  "data",
11
- "internationalization",
9
+ "file",
12
10
  "i18n",
13
- "typescript",
11
+ "internationalization",
12
+ "intlayer",
14
13
  "javascript",
15
14
  "json",
16
- "file"
15
+ "layer",
16
+ "typescript"
17
17
  ],
18
18
  "homepage": "https://intlayer.org",
19
19
  "bugs": {
20
20
  "url": "https://github.com/aymericzip/intlayer/issues"
21
21
  },
22
- "repository": {
23
- "type": "git",
24
- "url": "git+https://github.com/aymericzip/intlayer.git"
25
- },
26
22
  "license": "Apache-2.0",
27
23
  "author": {
28
24
  "name": "Aymeric PINEAU",
@@ -35,7 +31,64 @@
35
31
  "url": "https://github.com/aymericzip"
36
32
  }
37
33
  ],
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "git+https://github.com/aymericzip/intlayer.git"
37
+ },
38
+ "files": [
39
+ "./dist",
40
+ "./package.json"
41
+ ],
38
42
  "sideEffects": false,
43
+ "main": "dist/cjs/index.cjs",
44
+ "module": "dist/esm/index.mjs",
45
+ "types": "dist/types/index.d.ts",
46
+ "typesVersions": {
47
+ "*": {
48
+ "client": [
49
+ "./dist/types/client.d.ts"
50
+ ],
51
+ "built": [
52
+ "./dist/types/built.d.ts"
53
+ ],
54
+ "secrets": [
55
+ "./dist/types/secrets.d.ts"
56
+ ],
57
+ "node": [
58
+ "./dist/types/node.d.ts"
59
+ ],
60
+ "utils": [
61
+ "./dist/types/utils/index.d.ts"
62
+ ],
63
+ "extract": [
64
+ "./dist/types/extract/index.d.ts"
65
+ ],
66
+ "file": [
67
+ "./dist/types/loadExternalFile/index.d.ts"
68
+ ],
69
+ "env": [
70
+ "./dist/types/loadEnvFile.d.ts"
71
+ ],
72
+ "envVars": [
73
+ "./dist/types/envVars/index.d.ts"
74
+ ],
75
+ "logger": [
76
+ "./dist/types/logger.d.ts"
77
+ ],
78
+ "colors": [
79
+ "./dist/types/colors.d.ts"
80
+ ],
81
+ "defaultValues": [
82
+ "./dist/types/defaultValues/index.d.ts"
83
+ ],
84
+ "bundle": [
85
+ "./dist/types/bundle/index.d.ts"
86
+ ],
87
+ "package.json": [
88
+ "./package.json"
89
+ ]
90
+ }
91
+ },
39
92
  "exports": {
40
93
  "./node": {
41
94
  "types": "./dist/types/node.d.ts",
@@ -118,68 +171,15 @@
118
171
  },
119
172
  "./package.json": "./package.json"
120
173
  },
121
- "main": "dist/cjs/index.cjs",
122
- "module": "dist/esm/index.mjs",
123
- "types": "dist/types/index.d.ts",
124
- "typesVersions": {
125
- "*": {
126
- "client": [
127
- "./dist/types/client.d.ts"
128
- ],
129
- "built": [
130
- "./dist/types/built.d.ts"
131
- ],
132
- "secrets": [
133
- "./dist/types/secrets.d.ts"
134
- ],
135
- "node": [
136
- "./dist/types/node.d.ts"
137
- ],
138
- "utils": [
139
- "./dist/types/utils/index.d.ts"
140
- ],
141
- "extract": [
142
- "./dist/types/extract/index.d.ts"
143
- ],
144
- "file": [
145
- "./dist/types/loadExternalFile/index.d.ts"
146
- ],
147
- "env": [
148
- "./dist/types/loadEnvFile.d.ts"
149
- ],
150
- "envVars": [
151
- "./dist/types/envVars/index.d.ts"
152
- ],
153
- "logger": [
154
- "./dist/types/logger.d.ts"
155
- ],
156
- "colors": [
157
- "./dist/types/colors.d.ts"
158
- ],
159
- "defaultValues": [
160
- "./dist/types/defaultValues/index.d.ts"
161
- ],
162
- "bundle": [
163
- "./dist/types/bundle/index.d.ts"
164
- ],
165
- "package.json": [
166
- "./package.json"
167
- ]
168
- }
169
- },
170
- "files": [
171
- "./dist",
172
- "./package.json"
173
- ],
174
174
  "scripts": {
175
175
  "build": "bun --bun tsdown --config tsdown.config.ts",
176
176
  "build:ci": "bun --bun tsdown --config tsdown.config.ts",
177
177
  "clean": "bun --bun rimraf ./dist .turbo",
178
178
  "dev": "bun --bun tsdown --config tsdown.config.ts --watch",
179
- "format": "bun --bun biome format . --check",
180
- "format:fix": "bun --bun biome format --write .",
181
- "lint": "bun --bun biome lint .",
182
- "lint:fix": "bun --bun biome lint --write .",
179
+ "format": "oxfmt --check .",
180
+ "format:fix": "oxfmt .",
181
+ "lint": "oxlint .",
182
+ "lint:fix": "oxlint --fix .",
183
183
  "prepublish": "cp -f ../../../README.md ./README.md",
184
184
  "publish": "bun publish || true",
185
185
  "publish:canary": "bun publish --access public --tag canary || true",
@@ -190,9 +190,9 @@
190
190
  "typecheck": "tsc --noEmit --project tsconfig.types.json"
191
191
  },
192
192
  "dependencies": {
193
- "@intlayer/types": "9.7.1",
193
+ "@intlayer/types": "9.7.3",
194
194
  "defu": "6.1.7",
195
- "dotenv": "18.0.9",
195
+ "dotenv": "18.0.10",
196
196
  "esbuild": "0.28.2",
197
197
  "json5": "2.2.3",
198
198
  "zod": "4.6.7"
@@ -202,8 +202,8 @@
202
202
  "@utils/ts-config": "1.0.4",
203
203
  "@utils/ts-config-types": "1.0.4",
204
204
  "@utils/tsdown-config": "1.0.4",
205
- "rimraf": "6.1.3",
206
- "tsdown": "0.23.4",
205
+ "rimraf": "6.1.4",
206
+ "tsdown": "0.23.7",
207
207
  "typescript": "7.0.2",
208
208
  "vitest": "5.1.0"
209
209
  },