diff --git a/packages/vue-test-workspace-vue-2/package.json b/packages/vue-test-workspace-vue-2/package.json new file mode 100644 index 0000000000..c9c915f48e --- /dev/null +++ b/packages/vue-test-workspace-vue-2/package.json @@ -0,0 +1,10 @@ +{ + "private": true, + "name": "@volar/vue-test-workspace-vue-2", + "version": "1.0.0", + "license": "MIT", + "devDependencies": { + "vue": "^2.7.14", + "vue-component-type-helpers": "1.8.3" + } +} diff --git a/packages/vue-test-workspace-vue-2/tsconfig.json b/packages/vue-test-workspace-vue-2/tsconfig.json new file mode 100644 index 0000000000..c0e26c8eed --- /dev/null +++ b/packages/vue-test-workspace-vue-2/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "lib": [ + "esnext", + "dom" + ], + "strict": true, + "noUncheckedIndexedAccess": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "skipLibCheck": true, + "allowJs": true, + "jsx": "preserve", + }, + "include": [ + "**/*" + ] +} diff --git a/packages/vue-test-workspace-vue-2/vue-tsc/shared.ts b/packages/vue-test-workspace-vue-2/vue-tsc/shared.ts new file mode 100644 index 0000000000..26abe5a11b --- /dev/null +++ b/packages/vue-test-workspace-vue-2/vue-tsc/shared.ts @@ -0,0 +1,10 @@ +// https://stackoverflow.com/a/53808212 +type IfEquals = + (() => G extends T ? 1 : 2) extends + (() => G extends U ? 1 : 2) ? Y : N; +export declare function exactType(draft: T & IfEquals, expected: U & IfEquals): IfEquals; + +// https://stackoverflow.com/a/49928360 +type IfNotAny = 0 extends 1 & T ? never : T; +type IfNotUndefined = Exclude extends never ? never : T; +export declare function isNotAnyOrUndefined(value: IfNotAny>): void; diff --git a/packages/vue-test-workspace-vue-2/vue-tsc/strict-template/intrinsicProps/main.vue b/packages/vue-test-workspace-vue-2/vue-tsc/strict-template/intrinsicProps/main.vue new file mode 100644 index 0000000000..c5185019ce --- /dev/null +++ b/packages/vue-test-workspace-vue-2/vue-tsc/strict-template/intrinsicProps/main.vue @@ -0,0 +1,19 @@ + + + diff --git a/packages/vue-test-workspace-vue-2/vue-tsc/strict-template/tsconfig.json b/packages/vue-test-workspace-vue-2/vue-tsc/strict-template/tsconfig.json new file mode 100644 index 0000000000..715269aba2 --- /dev/null +++ b/packages/vue-test-workspace-vue-2/vue-tsc/strict-template/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../tsconfig.base.json", + "vueCompilerOptions": { + "strictTemplates": true + }, + "include": ["**/*"] +} diff --git a/packages/vue-test-workspace-vue-2/vue-tsc/strict-template/unknownProp/main.vue b/packages/vue-test-workspace-vue-2/vue-tsc/strict-template/unknownProp/main.vue new file mode 100644 index 0000000000..29a366bdbc --- /dev/null +++ b/packages/vue-test-workspace-vue-2/vue-tsc/strict-template/unknownProp/main.vue @@ -0,0 +1,21 @@ + + + + diff --git a/packages/vue-test-workspace-vue-2/vue-tsc/tsconfig.base.json b/packages/vue-test-workspace-vue-2/vue-tsc/tsconfig.base.json new file mode 100644 index 0000000000..705c64ead7 --- /dev/null +++ b/packages/vue-test-workspace-vue-2/vue-tsc/tsconfig.base.json @@ -0,0 +1,12 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "noPropertyAccessFromIndexSignature": true, + }, + "vueCompilerOptions": { + "target": 2.7, + "jsxSlots": true, + "plugins": ["../../vue-language-plugin-pug"] + }, + "include": [] +} diff --git a/packages/vue-test-workspace/vue-tsc/strict-template/intrinsicProps/main.vue b/packages/vue-test-workspace/vue-tsc/strict-template/intrinsicProps/main.vue new file mode 100644 index 0000000000..bb8ca33b14 --- /dev/null +++ b/packages/vue-test-workspace/vue-tsc/strict-template/intrinsicProps/main.vue @@ -0,0 +1,15 @@ + + + diff --git a/packages/vue-tsc/tests/index.spec.ts b/packages/vue-tsc/tests/index.spec.ts index aded5088c3..d30d97ab35 100644 --- a/packages/vue-tsc/tests/index.spec.ts +++ b/packages/vue-tsc/tests/index.spec.ts @@ -4,15 +4,17 @@ import { describe, it } from 'vitest'; import { fork } from 'child_process'; const binPath = require.resolve('../bin/vue-tsc.js'); -const workspace = path.resolve(__dirname, '../../vue-test-workspace/vue-tsc'); + +const workspaceVue3 = path.resolve(__dirname, '../../vue-test-workspace/vue-tsc'); +const workspaceVue2 = path.resolve(__dirname, '../../vue-test-workspace-vue-2/vue-tsc'); function prettyPath(path: string, isRoot: boolean) { const segments = path.split('/'); return !isRoot ? segments.slice(segments.length - 2, segments.length).join('/') : segments[segments.length - 1]; } -function collectTests(dir: string, depth = 2, isRoot: boolean = true): [string, boolean][] { - const tests: [string, boolean][] = []; +function collectTests(dir: string, depth = 2, isRoot: boolean = true): [filePath: string, isRoot: boolean][] { + const tests: [filePath: string, isRoot: boolean][] = []; if (depth <= 0) { return tests; @@ -37,7 +39,8 @@ function collectTests(dir: string, depth = 2, isRoot: boolean = true): [string, return tests; } -const tests = collectTests(workspace); +const testsVue3 = collectTests(workspaceVue3); +const testsVue2 = collectTests(workspaceVue2); function runVueTsc(cwd: string) { return new Promise((resolve, reject) => { @@ -70,7 +73,13 @@ function runVueTsc(cwd: string) { } describe(`vue-tsc`, () => { - for (const [path, isRoot] of tests) { + for (const [path, isRoot] of testsVue3) { + it(`vue-tsc no errors (${prettyPath(path, isRoot)})`, () => runVueTsc(path), 40_000); + } +}); + +describe(`vue-tsc (vue 2)`, () => { + for (const [path, isRoot] of testsVue2) { it(`vue-tsc no errors (${prettyPath(path, isRoot)})`, () => runVueTsc(path), 40_000); } }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 717576dcd9..b2ca2dcdf9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -252,6 +252,15 @@ importers: specifier: 1.8.19 version: link:../vue-component-type-helpers + packages/vue-test-workspace-vue-2: + devDependencies: + vue: + specifier: ^2.7.14 + version: 2.7.14 + vue-component-type-helpers: + specifier: 1.8.3 + version: 1.8.3 + packages/vue-tsc: dependencies: '@vue/language-core': @@ -1429,6 +1438,14 @@ packages: '@vue/compiler-core': 3.3.4 '@vue/shared': 3.3.4 + /@vue/compiler-sfc@2.7.14: + resolution: {integrity: sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==} + dependencies: + '@babel/parser': 7.23.0 + postcss: 8.4.31 + source-map: 0.6.1 + dev: true + /@vue/compiler-sfc@3.3.4: resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} dependencies: @@ -5594,8 +5611,6 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} requiresBuild: true - dev: false - optional: true /spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -6445,6 +6460,10 @@ packages: /vscode-uri@3.0.8: resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + /vue-component-type-helpers@1.8.3: + resolution: {integrity: sha512-+/nC0Ra571Jqe7QuZObo1WJbHcdHo8d1rcF8EDSuFAl+dQGlMB6zbM4dsrofJY1wIeky/rGkFE6pCmtHaEf/zw==} + dev: true + /vue-template-compiler@2.7.14: resolution: {integrity: sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==} dependencies: @@ -6452,6 +6471,13 @@ packages: he: 1.2.0 dev: false + /vue@2.7.14: + resolution: {integrity: sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==} + dependencies: + '@vue/compiler-sfc': 2.7.14 + csstype: 3.1.2 + dev: true + /vue@3.3.4: resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==} dependencies: