@wolfstar/schema 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,49 @@
1
1
  import { Diagnostic } from "nostics";
2
2
  import { EventEmitter } from "node:events";
3
+ //#region src/types/modules.d.ts
4
+ /**
5
+ * A module as listed in `modules` in `stars.config`: a package name (or a file path Node can import) on its own, or
6
+ * a `[specifier, options]` tuple whose options are merged over the module's `defaults`. Falsy entries are dropped, so
7
+ * `modules: [useCache && '@wolfstar/plugin-cache']` works.
8
+ */
9
+ type StarsModuleEntry = string | readonly [specifier: string, options?: Record<string, unknown>];
10
+ /** One entry of `modules`, normalised. */
11
+ interface ResolvedModuleEntry {
12
+ /** A package name, or a file path/URL, the module is imported from. */
13
+ readonly specifier: string;
14
+ /** The options written in `stars.config`, before the module's `defaults` are merged under them. */
15
+ readonly options: Readonly<Record<string, unknown>>;
16
+ }
17
+ /**
18
+ * A runtime plugin a module registered with `ctx.addPlugin`. Plugins cross from the CLI process into the bot by
19
+ * source, not by value: the entry (or, for the `tsc`/`none` build tools, a `node --import` preload) imports `from` and
20
+ * passes its `export` to `Client.use` — as the plugin itself, or, when it is a function, the result of calling it with
21
+ * `options`.
22
+ */
23
+ interface RuntimePluginRegistration {
24
+ /** The module that registered it. */
25
+ readonly module: string;
26
+ /** A package specifier or an absolute file path. */
27
+ readonly from: string;
28
+ /** @default 'default' */
29
+ readonly export: string;
30
+ /** JSON-serialisable options handed to the plugin when it is a factory. */
31
+ readonly options?: unknown;
32
+ }
33
+ /** A module that was installed. */
34
+ interface InstalledModule {
35
+ readonly name: string;
36
+ readonly version?: string;
37
+ }
38
+ /** What the installed modules contributed, known once the CLI ran their `setup`. Empty until then. */
39
+ interface ModulesRuntime {
40
+ readonly modules: readonly InstalledModule[];
41
+ readonly plugins: readonly RuntimePluginRegistration[];
42
+ /** Packages added to `imports.presets` by `ctx.addImports`. */
43
+ readonly imports: readonly string[];
44
+ }
45
+ declare const EMPTY_MODULES_RUNTIME: ModulesRuntime;
46
+ //#endregion
3
47
  //#region src/config/validator.d.ts
4
48
  /** Validates raw `stars.config` values, throwing a `configDiagnostics` diagnostic grounded in the configuration file. */
5
49
  declare class Validator {
@@ -170,6 +214,10 @@ interface ResolvedStarsConfig {
170
214
  readonly env: ResolvedEnvConfig;
171
215
  /** The `hooks` block, flattened to full hook names (`build:done`). */
172
216
  readonly hooks: ResolvedHooksConfig;
217
+ /** The `modules` block, normalised. */
218
+ readonly modules: readonly ResolvedModuleEntry[];
219
+ /** What the installed modules contributed. Empty until the CLI ran their `setup`. */
220
+ readonly runtime: ModulesRuntime;
173
221
  readonly experimental: ResolvedExperimentalConfig;
174
222
  readonly future: ResolvedFutureConfig;
175
223
  /** Raw options merged into `vite.config.*`. */
@@ -714,6 +762,13 @@ interface StarsConfig {
714
762
  * their namespace (`{ build: { done() {} } }`). Each value is a function or an array of functions.
715
763
  */
716
764
  hooks?: StarsHooksConfig;
765
+ /**
766
+ * Installable modules (see `defineModule` in `@wolfstar/kit`), each a package name or a `[name, options]` tuple.
767
+ * A package listed here is installed because the project says so, not because of its name: it is no longer
768
+ * activated through the `@wolfstar/plugin-*` `/register` import the CLI otherwise injects. Falsy entries are
769
+ * dropped.
770
+ */
771
+ modules?: readonly (StarsModuleEntry | false | null | undefined)[];
717
772
  /** Opt-in flags for behaviour that is still landing. */
718
773
  experimental?: StarsExperimentalConfig;
719
774
  /** Build-default compatibility. Omit for version 5; version 3 is end-of-life and only meant for migrating a standalone tsdown config. */
@@ -746,5 +801,5 @@ interface StarsConfig {
746
801
  */
747
802
  declare function defineConfig(config: StarsConfig): StarsConfig;
748
803
  //#endregion
749
- export { EOL_COMPATIBILITY_VERSIONS as $, BuilderLogLevel as A, ResolvedStarsConfig as B, StarsHooks as C, Builder as D, BuildOutcome as E, ResolvedDevConfig as F, resolveStarsConfig as G, ResolvedTypecheckConfig as H, ResolvedExperimentalConfig as I, resolveHooks as J, ResolvedHooksConfig as K, ResolvedI18nCodegenConfig as L, ResolveConfigOptions as M, ResolvedBuildConfig as N, BuilderContext as O, ResolvedCodegenConfig as P, DEFAULT_COMPATIBILITY_VERSION as Q, ResolvedImportsConfig as R, StarsHookNamespace as S, StarsRestartReason as T, displayPath as U, ResolvedTunnelConfig as V, readProjectEnvFiles as W, resolveEnv as X, ResolvedEnvConfig as Y, AUTO_ENV_VERSION as Z, StarsTypecheckConfig as _, StarsCompatibilityVersion as a, PrepareProjectResult as b, StarsEnvConfig as c, StarsFutureConfig as d, LATEST_COMPATIBILITY_VERSION as et, StarsI18nCodegenConfig as f, StarsTunnelConfig as g, StarsTsdownConfig as h, StarsCodegenConfig as i, PackageJsonLike as j, BuilderEvents as k, StarsEnvSetupOptions as l, StarsNitroConfig as m, StarsBuildConfig as n, ResolvedFutureConfig as nt, StarsConfig as o, StarsImportsConfig as p, STARS_HOOK_NAMES as q, StarsBuildTool as r, STARS_CONFIG_TSDOWN_VERSION as rt, StarsDevConfig as s, defineConfig as t, LEGACY_COMPATIBILITY_VERSION as tt, StarsExperimentalConfig as u, StarsTypechecker as v, StarsHooksConfig as w, StarsHookName as x, StarsViteConfig as y, ResolvedNitroConfig as z };
750
- //# sourceMappingURL=config-Ctpk84fx.d.ts.map
804
+ export { EOL_COMPATIBILITY_VERSIONS as $, BuilderLogLevel as A, ResolvedStarsConfig as B, StarsHooks as C, Builder as D, BuildOutcome as E, ResolvedDevConfig as F, resolveStarsConfig as G, ResolvedTypecheckConfig as H, ResolvedExperimentalConfig as I, resolveHooks as J, ResolvedHooksConfig as K, ResolvedI18nCodegenConfig as L, ResolveConfigOptions as M, ResolvedBuildConfig as N, BuilderContext as O, ResolvedCodegenConfig as P, DEFAULT_COMPATIBILITY_VERSION as Q, ResolvedImportsConfig as R, StarsHookNamespace as S, StarsRestartReason as T, displayPath as U, ResolvedTunnelConfig as V, readProjectEnvFiles as W, resolveEnv as X, ResolvedEnvConfig as Y, AUTO_ENV_VERSION as Z, StarsTypecheckConfig as _, StarsCompatibilityVersion as a, EMPTY_MODULES_RUNTIME as at, PrepareProjectResult as b, StarsEnvConfig as c, ResolvedModuleEntry as ct, StarsFutureConfig as d, LATEST_COMPATIBILITY_VERSION as et, StarsI18nCodegenConfig as f, StarsTunnelConfig as g, StarsTsdownConfig as h, StarsCodegenConfig as i, Validator as it, PackageJsonLike as j, BuilderEvents as k, StarsEnvSetupOptions as l, RuntimePluginRegistration as lt, StarsNitroConfig as m, StarsBuildConfig as n, ResolvedFutureConfig as nt, StarsConfig as o, InstalledModule as ot, StarsImportsConfig as p, STARS_HOOK_NAMES as q, StarsBuildTool as r, STARS_CONFIG_TSDOWN_VERSION as rt, StarsDevConfig as s, ModulesRuntime as st, defineConfig as t, LEGACY_COMPATIBILITY_VERSION as tt, StarsExperimentalConfig as u, StarsModuleEntry as ut, StarsTypechecker as v, StarsHooksConfig as w, StarsHookName as x, StarsViteConfig as y, ResolvedNitroConfig as z };
805
+ //# sourceMappingURL=config-BFRzY_rK.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-BFRzY_rK.d.ts","names":[],"sources":["../../src/types/modules.ts","../../src/config/validator.ts","../../src/config/compatibility.ts","../../src/config/env.ts","../../src/config/hooks.ts","../../src/config/resolve.ts","../../src/types/builder.ts","../../src/types/hooks.ts","../../src/types/config.ts","../../src/config.ts"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { _ as StarsTypecheckConfig, a as StarsCompatibilityVersion, c as StarsEnvConfig, d as StarsFutureConfig, f as StarsI18nCodegenConfig, g as StarsTunnelConfig, h as StarsTsdownConfig, i as StarsCodegenConfig, l as StarsEnvSetupOptions, m as StarsNitroConfig, n as StarsBuildConfig, o as StarsConfig, p as StarsImportsConfig, r as StarsBuildTool, s as StarsDevConfig, t as defineConfig, u as StarsExperimentalConfig, v as StarsTypechecker, y as StarsViteConfig } from "./config-Ctpk84fx.js";
1
+ import { _ as StarsTypecheckConfig, a as StarsCompatibilityVersion, c as StarsEnvConfig, d as StarsFutureConfig, f as StarsI18nCodegenConfig, g as StarsTunnelConfig, h as StarsTsdownConfig, i as StarsCodegenConfig, l as StarsEnvSetupOptions, m as StarsNitroConfig, n as StarsBuildConfig, o as StarsConfig, p as StarsImportsConfig, r as StarsBuildTool, s as StarsDevConfig, t as defineConfig, u as StarsExperimentalConfig, v as StarsTypechecker, y as StarsViteConfig } from "./config-BFRzY_rK.js";
2
2
  export { type StarsBuildConfig, type StarsBuildTool, type StarsCodegenConfig, type StarsCompatibilityVersion, type StarsConfig, type StarsDevConfig, type StarsEnvConfig, type StarsEnvSetupOptions, type StarsExperimentalConfig, type StarsFutureConfig, type StarsI18nCodegenConfig, type StarsImportsConfig, type StarsNitroConfig, type StarsTsdownConfig, type StarsTunnelConfig, type StarsTypecheckConfig, type StarsTypechecker, type StarsViteConfig, defineConfig };
@@ -1,4 +1,4 @@
1
- import { $ as EOL_COMPATIBILITY_VERSIONS, A as BuilderLogLevel, B as ResolvedStarsConfig, C as StarsHooks, D as Builder, E as BuildOutcome, F as ResolvedDevConfig, G as resolveStarsConfig, H as ResolvedTypecheckConfig, I as ResolvedExperimentalConfig, J as resolveHooks, K as ResolvedHooksConfig, L as ResolvedI18nCodegenConfig, M as ResolveConfigOptions, N as ResolvedBuildConfig, O as BuilderContext, P as ResolvedCodegenConfig, Q as DEFAULT_COMPATIBILITY_VERSION, R as ResolvedImportsConfig, S as StarsHookNamespace, T as StarsRestartReason, U as displayPath, V as ResolvedTunnelConfig, W as readProjectEnvFiles, X as resolveEnv, Y as ResolvedEnvConfig, Z as AUTO_ENV_VERSION, _ as StarsTypecheckConfig, a as StarsCompatibilityVersion, b as PrepareProjectResult, c as StarsEnvConfig, d as StarsFutureConfig, et as LATEST_COMPATIBILITY_VERSION, f as StarsI18nCodegenConfig, g as StarsTunnelConfig, h as StarsTsdownConfig, i as StarsCodegenConfig, j as PackageJsonLike, k as BuilderEvents, l as StarsEnvSetupOptions, m as StarsNitroConfig, n as StarsBuildConfig, nt as ResolvedFutureConfig, o as StarsConfig, p as StarsImportsConfig, q as STARS_HOOK_NAMES, r as StarsBuildTool, rt as STARS_CONFIG_TSDOWN_VERSION, s as StarsDevConfig, t as defineConfig, tt as LEGACY_COMPATIBILITY_VERSION, u as StarsExperimentalConfig, v as StarsTypechecker, w as StarsHooksConfig, x as StarsHookName, y as StarsViteConfig, z as ResolvedNitroConfig } from "./config-Ctpk84fx.js";
1
+ import { $ as EOL_COMPATIBILITY_VERSIONS, A as BuilderLogLevel, B as ResolvedStarsConfig, C as StarsHooks, D as Builder, E as BuildOutcome, F as ResolvedDevConfig, G as resolveStarsConfig, H as ResolvedTypecheckConfig, I as ResolvedExperimentalConfig, J as resolveHooks, K as ResolvedHooksConfig, L as ResolvedI18nCodegenConfig, M as ResolveConfigOptions, N as ResolvedBuildConfig, O as BuilderContext, P as ResolvedCodegenConfig, Q as DEFAULT_COMPATIBILITY_VERSION, R as ResolvedImportsConfig, S as StarsHookNamespace, T as StarsRestartReason, U as displayPath, V as ResolvedTunnelConfig, W as readProjectEnvFiles, X as resolveEnv, Y as ResolvedEnvConfig, Z as AUTO_ENV_VERSION, _ as StarsTypecheckConfig, a as StarsCompatibilityVersion, at as EMPTY_MODULES_RUNTIME, b as PrepareProjectResult, c as StarsEnvConfig, ct as ResolvedModuleEntry, d as StarsFutureConfig, et as LATEST_COMPATIBILITY_VERSION, f as StarsI18nCodegenConfig, g as StarsTunnelConfig, h as StarsTsdownConfig, i as StarsCodegenConfig, it as Validator, j as PackageJsonLike, k as BuilderEvents, l as StarsEnvSetupOptions, lt as RuntimePluginRegistration, m as StarsNitroConfig, n as StarsBuildConfig, nt as ResolvedFutureConfig, o as StarsConfig, ot as InstalledModule, p as StarsImportsConfig, q as STARS_HOOK_NAMES, r as StarsBuildTool, rt as STARS_CONFIG_TSDOWN_VERSION, s as StarsDevConfig, st as ModulesRuntime, t as defineConfig, tt as LEGACY_COMPATIBILITY_VERSION, u as StarsExperimentalConfig, ut as StarsModuleEntry, v as StarsTypechecker, w as StarsHooksConfig, x as StarsHookName, y as StarsViteConfig, z as ResolvedNitroConfig } from "./config-BFRzY_rK.js";
2
2
  //#region src/config/load.d.ts
3
3
  export declare const CONFIG_EXTENSIONS: readonly ['ts', 'mts', 'cts', 'js', 'mjs', 'cjs'];
4
4
  export declare const CONFIG_FILE_NAMES: string[];
@@ -290,6 +290,10 @@ export declare const configDiagnostics: import("nostics").Diagnostics<{
290
290
  }, readonly [], never>;
291
291
  type ConfigDiagnosticCode = keyof typeof configDiagnostics;
292
292
  //#endregion
293
+ //#region src/config/modules.d.ts
294
+ /** Normalises `modules`: falsy entries are dropped, a bare specifier gets empty options. */
295
+ export declare function resolveModules(config: unknown, validator: Validator): readonly ResolvedModuleEntry[];
296
+ //#endregion
293
297
  //#region src/config/index.d.ts
294
298
  export interface LoadStarsConfigOptions {
295
299
  /**
@@ -312,5 +316,5 @@ export interface LoadStarsConfigOptions {
312
316
  */
313
317
  export declare function loadStarsConfig(options?: LoadStarsConfigOptions): Promise<ResolvedStarsConfig>;
314
318
  //#endregion
315
- export { AUTO_ENV_VERSION, type BuildOutcome, type Builder, type BuilderContext, type BuilderEvents, type BuilderLogLevel, type ConfigDiagnosticCode, DEFAULT_COMPATIBILITY_VERSION, EOL_COMPATIBILITY_VERSIONS, LATEST_COMPATIBILITY_VERSION, LEGACY_COMPATIBILITY_VERSION, type LoadConfigFileOptions, type LoadedConfigFile, type PackageJsonLike, type PrepareProjectResult, type ResolveConfigOptions, type ResolvedBuildConfig, type ResolvedCodegenConfig, type ResolvedDevConfig, type ResolvedEnvConfig, type ResolvedExperimentalConfig, type ResolvedFutureConfig, type ResolvedHooksConfig, type ResolvedI18nCodegenConfig, type ResolvedImportsConfig, type ResolvedNitroConfig, type ResolvedStarsConfig, type ResolvedTunnelConfig, type ResolvedTypecheckConfig, STARS_CONFIG_TSDOWN_VERSION, STARS_HOOK_NAMES, type StarsBuildConfig, type StarsBuildTool, type StarsCodegenConfig, type StarsCompatibilityVersion, type StarsConfig, type StarsDevConfig, type StarsEnvConfig, type StarsEnvSetupOptions, type StarsExperimentalConfig, type StarsFutureConfig, type StarsHookName, type StarsHookNamespace, type StarsHooks, type StarsHooksConfig, type StarsI18nCodegenConfig, type StarsImportsConfig, type StarsNitroConfig, type StarsRestartReason, type StarsTsdownConfig, type StarsTunnelConfig, type StarsTypecheckConfig, type StarsTypechecker, type StarsViteConfig, defineConfig, displayPath, readProjectEnvFiles, resolveEnv, resolveHooks, resolveStarsConfig };
319
+ export { AUTO_ENV_VERSION, type BuildOutcome, type Builder, type BuilderContext, type BuilderEvents, type BuilderLogLevel, type ConfigDiagnosticCode, DEFAULT_COMPATIBILITY_VERSION, EMPTY_MODULES_RUNTIME, EOL_COMPATIBILITY_VERSIONS, type InstalledModule, LATEST_COMPATIBILITY_VERSION, LEGACY_COMPATIBILITY_VERSION, type LoadConfigFileOptions, type LoadedConfigFile, type ModulesRuntime, type PackageJsonLike, type PrepareProjectResult, type ResolveConfigOptions, type ResolvedBuildConfig, type ResolvedCodegenConfig, type ResolvedDevConfig, type ResolvedEnvConfig, type ResolvedExperimentalConfig, type ResolvedFutureConfig, type ResolvedHooksConfig, type ResolvedI18nCodegenConfig, type ResolvedImportsConfig, type ResolvedModuleEntry, type ResolvedNitroConfig, type ResolvedStarsConfig, type ResolvedTunnelConfig, type ResolvedTypecheckConfig, type RuntimePluginRegistration, STARS_CONFIG_TSDOWN_VERSION, STARS_HOOK_NAMES, type StarsBuildConfig, type StarsBuildTool, type StarsCodegenConfig, type StarsCompatibilityVersion, type StarsConfig, type StarsDevConfig, type StarsEnvConfig, type StarsEnvSetupOptions, type StarsExperimentalConfig, type StarsFutureConfig, type StarsHookName, type StarsHookNamespace, type StarsHooks, type StarsHooksConfig, type StarsI18nCodegenConfig, type StarsImportsConfig, type StarsModuleEntry, type StarsNitroConfig, type StarsRestartReason, type StarsTsdownConfig, type StarsTunnelConfig, type StarsTypecheckConfig, type StarsTypechecker, type StarsViteConfig, defineConfig, displayPath, readProjectEnvFiles, resolveEnv, resolveHooks, resolveStarsConfig };
316
320
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/config/load.ts","../../src/config/errors.ts","../../src/config/index.ts"],"mappings":";;qBAKa;qBACA;UAEI;;EAEhB;;EAEA;;UAGgB;;EAEhB;EACA,QAAQ;;;;;wBAMO,mBAAmB;;;;;wBAab,eAAe,SAAS,wBAAwB,QAAQ;;;;;;;;;;;;;;;;;;;qBCnBjE,qCAAiB;;IAK3B,MAAG;MAAQ;;IACX,MAAG;MAAS;;;;IAGZ,MAAG;MAAQ;MAAc;;IACzB,MAAG;MAAS;MAAc;;;;IAG1B,MAAG;MAAQ;;IACX,MAAG;MAAS;;;;IAGZ,MAAG;MAAQ;MAAc;;IACzB,MAAG;MAAQ;MAAc;;;;IAGzB,MAAG;MAAQ;;IACX,MAAG;MAAS;;;;IAGZ,MAAG;MAAQ;MAAc;;IACzB,MAAG;MAAQ;MAAc;;;;IAGzB,MAAG;MAAQ;;IACX,MAAG;MAAS;;;;IAGZ,MAAG;MAAQ;MAAkB;;IAC7B,MAAG;MAAQ;MAAkB;;;;IAG7B,MAAG;MAAQ;MAAc;;IACzB,MAAG;MAAQ;MAAc;;;;IAGzB,MAAG;MAAS;;IACZ,MAAG;MAAQ;;;;IAGX,MAAG;MAAS;;IACZ,MAAG;MAAQ;;;;IAIX,MAAG;MAAQ;MAAc;MAAiB;;IAC1C,MAAG;MAAQ;MAAc;MAAiB;;;;IAI1C,MAAG;MAAQ;MAAc;MAAkB;MAAgB;;IAE3D,MAAG;MAAQ;MAAc;MAAkB;MAAgB;;;;IAG3D,MAAG;MAAQ;MAAgB;MAAmB;;IAC9C,MAAG;MAAQ;MAAgB;MAAmB;;;;IAI9C,MAAG;MAAQ;MAAiB;;IAE5B,MAAG;MAAQ;MAAiB;;;;IAI5B,MAAG;MAAQ;MAAc;MAAgB;;IACzC,MAAG;MAAQ;MAAc;MAAgB;;;;IAGzC,MAAG;MAAQ;MAAc;;IACzB,MAAG;MAAQ;MAAc;;;;IAGzB,MAAG;MAAQ;MAAc;MAAkB;;IAC3C,MAAG;MAAQ;MAAc;MAAkB;;;;IAG3C,MAAG;IACH,MAAG;;;IAGH,MAAG;IACH,MAAG;;;IAGH,MAAG;MAAQ;;IACX,MAAG;MAAS;;;;IAGZ,MAAG;MAAQ;MAAa;;IACxB,MAAG;MAAQ;MAAa;;;;IAGxB,MAAG;MAAQ;;IACX,MAAG;MAAS;;;;IAGZ,MAAG;MAAQ;;IACX,MAAG;MAAS;;;;IAGZ,MAAG;MAAQ;MAAc;MAAa;;IACtC,MAAG;MAAQ;MAAc;MAAa;;;;IAGtC,MAAG;MAAQ;;IACX,MAAG;MAAS;;;;IAGZ,MAAG;IACH,MAAG;;;KAKM,oCAAoC;;;iBCxI/B;;;;;EAKhB;;EAEA;;;;;EAKA,MAAM,OAAO;;;;;;;wBAQQ,gBAAgB,UAAS,yBAA8B,QAAQ"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/config/load.ts","../../src/config/errors.ts","../../src/config/modules.ts","../../src/config/index.ts"],"mappings":";;qBAKa;qBACA;UAEI;;EAEhB;;EAEA;;UAGgB;;EAEhB;EACA,QAAQ;;;;;wBAMO,mBAAmB;;;;;wBAab,eAAe,SAAS,wBAAwB,QAAQ;;;;;;;;;;;;;;;;;;;qBCnBjE,qCAAiB;;IAK3B,MAAG;MAAQ;;IACX,MAAG;MAAS;;;;IAGZ,MAAG;MAAQ;MAAc;;IACzB,MAAG;MAAS;MAAc;;;;IAG1B,MAAG;MAAQ;;IACX,MAAG;MAAS;;;;IAGZ,MAAG;MAAQ;MAAc;;IACzB,MAAG;MAAQ;MAAc;;;;IAGzB,MAAG;MAAQ;;IACX,MAAG;MAAS;;;;IAGZ,MAAG;MAAQ;MAAc;;IACzB,MAAG;MAAQ;MAAc;;;;IAGzB,MAAG;MAAQ;;IACX,MAAG;MAAS;;;;IAGZ,MAAG;MAAQ;MAAkB;;IAC7B,MAAG;MAAQ;MAAkB;;;;IAG7B,MAAG;MAAQ;MAAc;;IACzB,MAAG;MAAQ;MAAc;;;;IAGzB,MAAG;MAAS;;IACZ,MAAG;MAAQ;;;;IAGX,MAAG;MAAS;;IACZ,MAAG;MAAQ;;;;IAIX,MAAG;MAAQ;MAAc;MAAiB;;IAC1C,MAAG;MAAQ;MAAc;MAAiB;;;;IAI1C,MAAG;MAAQ;MAAc;MAAkB;MAAgB;;IAE3D,MAAG;MAAQ;MAAc;MAAkB;MAAgB;;;;IAG3D,MAAG;MAAQ;MAAgB;MAAmB;;IAC9C,MAAG;MAAQ;MAAgB;MAAmB;;;;IAI9C,MAAG;MAAQ;MAAiB;;IAE5B,MAAG;MAAQ;MAAiB;;;;IAI5B,MAAG;MAAQ;MAAc;MAAgB;;IACzC,MAAG;MAAQ;MAAc;MAAgB;;;;IAGzC,MAAG;MAAQ;MAAc;;IACzB,MAAG;MAAQ;MAAc;;;;IAGzB,MAAG;MAAQ;MAAc;MAAkB;;IAC3C,MAAG;MAAQ;MAAc;MAAkB;;;;IAG3C,MAAG;IACH,MAAG;;;IAGH,MAAG;IACH,MAAG;;;IAGH,MAAG;MAAQ;;IACX,MAAG;MAAS;;;;IAGZ,MAAG;MAAQ;MAAa;;IACxB,MAAG;MAAQ;MAAa;;;;IAGxB,MAAG;MAAQ;;IACX,MAAG;MAAS;;;;IAGZ,MAAG;MAAQ;;IACX,MAAG;MAAS;;;;IAGZ,MAAG;MAAQ;MAAc;MAAa;;IACtC,MAAG;MAAQ;MAAc;MAAa;;;;IAGtC,MAAG;MAAQ;;IACX,MAAG;MAAS;;;;IAGZ,MAAG;IACH,MAAG;;;KAKM,oCAAoC;;;;wBCpIhC,eAAe,iBAAiB,WAAW,qBAAqB;;;iBCJ/D;;;;;EAKhB;;EAEA;;;;;EAKA,MAAM,OAAO;;;;;;;wBAQQ,gBAAgB,UAAS,yBAA8B,QAAQ"}
package/dist/esm/index.js CHANGED
@@ -220,6 +220,14 @@ function isFile$1(path) {
220
220
  }
221
221
  }
222
222
 
223
+ //#endregion
224
+ //#region src/types/modules.ts
225
+ const EMPTY_MODULES_RUNTIME = Object.freeze({
226
+ modules: [],
227
+ plugins: [],
228
+ imports: []
229
+ });
230
+
223
231
  //#endregion
224
232
  //#region src/config/compatibility.ts
225
233
  const LEGACY_COMPATIBILITY_VERSION = 3;
@@ -364,6 +372,38 @@ function resolveHooks(config, validator) {
364
372
  return resolved;
365
373
  }
366
374
 
375
+ //#endregion
376
+ //#region src/config/modules.ts
377
+ const FIX = "Use a package name, or `[name, options]` to pass options: `modules: ['@wolfstar/plugin-cache', ['@wolfstar/plugin-gateway', { shards: 2 }]]`.";
378
+ /** Normalises `modules`: falsy entries are dropped, a bare specifier gets empty options. */
379
+ function resolveModules(config, validator) {
380
+ if (config === void 0) return [];
381
+ if (!Array.isArray(config)) throw validator.typeError("modules", "an array", config, FIX);
382
+ const resolved = [];
383
+ for (const [index, entry] of config.entries()) {
384
+ if (!entry) continue;
385
+ const path = `modules[${index}]`;
386
+ if (typeof entry === "string") {
387
+ if (entry.length === 0) throw validator.typeError(path, "a non-empty module specifier", entry, FIX);
388
+ resolved.push({
389
+ specifier: entry,
390
+ options: {}
391
+ });
392
+ continue;
393
+ }
394
+ if (!Array.isArray(entry)) throw validator.typeError(path, "a module specifier or a `[specifier, options]` tuple", entry, FIX);
395
+ if (entry.length > 2) throw validator.typeError(path, "a `[specifier, options]` tuple with at most two members", entry, FIX);
396
+ const [specifier, options] = entry;
397
+ if (typeof specifier !== "string" || specifier.length === 0) throw validator.typeError(`${path}[0]`, "a non-empty module specifier", specifier, FIX);
398
+ if (options !== void 0 && (options === null || typeof options !== "object" || Array.isArray(options))) throw validator.typeError(`${path}[1]`, "an object", options, FIX);
399
+ resolved.push({
400
+ specifier,
401
+ options: options ?? {}
402
+ });
403
+ }
404
+ return resolved;
405
+ }
406
+
367
407
  //#endregion
368
408
  //#region src/config/validator.ts
369
409
  /** Validates raw `stars.config` values, throwing a `configDiagnostics` diagnostic grounded in the configuration file. */
@@ -517,6 +557,7 @@ function resolveStarsConfig(options) {
517
557
  "imports",
518
558
  "env",
519
559
  "hooks",
560
+ "modules",
520
561
  "experimental",
521
562
  "future",
522
563
  "vite",
@@ -533,6 +574,7 @@ function resolveStarsConfig(options) {
533
574
  const tsdown = validator.plainObject(config.tsdown, "tsdown") ?? {};
534
575
  const build = resolveBuild(root, entry, packageJson, config.build ?? {}, experimental, future, Object.keys(tsdown).length > 0, validator);
535
576
  const hooks = resolveHooks(config.hooks, validator);
577
+ const modules = resolveModules(config.modules, validator);
536
578
  const envConfig = resolveEnv(config.env, packageJson, future, experimental, validator);
537
579
  const dev = resolveDev(root, entry, packageJson, config.dev ?? {}, env, envConfig.options, options.projectEnv, validator);
538
580
  const codegen = resolveCodegen(root, config.codegen ?? {}, validator);
@@ -551,6 +593,8 @@ function resolveStarsConfig(options) {
551
593
  imports,
552
594
  env: envConfig,
553
595
  hooks,
596
+ modules,
597
+ runtime: EMPTY_MODULES_RUNTIME,
554
598
  experimental,
555
599
  future,
556
600
  vite,
@@ -1009,5 +1053,5 @@ async function loadStarsConfig(options = {}) {
1009
1053
  }
1010
1054
 
1011
1055
  //#endregion
1012
- export { AUTO_ENV_VERSION, CONFIG_EXTENSIONS, CONFIG_FILE_NAMES, DEFAULT_COMPATIBILITY_VERSION, EOL_COMPATIBILITY_VERSIONS, LATEST_COMPATIBILITY_VERSION, LEGACY_COMPATIBILITY_VERSION, STARS_CONFIG_TSDOWN_VERSION, STARS_HOOK_NAMES, configDiagnostics, defineConfig, discoverConfigFile, displayPath, loadConfigFile, loadStarsConfig, readProjectEnvFiles, resolveEnv, resolveHooks, resolveStarsConfig };
1056
+ export { AUTO_ENV_VERSION, CONFIG_EXTENSIONS, CONFIG_FILE_NAMES, DEFAULT_COMPATIBILITY_VERSION, EMPTY_MODULES_RUNTIME, EOL_COMPATIBILITY_VERSIONS, LATEST_COMPATIBILITY_VERSION, LEGACY_COMPATIBILITY_VERSION, STARS_CONFIG_TSDOWN_VERSION, STARS_HOOK_NAMES, configDiagnostics, defineConfig, discoverConfigFile, displayPath, loadConfigFile, loadStarsConfig, readProjectEnvFiles, resolveEnv, resolveHooks, resolveModules, resolveStarsConfig };
1013
1057
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["isFile"],"sources":["../../src/config/errors.ts","../../src/config/load.ts","../../src/config/compatibility.ts","../../src/config/env.ts","../../src/config/hooks.ts","../../src/config/validator.ts","../../src/config/resolve.ts","../../src/config/index.ts"],"sourcesContent":["import { defineDiagnostics } from 'nostics';\n\n/**\n * Structured, stable diagnostic codes for every way a `stars.config.*` can fail to load or validate.\n *\n * This is a plain data error (no exit code or terminal formatting), so nothing here reports anywhere on its own —\n * `reporters` stays empty and each call only builds and returns a `Diagnostic`. That keeps it meaningful outside a\n * CLI, e.g. for a dashboard or test that calls {@link loadStarsConfig} directly; `@wolfstar/cli` is what renders it\n * and picks an exit code (`exitCodeOf`).\n *\n * The `sources` field (populated with the configuration file, when there is one) carries the \"which file\" grounding\n * `ConfigError` used to expose as `.file`; the \"which option\" grounding it exposed as `.path` is folded directly into\n * every `why`/`fix` message instead, the way every other diagnostic code already reads.\n *\n * `why` and `fix` are always given the same, fully-typed params object (even when one of them ignores part of it):\n * a bare `() => value` loses nostics' param-type inference (a zero-arg function widens to `unknown` params), so every\n * entry here spells out its shape on both sides instead.\n */\nexport const configDiagnostics = defineDiagnostics({\n\tdocsBase: (code) => `https://stars-components.js.org/docs/config/errors#${code.toLowerCase()}`,\n\treporters: [],\n\tcodes: {\n\t\tROOT_NOT_FOUND: {\n\t\t\twhy: (p: { root: string }) => `The project root does not exist: ${p.root}`,\n\t\t\tfix: (_p: { root: string }) => 'Point `root` to an existing directory, relative to the configuration file.'\n\t\t},\n\t\tPACKAGE_JSON_INVALID: {\n\t\t\twhy: (p: { file: string; message: string }) => `Failed to parse ${p.file}: ${p.message}`,\n\t\t\tfix: (_p: { file: string; message: string }) => 'Fix the JSON syntax of the package.json file.'\n\t\t},\n\t\tENTRY_NOT_FOUND: {\n\t\t\twhy: (p: { entry: string }) => `The entry file does not exist: ${p.entry}`,\n\t\t\tfix: (_p: { entry: string }) => 'Point `entry` to the file that starts the bot, relative to the project root.'\n\t\t},\n\t\tENTRY_DEFAULT_NOT_FOUND: {\n\t\t\twhy: (p: { root: string; defaults: string }) => `Could not find the entry file in ${p.root}`,\n\t\t\tfix: (p: { root: string; defaults: string }) => `Set \\`entry\\` in the configuration, or create one of ${p.defaults}.`\n\t\t},\n\t\tINVALID_BUILD_TOOL: {\n\t\t\twhy: (p: { tool: string }) => `Unknown build tool \"${p.tool}\"`,\n\t\t\tfix: (_p: { tool: string }) => \"Use one of 'tsdown', 'tsc', 'vite', 'none' or 'auto'.\"\n\t\t},\n\t\tEXPERIMENTAL_BUILD_TOOL: {\n\t\t\twhy: (p: { tool: string; flag: string }) => `The '${p.tool}' build tool is experimental`,\n\t\t\tfix: (p: { tool: string; flag: string }) => `Set \\`${p.flag}\\` to true to use it.`\n\t\t},\n\t\tBUILD_TOOL_REQUIRED: {\n\t\t\twhy: (p: { entry: string }) => `The entry ${p.entry} is TypeScript but the build tool is 'none'`,\n\t\t\tfix: (_p: { entry: string }) => \"Set `build.tool` to 'tsdown' or 'tsc', or point `entry` to a JavaScript file.\"\n\t\t},\n\t\tTSCONFIG_EXPLICIT_NOT_FOUND: {\n\t\t\twhy: (p: { tsconfig: string; path: string }) => `The tsconfig file does not exist: ${p.tsconfig}`,\n\t\t\tfix: (p: { tsconfig: string; path: string }) => `Point \\`${p.path}\\` to an existing tsconfig.json, relative to the project root.`\n\t\t},\n\t\tTSCONFIG_NOT_FOUND: {\n\t\t\twhy: (p: { root: string; suggestion: string }) => `Could not find a tsconfig.json in ${p.root}`,\n\t\t\tfix: (p: { root: string; suggestion: string }) => `Create src/tsconfig.json or tsconfig.json, or set \\`${p.suggestion}\\`.`\n\t\t},\n\t\tTSDOWN_OPTIONS_REQUIRE_TSDOWN: {\n\t\t\twhy: (_p: { tool: string }) => '`tsdown` options need the `tsdown` build tool',\n\t\t\tfix: (p: { tool: string }) => `Set \\`build.tool\\` to 'tsdown', or remove \\`tsdown\\` (the build tool is '${p.tool}').`\n\t\t},\n\t\tVITE_OPTIONS_REQUIRE_VITE: {\n\t\t\twhy: (_p: { tool: string }) => '`vite` options need the `vite` build tool',\n\t\t\tfix: (p: { tool: string }) =>\n\t\t\t\t`Set \\`build.tool\\` to 'vite' with \\`experimental.enableVite\\`, or remove \\`vite\\` (the build tool is '${p.tool}').`\n\t\t},\n\t\tTSDOWN_CONFIG_FILE_UNSUPPORTED: {\n\t\t\twhy: (p: { file: string; version: number; legacyVersion: number }) => `\\`${p.file}\\` is not used with compatibility version ${p.version}`,\n\t\t\tfix: (p: { file: string; version: number; legacyVersion: number }) =>\n\t\t\t\t`Move its options into \\`tsdown\\` here and drop ${p.file}. \\`future.compatibilityVersion\\` ${p.legacyVersion} still loads it, but is end-of-life.`\n\t\t},\n\t\tINVALID_TYPE: {\n\t\t\twhy: (p: { path: string; expected: string; value: unknown; fix: string }) =>\n\t\t\t\t`\\`${p.path}\\` must be ${p.expected}, received ${describeValue(p.value)}`,\n\t\t\tfix: (p: { path: string; expected: string; value: unknown; fix: string }) => p.fix\n\t\t},\n\t\tINVALID_COMPATIBILITY_VERSION: {\n\t\t\twhy: (p: { value: unknown; supported: string; latestVersion: number }) => `Unknown compatibility version ${describeValue(p.value)}`,\n\t\t\tfix: (p: { value: unknown; supported: string; latestVersion: number }) =>\n\t\t\t\t`Use one of ${p.supported}; ${p.latestVersion} carries today's defaults.`\n\t\t},\n\t\tCOMPATIBILITY_VERSION_EOL: {\n\t\t\twhy: (p: { version: number; latestVersion: number }) =>\n\t\t\t\t`Compatibility version ${p.version} is end-of-life and will be removed in the next major`,\n\t\t\tfix: (p: { version: number; latestVersion: number }) =>\n\t\t\t\t`Move the options of your tsdown.config.* into \\`tsdown\\` in stars.config, delete that file, then set \\`future.compatibilityVersion\\` to ${p.latestVersion} (or remove it).`\n\t\t},\n\t\tUNKNOWN_OPTION: {\n\t\t\twhy: (p: { path: string; parent: string; known: string }) => `Unknown option \\`${p.path}\\``,\n\t\t\tfix: (p: { path: string; parent: string; known: string }) => `Known options${p.parent ? ` of \\`${p.parent}\\`` : ''}: ${p.known}.`\n\t\t},\n\t\tUNKNOWN_HOOK: {\n\t\t\twhy: (p: { name: string; known: string }) => `Unknown hook \\`${p.name}\\``,\n\t\t\tfix: (p: { name: string; known: string }) => `Known hooks: ${p.known}.`\n\t\t},\n\t\tEXPERIMENT_REQUIRED: {\n\t\t\twhy: (p: { path: string; requires: string; drop: string }) => `\\`${p.path}\\` needs \\`${p.requires}\\``,\n\t\t\tfix: (p: { path: string; requires: string; drop: string }) => `Set \\`${p.requires}\\` to true as well, or drop \\`${p.drop}\\`.`\n\t\t},\n\t\tIMPORTS_REQUIRE_TSDOWN: {\n\t\t\twhy: (_p: {}) => '`imports` requires the `tsdown` build tool',\n\t\t\tfix: (_p: {}) => \"Set `build.tool` to 'tsdown', or remove `imports`/set it to `false`.\"\n\t\t},\n\t\tENV_REQUIRES_ENV_UTILITIES: {\n\t\t\twhy: (_p: {}) => '`env` is enabled, but the project does not depend on `@wolfstar/env-utilities`',\n\t\t\tfix: (_p: {}) => 'Install it with `pnpm add @wolfstar/env-utilities`, or set `env` to `false`.'\n\t\t},\n\t\tLOCALES_NOT_FOUND: {\n\t\t\twhy: (p: { locales: string }) => `The locales directory does not exist: ${p.locales}`,\n\t\t\tfix: (_p: { locales: string }) => 'Point `codegen.i18n.locales` to the base locale directory, relative to the project root.'\n\t\t},\n\t\tINVALID_URL: {\n\t\t\twhy: (p: { url: string; fix: string }) => `Invalid URL \"${p.url}\"`,\n\t\t\tfix: (p: { url: string; fix: string }) => p.fix\n\t\t},\n\t\tTUNNEL_URL_NOT_HTTPS: {\n\t\t\twhy: (p: { url: string }) => `The tunnel URL must be https, received \"${p.url}\"`,\n\t\t\tfix: (_p: { url: string }) => 'Discord only accepts an https interactions endpoint.'\n\t\t},\n\t\tINVALID_TYPECHECKER: {\n\t\t\twhy: (p: { checker: string }) => `Unknown type checker \"${p.checker}\"`,\n\t\t\tfix: (_p: { checker: string }) => \"Use one of 'tsc', 'golar', 'tsz' or 'auto'.\"\n\t\t},\n\t\tCONFIG_NOT_FOUND: {\n\t\t\twhy: (p: { file: string; cwd: string; names: string }) => `Configuration file not found: ${p.file}`,\n\t\t\tfix: (p: { file: string; cwd: string; names: string }) => `Pass an existing file to --config, or create one of ${p.names} in ${p.cwd}.`\n\t\t},\n\t\tCONFIG_LOAD_FAILED: {\n\t\t\twhy: (p: { message: string }) => `Failed to load the configuration: ${p.message}`,\n\t\t\tfix: (_p: { message: string }) => 'The file must be valid TypeScript/JavaScript and export the configuration as its default export.'\n\t\t},\n\t\tCONFIG_NOT_OBJECT: {\n\t\t\twhy: (_p: {}) => 'The configuration file must export an object as its default export.',\n\t\t\tfix: (_p: {}) => \"Use `export default defineConfig({ ... })` from '@wolfstar/http-framework/config'.\"\n\t\t}\n\t}\n});\n\nexport type ConfigDiagnosticCode = keyof typeof configDiagnostics;\n\nfunction describeValue(value: unknown): string {\n\tif (value === null) return 'null';\n\tif (Array.isArray(value)) return 'an array';\n\tif (typeof value === 'string') return `\"${value}\"`;\n\treturn typeof value === 'object' ? 'an object' : `${typeof value} ${String(value)}`;\n}\n","import { existsSync, statSync } from 'node:fs';\nimport { basename, dirname, join, resolve } from 'node:path';\nimport type { StarsConfig } from '../types/config.js';\nimport { configDiagnostics } from './errors.js';\n\nexport const CONFIG_EXTENSIONS = ['ts', 'mts', 'cts', 'js', 'mjs', 'cjs'] as const;\nexport const CONFIG_FILE_NAMES = CONFIG_EXTENSIONS.map((extension) => `stars.config.${extension}`);\n\nexport interface LoadConfigFileOptions {\n\t/** The directory to discover the configuration file from. */\n\tcwd: string;\n\t/** An explicit configuration file (`--config`), resolved from `cwd`. */\n\tconfigFile?: string | null;\n}\n\nexport interface LoadedConfigFile {\n\t/** The absolute path of the loaded file, `null` when running on defaults. */\n\tconfigFile: string | null;\n\tconfig: StarsConfig;\n}\n\n/**\n * Finds the first `stars.config.*` file in `cwd`, in {@link CONFIG_FILE_NAMES} order.\n */\nexport function discoverConfigFile(cwd: string): string | null {\n\tfor (const name of CONFIG_FILE_NAMES) {\n\t\tconst candidate = join(cwd, name);\n\t\tif (isFile(candidate)) return candidate;\n\t}\n\n\treturn null;\n}\n\n/**\n * Loads the raw configuration object. The loader (`c12`) is imported lazily so\n * commands that never touch the configuration stay fast.\n */\nexport async function loadConfigFile(options: LoadConfigFileOptions): Promise<LoadedConfigFile> {\n\tconst cwd = resolve(options.cwd);\n\tlet file: string | null;\n\n\tif (options.configFile) {\n\t\tfile = resolve(cwd, options.configFile);\n\t\tif (!isFile(file)) {\n\t\t\tthrow configDiagnostics.CONFIG_NOT_FOUND({ file, cwd, names: CONFIG_FILE_NAMES.join(', ') });\n\t\t}\n\t} else {\n\t\tfile = discoverConfigFile(cwd);\n\t\tif (!file) return { configFile: null, config: {} };\n\t}\n\n\tconst { loadConfig } = await import('c12');\n\n\tlet loaded: unknown;\n\ttry {\n\t\tconst result = await loadConfig<StarsConfig>({\n\t\t\tname: 'stars',\n\t\t\tcwd: dirname(file),\n\t\t\tconfigFile: basename(file),\n\t\t\trcFile: false,\n\t\t\tglobalRc: false,\n\t\t\tdotenv: false,\n\t\t\tpackageJson: false,\n\t\t\tdefaults: {}\n\t\t});\n\t\t// c12 merges every layer with the defaults, which turns non-object exports into `{}`: inspect the raw layer.\n\t\tconst layer = result.layers?.find(\n\t\t\t(candidate) => candidate.configFile && resolve(candidate.cwd ?? dirname(file), candidate.configFile) === file\n\t\t);\n\t\tloaded = layer ? layer.config : result.config;\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthrow configDiagnostics.CONFIG_LOAD_FAILED({ message, cause: error, sources: [file] });\n\t}\n\n\tif (loaded === null || typeof loaded !== 'object' || Array.isArray(loaded)) {\n\t\tthrow configDiagnostics.CONFIG_NOT_OBJECT({ sources: [file] });\n\t}\n\n\treturn { configFile: file, config: loaded as StarsConfig };\n}\n\nfunction isFile(path: string): boolean {\n\ttry {\n\t\treturn existsSync(path) && statSync(path).isFile();\n\t} catch {\n\t\treturn false;\n\t}\n}\n","import type { Diagnostic } from 'nostics';\nimport type { StarsCompatibilityVersion, StarsFutureConfig } from '../types/config.js';\nimport { configDiagnostics } from './errors.js';\nimport type { Validator } from './validator.js';\n\nexport interface ResolvedFutureConfig {\n\treadonly compatibilityVersion: StarsCompatibilityVersion;\n}\n\nexport const LEGACY_COMPATIBILITY_VERSION = 3;\nexport const LATEST_COMPATIBILITY_VERSION = 5;\n/** The version a project without `future.compatibilityVersion` runs on: today, the latest one. */\nexport const DEFAULT_COMPATIBILITY_VERSION = 5;\n/** Versions still accepted but scheduled for removal in the next major. */\nexport const EOL_COMPATIBILITY_VERSIONS: ReadonlySet<number> = new Set([LEGACY_COMPATIBILITY_VERSION]);\n/** From this version on, `tsdown` is configured from `stars.config` alone and auto imports are on by default. */\nexport const STARS_CONFIG_TSDOWN_VERSION = 4;\n/** From this version on, `env` is registered automatically in the built entry. */\nexport const AUTO_ENV_VERSION = 5;\n\nconst COMPATIBILITY_VERSIONS = new Set<number>([LEGACY_COMPATIBILITY_VERSION, STARS_CONFIG_TSDOWN_VERSION, AUTO_ENV_VERSION]);\n\n/**\n * Resolves the Nuxt-style compatibility block. Version 5 is the default and version 4 remains supported. Version 3 is\n * end-of-life: it still resolves, with a warning pushed to `warnings`, and is removed in the next major.\n *\n * New behaviour is gated by a named version constant (such as {@link AUTO_ENV_VERSION}), never by\n * {@link LATEST_COMPATIBILITY_VERSION}: bumping the latest version must not move older versions onto other defaults.\n */\nexport function resolveFuture(config: StarsFutureConfig, validator: Validator, warnings: Diagnostic[]): ResolvedFutureConfig {\n\tif (config === null || typeof config !== 'object' || Array.isArray(config)) {\n\t\tthrow validator.typeError('future', 'an object', config, 'Use `{ compatibilityVersion }`.');\n\t}\n\n\tvalidator.knownKeys(config, 'future', ['compatibilityVersion']);\n\tconst version = config.compatibilityVersion;\n\tif (version === undefined) return { compatibilityVersion: DEFAULT_COMPATIBILITY_VERSION };\n\n\tif (typeof version !== 'number' || !COMPATIBILITY_VERSIONS.has(version)) {\n\t\tthrow validator.error(configDiagnostics.INVALID_COMPATIBILITY_VERSION, {\n\t\t\tvalue: version,\n\t\t\tsupported: [...COMPATIBILITY_VERSIONS].join(', '),\n\t\t\tlatestVersion: LATEST_COMPATIBILITY_VERSION\n\t\t});\n\t}\n\n\tif (EOL_COMPATIBILITY_VERSIONS.has(version)) {\n\t\twarnings.push(validator.error(configDiagnostics.COMPATIBILITY_VERSION_EOL, { version, latestVersion: LATEST_COMPATIBILITY_VERSION }));\n\t}\n\n\treturn { compatibilityVersion: version as StarsCompatibilityVersion };\n}\n","import type { StarsConfig, StarsEnvSetupOptions } from '../types/config.js';\nimport { AUTO_ENV_VERSION, type ResolvedFutureConfig } from './compatibility.js';\nimport { configDiagnostics } from './errors.js';\nimport { hasDependency, type PackageJsonLike, type ResolvedExperimentalConfig } from './resolve.js';\nimport type { Validator } from './validator.js';\n\nexport interface ResolvedEnvConfig {\n\t/** Whether the built entry registers the environment before any other module. */\n\treadonly enabled: boolean;\n\t/** The options handed to `setup()` from `@wolfstar/env-utilities`, as written by the user. */\n\treadonly options: Readonly<StarsEnvSetupOptions>;\n}\n\nconst ENV_UTILITIES = '@wolfstar/env-utilities';\nconst LOADERS = new Set(['dotenv', 'varlock']);\n\n/**\n * Resolves the `env` block. It is on by default from {@link AUTO_ENV_VERSION} on, but only when the project depends on\n * `@wolfstar/env-utilities` (the module the built entry imports) and does not build through Nitro, whose serverless\n * presets have no `.env` files to load. `true`, `enabled: true` or any option at all is an explicit opt-in, which\n * does require the dependency.\n */\nexport function resolveEnv(\n\tconfig: StarsConfig['env'],\n\tpackageJson: PackageJsonLike | null,\n\tfuture: ResolvedFutureConfig,\n\texperimental: ResolvedExperimentalConfig,\n\tvalidator: Validator\n): ResolvedEnvConfig {\n\tif (config === false) return { enabled: false, options: {} };\n\n\tconst forcedOn = config === true;\n\tconst raw = forcedOn || config === undefined ? {} : config;\n\tif (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {\n\t\tthrow validator.typeError(\n\t\t\t'env',\n\t\t\t'an object, `true` or `false`',\n\t\t\traw,\n\t\t\t'Use `{ path, env, prefix, loader, debug, encoding }`, `true` to enable with defaults, or `false` to disable.'\n\t\t);\n\t}\n\n\tvalidator.knownKeys(raw, 'env', ['enabled', 'path', 'env', 'prefix', 'loader', 'debug', 'encoding']);\n\n\tconst options: StarsEnvSetupOptions = {};\n\tconst path = validator.string(raw.path, 'env.path');\n\tif (path !== undefined) options.path = path;\n\tconst env = validator.string(raw.env, 'env.env');\n\tif (env !== undefined) options.env = env;\n\tconst prefix = validator.string(raw.prefix, 'env.prefix');\n\tif (prefix !== undefined) options.prefix = prefix;\n\tconst loader = validator.string(raw.loader, 'env.loader');\n\tif (loader !== undefined) {\n\t\tif (!LOADERS.has(loader)) throw validator.typeError('env.loader', \"'dotenv' or 'varlock'\", loader, \"Use 'dotenv' (default) or 'varlock'.\");\n\t\toptions.loader = loader as NonNullable<StarsEnvSetupOptions['loader']>;\n\t}\n\tconst debug = validator.boolean(raw.debug, 'env.debug');\n\tif (debug !== undefined) options.debug = debug;\n\tconst encoding = validator.string(raw.encoding, 'env.encoding');\n\tif (encoding !== undefined) options.encoding = encoding;\n\n\tconst enabled = validator.boolean(raw.enabled, 'env.enabled');\n\tif (enabled === false) return { enabled: false, options };\n\n\tconst installed = hasDependency(packageJson, ENV_UTILITIES);\n\tconst explicit = forcedOn || enabled === true || Object.keys(options).length > 0;\n\tif (explicit && !installed) throw validator.error(configDiagnostics.ENV_REQUIRES_ENV_UTILITIES, {});\n\n\tconst enabledByDefault = installed && future.compatibilityVersion >= AUTO_ENV_VERSION && !experimental.enableNitro;\n\treturn { enabled: explicit || enabledByDefault, options };\n}\n","import type { StarsHookName, StarsHooks, StarsHooksConfig } from '../types/hooks.js';\nimport { configDiagnostics } from './errors.js';\nimport type { Validator } from './validator.js';\n\ntype AnyHook = StarsHooks[StarsHookName];\n\n/** Every hook of `stars.config`, flattened to its full name, with its callbacks in declaration order. */\nexport type ResolvedHooksConfig = Readonly<Partial<Record<StarsHookName, readonly AnyHook[]>>>;\n\nexport const STARS_HOOK_NAMES = [\n\t'config:resolved',\n\t'env:options',\n\t'prepare:before',\n\t'prepare:done',\n\t'builder:created',\n\t'tsdown:options',\n\t'build:before',\n\t'build:done',\n\t'dev:start',\n\t'dev:restart',\n\t'dev:close'\n] as const satisfies readonly StarsHookName[];\n\nconst KNOWN = new Set<string>(STARS_HOOK_NAMES);\n\n/**\n * Flattens and validates `hooks`. `hookable`'s own `flatHooks` is not used: it would split an array of callbacks into\n * `name:0`, `name:1` and silently drop anything that is not a function, while a typo in a hook name here should fail\n * loudly rather than register a hook that never runs.\n */\nexport function resolveHooks(config: StarsHooksConfig | undefined, validator: Validator): ResolvedHooksConfig {\n\tif (config === undefined) return {};\n\n\tconst resolved: Partial<Record<StarsHookName, AnyHook[]>> = {};\n\tconst visit = (value: unknown, path: string): void => {\n\t\tif (value === null || typeof value !== 'object' || Array.isArray(value)) {\n\t\t\tthrow validator.typeError(\n\t\t\t\tpath ? `hooks.${path}` : 'hooks',\n\t\t\t\t'an object',\n\t\t\t\tvalue,\n\t\t\t\t\"Use `{ 'build:done'() {} }` or `{ build: { done() {} } }`.\"\n\t\t\t);\n\t\t}\n\n\t\tfor (const [key, entry] of Object.entries(value)) {\n\t\t\tconst name = path ? `${path}:${key}` : key;\n\t\t\tif (entry !== null && typeof entry === 'object' && !Array.isArray(entry)) {\n\t\t\t\tvisit(entry, name);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!KNOWN.has(name)) throw validator.error(configDiagnostics.UNKNOWN_HOOK, { name, known: STARS_HOOK_NAMES.join(', ') });\n\n\t\t\tconst callbacks: unknown[] = Array.isArray(entry) ? entry : [entry];\n\t\t\tfor (const callback of callbacks) {\n\t\t\t\tif (typeof callback !== 'function') {\n\t\t\t\t\tthrow validator.typeError(`hooks.${name}`, 'a function or an array of functions', callback, 'Pass a function.');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t(resolved[name as StarsHookName] ??= []).push(...(callbacks as AnyHook[]));\n\t\t}\n\t};\n\n\tvisit(config, '');\n\treturn resolved;\n}\n","import type { Diagnostic } from 'nostics';\nimport { configDiagnostics } from './errors.js';\n\n/** Validates raw `stars.config` values, throwing a `configDiagnostics` diagnostic grounded in the configuration file. */\nexport class Validator {\n\tpublic constructor(private readonly file: string | null) {}\n\n\tprivate get sources(): string[] | undefined {\n\t\treturn this.file ? [this.file] : undefined;\n\t}\n\n\tpublic error<Handle extends (params: any) => Diagnostic>(handle: Handle, params: Parameters<Handle>[0]): Diagnostic {\n\t\treturn handle({ ...params, sources: this.sources });\n\t}\n\n\tpublic knownKeys(value: object, path: string, keys: readonly string[]): void {\n\t\tfor (const key of Object.keys(value)) {\n\t\t\tif (keys.includes(key)) continue;\n\t\t\tconst fullPath = path ? `${path}.${key}` : key;\n\t\t\tthrow this.error(configDiagnostics.UNKNOWN_OPTION, { path: fullPath, parent: path, known: keys.join(', ') });\n\t\t}\n\t}\n\n\tpublic string(value: unknown, path: string): string | undefined {\n\t\tif (value === undefined) return undefined;\n\t\tif (typeof value !== 'string' || value.length === 0) throw this.typeError(path, 'a non-empty string', value);\n\t\treturn value;\n\t}\n\n\tpublic boolean(value: unknown, path: string): boolean | undefined {\n\t\tif (value === undefined) return undefined;\n\t\tif (typeof value !== 'boolean') throw this.typeError(path, 'a boolean', value);\n\t\treturn value;\n\t}\n\n\t/** A plain object passed through as-is (e.g. raw `vite`/`tsdown` config merged into the project's own). */\n\tpublic plainObject(value: unknown, path: string): Record<string, unknown> | undefined {\n\t\tif (value === undefined) return undefined;\n\t\tif (value === null || typeof value !== 'object' || Array.isArray(value)) throw this.typeError(path, 'an object', value);\n\t\treturn value as Record<string, unknown>;\n\t}\n\n\tpublic stringArray(value: unknown, path: string): string[] | undefined {\n\t\tif (value === undefined) return undefined;\n\t\tif (!Array.isArray(value) || !value.every((item) => typeof item === 'string')) throw this.typeError(path, 'an array of strings', value);\n\t\treturn value;\n\t}\n\n\tpublic nonNegativeNumber(value: unknown, path: string): number | undefined {\n\t\tif (value === undefined) return undefined;\n\t\tif (typeof value !== 'number' || !Number.isFinite(value) || value < 0) throw this.typeError(path, 'a non-negative number', value);\n\t\treturn value;\n\t}\n\n\tpublic stringRecord(value: unknown, path: string): Record<string, string> | undefined {\n\t\tif (value === undefined) return undefined;\n\t\tif (value === null || typeof value !== 'object' || Array.isArray(value) || !Object.values(value).every((item) => typeof item === 'string')) {\n\t\t\tthrow this.typeError(path, 'an object of string values', value);\n\t\t}\n\t\treturn value as Record<string, string>;\n\t}\n\n\t/** A generic \"wrong type\" diagnostic. `fix` defaults to the standard \"set it or remove it\" wording. */\n\tpublic typeError(path: string, expected: string, value: unknown, fix?: string): Diagnostic {\n\t\treturn this.error(configDiagnostics.INVALID_TYPE, {\n\t\t\tpath,\n\t\t\texpected,\n\t\t\tvalue,\n\t\t\tfix: fix ?? `Set \\`${path}\\` to ${expected} or remove it to use the default.`\n\t\t});\n\t}\n}\n","import { existsSync, readFileSync, statSync } from 'node:fs';\nimport { basename, dirname, extname, isAbsolute, join, relative, resolve } from 'node:path';\nimport type { Diagnostic } from 'nostics';\nimport type {\n\tStarsBuildTool,\n\tStarsConfig,\n\tStarsDevConfig,\n\tStarsEnvSetupOptions,\n\tStarsExperimentalConfig,\n\tStarsTypechecker\n} from '../types/config.js';\nimport { LEGACY_COMPATIBILITY_VERSION, STARS_CONFIG_TSDOWN_VERSION, resolveFuture, type ResolvedFutureConfig } from './compatibility.js';\nimport { resolveEnv, type ResolvedEnvConfig } from './env.js';\nimport { configDiagnostics } from './errors.js';\nimport { resolveHooks, type ResolvedHooksConfig } from './hooks.js';\nimport { Validator } from './validator.js';\n\nexport type { ResolvedFutureConfig } from './compatibility.js';\n\nexport interface PackageJsonLike {\n\tname?: string;\n\t/** `tsdown` reads its options from here as well as from a `tsdown.config.*`. */\n\ttsdown?: unknown;\n\tversion?: string;\n\tmain?: string;\n\ttype?: string;\n\tscripts?: Record<string, string>;\n\tdependencies?: Record<string, string>;\n\tdevDependencies?: Record<string, string>;\n}\n\nexport interface ResolvedBuildConfig {\n\treadonly tool: StarsBuildTool;\n\t/** Absolute output directory. */\n\treadonly outDir: string;\n\t/** Absolute `tsconfig.json` used by `tsc`, `null` for the other tools. */\n\treadonly tsconfig: string | null;\n\t/** Absolute path of the file `node` runs, i.e. the built entry (or the entry itself when `tool` is `none`). */\n\treadonly output: string;\n\t/**\n\t * Absolute path of the build tool's own configuration file (`tsdown.config.*`, `vite.config.*`), `null` when the\n\t * tool has none — which is always the case for `tsdown` from `future.compatibilityVersion` 4 on, where the build is\n\t * configured from `stars.config` alone.\n\t */\n\treadonly configFile: string | null;\n}\n\nexport interface ResolvedTypecheckConfig {\n\treadonly enabled: boolean;\n\t/** Absolute `tsconfig.json` the type checker runs against, `null` when it could not be found. */\n\treadonly tsconfig: string | null;\n\t/** The type checker to run, with `'auto'` already resolved. */\n\treadonly checker: StarsTypechecker;\n}\n\nexport type ResolvedTunnelConfig =\n\t| { readonly mode: 'off' }\n\t/** A `cloudflared` quick tunnel, whose hostname is only known once it is up. */\n\t| { readonly mode: 'quick'; readonly path: string; readonly updateEndpoint: boolean }\n\t/** An https URL the user already serves. */\n\t| { readonly mode: 'url'; readonly url: string; readonly path: string; readonly updateEndpoint: boolean };\n\nexport interface ResolvedDevConfig {\n\treadonly banner: readonly string[] | false | null;\n\treadonly watch: readonly string[];\n\treadonly ignore: readonly string[];\n\treadonly debounce: number;\n\treadonly env: Readonly<Record<string, string>>;\n\treadonly nodeArgs: readonly string[];\n\treadonly args: readonly string[];\n\treadonly url: string | null;\n\treadonly health: string | null;\n\treadonly killTimeout: number;\n\treadonly typecheck: ResolvedTypecheckConfig;\n\treadonly tunnel: ResolvedTunnelConfig;\n\t/** Absolute path of the file the dev session's logs are mirrored into, `null` when disabled. */\n\treadonly logFile: string | null;\n}\n\nexport interface ResolvedNitroConfig {\n\treadonly [option: string]: unknown;\n\treadonly preset: string;\n}\n\nexport interface ResolvedExperimentalConfig {\n\treadonly enableVite: boolean;\n\treadonly enableExternalVite: boolean;\n\treadonly enableNitro: boolean;\n\treadonly nitro: ResolvedNitroConfig;\n}\n\nexport interface ResolvedImportsConfig {\n\treadonly enabled: boolean;\n\t/** Directory glob patterns, relative to the project root (the way `unimport` scans them). */\n\treadonly dirs: readonly string[];\n\treadonly presets: readonly string[];\n\treadonly exclude: readonly string[];\n\t/** Absolute path of the generated declaration file. */\n\treadonly dts: string;\n}\n\nexport interface ResolvedI18nCodegenConfig {\n\treadonly locales: string;\n\treadonly output: string;\n}\n\nexport interface ResolvedCodegenConfig {\n\treadonly i18n: ResolvedI18nCodegenConfig | null;\n}\n\nexport interface ResolvedStarsConfig {\n\t/** Absolute path of the configuration file, `null` when running on defaults. */\n\treadonly configFile: string | null;\n\t/** The directory the CLI was invoked from. */\n\treadonly cwd: string;\n\t/** Absolute project root. */\n\treadonly root: string;\n\treadonly packageJson: PackageJsonLike | null;\n\t/** Absolute source entry. */\n\treadonly entry: string;\n\treadonly build: ResolvedBuildConfig;\n\treadonly dev: ResolvedDevConfig;\n\treadonly codegen: ResolvedCodegenConfig;\n\treadonly imports: ResolvedImportsConfig;\n\treadonly env: ResolvedEnvConfig;\n\t/** The `hooks` block, flattened to full hook names (`build:done`). */\n\treadonly hooks: ResolvedHooksConfig;\n\treadonly experimental: ResolvedExperimentalConfig;\n\treadonly future: ResolvedFutureConfig;\n\t/** Raw options merged into `vite.config.*`. */\n\treadonly vite: Readonly<Record<string, unknown>>;\n\t/** The `tsdown` build's options: merged over `tsdown.config.*` at compatibility version 3, the whole build from 4 on. */\n\treadonly tsdown: Readonly<Record<string, unknown>>;\n\t/** Non-fatal diagnostics (e.g. an end-of-life compatibility version), for the host to report. */\n\treadonly warnings: readonly Diagnostic[];\n}\n\nexport interface ResolveConfigOptions {\n\tcwd: string;\n\tconfigFile: string | null;\n\tconfig: StarsConfig;\n\tenv?: NodeJS.ProcessEnv;\n\t/**\n\t * The variables the bot will load, when the host resolved them itself (e.g. through `varlock load`). Used instead\n\t * of the project's env files for the defaults read from them, such as the `dev.url` port.\n\t */\n\tprojectEnv?: Readonly<Record<string, string>>;\n}\n\nexport const DEFAULT_ENTRIES = ['src/main.ts', 'src/main.js', 'src/index.ts', 'src/index.js'] as const;\nexport const DEFAULT_IGNORE = ['**/node_modules/**', '**/dist/**', '**/.git/**'] as const;\nexport const DEFAULT_DEBOUNCE = 150;\nexport const DEFAULT_KILL_TIMEOUT = 5000;\nexport const DEFAULT_NODE_ARGS = ['--enable-source-maps'] as const;\nexport const DEFAULT_DEV_PORT = 3000;\nexport const DEFAULT_I18N_LOCALES = 'src/locales/en-US';\nexport const DEFAULT_I18N_OUTPUT = 'src/@types/i18next.d.ts';\nexport const DEFAULT_IMPORTS_DIRS = ['src/lib/**', 'src/utils/**'] as const;\nexport const DEFAULT_IMPORTS_PRESETS = ['@wolfstar/http-framework', '@wolfstar/decorators', '@wolfstar/env-utilities'] as const;\nexport const DEFAULT_IMPORTS_DTS = '.stars/imports.d.ts';\nexport const DEFAULT_DEV_LOG_FILE = '.stars/dev.log';\nexport const DEFAULT_TUNNEL_PATH = '/';\n\nconst BUILD_TOOLS = new Set<string>(['tsdown', 'tsc', 'none', 'vite', 'auto']);\nconst TYPECHECKERS = new Set<string>(['tsc', 'golar', 'tsz', 'auto']);\nconst VITE_CONFIG_FILES = ['vite.config.ts', 'vite.config.mts', 'vite.config.cts', 'vite.config.js', 'vite.config.mjs', 'vite.config.cjs'];\nconst TSDOWN_CONFIG_FILES = [\n\t'tsdown.config.ts',\n\t'tsdown.config.mts',\n\t'tsdown.config.cts',\n\t'tsdown.config.js',\n\t'tsdown.config.mjs',\n\t'tsdown.config.cjs',\n\t'tsdown.config.json'\n];\nconst TYPESCRIPT_EXTENSIONS = new Set(['.ts', '.mts', '.cts']);\n\n/**\n * Applies defaults, validates every option and resolves all paths to absolute ones.\n *\n * @throws {Diagnostic} (from `nostics`, via {@link configDiagnostics}) with an actionable `fix` on the first invalid option.\n */\nexport function resolveStarsConfig(options: ResolveConfigOptions): ResolvedStarsConfig {\n\tconst cwd = resolve(options.cwd);\n\tconst env = options.env ?? process.env;\n\tconst file = options.configFile;\n\tconst config = options.config;\n\tconst validator = new Validator(file);\n\tconst warnings: Diagnostic[] = [];\n\n\tvalidator.knownKeys(config, '', [\n\t\t'root',\n\t\t'entry',\n\t\t'build',\n\t\t'dev',\n\t\t'codegen',\n\t\t'imports',\n\t\t'env',\n\t\t'hooks',\n\t\t'experimental',\n\t\t'future',\n\t\t'vite',\n\t\t'tsdown'\n\t]);\n\tconst baseDirectory = file ? dirname(file) : cwd;\n\n\tconst root = resolve(baseDirectory, validator.string(config.root, 'root') ?? '.');\n\tif (!isDirectory(root)) {\n\t\tthrow validator.error(configDiagnostics.ROOT_NOT_FOUND, { root });\n\t}\n\n\tconst packageJson = readPackageJson(root, validator);\n\tconst experimental = resolveExperimental(config.experimental ?? {}, validator);\n\tconst future = resolveFuture(config.future ?? {}, validator, warnings);\n\tconst entry = resolveEntry(root, validator.string(config.entry, 'entry'), validator);\n\t// The tool-specific blocks are read before the build so a project that only declares `tsdown: {}` still resolves\n\t// `build.tool: 'auto'` to `tsdown`: configuring a tool is as clear a signal as depending on it.\n\tconst vite = validator.plainObject(config.vite, 'vite') ?? {};\n\tconst tsdown = validator.plainObject(config.tsdown, 'tsdown') ?? {};\n\tconst build = resolveBuild(root, entry, packageJson, config.build ?? {}, experimental, future, Object.keys(tsdown).length > 0, validator);\n\tconst hooks = resolveHooks(config.hooks, validator);\n\tconst envConfig = resolveEnv(config.env, packageJson, future, experimental, validator);\n\tconst dev = resolveDev(root, entry, packageJson, config.dev ?? {}, env, envConfig.options, options.projectEnv, validator);\n\tconst codegen = resolveCodegen(root, config.codegen ?? {}, validator);\n\tconst imports = resolveImports(root, build.tool, future, config.imports, validator);\n\n\tif (Object.keys(tsdown).length > 0 && build.tool !== 'tsdown') {\n\t\tthrow validator.error(configDiagnostics.TSDOWN_OPTIONS_REQUIRE_TSDOWN, { tool: build.tool });\n\t}\n\n\tif (Object.keys(vite).length > 0 && build.tool !== 'vite') {\n\t\tthrow validator.error(configDiagnostics.VITE_OPTIONS_REQUIRE_VITE, { tool: build.tool });\n\t}\n\n\treturn {\n\t\tconfigFile: file,\n\t\tcwd,\n\t\troot,\n\t\tpackageJson,\n\t\tentry,\n\t\tbuild,\n\t\tdev,\n\t\tcodegen,\n\t\timports,\n\t\tenv: envConfig,\n\t\thooks,\n\t\texperimental,\n\t\tfuture,\n\t\tvite,\n\t\ttsdown,\n\t\twarnings\n\t};\n}\n\n/**\n * Presents an absolute path relative to `root` when possible, for display purposes.\n */\nexport function displayPath(root: string, path: string): string {\n\tconst rel = relative(root, path);\n\tif (!rel) return '.';\n\treturn rel.startsWith('..') || isAbsolute(rel) ? path : rel;\n}\n\nfunction resolveEntry(root: string, configured: string | undefined, validator: Validator): string {\n\tif (configured !== undefined) {\n\t\tconst entry = resolve(root, configured);\n\t\tif (!isFile(entry)) {\n\t\t\tthrow validator.error(configDiagnostics.ENTRY_NOT_FOUND, { entry });\n\t\t}\n\t\treturn entry;\n\t}\n\n\tfor (const candidate of DEFAULT_ENTRIES) {\n\t\tconst entry = join(root, candidate);\n\t\tif (isFile(entry)) return entry;\n\t}\n\n\tthrow validator.error(configDiagnostics.ENTRY_DEFAULT_NOT_FOUND, { root, defaults: DEFAULT_ENTRIES.join(', ') });\n}\n\nfunction resolveBuild(\n\troot: string,\n\tentry: string,\n\tpackageJson: PackageJsonLike | null,\n\tconfig: NonNullable<StarsConfig['build']>,\n\texperimental: ResolvedExperimentalConfig,\n\tfuture: ResolvedFutureConfig,\n\thasTsdownOptions: boolean,\n\tvalidator: Validator\n): ResolvedBuildConfig {\n\tvalidator.knownKeys(config, 'build', ['tool', 'outDir', 'tsconfig']);\n\n\tconst requested = validator.string(config.tool, 'build.tool') ?? 'auto';\n\tif (!BUILD_TOOLS.has(requested)) {\n\t\tthrow validator.error(configDiagnostics.INVALID_BUILD_TOOL, { tool: requested });\n\t}\n\n\tif (requested === 'vite' && !experimental.enableVite) {\n\t\tthrow validator.error(configDiagnostics.EXPERIMENTAL_BUILD_TOOL, { tool: 'vite', flag: 'experimental.enableVite' });\n\t}\n\n\tconst isTypeScriptEntry = TYPESCRIPT_EXTENSIONS.has(extname(entry));\n\tconst tool: StarsBuildTool =\n\t\trequested === 'auto'\n\t\t\t? detectBuildTool(root, packageJson, isTypeScriptEntry, experimental, future, hasTsdownOptions)\n\t\t\t: (requested as StarsBuildTool);\n\n\tif (tool === 'none' && isTypeScriptEntry) {\n\t\tthrow validator.error(configDiagnostics.BUILD_TOOL_REQUIRED, { entry: displayPath(root, entry) });\n\t}\n\n\t// Nitro owns its own output layout; anything else keeps the plain `dist` convention.\n\tconst defaultOutDir = experimental.enableNitro ? '.output' : 'dist';\n\tconst outDir = resolve(root, validator.string(config.outDir, 'build.outDir') ?? defaultOutDir);\n\n\tlet tsconfig: string | null = null;\n\tconst configuredTsconfig = validator.string(config.tsconfig, 'build.tsconfig');\n\tif (configuredTsconfig !== undefined) {\n\t\ttsconfig = resolve(root, configuredTsconfig);\n\t\tif (!isFile(tsconfig)) {\n\t\t\tthrow validator.error(configDiagnostics.TSCONFIG_EXPLICIT_NOT_FOUND, { tsconfig, path: 'build.tsconfig' });\n\t\t}\n\t} else if (tool === 'tsc' || tool === 'tsdown') {\n\t\t// `tsdown` only looks for a `tsconfig.json` next to the project root, so a bot keeping its sources' one in\n\t\t// `src/` (the layout both the scaffold and the examples use) would silently build without its paths and\n\t\t// target. Resolving it here is what makes the `tsdown` build need no configuration of its own.\n\t\ttsconfig = [join(root, 'src', 'tsconfig.json'), join(root, 'tsconfig.json')].find((candidate) => isFile(candidate)) ?? null;\n\t\tif (!tsconfig && tool === 'tsc') {\n\t\t\tthrow validator.error(configDiagnostics.TSCONFIG_NOT_FOUND, { root, suggestion: 'build.tsconfig' });\n\t\t}\n\t}\n\n\t// Nitro always writes its server entry to `<outDir>/server/index.mjs`, regardless of the project's own entry\n\t// file name or `package.json#main` — it is Nitro's output, not a build of the project's own entry file.\n\tconst output = experimental.enableNitro\n\t\t? join(outDir, 'server', 'index.mjs')\n\t\t: tool === 'none'\n\t\t\t? entry\n\t\t\t: resolveBuildOutput(root, entry, outDir, packageJson);\n\n\tlet configFile = findConfigFile(root, tool === 'tsdown' ? TSDOWN_CONFIG_FILES : tool === 'vite' ? VITE_CONFIG_FILES : []);\n\t// `tsdown` reads `package.json#tsdown` when no configuration file is around, so it counts as one here.\n\tif (tool === 'tsdown' && configFile === null && packageJson?.tsdown !== undefined) configFile = join(root, 'package.json');\n\n\t// Compatibility version 4 builds `tsdown` from this file alone. A `tsdown.config.*` left behind would keep the\n\t// plugins and entry points it declares out of the build, so it is reported rather than quietly ignored.\n\tif (tool === 'tsdown' && configFile !== null && future.compatibilityVersion >= STARS_CONFIG_TSDOWN_VERSION) {\n\t\tthrow validator.error(configDiagnostics.TSDOWN_CONFIG_FILE_UNSUPPORTED, {\n\t\t\tfile: displayPath(root, configFile),\n\t\t\tversion: future.compatibilityVersion,\n\t\t\tlegacyVersion: LEGACY_COMPATIBILITY_VERSION\n\t\t});\n\t}\n\n\treturn { tool, outDir, tsconfig, output, configFile };\n}\n\nfunction findConfigFile(root: string, names: readonly string[]): string | null {\n\tfor (const name of names) {\n\t\tconst candidate = join(root, name);\n\t\tif (isFile(candidate)) return candidate;\n\t}\n\n\treturn null;\n}\n\nfunction detectBuildTool(\n\troot: string,\n\tpackageJson: PackageJsonLike | null,\n\tisTypeScriptEntry: boolean,\n\texperimental: ResolvedExperimentalConfig,\n\tfuture: ResolvedFutureConfig,\n\thasTsdownOptions: boolean\n): StarsBuildTool {\n\t// Vite only wins the detection once the project opted into it; without the flag a `vite.config.*` is somebody\n\t// else's (a dashboard, a docs site) and must not take the bot's build over.\n\tif (experimental.enableVite) {\n\t\tconst hasVite = VITE_CONFIG_FILES.some((name) => isFile(join(root, name))) || hasDependency(packageJson, 'vite');\n\t\tif (hasVite) return 'vite';\n\t}\n\n\tif (hasTsdownOptions) return 'tsdown';\n\n\t// From compatibility version 4 on, `tsdown` is the build of a TypeScript project rather than one of the options:\n\t// there is no `tsdown.config.*` left to detect it from, and a missing dependency is reported by the builder with\n\t// an install hint instead of silently falling back to `tsc`.\n\tif (future.compatibilityVersion >= STARS_CONFIG_TSDOWN_VERSION) return isTypeScriptEntry ? 'tsdown' : 'none';\n\n\tconst hasTsdown = TSDOWN_CONFIG_FILES.some((name) => isFile(join(root, name))) || hasDependency(packageJson, 'tsdown');\n\tif (hasTsdown) return 'tsdown';\n\tif (isTypeScriptEntry) return 'tsc';\n\treturn 'none';\n}\n\n/**\n * Resolves the `experimental` block. Every flag is a boolean defaulting to `false`, the way Nuxt's own experimental\n * flags are declared, and the ones that build on each other are checked here rather than surfacing later as a\n * confusing runtime failure.\n */\nfunction resolveExperimental(config: StarsExperimentalConfig, validator: Validator): ResolvedExperimentalConfig {\n\tif (config === null || typeof config !== 'object' || Array.isArray(config)) {\n\t\tthrow validator.typeError('experimental', 'an object', config, 'Use `{ enableVite, enableExternalVite, enableNitro, nitro }`.');\n\t}\n\n\tvalidator.knownKeys(config, 'experimental', ['enableVite', 'enableExternalVite', 'enableNitro', 'nitro']);\n\tconst enableVite = validator.boolean(config.enableVite, 'experimental.enableVite') ?? false;\n\tconst enableExternalVite = validator.boolean(config.enableExternalVite, 'experimental.enableExternalVite') ?? false;\n\tconst enableNitro = validator.boolean(config.enableNitro, 'experimental.enableNitro') ?? false;\n\n\tif (enableExternalVite && !enableVite) {\n\t\tthrow validator.error(configDiagnostics.EXPERIMENT_REQUIRED, {\n\t\t\tpath: 'experimental.enableExternalVite',\n\t\t\trequires: 'experimental.enableVite',\n\t\t\tdrop: 'enableExternalVite'\n\t\t});\n\t}\n\n\tif (enableNitro && !enableVite) {\n\t\tthrow validator.error(configDiagnostics.EXPERIMENT_REQUIRED, {\n\t\t\tpath: 'experimental.enableNitro',\n\t\t\trequires: 'experimental.enableVite',\n\t\t\tdrop: 'enableNitro'\n\t\t});\n\t}\n\n\tconst rawNitro = 'nitro' in config ? config.nitro : undefined;\n\tif (rawNitro !== undefined && !enableNitro) {\n\t\tthrow validator.error(configDiagnostics.EXPERIMENT_REQUIRED, {\n\t\t\tpath: 'experimental.nitro',\n\t\t\trequires: 'experimental.enableNitro',\n\t\t\tdrop: 'nitro'\n\t\t});\n\t}\n\tif (rawNitro !== undefined && (rawNitro === null || typeof rawNitro !== 'object' || Array.isArray(rawNitro))) {\n\t\tthrow validator.typeError('experimental.nitro', 'an object', rawNitro, 'Use `{ preset }`.');\n\t}\n\tconst preset = validator.string(rawNitro?.preset, 'experimental.nitro.preset') ?? 'node-server';\n\n\treturn { enableVite, enableExternalVite, enableNitro, nitro: { ...rawNitro, preset } };\n}\n\nfunction resolveBuildOutput(root: string, entry: string, outDir: string, packageJson: PackageJsonLike | null): string {\n\tif (packageJson?.main) return resolve(root, packageJson.main);\n\n\tconst extension = extname(entry);\n\tconst outputExtension = extension === '.mts' ? '.mjs' : extension === '.cts' ? '.cjs' : '.js';\n\treturn join(outDir, `${basename(entry, extension)}${outputExtension}`);\n}\n\nconst ENV_PORT_KEYS = ['HTTP_PORT', 'PORT'] as const;\n\n/**\n * Reads the project's environment layers from `src/.env*` and `.env*` into a plain object, the way `stars dev` and\n * `stars commands` need it:\n * these files are only loaded into `process.env` by the bot itself once it starts (see `@wolfstar/env-utilities`),\n * so by the time the CLI runs they are not there yet. This is a minimal line reader, not a full dotenv\n * implementation — quoting is stripped, but expansion (`dotenv-expand`) is not. Earlier files win, matching\n * dotenv's own precedence.\n */\nexport function readProjectEnvFiles(root: string, environment = 'development', options: { path?: string } = {}): Record<string, string> {\n\tconst result: Record<string, string> = {};\n\tconst suffixes = [`.${environment}.local`, ...(environment === 'test' ? [] : ['.local']), `.${environment}`, ''];\n\t// A custom `env.path` replaces both default locations, the way it does in `@wolfstar/env-utilities`.\n\tconst bases = options.path ? [options.path] : [join('src', '.env'), '.env'];\n\tconst files = suffixes.flatMap((suffix) => bases.map((base) => `${base}${suffix}`));\n\n\tfor (const file of files) {\n\t\t// `resolve`, not `join`: an absolute `env.path` is used as-is, as `@wolfstar/env-utilities` itself does.\n\t\tconst path = resolve(root, file);\n\t\tif (!isFile(path)) continue;\n\n\t\tlet contents: string;\n\t\ttry {\n\t\t\tcontents = readFileSync(path, 'utf-8');\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor (const line of contents.split(/\\r?\\n/)) {\n\t\t\tconst match = /^\\s*(?:export\\s+)?([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*(.*)$/.exec(line);\n\t\t\tif (!match) continue;\n\n\t\t\tconst key = match[1]!;\n\t\t\tif (key in result) continue;\n\t\t\tresult[key] = match[2]!.trim().replace(/^['\"]|['\"]$/g, '');\n\t\t}\n\t}\n\n\treturn result;\n}\n\nfunction readDevPortFromEnvFile(\n\troot: string,\n\tenvironment: string,\n\tenvOptions: Readonly<StarsEnvSetupOptions>,\n\tprojectEnv: Readonly<Record<string, string>> | undefined\n): string | null {\n\t// Varlock resolves its `.env.schema` on its own terms (and may pull values from elsewhere), so a dotenv file is\n\t// not what the bot loads: without the values the host resolved (`projectEnv`), there is nothing to read.\n\tif (projectEnv === undefined && envOptions.loader === 'varlock') return null;\n\n\tconst values = projectEnv ?? readProjectEnvFiles(root, environment, { path: envOptions.path });\n\tfor (const key of ENV_PORT_KEYS) {\n\t\tif (values[key]) return values[key];\n\t}\n\n\treturn null;\n}\n\nfunction resolveDev(\n\troot: string,\n\tentry: string,\n\tpackageJson: PackageJsonLike | null,\n\tconfig: NonNullable<StarsConfig['dev']>,\n\tenv: NodeJS.ProcessEnv,\n\tenvOptions: Readonly<StarsEnvSetupOptions>,\n\tprojectEnv: Readonly<Record<string, string>> | undefined,\n\tvalidator: Validator\n): ResolvedDevConfig {\n\tvalidator.knownKeys(config, 'dev', [\n\t\t'banner',\n\t\t'watch',\n\t\t'ignore',\n\t\t'debounce',\n\t\t'env',\n\t\t'nodeArgs',\n\t\t'args',\n\t\t'url',\n\t\t'health',\n\t\t'killTimeout',\n\t\t'typecheck',\n\t\t'tunnel',\n\t\t'logFile'\n\t]);\n\n\tconst watch = (validator.stringArray(config.watch, 'dev.watch') ?? [displayPath(root, dirname(entry))]).map((path) => resolve(root, path));\n\tconst ignore = validator.stringArray(config.ignore, 'dev.ignore') ?? [...DEFAULT_IGNORE];\n\tconst debounce = validator.nonNegativeNumber(config.debounce, 'dev.debounce') ?? DEFAULT_DEBOUNCE;\n\tconst devEnv = validator.stringRecord(config.env, 'dev.env') ?? {};\n\tconst nodeArgs = validator.stringArray(config.nodeArgs, 'dev.nodeArgs') ?? [...DEFAULT_NODE_ARGS];\n\tconst args = validator.stringArray(config.args, 'dev.args') ?? [];\n\tconst killTimeout = validator.nonNegativeNumber(config.killTimeout, 'dev.killTimeout') ?? DEFAULT_KILL_TIMEOUT;\n\tconst health = validator.string(config.health, 'dev.health') ?? null;\n\n\tlet url = validator.string(config.url, 'dev.url') ?? null;\n\tif (url !== null) {\n\t\ttry {\n\t\t\tnew URL(url);\n\t\t} catch {\n\t\t\tthrow validator.error(configDiagnostics.INVALID_URL, { url, fix: 'Use an absolute URL such as http://localhost:3000.' });\n\t\t}\n\t} else {\n\t\t// Mirrors Vite's and Nuxt's own dev servers: a URL is shown without any configuration. The exact host\n\t\t// (`localhost` vs `127.0.0.1`) is resolved at runtime by `stars dev`, once it knows which one is actually reachable.\n\t\tconst port =\n\t\t\tdevEnv.HTTP_PORT ??\n\t\t\tenv.HTTP_PORT ??\n\t\t\treadDevPortFromEnvFile(root, envOptions.env ?? env.NODE_ENV ?? 'development', envOptions, projectEnv) ??\n\t\t\tString(DEFAULT_DEV_PORT);\n\t\turl = /^\\d+$/.test(port) ? `http://localhost:${port}` : `http://localhost:${DEFAULT_DEV_PORT}`;\n\t}\n\n\tconst typecheck = resolveTypecheck(root, packageJson, config.typecheck, validator);\n\tconst tunnel = resolveTunnel(config.tunnel, validator);\n\tconst logFile = config.logFile === false ? null : resolve(root, validator.string(config.logFile, 'dev.logFile') ?? DEFAULT_DEV_LOG_FILE);\n\tconst banner =\n\t\tconfig.banner === false\n\t\t\t? false\n\t\t\t: typeof config.banner === 'string'\n\t\t\t\t? config.banner.split('\\n')\n\t\t\t\t: (validator.stringArray(config.banner, 'dev.banner') ?? null);\n\n\treturn { watch, ignore, debounce, env: devEnv, nodeArgs, args, url, health, killTimeout, typecheck, tunnel, logFile, banner };\n}\n\n/**\n * Resolves `dev.typecheck`. The tsconfig is looked up the same way the `tsc` build tool looks up its own, so a\n * project building with `tsdown` still gets `tsc --watch --noEmit` on the right project file.\n */\nfunction resolveTypecheck(\n\troot: string,\n\tpackageJson: PackageJsonLike | null,\n\tconfig: StarsDevConfig['typecheck'],\n\tvalidator: Validator\n): ResolvedTypecheckConfig {\n\tif (config === undefined || config === false) return { enabled: false, tsconfig: null, checker: detectTypechecker(packageJson) };\n\n\tlet configured: string | undefined;\n\tlet requestedChecker = 'auto';\n\tif (config !== true) {\n\t\tif (config === null || typeof config !== 'object' || Array.isArray(config)) {\n\t\t\tthrow validator.typeError(\n\t\t\t\t'dev.typecheck',\n\t\t\t\t'a boolean or an object',\n\t\t\t\tconfig,\n\t\t\t\t'Use `true` to type-check with the project tsconfig, `{ tsconfig }` to pick one, or `false` to disable it.'\n\t\t\t);\n\t\t}\n\n\t\tvalidator.knownKeys(config, 'dev.typecheck', ['tsconfig', 'checker']);\n\t\tconfigured = validator.string(config.tsconfig, 'dev.typecheck.tsconfig');\n\t\trequestedChecker = validator.string(config.checker, 'dev.typecheck.checker') ?? 'auto';\n\t\tif (!TYPECHECKERS.has(requestedChecker)) {\n\t\t\tthrow validator.error(configDiagnostics.INVALID_TYPECHECKER, { checker: requestedChecker });\n\t\t}\n\t}\n\n\tconst checker: StarsTypechecker = requestedChecker === 'auto' ? detectTypechecker(packageJson) : (requestedChecker as StarsTypechecker);\n\n\tif (configured !== undefined) {\n\t\tconst tsconfig = resolve(root, configured);\n\t\tif (!isFile(tsconfig)) {\n\t\t\tthrow validator.error(configDiagnostics.TSCONFIG_EXPLICIT_NOT_FOUND, { tsconfig, path: 'dev.typecheck.tsconfig' });\n\t\t}\n\t\treturn { enabled: true, tsconfig, checker };\n\t}\n\n\tconst found = [join(root, 'src', 'tsconfig.json'), join(root, 'tsconfig.json')].find((candidate) => isFile(candidate)) ?? null;\n\tif (!found) {\n\t\tthrow validator.error(configDiagnostics.TSCONFIG_NOT_FOUND, { root, suggestion: 'dev.typecheck.tsconfig' });\n\t}\n\n\treturn { enabled: true, tsconfig: found, checker };\n}\n\n/**\n * Picks the type checker when `dev.typecheck.checker` is `auto`: `golar` when the project already depends on it\n * (it wraps TypeScript and is what this repository's own `typecheck` scripts run), `tsc` otherwise. `tsz` is never\n * picked automatically — it is an early, tsc-compatible alternative a project opts into.\n */\nfunction detectTypechecker(packageJson: PackageJsonLike | null): StarsTypechecker {\n\treturn hasDependency(packageJson, 'golar') ? 'golar' : 'tsc';\n}\n\n/**\n * Resolves `dev.tunnel`: `true` (or `{}`) opens a `cloudflared` quick tunnel, a string (or `{ url }`) is an https\n * URL the user already serves and the CLI only checks.\n */\nfunction resolveTunnel(config: StarsDevConfig['tunnel'], validator: Validator): ResolvedTunnelConfig {\n\tif (config === undefined || config === false) return { mode: 'off' };\n\n\tlet url: string | undefined;\n\tlet updateEndpoint = false;\n\tlet path = DEFAULT_TUNNEL_PATH;\n\n\tif (typeof config === 'string') {\n\t\turl = config;\n\t} else if (config !== true) {\n\t\tif (config === null || typeof config !== 'object' || Array.isArray(config)) {\n\t\t\tthrow validator.typeError(\n\t\t\t\t'dev.tunnel',\n\t\t\t\t'a boolean, an https URL or an object',\n\t\t\t\tconfig,\n\t\t\t\t'Use `true` for a cloudflared quick tunnel, an https URL you already serve, or `false` to disable it.'\n\t\t\t);\n\t\t}\n\n\t\tvalidator.knownKeys(config, 'dev.tunnel', ['url', 'updateEndpoint', 'path']);\n\t\turl = validator.string(config.url, 'dev.tunnel.url');\n\t\tupdateEndpoint = validator.boolean(config.updateEndpoint, 'dev.tunnel.updateEndpoint') ?? false;\n\t\tpath = validator.string(config.path, 'dev.tunnel.path') ?? DEFAULT_TUNNEL_PATH;\n\t}\n\n\tif (url === undefined) return { mode: 'quick', path, updateEndpoint };\n\n\t// Discord only accepts an https interactions endpoint.\n\tlet parsed: URL;\n\ttry {\n\t\tparsed = new URL(url);\n\t} catch {\n\t\tthrow validator.error(configDiagnostics.INVALID_URL, { url, fix: 'Use an absolute https URL such as https://bot.example.com.' });\n\t}\n\n\tif (parsed.protocol !== 'https:') {\n\t\tthrow validator.error(configDiagnostics.TUNNEL_URL_NOT_HTTPS, { url });\n\t}\n\n\treturn { mode: 'url', url, path, updateEndpoint };\n}\n\nfunction resolveCodegen(root: string, config: NonNullable<StarsConfig['codegen']>, validator: Validator): ResolvedCodegenConfig {\n\tvalidator.knownKeys(config, 'codegen', ['i18n']);\n\n\tif (config.i18n === false) return { i18n: null };\n\n\tif (config.i18n === undefined) {\n\t\tconst locales = join(root, DEFAULT_I18N_LOCALES);\n\t\treturn { i18n: isDirectory(locales) ? { locales, output: join(root, DEFAULT_I18N_OUTPUT) } : null };\n\t}\n\n\tif (config.i18n === null || typeof config.i18n !== 'object') {\n\t\tthrow validator.typeError(\n\t\t\t'codegen.i18n',\n\t\t\t'an object or `false`',\n\t\t\tconfig.i18n,\n\t\t\t'Use `{ locales, output }` to configure it or `false` to disable it.'\n\t\t);\n\t}\n\n\tvalidator.knownKeys(config.i18n, 'codegen.i18n', ['locales', 'output']);\n\tconst locales = resolve(root, validator.string(config.i18n.locales, 'codegen.i18n.locales') ?? DEFAULT_I18N_LOCALES);\n\tif (!isDirectory(locales)) {\n\t\tthrow validator.error(configDiagnostics.LOCALES_NOT_FOUND, { locales });\n\t}\n\n\tconst output = resolve(root, validator.string(config.i18n.output, 'codegen.i18n.output') ?? DEFAULT_I18N_OUTPUT);\n\treturn { i18n: { locales, output } };\n}\n\n/**\n * The transform that injects auto imports (`@wolfstar/http-framework/auto-imports`) only runs through `tsdown`'s\n * rolldown pipeline, the same way Nuxt's own auto imports only run through its Vite/webpack build: `tsc` and `none`\n * have no transform step to hook into. `tsdown` is picked as `build.tool` first (see {@link detectBuildTool}) for the\n * same reason — it is the only tool this feature, and this build config in general, treats as the default choice.\n *\n * They are on by default from compatibility version 4 on, where `stars` wires the plugin into the build itself. At 3\n * the plugin is the project's to add, so defaulting them on would promise imports that never get injected.\n */\nfunction resolveImports(\n\troot: string,\n\tbuildTool: StarsBuildTool,\n\tfuture: ResolvedFutureConfig,\n\tconfig: StarsConfig['imports'],\n\tvalidator: Validator\n): ResolvedImportsConfig {\n\tconst defaultDirs = DEFAULT_IMPORTS_DIRS.map((dir) => resolve(root, dir));\n\tconst defaultPresets = [...DEFAULT_IMPORTS_PRESETS];\n\tconst defaultDts = resolve(root, DEFAULT_IMPORTS_DTS);\n\n\tif (config === false) {\n\t\treturn { enabled: false, dirs: defaultDirs, presets: defaultPresets, exclude: [], dts: defaultDts };\n\t}\n\n\tconst forcedOn = config === true;\n\tconst options = forcedOn || config === undefined ? {} : config;\n\tif (typeof options !== 'object' || options === null || Array.isArray(options)) {\n\t\tthrow validator.typeError(\n\t\t\t'imports',\n\t\t\t'an object, `true` or `false`',\n\t\t\toptions,\n\t\t\t'Use `{ dirs, presets, exclude, dts }`, `true` to enable with defaults, or `false` to disable.'\n\t\t);\n\t}\n\n\tvalidator.knownKeys(options, 'imports', ['enabled', 'dirs', 'presets', 'exclude', 'dts']);\n\n\tconst requestedOn = forcedOn || validator.boolean(options.enabled, 'imports.enabled');\n\tif (requestedOn && buildTool !== 'tsdown') {\n\t\tthrow validator.error(configDiagnostics.IMPORTS_REQUIRE_TSDOWN, {});\n\t}\n\n\tconst dirs = (validator.stringArray(options.dirs, 'imports.dirs') ?? [...DEFAULT_IMPORTS_DIRS]).map((dir) => resolve(root, dir));\n\tconst presets = validator.stringArray(options.presets, 'imports.presets') ?? defaultPresets;\n\tconst exclude = validator.stringArray(options.exclude, 'imports.exclude') ?? [];\n\tconst dts = resolve(root, validator.string(options.dts, 'imports.dts') ?? DEFAULT_IMPORTS_DTS);\n\n\tconst enabledByDefault = buildTool === 'tsdown' && future.compatibilityVersion >= STARS_CONFIG_TSDOWN_VERSION;\n\treturn { enabled: requestedOn ?? enabledByDefault, dirs, presets, exclude, dts };\n}\n\nexport function hasDependency(packageJson: PackageJsonLike | null, name: string): boolean {\n\treturn Boolean(packageJson?.dependencies?.[name] ?? packageJson?.devDependencies?.[name]);\n}\n\nfunction readPackageJson(root: string, validator: Validator): PackageJsonLike | null {\n\tconst file = join(root, 'package.json');\n\tif (!isFile(file)) return null;\n\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(readFileSync(file, 'utf-8'));\n\t\treturn parsed !== null && typeof parsed === 'object' ? (parsed as PackageJsonLike) : null;\n\t} catch (error) {\n\t\tthrow validator.error(configDiagnostics.PACKAGE_JSON_INVALID, {\n\t\t\tfile,\n\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\tcause: error\n\t\t});\n\t}\n}\n\nfunction isFile(path: string): boolean {\n\ttry {\n\t\treturn existsSync(path) && statSync(path).isFile();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction isDirectory(path: string): boolean {\n\ttry {\n\t\treturn existsSync(path) && statSync(path).isDirectory();\n\t} catch {\n\t\treturn false;\n\t}\n}\n","import { loadConfigFile } from './load.js';\nimport { resolveStarsConfig, type ResolvedStarsConfig } from './resolve.js';\n\nexport interface LoadStarsConfigOptions {\n\t/**\n\t * The directory to discover `stars.config.*` from.\n\t * @default process.cwd()\n\t */\n\tcwd?: string;\n\t/** An explicit configuration file, resolved from `cwd`. */\n\tconfigFile?: string | null;\n\t/**\n\t * Environment used for defaults such as `HTTP_PORT`.\n\t * @default process.env\n\t */\n\tenv?: NodeJS.ProcessEnv;\n}\n\n/**\n * Loads, validates and resolves a project's `stars.config.*`.\n *\n * @throws {Diagnostic} (from `nostics`, via {@link configDiagnostics}) when the configuration file cannot be loaded or contains an invalid option.\n */\nexport async function loadStarsConfig(options: LoadStarsConfigOptions = {}): Promise<ResolvedStarsConfig> {\n\tconst cwd = options.cwd ?? process.cwd();\n\tconst loaded = await loadConfigFile({ cwd, configFile: options.configFile });\n\treturn resolveStarsConfig({ cwd, configFile: loaded.configFile, config: loaded.config, env: options.env });\n}\n\nexport { CONFIG_EXTENSIONS, CONFIG_FILE_NAMES, discoverConfigFile, loadConfigFile } from './load.js';\nexport type { LoadConfigFileOptions, LoadedConfigFile } from './load.js';\nexport {\n\tAUTO_ENV_VERSION,\n\tDEFAULT_COMPATIBILITY_VERSION,\n\tEOL_COMPATIBILITY_VERSIONS,\n\tLATEST_COMPATIBILITY_VERSION,\n\tLEGACY_COMPATIBILITY_VERSION,\n\tSTARS_CONFIG_TSDOWN_VERSION\n} from './compatibility.js';\nexport { resolveEnv } from './env.js';\nexport type { ResolvedEnvConfig } from './env.js';\nexport { configDiagnostics } from './errors.js';\nexport { resolveHooks, STARS_HOOK_NAMES } from './hooks.js';\nexport type { ResolvedHooksConfig } from './hooks.js';\nexport type { ConfigDiagnosticCode } from './errors.js';\nexport { displayPath, readProjectEnvFiles, resolveStarsConfig } from './resolve.js';\nexport type {\n\tPackageJsonLike,\n\tResolveConfigOptions,\n\tResolvedBuildConfig,\n\tResolvedCodegenConfig,\n\tResolvedDevConfig,\n\tResolvedExperimentalConfig,\n\tResolvedFutureConfig,\n\tResolvedNitroConfig,\n\tResolvedI18nCodegenConfig,\n\tResolvedImportsConfig,\n\tResolvedStarsConfig,\n\tResolvedTunnelConfig,\n\tResolvedTypecheckConfig\n} from './resolve.js';\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["isFile"],"sources":["../../src/config/errors.ts","../../src/config/load.ts","../../src/types/modules.ts","../../src/config/compatibility.ts","../../src/config/env.ts","../../src/config/hooks.ts","../../src/config/modules.ts","../../src/config/validator.ts","../../src/config/resolve.ts","../../src/config/index.ts"],"sourcesContent":["import { defineDiagnostics } from 'nostics';\n\n/**\n * Structured, stable diagnostic codes for every way a `stars.config.*` can fail to load or validate.\n *\n * This is a plain data error (no exit code or terminal formatting), so nothing here reports anywhere on its own —\n * `reporters` stays empty and each call only builds and returns a `Diagnostic`. That keeps it meaningful outside a\n * CLI, e.g. for a dashboard or test that calls {@link loadStarsConfig} directly; `@wolfstar/cli` is what renders it\n * and picks an exit code (`exitCodeOf`).\n *\n * The `sources` field (populated with the configuration file, when there is one) carries the \"which file\" grounding\n * `ConfigError` used to expose as `.file`; the \"which option\" grounding it exposed as `.path` is folded directly into\n * every `why`/`fix` message instead, the way every other diagnostic code already reads.\n *\n * `why` and `fix` are always given the same, fully-typed params object (even when one of them ignores part of it):\n * a bare `() => value` loses nostics' param-type inference (a zero-arg function widens to `unknown` params), so every\n * entry here spells out its shape on both sides instead.\n */\nexport const configDiagnostics = defineDiagnostics({\n\tdocsBase: (code) => `https://stars-components.js.org/docs/config/errors#${code.toLowerCase()}`,\n\treporters: [],\n\tcodes: {\n\t\tROOT_NOT_FOUND: {\n\t\t\twhy: (p: { root: string }) => `The project root does not exist: ${p.root}`,\n\t\t\tfix: (_p: { root: string }) => 'Point `root` to an existing directory, relative to the configuration file.'\n\t\t},\n\t\tPACKAGE_JSON_INVALID: {\n\t\t\twhy: (p: { file: string; message: string }) => `Failed to parse ${p.file}: ${p.message}`,\n\t\t\tfix: (_p: { file: string; message: string }) => 'Fix the JSON syntax of the package.json file.'\n\t\t},\n\t\tENTRY_NOT_FOUND: {\n\t\t\twhy: (p: { entry: string }) => `The entry file does not exist: ${p.entry}`,\n\t\t\tfix: (_p: { entry: string }) => 'Point `entry` to the file that starts the bot, relative to the project root.'\n\t\t},\n\t\tENTRY_DEFAULT_NOT_FOUND: {\n\t\t\twhy: (p: { root: string; defaults: string }) => `Could not find the entry file in ${p.root}`,\n\t\t\tfix: (p: { root: string; defaults: string }) => `Set \\`entry\\` in the configuration, or create one of ${p.defaults}.`\n\t\t},\n\t\tINVALID_BUILD_TOOL: {\n\t\t\twhy: (p: { tool: string }) => `Unknown build tool \"${p.tool}\"`,\n\t\t\tfix: (_p: { tool: string }) => \"Use one of 'tsdown', 'tsc', 'vite', 'none' or 'auto'.\"\n\t\t},\n\t\tEXPERIMENTAL_BUILD_TOOL: {\n\t\t\twhy: (p: { tool: string; flag: string }) => `The '${p.tool}' build tool is experimental`,\n\t\t\tfix: (p: { tool: string; flag: string }) => `Set \\`${p.flag}\\` to true to use it.`\n\t\t},\n\t\tBUILD_TOOL_REQUIRED: {\n\t\t\twhy: (p: { entry: string }) => `The entry ${p.entry} is TypeScript but the build tool is 'none'`,\n\t\t\tfix: (_p: { entry: string }) => \"Set `build.tool` to 'tsdown' or 'tsc', or point `entry` to a JavaScript file.\"\n\t\t},\n\t\tTSCONFIG_EXPLICIT_NOT_FOUND: {\n\t\t\twhy: (p: { tsconfig: string; path: string }) => `The tsconfig file does not exist: ${p.tsconfig}`,\n\t\t\tfix: (p: { tsconfig: string; path: string }) => `Point \\`${p.path}\\` to an existing tsconfig.json, relative to the project root.`\n\t\t},\n\t\tTSCONFIG_NOT_FOUND: {\n\t\t\twhy: (p: { root: string; suggestion: string }) => `Could not find a tsconfig.json in ${p.root}`,\n\t\t\tfix: (p: { root: string; suggestion: string }) => `Create src/tsconfig.json or tsconfig.json, or set \\`${p.suggestion}\\`.`\n\t\t},\n\t\tTSDOWN_OPTIONS_REQUIRE_TSDOWN: {\n\t\t\twhy: (_p: { tool: string }) => '`tsdown` options need the `tsdown` build tool',\n\t\t\tfix: (p: { tool: string }) => `Set \\`build.tool\\` to 'tsdown', or remove \\`tsdown\\` (the build tool is '${p.tool}').`\n\t\t},\n\t\tVITE_OPTIONS_REQUIRE_VITE: {\n\t\t\twhy: (_p: { tool: string }) => '`vite` options need the `vite` build tool',\n\t\t\tfix: (p: { tool: string }) =>\n\t\t\t\t`Set \\`build.tool\\` to 'vite' with \\`experimental.enableVite\\`, or remove \\`vite\\` (the build tool is '${p.tool}').`\n\t\t},\n\t\tTSDOWN_CONFIG_FILE_UNSUPPORTED: {\n\t\t\twhy: (p: { file: string; version: number; legacyVersion: number }) => `\\`${p.file}\\` is not used with compatibility version ${p.version}`,\n\t\t\tfix: (p: { file: string; version: number; legacyVersion: number }) =>\n\t\t\t\t`Move its options into \\`tsdown\\` here and drop ${p.file}. \\`future.compatibilityVersion\\` ${p.legacyVersion} still loads it, but is end-of-life.`\n\t\t},\n\t\tINVALID_TYPE: {\n\t\t\twhy: (p: { path: string; expected: string; value: unknown; fix: string }) =>\n\t\t\t\t`\\`${p.path}\\` must be ${p.expected}, received ${describeValue(p.value)}`,\n\t\t\tfix: (p: { path: string; expected: string; value: unknown; fix: string }) => p.fix\n\t\t},\n\t\tINVALID_COMPATIBILITY_VERSION: {\n\t\t\twhy: (p: { value: unknown; supported: string; latestVersion: number }) => `Unknown compatibility version ${describeValue(p.value)}`,\n\t\t\tfix: (p: { value: unknown; supported: string; latestVersion: number }) =>\n\t\t\t\t`Use one of ${p.supported}; ${p.latestVersion} carries today's defaults.`\n\t\t},\n\t\tCOMPATIBILITY_VERSION_EOL: {\n\t\t\twhy: (p: { version: number; latestVersion: number }) =>\n\t\t\t\t`Compatibility version ${p.version} is end-of-life and will be removed in the next major`,\n\t\t\tfix: (p: { version: number; latestVersion: number }) =>\n\t\t\t\t`Move the options of your tsdown.config.* into \\`tsdown\\` in stars.config, delete that file, then set \\`future.compatibilityVersion\\` to ${p.latestVersion} (or remove it).`\n\t\t},\n\t\tUNKNOWN_OPTION: {\n\t\t\twhy: (p: { path: string; parent: string; known: string }) => `Unknown option \\`${p.path}\\``,\n\t\t\tfix: (p: { path: string; parent: string; known: string }) => `Known options${p.parent ? ` of \\`${p.parent}\\`` : ''}: ${p.known}.`\n\t\t},\n\t\tUNKNOWN_HOOK: {\n\t\t\twhy: (p: { name: string; known: string }) => `Unknown hook \\`${p.name}\\``,\n\t\t\tfix: (p: { name: string; known: string }) => `Known hooks: ${p.known}.`\n\t\t},\n\t\tEXPERIMENT_REQUIRED: {\n\t\t\twhy: (p: { path: string; requires: string; drop: string }) => `\\`${p.path}\\` needs \\`${p.requires}\\``,\n\t\t\tfix: (p: { path: string; requires: string; drop: string }) => `Set \\`${p.requires}\\` to true as well, or drop \\`${p.drop}\\`.`\n\t\t},\n\t\tIMPORTS_REQUIRE_TSDOWN: {\n\t\t\twhy: (_p: {}) => '`imports` requires the `tsdown` build tool',\n\t\t\tfix: (_p: {}) => \"Set `build.tool` to 'tsdown', or remove `imports`/set it to `false`.\"\n\t\t},\n\t\tENV_REQUIRES_ENV_UTILITIES: {\n\t\t\twhy: (_p: {}) => '`env` is enabled, but the project does not depend on `@wolfstar/env-utilities`',\n\t\t\tfix: (_p: {}) => 'Install it with `pnpm add @wolfstar/env-utilities`, or set `env` to `false`.'\n\t\t},\n\t\tLOCALES_NOT_FOUND: {\n\t\t\twhy: (p: { locales: string }) => `The locales directory does not exist: ${p.locales}`,\n\t\t\tfix: (_p: { locales: string }) => 'Point `codegen.i18n.locales` to the base locale directory, relative to the project root.'\n\t\t},\n\t\tINVALID_URL: {\n\t\t\twhy: (p: { url: string; fix: string }) => `Invalid URL \"${p.url}\"`,\n\t\t\tfix: (p: { url: string; fix: string }) => p.fix\n\t\t},\n\t\tTUNNEL_URL_NOT_HTTPS: {\n\t\t\twhy: (p: { url: string }) => `The tunnel URL must be https, received \"${p.url}\"`,\n\t\t\tfix: (_p: { url: string }) => 'Discord only accepts an https interactions endpoint.'\n\t\t},\n\t\tINVALID_TYPECHECKER: {\n\t\t\twhy: (p: { checker: string }) => `Unknown type checker \"${p.checker}\"`,\n\t\t\tfix: (_p: { checker: string }) => \"Use one of 'tsc', 'golar', 'tsz' or 'auto'.\"\n\t\t},\n\t\tCONFIG_NOT_FOUND: {\n\t\t\twhy: (p: { file: string; cwd: string; names: string }) => `Configuration file not found: ${p.file}`,\n\t\t\tfix: (p: { file: string; cwd: string; names: string }) => `Pass an existing file to --config, or create one of ${p.names} in ${p.cwd}.`\n\t\t},\n\t\tCONFIG_LOAD_FAILED: {\n\t\t\twhy: (p: { message: string }) => `Failed to load the configuration: ${p.message}`,\n\t\t\tfix: (_p: { message: string }) => 'The file must be valid TypeScript/JavaScript and export the configuration as its default export.'\n\t\t},\n\t\tCONFIG_NOT_OBJECT: {\n\t\t\twhy: (_p: {}) => 'The configuration file must export an object as its default export.',\n\t\t\tfix: (_p: {}) => \"Use `export default defineConfig({ ... })` from '@wolfstar/http-framework/config'.\"\n\t\t}\n\t}\n});\n\nexport type ConfigDiagnosticCode = keyof typeof configDiagnostics;\n\nfunction describeValue(value: unknown): string {\n\tif (value === null) return 'null';\n\tif (Array.isArray(value)) return 'an array';\n\tif (typeof value === 'string') return `\"${value}\"`;\n\treturn typeof value === 'object' ? 'an object' : `${typeof value} ${String(value)}`;\n}\n","import { existsSync, statSync } from 'node:fs';\nimport { basename, dirname, join, resolve } from 'node:path';\nimport type { StarsConfig } from '../types/config.js';\nimport { configDiagnostics } from './errors.js';\n\nexport const CONFIG_EXTENSIONS = ['ts', 'mts', 'cts', 'js', 'mjs', 'cjs'] as const;\nexport const CONFIG_FILE_NAMES = CONFIG_EXTENSIONS.map((extension) => `stars.config.${extension}`);\n\nexport interface LoadConfigFileOptions {\n\t/** The directory to discover the configuration file from. */\n\tcwd: string;\n\t/** An explicit configuration file (`--config`), resolved from `cwd`. */\n\tconfigFile?: string | null;\n}\n\nexport interface LoadedConfigFile {\n\t/** The absolute path of the loaded file, `null` when running on defaults. */\n\tconfigFile: string | null;\n\tconfig: StarsConfig;\n}\n\n/**\n * Finds the first `stars.config.*` file in `cwd`, in {@link CONFIG_FILE_NAMES} order.\n */\nexport function discoverConfigFile(cwd: string): string | null {\n\tfor (const name of CONFIG_FILE_NAMES) {\n\t\tconst candidate = join(cwd, name);\n\t\tif (isFile(candidate)) return candidate;\n\t}\n\n\treturn null;\n}\n\n/**\n * Loads the raw configuration object. The loader (`c12`) is imported lazily so\n * commands that never touch the configuration stay fast.\n */\nexport async function loadConfigFile(options: LoadConfigFileOptions): Promise<LoadedConfigFile> {\n\tconst cwd = resolve(options.cwd);\n\tlet file: string | null;\n\n\tif (options.configFile) {\n\t\tfile = resolve(cwd, options.configFile);\n\t\tif (!isFile(file)) {\n\t\t\tthrow configDiagnostics.CONFIG_NOT_FOUND({ file, cwd, names: CONFIG_FILE_NAMES.join(', ') });\n\t\t}\n\t} else {\n\t\tfile = discoverConfigFile(cwd);\n\t\tif (!file) return { configFile: null, config: {} };\n\t}\n\n\tconst { loadConfig } = await import('c12');\n\n\tlet loaded: unknown;\n\ttry {\n\t\tconst result = await loadConfig<StarsConfig>({\n\t\t\tname: 'stars',\n\t\t\tcwd: dirname(file),\n\t\t\tconfigFile: basename(file),\n\t\t\trcFile: false,\n\t\t\tglobalRc: false,\n\t\t\tdotenv: false,\n\t\t\tpackageJson: false,\n\t\t\tdefaults: {}\n\t\t});\n\t\t// c12 merges every layer with the defaults, which turns non-object exports into `{}`: inspect the raw layer.\n\t\tconst layer = result.layers?.find(\n\t\t\t(candidate) => candidate.configFile && resolve(candidate.cwd ?? dirname(file), candidate.configFile) === file\n\t\t);\n\t\tloaded = layer ? layer.config : result.config;\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthrow configDiagnostics.CONFIG_LOAD_FAILED({ message, cause: error, sources: [file] });\n\t}\n\n\tif (loaded === null || typeof loaded !== 'object' || Array.isArray(loaded)) {\n\t\tthrow configDiagnostics.CONFIG_NOT_OBJECT({ sources: [file] });\n\t}\n\n\treturn { configFile: file, config: loaded as StarsConfig };\n}\n\nfunction isFile(path: string): boolean {\n\ttry {\n\t\treturn existsSync(path) && statSync(path).isFile();\n\t} catch {\n\t\treturn false;\n\t}\n}\n","/**\n * A module as listed in `modules` in `stars.config`: a package name (or a file path Node can import) on its own, or\n * a `[specifier, options]` tuple whose options are merged over the module's `defaults`. Falsy entries are dropped, so\n * `modules: [useCache && '@wolfstar/plugin-cache']` works.\n */\nexport type StarsModuleEntry = string | readonly [specifier: string, options?: Record<string, unknown>];\n\n/** One entry of `modules`, normalised. */\nexport interface ResolvedModuleEntry {\n\t/** A package name, or a file path/URL, the module is imported from. */\n\treadonly specifier: string;\n\t/** The options written in `stars.config`, before the module's `defaults` are merged under them. */\n\treadonly options: Readonly<Record<string, unknown>>;\n}\n\n/**\n * A runtime plugin a module registered with `ctx.addPlugin`. Plugins cross from the CLI process into the bot by\n * source, not by value: the entry (or, for the `tsc`/`none` build tools, a `node --import` preload) imports `from` and\n * passes its `export` to `Client.use` — as the plugin itself, or, when it is a function, the result of calling it with\n * `options`.\n */\nexport interface RuntimePluginRegistration {\n\t/** The module that registered it. */\n\treadonly module: string;\n\t/** A package specifier or an absolute file path. */\n\treadonly from: string;\n\t/** @default 'default' */\n\treadonly export: string;\n\t/** JSON-serialisable options handed to the plugin when it is a factory. */\n\treadonly options?: unknown;\n}\n\n/** A module that was installed. */\nexport interface InstalledModule {\n\treadonly name: string;\n\treadonly version?: string;\n}\n\n/** What the installed modules contributed, known once the CLI ran their `setup`. Empty until then. */\nexport interface ModulesRuntime {\n\treadonly modules: readonly InstalledModule[];\n\treadonly plugins: readonly RuntimePluginRegistration[];\n\t/** Packages added to `imports.presets` by `ctx.addImports`. */\n\treadonly imports: readonly string[];\n}\n\nexport const EMPTY_MODULES_RUNTIME: ModulesRuntime = Object.freeze({ modules: [], plugins: [], imports: [] });\n","import type { Diagnostic } from 'nostics';\nimport type { StarsCompatibilityVersion, StarsFutureConfig } from '../types/config.js';\nimport { configDiagnostics } from './errors.js';\nimport type { Validator } from './validator.js';\n\nexport interface ResolvedFutureConfig {\n\treadonly compatibilityVersion: StarsCompatibilityVersion;\n}\n\nexport const LEGACY_COMPATIBILITY_VERSION = 3;\nexport const LATEST_COMPATIBILITY_VERSION = 5;\n/** The version a project without `future.compatibilityVersion` runs on: today, the latest one. */\nexport const DEFAULT_COMPATIBILITY_VERSION = 5;\n/** Versions still accepted but scheduled for removal in the next major. */\nexport const EOL_COMPATIBILITY_VERSIONS: ReadonlySet<number> = new Set([LEGACY_COMPATIBILITY_VERSION]);\n/** From this version on, `tsdown` is configured from `stars.config` alone and auto imports are on by default. */\nexport const STARS_CONFIG_TSDOWN_VERSION = 4;\n/** From this version on, `env` is registered automatically in the built entry. */\nexport const AUTO_ENV_VERSION = 5;\n\nconst COMPATIBILITY_VERSIONS = new Set<number>([LEGACY_COMPATIBILITY_VERSION, STARS_CONFIG_TSDOWN_VERSION, AUTO_ENV_VERSION]);\n\n/**\n * Resolves the Nuxt-style compatibility block. Version 5 is the default and version 4 remains supported. Version 3 is\n * end-of-life: it still resolves, with a warning pushed to `warnings`, and is removed in the next major.\n *\n * New behaviour is gated by a named version constant (such as {@link AUTO_ENV_VERSION}), never by\n * {@link LATEST_COMPATIBILITY_VERSION}: bumping the latest version must not move older versions onto other defaults.\n */\nexport function resolveFuture(config: StarsFutureConfig, validator: Validator, warnings: Diagnostic[]): ResolvedFutureConfig {\n\tif (config === null || typeof config !== 'object' || Array.isArray(config)) {\n\t\tthrow validator.typeError('future', 'an object', config, 'Use `{ compatibilityVersion }`.');\n\t}\n\n\tvalidator.knownKeys(config, 'future', ['compatibilityVersion']);\n\tconst version = config.compatibilityVersion;\n\tif (version === undefined) return { compatibilityVersion: DEFAULT_COMPATIBILITY_VERSION };\n\n\tif (typeof version !== 'number' || !COMPATIBILITY_VERSIONS.has(version)) {\n\t\tthrow validator.error(configDiagnostics.INVALID_COMPATIBILITY_VERSION, {\n\t\t\tvalue: version,\n\t\t\tsupported: [...COMPATIBILITY_VERSIONS].join(', '),\n\t\t\tlatestVersion: LATEST_COMPATIBILITY_VERSION\n\t\t});\n\t}\n\n\tif (EOL_COMPATIBILITY_VERSIONS.has(version)) {\n\t\twarnings.push(validator.error(configDiagnostics.COMPATIBILITY_VERSION_EOL, { version, latestVersion: LATEST_COMPATIBILITY_VERSION }));\n\t}\n\n\treturn { compatibilityVersion: version as StarsCompatibilityVersion };\n}\n","import type { StarsConfig, StarsEnvSetupOptions } from '../types/config.js';\nimport { AUTO_ENV_VERSION, type ResolvedFutureConfig } from './compatibility.js';\nimport { configDiagnostics } from './errors.js';\nimport { hasDependency, type PackageJsonLike, type ResolvedExperimentalConfig } from './resolve.js';\nimport type { Validator } from './validator.js';\n\nexport interface ResolvedEnvConfig {\n\t/** Whether the built entry registers the environment before any other module. */\n\treadonly enabled: boolean;\n\t/** The options handed to `setup()` from `@wolfstar/env-utilities`, as written by the user. */\n\treadonly options: Readonly<StarsEnvSetupOptions>;\n}\n\nconst ENV_UTILITIES = '@wolfstar/env-utilities';\nconst LOADERS = new Set(['dotenv', 'varlock']);\n\n/**\n * Resolves the `env` block. It is on by default from {@link AUTO_ENV_VERSION} on, but only when the project depends on\n * `@wolfstar/env-utilities` (the module the built entry imports) and does not build through Nitro, whose serverless\n * presets have no `.env` files to load. `true`, `enabled: true` or any option at all is an explicit opt-in, which\n * does require the dependency.\n */\nexport function resolveEnv(\n\tconfig: StarsConfig['env'],\n\tpackageJson: PackageJsonLike | null,\n\tfuture: ResolvedFutureConfig,\n\texperimental: ResolvedExperimentalConfig,\n\tvalidator: Validator\n): ResolvedEnvConfig {\n\tif (config === false) return { enabled: false, options: {} };\n\n\tconst forcedOn = config === true;\n\tconst raw = forcedOn || config === undefined ? {} : config;\n\tif (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {\n\t\tthrow validator.typeError(\n\t\t\t'env',\n\t\t\t'an object, `true` or `false`',\n\t\t\traw,\n\t\t\t'Use `{ path, env, prefix, loader, debug, encoding }`, `true` to enable with defaults, or `false` to disable.'\n\t\t);\n\t}\n\n\tvalidator.knownKeys(raw, 'env', ['enabled', 'path', 'env', 'prefix', 'loader', 'debug', 'encoding']);\n\n\tconst options: StarsEnvSetupOptions = {};\n\tconst path = validator.string(raw.path, 'env.path');\n\tif (path !== undefined) options.path = path;\n\tconst env = validator.string(raw.env, 'env.env');\n\tif (env !== undefined) options.env = env;\n\tconst prefix = validator.string(raw.prefix, 'env.prefix');\n\tif (prefix !== undefined) options.prefix = prefix;\n\tconst loader = validator.string(raw.loader, 'env.loader');\n\tif (loader !== undefined) {\n\t\tif (!LOADERS.has(loader)) throw validator.typeError('env.loader', \"'dotenv' or 'varlock'\", loader, \"Use 'dotenv' (default) or 'varlock'.\");\n\t\toptions.loader = loader as NonNullable<StarsEnvSetupOptions['loader']>;\n\t}\n\tconst debug = validator.boolean(raw.debug, 'env.debug');\n\tif (debug !== undefined) options.debug = debug;\n\tconst encoding = validator.string(raw.encoding, 'env.encoding');\n\tif (encoding !== undefined) options.encoding = encoding;\n\n\tconst enabled = validator.boolean(raw.enabled, 'env.enabled');\n\tif (enabled === false) return { enabled: false, options };\n\n\tconst installed = hasDependency(packageJson, ENV_UTILITIES);\n\tconst explicit = forcedOn || enabled === true || Object.keys(options).length > 0;\n\tif (explicit && !installed) throw validator.error(configDiagnostics.ENV_REQUIRES_ENV_UTILITIES, {});\n\n\tconst enabledByDefault = installed && future.compatibilityVersion >= AUTO_ENV_VERSION && !experimental.enableNitro;\n\treturn { enabled: explicit || enabledByDefault, options };\n}\n","import type { StarsHookName, StarsHooks, StarsHooksConfig } from '../types/hooks.js';\nimport { configDiagnostics } from './errors.js';\nimport type { Validator } from './validator.js';\n\ntype AnyHook = StarsHooks[StarsHookName];\n\n/** Every hook of `stars.config`, flattened to its full name, with its callbacks in declaration order. */\nexport type ResolvedHooksConfig = Readonly<Partial<Record<StarsHookName, readonly AnyHook[]>>>;\n\nexport const STARS_HOOK_NAMES = [\n\t'config:resolved',\n\t'env:options',\n\t'prepare:before',\n\t'prepare:done',\n\t'builder:created',\n\t'tsdown:options',\n\t'build:before',\n\t'build:done',\n\t'dev:start',\n\t'dev:restart',\n\t'dev:close'\n] as const satisfies readonly StarsHookName[];\n\nconst KNOWN = new Set<string>(STARS_HOOK_NAMES);\n\n/**\n * Flattens and validates `hooks`. `hookable`'s own `flatHooks` is not used: it would split an array of callbacks into\n * `name:0`, `name:1` and silently drop anything that is not a function, while a typo in a hook name here should fail\n * loudly rather than register a hook that never runs.\n */\nexport function resolveHooks(config: StarsHooksConfig | undefined, validator: Validator): ResolvedHooksConfig {\n\tif (config === undefined) return {};\n\n\tconst resolved: Partial<Record<StarsHookName, AnyHook[]>> = {};\n\tconst visit = (value: unknown, path: string): void => {\n\t\tif (value === null || typeof value !== 'object' || Array.isArray(value)) {\n\t\t\tthrow validator.typeError(\n\t\t\t\tpath ? `hooks.${path}` : 'hooks',\n\t\t\t\t'an object',\n\t\t\t\tvalue,\n\t\t\t\t\"Use `{ 'build:done'() {} }` or `{ build: { done() {} } }`.\"\n\t\t\t);\n\t\t}\n\n\t\tfor (const [key, entry] of Object.entries(value)) {\n\t\t\tconst name = path ? `${path}:${key}` : key;\n\t\t\tif (entry !== null && typeof entry === 'object' && !Array.isArray(entry)) {\n\t\t\t\tvisit(entry, name);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!KNOWN.has(name)) throw validator.error(configDiagnostics.UNKNOWN_HOOK, { name, known: STARS_HOOK_NAMES.join(', ') });\n\n\t\t\tconst callbacks: unknown[] = Array.isArray(entry) ? entry : [entry];\n\t\t\tfor (const callback of callbacks) {\n\t\t\t\tif (typeof callback !== 'function') {\n\t\t\t\t\tthrow validator.typeError(`hooks.${name}`, 'a function or an array of functions', callback, 'Pass a function.');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t(resolved[name as StarsHookName] ??= []).push(...(callbacks as AnyHook[]));\n\t\t}\n\t};\n\n\tvisit(config, '');\n\treturn resolved;\n}\n","import type { ResolvedModuleEntry } from '../types/modules.js';\nimport type { Validator } from './validator.js';\n\nconst FIX =\n\t\"Use a package name, or `[name, options]` to pass options: `modules: ['@wolfstar/plugin-cache', ['@wolfstar/plugin-gateway', { shards: 2 }]]`.\";\n\n/** Normalises `modules`: falsy entries are dropped, a bare specifier gets empty options. */\nexport function resolveModules(config: unknown, validator: Validator): readonly ResolvedModuleEntry[] {\n\tif (config === undefined) return [];\n\tif (!Array.isArray(config)) throw validator.typeError('modules', 'an array', config, FIX);\n\n\tconst resolved: ResolvedModuleEntry[] = [];\n\tfor (const [index, entry] of (config as unknown[]).entries()) {\n\t\tif (!entry) continue;\n\t\tconst path = `modules[${index}]`;\n\n\t\tif (typeof entry === 'string') {\n\t\t\tif (entry.length === 0) throw validator.typeError(path, 'a non-empty module specifier', entry, FIX);\n\t\t\tresolved.push({ specifier: entry, options: {} });\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!Array.isArray(entry)) throw validator.typeError(path, 'a module specifier or a `[specifier, options]` tuple', entry, FIX);\n\n\t\tif (entry.length > 2) {\n\t\t\tthrow validator.typeError(path, 'a `[specifier, options]` tuple with at most two members', entry, FIX);\n\t\t}\n\n\t\tconst [specifier, options] = entry as [unknown, unknown?];\n\t\tif (typeof specifier !== 'string' || specifier.length === 0) {\n\t\t\tthrow validator.typeError(`${path}[0]`, 'a non-empty module specifier', specifier, FIX);\n\t\t}\n\n\t\tif (options !== undefined && (options === null || typeof options !== 'object' || Array.isArray(options))) {\n\t\t\tthrow validator.typeError(`${path}[1]`, 'an object', options, FIX);\n\t\t}\n\n\t\tresolved.push({ specifier, options: (options as Record<string, unknown> | undefined) ?? {} });\n\t}\n\n\treturn resolved;\n}\n","import type { Diagnostic } from 'nostics';\nimport { configDiagnostics } from './errors.js';\n\n/** Validates raw `stars.config` values, throwing a `configDiagnostics` diagnostic grounded in the configuration file. */\nexport class Validator {\n\tpublic constructor(private readonly file: string | null) {}\n\n\tprivate get sources(): string[] | undefined {\n\t\treturn this.file ? [this.file] : undefined;\n\t}\n\n\tpublic error<Handle extends (params: any) => Diagnostic>(handle: Handle, params: Parameters<Handle>[0]): Diagnostic {\n\t\treturn handle({ ...params, sources: this.sources });\n\t}\n\n\tpublic knownKeys(value: object, path: string, keys: readonly string[]): void {\n\t\tfor (const key of Object.keys(value)) {\n\t\t\tif (keys.includes(key)) continue;\n\t\t\tconst fullPath = path ? `${path}.${key}` : key;\n\t\t\tthrow this.error(configDiagnostics.UNKNOWN_OPTION, { path: fullPath, parent: path, known: keys.join(', ') });\n\t\t}\n\t}\n\n\tpublic string(value: unknown, path: string): string | undefined {\n\t\tif (value === undefined) return undefined;\n\t\tif (typeof value !== 'string' || value.length === 0) throw this.typeError(path, 'a non-empty string', value);\n\t\treturn value;\n\t}\n\n\tpublic boolean(value: unknown, path: string): boolean | undefined {\n\t\tif (value === undefined) return undefined;\n\t\tif (typeof value !== 'boolean') throw this.typeError(path, 'a boolean', value);\n\t\treturn value;\n\t}\n\n\t/** A plain object passed through as-is (e.g. raw `vite`/`tsdown` config merged into the project's own). */\n\tpublic plainObject(value: unknown, path: string): Record<string, unknown> | undefined {\n\t\tif (value === undefined) return undefined;\n\t\tif (value === null || typeof value !== 'object' || Array.isArray(value)) throw this.typeError(path, 'an object', value);\n\t\treturn value as Record<string, unknown>;\n\t}\n\n\tpublic stringArray(value: unknown, path: string): string[] | undefined {\n\t\tif (value === undefined) return undefined;\n\t\tif (!Array.isArray(value) || !value.every((item) => typeof item === 'string')) throw this.typeError(path, 'an array of strings', value);\n\t\treturn value;\n\t}\n\n\tpublic nonNegativeNumber(value: unknown, path: string): number | undefined {\n\t\tif (value === undefined) return undefined;\n\t\tif (typeof value !== 'number' || !Number.isFinite(value) || value < 0) throw this.typeError(path, 'a non-negative number', value);\n\t\treturn value;\n\t}\n\n\tpublic stringRecord(value: unknown, path: string): Record<string, string> | undefined {\n\t\tif (value === undefined) return undefined;\n\t\tif (value === null || typeof value !== 'object' || Array.isArray(value) || !Object.values(value).every((item) => typeof item === 'string')) {\n\t\t\tthrow this.typeError(path, 'an object of string values', value);\n\t\t}\n\t\treturn value as Record<string, string>;\n\t}\n\n\t/** A generic \"wrong type\" diagnostic. `fix` defaults to the standard \"set it or remove it\" wording. */\n\tpublic typeError(path: string, expected: string, value: unknown, fix?: string): Diagnostic {\n\t\treturn this.error(configDiagnostics.INVALID_TYPE, {\n\t\t\tpath,\n\t\t\texpected,\n\t\t\tvalue,\n\t\t\tfix: fix ?? `Set \\`${path}\\` to ${expected} or remove it to use the default.`\n\t\t});\n\t}\n}\n","import { existsSync, readFileSync, statSync } from 'node:fs';\nimport { basename, dirname, extname, isAbsolute, join, relative, resolve } from 'node:path';\nimport type { Diagnostic } from 'nostics';\nimport type {\n\tStarsBuildTool,\n\tStarsConfig,\n\tStarsDevConfig,\n\tStarsEnvSetupOptions,\n\tStarsExperimentalConfig,\n\tStarsTypechecker\n} from '../types/config.js';\nimport { EMPTY_MODULES_RUNTIME, type ModulesRuntime, type ResolvedModuleEntry } from '../types/modules.js';\nimport { LEGACY_COMPATIBILITY_VERSION, STARS_CONFIG_TSDOWN_VERSION, resolveFuture, type ResolvedFutureConfig } from './compatibility.js';\nimport { resolveEnv, type ResolvedEnvConfig } from './env.js';\nimport { configDiagnostics } from './errors.js';\nimport { resolveHooks, type ResolvedHooksConfig } from './hooks.js';\nimport { resolveModules } from './modules.js';\nimport { Validator } from './validator.js';\n\nexport type { ResolvedFutureConfig } from './compatibility.js';\n\nexport interface PackageJsonLike {\n\tname?: string;\n\t/** `tsdown` reads its options from here as well as from a `tsdown.config.*`. */\n\ttsdown?: unknown;\n\tversion?: string;\n\tmain?: string;\n\ttype?: string;\n\tscripts?: Record<string, string>;\n\tdependencies?: Record<string, string>;\n\tdevDependencies?: Record<string, string>;\n}\n\nexport interface ResolvedBuildConfig {\n\treadonly tool: StarsBuildTool;\n\t/** Absolute output directory. */\n\treadonly outDir: string;\n\t/** Absolute `tsconfig.json` used by `tsc`, `null` for the other tools. */\n\treadonly tsconfig: string | null;\n\t/** Absolute path of the file `node` runs, i.e. the built entry (or the entry itself when `tool` is `none`). */\n\treadonly output: string;\n\t/**\n\t * Absolute path of the build tool's own configuration file (`tsdown.config.*`, `vite.config.*`), `null` when the\n\t * tool has none — which is always the case for `tsdown` from `future.compatibilityVersion` 4 on, where the build is\n\t * configured from `stars.config` alone.\n\t */\n\treadonly configFile: string | null;\n}\n\nexport interface ResolvedTypecheckConfig {\n\treadonly enabled: boolean;\n\t/** Absolute `tsconfig.json` the type checker runs against, `null` when it could not be found. */\n\treadonly tsconfig: string | null;\n\t/** The type checker to run, with `'auto'` already resolved. */\n\treadonly checker: StarsTypechecker;\n}\n\nexport type ResolvedTunnelConfig =\n\t| { readonly mode: 'off' }\n\t/** A `cloudflared` quick tunnel, whose hostname is only known once it is up. */\n\t| { readonly mode: 'quick'; readonly path: string; readonly updateEndpoint: boolean }\n\t/** An https URL the user already serves. */\n\t| { readonly mode: 'url'; readonly url: string; readonly path: string; readonly updateEndpoint: boolean };\n\nexport interface ResolvedDevConfig {\n\treadonly banner: readonly string[] | false | null;\n\treadonly watch: readonly string[];\n\treadonly ignore: readonly string[];\n\treadonly debounce: number;\n\treadonly env: Readonly<Record<string, string>>;\n\treadonly nodeArgs: readonly string[];\n\treadonly args: readonly string[];\n\treadonly url: string | null;\n\treadonly health: string | null;\n\treadonly killTimeout: number;\n\treadonly typecheck: ResolvedTypecheckConfig;\n\treadonly tunnel: ResolvedTunnelConfig;\n\t/** Absolute path of the file the dev session's logs are mirrored into, `null` when disabled. */\n\treadonly logFile: string | null;\n}\n\nexport interface ResolvedNitroConfig {\n\treadonly [option: string]: unknown;\n\treadonly preset: string;\n}\n\nexport interface ResolvedExperimentalConfig {\n\treadonly enableVite: boolean;\n\treadonly enableExternalVite: boolean;\n\treadonly enableNitro: boolean;\n\treadonly nitro: ResolvedNitroConfig;\n}\n\nexport interface ResolvedImportsConfig {\n\treadonly enabled: boolean;\n\t/** Directory glob patterns, relative to the project root (the way `unimport` scans them). */\n\treadonly dirs: readonly string[];\n\treadonly presets: readonly string[];\n\treadonly exclude: readonly string[];\n\t/** Absolute path of the generated declaration file. */\n\treadonly dts: string;\n}\n\nexport interface ResolvedI18nCodegenConfig {\n\treadonly locales: string;\n\treadonly output: string;\n}\n\nexport interface ResolvedCodegenConfig {\n\treadonly i18n: ResolvedI18nCodegenConfig | null;\n}\n\nexport interface ResolvedStarsConfig {\n\t/** Absolute path of the configuration file, `null` when running on defaults. */\n\treadonly configFile: string | null;\n\t/** The directory the CLI was invoked from. */\n\treadonly cwd: string;\n\t/** Absolute project root. */\n\treadonly root: string;\n\treadonly packageJson: PackageJsonLike | null;\n\t/** Absolute source entry. */\n\treadonly entry: string;\n\treadonly build: ResolvedBuildConfig;\n\treadonly dev: ResolvedDevConfig;\n\treadonly codegen: ResolvedCodegenConfig;\n\treadonly imports: ResolvedImportsConfig;\n\treadonly env: ResolvedEnvConfig;\n\t/** The `hooks` block, flattened to full hook names (`build:done`). */\n\treadonly hooks: ResolvedHooksConfig;\n\t/** The `modules` block, normalised. */\n\treadonly modules: readonly ResolvedModuleEntry[];\n\t/** What the installed modules contributed. Empty until the CLI ran their `setup`. */\n\treadonly runtime: ModulesRuntime;\n\treadonly experimental: ResolvedExperimentalConfig;\n\treadonly future: ResolvedFutureConfig;\n\t/** Raw options merged into `vite.config.*`. */\n\treadonly vite: Readonly<Record<string, unknown>>;\n\t/** The `tsdown` build's options: merged over `tsdown.config.*` at compatibility version 3, the whole build from 4 on. */\n\treadonly tsdown: Readonly<Record<string, unknown>>;\n\t/** Non-fatal diagnostics (e.g. an end-of-life compatibility version), for the host to report. */\n\treadonly warnings: readonly Diagnostic[];\n}\n\nexport interface ResolveConfigOptions {\n\tcwd: string;\n\tconfigFile: string | null;\n\tconfig: StarsConfig;\n\tenv?: NodeJS.ProcessEnv;\n\t/**\n\t * The variables the bot will load, when the host resolved them itself (e.g. through `varlock load`). Used instead\n\t * of the project's env files for the defaults read from them, such as the `dev.url` port.\n\t */\n\tprojectEnv?: Readonly<Record<string, string>>;\n}\n\nexport const DEFAULT_ENTRIES = ['src/main.ts', 'src/main.js', 'src/index.ts', 'src/index.js'] as const;\nexport const DEFAULT_IGNORE = ['**/node_modules/**', '**/dist/**', '**/.git/**'] as const;\nexport const DEFAULT_DEBOUNCE = 150;\nexport const DEFAULT_KILL_TIMEOUT = 5000;\nexport const DEFAULT_NODE_ARGS = ['--enable-source-maps'] as const;\nexport const DEFAULT_DEV_PORT = 3000;\nexport const DEFAULT_I18N_LOCALES = 'src/locales/en-US';\nexport const DEFAULT_I18N_OUTPUT = 'src/@types/i18next.d.ts';\nexport const DEFAULT_IMPORTS_DIRS = ['src/lib/**', 'src/utils/**'] as const;\nexport const DEFAULT_IMPORTS_PRESETS = ['@wolfstar/http-framework', '@wolfstar/decorators', '@wolfstar/env-utilities'] as const;\nexport const DEFAULT_IMPORTS_DTS = '.stars/imports.d.ts';\nexport const DEFAULT_DEV_LOG_FILE = '.stars/dev.log';\nexport const DEFAULT_TUNNEL_PATH = '/';\n\nconst BUILD_TOOLS = new Set<string>(['tsdown', 'tsc', 'none', 'vite', 'auto']);\nconst TYPECHECKERS = new Set<string>(['tsc', 'golar', 'tsz', 'auto']);\nconst VITE_CONFIG_FILES = ['vite.config.ts', 'vite.config.mts', 'vite.config.cts', 'vite.config.js', 'vite.config.mjs', 'vite.config.cjs'];\nconst TSDOWN_CONFIG_FILES = [\n\t'tsdown.config.ts',\n\t'tsdown.config.mts',\n\t'tsdown.config.cts',\n\t'tsdown.config.js',\n\t'tsdown.config.mjs',\n\t'tsdown.config.cjs',\n\t'tsdown.config.json'\n];\nconst TYPESCRIPT_EXTENSIONS = new Set(['.ts', '.mts', '.cts']);\n\n/**\n * Applies defaults, validates every option and resolves all paths to absolute ones.\n *\n * @throws {Diagnostic} (from `nostics`, via {@link configDiagnostics}) with an actionable `fix` on the first invalid option.\n */\nexport function resolveStarsConfig(options: ResolveConfigOptions): ResolvedStarsConfig {\n\tconst cwd = resolve(options.cwd);\n\tconst env = options.env ?? process.env;\n\tconst file = options.configFile;\n\tconst config = options.config;\n\tconst validator = new Validator(file);\n\tconst warnings: Diagnostic[] = [];\n\n\tvalidator.knownKeys(config, '', [\n\t\t'root',\n\t\t'entry',\n\t\t'build',\n\t\t'dev',\n\t\t'codegen',\n\t\t'imports',\n\t\t'env',\n\t\t'hooks',\n\t\t'modules',\n\t\t'experimental',\n\t\t'future',\n\t\t'vite',\n\t\t'tsdown'\n\t]);\n\tconst baseDirectory = file ? dirname(file) : cwd;\n\n\tconst root = resolve(baseDirectory, validator.string(config.root, 'root') ?? '.');\n\tif (!isDirectory(root)) {\n\t\tthrow validator.error(configDiagnostics.ROOT_NOT_FOUND, { root });\n\t}\n\n\tconst packageJson = readPackageJson(root, validator);\n\tconst experimental = resolveExperimental(config.experimental ?? {}, validator);\n\tconst future = resolveFuture(config.future ?? {}, validator, warnings);\n\tconst entry = resolveEntry(root, validator.string(config.entry, 'entry'), validator);\n\t// The tool-specific blocks are read before the build so a project that only declares `tsdown: {}` still resolves\n\t// `build.tool: 'auto'` to `tsdown`: configuring a tool is as clear a signal as depending on it.\n\tconst vite = validator.plainObject(config.vite, 'vite') ?? {};\n\tconst tsdown = validator.plainObject(config.tsdown, 'tsdown') ?? {};\n\tconst build = resolveBuild(root, entry, packageJson, config.build ?? {}, experimental, future, Object.keys(tsdown).length > 0, validator);\n\tconst hooks = resolveHooks(config.hooks, validator);\n\tconst modules = resolveModules(config.modules, validator);\n\tconst envConfig = resolveEnv(config.env, packageJson, future, experimental, validator);\n\tconst dev = resolveDev(root, entry, packageJson, config.dev ?? {}, env, envConfig.options, options.projectEnv, validator);\n\tconst codegen = resolveCodegen(root, config.codegen ?? {}, validator);\n\tconst imports = resolveImports(root, build.tool, future, config.imports, validator);\n\n\tif (Object.keys(tsdown).length > 0 && build.tool !== 'tsdown') {\n\t\tthrow validator.error(configDiagnostics.TSDOWN_OPTIONS_REQUIRE_TSDOWN, { tool: build.tool });\n\t}\n\n\tif (Object.keys(vite).length > 0 && build.tool !== 'vite') {\n\t\tthrow validator.error(configDiagnostics.VITE_OPTIONS_REQUIRE_VITE, { tool: build.tool });\n\t}\n\n\treturn {\n\t\tconfigFile: file,\n\t\tcwd,\n\t\troot,\n\t\tpackageJson,\n\t\tentry,\n\t\tbuild,\n\t\tdev,\n\t\tcodegen,\n\t\timports,\n\t\tenv: envConfig,\n\t\thooks,\n\t\tmodules,\n\t\truntime: EMPTY_MODULES_RUNTIME,\n\t\texperimental,\n\t\tfuture,\n\t\tvite,\n\t\ttsdown,\n\t\twarnings\n\t};\n}\n\n/**\n * Presents an absolute path relative to `root` when possible, for display purposes.\n */\nexport function displayPath(root: string, path: string): string {\n\tconst rel = relative(root, path);\n\tif (!rel) return '.';\n\treturn rel.startsWith('..') || isAbsolute(rel) ? path : rel;\n}\n\nfunction resolveEntry(root: string, configured: string | undefined, validator: Validator): string {\n\tif (configured !== undefined) {\n\t\tconst entry = resolve(root, configured);\n\t\tif (!isFile(entry)) {\n\t\t\tthrow validator.error(configDiagnostics.ENTRY_NOT_FOUND, { entry });\n\t\t}\n\t\treturn entry;\n\t}\n\n\tfor (const candidate of DEFAULT_ENTRIES) {\n\t\tconst entry = join(root, candidate);\n\t\tif (isFile(entry)) return entry;\n\t}\n\n\tthrow validator.error(configDiagnostics.ENTRY_DEFAULT_NOT_FOUND, { root, defaults: DEFAULT_ENTRIES.join(', ') });\n}\n\nfunction resolveBuild(\n\troot: string,\n\tentry: string,\n\tpackageJson: PackageJsonLike | null,\n\tconfig: NonNullable<StarsConfig['build']>,\n\texperimental: ResolvedExperimentalConfig,\n\tfuture: ResolvedFutureConfig,\n\thasTsdownOptions: boolean,\n\tvalidator: Validator\n): ResolvedBuildConfig {\n\tvalidator.knownKeys(config, 'build', ['tool', 'outDir', 'tsconfig']);\n\n\tconst requested = validator.string(config.tool, 'build.tool') ?? 'auto';\n\tif (!BUILD_TOOLS.has(requested)) {\n\t\tthrow validator.error(configDiagnostics.INVALID_BUILD_TOOL, { tool: requested });\n\t}\n\n\tif (requested === 'vite' && !experimental.enableVite) {\n\t\tthrow validator.error(configDiagnostics.EXPERIMENTAL_BUILD_TOOL, { tool: 'vite', flag: 'experimental.enableVite' });\n\t}\n\n\tconst isTypeScriptEntry = TYPESCRIPT_EXTENSIONS.has(extname(entry));\n\tconst tool: StarsBuildTool =\n\t\trequested === 'auto'\n\t\t\t? detectBuildTool(root, packageJson, isTypeScriptEntry, experimental, future, hasTsdownOptions)\n\t\t\t: (requested as StarsBuildTool);\n\n\tif (tool === 'none' && isTypeScriptEntry) {\n\t\tthrow validator.error(configDiagnostics.BUILD_TOOL_REQUIRED, { entry: displayPath(root, entry) });\n\t}\n\n\t// Nitro owns its own output layout; anything else keeps the plain `dist` convention.\n\tconst defaultOutDir = experimental.enableNitro ? '.output' : 'dist';\n\tconst outDir = resolve(root, validator.string(config.outDir, 'build.outDir') ?? defaultOutDir);\n\n\tlet tsconfig: string | null = null;\n\tconst configuredTsconfig = validator.string(config.tsconfig, 'build.tsconfig');\n\tif (configuredTsconfig !== undefined) {\n\t\ttsconfig = resolve(root, configuredTsconfig);\n\t\tif (!isFile(tsconfig)) {\n\t\t\tthrow validator.error(configDiagnostics.TSCONFIG_EXPLICIT_NOT_FOUND, { tsconfig, path: 'build.tsconfig' });\n\t\t}\n\t} else if (tool === 'tsc' || tool === 'tsdown') {\n\t\t// `tsdown` only looks for a `tsconfig.json` next to the project root, so a bot keeping its sources' one in\n\t\t// `src/` (the layout both the scaffold and the examples use) would silently build without its paths and\n\t\t// target. Resolving it here is what makes the `tsdown` build need no configuration of its own.\n\t\ttsconfig = [join(root, 'src', 'tsconfig.json'), join(root, 'tsconfig.json')].find((candidate) => isFile(candidate)) ?? null;\n\t\tif (!tsconfig && tool === 'tsc') {\n\t\t\tthrow validator.error(configDiagnostics.TSCONFIG_NOT_FOUND, { root, suggestion: 'build.tsconfig' });\n\t\t}\n\t}\n\n\t// Nitro always writes its server entry to `<outDir>/server/index.mjs`, regardless of the project's own entry\n\t// file name or `package.json#main` — it is Nitro's output, not a build of the project's own entry file.\n\tconst output = experimental.enableNitro\n\t\t? join(outDir, 'server', 'index.mjs')\n\t\t: tool === 'none'\n\t\t\t? entry\n\t\t\t: resolveBuildOutput(root, entry, outDir, packageJson);\n\n\tlet configFile = findConfigFile(root, tool === 'tsdown' ? TSDOWN_CONFIG_FILES : tool === 'vite' ? VITE_CONFIG_FILES : []);\n\t// `tsdown` reads `package.json#tsdown` when no configuration file is around, so it counts as one here.\n\tif (tool === 'tsdown' && configFile === null && packageJson?.tsdown !== undefined) configFile = join(root, 'package.json');\n\n\t// Compatibility version 4 builds `tsdown` from this file alone. A `tsdown.config.*` left behind would keep the\n\t// plugins and entry points it declares out of the build, so it is reported rather than quietly ignored.\n\tif (tool === 'tsdown' && configFile !== null && future.compatibilityVersion >= STARS_CONFIG_TSDOWN_VERSION) {\n\t\tthrow validator.error(configDiagnostics.TSDOWN_CONFIG_FILE_UNSUPPORTED, {\n\t\t\tfile: displayPath(root, configFile),\n\t\t\tversion: future.compatibilityVersion,\n\t\t\tlegacyVersion: LEGACY_COMPATIBILITY_VERSION\n\t\t});\n\t}\n\n\treturn { tool, outDir, tsconfig, output, configFile };\n}\n\nfunction findConfigFile(root: string, names: readonly string[]): string | null {\n\tfor (const name of names) {\n\t\tconst candidate = join(root, name);\n\t\tif (isFile(candidate)) return candidate;\n\t}\n\n\treturn null;\n}\n\nfunction detectBuildTool(\n\troot: string,\n\tpackageJson: PackageJsonLike | null,\n\tisTypeScriptEntry: boolean,\n\texperimental: ResolvedExperimentalConfig,\n\tfuture: ResolvedFutureConfig,\n\thasTsdownOptions: boolean\n): StarsBuildTool {\n\t// Vite only wins the detection once the project opted into it; without the flag a `vite.config.*` is somebody\n\t// else's (a dashboard, a docs site) and must not take the bot's build over.\n\tif (experimental.enableVite) {\n\t\tconst hasVite = VITE_CONFIG_FILES.some((name) => isFile(join(root, name))) || hasDependency(packageJson, 'vite');\n\t\tif (hasVite) return 'vite';\n\t}\n\n\tif (hasTsdownOptions) return 'tsdown';\n\n\t// From compatibility version 4 on, `tsdown` is the build of a TypeScript project rather than one of the options:\n\t// there is no `tsdown.config.*` left to detect it from, and a missing dependency is reported by the builder with\n\t// an install hint instead of silently falling back to `tsc`.\n\tif (future.compatibilityVersion >= STARS_CONFIG_TSDOWN_VERSION) return isTypeScriptEntry ? 'tsdown' : 'none';\n\n\tconst hasTsdown = TSDOWN_CONFIG_FILES.some((name) => isFile(join(root, name))) || hasDependency(packageJson, 'tsdown');\n\tif (hasTsdown) return 'tsdown';\n\tif (isTypeScriptEntry) return 'tsc';\n\treturn 'none';\n}\n\n/**\n * Resolves the `experimental` block. Every flag is a boolean defaulting to `false`, the way Nuxt's own experimental\n * flags are declared, and the ones that build on each other are checked here rather than surfacing later as a\n * confusing runtime failure.\n */\nfunction resolveExperimental(config: StarsExperimentalConfig, validator: Validator): ResolvedExperimentalConfig {\n\tif (config === null || typeof config !== 'object' || Array.isArray(config)) {\n\t\tthrow validator.typeError('experimental', 'an object', config, 'Use `{ enableVite, enableExternalVite, enableNitro, nitro }`.');\n\t}\n\n\tvalidator.knownKeys(config, 'experimental', ['enableVite', 'enableExternalVite', 'enableNitro', 'nitro']);\n\tconst enableVite = validator.boolean(config.enableVite, 'experimental.enableVite') ?? false;\n\tconst enableExternalVite = validator.boolean(config.enableExternalVite, 'experimental.enableExternalVite') ?? false;\n\tconst enableNitro = validator.boolean(config.enableNitro, 'experimental.enableNitro') ?? false;\n\n\tif (enableExternalVite && !enableVite) {\n\t\tthrow validator.error(configDiagnostics.EXPERIMENT_REQUIRED, {\n\t\t\tpath: 'experimental.enableExternalVite',\n\t\t\trequires: 'experimental.enableVite',\n\t\t\tdrop: 'enableExternalVite'\n\t\t});\n\t}\n\n\tif (enableNitro && !enableVite) {\n\t\tthrow validator.error(configDiagnostics.EXPERIMENT_REQUIRED, {\n\t\t\tpath: 'experimental.enableNitro',\n\t\t\trequires: 'experimental.enableVite',\n\t\t\tdrop: 'enableNitro'\n\t\t});\n\t}\n\n\tconst rawNitro = 'nitro' in config ? config.nitro : undefined;\n\tif (rawNitro !== undefined && !enableNitro) {\n\t\tthrow validator.error(configDiagnostics.EXPERIMENT_REQUIRED, {\n\t\t\tpath: 'experimental.nitro',\n\t\t\trequires: 'experimental.enableNitro',\n\t\t\tdrop: 'nitro'\n\t\t});\n\t}\n\tif (rawNitro !== undefined && (rawNitro === null || typeof rawNitro !== 'object' || Array.isArray(rawNitro))) {\n\t\tthrow validator.typeError('experimental.nitro', 'an object', rawNitro, 'Use `{ preset }`.');\n\t}\n\tconst preset = validator.string(rawNitro?.preset, 'experimental.nitro.preset') ?? 'node-server';\n\n\treturn { enableVite, enableExternalVite, enableNitro, nitro: { ...rawNitro, preset } };\n}\n\nfunction resolveBuildOutput(root: string, entry: string, outDir: string, packageJson: PackageJsonLike | null): string {\n\tif (packageJson?.main) return resolve(root, packageJson.main);\n\n\tconst extension = extname(entry);\n\tconst outputExtension = extension === '.mts' ? '.mjs' : extension === '.cts' ? '.cjs' : '.js';\n\treturn join(outDir, `${basename(entry, extension)}${outputExtension}`);\n}\n\nconst ENV_PORT_KEYS = ['HTTP_PORT', 'PORT'] as const;\n\n/**\n * Reads the project's environment layers from `src/.env*` and `.env*` into a plain object, the way `stars dev` and\n * `stars commands` need it:\n * these files are only loaded into `process.env` by the bot itself once it starts (see `@wolfstar/env-utilities`),\n * so by the time the CLI runs they are not there yet. This is a minimal line reader, not a full dotenv\n * implementation — quoting is stripped, but expansion (`dotenv-expand`) is not. Earlier files win, matching\n * dotenv's own precedence.\n */\nexport function readProjectEnvFiles(root: string, environment = 'development', options: { path?: string } = {}): Record<string, string> {\n\tconst result: Record<string, string> = {};\n\tconst suffixes = [`.${environment}.local`, ...(environment === 'test' ? [] : ['.local']), `.${environment}`, ''];\n\t// A custom `env.path` replaces both default locations, the way it does in `@wolfstar/env-utilities`.\n\tconst bases = options.path ? [options.path] : [join('src', '.env'), '.env'];\n\tconst files = suffixes.flatMap((suffix) => bases.map((base) => `${base}${suffix}`));\n\n\tfor (const file of files) {\n\t\t// `resolve`, not `join`: an absolute `env.path` is used as-is, as `@wolfstar/env-utilities` itself does.\n\t\tconst path = resolve(root, file);\n\t\tif (!isFile(path)) continue;\n\n\t\tlet contents: string;\n\t\ttry {\n\t\t\tcontents = readFileSync(path, 'utf-8');\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor (const line of contents.split(/\\r?\\n/)) {\n\t\t\tconst match = /^\\s*(?:export\\s+)?([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*(.*)$/.exec(line);\n\t\t\tif (!match) continue;\n\n\t\t\tconst key = match[1]!;\n\t\t\tif (key in result) continue;\n\t\t\tresult[key] = match[2]!.trim().replace(/^['\"]|['\"]$/g, '');\n\t\t}\n\t}\n\n\treturn result;\n}\n\nfunction readDevPortFromEnvFile(\n\troot: string,\n\tenvironment: string,\n\tenvOptions: Readonly<StarsEnvSetupOptions>,\n\tprojectEnv: Readonly<Record<string, string>> | undefined\n): string | null {\n\t// Varlock resolves its `.env.schema` on its own terms (and may pull values from elsewhere), so a dotenv file is\n\t// not what the bot loads: without the values the host resolved (`projectEnv`), there is nothing to read.\n\tif (projectEnv === undefined && envOptions.loader === 'varlock') return null;\n\n\tconst values = projectEnv ?? readProjectEnvFiles(root, environment, { path: envOptions.path });\n\tfor (const key of ENV_PORT_KEYS) {\n\t\tif (values[key]) return values[key];\n\t}\n\n\treturn null;\n}\n\nfunction resolveDev(\n\troot: string,\n\tentry: string,\n\tpackageJson: PackageJsonLike | null,\n\tconfig: NonNullable<StarsConfig['dev']>,\n\tenv: NodeJS.ProcessEnv,\n\tenvOptions: Readonly<StarsEnvSetupOptions>,\n\tprojectEnv: Readonly<Record<string, string>> | undefined,\n\tvalidator: Validator\n): ResolvedDevConfig {\n\tvalidator.knownKeys(config, 'dev', [\n\t\t'banner',\n\t\t'watch',\n\t\t'ignore',\n\t\t'debounce',\n\t\t'env',\n\t\t'nodeArgs',\n\t\t'args',\n\t\t'url',\n\t\t'health',\n\t\t'killTimeout',\n\t\t'typecheck',\n\t\t'tunnel',\n\t\t'logFile'\n\t]);\n\n\tconst watch = (validator.stringArray(config.watch, 'dev.watch') ?? [displayPath(root, dirname(entry))]).map((path) => resolve(root, path));\n\tconst ignore = validator.stringArray(config.ignore, 'dev.ignore') ?? [...DEFAULT_IGNORE];\n\tconst debounce = validator.nonNegativeNumber(config.debounce, 'dev.debounce') ?? DEFAULT_DEBOUNCE;\n\tconst devEnv = validator.stringRecord(config.env, 'dev.env') ?? {};\n\tconst nodeArgs = validator.stringArray(config.nodeArgs, 'dev.nodeArgs') ?? [...DEFAULT_NODE_ARGS];\n\tconst args = validator.stringArray(config.args, 'dev.args') ?? [];\n\tconst killTimeout = validator.nonNegativeNumber(config.killTimeout, 'dev.killTimeout') ?? DEFAULT_KILL_TIMEOUT;\n\tconst health = validator.string(config.health, 'dev.health') ?? null;\n\n\tlet url = validator.string(config.url, 'dev.url') ?? null;\n\tif (url !== null) {\n\t\ttry {\n\t\t\tnew URL(url);\n\t\t} catch {\n\t\t\tthrow validator.error(configDiagnostics.INVALID_URL, { url, fix: 'Use an absolute URL such as http://localhost:3000.' });\n\t\t}\n\t} else {\n\t\t// Mirrors Vite's and Nuxt's own dev servers: a URL is shown without any configuration. The exact host\n\t\t// (`localhost` vs `127.0.0.1`) is resolved at runtime by `stars dev`, once it knows which one is actually reachable.\n\t\tconst port =\n\t\t\tdevEnv.HTTP_PORT ??\n\t\t\tenv.HTTP_PORT ??\n\t\t\treadDevPortFromEnvFile(root, envOptions.env ?? env.NODE_ENV ?? 'development', envOptions, projectEnv) ??\n\t\t\tString(DEFAULT_DEV_PORT);\n\t\turl = /^\\d+$/.test(port) ? `http://localhost:${port}` : `http://localhost:${DEFAULT_DEV_PORT}`;\n\t}\n\n\tconst typecheck = resolveTypecheck(root, packageJson, config.typecheck, validator);\n\tconst tunnel = resolveTunnel(config.tunnel, validator);\n\tconst logFile = config.logFile === false ? null : resolve(root, validator.string(config.logFile, 'dev.logFile') ?? DEFAULT_DEV_LOG_FILE);\n\tconst banner =\n\t\tconfig.banner === false\n\t\t\t? false\n\t\t\t: typeof config.banner === 'string'\n\t\t\t\t? config.banner.split('\\n')\n\t\t\t\t: (validator.stringArray(config.banner, 'dev.banner') ?? null);\n\n\treturn { watch, ignore, debounce, env: devEnv, nodeArgs, args, url, health, killTimeout, typecheck, tunnel, logFile, banner };\n}\n\n/**\n * Resolves `dev.typecheck`. The tsconfig is looked up the same way the `tsc` build tool looks up its own, so a\n * project building with `tsdown` still gets `tsc --watch --noEmit` on the right project file.\n */\nfunction resolveTypecheck(\n\troot: string,\n\tpackageJson: PackageJsonLike | null,\n\tconfig: StarsDevConfig['typecheck'],\n\tvalidator: Validator\n): ResolvedTypecheckConfig {\n\tif (config === undefined || config === false) return { enabled: false, tsconfig: null, checker: detectTypechecker(packageJson) };\n\n\tlet configured: string | undefined;\n\tlet requestedChecker = 'auto';\n\tif (config !== true) {\n\t\tif (config === null || typeof config !== 'object' || Array.isArray(config)) {\n\t\t\tthrow validator.typeError(\n\t\t\t\t'dev.typecheck',\n\t\t\t\t'a boolean or an object',\n\t\t\t\tconfig,\n\t\t\t\t'Use `true` to type-check with the project tsconfig, `{ tsconfig }` to pick one, or `false` to disable it.'\n\t\t\t);\n\t\t}\n\n\t\tvalidator.knownKeys(config, 'dev.typecheck', ['tsconfig', 'checker']);\n\t\tconfigured = validator.string(config.tsconfig, 'dev.typecheck.tsconfig');\n\t\trequestedChecker = validator.string(config.checker, 'dev.typecheck.checker') ?? 'auto';\n\t\tif (!TYPECHECKERS.has(requestedChecker)) {\n\t\t\tthrow validator.error(configDiagnostics.INVALID_TYPECHECKER, { checker: requestedChecker });\n\t\t}\n\t}\n\n\tconst checker: StarsTypechecker = requestedChecker === 'auto' ? detectTypechecker(packageJson) : (requestedChecker as StarsTypechecker);\n\n\tif (configured !== undefined) {\n\t\tconst tsconfig = resolve(root, configured);\n\t\tif (!isFile(tsconfig)) {\n\t\t\tthrow validator.error(configDiagnostics.TSCONFIG_EXPLICIT_NOT_FOUND, { tsconfig, path: 'dev.typecheck.tsconfig' });\n\t\t}\n\t\treturn { enabled: true, tsconfig, checker };\n\t}\n\n\tconst found = [join(root, 'src', 'tsconfig.json'), join(root, 'tsconfig.json')].find((candidate) => isFile(candidate)) ?? null;\n\tif (!found) {\n\t\tthrow validator.error(configDiagnostics.TSCONFIG_NOT_FOUND, { root, suggestion: 'dev.typecheck.tsconfig' });\n\t}\n\n\treturn { enabled: true, tsconfig: found, checker };\n}\n\n/**\n * Picks the type checker when `dev.typecheck.checker` is `auto`: `golar` when the project already depends on it\n * (it wraps TypeScript and is what this repository's own `typecheck` scripts run), `tsc` otherwise. `tsz` is never\n * picked automatically — it is an early, tsc-compatible alternative a project opts into.\n */\nfunction detectTypechecker(packageJson: PackageJsonLike | null): StarsTypechecker {\n\treturn hasDependency(packageJson, 'golar') ? 'golar' : 'tsc';\n}\n\n/**\n * Resolves `dev.tunnel`: `true` (or `{}`) opens a `cloudflared` quick tunnel, a string (or `{ url }`) is an https\n * URL the user already serves and the CLI only checks.\n */\nfunction resolveTunnel(config: StarsDevConfig['tunnel'], validator: Validator): ResolvedTunnelConfig {\n\tif (config === undefined || config === false) return { mode: 'off' };\n\n\tlet url: string | undefined;\n\tlet updateEndpoint = false;\n\tlet path = DEFAULT_TUNNEL_PATH;\n\n\tif (typeof config === 'string') {\n\t\turl = config;\n\t} else if (config !== true) {\n\t\tif (config === null || typeof config !== 'object' || Array.isArray(config)) {\n\t\t\tthrow validator.typeError(\n\t\t\t\t'dev.tunnel',\n\t\t\t\t'a boolean, an https URL or an object',\n\t\t\t\tconfig,\n\t\t\t\t'Use `true` for a cloudflared quick tunnel, an https URL you already serve, or `false` to disable it.'\n\t\t\t);\n\t\t}\n\n\t\tvalidator.knownKeys(config, 'dev.tunnel', ['url', 'updateEndpoint', 'path']);\n\t\turl = validator.string(config.url, 'dev.tunnel.url');\n\t\tupdateEndpoint = validator.boolean(config.updateEndpoint, 'dev.tunnel.updateEndpoint') ?? false;\n\t\tpath = validator.string(config.path, 'dev.tunnel.path') ?? DEFAULT_TUNNEL_PATH;\n\t}\n\n\tif (url === undefined) return { mode: 'quick', path, updateEndpoint };\n\n\t// Discord only accepts an https interactions endpoint.\n\tlet parsed: URL;\n\ttry {\n\t\tparsed = new URL(url);\n\t} catch {\n\t\tthrow validator.error(configDiagnostics.INVALID_URL, { url, fix: 'Use an absolute https URL such as https://bot.example.com.' });\n\t}\n\n\tif (parsed.protocol !== 'https:') {\n\t\tthrow validator.error(configDiagnostics.TUNNEL_URL_NOT_HTTPS, { url });\n\t}\n\n\treturn { mode: 'url', url, path, updateEndpoint };\n}\n\nfunction resolveCodegen(root: string, config: NonNullable<StarsConfig['codegen']>, validator: Validator): ResolvedCodegenConfig {\n\tvalidator.knownKeys(config, 'codegen', ['i18n']);\n\n\tif (config.i18n === false) return { i18n: null };\n\n\tif (config.i18n === undefined) {\n\t\tconst locales = join(root, DEFAULT_I18N_LOCALES);\n\t\treturn { i18n: isDirectory(locales) ? { locales, output: join(root, DEFAULT_I18N_OUTPUT) } : null };\n\t}\n\n\tif (config.i18n === null || typeof config.i18n !== 'object') {\n\t\tthrow validator.typeError(\n\t\t\t'codegen.i18n',\n\t\t\t'an object or `false`',\n\t\t\tconfig.i18n,\n\t\t\t'Use `{ locales, output }` to configure it or `false` to disable it.'\n\t\t);\n\t}\n\n\tvalidator.knownKeys(config.i18n, 'codegen.i18n', ['locales', 'output']);\n\tconst locales = resolve(root, validator.string(config.i18n.locales, 'codegen.i18n.locales') ?? DEFAULT_I18N_LOCALES);\n\tif (!isDirectory(locales)) {\n\t\tthrow validator.error(configDiagnostics.LOCALES_NOT_FOUND, { locales });\n\t}\n\n\tconst output = resolve(root, validator.string(config.i18n.output, 'codegen.i18n.output') ?? DEFAULT_I18N_OUTPUT);\n\treturn { i18n: { locales, output } };\n}\n\n/**\n * The transform that injects auto imports (`@wolfstar/http-framework/auto-imports`) only runs through `tsdown`'s\n * rolldown pipeline, the same way Nuxt's own auto imports only run through its Vite/webpack build: `tsc` and `none`\n * have no transform step to hook into. `tsdown` is picked as `build.tool` first (see {@link detectBuildTool}) for the\n * same reason — it is the only tool this feature, and this build config in general, treats as the default choice.\n *\n * They are on by default from compatibility version 4 on, where `stars` wires the plugin into the build itself. At 3\n * the plugin is the project's to add, so defaulting them on would promise imports that never get injected.\n */\nfunction resolveImports(\n\troot: string,\n\tbuildTool: StarsBuildTool,\n\tfuture: ResolvedFutureConfig,\n\tconfig: StarsConfig['imports'],\n\tvalidator: Validator\n): ResolvedImportsConfig {\n\tconst defaultDirs = DEFAULT_IMPORTS_DIRS.map((dir) => resolve(root, dir));\n\tconst defaultPresets = [...DEFAULT_IMPORTS_PRESETS];\n\tconst defaultDts = resolve(root, DEFAULT_IMPORTS_DTS);\n\n\tif (config === false) {\n\t\treturn { enabled: false, dirs: defaultDirs, presets: defaultPresets, exclude: [], dts: defaultDts };\n\t}\n\n\tconst forcedOn = config === true;\n\tconst options = forcedOn || config === undefined ? {} : config;\n\tif (typeof options !== 'object' || options === null || Array.isArray(options)) {\n\t\tthrow validator.typeError(\n\t\t\t'imports',\n\t\t\t'an object, `true` or `false`',\n\t\t\toptions,\n\t\t\t'Use `{ dirs, presets, exclude, dts }`, `true` to enable with defaults, or `false` to disable.'\n\t\t);\n\t}\n\n\tvalidator.knownKeys(options, 'imports', ['enabled', 'dirs', 'presets', 'exclude', 'dts']);\n\n\tconst requestedOn = forcedOn || validator.boolean(options.enabled, 'imports.enabled');\n\tif (requestedOn && buildTool !== 'tsdown') {\n\t\tthrow validator.error(configDiagnostics.IMPORTS_REQUIRE_TSDOWN, {});\n\t}\n\n\tconst dirs = (validator.stringArray(options.dirs, 'imports.dirs') ?? [...DEFAULT_IMPORTS_DIRS]).map((dir) => resolve(root, dir));\n\tconst presets = validator.stringArray(options.presets, 'imports.presets') ?? defaultPresets;\n\tconst exclude = validator.stringArray(options.exclude, 'imports.exclude') ?? [];\n\tconst dts = resolve(root, validator.string(options.dts, 'imports.dts') ?? DEFAULT_IMPORTS_DTS);\n\n\tconst enabledByDefault = buildTool === 'tsdown' && future.compatibilityVersion >= STARS_CONFIG_TSDOWN_VERSION;\n\treturn { enabled: requestedOn ?? enabledByDefault, dirs, presets, exclude, dts };\n}\n\nexport function hasDependency(packageJson: PackageJsonLike | null, name: string): boolean {\n\treturn Boolean(packageJson?.dependencies?.[name] ?? packageJson?.devDependencies?.[name]);\n}\n\nfunction readPackageJson(root: string, validator: Validator): PackageJsonLike | null {\n\tconst file = join(root, 'package.json');\n\tif (!isFile(file)) return null;\n\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(readFileSync(file, 'utf-8'));\n\t\treturn parsed !== null && typeof parsed === 'object' ? (parsed as PackageJsonLike) : null;\n\t} catch (error) {\n\t\tthrow validator.error(configDiagnostics.PACKAGE_JSON_INVALID, {\n\t\t\tfile,\n\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\tcause: error\n\t\t});\n\t}\n}\n\nfunction isFile(path: string): boolean {\n\ttry {\n\t\treturn existsSync(path) && statSync(path).isFile();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction isDirectory(path: string): boolean {\n\ttry {\n\t\treturn existsSync(path) && statSync(path).isDirectory();\n\t} catch {\n\t\treturn false;\n\t}\n}\n","import { loadConfigFile } from './load.js';\nimport { resolveStarsConfig, type ResolvedStarsConfig } from './resolve.js';\n\nexport interface LoadStarsConfigOptions {\n\t/**\n\t * The directory to discover `stars.config.*` from.\n\t * @default process.cwd()\n\t */\n\tcwd?: string;\n\t/** An explicit configuration file, resolved from `cwd`. */\n\tconfigFile?: string | null;\n\t/**\n\t * Environment used for defaults such as `HTTP_PORT`.\n\t * @default process.env\n\t */\n\tenv?: NodeJS.ProcessEnv;\n}\n\n/**\n * Loads, validates and resolves a project's `stars.config.*`.\n *\n * @throws {Diagnostic} (from `nostics`, via {@link configDiagnostics}) when the configuration file cannot be loaded or contains an invalid option.\n */\nexport async function loadStarsConfig(options: LoadStarsConfigOptions = {}): Promise<ResolvedStarsConfig> {\n\tconst cwd = options.cwd ?? process.cwd();\n\tconst loaded = await loadConfigFile({ cwd, configFile: options.configFile });\n\treturn resolveStarsConfig({ cwd, configFile: loaded.configFile, config: loaded.config, env: options.env });\n}\n\nexport { CONFIG_EXTENSIONS, CONFIG_FILE_NAMES, discoverConfigFile, loadConfigFile } from './load.js';\nexport type { LoadConfigFileOptions, LoadedConfigFile } from './load.js';\nexport {\n\tAUTO_ENV_VERSION,\n\tDEFAULT_COMPATIBILITY_VERSION,\n\tEOL_COMPATIBILITY_VERSIONS,\n\tLATEST_COMPATIBILITY_VERSION,\n\tLEGACY_COMPATIBILITY_VERSION,\n\tSTARS_CONFIG_TSDOWN_VERSION\n} from './compatibility.js';\nexport { resolveEnv } from './env.js';\nexport type { ResolvedEnvConfig } from './env.js';\nexport { configDiagnostics } from './errors.js';\nexport { resolveHooks, STARS_HOOK_NAMES } from './hooks.js';\nexport type { ResolvedHooksConfig } from './hooks.js';\nexport type { ConfigDiagnosticCode } from './errors.js';\nexport { resolveModules } from './modules.js';\nexport { displayPath, readProjectEnvFiles, resolveStarsConfig } from './resolve.js';\nexport type {\n\tPackageJsonLike,\n\tResolveConfigOptions,\n\tResolvedBuildConfig,\n\tResolvedCodegenConfig,\n\tResolvedDevConfig,\n\tResolvedExperimentalConfig,\n\tResolvedFutureConfig,\n\tResolvedNitroConfig,\n\tResolvedI18nCodegenConfig,\n\tResolvedImportsConfig,\n\tResolvedStarsConfig,\n\tResolvedTunnelConfig,\n\tResolvedTypecheckConfig\n} from './resolve.js';\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wolfstar/schema",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Typed stars.config.* schema and loader shared by @wolfstar/http-framework and @wolfstar/cli",
5
5
  "keywords": [
6
6
  "api",
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-Ctpk84fx.d.ts","names":[],"sources":["../../src/config/validator.ts","../../src/config/compatibility.ts","../../src/config/env.ts","../../src/config/hooks.ts","../../src/config/resolve.ts","../../src/types/builder.ts","../../src/types/hooks.ts","../../src/types/config.ts","../../src/config.ts"],"mappings":"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"}