Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/.vitepress/config.mts
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ export default extendConfig(
{ text: 'Run', link: '/config/run' },
{ text: 'Format', link: '/config/fmt' },
{ text: 'Lint', link: '/config/lint' },
{ text: 'Lint Rules', link: '/config/lint-rules' },
{ text: 'Test', link: '/config/test' },
{ text: 'Build', link: '/config/build' },
{ text: 'Pack', link: '/config/pack' },
Expand Down
43 changes: 43 additions & 0 deletions docs/config/lint-rules.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Vite+ Oxlint Rules

Vite+ ships a small Oxlint JS plugin for rules that protect Vite+ project conventions. These rules are added by `vp lint --init`, `vp create`, and `vp migrate` through the `vite-plus/oxlint-plugin` entry in `lint.jsPlugins`.

## vite-plus/prefer-vite-plus-imports {#vite-plus-prefer-vite-plus-imports}

This rule rewrites direct Vite and Vitest imports to the Vite+ package entrypoints.

Examples:

```ts
import { defineConfig } from 'vite-plus';
import { test } from 'vite-plus/test';
```

Use this rule to keep application code on Vite+ entrypoints after migration.

## vite-plus/require-pnpm-vite-alias {#vite-plus-require-pnpm-vite-alias}

This rule protects pnpm monorepos where `pnpm-workspace.yaml` redirects `vite` through a catalog entry to `@voidzero-dev/vite-plus-core`.

In that setup, an application package that runs Vite through `vp dev`, `vp build`, or `vp preview` must keep a direct `vite` dependency, usually:

```json
{
"devDependencies": {
"vite": "catalog:",
"vite-plus": "catalog:"
}
}
```

Without the direct `vite` dependency, pnpm has no package-level consumer for the workspace override. Commands such as `vp why vite` can then report upstream `vite` from transitive dependencies instead of the Vite+ core alias, making the override look ineffective.

The rule only reports when all of these are true:

- Oxlint is checking the package's `vite.config.*` file
- the nearest package depends on `vite-plus`
- the package has an application script using `vp dev`, `vp build`, or `vp preview`
- the package is missing a direct `vite` dependency
- a parent `pnpm-workspace.yaml` redirects `vite` through a catalog entry to `@voidzero-dev/vite-plus-core`

Library and tooling packages that only use commands such as `vp pack`, `vp test`, or `vp check` are not considered application packages by this rule.
2 changes: 2 additions & 0 deletions docs/config/lint.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

`vp lint` and `vp check` read Oxlint settings from the `lint` block in `vite.config.ts`. See [Oxlint's configuration](https://oxc.rs/docs/guide/usage/linter/config.html) for details.

Vite+ also enables a small set of [Vite+ Oxlint rules](/config/lint-rules) for project conventions that are specific to the Vite+ toolchain.

## Example

```ts [vite.config.ts]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export default defineConfig({
fmt: {},
lint: {
jsPlugins: [{ name: "vite-plus", specifier: "vite-plus/oxlint-plugin" }],
rules: { "vite-plus/prefer-vite-plus-imports": "error" },
rules: { "vite-plus/prefer-vite-plus-imports": "error", "vite-plus/require-pnpm-vite-alias": "error" },
options: { typeAware: true, typeCheck: true },
},
});
Expand All @@ -25,7 +25,7 @@ export default defineConfig({
fmt: {},
lint: {
jsPlugins: [{ name: "vite-plus", specifier: "vite-plus/oxlint-plugin" }],
rules: { "vite-plus/prefer-vite-plus-imports": "error" },
rules: { "vite-plus/prefer-vite-plus-imports": "error", "vite-plus/require-pnpm-vite-alias": "error" },
options: { typeAware: true, typeCheck: true },
},
run: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ export default defineConfig({
lint: {
"rules": {
"no-unused-vars": "error",
"vite-plus/prefer-vite-plus-imports": "error"
"vite-plus/prefer-vite-plus-imports": "error",
"vite-plus/require-pnpm-vite-alias": "error"
},
"options": {
"typeAware": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ export default defineConfig({
lint: {
"rules": {
"no-unused-vars": "error",
"vite-plus/prefer-vite-plus-imports": "error"
"vite-plus/prefer-vite-plus-imports": "error",
"vite-plus/require-pnpm-vite-alias": "error"
},
"options": {
"typeAware": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ import { defineConfig } from 'vite-plus';

export default defineConfig({
fmt: {},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error"},"options":{"typeAware":true,"typeCheck":true}},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error","vite-plus/require-pnpm-vite-alias":"error"},"options":{"typeAware":true,"typeCheck":true}},
staged: {
"*.js": "vp lint --fix"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ import { defineConfig } from 'vite-plus';

export default defineConfig({
fmt: {},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error"},"options":{"typeAware":true,"typeCheck":true}},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error","vite-plus/require-pnpm-vite-alias":"error"},"options":{"typeAware":true,"typeCheck":true}},
staged: {
"*.js": "vp lint --fix"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ export default defineConfig({
"builtin": true
},
"rules": {
"vite-plus/prefer-vite-plus-imports": "error"
"vite-plus/prefer-vite-plus-imports": "error",
"vite-plus/require-pnpm-vite-alias": "error"
},
"overrides": [
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ export default defineConfig({
},
"rules": {
"survives/no-fiction": "warn",
"vite-plus/prefer-vite-plus-imports": "error"
"vite-plus/prefer-vite-plus-imports": "error",
"vite-plus/require-pnpm-vite-alias": "error"
},
"options": {
"typeAware": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ export default defineConfig({
},
"rules": {
"no-unused-vars": "error",
"vite-plus/prefer-vite-plus-imports": "error"
"vite-plus/prefer-vite-plus-imports": "error",
"vite-plus/require-pnpm-vite-alias": "error"
},
"options": {
"typeAware": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ export default defineConfig({
},
"rules": {
"no-unused-vars": "error",
"vite-plus/prefer-vite-plus-imports": "error"
"vite-plus/prefer-vite-plus-imports": "error",
"vite-plus/require-pnpm-vite-alias": "error"
},
"options": {
"typeAware": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ export default defineConfig({
},
"rules": {
"no-unused-vars": "error",
"vite-plus/prefer-vite-plus-imports": "error"
"vite-plus/prefer-vite-plus-imports": "error",
"vite-plus/require-pnpm-vite-alias": "error"
},
"options": {
"typeAware": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ export default defineConfig({
},
"rules": {
"no-unused-vars": "error",
"vite-plus/prefer-vite-plus-imports": "error"
"vite-plus/prefer-vite-plus-imports": "error",
"vite-plus/require-pnpm-vite-alias": "error"
},
"options": {
"typeAware": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ export default defineConfig({
},
"rules": {
"no-unused-vars": "error",
"vite-plus/prefer-vite-plus-imports": "error"
"vite-plus/prefer-vite-plus-imports": "error",
"vite-plus/require-pnpm-vite-alias": "error"
},
"options": {
"typeAware": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ export default defineConfig({
},
"rules": {
"no-unused-vars": "error",
"vite-plus/prefer-vite-plus-imports": "error"
"vite-plus/prefer-vite-plus-imports": "error",
"vite-plus/require-pnpm-vite-alias": "error"
},
"options": {
"typeAware": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ export default defineConfig({
},
"rules": {
"no-unused-vars": "error",
"vite-plus/prefer-vite-plus-imports": "error"
"vite-plus/prefer-vite-plus-imports": "error",
"vite-plus/require-pnpm-vite-alias": "error"
},
"options": {
"typeAware": true,
Expand Down
3 changes: 2 additions & 1 deletion packages/cli/snap-tests-global/migration-eslint/snap.txt
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ export default defineConfig({
},
"rules": {
"no-unused-vars": "error",
"vite-plus/prefer-vite-plus-imports": "error"
"vite-plus/prefer-vite-plus-imports": "error",
"vite-plus/require-pnpm-vite-alias": "error"
},
"options": {
"typeAware": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ import { defineConfig } from 'vite-plus';

export default defineConfig({
fmt: {},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error"},"options":{"typeAware":true,"typeCheck":true}},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error","vite-plus/require-pnpm-vite-alias":"error"},"options":{"typeAware":true,"typeCheck":true}},
staged: {
"*.js": "vp lint --fix"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ import { defineConfig } from 'vite-plus';

export default defineConfig({
fmt: {},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error"},"options":{"typeAware":true,"typeCheck":true}},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error","vite-plus/require-pnpm-vite-alias":"error"},"options":{"typeAware":true,"typeCheck":true}},
staged: {
"*.ts": "vp lint --fix"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ import { defineConfig } from 'vite-plus';

export default defineConfig({
fmt: {},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error"},"options":{"typeAware":true,"typeCheck":true}},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error","vite-plus/require-pnpm-vite-alias":"error"},"options":{"typeAware":true,"typeCheck":true}},
staged: {
"*.js": "vp lint --fix"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export default defineConfig({
}
},
fmt: {},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error"},"options":{"typeAware":true,"typeCheck":true}},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error","vite-plus/require-pnpm-vite-alias":"error"},"options":{"typeAware":true,"typeCheck":true}},
server: {
port: 3000,
},
Expand Down Expand Up @@ -80,7 +80,7 @@ export default defineConfig({
}
},
fmt: {},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error"},"options":{"typeAware":true,"typeCheck":true}},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error","vite-plus/require-pnpm-vite-alias":"error"},"options":{"typeAware":true,"typeCheck":true}},
server: {
port: 3000,
},
Expand Down
4 changes: 2 additions & 2 deletions packages/cli/snap-tests-global/migration-from-tsdown/snap.txt
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ export default defineConfig({
},
pack: tsdownConfig,
fmt: {},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error"},"options":{"typeAware":true,"typeCheck":true}},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error","vite-plus/require-pnpm-vite-alias":"error"},"options":{"typeAware":true,"typeCheck":true}},
});

> cat package.json # check package.json
Expand Down Expand Up @@ -86,7 +86,7 @@ export default defineConfig({
},
pack: tsdownConfig,
fmt: {},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error"},"options":{"typeAware":true,"typeCheck":true}},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error","vite-plus/require-pnpm-vite-alias":"error"},"options":{"typeAware":true,"typeCheck":true}},
});

> cat package.json # check package.json
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ import { defineConfig } from 'vite-plus';

export default defineConfig({
fmt: {},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error"},"options":{"typeAware":true,"typeCheck":true}},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error","vite-plus/require-pnpm-vite-alias":"error"},"options":{"typeAware":true,"typeCheck":true}},
staged: {
"*.js": "vp lint --fix"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ import { defineConfig } from 'vite-plus';

export default defineConfig({
fmt: {},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error"},"options":{"typeAware":true,"typeCheck":true}},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error","vite-plus/require-pnpm-vite-alias":"error"},"options":{"typeAware":true,"typeCheck":true}},
staged: {
"*.js": "vp lint --fix"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ import { defineConfig } from 'vite-plus';

export default defineConfig({
fmt: {},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error"},"options":{"typeAware":true,"typeCheck":true}},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error","vite-plus/require-pnpm-vite-alias":"error"},"options":{"typeAware":true,"typeCheck":true}},
staged: {
"*.@(js|ts|tsx|yml|yaml|md|json|html|toml)": [
"vp fmt --staged",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ import { defineConfig } from 'vite-plus';

export default defineConfig({
fmt: {},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error"},"options":{"typeAware":true,"typeCheck":true}},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error","vite-plus/require-pnpm-vite-alias":"error"},"options":{"typeAware":true,"typeCheck":true}},
staged: {
'*.js': 'vp check --fix',
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ export default {
lint: {
"rules": {
"no-unused-vars": "error",
"vite-plus/prefer-vite-plus-imports": "error"
"vite-plus/prefer-vite-plus-imports": "error",
"vite-plus/require-pnpm-vite-alias": "error"
},
"options": {
"typeAware": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ export default defineConfig({
lint: {
"rules": {
"no-unused-vars": "error",
"vite-plus/prefer-vite-plus-imports": "error"
"vite-plus/prefer-vite-plus-imports": "error",
"vite-plus/require-pnpm-vite-alias": "error"
},
"options": {
"typeAware": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ export default defineConfig({
lint: {
"rules": {
"no-unused-vars": "error",
"vite-plus/prefer-vite-plus-imports": "error"
"vite-plus/prefer-vite-plus-imports": "error",
"vite-plus/require-pnpm-vite-alias": "error"
},
"options": {
"typeAware": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export default defineConfig({
"*": "vp check --fix"
},
fmt: {},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error"},"options":{"typeAware":true,"typeCheck":true}},
lint: {"jsPlugins":[{"name":"vite-plus","specifier":"vite-plus/oxlint-plugin"}],"rules":{"vite-plus/prefer-vite-plus-imports":"error","vite-plus/require-pnpm-vite-alias":"error"},"options":{"typeAware":true,"typeCheck":true}},
plugins: [react()],
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ export default defineConfig({
lint: {
"rules": {
"no-unused-vars": "error",
"vite-plus/prefer-vite-plus-imports": "error"
"vite-plus/prefer-vite-plus-imports": "error",
"vite-plus/require-pnpm-vite-alias": "error"
},
"options": {
"typeAware": true,
Expand Down Expand Up @@ -166,7 +167,8 @@ export default defineConfig({
lint: {
"rules": {
"no-unused-vars": "warn",
"vite-plus/prefer-vite-plus-imports": "error"
"vite-plus/prefer-vite-plus-imports": "error",
"vite-plus/require-pnpm-vite-alias": "error"
},
"options": {
"typeAware": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ export default defineConfig({
lint: {
"rules": {
"no-unused-vars": "error",
"vite-plus/prefer-vite-plus-imports": "error"
"vite-plus/prefer-vite-plus-imports": "error",
"vite-plus/require-pnpm-vite-alias": "error"
},
"options": {
"typeAware": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ export default defineConfig({
},
"rules": {
"no-console": "error",
"vite-plus/prefer-vite-plus-imports": "error"
"vite-plus/prefer-vite-plus-imports": "error",
"vite-plus/require-pnpm-vite-alias": "error"
},
"globals": {},
"ignorePatterns": [],
Expand Down
Loading
Loading