Skip to content

Commit cd0ca0d

Browse files
authored
fix: ensure there's only one instance of plugin-vue in the config (#184)
Fixes #161
1 parent 44557f8 commit cd0ca0d

31 files changed

+1032
-190
lines changed

pnpm-lock.yaml

Lines changed: 329 additions & 187 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

renovate.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
"schedule:monthly"
66
],
77
"ignorePaths": [
8-
"**/node_modules/**"
8+
"**/node_modules/**",
9+
"test/fixtures/redefine-plugin-vue"
910
],
1011
"ignoreDeps": ["espree"]
1112
}

src/utilities.ts

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import process from 'node:process'
22
import tseslint from 'typescript-eslint'
33
import type { TSESLint } from '@typescript-eslint/utils'
4+
import pluginVue from 'eslint-plugin-vue'
45

56
import { TsEslintConfigForVue } from './configs'
67
import groupVueFiles from './groupVueFiles'
@@ -78,9 +79,10 @@ export function defineConfigWithVueTs(
7879
return pipe(
7980
configs,
8081
flattenConfigs,
82+
deduplicateVuePlugin,
8183
insertAndReorderConfigs,
8284
resolveVueTsConfigs,
83-
tseslint.config, // this might not be necessary, but it doesn't hurt to keep it
85+
tseslint.config, // this might not be necessary, but it doesn't hurt to keep it
8486
)
8587
}
8688

@@ -191,7 +193,10 @@ function insertAndReorderConfigs(configs: RawConfigItem[]): RawConfigItem[] {
191193

192194
return [
193195
...configsWithoutTypeAwareRules.slice(0, lastExtendedConfigIndex + 1),
194-
...createBasicSetupConfigs(projectOptions.tsSyntaxInTemplates, projectOptions.scriptLangs),
196+
...createBasicSetupConfigs(
197+
projectOptions.tsSyntaxInTemplates,
198+
projectOptions.scriptLangs,
199+
),
195200

196201
// user-turned-off type-aware rules must come after the last extended config
197202
// in case some rules re-enabled by the extended config
@@ -248,3 +253,34 @@ const rulesRequiringTypeInformation = new Set(
248253
function doesRuleRequireTypeInformation(ruleName: string): boolean {
249254
return rulesRequiringTypeInformation.has(ruleName)
250255
}
256+
257+
function deduplicateVuePlugin(configs: RawConfigItem[]): RawConfigItem[] {
258+
return configs.map(config => {
259+
if (config instanceof TsEslintConfigForVue || !config.plugins?.vue) {
260+
return config
261+
}
262+
263+
const currentVuePlugin = config.plugins.vue
264+
if (currentVuePlugin !== pluginVue) {
265+
const currentVersion: string = currentVuePlugin.meta?.version || 'unknown'
266+
const expectedVersion: string = pluginVue.meta?.version || 'unknown'
267+
268+
const configName: string = config.name || 'unknown config'
269+
270+
console.warn(
271+
`Warning: Multiple instances of eslint-plugin-vue detected in ${configName}. ` +
272+
`Replacing version ${currentVersion} with version ${expectedVersion}.`,
273+
)
274+
275+
return {
276+
...config,
277+
plugins: {
278+
...config.plugins,
279+
vue: pluginVue,
280+
},
281+
}
282+
}
283+
284+
return config
285+
})
286+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[*.{js,jsx,mjs,cjs,ts,tsx,mts,cts,vue,css,scss,sass,less,styl}]
2+
charset = utf-8
3+
indent_size = 2
4+
indent_style = space
5+
insert_final_newline = true
6+
trim_trailing_whitespace = true
7+
8+
end_of_line = lf
9+
max_line_length = 100
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
* text=auto eol=lf
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Logs
2+
logs
3+
*.log
4+
npm-debug.log*
5+
yarn-debug.log*
6+
yarn-error.log*
7+
pnpm-debug.log*
8+
lerna-debug.log*
9+
10+
node_modules
11+
.DS_Store
12+
dist
13+
dist-ssr
14+
coverage
15+
*.local
16+
17+
/cypress/videos/
18+
/cypress/screenshots/
19+
20+
# Editor directories and files
21+
.vscode/*
22+
!.vscode/extensions.json
23+
.idea
24+
*.suo
25+
*.ntvs*
26+
*.njsproj
27+
*.sln
28+
*.sw?
29+
30+
*.tsbuildinfo
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"recommendations": [
3+
"Vue.volar",
4+
"dbaeumer.vscode-eslint",
5+
"EditorConfig.EditorConfig"
6+
]
7+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# redefine-plugin-vue
2+
3+
This template should help get you started developing with Vue 3 in Vite.
4+
5+
## Recommended IDE Setup
6+
7+
[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur).
8+
9+
## Type Support for `.vue` Imports in TS
10+
11+
TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) to make the TypeScript language service aware of `.vue` types.
12+
13+
## Customize configuration
14+
15+
See [Vite Configuration Reference](https://vite.dev/config/).
16+
17+
## Project Setup
18+
19+
```sh
20+
pnpm install
21+
```
22+
23+
### Compile and Hot-Reload for Development
24+
25+
```sh
26+
pnpm dev
27+
```
28+
29+
### Type-Check, Compile and Minify for Production
30+
31+
```sh
32+
pnpm build
33+
```
34+
35+
### Lint with [ESLint](https://eslint.org/)
36+
37+
```sh
38+
pnpm lint
39+
```
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/// <reference types="vite/client" />
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { globalIgnores } from 'eslint/config'
2+
import { defineConfigWithVueTs, vueTsConfigs } from '@vue/eslint-config-typescript'
3+
import pluginVue from 'eslint-plugin-vue'
4+
5+
// To allow more languages other than `ts` in `.vue` files, uncomment the following lines:
6+
// import { configureVueProject } from '@vue/eslint-config-typescript'
7+
// configureVueProject({ scriptLangs: ['ts', 'tsx'] })
8+
// More info at https://github.com/vuejs/eslint-config-typescript/#advanced-setup
9+
10+
export default defineConfigWithVueTs(
11+
{
12+
name: 'app/files-to-lint',
13+
files: ['**/*.{ts,mts,tsx,vue}'],
14+
},
15+
16+
globalIgnores(['**/dist/**', '**/dist-ssr/**', '**/coverage/**']),
17+
18+
pluginVue.configs['flat/essential'],
19+
vueTsConfigs.recommended,
20+
)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<!DOCTYPE html>
2+
<html lang="">
3+
<head>
4+
<meta charset="UTF-8">
5+
<link rel="icon" href="/favicon.ico">
6+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
7+
<title>Vite App</title>
8+
</head>
9+
<body>
10+
<div id="app"></div>
11+
<script type="module" src="/src/main.ts"></script>
12+
</body>
13+
</html>
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{
2+
"name": "redefine-plugin-vue",
3+
"version": "0.0.0",
4+
"private": true,
5+
"type": "module",
6+
"scripts": {
7+
"dev": "vite",
8+
"build": "run-p type-check \"build-only {@}\" --",
9+
"preview": "vite preview",
10+
"build-only": "vite build",
11+
"type-check": "vue-tsc --build",
12+
"lint": "eslint . --fix"
13+
},
14+
"dependencies": {
15+
"vue": "^3.5.13"
16+
},
17+
"devDependencies": {
18+
"@tsconfig/node22": "^22.0.1",
19+
"@types/node": "^22.14.0",
20+
"@vitejs/plugin-vue": "^5.2.3",
21+
"@vue/eslint-config-typescript": "workspace:*",
22+
"@vue/tsconfig": "^0.7.0",
23+
"eslint": "^9.22.0",
24+
"eslint-plugin-vue": "~10.0.0",
25+
"jiti": "^2.4.2",
26+
"npm-run-all2": "^8.0.4",
27+
"typescript": "~5.8.0",
28+
"vite": "^6.2.4",
29+
"vite-plugin-vue-devtools": "^7.7.2",
30+
"vue-tsc": "^2.2.8"
31+
}
32+
}
Binary file not shown.
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<script setup lang="ts">
2+
import HelloWorld from './components/HelloWorld.vue'
3+
import TheWelcome from './components/TheWelcome.vue'
4+
</script>
5+
6+
<template>
7+
<header>
8+
<img alt="Vue logo" class="logo" src="./assets/logo.svg" width="125" height="125" />
9+
10+
<div class="wrapper">
11+
<HelloWorld msg="You did it!" />
12+
</div>
13+
</header>
14+
15+
<main>
16+
<TheWelcome />
17+
</main>
18+
</template>
19+
20+
<style scoped>
21+
header {
22+
line-height: 1.5;
23+
}
24+
25+
.logo {
26+
display: block;
27+
margin: 0 auto 2rem;
28+
}
29+
30+
@media (min-width: 1024px) {
31+
header {
32+
display: flex;
33+
place-items: center;
34+
padding-right: calc(var(--section-gap) / 2);
35+
}
36+
37+
.logo {
38+
margin: 0 2rem 0 0;
39+
}
40+
41+
header .wrapper {
42+
display: flex;
43+
place-items: flex-start;
44+
flex-wrap: wrap;
45+
}
46+
}
47+
</style>
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
/* color palette from <https://github.com/vuejs/theme> */
2+
:root {
3+
--vt-c-white: #ffffff;
4+
--vt-c-white-soft: #f8f8f8;
5+
--vt-c-white-mute: #f2f2f2;
6+
7+
--vt-c-black: #181818;
8+
--vt-c-black-soft: #222222;
9+
--vt-c-black-mute: #282828;
10+
11+
--vt-c-indigo: #2c3e50;
12+
13+
--vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
14+
--vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
15+
--vt-c-divider-dark-1: rgba(84, 84, 84, 0.65);
16+
--vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
17+
18+
--vt-c-text-light-1: var(--vt-c-indigo);
19+
--vt-c-text-light-2: rgba(60, 60, 60, 0.66);
20+
--vt-c-text-dark-1: var(--vt-c-white);
21+
--vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
22+
}
23+
24+
/* semantic color variables for this project */
25+
:root {
26+
--color-background: var(--vt-c-white);
27+
--color-background-soft: var(--vt-c-white-soft);
28+
--color-background-mute: var(--vt-c-white-mute);
29+
30+
--color-border: var(--vt-c-divider-light-2);
31+
--color-border-hover: var(--vt-c-divider-light-1);
32+
33+
--color-heading: var(--vt-c-text-light-1);
34+
--color-text: var(--vt-c-text-light-1);
35+
36+
--section-gap: 160px;
37+
}
38+
39+
@media (prefers-color-scheme: dark) {
40+
:root {
41+
--color-background: var(--vt-c-black);
42+
--color-background-soft: var(--vt-c-black-soft);
43+
--color-background-mute: var(--vt-c-black-mute);
44+
45+
--color-border: var(--vt-c-divider-dark-2);
46+
--color-border-hover: var(--vt-c-divider-dark-1);
47+
48+
--color-heading: var(--vt-c-text-dark-1);
49+
--color-text: var(--vt-c-text-dark-2);
50+
}
51+
}
52+
53+
*,
54+
*::before,
55+
*::after {
56+
box-sizing: border-box;
57+
margin: 0;
58+
font-weight: normal;
59+
}
60+
61+
body {
62+
min-height: 100vh;
63+
color: var(--color-text);
64+
background: var(--color-background);
65+
transition:
66+
color 0.5s,
67+
background-color 0.5s;
68+
line-height: 1.6;
69+
font-family:
70+
Inter,
71+
-apple-system,
72+
BlinkMacSystemFont,
73+
'Segoe UI',
74+
Roboto,
75+
Oxygen,
76+
Ubuntu,
77+
Cantarell,
78+
'Fira Sans',
79+
'Droid Sans',
80+
'Helvetica Neue',
81+
sans-serif;
82+
font-size: 15px;
83+
text-rendering: optimizeLegibility;
84+
-webkit-font-smoothing: antialiased;
85+
-moz-osx-font-smoothing: grayscale;
86+
}
Lines changed: 1 addition & 0 deletions
Loading

0 commit comments

Comments
 (0)