dispersa 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/cli.js CHANGED
@@ -32,28 +32,12 @@ async function runCli(args, options = {}) {
32
32
  printHelp(io);
33
33
  return 1;
34
34
  }
35
- const configPath = getArgValue(args, "--config");
36
35
  const verbose = hasFlag(args, "--verbose") || hasFlag(args, "-v");
37
- const resolvedPath = await resolveConfigPath(configPath, cwd);
38
- if (resolvedPath === void 0) {
39
- io.stderr(
40
- `No config found. Expected one of: ${defaultConfigNames.join(", ")} or pass --config <path>.`
41
- );
36
+ const loaded = await resolveAndLoadConfig(args, cwd, io, verbose);
37
+ if (!loaded) {
42
38
  return 1;
43
39
  }
44
- if (verbose) {
45
- io.stdout(`Config: ${resolvedPath}`);
46
- }
47
- let config;
48
- try {
49
- config = await loadConfig(resolvedPath, cwd);
50
- } catch (error) {
51
- io.stderr(`Failed to load config: ${resolvedPath}`);
52
- io.stderr(`- ${error instanceof Error ? error.message : String(error)}`);
53
- return 1;
54
- }
55
- const configDir = dirname(resolvedPath);
56
- const normalizedConfig = normalizeConfigPaths(config, configDir);
40
+ const normalizedConfig = normalizeConfigPaths(loaded.config, loaded.configDir);
57
41
  const { validation, resolver, buildPath, ...buildConfig } = normalizedConfig;
58
42
  if (verbose) {
59
43
  const outputCount = buildConfig.outputs?.length ?? 0;
@@ -66,6 +50,30 @@ async function runCli(args, options = {}) {
66
50
  const dispersa = new Dispersa({ resolver, buildPath, validation });
67
51
  const result = await dispersa.build(buildConfig);
68
52
  const elapsed = Date.now() - startTime;
53
+ return reportBuildResult(result, verbose, elapsed, io);
54
+ }
55
+ async function resolveAndLoadConfig(args, cwd, io, verbose) {
56
+ const configPath = getArgValue(args, "--config");
57
+ const resolvedPath = await resolveConfigPath(configPath, cwd);
58
+ if (resolvedPath === void 0) {
59
+ io.stderr(
60
+ `No config found. Expected one of: ${defaultConfigNames.join(", ")} or pass --config <path>.`
61
+ );
62
+ return void 0;
63
+ }
64
+ if (verbose) {
65
+ io.stdout(`Config: ${resolvedPath}`);
66
+ }
67
+ try {
68
+ const config = await loadConfig(resolvedPath, cwd);
69
+ return { config, configDir: dirname(resolvedPath) };
70
+ } catch (error) {
71
+ io.stderr(`Failed to load config: ${resolvedPath}`);
72
+ io.stderr(`- ${error instanceof Error ? error.message : String(error)}`);
73
+ return void 0;
74
+ }
75
+ }
76
+ function reportBuildResult(result, verbose, elapsed, io) {
69
77
  if (!result.success) {
70
78
  io.stderr("Build failed.");
71
79
  for (const error of result.errors ?? []) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/cli.ts"],"names":["require"],"mappings":"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","file":"cli.js","sourcesContent":["import { access } from 'node:fs/promises'\nimport { createRequire } from 'node:module'\nimport { dirname, isAbsolute, resolve } from 'node:path'\nimport process from 'node:process'\n\nimport { Dispersa, type BuildConfig } from 'dispersa'\nimport { createJiti } from 'jiti'\n\nimport type { CliConfig } from './config'\n\ntype CliIO = {\n stdout: (message: string) => void\n stderr: (message: string) => void\n}\n\ntype RunOptions = {\n cwd?: string\n io?: CliIO\n}\n\nconst defaultConfigNames = [\n 'dispersa.config.ts',\n 'dispersa.config.js',\n 'dispersa.config.mts',\n 'dispersa.config.mjs',\n 'dispersa.config.cts',\n 'dispersa.config.cjs',\n]\n\nexport async function runCli(args: string[], options: RunOptions = {}): Promise<number> {\n const cwd = options.cwd ?? process.cwd()\n const io: CliIO = options.io ?? {\n stdout: (message) => process.stdout.write(`${message}\\n`),\n stderr: (message) => process.stderr.write(`${message}\\n`),\n }\n\n const command = args[0] ?? 'build'\n if (command === '--help' || command === '-h' || command === 'help') {\n printHelp(io)\n return 0\n }\n\n if (command !== 'build') {\n io.stderr(`Unknown command: ${command}`)\n printHelp(io)\n return 1\n }\n\n const configPath = getArgValue(args, '--config')\n const verbose = hasFlag(args, '--verbose') || hasFlag(args, '-v')\n const resolvedPath = await resolveConfigPath(configPath, cwd)\n if (resolvedPath === undefined) {\n io.stderr(\n `No config found. Expected one of: ${defaultConfigNames.join(', ')} ` +\n 'or pass --config <path>.',\n )\n return 1\n }\n\n if (verbose) {\n io.stdout(`Config: ${resolvedPath}`)\n }\n\n let config: CliConfig\n try {\n config = await loadConfig(resolvedPath, cwd)\n } catch (error) {\n io.stderr(`Failed to load config: ${resolvedPath}`)\n io.stderr(`- ${error instanceof Error ? error.message : String(error)}`)\n return 1\n }\n\n const configDir = dirname(resolvedPath)\n const normalizedConfig = normalizeConfigPaths(config, configDir)\n const { validation, resolver, buildPath, ...buildConfig } = normalizedConfig\n\n if (verbose) {\n const outputCount = buildConfig.outputs?.length ?? 0\n io.stdout(`Outputs: ${outputCount} configured`)\n if (buildPath) {\n io.stdout(`Build path: ${buildPath}`)\n }\n }\n\n const startTime = Date.now()\n const dispersa = new Dispersa({ resolver, buildPath, validation })\n const result = await dispersa.build(buildConfig as BuildConfig)\n const elapsed = Date.now() - startTime\n\n if (!result.success) {\n io.stderr('Build failed.')\n for (const error of result.errors ?? []) {\n io.stderr(`- [${error.code}] ${error.message}`)\n if (verbose && error.tokenPath) {\n io.stderr(` Token: ${error.tokenPath}`)\n }\n if (verbose && error.path) {\n io.stderr(` File: ${error.path}`)\n }\n if (verbose && error.suggestions && error.suggestions.length > 0) {\n io.stderr(` Suggestions: ${error.suggestions.join(', ')}`)\n }\n }\n if (verbose) {\n io.stderr(`Duration: ${elapsed}ms`)\n }\n return 1\n }\n\n io.stdout('Build succeeded.')\n for (const output of result.outputs) {\n const location = output.path ?? '(in-memory)'\n io.stdout(`- ${output.name}: ${location}`)\n }\n\n if (verbose) {\n io.stdout(`Duration: ${elapsed}ms`)\n }\n\n return 0\n}\n\nfunction getArgValue(args: string[], flag: string): string | undefined {\n const index = args.indexOf(flag)\n if (index === -1 || index === args.length - 1) {\n return undefined\n }\n const value = args[index + 1]\n if (value == null || value.startsWith('-')) {\n return undefined\n }\n return value\n}\n\nfunction hasFlag(args: string[], flag: string): boolean {\n return args.includes(flag)\n}\n\nasync function resolveConfigPath(\n configPath: string | undefined,\n cwd: string,\n): Promise<string | undefined> {\n if (configPath) {\n const fullPath = resolve(cwd, configPath)\n if (!(await fileExists(fullPath))) {\n return undefined\n }\n return fullPath\n }\n\n for (const name of defaultConfigNames) {\n const fullPath = resolve(cwd, name)\n if (await fileExists(fullPath)) {\n return fullPath\n }\n }\n\n return undefined\n}\n\nasync function loadConfig(configPath: string, cwd: string): Promise<CliConfig> {\n const alias = await buildAliasMap(cwd)\n const loader = createJiti(cwd, {\n interopDefault: true,\n alias,\n })\n const loaded = await loader(configPath)\n const config = (loaded as { default?: CliConfig }).default ?? (loaded as CliConfig)\n\n if (config == null || typeof config !== 'object') {\n throw new Error(`Invalid config: ${configPath} did not export an object`)\n }\n\n return config\n}\n\nfunction normalizeConfigPaths(config: CliConfig, configDir: string): CliConfig {\n const resolver =\n typeof config.resolver === 'string'\n ? resolveIfRelative(config.resolver, configDir)\n : config.resolver\n const buildPath = resolveIfRelative(config.buildPath, configDir)\n const outputs = config.outputs ?? []\n\n return {\n ...config,\n resolver,\n buildPath,\n outputs,\n }\n}\n\nfunction resolveIfRelative(value: string | undefined, baseDir: string): string | undefined {\n if (!value) {\n return value\n }\n return isAbsolute(value) ? value : resolve(baseDir, value)\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path)\n return true\n } catch {\n return false\n }\n}\n\nasync function buildAliasMap(cwd: string): Promise<Record<string, string>> {\n const alias: Record<string, string> = {}\n\n // Dev monorepo: point to source files for hot-reload\n const coreSourcePath = resolve(cwd, 'packages/core/src/index.ts')\n if (await fileExists(coreSourcePath)) {\n alias['dispersa'] = coreSourcePath\n return alias\n }\n\n // Not resolvable from cwd — try from the CLI module's own location\n // (handles workspace symlinks and global installs)\n if (!isPackageResolvable('dispersa', cwd)) {\n const require = createRequire(import.meta.url)\n try {\n alias['dispersa'] = require.resolve('dispersa')\n } catch {\n // Not resolvable at all; config loading will fail with a clear error\n }\n }\n\n return alias\n}\n\nfunction isPackageResolvable(name: string, cwd: string): boolean {\n const require = createRequire(import.meta.url)\n try {\n require.resolve(name, { paths: [cwd] })\n return true\n } catch {\n return false\n }\n}\n\nfunction printHelp(io: CliIO): void {\n io.stdout('dispersa build [options]')\n io.stdout('')\n io.stdout('Options:')\n io.stdout(' --config <path> Path to dispersa.config.(ts|js|mts|mjs|cts|cjs)')\n io.stdout(' --verbose, -v Show detailed build output (timing, error context)')\n}\n"]}
1
+ {"version":3,"sources":["../../src/cli/cli.ts"],"names":["require"],"mappings":";;;;;;;;AAoBA,IAAM,kBAAA,GAAqB;AAAA,EACzB,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,qBAAA;AAAA,EACA,qBAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF,CAAA;AAEA,eAAsB,MAAA,CAAO,IAAA,EAAgB,OAAA,GAAsB,EAAC,EAAoB;AACtF,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AACvC,EAAA,MAAM,EAAA,GAAY,QAAQ,EAAA,IAAM;AAAA,IAC9B,QAAQ,CAAC,OAAA,KAAY,QAAQ,MAAA,CAAO,KAAA,CAAM,GAAG,OAAO;AAAA,CAAI,CAAA;AAAA,IACxD,QAAQ,CAAC,OAAA,KAAY,QAAQ,MAAA,CAAO,KAAA,CAAM,GAAG,OAAO;AAAA,CAAI;AAAA,GAC1D;AAEA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,CAAC,CAAA,IAAK,OAAA;AAC3B,EAAA,IAAI,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,IAAA,IAAQ,YAAY,MAAA,EAAQ;AAClE,IAAA,SAAA,CAAU,EAAE,CAAA;AACZ,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,YAAY,OAAA,EAAS;AACvB,IAAA,EAAA,CAAG,MAAA,CAAO,CAAA,iBAAA,EAAoB,OAAO,CAAA,CAAE,CAAA;AACvC,IAAA,SAAA,CAAU,EAAE,CAAA;AACZ,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAU,OAAA,CAAQ,IAAA,EAAM,WAAW,CAAA,IAAK,OAAA,CAAQ,MAAM,IAAI,CAAA;AAChE,EAAA,MAAM,SAAS,MAAM,oBAAA,CAAqB,IAAA,EAAM,GAAA,EAAK,IAAI,OAAO,CAAA;AAChE,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,gBAAA,GAAmB,oBAAA,CAAqB,MAAA,CAAO,MAAA,EAAQ,OAAO,SAAS,CAAA;AAC7E,EAAA,MAAM,EAAE,UAAA,EAAY,QAAA,EAAU,SAAA,EAAW,GAAG,aAAY,GAAI,gBAAA;AAE5D,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,WAAA,GAAc,WAAA,CAAY,OAAA,EAAS,MAAA,IAAU,CAAA;AACnD,IAAA,EAAA,CAAG,MAAA,CAAO,CAAA,SAAA,EAAY,WAAW,CAAA,WAAA,CAAa,CAAA;AAC9C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,EAAA,CAAG,MAAA,CAAO,CAAA,YAAA,EAAe,SAAS,CAAA,CAAE,CAAA;AAAA,IACtC;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,WAAW,IAAI,QAAA,CAAS,EAAE,QAAA,EAAU,SAAA,EAAW,YAAY,CAAA;AACjE,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,KAAA,CAAM,WAA0B,CAAA;AAC9D,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAE7B,EAAA,OAAO,iBAAA,CAAkB,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,EAAE,CAAA;AACvD;AAEA,eAAe,oBAAA,CACb,IAAA,EACA,GAAA,EACA,EAAA,EACA,OAAA,EAC+D;AAC/D,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,IAAA,EAAM,UAAU,CAAA;AAC/C,EAAA,MAAM,YAAA,GAAe,MAAM,iBAAA,CAAkB,UAAA,EAAY,GAAG,CAAA;AAC5D,EAAA,IAAI,iBAAiB,MAAA,EAAW;AAC9B,IAAA,EAAA,CAAG,MAAA;AAAA,MACD,CAAA,kCAAA,EAAqC,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAC,CAAA,yBAAA;AAAA,KAEpE;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,EAAA,CAAG,MAAA,CAAO,CAAA,QAAA,EAAW,YAAY,CAAA,CAAE,CAAA;AAAA,EACrC;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,YAAA,EAAc,GAAG,CAAA;AACjD,IAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,OAAA,CAAQ,YAAY,CAAA,EAAE;AAAA,EACpD,SAAS,KAAA,EAAO;AACd,IAAA,EAAA,CAAG,MAAA,CAAO,CAAA,uBAAA,EAA0B,YAAY,CAAA,CAAE,CAAA;AAClD,IAAA,EAAA,CAAG,MAAA,CAAO,KAAK,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AACvE,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAEA,SAAS,iBAAA,CACP,MAAA,EACA,OAAA,EACA,OAAA,EACA,EAAA,EACQ;AACR,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,EAAA,CAAG,OAAO,eAAe,CAAA;AACzB,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,IAAU,EAAC,EAAG;AACvC,MAAA,EAAA,CAAG,OAAO,CAAA,GAAA,EAAM,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAC9C,MAAA,IAAI,OAAA,IAAW,MAAM,SAAA,EAAW;AAC9B,QAAA,EAAA,CAAG,MAAA,CAAO,CAAA,SAAA,EAAY,KAAA,CAAM,SAAS,CAAA,CAAE,CAAA;AAAA,MACzC;AACA,MAAA,IAAI,OAAA,IAAW,MAAM,IAAA,EAAM;AACzB,QAAA,EAAA,CAAG,MAAA,CAAO,CAAA,QAAA,EAAW,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAAA,MACnC;AACA,MAAA,IAAI,WAAW,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,WAAA,CAAY,SAAS,CAAA,EAAG;AAChE,QAAA,EAAA,CAAG,OAAO,CAAA,eAAA,EAAkB,KAAA,CAAM,YAAY,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MAC5D;AAAA,IACF;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,EAAA,CAAG,MAAA,CAAO,CAAA,UAAA,EAAa,OAAO,CAAA,EAAA,CAAI,CAAA;AAAA,IACpC;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,EAAA,CAAG,OAAO,kBAAkB,CAAA;AAC5B,EAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,IAAA,MAAM,QAAA,GAAW,OAAO,IAAA,IAAQ,aAAA;AAChC,IAAA,EAAA,CAAG,OAAO,CAAA,EAAA,EAAK,MAAA,CAAO,IAAI,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAE,CAAA;AAAA,EAC3C;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,EAAA,CAAG,MAAA,CAAO,CAAA,UAAA,EAAa,OAAO,CAAA,EAAA,CAAI,CAAA;AAAA,EACpC;AAEA,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,WAAA,CAAY,MAAgB,IAAA,EAAkC;AACrE,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AAC/B,EAAA,IAAI,KAAA,KAAU,EAAA,IAAM,KAAA,KAAU,IAAA,CAAK,SAAS,CAAA,EAAG;AAC7C,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAA;AAC5B,EAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AAC1C,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,OAAA,CAAQ,MAAgB,IAAA,EAAuB;AACtD,EAAA,OAAO,IAAA,CAAK,SAAS,IAAI,CAAA;AAC3B;AAEA,eAAe,iBAAA,CACb,YACA,GAAA,EAC6B;AAC7B,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,EAAK,UAAU,CAAA;AACxC,IAAA,IAAI,CAAE,MAAM,UAAA,CAAW,QAAQ,CAAA,EAAI;AACjC,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,KAAA,MAAW,QAAQ,kBAAA,EAAoB;AACrC,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,EAAK,IAAI,CAAA;AAClC,IAAA,IAAI,MAAM,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC9B,MAAA,OAAO,QAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,eAAe,UAAA,CAAW,YAAoB,GAAA,EAAiC;AAC7E,EAAA,MAAM,KAAA,GAAQ,MAAM,aAAA,CAAc,GAAG,CAAA;AACrC,EAAA,MAAM,MAAA,GAAS,WAAW,GAAA,EAAK;AAAA,IAC7B,cAAA,EAAgB,IAAA;AAAA,IAChB;AAAA,GACD,CAAA;AACD,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,UAAU,CAAA;AACtC,EAAA,MAAM,MAAA,GAAU,OAAmC,OAAA,IAAY,MAAA;AAE/D,EAAA,IAAI,MAAA,IAAU,IAAA,IAAQ,OAAO,MAAA,KAAW,QAAA,EAAU;AAChD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,UAAU,CAAA,yBAAA,CAA2B,CAAA;AAAA,EAC1E;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,oBAAA,CAAqB,QAAmB,SAAA,EAA8B;AAC7E,EAAA,MAAM,QAAA,GACJ,OAAO,MAAA,CAAO,QAAA,KAAa,QAAA,GACvB,kBAAkB,MAAA,CAAO,QAAA,EAAU,SAAS,CAAA,GAC5C,MAAA,CAAO,QAAA;AACb,EAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,MAAA,CAAO,SAAA,EAAW,SAAS,CAAA;AAC/D,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,EAAC;AAEnC,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,QAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,iBAAA,CAAkB,OAA2B,OAAA,EAAqC;AACzF,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,WAAW,KAAK,CAAA,GAAI,KAAA,GAAQ,OAAA,CAAQ,SAAS,KAAK,CAAA;AAC3D;AAEA,eAAe,WAAW,IAAA,EAAgC;AACxD,EAAA,IAAI;AACF,IAAA,MAAM,OAAO,IAAI,CAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,eAAe,cAAc,GAAA,EAA8C;AACzE,EAAA,MAAM,QAAgC,EAAC;AAGvC,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,GAAA,EAAK,4BAA4B,CAAA;AAChE,EAAA,IAAI,MAAM,UAAA,CAAW,cAAc,CAAA,EAAG;AACpC,IAAA,KAAA,CAAM,UAAU,CAAA,GAAI,cAAA;AACpB,IAAA,OAAO,KAAA;AAAA,EACT;AAIA,EAAA,IAAI,CAAC,mBAAA,CAAoB,UAAA,EAAY,GAAG,CAAA,EAAG;AACzC,IAAA,MAAMA,QAAAA,GAAU,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAC7C,IAAA,IAAI;AACF,MAAA,KAAA,CAAM,UAAU,CAAA,GAAIA,QAAAA,CAAQ,OAAA,CAAQ,UAAU,CAAA;AAAA,IAChD,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,mBAAA,CAAoB,MAAc,GAAA,EAAsB;AAC/D,EAAA,MAAMA,QAAAA,GAAU,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAC7C,EAAA,IAAI;AACF,IAAAA,QAAAA,CAAQ,QAAQ,IAAA,EAAM,EAAE,OAAO,CAAC,GAAG,GAAG,CAAA;AACtC,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,SAAS,UAAU,EAAA,EAAiB;AAClC,EAAA,EAAA,CAAG,OAAO,0BAA0B,CAAA;AACpC,EAAA,EAAA,CAAG,OAAO,EAAE,CAAA;AACZ,EAAA,EAAA,CAAG,OAAO,UAAU,CAAA;AACpB,EAAA,EAAA,CAAG,OAAO,qEAAqE,CAAA;AAC/E,EAAA,EAAA,CAAG,OAAO,wEAAwE,CAAA;AACpF","file":"cli.js","sourcesContent":["import { access } from 'node:fs/promises'\nimport { createRequire } from 'node:module'\nimport { dirname, isAbsolute, resolve } from 'node:path'\nimport process from 'node:process'\n\nimport { Dispersa, type BuildConfig } from 'dispersa'\nimport { createJiti } from 'jiti'\n\nimport type { CliConfig } from './config'\n\ntype CliIO = {\n stdout: (message: string) => void\n stderr: (message: string) => void\n}\n\ntype RunOptions = {\n cwd?: string\n io?: CliIO\n}\n\nconst defaultConfigNames = [\n 'dispersa.config.ts',\n 'dispersa.config.js',\n 'dispersa.config.mts',\n 'dispersa.config.mjs',\n 'dispersa.config.cts',\n 'dispersa.config.cjs',\n]\n\nexport async function runCli(args: string[], options: RunOptions = {}): Promise<number> {\n const cwd = options.cwd ?? process.cwd()\n const io: CliIO = options.io ?? {\n stdout: (message) => process.stdout.write(`${message}\\n`),\n stderr: (message) => process.stderr.write(`${message}\\n`),\n }\n\n const command = args[0] ?? 'build'\n if (command === '--help' || command === '-h' || command === 'help') {\n printHelp(io)\n return 0\n }\n\n if (command !== 'build') {\n io.stderr(`Unknown command: ${command}`)\n printHelp(io)\n return 1\n }\n\n const verbose = hasFlag(args, '--verbose') || hasFlag(args, '-v')\n const loaded = await resolveAndLoadConfig(args, cwd, io, verbose)\n if (!loaded) {\n return 1\n }\n\n const normalizedConfig = normalizeConfigPaths(loaded.config, loaded.configDir)\n const { validation, resolver, buildPath, ...buildConfig } = normalizedConfig\n\n if (verbose) {\n const outputCount = buildConfig.outputs?.length ?? 0\n io.stdout(`Outputs: ${outputCount} configured`)\n if (buildPath) {\n io.stdout(`Build path: ${buildPath}`)\n }\n }\n\n const startTime = Date.now()\n const dispersa = new Dispersa({ resolver, buildPath, validation })\n const result = await dispersa.build(buildConfig as BuildConfig)\n const elapsed = Date.now() - startTime\n\n return reportBuildResult(result, verbose, elapsed, io)\n}\n\nasync function resolveAndLoadConfig(\n args: string[],\n cwd: string,\n io: CliIO,\n verbose: boolean,\n): Promise<{ config: CliConfig; configDir: string } | undefined> {\n const configPath = getArgValue(args, '--config')\n const resolvedPath = await resolveConfigPath(configPath, cwd)\n if (resolvedPath === undefined) {\n io.stderr(\n `No config found. Expected one of: ${defaultConfigNames.join(', ')} ` +\n 'or pass --config <path>.',\n )\n return undefined\n }\n\n if (verbose) {\n io.stdout(`Config: ${resolvedPath}`)\n }\n\n try {\n const config = await loadConfig(resolvedPath, cwd)\n return { config, configDir: dirname(resolvedPath) }\n } catch (error) {\n io.stderr(`Failed to load config: ${resolvedPath}`)\n io.stderr(`- ${error instanceof Error ? error.message : String(error)}`)\n return undefined\n }\n}\n\nfunction reportBuildResult(\n result: Awaited<ReturnType<Dispersa['build']>>,\n verbose: boolean,\n elapsed: number,\n io: CliIO,\n): number {\n if (!result.success) {\n io.stderr('Build failed.')\n for (const error of result.errors ?? []) {\n io.stderr(`- [${error.code}] ${error.message}`)\n if (verbose && error.tokenPath) {\n io.stderr(` Token: ${error.tokenPath}`)\n }\n if (verbose && error.path) {\n io.stderr(` File: ${error.path}`)\n }\n if (verbose && error.suggestions && error.suggestions.length > 0) {\n io.stderr(` Suggestions: ${error.suggestions.join(', ')}`)\n }\n }\n if (verbose) {\n io.stderr(`Duration: ${elapsed}ms`)\n }\n return 1\n }\n\n io.stdout('Build succeeded.')\n for (const output of result.outputs) {\n const location = output.path ?? '(in-memory)'\n io.stdout(`- ${output.name}: ${location}`)\n }\n\n if (verbose) {\n io.stdout(`Duration: ${elapsed}ms`)\n }\n\n return 0\n}\n\nfunction getArgValue(args: string[], flag: string): string | undefined {\n const index = args.indexOf(flag)\n if (index === -1 || index === args.length - 1) {\n return undefined\n }\n const value = args[index + 1]\n if (value == null || value.startsWith('-')) {\n return undefined\n }\n return value\n}\n\nfunction hasFlag(args: string[], flag: string): boolean {\n return args.includes(flag)\n}\n\nasync function resolveConfigPath(\n configPath: string | undefined,\n cwd: string,\n): Promise<string | undefined> {\n if (configPath) {\n const fullPath = resolve(cwd, configPath)\n if (!(await fileExists(fullPath))) {\n return undefined\n }\n return fullPath\n }\n\n for (const name of defaultConfigNames) {\n const fullPath = resolve(cwd, name)\n if (await fileExists(fullPath)) {\n return fullPath\n }\n }\n\n return undefined\n}\n\nasync function loadConfig(configPath: string, cwd: string): Promise<CliConfig> {\n const alias = await buildAliasMap(cwd)\n const loader = createJiti(cwd, {\n interopDefault: true,\n alias,\n })\n const loaded = await loader(configPath)\n const config = (loaded as { default?: CliConfig }).default ?? (loaded as CliConfig)\n\n if (config == null || typeof config !== 'object') {\n throw new Error(`Invalid config: ${configPath} did not export an object`)\n }\n\n return config\n}\n\nfunction normalizeConfigPaths(config: CliConfig, configDir: string): CliConfig {\n const resolver =\n typeof config.resolver === 'string'\n ? resolveIfRelative(config.resolver, configDir)\n : config.resolver\n const buildPath = resolveIfRelative(config.buildPath, configDir)\n const outputs = config.outputs ?? []\n\n return {\n ...config,\n resolver,\n buildPath,\n outputs,\n }\n}\n\nfunction resolveIfRelative(value: string | undefined, baseDir: string): string | undefined {\n if (!value) {\n return value\n }\n return isAbsolute(value) ? value : resolve(baseDir, value)\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path)\n return true\n } catch {\n return false\n }\n}\n\nasync function buildAliasMap(cwd: string): Promise<Record<string, string>> {\n const alias: Record<string, string> = {}\n\n // Dev monorepo: point to source files for hot-reload\n const coreSourcePath = resolve(cwd, 'packages/core/src/index.ts')\n if (await fileExists(coreSourcePath)) {\n alias['dispersa'] = coreSourcePath\n return alias\n }\n\n // Not resolvable from cwd — try from the CLI module's own location\n // (handles workspace symlinks and global installs)\n if (!isPackageResolvable('dispersa', cwd)) {\n const require = createRequire(import.meta.url)\n try {\n alias['dispersa'] = require.resolve('dispersa')\n } catch {\n // Not resolvable at all; config loading will fail with a clear error\n }\n }\n\n return alias\n}\n\nfunction isPackageResolvable(name: string, cwd: string): boolean {\n const require = createRequire(import.meta.url)\n try {\n require.resolve(name, { paths: [cwd] })\n return true\n } catch {\n return false\n }\n}\n\nfunction printHelp(io: CliIO): void {\n io.stdout('dispersa build [options]')\n io.stdout('')\n io.stdout('Options:')\n io.stdout(' --config <path> Path to dispersa.config.(ts|js|mts|mjs|cts|cjs)')\n io.stdout(' --verbose, -v Show detailed build output (timing, error context)')\n}\n"]}
package/dist/cli/index.js CHANGED
@@ -32,28 +32,12 @@ async function runCli(args, options = {}) {
32
32
  printHelp(io);
33
33
  return 1;
34
34
  }
35
- const configPath = getArgValue(args, "--config");
36
35
  const verbose = hasFlag(args, "--verbose") || hasFlag(args, "-v");
37
- const resolvedPath = await resolveConfigPath(configPath, cwd);
38
- if (resolvedPath === void 0) {
39
- io.stderr(
40
- `No config found. Expected one of: ${defaultConfigNames.join(", ")} or pass --config <path>.`
41
- );
36
+ const loaded = await resolveAndLoadConfig(args, cwd, io, verbose);
37
+ if (!loaded) {
42
38
  return 1;
43
39
  }
44
- if (verbose) {
45
- io.stdout(`Config: ${resolvedPath}`);
46
- }
47
- let config;
48
- try {
49
- config = await loadConfig(resolvedPath, cwd);
50
- } catch (error) {
51
- io.stderr(`Failed to load config: ${resolvedPath}`);
52
- io.stderr(`- ${error instanceof Error ? error.message : String(error)}`);
53
- return 1;
54
- }
55
- const configDir = dirname(resolvedPath);
56
- const normalizedConfig = normalizeConfigPaths(config, configDir);
40
+ const normalizedConfig = normalizeConfigPaths(loaded.config, loaded.configDir);
57
41
  const { validation, resolver, buildPath, ...buildConfig } = normalizedConfig;
58
42
  if (verbose) {
59
43
  const outputCount = buildConfig.outputs?.length ?? 0;
@@ -66,6 +50,30 @@ async function runCli(args, options = {}) {
66
50
  const dispersa = new Dispersa({ resolver, buildPath, validation });
67
51
  const result = await dispersa.build(buildConfig);
68
52
  const elapsed = Date.now() - startTime;
53
+ return reportBuildResult(result, verbose, elapsed, io);
54
+ }
55
+ async function resolveAndLoadConfig(args, cwd, io, verbose) {
56
+ const configPath = getArgValue(args, "--config");
57
+ const resolvedPath = await resolveConfigPath(configPath, cwd);
58
+ if (resolvedPath === void 0) {
59
+ io.stderr(
60
+ `No config found. Expected one of: ${defaultConfigNames.join(", ")} or pass --config <path>.`
61
+ );
62
+ return void 0;
63
+ }
64
+ if (verbose) {
65
+ io.stdout(`Config: ${resolvedPath}`);
66
+ }
67
+ try {
68
+ const config = await loadConfig(resolvedPath, cwd);
69
+ return { config, configDir: dirname(resolvedPath) };
70
+ } catch (error) {
71
+ io.stderr(`Failed to load config: ${resolvedPath}`);
72
+ io.stderr(`- ${error instanceof Error ? error.message : String(error)}`);
73
+ return void 0;
74
+ }
75
+ }
76
+ function reportBuildResult(result, verbose, elapsed, io) {
69
77
  if (!result.success) {
70
78
  io.stderr("Build failed.");
71
79
  for (const error of result.errors ?? []) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/cli.ts","../../src/cli/index.ts"],"names":["process","require"],"mappings":"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","file":"index.js","sourcesContent":["import { access } from 'node:fs/promises'\nimport { createRequire } from 'node:module'\nimport { dirname, isAbsolute, resolve } from 'node:path'\nimport process from 'node:process'\n\nimport { Dispersa, type BuildConfig } from 'dispersa'\nimport { createJiti } from 'jiti'\n\nimport type { CliConfig } from './config'\n\ntype CliIO = {\n stdout: (message: string) => void\n stderr: (message: string) => void\n}\n\ntype RunOptions = {\n cwd?: string\n io?: CliIO\n}\n\nconst defaultConfigNames = [\n 'dispersa.config.ts',\n 'dispersa.config.js',\n 'dispersa.config.mts',\n 'dispersa.config.mjs',\n 'dispersa.config.cts',\n 'dispersa.config.cjs',\n]\n\nexport async function runCli(args: string[], options: RunOptions = {}): Promise<number> {\n const cwd = options.cwd ?? process.cwd()\n const io: CliIO = options.io ?? {\n stdout: (message) => process.stdout.write(`${message}\\n`),\n stderr: (message) => process.stderr.write(`${message}\\n`),\n }\n\n const command = args[0] ?? 'build'\n if (command === '--help' || command === '-h' || command === 'help') {\n printHelp(io)\n return 0\n }\n\n if (command !== 'build') {\n io.stderr(`Unknown command: ${command}`)\n printHelp(io)\n return 1\n }\n\n const configPath = getArgValue(args, '--config')\n const verbose = hasFlag(args, '--verbose') || hasFlag(args, '-v')\n const resolvedPath = await resolveConfigPath(configPath, cwd)\n if (resolvedPath === undefined) {\n io.stderr(\n `No config found. Expected one of: ${defaultConfigNames.join(', ')} ` +\n 'or pass --config <path>.',\n )\n return 1\n }\n\n if (verbose) {\n io.stdout(`Config: ${resolvedPath}`)\n }\n\n let config: CliConfig\n try {\n config = await loadConfig(resolvedPath, cwd)\n } catch (error) {\n io.stderr(`Failed to load config: ${resolvedPath}`)\n io.stderr(`- ${error instanceof Error ? error.message : String(error)}`)\n return 1\n }\n\n const configDir = dirname(resolvedPath)\n const normalizedConfig = normalizeConfigPaths(config, configDir)\n const { validation, resolver, buildPath, ...buildConfig } = normalizedConfig\n\n if (verbose) {\n const outputCount = buildConfig.outputs?.length ?? 0\n io.stdout(`Outputs: ${outputCount} configured`)\n if (buildPath) {\n io.stdout(`Build path: ${buildPath}`)\n }\n }\n\n const startTime = Date.now()\n const dispersa = new Dispersa({ resolver, buildPath, validation })\n const result = await dispersa.build(buildConfig as BuildConfig)\n const elapsed = Date.now() - startTime\n\n if (!result.success) {\n io.stderr('Build failed.')\n for (const error of result.errors ?? []) {\n io.stderr(`- [${error.code}] ${error.message}`)\n if (verbose && error.tokenPath) {\n io.stderr(` Token: ${error.tokenPath}`)\n }\n if (verbose && error.path) {\n io.stderr(` File: ${error.path}`)\n }\n if (verbose && error.suggestions && error.suggestions.length > 0) {\n io.stderr(` Suggestions: ${error.suggestions.join(', ')}`)\n }\n }\n if (verbose) {\n io.stderr(`Duration: ${elapsed}ms`)\n }\n return 1\n }\n\n io.stdout('Build succeeded.')\n for (const output of result.outputs) {\n const location = output.path ?? '(in-memory)'\n io.stdout(`- ${output.name}: ${location}`)\n }\n\n if (verbose) {\n io.stdout(`Duration: ${elapsed}ms`)\n }\n\n return 0\n}\n\nfunction getArgValue(args: string[], flag: string): string | undefined {\n const index = args.indexOf(flag)\n if (index === -1 || index === args.length - 1) {\n return undefined\n }\n const value = args[index + 1]\n if (value == null || value.startsWith('-')) {\n return undefined\n }\n return value\n}\n\nfunction hasFlag(args: string[], flag: string): boolean {\n return args.includes(flag)\n}\n\nasync function resolveConfigPath(\n configPath: string | undefined,\n cwd: string,\n): Promise<string | undefined> {\n if (configPath) {\n const fullPath = resolve(cwd, configPath)\n if (!(await fileExists(fullPath))) {\n return undefined\n }\n return fullPath\n }\n\n for (const name of defaultConfigNames) {\n const fullPath = resolve(cwd, name)\n if (await fileExists(fullPath)) {\n return fullPath\n }\n }\n\n return undefined\n}\n\nasync function loadConfig(configPath: string, cwd: string): Promise<CliConfig> {\n const alias = await buildAliasMap(cwd)\n const loader = createJiti(cwd, {\n interopDefault: true,\n alias,\n })\n const loaded = await loader(configPath)\n const config = (loaded as { default?: CliConfig }).default ?? (loaded as CliConfig)\n\n if (config == null || typeof config !== 'object') {\n throw new Error(`Invalid config: ${configPath} did not export an object`)\n }\n\n return config\n}\n\nfunction normalizeConfigPaths(config: CliConfig, configDir: string): CliConfig {\n const resolver =\n typeof config.resolver === 'string'\n ? resolveIfRelative(config.resolver, configDir)\n : config.resolver\n const buildPath = resolveIfRelative(config.buildPath, configDir)\n const outputs = config.outputs ?? []\n\n return {\n ...config,\n resolver,\n buildPath,\n outputs,\n }\n}\n\nfunction resolveIfRelative(value: string | undefined, baseDir: string): string | undefined {\n if (!value) {\n return value\n }\n return isAbsolute(value) ? value : resolve(baseDir, value)\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path)\n return true\n } catch {\n return false\n }\n}\n\nasync function buildAliasMap(cwd: string): Promise<Record<string, string>> {\n const alias: Record<string, string> = {}\n\n // Dev monorepo: point to source files for hot-reload\n const coreSourcePath = resolve(cwd, 'packages/core/src/index.ts')\n if (await fileExists(coreSourcePath)) {\n alias['dispersa'] = coreSourcePath\n return alias\n }\n\n // Not resolvable from cwd — try from the CLI module's own location\n // (handles workspace symlinks and global installs)\n if (!isPackageResolvable('dispersa', cwd)) {\n const require = createRequire(import.meta.url)\n try {\n alias['dispersa'] = require.resolve('dispersa')\n } catch {\n // Not resolvable at all; config loading will fail with a clear error\n }\n }\n\n return alias\n}\n\nfunction isPackageResolvable(name: string, cwd: string): boolean {\n const require = createRequire(import.meta.url)\n try {\n require.resolve(name, { paths: [cwd] })\n return true\n } catch {\n return false\n }\n}\n\nfunction printHelp(io: CliIO): void {\n io.stdout('dispersa build [options]')\n io.stdout('')\n io.stdout('Options:')\n io.stdout(' --config <path> Path to dispersa.config.(ts|js|mts|mjs|cts|cjs)')\n io.stdout(' --verbose, -v Show detailed build output (timing, error context)')\n}\n","#!/usr/bin/env node\nimport { runCli } from './cli.js'\n\nconst exitCode = await runCli(process.argv.slice(2))\nprocess.exitCode = exitCode\n"]}
1
+ {"version":3,"sources":["../../src/cli/cli.ts","../../src/cli/index.ts"],"names":["process","require"],"mappings":"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","file":"index.js","sourcesContent":["import { access } from 'node:fs/promises'\nimport { createRequire } from 'node:module'\nimport { dirname, isAbsolute, resolve } from 'node:path'\nimport process from 'node:process'\n\nimport { Dispersa, type BuildConfig } from 'dispersa'\nimport { createJiti } from 'jiti'\n\nimport type { CliConfig } from './config'\n\ntype CliIO = {\n stdout: (message: string) => void\n stderr: (message: string) => void\n}\n\ntype RunOptions = {\n cwd?: string\n io?: CliIO\n}\n\nconst defaultConfigNames = [\n 'dispersa.config.ts',\n 'dispersa.config.js',\n 'dispersa.config.mts',\n 'dispersa.config.mjs',\n 'dispersa.config.cts',\n 'dispersa.config.cjs',\n]\n\nexport async function runCli(args: string[], options: RunOptions = {}): Promise<number> {\n const cwd = options.cwd ?? process.cwd()\n const io: CliIO = options.io ?? {\n stdout: (message) => process.stdout.write(`${message}\\n`),\n stderr: (message) => process.stderr.write(`${message}\\n`),\n }\n\n const command = args[0] ?? 'build'\n if (command === '--help' || command === '-h' || command === 'help') {\n printHelp(io)\n return 0\n }\n\n if (command !== 'build') {\n io.stderr(`Unknown command: ${command}`)\n printHelp(io)\n return 1\n }\n\n const verbose = hasFlag(args, '--verbose') || hasFlag(args, '-v')\n const loaded = await resolveAndLoadConfig(args, cwd, io, verbose)\n if (!loaded) {\n return 1\n }\n\n const normalizedConfig = normalizeConfigPaths(loaded.config, loaded.configDir)\n const { validation, resolver, buildPath, ...buildConfig } = normalizedConfig\n\n if (verbose) {\n const outputCount = buildConfig.outputs?.length ?? 0\n io.stdout(`Outputs: ${outputCount} configured`)\n if (buildPath) {\n io.stdout(`Build path: ${buildPath}`)\n }\n }\n\n const startTime = Date.now()\n const dispersa = new Dispersa({ resolver, buildPath, validation })\n const result = await dispersa.build(buildConfig as BuildConfig)\n const elapsed = Date.now() - startTime\n\n return reportBuildResult(result, verbose, elapsed, io)\n}\n\nasync function resolveAndLoadConfig(\n args: string[],\n cwd: string,\n io: CliIO,\n verbose: boolean,\n): Promise<{ config: CliConfig; configDir: string } | undefined> {\n const configPath = getArgValue(args, '--config')\n const resolvedPath = await resolveConfigPath(configPath, cwd)\n if (resolvedPath === undefined) {\n io.stderr(\n `No config found. Expected one of: ${defaultConfigNames.join(', ')} ` +\n 'or pass --config <path>.',\n )\n return undefined\n }\n\n if (verbose) {\n io.stdout(`Config: ${resolvedPath}`)\n }\n\n try {\n const config = await loadConfig(resolvedPath, cwd)\n return { config, configDir: dirname(resolvedPath) }\n } catch (error) {\n io.stderr(`Failed to load config: ${resolvedPath}`)\n io.stderr(`- ${error instanceof Error ? error.message : String(error)}`)\n return undefined\n }\n}\n\nfunction reportBuildResult(\n result: Awaited<ReturnType<Dispersa['build']>>,\n verbose: boolean,\n elapsed: number,\n io: CliIO,\n): number {\n if (!result.success) {\n io.stderr('Build failed.')\n for (const error of result.errors ?? []) {\n io.stderr(`- [${error.code}] ${error.message}`)\n if (verbose && error.tokenPath) {\n io.stderr(` Token: ${error.tokenPath}`)\n }\n if (verbose && error.path) {\n io.stderr(` File: ${error.path}`)\n }\n if (verbose && error.suggestions && error.suggestions.length > 0) {\n io.stderr(` Suggestions: ${error.suggestions.join(', ')}`)\n }\n }\n if (verbose) {\n io.stderr(`Duration: ${elapsed}ms`)\n }\n return 1\n }\n\n io.stdout('Build succeeded.')\n for (const output of result.outputs) {\n const location = output.path ?? '(in-memory)'\n io.stdout(`- ${output.name}: ${location}`)\n }\n\n if (verbose) {\n io.stdout(`Duration: ${elapsed}ms`)\n }\n\n return 0\n}\n\nfunction getArgValue(args: string[], flag: string): string | undefined {\n const index = args.indexOf(flag)\n if (index === -1 || index === args.length - 1) {\n return undefined\n }\n const value = args[index + 1]\n if (value == null || value.startsWith('-')) {\n return undefined\n }\n return value\n}\n\nfunction hasFlag(args: string[], flag: string): boolean {\n return args.includes(flag)\n}\n\nasync function resolveConfigPath(\n configPath: string | undefined,\n cwd: string,\n): Promise<string | undefined> {\n if (configPath) {\n const fullPath = resolve(cwd, configPath)\n if (!(await fileExists(fullPath))) {\n return undefined\n }\n return fullPath\n }\n\n for (const name of defaultConfigNames) {\n const fullPath = resolve(cwd, name)\n if (await fileExists(fullPath)) {\n return fullPath\n }\n }\n\n return undefined\n}\n\nasync function loadConfig(configPath: string, cwd: string): Promise<CliConfig> {\n const alias = await buildAliasMap(cwd)\n const loader = createJiti(cwd, {\n interopDefault: true,\n alias,\n })\n const loaded = await loader(configPath)\n const config = (loaded as { default?: CliConfig }).default ?? (loaded as CliConfig)\n\n if (config == null || typeof config !== 'object') {\n throw new Error(`Invalid config: ${configPath} did not export an object`)\n }\n\n return config\n}\n\nfunction normalizeConfigPaths(config: CliConfig, configDir: string): CliConfig {\n const resolver =\n typeof config.resolver === 'string'\n ? resolveIfRelative(config.resolver, configDir)\n : config.resolver\n const buildPath = resolveIfRelative(config.buildPath, configDir)\n const outputs = config.outputs ?? []\n\n return {\n ...config,\n resolver,\n buildPath,\n outputs,\n }\n}\n\nfunction resolveIfRelative(value: string | undefined, baseDir: string): string | undefined {\n if (!value) {\n return value\n }\n return isAbsolute(value) ? value : resolve(baseDir, value)\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path)\n return true\n } catch {\n return false\n }\n}\n\nasync function buildAliasMap(cwd: string): Promise<Record<string, string>> {\n const alias: Record<string, string> = {}\n\n // Dev monorepo: point to source files for hot-reload\n const coreSourcePath = resolve(cwd, 'packages/core/src/index.ts')\n if (await fileExists(coreSourcePath)) {\n alias['dispersa'] = coreSourcePath\n return alias\n }\n\n // Not resolvable from cwd — try from the CLI module's own location\n // (handles workspace symlinks and global installs)\n if (!isPackageResolvable('dispersa', cwd)) {\n const require = createRequire(import.meta.url)\n try {\n alias['dispersa'] = require.resolve('dispersa')\n } catch {\n // Not resolvable at all; config loading will fail with a clear error\n }\n }\n\n return alias\n}\n\nfunction isPackageResolvable(name: string, cwd: string): boolean {\n const require = createRequire(import.meta.url)\n try {\n require.resolve(name, { paths: [cwd] })\n return true\n } catch {\n return false\n }\n}\n\nfunction printHelp(io: CliIO): void {\n io.stdout('dispersa build [options]')\n io.stdout('')\n io.stdout('Options:')\n io.stdout(' --config <path> Path to dispersa.config.(ts|js|mts|mjs|cts|cjs)')\n io.stdout(' --verbose, -v Show detailed build output (timing, error context)')\n}\n","#!/usr/bin/env node\nimport { runCli } from './cli.js'\n\nconst exitCode = await runCli(process.argv.slice(2))\nprocess.exitCode = exitCode\n"]}
package/dist/errors.cjs CHANGED
@@ -49,20 +49,6 @@ var ValidationError = class extends DispersaError {
49
49
  this.name = "ValidationError";
50
50
  }
51
51
  };
52
- var ColorParseError = class extends DispersaError {
53
- constructor(colorValue) {
54
- super(`Color parsing failed: '${colorValue}'. Provide a valid CSS color or DTCG color object.`);
55
- this.colorValue = colorValue;
56
- this.name = "ColorParseError";
57
- }
58
- };
59
- var DimensionFormatError = class extends DispersaError {
60
- constructor(dimensionValue) {
61
- super(`Dimension parsing failed: '${dimensionValue}'. Provide a valid DTCG dimension object.`);
62
- this.dimensionValue = dimensionValue;
63
- this.name = "DimensionFormatError";
64
- }
65
- };
66
52
  var FileOperationError = class extends DispersaError {
67
53
  constructor(operation, filePath, originalError) {
68
54
  super(`Failed to ${operation} file: ${filePath}. ${originalError.message}`);
@@ -98,9 +84,7 @@ var ModifierError = class extends DispersaError {
98
84
 
99
85
  exports.BasePermutationError = BasePermutationError;
100
86
  exports.CircularReferenceError = CircularReferenceError;
101
- exports.ColorParseError = ColorParseError;
102
87
  exports.ConfigurationError = ConfigurationError;
103
- exports.DimensionFormatError = DimensionFormatError;
104
88
  exports.DispersaError = DispersaError;
105
89
  exports.FileOperationError = FileOperationError;
106
90
  exports.ModifierError = ModifierError;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/errors/index.ts"],"names":[],"mappings":"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","file":"errors.cjs","sourcesContent":["/**\n * @fileoverview Custom error classes for Dispersa\n *\n * Error classes are intentionally kept as simple value objects with no\n * imports from utility modules. Suggestion formatting is done at call\n * sites to keep the error hierarchy dependency-free.\n */\n\n/**\n * Base error class for all Dispersa errors\n */\nexport class DispersaError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'DispersaError'\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, this.constructor)\n }\n }\n}\n\n/**\n * Thrown when a token reference cannot be resolved\n *\n * @param referenceName - The token name that could not be found\n * @param suggestions - Similar token names for \"did you mean?\" hints\n * @param message - Optional custom message (overrides auto-generated message)\n */\nexport class TokenReferenceError extends DispersaError {\n constructor(\n public referenceName: string,\n public suggestions: string[] = [],\n message?: string,\n ) {\n const hint = TokenReferenceError.formatHint(suggestions)\n super(\n message ??\n `Token reference resolution failed: '${referenceName}'. Token does not exist.${hint}`,\n )\n this.name = 'TokenReferenceError'\n }\n\n private static formatHint(suggestions: string[]): string {\n if (suggestions.length === 0) {\n return ''\n }\n if (suggestions.length === 1) {\n return ` Did you mean \"${suggestions[0]}\"?`\n }\n const quoted = suggestions.map((s) => `\"${s}\"`)\n const last = quoted.pop()!\n return ` Did you mean ${quoted.join(', ')} or ${last}?`\n }\n}\n\n/**\n * Thrown when a circular reference is detected\n */\nexport class CircularReferenceError extends DispersaError {\n constructor(\n public tokenName: string,\n public referencePath: string[],\n ) {\n super(\n `Token resolution failed: '${tokenName}'. Circular reference detected in path: ${referencePath.join(' -> ')}`,\n )\n this.name = 'CircularReferenceError'\n }\n}\n\n/**\n * Thrown when validation fails\n */\nexport class ValidationError extends DispersaError {\n constructor(\n message: string,\n public errors: { message: string; path?: string }[],\n ) {\n super(message)\n this.name = 'ValidationError'\n }\n}\n\n/**\n * Thrown when a color format cannot be parsed\n */\nexport class ColorParseError extends DispersaError {\n constructor(public colorValue: string) {\n super(`Color parsing failed: '${colorValue}'. Provide a valid CSS color or DTCG color object.`)\n this.name = 'ColorParseError'\n }\n}\n\n/**\n * Thrown when a dimension format is invalid\n */\nexport class DimensionFormatError extends DispersaError {\n constructor(public dimensionValue: string) {\n super(`Dimension parsing failed: '${dimensionValue}'. Provide a valid DTCG dimension object.`)\n this.name = 'DimensionFormatError'\n }\n}\n\n/**\n * Thrown when file operations fail\n */\nexport class FileOperationError extends DispersaError {\n constructor(\n public operation: 'read' | 'write',\n public filePath: string,\n public originalError: Error,\n ) {\n super(`Failed to ${operation} file: ${filePath}. ${originalError.message}`)\n this.name = 'FileOperationError'\n }\n}\n\n/**\n * Thrown when a build configuration is invalid\n */\nexport class ConfigurationError extends DispersaError {\n constructor(message: string) {\n super(message)\n this.name = 'ConfigurationError'\n }\n}\n\n/**\n * Thrown when base permutation cannot be determined\n */\nexport class BasePermutationError extends DispersaError {\n constructor(\n message = 'Base permutation determination failed. Define a default modifier in resolver.',\n ) {\n super(message)\n this.name = 'BasePermutationError'\n }\n}\n\n/**\n * Thrown when an unknown modifier or context is used\n *\n * @param modifierName - Name of the modifier that failed validation\n * @param contextValue - The invalid context value (if applicable)\n * @param availableValues - Valid options (context names or modifier names) for the error message\n */\nexport class ModifierError extends DispersaError {\n constructor(\n public modifierName: string,\n public contextValue?: string,\n public availableValues: string[] = [],\n ) {\n const available = availableValues.length > 0 ? ` Available: ${availableValues.join(', ')}.` : ''\n\n const message =\n contextValue != null && contextValue !== ''\n ? `Modifier validation failed: '${modifierName}'. Invalid context '${contextValue}'.${available}`\n : `Modifier validation failed: '${modifierName}'. Modifier not defined in resolver.${available}`\n super(message)\n this.name = 'ModifierError'\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/shared/errors/index.ts"],"names":[],"mappings":"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","file":"errors.cjs","sourcesContent":["/**\n * @fileoverview Custom error classes for Dispersa\n *\n * Error classes are intentionally kept as simple value objects with no\n * imports from utility modules. Suggestion formatting is done at call\n * sites to keep the error hierarchy dependency-free.\n */\n\n/**\n * Base error class for all Dispersa errors\n */\nexport class DispersaError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'DispersaError'\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, this.constructor)\n }\n }\n}\n\n/**\n * Thrown when a token reference cannot be resolved\n *\n * @param referenceName - The token name that could not be found\n * @param suggestions - Similar token names for \"did you mean?\" hints\n * @param message - Optional custom message (overrides auto-generated message)\n */\nexport class TokenReferenceError extends DispersaError {\n constructor(\n public referenceName: string,\n public suggestions: string[] = [],\n message?: string,\n ) {\n const hint = TokenReferenceError.formatHint(suggestions)\n super(\n message ??\n `Token reference resolution failed: '${referenceName}'. Token does not exist.${hint}`,\n )\n this.name = 'TokenReferenceError'\n }\n\n private static formatHint(suggestions: string[]): string {\n if (suggestions.length === 0) {\n return ''\n }\n if (suggestions.length === 1) {\n return ` Did you mean \"${suggestions[0]}\"?`\n }\n const quoted = suggestions.map((s) => `\"${s}\"`)\n const last = quoted.pop()!\n return ` Did you mean ${quoted.join(', ')} or ${last}?`\n }\n}\n\n/**\n * Thrown when a circular reference is detected\n */\nexport class CircularReferenceError extends DispersaError {\n constructor(\n public tokenName: string,\n public referencePath: string[],\n ) {\n super(\n `Token resolution failed: '${tokenName}'. Circular reference detected in path: ${referencePath.join(' -> ')}`,\n )\n this.name = 'CircularReferenceError'\n }\n}\n\n/**\n * Thrown when validation fails\n */\nexport class ValidationError extends DispersaError {\n constructor(\n message: string,\n public errors: { message: string; path?: string }[],\n ) {\n super(message)\n this.name = 'ValidationError'\n }\n}\n\n/**\n * Thrown when file operations fail\n */\nexport class FileOperationError extends DispersaError {\n constructor(\n public operation: 'read' | 'write',\n public filePath: string,\n public originalError: Error,\n ) {\n super(`Failed to ${operation} file: ${filePath}. ${originalError.message}`)\n this.name = 'FileOperationError'\n }\n}\n\n/**\n * Thrown when a build configuration is invalid\n */\nexport class ConfigurationError extends DispersaError {\n constructor(message: string) {\n super(message)\n this.name = 'ConfigurationError'\n }\n}\n\n/**\n * Thrown when base permutation cannot be determined\n */\nexport class BasePermutationError extends DispersaError {\n constructor(\n message = 'Base permutation determination failed. Define a default modifier in resolver.',\n ) {\n super(message)\n this.name = 'BasePermutationError'\n }\n}\n\n/**\n * Thrown when an unknown modifier or context is used\n *\n * @param modifierName - Name of the modifier that failed validation\n * @param contextValue - The invalid context value (if applicable)\n * @param availableValues - Valid options (context names or modifier names) for the error message\n */\nexport class ModifierError extends DispersaError {\n constructor(\n public modifierName: string,\n public contextValue?: string,\n public availableValues: string[] = [],\n ) {\n const available = availableValues.length > 0 ? ` Available: ${availableValues.join(', ')}.` : ''\n\n const message =\n contextValue != null && contextValue !== ''\n ? `Modifier validation failed: '${modifierName}'. Invalid context '${contextValue}'.${available}`\n : `Modifier validation failed: '${modifierName}'. Modifier not defined in resolver.${available}`\n super(message)\n this.name = 'ModifierError'\n }\n}\n"]}
package/dist/errors.d.cts CHANGED
@@ -45,20 +45,6 @@ declare class ValidationError extends DispersaError {
45
45
  path?: string;
46
46
  }[]);
47
47
  }
48
- /**
49
- * Thrown when a color format cannot be parsed
50
- */
51
- declare class ColorParseError extends DispersaError {
52
- colorValue: string;
53
- constructor(colorValue: string);
54
- }
55
- /**
56
- * Thrown when a dimension format is invalid
57
- */
58
- declare class DimensionFormatError extends DispersaError {
59
- dimensionValue: string;
60
- constructor(dimensionValue: string);
61
- }
62
48
  /**
63
49
  * Thrown when file operations fail
64
50
  */
@@ -94,4 +80,4 @@ declare class ModifierError extends DispersaError {
94
80
  constructor(modifierName: string, contextValue?: string | undefined, availableValues?: string[]);
95
81
  }
96
82
 
97
- export { BasePermutationError, CircularReferenceError, ColorParseError, ConfigurationError, DimensionFormatError, DispersaError, FileOperationError, ModifierError, TokenReferenceError, ValidationError };
83
+ export { BasePermutationError, CircularReferenceError, ConfigurationError, DispersaError, FileOperationError, ModifierError, TokenReferenceError, ValidationError };
package/dist/errors.d.ts CHANGED
@@ -45,20 +45,6 @@ declare class ValidationError extends DispersaError {
45
45
  path?: string;
46
46
  }[]);
47
47
  }
48
- /**
49
- * Thrown when a color format cannot be parsed
50
- */
51
- declare class ColorParseError extends DispersaError {
52
- colorValue: string;
53
- constructor(colorValue: string);
54
- }
55
- /**
56
- * Thrown when a dimension format is invalid
57
- */
58
- declare class DimensionFormatError extends DispersaError {
59
- dimensionValue: string;
60
- constructor(dimensionValue: string);
61
- }
62
48
  /**
63
49
  * Thrown when file operations fail
64
50
  */
@@ -94,4 +80,4 @@ declare class ModifierError extends DispersaError {
94
80
  constructor(modifierName: string, contextValue?: string | undefined, availableValues?: string[]);
95
81
  }
96
82
 
97
- export { BasePermutationError, CircularReferenceError, ColorParseError, ConfigurationError, DimensionFormatError, DispersaError, FileOperationError, ModifierError, TokenReferenceError, ValidationError };
83
+ export { BasePermutationError, CircularReferenceError, ConfigurationError, DispersaError, FileOperationError, ModifierError, TokenReferenceError, ValidationError };
package/dist/errors.js CHANGED
@@ -47,20 +47,6 @@ var ValidationError = class extends DispersaError {
47
47
  this.name = "ValidationError";
48
48
  }
49
49
  };
50
- var ColorParseError = class extends DispersaError {
51
- constructor(colorValue) {
52
- super(`Color parsing failed: '${colorValue}'. Provide a valid CSS color or DTCG color object.`);
53
- this.colorValue = colorValue;
54
- this.name = "ColorParseError";
55
- }
56
- };
57
- var DimensionFormatError = class extends DispersaError {
58
- constructor(dimensionValue) {
59
- super(`Dimension parsing failed: '${dimensionValue}'. Provide a valid DTCG dimension object.`);
60
- this.dimensionValue = dimensionValue;
61
- this.name = "DimensionFormatError";
62
- }
63
- };
64
50
  var FileOperationError = class extends DispersaError {
65
51
  constructor(operation, filePath, originalError) {
66
52
  super(`Failed to ${operation} file: ${filePath}. ${originalError.message}`);
@@ -94,6 +80,6 @@ var ModifierError = class extends DispersaError {
94
80
  }
95
81
  };
96
82
 
97
- export { BasePermutationError, CircularReferenceError, ColorParseError, ConfigurationError, DimensionFormatError, DispersaError, FileOperationError, ModifierError, TokenReferenceError, ValidationError };
83
+ export { BasePermutationError, CircularReferenceError, ConfigurationError, DispersaError, FileOperationError, ModifierError, TokenReferenceError, ValidationError };
98
84
  //# sourceMappingURL=errors.js.map
99
85
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/errors/index.ts"],"names":[],"mappings":"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","file":"errors.js","sourcesContent":["/**\n * @fileoverview Custom error classes for Dispersa\n *\n * Error classes are intentionally kept as simple value objects with no\n * imports from utility modules. Suggestion formatting is done at call\n * sites to keep the error hierarchy dependency-free.\n */\n\n/**\n * Base error class for all Dispersa errors\n */\nexport class DispersaError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'DispersaError'\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, this.constructor)\n }\n }\n}\n\n/**\n * Thrown when a token reference cannot be resolved\n *\n * @param referenceName - The token name that could not be found\n * @param suggestions - Similar token names for \"did you mean?\" hints\n * @param message - Optional custom message (overrides auto-generated message)\n */\nexport class TokenReferenceError extends DispersaError {\n constructor(\n public referenceName: string,\n public suggestions: string[] = [],\n message?: string,\n ) {\n const hint = TokenReferenceError.formatHint(suggestions)\n super(\n message ??\n `Token reference resolution failed: '${referenceName}'. Token does not exist.${hint}`,\n )\n this.name = 'TokenReferenceError'\n }\n\n private static formatHint(suggestions: string[]): string {\n if (suggestions.length === 0) {\n return ''\n }\n if (suggestions.length === 1) {\n return ` Did you mean \"${suggestions[0]}\"?`\n }\n const quoted = suggestions.map((s) => `\"${s}\"`)\n const last = quoted.pop()!\n return ` Did you mean ${quoted.join(', ')} or ${last}?`\n }\n}\n\n/**\n * Thrown when a circular reference is detected\n */\nexport class CircularReferenceError extends DispersaError {\n constructor(\n public tokenName: string,\n public referencePath: string[],\n ) {\n super(\n `Token resolution failed: '${tokenName}'. Circular reference detected in path: ${referencePath.join(' -> ')}`,\n )\n this.name = 'CircularReferenceError'\n }\n}\n\n/**\n * Thrown when validation fails\n */\nexport class ValidationError extends DispersaError {\n constructor(\n message: string,\n public errors: { message: string; path?: string }[],\n ) {\n super(message)\n this.name = 'ValidationError'\n }\n}\n\n/**\n * Thrown when a color format cannot be parsed\n */\nexport class ColorParseError extends DispersaError {\n constructor(public colorValue: string) {\n super(`Color parsing failed: '${colorValue}'. Provide a valid CSS color or DTCG color object.`)\n this.name = 'ColorParseError'\n }\n}\n\n/**\n * Thrown when a dimension format is invalid\n */\nexport class DimensionFormatError extends DispersaError {\n constructor(public dimensionValue: string) {\n super(`Dimension parsing failed: '${dimensionValue}'. Provide a valid DTCG dimension object.`)\n this.name = 'DimensionFormatError'\n }\n}\n\n/**\n * Thrown when file operations fail\n */\nexport class FileOperationError extends DispersaError {\n constructor(\n public operation: 'read' | 'write',\n public filePath: string,\n public originalError: Error,\n ) {\n super(`Failed to ${operation} file: ${filePath}. ${originalError.message}`)\n this.name = 'FileOperationError'\n }\n}\n\n/**\n * Thrown when a build configuration is invalid\n */\nexport class ConfigurationError extends DispersaError {\n constructor(message: string) {\n super(message)\n this.name = 'ConfigurationError'\n }\n}\n\n/**\n * Thrown when base permutation cannot be determined\n */\nexport class BasePermutationError extends DispersaError {\n constructor(\n message = 'Base permutation determination failed. Define a default modifier in resolver.',\n ) {\n super(message)\n this.name = 'BasePermutationError'\n }\n}\n\n/**\n * Thrown when an unknown modifier or context is used\n *\n * @param modifierName - Name of the modifier that failed validation\n * @param contextValue - The invalid context value (if applicable)\n * @param availableValues - Valid options (context names or modifier names) for the error message\n */\nexport class ModifierError extends DispersaError {\n constructor(\n public modifierName: string,\n public contextValue?: string,\n public availableValues: string[] = [],\n ) {\n const available = availableValues.length > 0 ? ` Available: ${availableValues.join(', ')}.` : ''\n\n const message =\n contextValue != null && contextValue !== ''\n ? `Modifier validation failed: '${modifierName}'. Invalid context '${contextValue}'.${available}`\n : `Modifier validation failed: '${modifierName}'. Modifier not defined in resolver.${available}`\n super(message)\n this.name = 'ModifierError'\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/shared/errors/index.ts"],"names":[],"mappings":"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","file":"errors.js","sourcesContent":["/**\n * @fileoverview Custom error classes for Dispersa\n *\n * Error classes are intentionally kept as simple value objects with no\n * imports from utility modules. Suggestion formatting is done at call\n * sites to keep the error hierarchy dependency-free.\n */\n\n/**\n * Base error class for all Dispersa errors\n */\nexport class DispersaError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'DispersaError'\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, this.constructor)\n }\n }\n}\n\n/**\n * Thrown when a token reference cannot be resolved\n *\n * @param referenceName - The token name that could not be found\n * @param suggestions - Similar token names for \"did you mean?\" hints\n * @param message - Optional custom message (overrides auto-generated message)\n */\nexport class TokenReferenceError extends DispersaError {\n constructor(\n public referenceName: string,\n public suggestions: string[] = [],\n message?: string,\n ) {\n const hint = TokenReferenceError.formatHint(suggestions)\n super(\n message ??\n `Token reference resolution failed: '${referenceName}'. Token does not exist.${hint}`,\n )\n this.name = 'TokenReferenceError'\n }\n\n private static formatHint(suggestions: string[]): string {\n if (suggestions.length === 0) {\n return ''\n }\n if (suggestions.length === 1) {\n return ` Did you mean \"${suggestions[0]}\"?`\n }\n const quoted = suggestions.map((s) => `\"${s}\"`)\n const last = quoted.pop()!\n return ` Did you mean ${quoted.join(', ')} or ${last}?`\n }\n}\n\n/**\n * Thrown when a circular reference is detected\n */\nexport class CircularReferenceError extends DispersaError {\n constructor(\n public tokenName: string,\n public referencePath: string[],\n ) {\n super(\n `Token resolution failed: '${tokenName}'. Circular reference detected in path: ${referencePath.join(' -> ')}`,\n )\n this.name = 'CircularReferenceError'\n }\n}\n\n/**\n * Thrown when validation fails\n */\nexport class ValidationError extends DispersaError {\n constructor(\n message: string,\n public errors: { message: string; path?: string }[],\n ) {\n super(message)\n this.name = 'ValidationError'\n }\n}\n\n/**\n * Thrown when file operations fail\n */\nexport class FileOperationError extends DispersaError {\n constructor(\n public operation: 'read' | 'write',\n public filePath: string,\n public originalError: Error,\n ) {\n super(`Failed to ${operation} file: ${filePath}. ${originalError.message}`)\n this.name = 'FileOperationError'\n }\n}\n\n/**\n * Thrown when a build configuration is invalid\n */\nexport class ConfigurationError extends DispersaError {\n constructor(message: string) {\n super(message)\n this.name = 'ConfigurationError'\n }\n}\n\n/**\n * Thrown when base permutation cannot be determined\n */\nexport class BasePermutationError extends DispersaError {\n constructor(\n message = 'Base permutation determination failed. Define a default modifier in resolver.',\n ) {\n super(message)\n this.name = 'BasePermutationError'\n }\n}\n\n/**\n * Thrown when an unknown modifier or context is used\n *\n * @param modifierName - Name of the modifier that failed validation\n * @param contextValue - The invalid context value (if applicable)\n * @param availableValues - Valid options (context names or modifier names) for the error message\n */\nexport class ModifierError extends DispersaError {\n constructor(\n public modifierName: string,\n public contextValue?: string,\n public availableValues: string[] = [],\n ) {\n const available = availableValues.length > 0 ? ` Available: ${availableValues.join(', ')}.` : ''\n\n const message =\n contextValue != null && contextValue !== ''\n ? `Modifier validation failed: '${modifierName}'. Invalid context '${contextValue}'.${available}`\n : `Modifier validation failed: '${modifierName}'. Modifier not defined in resolver.${available}`\n super(message)\n this.name = 'ModifierError'\n }\n}\n"]}
package/dist/filters.cjs CHANGED
@@ -406,7 +406,7 @@ var AliasResolver = class _AliasResolver {
406
406
  }
407
407
  };
408
408
 
409
- // src/processing/processors/filters/built-in.ts
409
+ // src/processing/filters/built-in/index.ts
410
410
  function byType(type) {
411
411
  return {
412
412
  filter: (token) => token.$type === type