vize 0.122.0 → 0.124.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
@@ -70,6 +70,7 @@ export default defineConfig({
70
70
  sourceMap: true,
71
71
  vapor: false,
72
72
  customRenderer: false,
73
+ vueParserQuirks: false,
73
74
  },
74
75
  vite: {
75
76
  scanPatterns: ["src/**/*.vue"],
@@ -120,17 +121,42 @@ Use the Rust CLI when you need Corsa project diagnostics across Vue, TS, TSX, an
120
121
 
121
122
  Important shared fields:
122
123
 
123
- | Field | Used by | Purpose |
124
- | ------------------------- | ---------------------- | ------------------------------------------------------- |
125
- | `compiler.sourceMap` | Vite plugin | Enable source maps |
126
- | `compiler.ssr` | npm build, Vite plugin | Force SSR compilation |
127
- | `compiler.vapor` | npm build, Vite plugin | Enable Vapor compilation |
128
- | `compiler.customRenderer` | npm build, Vite plugin | Support custom renderer element semantics |
129
- | `compiler.scriptExt` | npm build | Preserve TypeScript output or downcompile to JavaScript |
130
- | `vite.scanPatterns` | Vite plugin | Pre-compile matching Vue files |
131
- | `linter.preset` | npm lint | Select the Patina lint preset |
132
- | `typeChecker.strict` | npm check | Enable strict checks |
133
- | `formatter.printWidth` | npm fmt | Set formatting width |
124
+ | Field | Used by | Purpose |
125
+ | -------------------------- | ---------------------- | ------------------------------------------------------- |
126
+ | `compiler.sourceMap` | Vite plugin | Enable source maps |
127
+ | `compiler.ssr` | npm build, Vite plugin | Force SSR compilation |
128
+ | `compiler.vapor` | npm build, Vite plugin | Enable Vapor compilation |
129
+ | `compiler.customRenderer` | npm build, Vite plugin | Support custom renderer element semantics |
130
+ | `compiler.vueParserQuirks` | npm build, Vite plugin | Enable Vue parser quirk compatibility |
131
+ | `compiler.scriptExt` | npm build | Preserve TypeScript output or downcompile to JavaScript |
132
+ | `vite.scanPatterns` | Vite plugin | Pre-compile matching Vue files |
133
+ | `linter.preset` | npm lint | Select the Patina lint preset |
134
+ | `typeChecker.strict` | npm check | Enable strict checks |
135
+ | `formatter.printWidth` | npm fmt | Set formatting width |
136
+
137
+ ### Vue parser quirks
138
+
139
+ `compiler.vueParserQuirks` is off by default. Keep it disabled for strict parsing, and enable it
140
+ when a project must compile templates that Vue currently accepts through parser edge-case behavior.
141
+
142
+ The supported quirk covers `v-for` aliases with an unmatched edge parenthesis. Vue strips a leading
143
+ `(` or trailing `)` from the alias before splitting `value`, `key`, and `index`; Vize reports those
144
+ as malformed in strict mode and mirrors Vue only when this flag is enabled.
145
+
146
+ ```vue
147
+ <template>
148
+ <!-- Strict mode rejects this. Quirk mode compiles it as `item in items`. -->
149
+ <div v-for="item in items">{{ item }}</div>
150
+
151
+ <!-- Strict mode rejects this. Quirk mode compiles it as `item in items`. -->
152
+ <div v-for="item in items">{{ item }}</div>
153
+ </template>
154
+ ```
155
+
156
+ Vue upstream reference:
157
+
158
+ - [`forAliasRE`](https://github.com/vuejs/core/blob/main/packages/compiler-core/src/utils.ts#L571)
159
+ - [`stripParensRE` in `parseForExpression`](https://github.com/vuejs/core/blob/main/packages/compiler-core/src/parser.ts#L493-L530)
134
160
 
135
161
  ## Programmatic Config Helpers
136
162
 
@@ -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
@@ -37,6 +61,10 @@ interface CompilerConfig {
37
61
  * Enable SSR mode
38
62
  */
39
63
  ssr?: boolean;
64
+ /**
65
+ * Enable Vue parser quirk compatibility
66
+ */
67
+ vueParserQuirks?: boolean;
40
68
  /**
41
69
  * Enable source map generation
42
70
  */
@@ -474,6 +502,40 @@ interface GlobalTypeDeclaration {
474
502
  */
475
503
  defaultValue?: string;
476
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
+ }
477
539
  //#endregion
478
540
  //#region src/types/rules.d.ts
479
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"];
@@ -494,7 +556,15 @@ type UserConfig = VizeConfig & {
494
556
  */
495
557
  lsp?: LanguageServerConfig;
496
558
  };
497
- 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>);
498
568
  interface LoadConfigOptions {
499
569
  /**
500
570
  * Config file search mode
@@ -532,11 +602,12 @@ declare function defineConfig(config: UserConfigExport): UserConfigExport;
532
602
  /**
533
603
  * Load `vize.config.*` from the specified directory.
534
604
  */
535
- 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>;
536
607
  /**
537
608
  * Normalize GlobalTypesConfig shorthand strings to GlobalTypeDeclaration objects
538
609
  */
539
610
  declare function normalizeGlobalTypes(config: GlobalTypesConfig): Record<string, GlobalTypeDeclaration>;
540
611
  //#endregion
541
- 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 };
542
- //# sourceMappingURL=config-CczvMtD4.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-CczvMtD4.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-CczvMtD4.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.122.0",
3
+ "version": "0.124.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.122.0",
52
+ "@vizejs/native": "0.124.0",
53
53
  "oxc-transform": "0.130.0"
54
54
  },
55
55
  "devDependencies": {
@@ -11,6 +11,9 @@ class CompilerConfig {
11
11
  /// Enable SSR mode.
12
12
  ssr: Boolean = false
13
13
 
14
+ /// Enable Vue parser quirk compatibility.
15
+ vueParserQuirks: Boolean = false
16
+
14
17
  /// Enable source map generation.
15
18
  sourceMap: Boolean = false
16
19
 
@@ -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"
@@ -35,6 +48,11 @@ local compilerConfigDef: JsonSchema = new JsonSchema {
35
48
  description = "Enable SSR mode"
36
49
  default = false
37
50
  }
51
+ ["vueParserQuirks"] = new JsonSchema {
52
+ type = "boolean"
53
+ description = "Enable Vue parser quirk compatibility"
54
+ default = false
55
+ }
38
56
  ["sourceMap"] = new JsonSchema {
39
57
  type = "boolean"
40
58
  description = "Enable source map generation"
@@ -589,6 +607,42 @@ local globalTypesConfigDef: JsonSchema = new JsonSchema {
589
607
  }
590
608
  }
591
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
+
592
646
  output {
593
647
  value = new JsonSchema {
594
648
  `$schema` = "http://json-schema.org/draft-07/schema#"
@@ -609,12 +663,32 @@ output {
609
663
  ["MuseaConfig"] = museaConfigDef
610
664
  ["GlobalTypeDeclaration"] = globalTypeDeclarationDef
611
665
  ["GlobalTypesConfig"] = globalTypesConfigDef
666
+ ["VizeConfigEntry"] = configEntryDef
612
667
  }
613
668
  properties {
614
669
  ["$schema"] = new JsonSchema {
615
670
  type = "string"
616
671
  description = "JSON Schema reference for editor autocompletion"
617
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
618
692
  ["compiler"] = new JsonSchema { `$ref` = "#/definitions/CompilerConfig" }
619
693
  ["vite"] = new JsonSchema { `$ref` = "#/definitions/VitePluginConfig" }
620
694
  ["linter"] = new JsonSchema { `$ref` = "#/definitions/LinterConfig" }
@@ -624,6 +698,11 @@ output {
624
698
  ["lsp"] = new JsonSchema { `$ref` = "#/definitions/LanguageServerConfig" }
625
699
  ["musea"] = new JsonSchema { `$ref` = "#/definitions/MuseaConfig" }
626
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
+ }
627
706
  }
628
707
  additionalProperties = false
629
708
  }
package/pkl/vize.pkl CHANGED
@@ -15,12 +15,14 @@ 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
21
22
  vapor: Boolean? = null
22
23
  customRenderer: Boolean? = null
23
24
  ssr: Boolean? = null
25
+ vueParserQuirks: Boolean? = null
24
26
  sourceMap: Boolean? = null
25
27
  prefixIdentifiers: Boolean? = null
26
28
  hoistStatic: Boolean? = null
@@ -138,6 +140,29 @@ class GlobalTypeDeclaration {
138
140
  defaultValue: String? = null
139
141
  }
140
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
141
166
  compiler: CompilerConfig?
142
167
  vite: VitePluginConfig?
143
168
  linter: LinterConfig?
@@ -148,3 +173,4 @@ languageServer: LspConfig?
148
173
  lsp: LspConfig?
149
174
  musea: MuseaConfig?
150
175
  globalTypes: Mapping<String, GlobalTypeValue>? = null
176
+ entries: Listing<ConfigEntry>? = null
@@ -21,6 +21,11 @@
21
21
  "default": false,
22
22
  "type": "boolean"
23
23
  },
24
+ "vueParserQuirks": {
25
+ "description": "Enable Vue parser quirk compatibility",
26
+ "default": false,
27
+ "type": "boolean"
28
+ },
24
29
  "sourceMap": {
25
30
  "description": "Enable source map generation",
26
31
  "type": "boolean"
@@ -614,6 +619,76 @@
614
619
  }
615
620
  ]
616
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
617
692
  }
618
693
  },
619
694
  "title": "VizeConfig",
@@ -624,6 +699,42 @@
624
699
  "description": "JSON Schema reference for editor autocompletion",
625
700
  "type": "string"
626
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
+ },
627
738
  "compiler": {
628
739
  "$ref": "#/definitions/CompilerConfig"
629
740
  },
@@ -650,6 +761,13 @@
650
761
  },
651
762
  "globalTypes": {
652
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
+ }
653
771
  }
654
772
  },
655
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
@@ -47,6 +71,10 @@ export interface CompilerConfig {
47
71
  * Enable SSR mode
48
72
  */
49
73
  ssr?: boolean;
74
+ /**
75
+ * Enable Vue parser quirk compatibility
76
+ */
77
+ vueParserQuirks?: boolean;
50
78
  /**
51
79
  * Enable source map generation
52
80
  */
@@ -484,3 +512,37 @@ export interface GlobalTypeDeclaration {
484
512
  */
485
513
  defaultValue?: string;
486
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-CczvMtD4.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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"}