@vizejs/nuxt 0.429.1 → 0.430.1

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.
@@ -403,8 +403,20 @@ interface NuxtLintConfigAddon {
403
403
  name: string;
404
404
  getConfigs(): NuxtLintAwaitable<readonly NuxtLintConfigItem[] | undefined>;
405
405
  }
406
+ /** Nuxt options that decide whether an unimport registry is actually injected. */
407
+ interface NuxtLintAutoImportOptions {
408
+ imports?: false | {
409
+ autoImport?: boolean;
410
+ };
411
+ nitro?: {
412
+ imports?: false | {
413
+ autoImport?: boolean;
414
+ };
415
+ };
416
+ }
406
417
  /** The Nuxt hook surface used by lint config addons. */
407
418
  interface NuxtLintConfigAddonNuxt {
419
+ options?: NuxtLintAutoImportOptions;
408
420
  hook(name: "imports:context" | "nitro:init", callback: (value: unknown) => unknown): void;
409
421
  callHook(name: typeof VIZE_NUXT_LINT_CONFIG_ADDONS_HOOK, addons: NuxtLintConfigAddon[]): NuxtLintAwaitable<void>;
410
422
  }
@@ -3,12 +3,19 @@ import { existsSync } from "node:fs";
3
3
  import path from "node:path";
4
4
  import { spawn } from "node:child_process";
5
5
  import { glob, lstat, mkdir, open, readFile, rename, unlink, writeFile } from "node:fs/promises";
6
- import { Worker, isMainThread, parentPort } from "node:worker_threads";
7
6
  import { fileURLToPath, pathToFileURL } from "node:url";
7
+ import { Worker, isMainThread, parentPort } from "node:worker_threads";
8
8
  import { randomBytes, randomUUID } from "node:crypto";
9
9
  import { buildNuxtLintPlan, collectNuxtLintDirs, resolveNuxtLintFeatures } from "@vizejs/nuxt-lint-config";
10
10
  import { createServer } from "node:http";
11
11
  //#region src/builder.ts
12
+ function getDetectedNuxtMajor(nuxt) {
13
+ const nuxtLike = nuxt;
14
+ const version = nuxtLike?._version ?? nuxtLike?.version ?? nuxtLike?.options?._nuxtVersion;
15
+ if (!version) return null;
16
+ const major = Number.parseInt(version.split(".")[0] ?? "", 10);
17
+ return major === 2 || major === 3 || major === 4 ? major : null;
18
+ }
12
19
  function isViteNuxtBuilder(builder) {
13
20
  if (typeof builder !== "string") return false;
14
21
  return builder === "vite" || builder.includes("vite-builder") || builder === "rolldown-vite" || builder.includes("rolldown-vite-builder");
@@ -17,6 +24,12 @@ function isWebpackNuxtBuilder(builder) {
17
24
  if (typeof builder !== "string") return false;
18
25
  return builder === "webpack" || builder.includes("webpack-builder");
19
26
  }
27
+ function hasNuxtViteCompilerSupport(nuxt) {
28
+ if (isWebpackNuxtBuilder(nuxt.options.builder)) return false;
29
+ if (isViteNuxtBuilder(nuxt.options.builder)) return true;
30
+ if (nuxt.options.vite) return true;
31
+ return getDetectedNuxtMajor(nuxt) !== 2;
32
+ }
20
33
  function getNuxtBuilderKind(builder) {
21
34
  if (isViteNuxtBuilder(builder)) return "vite";
22
35
  if (isWebpackNuxtBuilder(builder)) return "webpack";
@@ -79,12 +92,12 @@ function matchesNuxtLintCheckerFile(file, rootDir, options) {
79
92
  }
80
93
  //#endregion
81
94
  //#region src/lint/checker/worker.ts
82
- function resolveOxlintEntrypoint(cwd) {
95
+ function resolveOxlintEntrypoint() {
83
96
  try {
84
- const manifest = createRequire(path.join(cwd, "package.json")).resolve("oxlint/package.json");
85
- return path.join(path.dirname(manifest), "bin", "oxlint");
97
+ const plugin = fileURLToPath(import.meta.resolve("oxlint-plugin-vize"));
98
+ return path.resolve(path.dirname(plugin), "..", "bin", "oxlint-vize");
86
99
  } catch (error) {
87
- throw new Error(`Unable to resolve oxlint from ${cwd}. Install oxlint before enabling the Nuxt lint checker.`, { cause: error });
100
+ throw new Error("Unable to resolve oxlint-vize. Install oxlint-plugin-vize before enabling the Nuxt lint checker.", { cause: error });
88
101
  }
89
102
  }
90
103
  function projectPattern(pattern, cwd) {
@@ -214,7 +227,7 @@ async function runNuxtLintCheckerTask(task) {
214
227
  hasWarnings: false,
215
228
  output: ""
216
229
  };
217
- const stdout = await executeOxlint(task.oxlintEntrypoint ?? resolveOxlintEntrypoint(task.cwd), await checkerArgs(task), task.cwd);
230
+ const stdout = await executeOxlint(task.oxlintEntrypoint ?? resolveOxlintEntrypoint(), await checkerArgs(task), task.cwd);
218
231
  let payload;
219
232
  try {
220
233
  payload = JSON.parse(stdout);
@@ -529,6 +542,10 @@ async function setupNuxtLintChecker(checker, nuxt, generation, dependencies = {}
529
542
  //#region src/lint/addons.ts
530
543
  /** Hook other Nuxt modules use to extend Vize's generated lint config. */
531
544
  const VIZE_NUXT_LINT_CONFIG_ADDONS_HOOK = "vize:lint:config:addons";
545
+ function autoImportEnabled(imports) {
546
+ if (imports === false) return false;
547
+ return imports?.autoImport !== false;
548
+ }
532
549
  function asImportContext(value) {
533
550
  if (value == null || typeof value !== "object" || !("getImports" in value)) return;
534
551
  return typeof value.getImports === "function" ? value : void 0;
@@ -556,7 +573,7 @@ function createNuxtImportGlobalsAddon(nuxt) {
556
573
  return {
557
574
  name: "vize:lint:import-globals",
558
575
  async getConfigs() {
559
- const imports = [...await unimport?.getImports() ?? [], ...await nitroUnimport?.getImports() ?? []].sort((left, right) => left.from.localeCompare(right.from) || left.name.localeCompare(right.name));
576
+ const imports = [...autoImportEnabled(nuxt.options?.imports) ? await unimport?.getImports() ?? [] : [], ...autoImportEnabled(nuxt.options?.nitro?.imports) ? await nitroUnimport?.getImports() ?? [] : []].sort((left, right) => left.from.localeCompare(right.from) || left.name.localeCompare(right.name));
560
577
  return [{
561
578
  name: "nuxt/import-globals",
562
579
  globals: Object.fromEntries(imports.map((imported) => [imported.as ?? imported.name, "readonly"]))
@@ -588,6 +605,13 @@ function setupNuxtLintConfigAddons(nuxt) {
588
605
  }
589
606
  //#endregion
590
607
  //#region src/lint/emitter.ts
608
+ /**
609
+ * Oxlint artifact emission for the engine-neutral Nuxt lint plan.
610
+ *
611
+ * The plan deliberately keeps eslint-compatible Patina rule ids. Oxlint loads
612
+ * Patina as the `vize` JavaScript plugin, so this boundary is the one place
613
+ * those ids gain their `vize/` prefix.
614
+ */
591
615
  const PATINA_RULE_NAMESPACES = new Set([
592
616
  "a11y",
593
617
  "css",
@@ -625,21 +649,22 @@ function mergeRules(target, source) {
625
649
  Object.assign(target, prefixVizeRules(source));
626
650
  }
627
651
  /** Render the complete generated oxlint config, including its trailing newline. */
628
- function renderNuxtOxlintConfig(items, pluginSpecifier) {
652
+ function renderNuxtOxlintConfig(items, pluginSpecifier, globBase) {
653
+ const rebase = (glob) => globBase ? rebaseGlob(glob, globBase.rootDir, globBase.configDir) : glob;
629
654
  const ignorePatterns = [];
630
655
  const globals = {};
631
656
  const rules = {};
632
657
  const overrides = [];
633
658
  for (const item of items) {
634
659
  if (item.files) {
635
- const override = { files: [...item.files] };
636
- if (item.ignores) override.excludeFiles = [...item.ignores];
660
+ const override = { files: item.files.map(rebase) };
661
+ if (item.ignores) override.excludeFiles = item.ignores.map(rebase);
637
662
  if (item.globals) override.globals = { ...item.globals };
638
663
  if (item.rules) override.rules = prefixVizeRules(item.rules);
639
664
  overrides.push(override);
640
665
  continue;
641
666
  }
642
- if (item.ignores) ignorePatterns.push(...item.ignores);
667
+ if (item.ignores) ignorePatterns.push(...item.ignores.map(rebase));
643
668
  mergeGlobals(globals, item.globals);
644
669
  mergeRules(rules, item.rules);
645
670
  }
@@ -657,6 +682,16 @@ function renderNuxtOxlintConfig(items, pluginSpecifier) {
657
682
  if (overrides.length > 0) config.overrides = overrides;
658
683
  return `${JSON.stringify(config, null, 2)}\n`;
659
684
  }
685
+ function rebaseGlob(glob, rootDir, configDir) {
686
+ const negated = glob.startsWith("!");
687
+ const body = negated ? glob.slice(1) : glob;
688
+ if (path.isAbsolute(body)) return glob;
689
+ let relative = path.relative(configDir, path.resolve(rootDir, body));
690
+ relative = relative.split(path.sep).join("/");
691
+ if (relative.length === 0) relative = ".";
692
+ else if (!relative.startsWith(".")) relative = `./${relative}`;
693
+ return negated ? `!${relative}` : relative;
694
+ }
660
695
  //#endregion
661
696
  //#region src/lint/nuxt-state.ts
662
697
  /**
@@ -679,6 +714,80 @@ function toNuxtLintProjectState(options, overrides = {}) {
679
714
  };
680
715
  }
681
716
  //#endregion
717
+ //#region src/lint/project-rules.ts
718
+ /**
719
+ * Project lint rules layered under the generated Nuxt oxlint config.
720
+ *
721
+ * The artifact keeps `settings.vize.preset` at `incremental` so Nuxt-only rules
722
+ * stay enabled. A preset from `vize.config.json` is therefore expanded into
723
+ * explicit rule entries instead of replacing that runtime preset.
724
+ */
725
+ const CONFIG_PRESETS = [
726
+ "happy-path",
727
+ "opinionated",
728
+ "essential",
729
+ "incremental",
730
+ "ecosystem",
731
+ "nuxt"
732
+ ];
733
+ async function readProjectLintRules(rootDir, loadPreset = loadPresetRules) {
734
+ const linter = await readVizeConfigLinter(rootDir);
735
+ if (!linter) return void 0;
736
+ const rules = {
737
+ ...linter.preset && linter.preset !== "incremental" ? await loadPreset(linter.preset, linter.typeAware) : {},
738
+ ...linter.rules
739
+ };
740
+ return Object.keys(rules).length > 0 ? rules : void 0;
741
+ }
742
+ async function loadPresetRules(preset, typeAware) {
743
+ const { createVizeRuleConfig } = await import("oxlint-plugin-vize");
744
+ const generated = createVizeRuleConfig({
745
+ includeTypeAware: typeAware,
746
+ preset
747
+ });
748
+ const rules = {};
749
+ for (const [id, severity] of Object.entries(generated)) {
750
+ if (!isSeverity(severity)) continue;
751
+ const bare = id.startsWith("vize/") ? id.slice(5) : id;
752
+ if (bare.length > 0) rules[bare] = severity;
753
+ }
754
+ return rules;
755
+ }
756
+ async function readVizeConfigLinter(rootDir) {
757
+ const file = path.join(rootDir, "vize.config.json");
758
+ let text;
759
+ try {
760
+ text = await readFile(file, "utf8");
761
+ } catch (error) {
762
+ if (error.code === "ENOENT") return void 0;
763
+ throw error;
764
+ }
765
+ const parsed = JSON.parse(text);
766
+ if (!parsed.linter || typeof parsed.linter !== "object") return void 0;
767
+ const linter = parsed.linter;
768
+ return {
769
+ preset: isConfigPreset(linter.preset) ? linter.preset : void 0,
770
+ typeAware: linter.typeAware === true,
771
+ rules: explicitRules(linter.rules)
772
+ };
773
+ }
774
+ function explicitRules(value) {
775
+ if (!value || typeof value !== "object") return {};
776
+ const rules = {};
777
+ for (const [id, severity] of Object.entries(value)) {
778
+ if (!isSeverity(severity)) continue;
779
+ const bare = id.startsWith("vize/") ? id.slice(5) : id;
780
+ if (bare.length > 0) rules[bare] = severity;
781
+ }
782
+ return rules;
783
+ }
784
+ function isConfigPreset(value) {
785
+ return typeof value === "string" && CONFIG_PRESETS.includes(value);
786
+ }
787
+ function isSeverity(value) {
788
+ return value === "off" || value === "warn" || value === "error";
789
+ }
790
+ //#endregion
682
791
  //#region src/lint/inspector-view.ts
683
792
  /** Render the dependency-free UI served by the in-process lint-plan inspector. */
684
793
  function renderNuxtLintInspectorHtml(nonce) {
@@ -1183,12 +1292,24 @@ async function setupNuxtLintConfigGeneration(lint, nuxt, dependencies = {}) {
1183
1292
  const hasTypeScriptProbe = dependencies.hasTypeScript ?? hasTypeScript;
1184
1293
  const resolvePluginSpecifier = dependencies.resolvePluginSpecifier ?? resolveVizePluginSpecifier;
1185
1294
  const resolveAddons = dependencies.resolveAddons ?? ("callHook" in nuxt ? setupNuxtLintConfigAddons(nuxt) : void 0);
1295
+ const resolveProjectRules = dependencies.resolveProjectLintRules ?? readProjectLintRules;
1186
1296
  let currentPlan = [];
1187
1297
  const regenerate = async () => {
1188
1298
  const plan = buildNuxtLintPlan(resolveNuxtLintFeatures(featureOptions, () => hasTypeScriptProbe(planRoot)), collectNuxtLintDirs(toNuxtLintProjectState(nuxt.options, { rootDir: planRoot })));
1189
1299
  const addons = await resolveAddons?.() ?? [];
1190
- const nextPlan = [...plan, ...addons];
1191
- const changed = await writeFileIfChanged(configFile, renderNuxtOxlintConfig(nextPlan, resolvePluginSpecifier(path.dirname(configFile))));
1300
+ const projectRules = await resolveProjectRules(planRoot);
1301
+ const nextPlan = [
1302
+ ...projectRules && Object.keys(projectRules).length > 0 ? [{
1303
+ name: "project/preset",
1304
+ rules: projectRules
1305
+ }] : [],
1306
+ ...plan,
1307
+ ...addons
1308
+ ];
1309
+ const changed = await writeFileIfChanged(configFile, renderNuxtOxlintConfig(nextPlan, resolvePluginSpecifier(path.dirname(configFile)), {
1310
+ rootDir: planRoot,
1311
+ configDir: path.dirname(configFile)
1312
+ }));
1192
1313
  currentPlan = nextPlan;
1193
1314
  return changed;
1194
1315
  };
@@ -1198,6 +1319,7 @@ async function setupNuxtLintConfigGeneration(lint, nuxt, dependencies = {}) {
1198
1319
  };
1199
1320
  await regenerate();
1200
1321
  nuxt.hook("builder:generateApp", regenerate);
1322
+ if (getDetectedNuxtMajor(nuxt) === 2) nuxt.hook("build:templates", regenerate);
1201
1323
  if (autoInit) await initRootOxlintConfig(nuxtRoot, configFile);
1202
1324
  return {
1203
1325
  configFile,
@@ -1207,4 +1329,4 @@ async function setupNuxtLintConfigGeneration(lint, nuxt, dependencies = {}) {
1207
1329
  };
1208
1330
  }
1209
1331
  //#endregion
1210
- export { toNuxtLintProjectState as a, setupNuxtLintConfigAddons as c, createNuxtLintCheckerVitePlugin as d, resolveNuxtLintCheckerOptions as f, setupLintInspector as i, setupNuxtLintChecker as l, setupNuxtLintConfigGeneration as n, renderNuxtOxlintConfig as o, isViteNuxtBuilder as p, writeFileIfChanged as r, VIZE_NUXT_LINT_CONFIG_ADDONS_HOOK as s, ROOT_OXLINT_CONFIG_NAMES as t, createNuxtLintCheckerWebpackPlugin as u };
1332
+ export { toNuxtLintProjectState as a, setupNuxtLintConfigAddons as c, createNuxtLintCheckerVitePlugin as d, resolveNuxtLintCheckerOptions as f, setupLintInspector as i, setupNuxtLintChecker as l, hasNuxtViteCompilerSupport as m, setupNuxtLintConfigGeneration as n, renderNuxtOxlintConfig as o, getDetectedNuxtMajor as p, writeFileIfChanged as r, VIZE_NUXT_LINT_CONFIG_ADDONS_HOOK as s, ROOT_OXLINT_CONFIG_NAMES as t, createNuxtLintCheckerWebpackPlugin as u };
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { C as VizeNuxtUiOptions, S as VizeNuxtComposablesOptions, _ as VizeNuxtLintCheckerOptions, b as VizeNuxtCompilerOptions, c as NuxtMuseaOptions, d as VizeNuxtDevOptions, f as VizeNuxtMajorVersion, h as VizeNuxtLintOptions, l as VizeNuxtBridgeOptions, m as VizeNuxtUnoCssOptions, n as NuxtLintConfigAddon, p as VizeNuxtOptions, u as VizeNuxtCompatibilityOptions, x as VizeNuxtVueVersion, y as VizeNuxtCompilerCompatibilityOptions } from "./addons-7LzN4Qa1.mjs";
1
+ import { C as VizeNuxtUiOptions, S as VizeNuxtComposablesOptions, _ as VizeNuxtLintCheckerOptions, b as VizeNuxtCompilerOptions, c as NuxtMuseaOptions, d as VizeNuxtDevOptions, f as VizeNuxtMajorVersion, h as VizeNuxtLintOptions, l as VizeNuxtBridgeOptions, m as VizeNuxtUnoCssOptions, n as NuxtLintConfigAddon, p as VizeNuxtOptions, u as VizeNuxtCompatibilityOptions, x as VizeNuxtVueVersion, y as VizeNuxtCompilerCompatibilityOptions } from "./addons-CrR0MCzZ.mjs";
2
2
  import { MuseaOptions } from "@vizejs/vite-plugin-musea";
3
3
 
4
4
  //#region src/schema.d.ts
@@ -55,6 +55,9 @@ type NuxtWithBuilderOptions = {
55
55
  dedupe?: string[];
56
56
  };
57
57
  };
58
+ vue?: {
59
+ compilerOptions?: Record<string, unknown>;
60
+ };
58
61
  nitro?: {
59
62
  virtual?: Record<string, string>;
60
63
  publicAssets?: unknown[];
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { i as setupLintInspector, l as setupNuxtLintChecker, n as setupNuxtLintConfigGeneration, p as isViteNuxtBuilder } from "./generation-0O5ZoaRp.mjs";
1
+ import { i as setupLintInspector, l as setupNuxtLintChecker, m as hasNuxtViteCompilerSupport, n as setupNuxtLintConfigGeneration, p as getDetectedNuxtMajor } from "./generation-CXADZreI.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import fs from "node:fs";
4
4
  import path, { dirname, join, resolve } from "node:path";
@@ -1019,15 +1019,10 @@ function rewriteBareVueImportsToClientRuntime(code) {
1019
1019
  });
1020
1020
  }
1021
1021
  //#endregion
1022
- //#region src/options.ts
1023
- const DEFAULT_NUXT_BRIDGE_OPTIONS = {
1024
- autoImports: true,
1025
- components: true,
1026
- i18n: true,
1027
- stableInjectedKeys: true
1028
- };
1029
- const DEFAULT_NUXT_UNOCSS_OPTIONS = { originalSource: {} };
1030
- const DEFAULT_NUXT_DEV_OPTIONS = { stylesheetLinks: true };
1022
+ //#region src/compiler-option-bridge.ts
1023
+ function unsupportedNuxtVueCompilerOptions(options) {
1024
+ return Object.entries(options ?? {}).filter(([key, value]) => value !== void 0 && (key !== "whitespace" || value !== "condense" && value !== "preserve")).map(([key]) => key);
1025
+ }
1031
1026
  function isLegacyVueVersion(version) {
1032
1027
  return version === .11 || version === 1 || version === 2 || version === "2.7" || version === "legacy";
1033
1028
  }
@@ -1042,19 +1037,33 @@ function normalizeNuxtCompilerCompatibilityOptions(compatibility) {
1042
1037
  if (compatibility.webpackVersion !== void 0) normalized.webpackVersion = compatibility.webpackVersion;
1043
1038
  return normalized;
1044
1039
  }
1045
- function resolveNuxtCompilerOptions(rootDir, baseURL, buildAssetsDir, compiler, compatibility = {}) {
1040
+ function resolveNuxtCompilerOptions(rootDir, baseURL, buildAssetsDir, compiler, compatibility = {}, vueCompilerOptions) {
1046
1041
  if (compiler === false) return false;
1047
1042
  if (compatibility.supportsViteCompiler === false && compatibility.forceViteCompiler !== true) return false;
1048
1043
  const compatibilityOptions = normalizeNuxtCompilerCompatibilityOptions(compatibility);
1044
+ const unsupported = unsupportedNuxtVueCompilerOptions(vueCompilerOptions);
1045
+ if (unsupported.length > 0) compatibilityOptions.hostCompiler = true;
1049
1046
  const hasCompatibilityOptions = Object.keys(compatibilityOptions).length > 0;
1050
1047
  const overrides = typeof compiler === "object" && compiler != null ? compiler : {};
1051
1048
  return buildNuxtCompilerOptions(rootDir, baseURL, buildAssetsDir, {
1052
1049
  vueVersion: compatibility.vueVersion,
1053
1050
  ...hasCompatibilityOptions ? { compatibility: compatibilityOptions } : {},
1054
1051
  mode: compatibility.scriptSetupInStandalone === true ? "function" : void 0,
1055
- ...overrides
1052
+ ...vueCompilerOptions?.whitespace === "condense" || vueCompilerOptions?.whitespace === "preserve" ? { whitespace: vueCompilerOptions.whitespace } : {},
1053
+ ...overrides,
1054
+ ...unsupported.length > 0 ? { compatibility: compatibilityOptions } : {}
1056
1055
  });
1057
1056
  }
1057
+ //#endregion
1058
+ //#region src/options.ts
1059
+ const DEFAULT_NUXT_BRIDGE_OPTIONS = {
1060
+ autoImports: true,
1061
+ components: true,
1062
+ i18n: true,
1063
+ stableInjectedKeys: true
1064
+ };
1065
+ const DEFAULT_NUXT_UNOCSS_OPTIONS = { originalSource: {} };
1066
+ const DEFAULT_NUXT_DEV_OPTIONS = { stylesheetLinks: true };
1058
1067
  function resolveNuxtBridgeOptions(bridge) {
1059
1068
  if (bridge === false) return {
1060
1069
  autoImports: false,
@@ -1208,6 +1217,19 @@ const VUE_SSR_EXTERNAL = [
1208
1217
  "vue/server-renderer",
1209
1218
  "@vue/server-renderer"
1210
1219
  ];
1220
+ const VUE_RUNTIME_DEDUPE = [
1221
+ "vue",
1222
+ "@vue/reactivity",
1223
+ "@vue/runtime-core",
1224
+ "@vue/runtime-dom",
1225
+ "@vue/shared"
1226
+ ];
1227
+ function dedupeVueRuntimePackages(vite) {
1228
+ vite.resolve ||= {};
1229
+ const dedupe = new Set(vite.resolve.dedupe ?? []);
1230
+ for (const packageName of VUE_RUNTIME_DEDUPE) dedupe.add(packageName);
1231
+ vite.resolve.dedupe = [...dedupe];
1232
+ }
1211
1233
  function externalizeVueRuntimeForNuxtSsr(config) {
1212
1234
  const rolldownOptions = config.build?.rolldownOptions;
1213
1235
  if (!rolldownOptions) return;
@@ -1221,13 +1243,6 @@ function externalizeVueRuntimeForNuxtSsr(config) {
1221
1243
  //#endregion
1222
1244
  //#region src/index.ts
1223
1245
  const VIZE_NUXT_AUTO_IMPORT_PATCHED = "__vizeNuxtAutoImportPatched";
1224
- const VUE_RUNTIME_DEDUPE = [
1225
- "vue",
1226
- "@vue/reactivity",
1227
- "@vue/runtime-core",
1228
- "@vue/runtime-dom",
1229
- "@vue/shared"
1230
- ];
1231
1246
  const moduleMeta = {
1232
1247
  name: "@vizejs/nuxt",
1233
1248
  configKey: "vize"
@@ -1276,18 +1291,6 @@ function registerNuxt2CompatibilityHooks(nuxt) {
1276
1291
  nuxt.hook("builder:prepared", () => {});
1277
1292
  nuxt.hook("build:templates", () => {});
1278
1293
  }
1279
- function getDetectedNuxtMajor(nuxt) {
1280
- const nuxtLike = nuxt;
1281
- const version = nuxtLike?._version ?? nuxtLike?.version ?? (typeof nuxtLike?.options?._nuxtVersion === "string" ? nuxtLike.options._nuxtVersion : null);
1282
- if (!version) return null;
1283
- const major = Number.parseInt(version.split(".")[0] ?? "", 10);
1284
- return major === 2 || major === 3 || major === 4 ? major : null;
1285
- }
1286
- function hasNuxtViteCompilerSupport(nuxt) {
1287
- if (isViteNuxtBuilder(nuxt.options.builder)) return true;
1288
- if (nuxt.options.vite) return true;
1289
- return getDetectedNuxtMajor(nuxt) !== 2;
1290
- }
1291
1294
  function getNuxtAppBaseURL(nuxt) {
1292
1295
  return nuxt.options.app?.baseURL ?? nuxt.options.router?.base;
1293
1296
  }
@@ -1297,12 +1300,6 @@ function getNuxtBuildAssetsDir(nuxt) {
1297
1300
  function shouldUseVizeCompiler(compilerOptions) {
1298
1301
  return compilerOptions !== false && compilerOptions.compatibility?.hostCompiler !== true && (compilerOptions.vueVersion ?? 3) === 3;
1299
1302
  }
1300
- function dedupeVueRuntimePackages(vite) {
1301
- vite.resolve ||= {};
1302
- const dedupe = new Set(vite.resolve.dedupe ?? []);
1303
- for (const packageName of VUE_RUNTIME_DEDUPE) dedupe.add(packageName);
1304
- vite.resolve.dedupe = [...dedupe];
1305
- }
1306
1303
  function isViteSsrTransform(args) {
1307
1304
  const options = args[0];
1308
1305
  return typeof options === "object" && options !== null && "ssr" in options && options.ssr === true;
@@ -1362,7 +1359,11 @@ async function setupVizeNuxtModule(options, nuxt) {
1362
1359
  const compilerOptions = resolveNuxtCompilerOptions(nuxt.options.rootDir, appBaseURL, buildAssetsDir, options.compiler, {
1363
1360
  supportsViteCompiler,
1364
1361
  vueVersion
1365
- });
1362
+ }, nuxt.options.vue?.compilerOptions);
1363
+ if (compilerOptions !== false && compilerOptions.compatibility?.hostCompiler === true) {
1364
+ const unsupported = unsupportedNuxtVueCompilerOptions(nuxt.options.vue?.compilerOptions);
1365
+ if (unsupported.length > 0) console.warn(`@vizejs/nuxt: vue.compilerOptions.${unsupported.join(", ")} cannot be forwarded to the native compiler; keeping Nuxt's Vue compiler.`);
1366
+ }
1366
1367
  await setupLintInspector(options.lint, nuxt, compilerOptions, lintGeneration, nuxt.options.dev);
1367
1368
  const usesVizeCompiler = shouldUseVizeCompiler(compilerOptions);
1368
1369
  if (compilerOptions !== false && compilerOptions.compatibility?.hostCompiler !== true) {
@@ -1,7 +1,10 @@
1
- import { _ as VizeNuxtLintCheckerOptions, a as ResolveNuxtLintConfigAddons, g as ResolvedVizeNuxtLintCheckerOptions, h as VizeNuxtLintOptions, i as NuxtLintImport, n as NuxtLintConfigAddon, o as VIZE_NUXT_LINT_CONFIG_ADDONS_HOOK, r as NuxtLintConfigAddonNuxt, s as setupNuxtLintConfigAddons, t as NuxtLintAwaitable, v as resolveNuxtLintCheckerOptions } from "../addons-7LzN4Qa1.mjs";
2
- import { NuxtLintConfigItem, NuxtLintDirNames, NuxtLintLayer, NuxtLintProjectState } from "@vizejs/nuxt-lint-config";
1
+ import { _ as VizeNuxtLintCheckerOptions, a as ResolveNuxtLintConfigAddons, g as ResolvedVizeNuxtLintCheckerOptions, h as VizeNuxtLintOptions, i as NuxtLintImport, n as NuxtLintConfigAddon, o as VIZE_NUXT_LINT_CONFIG_ADDONS_HOOK, r as NuxtLintConfigAddonNuxt, s as setupNuxtLintConfigAddons, t as NuxtLintAwaitable, v as resolveNuxtLintCheckerOptions } from "../addons-CrR0MCzZ.mjs";
2
+ import { NuxtLintConfigItem, NuxtLintDirNames, NuxtLintLayer, NuxtLintProjectState, NuxtLintSeverity } from "@vizejs/nuxt-lint-config";
3
3
  export * from "@vizejs/nuxt-lint-config";
4
4
 
5
+ //#region src/lint/project-rules.d.ts
6
+ type ProjectLintRules = Record<string, NuxtLintSeverity>;
7
+ //#endregion
5
8
  //#region src/lint/generation.d.ts
6
9
  /** Root config names supported by oxlint's config discovery. */
7
10
  declare const ROOT_OXLINT_CONFIG_NAMES: readonly [".oxlintrc.json", ".oxlintrc.jsonc", "oxlint.config.ts", "oxlint.config.mts"];
@@ -19,6 +22,8 @@ interface NuxtLintGenerationDependencies {
19
22
  resolveAddons?: () => Awaitable$1<readonly NuxtLintConfigItem[]>;
20
23
  hasTypeScript?: (rootDir: string) => boolean;
21
24
  resolvePluginSpecifier?: (configDir: string) => string;
25
+ /** `vize.config.json` rules. Tests inject this so generation never loads the native preset binding. */
26
+ resolveProjectLintRules?: (rootDir: string) => Awaitable$1<ProjectLintRules | undefined>;
22
27
  }
23
28
  interface NuxtLintConfigGeneration {
24
29
  configFile: string;
@@ -52,7 +57,7 @@ interface NuxtLintCheckerTask {
52
57
  emitWarning: boolean;
53
58
  emitError: boolean;
54
59
  fix: boolean;
55
- /** Test/integration override. Normal callers resolve the project's oxlint. */
60
+ /** Test/integration override. Normal callers use oxlint-vize. */
56
61
  oxlintEntrypoint?: string;
57
62
  }
58
63
  interface NuxtLintCheckerResult {
@@ -206,7 +211,16 @@ interface NuxtLintStateOverrides {
206
211
  declare function toNuxtLintProjectState(options: NuxtLintSourceOptions, overrides?: NuxtLintStateOverrides): NuxtLintProjectState;
207
212
  //#endregion
208
213
  //#region src/lint/emitter.d.ts
214
+ /**
215
+ * Plan globs are relative to the Nuxt root. Oxlint resolves `overrides` and
216
+ * `ignorePatterns` from the generated config's directory, so the emitter
217
+ * rebases them when it knows both directories.
218
+ */
219
+ interface NuxtOxlintGlobBase {
220
+ rootDir: string;
221
+ configDir: string;
222
+ }
209
223
  /** Render the complete generated oxlint config, including its trailing newline. */
210
- declare function renderNuxtOxlintConfig(items: readonly NuxtLintConfigItem[], pluginSpecifier: string): string;
224
+ declare function renderNuxtOxlintConfig(items: readonly NuxtLintConfigItem[], pluginSpecifier: string, globBase?: NuxtOxlintGlobBase): string;
211
225
  //#endregion
212
226
  export { type NuxtLintAwaitable, type NuxtLintCheckerSetup, type NuxtLintCheckerSetupDependencies, type NuxtLintConfigAddon, type NuxtLintConfigAddonNuxt, type NuxtLintConfigGeneration, type NuxtLintGenerationDependencies, type NuxtLintImport, type NuxtLintSourceOptions, type NuxtLintStateOverrides, ROOT_OXLINT_CONFIG_NAMES, type ResolveNuxtLintConfigAddons, type ResolvedVizeNuxtLintCheckerOptions, VIZE_NUXT_LINT_CONFIG_ADDONS_HOOK, type VizeNuxtLintCheckerOptions, type VizeNuxtLintOptions, createNuxtLintCheckerVitePlugin, createNuxtLintCheckerWebpackPlugin, renderNuxtOxlintConfig, resolveNuxtLintCheckerOptions, setupNuxtLintChecker, setupNuxtLintConfigAddons, setupNuxtLintConfigGeneration, toNuxtLintProjectState, writeFileIfChanged };
@@ -1,3 +1,3 @@
1
- import { a as toNuxtLintProjectState, c as setupNuxtLintConfigAddons, d as createNuxtLintCheckerVitePlugin, f as resolveNuxtLintCheckerOptions, l as setupNuxtLintChecker, n as setupNuxtLintConfigGeneration, o as renderNuxtOxlintConfig, r as writeFileIfChanged, s as VIZE_NUXT_LINT_CONFIG_ADDONS_HOOK, t as ROOT_OXLINT_CONFIG_NAMES, u as createNuxtLintCheckerWebpackPlugin } from "../generation-0O5ZoaRp.mjs";
1
+ import { a as toNuxtLintProjectState, c as setupNuxtLintConfigAddons, d as createNuxtLintCheckerVitePlugin, f as resolveNuxtLintCheckerOptions, l as setupNuxtLintChecker, n as setupNuxtLintConfigGeneration, o as renderNuxtOxlintConfig, r as writeFileIfChanged, s as VIZE_NUXT_LINT_CONFIG_ADDONS_HOOK, t as ROOT_OXLINT_CONFIG_NAMES, u as createNuxtLintCheckerWebpackPlugin } from "../generation-CXADZreI.mjs";
2
2
  export * from "@vizejs/nuxt-lint-config";
3
3
  export { ROOT_OXLINT_CONFIG_NAMES, VIZE_NUXT_LINT_CONFIG_ADDONS_HOOK, createNuxtLintCheckerVitePlugin, createNuxtLintCheckerWebpackPlugin, renderNuxtOxlintConfig, resolveNuxtLintCheckerOptions, setupNuxtLintChecker, setupNuxtLintConfigAddons, setupNuxtLintConfigGeneration, toNuxtLintProjectState, writeFileIfChanged };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vizejs/nuxt",
3
- "version": "0.429.1",
3
+ "version": "0.430.1",
4
4
  "description": "Nuxt module for Vize - compiler, musea gallery, linter, and type checker",
5
5
  "keywords": [
6
6
  "compiler",
@@ -49,12 +49,12 @@
49
49
  },
50
50
  "dependencies": {
51
51
  "@nuxt/kit": "3.11.2",
52
- "@vizejs/native": "0.429.1",
53
- "@vizejs/nuxt-lint-config": "0.429.1",
54
- "@vizejs/vite-plugin": "0.429.1",
55
- "@vizejs/vite-plugin-musea": "0.429.1",
56
- "oxlint-plugin-vize": "0.429.1",
57
- "vize": "0.429.1"
52
+ "@vizejs/native": "0.430.1",
53
+ "@vizejs/nuxt-lint-config": "0.430.1",
54
+ "@vizejs/vite-plugin": "0.430.1",
55
+ "@vizejs/vite-plugin-musea": "0.430.1",
56
+ "oxlint-plugin-vize": "0.430.1",
57
+ "vize": "0.430.1"
58
58
  },
59
59
  "devDependencies": {
60
60
  "jiti-nuxt2": "npm:jiti@1.21.7",