vize 0.123.0 → 0.125.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.
package/README.md CHANGED
@@ -52,10 +52,10 @@ Recommended scripts:
52
52
 
53
53
  Shared config discovery is supported for the npm CLI:
54
54
 
55
+ - `vize.config.pkl`
55
56
  - `vize.config.ts`
56
57
  - `vize.config.js`
57
58
  - `vize.config.mjs`
58
- - `vize.config.pkl`
59
59
  - `vize.config.json`
60
60
 
61
61
  Pkl config files require either `@pkl-community/pkl` installed in the project or a `pkl` binary on
@@ -11,6 +11,26 @@ type RuleCategory = "correctness" | "suspicious" | "style" | "perf" | "a11y" | "
11
11
  * Configuration file for vize - High-performance Vue.js toolchain
12
12
  */
13
13
  interface VizeConfig {
14
+ /**
15
+ * Human-readable entry name for inspect output and diagnostics
16
+ */
17
+ name?: string;
18
+ /**
19
+ * Directory used as the base for scoped file patterns and relative paths
20
+ */
21
+ basePath?: string;
22
+ /**
23
+ * Glob patterns this config applies to
24
+ */
25
+ files?: string[];
26
+ /**
27
+ * Glob patterns this config excludes
28
+ */
29
+ ignores?: string[];
30
+ /**
31
+ * Base config files or presets to compose
32
+ */
33
+ extends?: string | string[];
14
34
  compiler?: CompilerConfig;
15
35
  vite?: VitePluginConfig;
16
36
  linter?: LinterConfig;
@@ -20,6 +40,10 @@ interface VizeConfig {
20
40
  lsp?: LanguageServerConfig;
21
41
  musea?: MuseaConfig;
22
42
  globalTypes?: GlobalTypesConfig;
43
+ /**
44
+ * Scoped config entries for monorepos and workspaces
45
+ */
46
+ entries?: VizeConfigEntry[];
23
47
  }
24
48
  /**
25
49
  * Vue compiler options
@@ -478,6 +502,40 @@ interface GlobalTypeDeclaration {
478
502
  */
479
503
  defaultValue?: string;
480
504
  }
505
+ /**
506
+ * Scoped Vize config entry for monorepos and workspaces
507
+ */
508
+ interface VizeConfigEntry {
509
+ /**
510
+ * Human-readable entry name for inspect output and diagnostics
511
+ */
512
+ name?: string;
513
+ /**
514
+ * Directory used as the base for scoped file patterns and relative paths
515
+ */
516
+ basePath?: string;
517
+ /**
518
+ * Glob patterns this entry applies to
519
+ */
520
+ files?: string[];
521
+ /**
522
+ * Glob patterns this entry excludes
523
+ */
524
+ ignores?: string[];
525
+ /**
526
+ * Base config files or presets to compose
527
+ */
528
+ extends?: string | string[];
529
+ compiler?: CompilerConfig;
530
+ vite?: VitePluginConfig;
531
+ linter?: LinterConfig;
532
+ typeChecker?: TypeCheckerConfig;
533
+ formatter?: FormatterConfig;
534
+ languageServer?: LanguageServerConfig;
535
+ lsp?: LanguageServerConfig;
536
+ musea?: MuseaConfig;
537
+ globalTypes?: GlobalTypesConfig;
538
+ }
481
539
  //#endregion
482
540
  //#region src/types/rules.d.ts
483
541
  declare const LINT_RULE_NAMES: readonly ["a11y/alt-text", "a11y/anchor-has-content", "a11y/anchor-is-valid", "a11y/aria-props", "a11y/aria-role", "a11y/aria-unsupported-elements", "a11y/click-events-have-key-events", "a11y/form-control-has-label", "a11y/heading-has-content", "a11y/heading-levels", "a11y/iframe-has-title", "a11y/img-alt", "a11y/interactive-supports-focus", "a11y/label-has-for", "a11y/landmark-roles", "a11y/media-has-caption", "a11y/mouse-events-have-key-events", "a11y/no-access-key", "a11y/no-aria-hidden-on-focusable", "a11y/no-autofocus", "a11y/no-distracting-elements", "a11y/no-i-for-icon", "a11y/no-redundant-roles", "a11y/no-refer-to-non-existent-id", "a11y/no-role-presentation-on-focusable", "a11y/no-static-element-interactions", "a11y/placeholder-label-option", "a11y/role-has-required-aria-props", "a11y/tabindex-no-positive", "a11y/use-list", "ecosystem/nuxt-prefer-nuxt-link", "ecosystem/pinia-prefer-store-to-refs", "ecosystem/router-link-require-to", "ecosystem/void-link-require-href", "ecosystem/void-link-valid-method", "ecosystem/vue-i18n-no-missing-key", "ecosystem/vue-router-prefer-named-link", "ecosystem/vue-router-prefer-named-push", "ecosystem/vue-test-utils-no-html-snapshot", "html/deprecated-attr", "html/deprecated-element", "html/id-duplication", "html/no-consecutive-br", "html/no-duplicate-dt", "html/no-empty-palpable-content", "html/require-datetime", "script/no-get-current-instance", "script/no-next-tick", "script/no-options-api", "ssr/no-browser-globals-in-ssr", "ssr/no-hydration-mismatch", "type/no-floating-promises", "type/no-reactivity-loss", "type/no-unsafe-template-binding", "type/require-typed-emits", "type/require-typed-props", "vapor/no-inline-template", "vapor/no-vue-lifecycle-events", "vapor/prefer-static-class", "vapor/require-vapor-attribute", "vue/attribute-hyphenation", "vue/attribute-order", "vue/component-definition-name-casing", "vue/component-name-in-template-casing", "vue/html-quotes", "vue/html-self-closing", "vue/multi-word-component-names", "vue/mustache-interpolation-spacing", "vue/no-boolean-attr-value", "vue/no-child-content", "vue/no-dupe-v-else-if", "vue/no-duplicate-attributes", "vue/no-inline-style", "vue/no-lone-template", "vue/no-multi-spaces", "vue/no-mutating-props", "vue/no-preprocessor-lang", "vue/no-reserved-component-names", "vue/no-script-non-standard-lang", "vue/no-src-attribute", "vue/no-template-key", "vue/no-template-lang", "vue/no-template-shadow", "vue/no-textarea-mustache", "vue/no-unsafe-url", "vue/no-unused-components", "vue/no-unused-properties", "vue/no-unused-vars", "vue/no-use-v-if-with-v-for", "vue/no-useless-template-attributes", "vue/no-v-html", "vue/no-v-text-v-html-on-component", "vue/permitted-contents", "vue/prefer-props-shorthand", "vue/prop-name-casing", "vue/require-component-is", "vue/require-component-registration", "vue/require-scoped-style", "vue/require-v-for-key", "vue/scoped-event-names", "vue/sfc-element-order", "vue/single-style-block", "vue/use-unique-element-ids", "vue/use-v-on-exact", "vue/v-bind-style", "vue/v-on-style", "vue/v-slot-style", "vue/valid-attribute-name", "vue/valid-v-bind", "vue/valid-v-else", "vue/valid-v-for", "vue/valid-v-if", "vue/valid-v-memo", "vue/valid-v-model", "vue/valid-v-on", "vue/valid-v-show", "vue/valid-v-slot", "vue/warn-custom-block", "vue/warn-custom-directive"];
@@ -498,7 +556,15 @@ type UserConfig = VizeConfig & {
498
556
  */
499
557
  lsp?: LanguageServerConfig;
500
558
  };
501
- type UserConfigExport = UserConfig | ((env: ConfigEnv) => MaybePromise<UserConfig>);
559
+ type UserConfigInput = UserConfig | VizeConfigEntry[];
560
+ type ResolvedVizeConfig = VizeConfig & {
561
+ /**
562
+ * Normalized flat entries. Plain object configs become one entry; array configs
563
+ * keep their order.
564
+ */
565
+ entries: VizeConfigEntry[];
566
+ };
567
+ type UserConfigExport = UserConfigInput | ((env: ConfigEnv) => MaybePromise<UserConfigInput>);
502
568
  interface LoadConfigOptions {
503
569
  /**
504
570
  * Config file search mode
@@ -536,11 +602,12 @@ declare function defineConfig(config: UserConfigExport): UserConfigExport;
536
602
  /**
537
603
  * Load `vize.config.*` from the specified directory.
538
604
  */
539
- declare function loadConfig(root: string, options?: LoadConfigOptions): Promise<VizeConfig | null>;
605
+ declare function loadConfig(root: string, options?: LoadConfigOptions): Promise<ResolvedVizeConfig | null>;
606
+ declare function resolveConfigExport(exported: UserConfigExport, env?: ConfigEnv): Promise<ResolvedVizeConfig>;
540
607
  /**
541
608
  * Normalize GlobalTypesConfig shorthand strings to GlobalTypeDeclaration objects
542
609
  */
543
610
  declare function normalizeGlobalTypes(config: GlobalTypesConfig): Record<string, GlobalTypeDeclaration>;
544
611
  //#endregion
545
- export { MuseaConfig as C, TypeCheckerConfig as D, RuleSeverity as E, VitePluginConfig as O, MuseaAutogenConfig as S, RuleCategory as T, GlobalTypesConfig as _, loadConfig as a, LinterConfig as b, ConfigEnv as c, UserConfigExport as d, LintRuleName as f, GlobalTypeDeclaration as g, FormatterConfig as h, defineConfig as i, VizeConfig as k, LoadConfigOptions as l, CompilerConfig as m, VIZE_CONFIG_JSON_SCHEMA_PATH as n, normalizeGlobalTypes as o, LintRulesConfig as p, VIZE_CONFIG_PKL_SCHEMA_PATH as r, LspConfig as s, CONFIG_FILE_NAMES as t, MaybePromise as u, LanguageServerConfig as v, MuseaVrtConfig as w, MuseaA11yConfig as x, LintPreset as y };
546
- //# sourceMappingURL=config-MA8nXz11.d.mts.map
612
+ export { TypeCheckerConfig as A, LinterConfig as C, MuseaVrtConfig as D, MuseaConfig as E, VizeConfig as M, VizeConfigEntry as N, RuleCategory as O, LintPreset as S, MuseaAutogenConfig as T, CompilerConfig as _, loadConfig as a, GlobalTypesConfig as b, LspConfig as c, MaybePromise as d, ResolvedVizeConfig as f, LintRulesConfig as g, LintRuleName as h, defineConfig as i, VitePluginConfig as j, RuleSeverity as k, ConfigEnv as l, UserConfigInput as m, VIZE_CONFIG_JSON_SCHEMA_PATH as n, normalizeGlobalTypes as o, UserConfigExport as p, VIZE_CONFIG_PKL_SCHEMA_PATH as r, resolveConfigExport as s, CONFIG_FILE_NAMES as t, LoadConfigOptions as u, FormatterConfig as v, MuseaA11yConfig as w, LanguageServerConfig as x, GlobalTypeDeclaration as y };
613
+ //# sourceMappingURL=config-CRvVIvqJ.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-CRvVIvqJ.d.mts","names":[],"sources":["../src/types/generated.ts","../src/types/rules.ts","../src/types/runtime.ts","../src/types/index.ts","../src/config.ts"],"mappings":"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"}
package/dist/config.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { a as loadConfig, i as defineConfig, n as VIZE_CONFIG_JSON_SCHEMA_PATH, o as normalizeGlobalTypes, r as VIZE_CONFIG_PKL_SCHEMA_PATH, t as CONFIG_FILE_NAMES } from "./config-MA8nXz11.mjs";
2
- export { CONFIG_FILE_NAMES, VIZE_CONFIG_JSON_SCHEMA_PATH, VIZE_CONFIG_PKL_SCHEMA_PATH, defineConfig, loadConfig, normalizeGlobalTypes };
1
+ import { a as loadConfig, i as defineConfig, n as VIZE_CONFIG_JSON_SCHEMA_PATH, o as normalizeGlobalTypes, r as VIZE_CONFIG_PKL_SCHEMA_PATH, s as resolveConfigExport, t as CONFIG_FILE_NAMES } from "./config-CRvVIvqJ.mjs";
2
+ export { CONFIG_FILE_NAMES, VIZE_CONFIG_JSON_SCHEMA_PATH, VIZE_CONFIG_PKL_SCHEMA_PATH, defineConfig, loadConfig, normalizeGlobalTypes, resolveConfigExport };
package/dist/config.mjs CHANGED
@@ -180,7 +180,51 @@ function parseJsonConfig(content, filePath) {
180
180
  }
181
181
  }
182
182
  function normalizeLoadedConfig(config) {
183
- return normalizeConfigAliases(stripNullish(config) ?? {});
183
+ const normalized = stripNullish(config);
184
+ if (Array.isArray(normalized)) return normalizeConfigEntries(normalized);
185
+ return normalizeConfigObject(normalized ?? {});
186
+ }
187
+ function normalizeConfigObject(config) {
188
+ const { entries: rawEntries, ...rootConfig } = normalizeConfigAliases(config);
189
+ const rootEntry = rootConfig;
190
+ const entries = [...isEmptyConfigEntry(rootEntry) ? [] : [rootEntry], ...(rawEntries ?? []).map((entry) => normalizeConfigAliases(entry))];
191
+ return {
192
+ ...rootEntry,
193
+ entries
194
+ };
195
+ }
196
+ function normalizeConfigEntries(entries) {
197
+ const normalizedEntries = entries.map((entry) => normalizeConfigAliases(entry));
198
+ return {
199
+ ...mergeConfigEntries(normalizedEntries.filter(isGlobalConfigEntry)),
200
+ entries: normalizedEntries
201
+ };
202
+ }
203
+ function mergeConfigEntries(entries) {
204
+ const result = {};
205
+ for (const entry of entries) deepMerge(result, stripEntryMetadata(entry));
206
+ return result;
207
+ }
208
+ function stripEntryMetadata(entry) {
209
+ const { name, basePath, files, ignores, extends: extendsConfig, ...config } = entry;
210
+ return config;
211
+ }
212
+ function deepMerge(target, source) {
213
+ for (const [key, value] of Object.entries(source)) {
214
+ if (value === void 0) continue;
215
+ const current = target[key];
216
+ if (isPlainObject(current) && isPlainObject(value)) deepMerge(current, value);
217
+ else target[key] = value;
218
+ }
219
+ }
220
+ function isGlobalConfigEntry(entry) {
221
+ return entry.basePath === void 0 && entry.files === void 0 && entry.ignores === void 0;
222
+ }
223
+ function isEmptyConfigEntry(entry) {
224
+ return Object.keys(entry).length === 0;
225
+ }
226
+ function isPlainObject(value) {
227
+ return typeof value === "object" && value !== null && !Array.isArray(value);
184
228
  }
185
229
  function stripNullish(value) {
186
230
  if (value === null) return;
@@ -219,6 +263,6 @@ function normalizeConfigAliases(config) {
219
263
  };
220
264
  }
221
265
  //#endregion
222
- export { CONFIG_FILE_NAMES, VIZE_CONFIG_JSON_SCHEMA_PATH, VIZE_CONFIG_PKL_SCHEMA_PATH, defineConfig, loadConfig, normalizeGlobalTypes };
266
+ export { CONFIG_FILE_NAMES, VIZE_CONFIG_JSON_SCHEMA_PATH, VIZE_CONFIG_PKL_SCHEMA_PATH, defineConfig, loadConfig, normalizeGlobalTypes, resolveConfigExport };
223
267
 
224
268
  //# sourceMappingURL=config.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.mjs","names":[],"sources":["../src/config.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { execFileSync } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { transform } from \"oxc-transform\";\nimport type {\n LanguageServerConfig,\n VizeConfig,\n LoadConfigOptions,\n UserConfigExport,\n ConfigEnv,\n GlobalTypesConfig,\n GlobalTypeDeclaration,\n} from \"./types/index.js\";\n\nexport const CONFIG_FILE_NAMES = [\n \"vize.config.pkl\",\n \"vize.config.ts\",\n \"vize.config.js\",\n \"vize.config.mjs\",\n \"vize.config.json\",\n] as const;\n\nconst DEFAULT_CONFIG_ENV: ConfigEnv = {\n mode: \"development\",\n command: \"serve\",\n};\n\nconst PACKAGE_ROOT = path.resolve(fileURLToPath(new URL(\".\", import.meta.url)), \"..\");\n\nexport const VIZE_CONFIG_JSON_SCHEMA_PATH = path.join(\n PACKAGE_ROOT,\n \"schemas\",\n \"vize.config.schema.json\",\n);\n\nexport const VIZE_CONFIG_PKL_SCHEMA_PATH = path.join(PACKAGE_ROOT, \"pkl\", \"vize.pkl\");\n\nconst DOCUMENTED_PKL_SCHEMA_IMPORT_RE =\n /^(\\s*(?:amends|import)\\s+)([\"'])node_modules\\/vize\\/pkl\\/(VizeConfig\\.pkl|vize\\.pkl)\\2/gm;\n\ntype CompatVizeConfig = VizeConfig & {\n lsp?: LanguageServerConfig;\n};\n\n/**\n * Define a Vize configuration with type checking.\n * Accepts a plain object or a function that receives ConfigEnv.\n */\nexport function defineConfig(config: UserConfigExport): UserConfigExport {\n return config;\n}\n\n/**\n * Load `vize.config.*` from the specified directory.\n */\nexport async function loadConfig(\n root: string,\n options: LoadConfigOptions = {},\n): Promise<VizeConfig | null> {\n const { mode = \"root\", configFile, env } = options;\n\n if (mode === \"none\") {\n return null;\n }\n\n if (configFile) {\n const absolutePath = path.isAbsolute(configFile) ? configFile : path.resolve(root, configFile);\n if (fs.existsSync(absolutePath)) {\n return loadConfigFile(absolutePath, env);\n }\n return null;\n }\n\n if (mode === \"auto\") {\n return loadConfigFromDirAuto(root, env);\n }\n\n return loadConfigFromDir(root, env);\n}\n\nasync function loadConfigFromDir(dir: string, env?: ConfigEnv): Promise<VizeConfig | null> {\n for (const name of CONFIG_FILE_NAMES) {\n const filePath = path.join(dir, name);\n if (!fs.existsSync(filePath)) {\n continue;\n }\n\n const config = await loadConfigFile(filePath, env);\n if (config !== null) {\n return config;\n }\n }\n return null;\n}\n\nasync function loadConfigFromDirAuto(\n startDir: string,\n env?: ConfigEnv,\n): Promise<VizeConfig | null> {\n let currentDir = path.resolve(startDir);\n\n while (true) {\n const config = await loadConfigFromDir(currentDir, env);\n if (config !== null) {\n return config;\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n return null;\n }\n\n currentDir = parentDir;\n }\n}\n\nasync function loadConfigFile(filePath: string, env?: ConfigEnv): Promise<VizeConfig | null> {\n const absolutePath = path.resolve(filePath);\n if (!fs.existsSync(absolutePath)) {\n return null;\n }\n\n const ext = path.extname(absolutePath);\n\n if (ext === \".pkl\") {\n return loadPklConfig(absolutePath);\n }\n\n if (ext === \".json\") {\n const content = fs.readFileSync(absolutePath, \"utf-8\");\n return parseJsonConfig(content, absolutePath);\n }\n\n if (ext === \".ts\") {\n return loadTypeScriptConfig(absolutePath, env);\n }\n\n return loadESMConfig(absolutePath, env);\n}\n\nfunction findPklBinary(): string | null {\n try {\n const pklPkgPath = import.meta.resolve?.(\"@pkl-community/pkl\");\n if (pklPkgPath) {\n const pklLibDir = path.dirname(fileURLToPath(pklPkgPath));\n const pklPackageDir = path.dirname(pklLibDir);\n const candidates = [\n path.join(pklLibDir, \"main.js\"),\n path.join(pklPackageDir, \"pkl\"),\n path.join(pklPackageDir, \"pkl.exe\"),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n try {\n execFileSync(candidate, [\"--version\"], { stdio: \"ignore\" });\n return candidate;\n } catch {\n // Keep looking: the bundled shim can exist even when its runtime is unavailable.\n }\n }\n }\n }\n } catch {\n // Fall back to PATH below.\n }\n\n try {\n execFileSync(\"pkl\", [\"--version\"], { stdio: \"ignore\" });\n return \"pkl\";\n } catch {\n return null;\n }\n}\n\nfunction loadPklConfig(filePath: string): VizeConfig | null {\n const pklBin = findPklBinary();\n if (!pklBin) {\n console.warn(\n \"[vize] pkl CLI not found. Install @pkl-community/pkl or add pkl to PATH. \" +\n \"Falling back to the next config format.\",\n );\n return null;\n }\n\n let output: string;\n const patchedFilePath = createPklConfigWithBundledSchemaImports(filePath);\n const evalFilePath = patchedFilePath ?? filePath;\n try {\n output = execFileSync(pklBin, [\"eval\", \"-f\", \"json\", evalFilePath], {\n cwd: path.dirname(filePath),\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n timeout: 30_000,\n });\n } catch (error) {\n throw new Error(`Failed to evaluate vize PKL config at ${filePath}: ${getErrorMessage(error)}`);\n } finally {\n if (patchedFilePath) {\n fs.rmSync(patchedFilePath, { force: true });\n }\n }\n return parseJsonConfig(output, filePath);\n}\n\nfunction createPklConfigWithBundledSchemaImports(filePath: string): string | null {\n const configDir = path.dirname(filePath);\n const source = fs.readFileSync(filePath, \"utf-8\");\n let patched = false;\n\n const content = source.replace(\n DOCUMENTED_PKL_SCHEMA_IMPORT_RE,\n (match, prefix, quote, schemaFile) => {\n const projectSchemaPath = path.join(configDir, \"node_modules\", \"vize\", \"pkl\", schemaFile);\n if (fs.existsSync(projectSchemaPath)) {\n return match;\n }\n\n const bundledSchemaPath = path.join(PACKAGE_ROOT, \"pkl\", schemaFile);\n if (!fs.existsSync(bundledSchemaPath)) {\n return match;\n }\n\n patched = true;\n return `${prefix}${quote}${pathToFileURL(bundledSchemaPath).href}${quote}`;\n },\n );\n\n if (!patched) {\n return null;\n }\n\n const tempFile = path.join(\n configDir,\n `.vize-config-${process.pid}-${Date.now()}-${randomUUID()}.pkl`,\n );\n fs.writeFileSync(tempFile, content, { flag: \"wx\", mode: 0o600 });\n return tempFile;\n}\n\nasync function resolveConfigExport(\n exported: UserConfigExport,\n env?: ConfigEnv,\n): Promise<VizeConfig> {\n if (typeof exported === \"function\") {\n return normalizeLoadedConfig(await exported(env ?? DEFAULT_CONFIG_ENV));\n }\n\n return normalizeLoadedConfig(exported);\n}\n\nasync function loadTypeScriptConfig(filePath: string, env?: ConfigEnv): Promise<VizeConfig> {\n const source = fs.readFileSync(filePath, \"utf-8\");\n const result = await transform(filePath, source, {\n typescript: {\n onlyRemoveTypeImports: true,\n },\n });\n\n const tempFile = path.join(\n path.dirname(filePath),\n `.vize-config-${process.pid}-${Date.now()}-${randomUUID()}.mjs`,\n );\n fs.writeFileSync(tempFile, result.code, { flag: \"wx\", mode: 0o600 });\n\n try {\n const module = await importFresh(tempFile);\n const exported: UserConfigExport = module.default || module;\n return resolveConfigExport(exported, env);\n } finally {\n fs.rmSync(tempFile, { force: true });\n }\n}\n\nasync function loadESMConfig(filePath: string, env?: ConfigEnv): Promise<VizeConfig> {\n const module = await importFresh(filePath);\n const exported: UserConfigExport = module.default || module;\n return resolveConfigExport(exported, env);\n}\n\nasync function importFresh(filePath: string): Promise<Record<string, unknown>> {\n const fileUrl = pathToFileURL(filePath);\n fileUrl.searchParams.set(\"t\", String(fs.statSync(filePath).mtimeMs));\n return import(fileUrl.href);\n}\n\nfunction parseJsonConfig(content: string, filePath: string): VizeConfig {\n try {\n return normalizeLoadedConfig(JSON.parse(content));\n } catch (error) {\n throw new Error(`Failed to parse vize config JSON at ${filePath}: ${getErrorMessage(error)}`);\n }\n}\n\nfunction normalizeLoadedConfig(config: unknown): VizeConfig {\n const normalized = stripNullish(config);\n return normalizeConfigAliases((normalized ?? {}) as CompatVizeConfig);\n}\n\nfunction stripNullish(value: unknown): unknown {\n if (value === null) {\n return undefined;\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => stripNullish(entry)).filter((entry) => entry !== undefined);\n }\n\n if (typeof value === \"object\" && value !== null) {\n const result: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n const normalizedEntry = stripNullish(entry);\n if (normalizedEntry !== undefined) {\n result[key] = normalizedEntry;\n }\n }\n return result;\n }\n\n return value;\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n return String(error);\n}\n\n/**\n * Normalize GlobalTypesConfig shorthand strings to GlobalTypeDeclaration objects\n */\nexport function normalizeGlobalTypes(\n config: GlobalTypesConfig,\n): Record<string, GlobalTypeDeclaration> {\n const resolvedConfig =\n \"types\" in config &&\n typeof config.types === \"object\" &&\n config.types !== null &&\n !Array.isArray(config.types)\n ? config.types\n : config;\n\n const result: Record<string, GlobalTypeDeclaration> = {};\n for (const [key, value] of Object.entries(resolvedConfig)) {\n if (typeof value === \"string\") {\n result[key] = { type: value };\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction normalizeConfigAliases(config: CompatVizeConfig): VizeConfig {\n if (config.lsp === undefined) {\n return config;\n }\n\n const { lsp, ...rest } = config;\n if (config.languageServer !== undefined) {\n return rest;\n }\n\n return {\n ...rest,\n languageServer: lsp,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"config.mjs","names":[],"sources":["../src/config.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { execFileSync } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { transform } from \"oxc-transform\";\nimport type {\n LanguageServerConfig,\n VizeConfig,\n VizeConfigEntry,\n ResolvedVizeConfig,\n LoadConfigOptions,\n UserConfigExport,\n ConfigEnv,\n GlobalTypesConfig,\n GlobalTypeDeclaration,\n} from \"./types/index.js\";\n\nexport const CONFIG_FILE_NAMES = [\n \"vize.config.pkl\",\n \"vize.config.ts\",\n \"vize.config.js\",\n \"vize.config.mjs\",\n \"vize.config.json\",\n] as const;\n\nconst DEFAULT_CONFIG_ENV: ConfigEnv = {\n mode: \"development\",\n command: \"serve\",\n};\n\nconst PACKAGE_ROOT = path.resolve(fileURLToPath(new URL(\".\", import.meta.url)), \"..\");\n\nexport const VIZE_CONFIG_JSON_SCHEMA_PATH = path.join(\n PACKAGE_ROOT,\n \"schemas\",\n \"vize.config.schema.json\",\n);\n\nexport const VIZE_CONFIG_PKL_SCHEMA_PATH = path.join(PACKAGE_ROOT, \"pkl\", \"vize.pkl\");\n\nconst DOCUMENTED_PKL_SCHEMA_IMPORT_RE =\n /^(\\s*(?:amends|import)\\s+)([\"'])node_modules\\/vize\\/pkl\\/(VizeConfig\\.pkl|vize\\.pkl)\\2/gm;\n\ntype CompatVizeConfig = VizeConfig & {\n lsp?: LanguageServerConfig;\n};\n\ntype CompatVizeConfigEntry = VizeConfigEntry & {\n lsp?: LanguageServerConfig;\n};\n\n/**\n * Define a Vize configuration with type checking.\n * Accepts a plain object or a function that receives ConfigEnv.\n */\nexport function defineConfig(config: UserConfigExport): UserConfigExport {\n return config;\n}\n\n/**\n * Load `vize.config.*` from the specified directory.\n */\nexport async function loadConfig(\n root: string,\n options: LoadConfigOptions = {},\n): Promise<ResolvedVizeConfig | null> {\n const { mode = \"root\", configFile, env } = options;\n\n if (mode === \"none\") {\n return null;\n }\n\n if (configFile) {\n const absolutePath = path.isAbsolute(configFile) ? configFile : path.resolve(root, configFile);\n if (fs.existsSync(absolutePath)) {\n return loadConfigFile(absolutePath, env);\n }\n return null;\n }\n\n if (mode === \"auto\") {\n return loadConfigFromDirAuto(root, env);\n }\n\n return loadConfigFromDir(root, env);\n}\n\nasync function loadConfigFromDir(dir: string, env?: ConfigEnv): Promise<ResolvedVizeConfig | null> {\n for (const name of CONFIG_FILE_NAMES) {\n const filePath = path.join(dir, name);\n if (!fs.existsSync(filePath)) {\n continue;\n }\n\n const config = await loadConfigFile(filePath, env);\n if (config !== null) {\n return config;\n }\n }\n return null;\n}\n\nasync function loadConfigFromDirAuto(\n startDir: string,\n env?: ConfigEnv,\n): Promise<ResolvedVizeConfig | null> {\n let currentDir = path.resolve(startDir);\n\n while (true) {\n const config = await loadConfigFromDir(currentDir, env);\n if (config !== null) {\n return config;\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n return null;\n }\n\n currentDir = parentDir;\n }\n}\n\nasync function loadConfigFile(\n filePath: string,\n env?: ConfigEnv,\n): Promise<ResolvedVizeConfig | null> {\n const absolutePath = path.resolve(filePath);\n if (!fs.existsSync(absolutePath)) {\n return null;\n }\n\n const ext = path.extname(absolutePath);\n\n if (ext === \".pkl\") {\n return loadPklConfig(absolutePath);\n }\n\n if (ext === \".json\") {\n const content = fs.readFileSync(absolutePath, \"utf-8\");\n return parseJsonConfig(content, absolutePath);\n }\n\n if (ext === \".ts\") {\n return loadTypeScriptConfig(absolutePath, env);\n }\n\n return loadESMConfig(absolutePath, env);\n}\n\nfunction findPklBinary(): string | null {\n try {\n const pklPkgPath = import.meta.resolve?.(\"@pkl-community/pkl\");\n if (pklPkgPath) {\n const pklLibDir = path.dirname(fileURLToPath(pklPkgPath));\n const pklPackageDir = path.dirname(pklLibDir);\n const candidates = [\n path.join(pklLibDir, \"main.js\"),\n path.join(pklPackageDir, \"pkl\"),\n path.join(pklPackageDir, \"pkl.exe\"),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n try {\n execFileSync(candidate, [\"--version\"], { stdio: \"ignore\" });\n return candidate;\n } catch {\n // Keep looking: the bundled shim can exist even when its runtime is unavailable.\n }\n }\n }\n }\n } catch {\n // Fall back to PATH below.\n }\n\n try {\n execFileSync(\"pkl\", [\"--version\"], { stdio: \"ignore\" });\n return \"pkl\";\n } catch {\n return null;\n }\n}\n\nfunction loadPklConfig(filePath: string): ResolvedVizeConfig | null {\n const pklBin = findPklBinary();\n if (!pklBin) {\n console.warn(\n \"[vize] pkl CLI not found. Install @pkl-community/pkl or add pkl to PATH. \" +\n \"Falling back to the next config format.\",\n );\n return null;\n }\n\n let output: string;\n const patchedFilePath = createPklConfigWithBundledSchemaImports(filePath);\n const evalFilePath = patchedFilePath ?? filePath;\n try {\n output = execFileSync(pklBin, [\"eval\", \"-f\", \"json\", evalFilePath], {\n cwd: path.dirname(filePath),\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n timeout: 30_000,\n });\n } catch (error) {\n throw new Error(`Failed to evaluate vize PKL config at ${filePath}: ${getErrorMessage(error)}`);\n } finally {\n if (patchedFilePath) {\n fs.rmSync(patchedFilePath, { force: true });\n }\n }\n return parseJsonConfig(output, filePath);\n}\n\nfunction createPklConfigWithBundledSchemaImports(filePath: string): string | null {\n const configDir = path.dirname(filePath);\n const source = fs.readFileSync(filePath, \"utf-8\");\n let patched = false;\n\n const content = source.replace(\n DOCUMENTED_PKL_SCHEMA_IMPORT_RE,\n (match, prefix, quote, schemaFile) => {\n const projectSchemaPath = path.join(configDir, \"node_modules\", \"vize\", \"pkl\", schemaFile);\n if (fs.existsSync(projectSchemaPath)) {\n return match;\n }\n\n const bundledSchemaPath = path.join(PACKAGE_ROOT, \"pkl\", schemaFile);\n if (!fs.existsSync(bundledSchemaPath)) {\n return match;\n }\n\n patched = true;\n return `${prefix}${quote}${pathToFileURL(bundledSchemaPath).href}${quote}`;\n },\n );\n\n if (!patched) {\n return null;\n }\n\n const tempFile = path.join(\n configDir,\n `.vize-config-${process.pid}-${Date.now()}-${randomUUID()}.pkl`,\n );\n fs.writeFileSync(tempFile, content, { flag: \"wx\", mode: 0o600 });\n return tempFile;\n}\n\nexport async function resolveConfigExport(\n exported: UserConfigExport,\n env?: ConfigEnv,\n): Promise<ResolvedVizeConfig> {\n if (typeof exported === \"function\") {\n return normalizeLoadedConfig(await exported(env ?? DEFAULT_CONFIG_ENV));\n }\n\n return normalizeLoadedConfig(exported);\n}\n\nasync function loadTypeScriptConfig(\n filePath: string,\n env?: ConfigEnv,\n): Promise<ResolvedVizeConfig> {\n const source = fs.readFileSync(filePath, \"utf-8\");\n const result = await transform(filePath, source, {\n typescript: {\n onlyRemoveTypeImports: true,\n },\n });\n\n const tempFile = path.join(\n path.dirname(filePath),\n `.vize-config-${process.pid}-${Date.now()}-${randomUUID()}.mjs`,\n );\n fs.writeFileSync(tempFile, result.code, { flag: \"wx\", mode: 0o600 });\n\n try {\n const module = await importFresh(tempFile);\n const exported: UserConfigExport = module.default || module;\n return resolveConfigExport(exported, env);\n } finally {\n fs.rmSync(tempFile, { force: true });\n }\n}\n\nasync function loadESMConfig(filePath: string, env?: ConfigEnv): Promise<ResolvedVizeConfig> {\n const module = await importFresh(filePath);\n const exported: UserConfigExport = module.default || module;\n return resolveConfigExport(exported, env);\n}\n\nasync function importFresh(filePath: string): Promise<Record<string, unknown>> {\n const fileUrl = pathToFileURL(filePath);\n fileUrl.searchParams.set(\"t\", String(fs.statSync(filePath).mtimeMs));\n return import(fileUrl.href);\n}\n\nfunction parseJsonConfig(content: string, filePath: string): ResolvedVizeConfig {\n try {\n return normalizeLoadedConfig(JSON.parse(content));\n } catch (error) {\n throw new Error(`Failed to parse vize config JSON at ${filePath}: ${getErrorMessage(error)}`);\n }\n}\n\nfunction normalizeLoadedConfig(config: unknown): ResolvedVizeConfig {\n const normalized = stripNullish(config);\n if (Array.isArray(normalized)) {\n return normalizeConfigEntries(normalized as CompatVizeConfigEntry[]);\n }\n\n return normalizeConfigObject((normalized ?? {}) as CompatVizeConfig);\n}\n\nfunction normalizeConfigObject(config: CompatVizeConfig): ResolvedVizeConfig {\n const { entries: rawEntries, ...rootConfig } = normalizeConfigAliases(config) as VizeConfig & {\n entries?: CompatVizeConfigEntry[];\n };\n const rootEntry = rootConfig as VizeConfigEntry;\n const entries = [\n ...(isEmptyConfigEntry(rootEntry) ? [] : [rootEntry]),\n ...(rawEntries ?? []).map((entry) => normalizeConfigAliases(entry) as VizeConfigEntry),\n ];\n\n return {\n ...rootEntry,\n entries,\n };\n}\n\nfunction normalizeConfigEntries(entries: CompatVizeConfigEntry[]): ResolvedVizeConfig {\n const normalizedEntries = entries.map(\n (entry) => normalizeConfigAliases(entry) as VizeConfigEntry,\n );\n const globalConfig = mergeConfigEntries(normalizedEntries.filter(isGlobalConfigEntry));\n\n return {\n ...globalConfig,\n entries: normalizedEntries,\n };\n}\n\nfunction mergeConfigEntries(entries: VizeConfigEntry[]): VizeConfigEntry {\n const result: Record<string, unknown> = {};\n for (const entry of entries) {\n deepMerge(result, stripEntryMetadata(entry));\n }\n return result as VizeConfigEntry;\n}\n\nfunction stripEntryMetadata(entry: VizeConfigEntry): Partial<VizeConfigEntry> {\n const { name, basePath, files, ignores, extends: extendsConfig, ...config } = entry;\n void name;\n void basePath;\n void files;\n void ignores;\n void extendsConfig;\n return config;\n}\n\nfunction deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(source)) {\n if (value === undefined) {\n continue;\n }\n\n const current = target[key];\n if (isPlainObject(current) && isPlainObject(value)) {\n deepMerge(current, value);\n } else {\n target[key] = value;\n }\n }\n}\n\nfunction isGlobalConfigEntry(entry: VizeConfigEntry): boolean {\n return entry.basePath === undefined && entry.files === undefined && entry.ignores === undefined;\n}\n\nfunction isEmptyConfigEntry(entry: VizeConfigEntry): boolean {\n return Object.keys(entry).length === 0;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction stripNullish(value: unknown): unknown {\n if (value === null) {\n return undefined;\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => stripNullish(entry)).filter((entry) => entry !== undefined);\n }\n\n if (typeof value === \"object\" && value !== null) {\n const result: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n const normalizedEntry = stripNullish(entry);\n if (normalizedEntry !== undefined) {\n result[key] = normalizedEntry;\n }\n }\n return result;\n }\n\n return value;\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n return String(error);\n}\n\n/**\n * Normalize GlobalTypesConfig shorthand strings to GlobalTypeDeclaration objects\n */\nexport function normalizeGlobalTypes(\n config: GlobalTypesConfig,\n): Record<string, GlobalTypeDeclaration> {\n const resolvedConfig =\n \"types\" in config &&\n typeof config.types === \"object\" &&\n config.types !== null &&\n !Array.isArray(config.types)\n ? config.types\n : config;\n\n const result: Record<string, GlobalTypeDeclaration> = {};\n for (const [key, value] of Object.entries(resolvedConfig)) {\n if (typeof value === \"string\") {\n result[key] = { type: value };\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction normalizeConfigAliases(config: CompatVizeConfig): VizeConfig {\n if (config.lsp === undefined) {\n return config;\n }\n\n const { lsp, ...rest } = config;\n if (config.languageServer !== undefined) {\n return rest;\n }\n\n return {\n ...rest,\n languageServer: lsp,\n };\n}\n"],"mappings":"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"}
package/dist/index.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { C as MuseaConfig, D as TypeCheckerConfig, E as RuleSeverity, O as VitePluginConfig, S as MuseaAutogenConfig, T as RuleCategory, _ as GlobalTypesConfig, a as loadConfig, b as LinterConfig, c as ConfigEnv, d as UserConfigExport, f as LintRuleName, g as GlobalTypeDeclaration, h as FormatterConfig, i as defineConfig, k as VizeConfig, l as LoadConfigOptions, m as CompilerConfig, n as VIZE_CONFIG_JSON_SCHEMA_PATH, o as normalizeGlobalTypes, p as LintRulesConfig, r as VIZE_CONFIG_PKL_SCHEMA_PATH, s as LspConfig, t as CONFIG_FILE_NAMES, u as MaybePromise, v as LanguageServerConfig, w as MuseaVrtConfig, x as MuseaA11yConfig, y as LintPreset } from "./config-MA8nXz11.mjs";
2
- export { CONFIG_FILE_NAMES, type CompilerConfig, type ConfigEnv, type FormatterConfig, type GlobalTypeDeclaration, type GlobalTypesConfig, type LanguageServerConfig, type LintPreset, type LintRuleName, type LintRulesConfig, type LinterConfig, type LoadConfigOptions, type LspConfig, type MaybePromise, type MuseaA11yConfig, type MuseaAutogenConfig, type MuseaConfig, type MuseaVrtConfig, type RuleCategory, type RuleSeverity, type TypeCheckerConfig, type UserConfigExport, VIZE_CONFIG_JSON_SCHEMA_PATH, VIZE_CONFIG_PKL_SCHEMA_PATH, type VitePluginConfig, type VizeConfig, defineConfig, loadConfig, normalizeGlobalTypes };
1
+ import { A as TypeCheckerConfig, C as LinterConfig, D as MuseaVrtConfig, E as MuseaConfig, M as VizeConfig, N as VizeConfigEntry, O as RuleCategory, S as LintPreset, T as MuseaAutogenConfig, _ as CompilerConfig, a as loadConfig, b as GlobalTypesConfig, c as LspConfig, d as MaybePromise, f as ResolvedVizeConfig, g as LintRulesConfig, h as LintRuleName, i as defineConfig, j as VitePluginConfig, k as RuleSeverity, l as ConfigEnv, m as UserConfigInput, n as VIZE_CONFIG_JSON_SCHEMA_PATH, o as normalizeGlobalTypes, p as UserConfigExport, r as VIZE_CONFIG_PKL_SCHEMA_PATH, s as resolveConfigExport, t as CONFIG_FILE_NAMES, u as LoadConfigOptions, v as FormatterConfig, w as MuseaA11yConfig, x as LanguageServerConfig, y as GlobalTypeDeclaration } from "./config-CRvVIvqJ.mjs";
2
+ export { CONFIG_FILE_NAMES, type CompilerConfig, type ConfigEnv, type FormatterConfig, type GlobalTypeDeclaration, type GlobalTypesConfig, type LanguageServerConfig, type LintPreset, type LintRuleName, type LintRulesConfig, type LinterConfig, type LoadConfigOptions, type LspConfig, type MaybePromise, type MuseaA11yConfig, type MuseaAutogenConfig, type MuseaConfig, type MuseaVrtConfig, type ResolvedVizeConfig, type RuleCategory, type RuleSeverity, type TypeCheckerConfig, type UserConfigExport, type UserConfigInput, VIZE_CONFIG_JSON_SCHEMA_PATH, VIZE_CONFIG_PKL_SCHEMA_PATH, type VitePluginConfig, type VizeConfig, type VizeConfigEntry, defineConfig, loadConfig, normalizeGlobalTypes, resolveConfigExport };
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { CONFIG_FILE_NAMES, VIZE_CONFIG_JSON_SCHEMA_PATH, VIZE_CONFIG_PKL_SCHEMA_PATH, defineConfig, loadConfig, normalizeGlobalTypes } from "./config.mjs";
2
- export { CONFIG_FILE_NAMES, VIZE_CONFIG_JSON_SCHEMA_PATH, VIZE_CONFIG_PKL_SCHEMA_PATH, defineConfig, loadConfig, normalizeGlobalTypes };
1
+ import { CONFIG_FILE_NAMES, VIZE_CONFIG_JSON_SCHEMA_PATH, VIZE_CONFIG_PKL_SCHEMA_PATH, defineConfig, loadConfig, normalizeGlobalTypes, resolveConfigExport } from "./config.mjs";
2
+ export { CONFIG_FILE_NAMES, VIZE_CONFIG_JSON_SCHEMA_PATH, VIZE_CONFIG_PKL_SCHEMA_PATH, defineConfig, loadConfig, normalizeGlobalTypes, resolveConfigExport };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vize",
3
- "version": "0.123.0",
3
+ "version": "0.125.0",
4
4
  "description": "Vize - High-performance Vue.js toolchain in Rust",
5
5
  "keywords": [
6
6
  "cli",
@@ -49,7 +49,7 @@
49
49
  "access": "public"
50
50
  },
51
51
  "dependencies": {
52
- "@vizejs/native": "0.123.0",
52
+ "@vizejs/native": "0.125.0",
53
53
  "oxc-transform": "0.130.0"
54
54
  },
55
55
  "devDependencies": {
@@ -23,6 +23,71 @@ import "LanguageServerConfig.pkl"
23
23
  import "MuseaConfig.pkl"
24
24
  import "GlobalTypesConfig.pkl"
25
25
 
26
+ typealias ConfigExtends = String | Listing<String>
27
+
28
+ class ConfigEntry {
29
+ /// Human-readable entry name for inspect output and diagnostics.
30
+ name: String? = null
31
+
32
+ /// Directory used as the base for scoped file patterns and relative paths.
33
+ basePath: String? = null
34
+
35
+ /// Glob patterns this entry applies to.
36
+ files: Listing<String>? = null
37
+
38
+ /// Glob patterns this entry excludes.
39
+ ignores: Listing<String>? = null
40
+
41
+ /// Base config files or presets amended by this entry.
42
+ `extends`: ConfigExtends? = null
43
+
44
+ /// Vue compiler options.
45
+ compiler: CompilerConfig.CompilerConfig = new CompilerConfig.CompilerConfig {}
46
+
47
+ /// Vite plugin options.
48
+ vite: VitePluginConfig.VitePluginConfig = new VitePluginConfig.VitePluginConfig {}
49
+
50
+ /// Linter options.
51
+ linter: LinterConfig.LinterConfig = new LinterConfig.LinterConfig {}
52
+
53
+ /// Type checker options.
54
+ typeChecker: TypeCheckerConfig.TypeCheckerConfig = new TypeCheckerConfig.TypeCheckerConfig {}
55
+
56
+ /// Formatter options.
57
+ formatter: FormatterConfig.FormatterConfig = new FormatterConfig.FormatterConfig {}
58
+
59
+ /// Language server options.
60
+ languageServer: LanguageServerConfig.LanguageServerConfig = new LanguageServerConfig.LanguageServerConfig {}
61
+
62
+ /// Legacy alias for `languageServer`.
63
+ @Deprecated {
64
+ message = "Use languageServer instead."
65
+ replaceWith = "languageServer"
66
+ }
67
+ lsp: LanguageServerConfig.LanguageServerConfig = languageServer
68
+
69
+ /// Musea component gallery options.
70
+ musea: MuseaConfig.MuseaConfig = new MuseaConfig.MuseaConfig {}
71
+
72
+ /// Global type declarations.
73
+ globalTypes: GlobalTypesConfig.GlobalTypesConfig = new GlobalTypesConfig.GlobalTypesConfig {}
74
+ }
75
+
76
+ /// Human-readable entry name for inspect output and diagnostics.
77
+ name: String? = null
78
+
79
+ /// Directory used as the base for scoped file patterns and relative paths.
80
+ basePath: String? = null
81
+
82
+ /// Glob patterns this config applies to.
83
+ files: Listing<String>? = null
84
+
85
+ /// Glob patterns this config excludes.
86
+ ignores: Listing<String>? = null
87
+
88
+ /// Base config files or presets amended by this config.
89
+ `extends`: ConfigExtends? = null
90
+
26
91
  /// Vue compiler options.
27
92
  compiler: CompilerConfig.CompilerConfig = new CompilerConfig.CompilerConfig {}
28
93
 
@@ -53,3 +118,6 @@ musea: MuseaConfig.MuseaConfig = new MuseaConfig.MuseaConfig {}
53
118
 
54
119
  /// Global type declarations.
55
120
  globalTypes: GlobalTypesConfig.GlobalTypesConfig = new GlobalTypesConfig.GlobalTypesConfig {}
121
+
122
+ /// Scoped config entries for monorepos and workspaces.
123
+ entries: Listing<ConfigEntry>? = null
@@ -15,6 +15,19 @@ local lintPresetEnum: JsonSchema = new JsonSchema {
15
15
  enum = new Listing { "happy-path"; "opinionated"; "essential"; "incremental"; "ecosystem"; "nuxt" }
16
16
  }
17
17
 
18
+ local stringListDef: JsonSchema = new JsonSchema {
19
+ type = "array"
20
+ items = new JsonSchema { type = "string" }
21
+ }
22
+
23
+ local configExtendsDef: JsonSchema = new JsonSchema {
24
+ description = "Base config files or presets to compose"
25
+ oneOf = new Listing {
26
+ new JsonSchema { type = "string" }
27
+ stringListDef
28
+ }
29
+ }
30
+
18
31
  local compilerConfigDef: JsonSchema = new JsonSchema {
19
32
  type = "object"
20
33
  description = "Vue compiler options"
@@ -594,6 +607,42 @@ local globalTypesConfigDef: JsonSchema = new JsonSchema {
594
607
  }
595
608
  }
596
609
 
610
+ local configEntryDef: JsonSchema = new JsonSchema {
611
+ type = "object"
612
+ description = "Scoped Vize config entry for monorepos and workspaces"
613
+ properties {
614
+ ["name"] = new JsonSchema {
615
+ type = "string"
616
+ description = "Human-readable entry name for inspect output and diagnostics"
617
+ }
618
+ ["basePath"] = new JsonSchema {
619
+ type = "string"
620
+ description = "Directory used as the base for scoped file patterns and relative paths"
621
+ }
622
+ ["files"] = new JsonSchema {
623
+ type = "array"
624
+ items = new JsonSchema { type = "string" }
625
+ description = "Glob patterns this entry applies to"
626
+ }
627
+ ["ignores"] = new JsonSchema {
628
+ type = "array"
629
+ items = new JsonSchema { type = "string" }
630
+ description = "Glob patterns this entry excludes"
631
+ }
632
+ ["extends"] = configExtendsDef
633
+ ["compiler"] = new JsonSchema { `$ref` = "#/definitions/CompilerConfig" }
634
+ ["vite"] = new JsonSchema { `$ref` = "#/definitions/VitePluginConfig" }
635
+ ["linter"] = new JsonSchema { `$ref` = "#/definitions/LinterConfig" }
636
+ ["typeChecker"] = new JsonSchema { `$ref` = "#/definitions/TypeCheckerConfig" }
637
+ ["formatter"] = new JsonSchema { `$ref` = "#/definitions/FormatterConfig" }
638
+ ["languageServer"] = new JsonSchema { `$ref` = "#/definitions/LanguageServerConfig" }
639
+ ["lsp"] = new JsonSchema { `$ref` = "#/definitions/LanguageServerConfig" }
640
+ ["musea"] = new JsonSchema { `$ref` = "#/definitions/MuseaConfig" }
641
+ ["globalTypes"] = new JsonSchema { `$ref` = "#/definitions/GlobalTypesConfig" }
642
+ }
643
+ additionalProperties = false
644
+ }
645
+
597
646
  output {
598
647
  value = new JsonSchema {
599
648
  `$schema` = "http://json-schema.org/draft-07/schema#"
@@ -614,12 +663,32 @@ output {
614
663
  ["MuseaConfig"] = museaConfigDef
615
664
  ["GlobalTypeDeclaration"] = globalTypeDeclarationDef
616
665
  ["GlobalTypesConfig"] = globalTypesConfigDef
666
+ ["VizeConfigEntry"] = configEntryDef
617
667
  }
618
668
  properties {
619
669
  ["$schema"] = new JsonSchema {
620
670
  type = "string"
621
671
  description = "JSON Schema reference for editor autocompletion"
622
672
  }
673
+ ["name"] = new JsonSchema {
674
+ type = "string"
675
+ description = "Human-readable entry name for inspect output and diagnostics"
676
+ }
677
+ ["basePath"] = new JsonSchema {
678
+ type = "string"
679
+ description = "Directory used as the base for scoped file patterns and relative paths"
680
+ }
681
+ ["files"] = new JsonSchema {
682
+ type = "array"
683
+ items = new JsonSchema { type = "string" }
684
+ description = "Glob patterns this config applies to"
685
+ }
686
+ ["ignores"] = new JsonSchema {
687
+ type = "array"
688
+ items = new JsonSchema { type = "string" }
689
+ description = "Glob patterns this config excludes"
690
+ }
691
+ ["extends"] = configExtendsDef
623
692
  ["compiler"] = new JsonSchema { `$ref` = "#/definitions/CompilerConfig" }
624
693
  ["vite"] = new JsonSchema { `$ref` = "#/definitions/VitePluginConfig" }
625
694
  ["linter"] = new JsonSchema { `$ref` = "#/definitions/LinterConfig" }
@@ -629,6 +698,11 @@ output {
629
698
  ["lsp"] = new JsonSchema { `$ref` = "#/definitions/LanguageServerConfig" }
630
699
  ["musea"] = new JsonSchema { `$ref` = "#/definitions/MuseaConfig" }
631
700
  ["globalTypes"] = new JsonSchema { `$ref` = "#/definitions/GlobalTypesConfig" }
701
+ ["entries"] = new JsonSchema {
702
+ type = "array"
703
+ items = new JsonSchema { `$ref` = "#/definitions/VizeConfigEntry" }
704
+ description = "Scoped config entries for monorepos and workspaces"
705
+ }
632
706
  }
633
707
  additionalProperties = false
634
708
  }
package/pkl/vize.pkl CHANGED
@@ -15,6 +15,7 @@ typealias LintPreset = "happy-path" | "opinionated" | "essential" | "incremental
15
15
  typealias TrailingComma = "all" | "none" | "es5"
16
16
  typealias FilterPattern = String | Listing<String>
17
17
  typealias GlobalTypeValue = String | GlobalTypeDeclaration
18
+ typealias ConfigExtends = String | Listing<String>
18
19
 
19
20
  class CompilerConfig {
20
21
  mode: CompilerMode? = null
@@ -139,6 +140,29 @@ class GlobalTypeDeclaration {
139
140
  defaultValue: String? = null
140
141
  }
141
142
 
143
+ class ConfigEntry {
144
+ name: String? = null
145
+ basePath: String? = null
146
+ files: Listing<String>? = null
147
+ ignores: Listing<String>? = null
148
+ `extends`: ConfigExtends? = null
149
+ compiler: CompilerConfig?
150
+ vite: VitePluginConfig?
151
+ linter: LinterConfig?
152
+ typeChecker: TypeCheckerConfig?
153
+ formatter: FormatterConfig?
154
+ languageServer: LspConfig?
155
+ /// Deprecated: use `languageServer`.
156
+ lsp: LspConfig?
157
+ musea: MuseaConfig?
158
+ globalTypes: Mapping<String, GlobalTypeValue>? = null
159
+ }
160
+
161
+ name: String? = null
162
+ basePath: String? = null
163
+ files: Listing<String>? = null
164
+ ignores: Listing<String>? = null
165
+ `extends`: ConfigExtends? = null
142
166
  compiler: CompilerConfig?
143
167
  vite: VitePluginConfig?
144
168
  linter: LinterConfig?
@@ -149,3 +173,4 @@ languageServer: LspConfig?
149
173
  lsp: LspConfig?
150
174
  musea: MuseaConfig?
151
175
  globalTypes: Mapping<String, GlobalTypeValue>? = null
176
+ entries: Listing<ConfigEntry>? = null
@@ -619,6 +619,76 @@
619
619
  }
620
620
  ]
621
621
  }
622
+ },
623
+ "VizeConfigEntry": {
624
+ "description": "Scoped Vize config entry for monorepos and workspaces",
625
+ "type": "object",
626
+ "properties": {
627
+ "name": {
628
+ "description": "Human-readable entry name for inspect output and diagnostics",
629
+ "type": "string"
630
+ },
631
+ "basePath": {
632
+ "description": "Directory used as the base for scoped file patterns and relative paths",
633
+ "type": "string"
634
+ },
635
+ "files": {
636
+ "description": "Glob patterns this entry applies to",
637
+ "type": "array",
638
+ "items": {
639
+ "type": "string"
640
+ }
641
+ },
642
+ "ignores": {
643
+ "description": "Glob patterns this entry excludes",
644
+ "type": "array",
645
+ "items": {
646
+ "type": "string"
647
+ }
648
+ },
649
+ "extends": {
650
+ "description": "Base config files or presets to compose",
651
+ "oneOf": [
652
+ {
653
+ "type": "string"
654
+ },
655
+ {
656
+ "type": "array",
657
+ "items": {
658
+ "type": "string"
659
+ }
660
+ }
661
+ ]
662
+ },
663
+ "compiler": {
664
+ "$ref": "#/definitions/CompilerConfig"
665
+ },
666
+ "vite": {
667
+ "$ref": "#/definitions/VitePluginConfig"
668
+ },
669
+ "linter": {
670
+ "$ref": "#/definitions/LinterConfig"
671
+ },
672
+ "typeChecker": {
673
+ "$ref": "#/definitions/TypeCheckerConfig"
674
+ },
675
+ "formatter": {
676
+ "$ref": "#/definitions/FormatterConfig"
677
+ },
678
+ "languageServer": {
679
+ "$ref": "#/definitions/LanguageServerConfig"
680
+ },
681
+ "lsp": {
682
+ "$ref": "#/definitions/LanguageServerConfig"
683
+ },
684
+ "musea": {
685
+ "$ref": "#/definitions/MuseaConfig"
686
+ },
687
+ "globalTypes": {
688
+ "$ref": "#/definitions/GlobalTypesConfig"
689
+ }
690
+ },
691
+ "additionalProperties": false
622
692
  }
623
693
  },
624
694
  "title": "VizeConfig",
@@ -629,6 +699,42 @@
629
699
  "description": "JSON Schema reference for editor autocompletion",
630
700
  "type": "string"
631
701
  },
702
+ "name": {
703
+ "description": "Human-readable entry name for inspect output and diagnostics",
704
+ "type": "string"
705
+ },
706
+ "basePath": {
707
+ "description": "Directory used as the base for scoped file patterns and relative paths",
708
+ "type": "string"
709
+ },
710
+ "files": {
711
+ "description": "Glob patterns this config applies to",
712
+ "type": "array",
713
+ "items": {
714
+ "type": "string"
715
+ }
716
+ },
717
+ "ignores": {
718
+ "description": "Glob patterns this config excludes",
719
+ "type": "array",
720
+ "items": {
721
+ "type": "string"
722
+ }
723
+ },
724
+ "extends": {
725
+ "description": "Base config files or presets to compose",
726
+ "oneOf": [
727
+ {
728
+ "type": "string"
729
+ },
730
+ {
731
+ "type": "array",
732
+ "items": {
733
+ "type": "string"
734
+ }
735
+ }
736
+ ]
737
+ },
632
738
  "compiler": {
633
739
  "$ref": "#/definitions/CompilerConfig"
634
740
  },
@@ -655,6 +761,13 @@
655
761
  },
656
762
  "globalTypes": {
657
763
  "$ref": "#/definitions/GlobalTypesConfig"
764
+ },
765
+ "entries": {
766
+ "description": "Scoped config entries for monorepos and workspaces",
767
+ "type": "array",
768
+ "items": {
769
+ "$ref": "#/definitions/VizeConfigEntry"
770
+ }
658
771
  }
659
772
  },
660
773
  "additionalProperties": false
package/src/config.ts CHANGED
@@ -7,6 +7,8 @@ import { transform } from "oxc-transform";
7
7
  import type {
8
8
  LanguageServerConfig,
9
9
  VizeConfig,
10
+ VizeConfigEntry,
11
+ ResolvedVizeConfig,
10
12
  LoadConfigOptions,
11
13
  UserConfigExport,
12
14
  ConfigEnv,
@@ -44,6 +46,10 @@ type CompatVizeConfig = VizeConfig & {
44
46
  lsp?: LanguageServerConfig;
45
47
  };
46
48
 
49
+ type CompatVizeConfigEntry = VizeConfigEntry & {
50
+ lsp?: LanguageServerConfig;
51
+ };
52
+
47
53
  /**
48
54
  * Define a Vize configuration with type checking.
49
55
  * Accepts a plain object or a function that receives ConfigEnv.
@@ -58,7 +64,7 @@ export function defineConfig(config: UserConfigExport): UserConfigExport {
58
64
  export async function loadConfig(
59
65
  root: string,
60
66
  options: LoadConfigOptions = {},
61
- ): Promise<VizeConfig | null> {
67
+ ): Promise<ResolvedVizeConfig | null> {
62
68
  const { mode = "root", configFile, env } = options;
63
69
 
64
70
  if (mode === "none") {
@@ -80,7 +86,7 @@ export async function loadConfig(
80
86
  return loadConfigFromDir(root, env);
81
87
  }
82
88
 
83
- async function loadConfigFromDir(dir: string, env?: ConfigEnv): Promise<VizeConfig | null> {
89
+ async function loadConfigFromDir(dir: string, env?: ConfigEnv): Promise<ResolvedVizeConfig | null> {
84
90
  for (const name of CONFIG_FILE_NAMES) {
85
91
  const filePath = path.join(dir, name);
86
92
  if (!fs.existsSync(filePath)) {
@@ -98,7 +104,7 @@ async function loadConfigFromDir(dir: string, env?: ConfigEnv): Promise<VizeConf
98
104
  async function loadConfigFromDirAuto(
99
105
  startDir: string,
100
106
  env?: ConfigEnv,
101
- ): Promise<VizeConfig | null> {
107
+ ): Promise<ResolvedVizeConfig | null> {
102
108
  let currentDir = path.resolve(startDir);
103
109
 
104
110
  while (true) {
@@ -116,7 +122,10 @@ async function loadConfigFromDirAuto(
116
122
  }
117
123
  }
118
124
 
119
- async function loadConfigFile(filePath: string, env?: ConfigEnv): Promise<VizeConfig | null> {
125
+ async function loadConfigFile(
126
+ filePath: string,
127
+ env?: ConfigEnv,
128
+ ): Promise<ResolvedVizeConfig | null> {
120
129
  const absolutePath = path.resolve(filePath);
121
130
  if (!fs.existsSync(absolutePath)) {
122
131
  return null;
@@ -175,7 +184,7 @@ function findPklBinary(): string | null {
175
184
  }
176
185
  }
177
186
 
178
- function loadPklConfig(filePath: string): VizeConfig | null {
187
+ function loadPklConfig(filePath: string): ResolvedVizeConfig | null {
179
188
  const pklBin = findPklBinary();
180
189
  if (!pklBin) {
181
190
  console.warn(
@@ -240,10 +249,10 @@ function createPklConfigWithBundledSchemaImports(filePath: string): string | nul
240
249
  return tempFile;
241
250
  }
242
251
 
243
- async function resolveConfigExport(
252
+ export async function resolveConfigExport(
244
253
  exported: UserConfigExport,
245
254
  env?: ConfigEnv,
246
- ): Promise<VizeConfig> {
255
+ ): Promise<ResolvedVizeConfig> {
247
256
  if (typeof exported === "function") {
248
257
  return normalizeLoadedConfig(await exported(env ?? DEFAULT_CONFIG_ENV));
249
258
  }
@@ -251,7 +260,10 @@ async function resolveConfigExport(
251
260
  return normalizeLoadedConfig(exported);
252
261
  }
253
262
 
254
- async function loadTypeScriptConfig(filePath: string, env?: ConfigEnv): Promise<VizeConfig> {
263
+ async function loadTypeScriptConfig(
264
+ filePath: string,
265
+ env?: ConfigEnv,
266
+ ): Promise<ResolvedVizeConfig> {
255
267
  const source = fs.readFileSync(filePath, "utf-8");
256
268
  const result = await transform(filePath, source, {
257
269
  typescript: {
@@ -274,7 +286,7 @@ async function loadTypeScriptConfig(filePath: string, env?: ConfigEnv): Promise<
274
286
  }
275
287
  }
276
288
 
277
- async function loadESMConfig(filePath: string, env?: ConfigEnv): Promise<VizeConfig> {
289
+ async function loadESMConfig(filePath: string, env?: ConfigEnv): Promise<ResolvedVizeConfig> {
278
290
  const module = await importFresh(filePath);
279
291
  const exported: UserConfigExport = module.default || module;
280
292
  return resolveConfigExport(exported, env);
@@ -286,7 +298,7 @@ async function importFresh(filePath: string): Promise<Record<string, unknown>> {
286
298
  return import(fileUrl.href);
287
299
  }
288
300
 
289
- function parseJsonConfig(content: string, filePath: string): VizeConfig {
301
+ function parseJsonConfig(content: string, filePath: string): ResolvedVizeConfig {
290
302
  try {
291
303
  return normalizeLoadedConfig(JSON.parse(content));
292
304
  } catch (error) {
@@ -294,9 +306,86 @@ function parseJsonConfig(content: string, filePath: string): VizeConfig {
294
306
  }
295
307
  }
296
308
 
297
- function normalizeLoadedConfig(config: unknown): VizeConfig {
309
+ function normalizeLoadedConfig(config: unknown): ResolvedVizeConfig {
298
310
  const normalized = stripNullish(config);
299
- return normalizeConfigAliases((normalized ?? {}) as CompatVizeConfig);
311
+ if (Array.isArray(normalized)) {
312
+ return normalizeConfigEntries(normalized as CompatVizeConfigEntry[]);
313
+ }
314
+
315
+ return normalizeConfigObject((normalized ?? {}) as CompatVizeConfig);
316
+ }
317
+
318
+ function normalizeConfigObject(config: CompatVizeConfig): ResolvedVizeConfig {
319
+ const { entries: rawEntries, ...rootConfig } = normalizeConfigAliases(config) as VizeConfig & {
320
+ entries?: CompatVizeConfigEntry[];
321
+ };
322
+ const rootEntry = rootConfig as VizeConfigEntry;
323
+ const entries = [
324
+ ...(isEmptyConfigEntry(rootEntry) ? [] : [rootEntry]),
325
+ ...(rawEntries ?? []).map((entry) => normalizeConfigAliases(entry) as VizeConfigEntry),
326
+ ];
327
+
328
+ return {
329
+ ...rootEntry,
330
+ entries,
331
+ };
332
+ }
333
+
334
+ function normalizeConfigEntries(entries: CompatVizeConfigEntry[]): ResolvedVizeConfig {
335
+ const normalizedEntries = entries.map(
336
+ (entry) => normalizeConfigAliases(entry) as VizeConfigEntry,
337
+ );
338
+ const globalConfig = mergeConfigEntries(normalizedEntries.filter(isGlobalConfigEntry));
339
+
340
+ return {
341
+ ...globalConfig,
342
+ entries: normalizedEntries,
343
+ };
344
+ }
345
+
346
+ function mergeConfigEntries(entries: VizeConfigEntry[]): VizeConfigEntry {
347
+ const result: Record<string, unknown> = {};
348
+ for (const entry of entries) {
349
+ deepMerge(result, stripEntryMetadata(entry));
350
+ }
351
+ return result as VizeConfigEntry;
352
+ }
353
+
354
+ function stripEntryMetadata(entry: VizeConfigEntry): Partial<VizeConfigEntry> {
355
+ const { name, basePath, files, ignores, extends: extendsConfig, ...config } = entry;
356
+ void name;
357
+ void basePath;
358
+ void files;
359
+ void ignores;
360
+ void extendsConfig;
361
+ return config;
362
+ }
363
+
364
+ function deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): void {
365
+ for (const [key, value] of Object.entries(source)) {
366
+ if (value === undefined) {
367
+ continue;
368
+ }
369
+
370
+ const current = target[key];
371
+ if (isPlainObject(current) && isPlainObject(value)) {
372
+ deepMerge(current, value);
373
+ } else {
374
+ target[key] = value;
375
+ }
376
+ }
377
+ }
378
+
379
+ function isGlobalConfigEntry(entry: VizeConfigEntry): boolean {
380
+ return entry.basePath === undefined && entry.files === undefined && entry.ignores === undefined;
381
+ }
382
+
383
+ function isEmptyConfigEntry(entry: VizeConfigEntry): boolean {
384
+ return Object.keys(entry).length === 0;
385
+ }
386
+
387
+ function isPlainObject(value: unknown): value is Record<string, unknown> {
388
+ return typeof value === "object" && value !== null && !Array.isArray(value);
300
389
  }
301
390
 
302
391
  function stripNullish(value: unknown): unknown {
package/src/index.ts CHANGED
@@ -29,8 +29,11 @@ export type {
29
29
  LintPreset,
30
30
  RuleSeverity,
31
31
  RuleCategory,
32
+ VizeConfigEntry,
32
33
  LintRuleName,
33
34
  LintRulesConfig,
35
+ UserConfigInput,
36
+ ResolvedVizeConfig,
34
37
  } from "./types/index.js";
35
38
 
36
39
  // Config utilities
@@ -40,5 +43,6 @@ export {
40
43
  VIZE_CONFIG_PKL_SCHEMA_PATH,
41
44
  defineConfig,
42
45
  loadConfig,
46
+ resolveConfigExport,
43
47
  normalizeGlobalTypes,
44
48
  } from "./config.js";
@@ -21,6 +21,26 @@ export type RuleCategory = "correctness" | "suspicious" | "style" | "perf" | "a1
21
21
  * Configuration file for vize - High-performance Vue.js toolchain
22
22
  */
23
23
  export interface VizeConfig {
24
+ /**
25
+ * Human-readable entry name for inspect output and diagnostics
26
+ */
27
+ name?: string;
28
+ /**
29
+ * Directory used as the base for scoped file patterns and relative paths
30
+ */
31
+ basePath?: string;
32
+ /**
33
+ * Glob patterns this config applies to
34
+ */
35
+ files?: string[];
36
+ /**
37
+ * Glob patterns this config excludes
38
+ */
39
+ ignores?: string[];
40
+ /**
41
+ * Base config files or presets to compose
42
+ */
43
+ extends?: string | string[];
24
44
  compiler?: CompilerConfig;
25
45
  vite?: VitePluginConfig;
26
46
  linter?: LinterConfig;
@@ -30,6 +50,10 @@ export interface VizeConfig {
30
50
  lsp?: LanguageServerConfig;
31
51
  musea?: MuseaConfig;
32
52
  globalTypes?: GlobalTypesConfig;
53
+ /**
54
+ * Scoped config entries for monorepos and workspaces
55
+ */
56
+ entries?: VizeConfigEntry[];
33
57
  }
34
58
  /**
35
59
  * Vue compiler options
@@ -488,3 +512,37 @@ export interface GlobalTypeDeclaration {
488
512
  */
489
513
  defaultValue?: string;
490
514
  }
515
+ /**
516
+ * Scoped Vize config entry for monorepos and workspaces
517
+ */
518
+ export interface VizeConfigEntry {
519
+ /**
520
+ * Human-readable entry name for inspect output and diagnostics
521
+ */
522
+ name?: string;
523
+ /**
524
+ * Directory used as the base for scoped file patterns and relative paths
525
+ */
526
+ basePath?: string;
527
+ /**
528
+ * Glob patterns this entry applies to
529
+ */
530
+ files?: string[];
531
+ /**
532
+ * Glob patterns this entry excludes
533
+ */
534
+ ignores?: string[];
535
+ /**
536
+ * Base config files or presets to compose
537
+ */
538
+ extends?: string | string[];
539
+ compiler?: CompilerConfig;
540
+ vite?: VitePluginConfig;
541
+ linter?: LinterConfig;
542
+ typeChecker?: TypeCheckerConfig;
543
+ formatter?: FormatterConfig;
544
+ languageServer?: LanguageServerConfig;
545
+ lsp?: LanguageServerConfig;
546
+ musea?: MuseaConfig;
547
+ globalTypes?: GlobalTypesConfig;
548
+ }
@@ -3,6 +3,7 @@ export type {
3
3
  RuleSeverity,
4
4
  RuleCategory,
5
5
  VizeConfig,
6
+ VizeConfigEntry,
6
7
  CompilerConfig,
7
8
  VitePluginConfig,
8
9
  LinterConfig,
@@ -25,4 +26,11 @@ export type { LintRuleName, LintRulesConfig } from "./rules.js";
25
26
  */
26
27
  export type LspConfig = import("./generated.js").LanguageServerConfig;
27
28
 
28
- export type { MaybePromise, ConfigEnv, UserConfigExport, LoadConfigOptions } from "./runtime.js";
29
+ export type {
30
+ MaybePromise,
31
+ ConfigEnv,
32
+ UserConfigInput,
33
+ UserConfigExport,
34
+ ResolvedVizeConfig,
35
+ LoadConfigOptions,
36
+ } from "./runtime.js";
@@ -1,4 +1,4 @@
1
- import type { LanguageServerConfig, VizeConfig } from "./generated.js";
1
+ import type { LanguageServerConfig, VizeConfig, VizeConfigEntry } from "./generated.js";
2
2
 
3
3
  // ============================================================================
4
4
  // TS-specific runtime types (cannot be expressed in Pkl)
@@ -20,7 +20,19 @@ export type UserConfig = VizeConfig & {
20
20
  lsp?: LanguageServerConfig;
21
21
  };
22
22
 
23
- export type UserConfigExport = UserConfig | ((env: ConfigEnv) => MaybePromise<UserConfig>);
23
+ export type UserConfigInput = UserConfig | VizeConfigEntry[];
24
+
25
+ export type ResolvedVizeConfig = VizeConfig & {
26
+ /**
27
+ * Normalized flat entries. Plain object configs become one entry; array configs
28
+ * keep their order.
29
+ */
30
+ entries: VizeConfigEntry[];
31
+ };
32
+
33
+ export type UserConfigExport =
34
+ | UserConfigInput
35
+ | ((env: ConfigEnv) => MaybePromise<UserConfigInput>);
24
36
 
25
37
  // ============================================================================
26
38
  // LoadConfigOptions
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-MA8nXz11.d.mts","names":[],"sources":["../src/types/generated.ts","../src/types/rules.ts","../src/types/runtime.ts","../src/types/index.ts","../src/config.ts"],"mappings":";;AAOA;;;;KAAY,UAAA;AAAA,KAQA,YAAA;AAAA,KAEA,YAAA;;;;UAKK,UAAA;EACf,QAAA,GAAW,cAAA;EACX,IAAA,GAAO,gBAAA;EACP,MAAA,GAAS,YAAA;EACT,WAAA,GAAc,iBAAA;EACd,SAAA,GAAY,eAAA;EACZ,cAAA,GAAiB,oBAAA;EACjB,GAAA,GAAM,oBAAA;EACN,KAAA,GAAQ,WAAA;EACR,WAAA,GAAc,iBAAA;AAAA;;;;UAKC,cAAA;EANP;;;EAUR,IAAA;EAjBA;;;EAqBA,KAAA;EAnBA;;;EAuBA,GAAA;EArBA;;;EAyBA,eAAA;EAvBA;;;EA2BA,SAAA;EAzBA;;;EA6BA,iBAAA;EAxBe;;;EA4Bf,WAAA;EAxBA;;;EA4BA,aAAA;EAZA;;;EAgBA,IAAA;EAAA;;;EAIA,SAAA;EAQiB;;AAKnB;EATE,iBAAA;;;;EAIA,iBAAA;AAAA;;;;UAKe,gBAAA;EAIuB;;;EAAtC,OAAA,YAAmB,MAAA,aAAmB,MAAA;EAQtC;;;EAJA,OAAA,YAAmB,MAAA,aAAmB,MAAA;EAavB;;;EATf,YAAA;EAaA;;;EATA,cAAA;AAAA;;;;UAKe,YAAA;EAuBb;;;EAnBF,OAAA;EA0Be;;;EAtBf,MAAA;EA0BA;;;EAtBA,KAAA;IAAA,CACG,CAAA;EAAA;EA6CH;;;EAxCA,UAAA;IACE,WAAA;IACA,UAAA;IACA,KAAA;IACA,IAAA;IACA,IAAA;IACA,QAAA;EAAA;AAAA;;;;UAMa,iBAAA;EAyEf;;;EArEA,OAAA;EAqFA;;;EAjFA,MAAA;EAiGA;;;EA7FA,UAAA;EA6GA;;;EAzGA,UAAA;EAyHA;;;EArHA,qBAAA;EA6HU;AAKZ;;EA9HE,eAAA;EA8HmC;;;EA1HnC,iBAAA;EA0IA;;;EAtIA,mBAAA;EAsJA;;;EAlJA,qBAAA;EAkKA;;;EA9JA,QAAA;EA8KA;;;EA1KA,SAAA;EA0LA;;;EAtLA,QAAA;EAkMI;;AAKN;EAnME,WAAA;;;;EAIA,OAAA;AAAA;;;;UAKe,eAAA;EA0Mf;;;EAtMA,UAAA;EA4MA;;;EAxMA,QAAA;EAyM4B;;AAK9B;EA1ME,OAAA;;;;EAIA,IAAA;EAkNA;;;EA9MA,WAAA;EAgNe;;;EA5Mf,cAAA;EAgNA;;;EA5MA,aAAA;EAoNI;AAKN;;EArNE,cAAA;EAqN8B;;;EAjN9B,eAAA;EA0NY;;AAMd;EA5NE,WAAA;;;;EAIA,SAAA;EAqOgC;;;EAjOhC,UAAA;EAuOe;;;EAnOf,sBAAA;EA2OY;;;EAvOZ,uBAAA;EC5PW;;;EDgQX,cAAA;ECxIQ;AAEV;;ED0IE,kBAAA;EC1IiC;;AAEnC;ED4IE,wBAAA;;;;EAIA,oBAAA;EChJ4B;;;EDoJ5B,eAAA;ECpJoC;;;EDwJpC,4BAAA;ECxJqE;;;ED4JrE,UAAA;AAAA;;;;UAKe,oBAAA;EE5RiB;;;EFgShC,OAAA;EEhS4B;;;EFoS5B,IAAA;EEpSyC;AAE3C;;EFsSE,WAAA;EEtSwB;;;EF0SxB,SAAA;EEvSU;;AAGZ;EFwSE,MAAA;;;;EAIA,SAAA;EEvSM;;;EF2SN,UAAA;EExS0B;;;EF4S1B,KAAA;EE5S4E;;;EFgT5E,UAAA;EEhT6B;;;EFoT7B,UAAA;EEpT4E;;;EFwT5E,eAAA;EElTgC;;;EFsThC,gBAAA;EEzSA;;;EF6SA,UAAA;EExSe;;;EF4Sf,WAAA;EGjUU;;;EHqUV,MAAA;EGrUmE;;;EHyUnE,QAAA;EIlVW;;;EJsVX,cAAA;EIhVQ;AASV;;EJ2UE,aAAA;EIvUD;;AAED;EJyUE,aAAA;;;;EAIA,UAAA;EIhU0B;;;EJoU1B,UAAA;EIpU2B;;;EJwU3B,KAAA;EIjUoB;;;EJqUpB,IAAA;AAAA;;;;UAKe,WAAA;EIxUN;;;EJ4UT,OAAA;EI3UmB;;AAmRrB;EJ4DE,OAAA;;;;EAIA,QAAA;EI9DO;;;EJkEP,eAAA;EIlEC;;;EJsED,SAAA;EACA,GAAA,GAAM,cAAA;EACN,IAAA,GAAO,eAAA;EACP,OAAA,GAAU,kBAAA;AAAA;;;;UAKK,cAAA;;;;EAIf,SAAA;;;;EAIA,MAAA;;;;EAIA,SAAA,GAAY,aAAA;AAAA;AAAA,UAEG,aAAA;;;;EAIf,KAAA;;;;EAIA,MAAA;;;;EAIA,IAAA;AAAA;;;;UAKe,eAAA;;;;EAIf,OAAA;;;;EAIA,KAAA;IAAA,CACG,CAAA;EAAA;AAAA;;;;UAMY,kBAAA;;;;EAIf,OAAA;;;;EAIA,WAAA;AAAA;;;;UAKe,iBAAA;EAAA,CACd,CAAA,oBAAqB,qBAAA;AAAA;;;;UAKP,qBAAA;;;;EAIf,IAAA;;;;EAIA,YAAA;AAAA;;;cCneW,eAAA;AAAA,KA0HD,YAAA,WAAuB,eAAA;AAAA,KAEvB,eAAA,GAAkB,OAAA,CAAQ,MAAA,CAAO,YAAA,EAAc,YAAA;;;KC3H/C,YAAA,MAAkB,CAAA,GAAI,OAAA,CAAQ,CAAA;AAAA,UAEzB,SAAA;EACf,IAAA;EACA,OAAA;EACA,UAAA;AAAA;AAAA,KAGU,UAAA,GAAa,UAAA;;;;AFGzB;EEEE,GAAA,GAAM,oBAAA;AAAA;AAAA,KAGI,gBAAA,GAAmB,UAAA,KAAe,GAAA,EAAK,SAAA,KAAc,YAAA,CAAa,UAAA;AAAA,UAM7D,iBAAA;EFNA;;;;;;;EEcf,IAAA;EFRiB;;;EEajB,UAAA;EFV+B;;;EEe/B,GAAA,GAAM,SAAA;AAAA;;;;;;KCrBI,SAAA,GAAS,oBAAA;;;cCTR,iBAAA;AAAA,cAeA,4BAAA;AAAA,cAMA,2BAAA;;;AJtBb;;iBImCgB,YAAA,CAAa,MAAA,EAAQ,gBAAA,GAAmB,gBAAA;;;AJjCxD;iBIwCsB,UAAA,CACpB,IAAA,UACA,OAAA,GAAS,iBAAA,GACR,OAAA,CAAQ,UAAA;;;;iBAmRK,oBAAA,CACd,MAAA,EAAQ,iBAAA,GACP,MAAA,SAAe,qBAAA"}