voidzero-dev / voidzero-dev/vite-plus

Monorepo: nested package's lint rules/jsPlugins silently dropped when workspace root has a lint block

Abierto
#2,628 1 comentario 1 reacción 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Lenguaje dominante
Rust
Estrellas
5.8k
Forks
262
Merge medio
23 h 18 min
PR fusionados (30 d)
139

Descripción

Summary

In a pnpm workspace/monorepo, when the root vite.config.ts has its own lint block, a nested package's lint.rules and lint.jsPlugins are silently ignored by vp lint. Remove the root's lint block and the nested config is forwarded correctly, so the nested config itself is valid.

Tested on vite-plus 0.3.0 (oxlint 1.79).

Minimal reproduction

Self-contained, 6 files, no custom plugin needed. Run with pnpm install then cd apps/child && vp lint.

repro/
├── package.json          # devDeps: vite-plus 0.3.0
├── pnpm-workspace.yaml   # packages: ["apps/*"]
├── vite.config.ts        # ROOT: has a lint block
└── apps/
    └── child/
        ├── package.json  # devDeps: vite-plus 0.3.0
        ├── vite.config.ts # CHILD: lint.rules + lint.jsPlugins
        └── src/bad.ts     # throws a string literal

Root vite.config.ts:

import { defineConfig } from 'vite-plus';

export default defineConfig({
  lint: {
    jsPlugins: [{ name: 'vite-plus', specifier: 'vite-plus/oxlint-plugin' }],
    rules: { 'vite-plus/prefer-vite-plus-imports': 'error' },
    options: { typeAware: true, typeCheck: true },
  },
});

Child apps/child/vite.config.ts:

import { defineConfig } from 'vite-plus';

export default defineConfig({
  lint: {
    rules: { 'no-throw-literal': 'error' },
    jsPlugins: [
      { name: 'ghost', specifier: 'this-plugin-is-definitely-not-installed' },
    ],
  },
});

Child apps/child/src/bad.ts:

export function ping(): string {
  throw 'a string literal'; // violates no-throw-literal ('ghost' jsPlugin would crash oxlint if loaded)
}

Actual

$ cd apps/child && vp lint
# (no output — neither the rule nor the plugin is applied, and loading the
#  nonexistent "ghost" plugin does not even get attempted)

Expected

throw 'a string literal' should be reported by no-throw-literal, and the ghost jsPlugin load should be attempted (would expect a loud error for a nonexistent plugin).

Proof the nested config is fine (and the bug is the root's lint block)

Root lint block present:

$ cd apps/child && vp lint
( no output )

Root lint block removed (only the lint block lines deleted):

$ cd apps/child && vp lint
src/bad.ts:2:9: error eslint(no-throw-literal): Expected an error object to be thrown
...  [if child also has the ghost jsPlugins entry, it fails loudly instead:]
Failed to parse oxlint configuration file.
  x Failed to load JS plugin: this-plugin-is-definitely-not-installed

Same behavior in vp lint --print-config: nested/root custom rules and jsPlugins never appear in the printed oxlint config when the root has a lint block.

Also worth noting: the same config in a single-package (non-monorepo) project forwards lint.jsPlugins correctly, so forwarding works in the simple case and breaks specifically with a root lint block present.

Related

  • #997 — nested package ignorePatterns dropped during config merging (closed; this may share the config-merge code path).

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza con la reproducción de seis archivos, ejecuta pnpm install y después ejecuta cd apps/child 6�26 vp lint y vp lint --print-config con el bloque lint del root presente. Compara la configuración impresa con los archivos vite.config.ts del root y del child; se considera terminado cuando la regla no-throw-literal del child y jsPlugins se reenvían o se notifican, en lugar de descartarse silenciosamente.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
typescript
Área
tooling
Tipo de issue
Error
Dificultad
3/5
Tiempo estimado
1-2 días
Estado de actividad
Activo
Claridad
Bien especificado
Aptitud para principiantes
74/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.