chore(ct): type check (#18208)

This commit is contained in:
sand4rt 2022-10-20 22:33:25 +02:00 committed by GitHub
parent fb643940e5
commit 951cba8142
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
61 changed files with 270 additions and 119 deletions

View File

@ -5,7 +5,8 @@
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"preview": "vite preview"
"preview": "vite preview",
"typecheck": "tsc --noEmit"
},
"dependencies": {
"react": "^17.0.2",

View File

@ -4,7 +4,7 @@ type ButtonProps = {
title: string;
onClick?(props: string): void;
className?: string;
} & ButtonHTMLAttributes<HTMLButtonElement>;
} & Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onClick'>;
export default function Button({ onClick, title, ...attributes }: ButtonProps) {
return <button {...attributes} onClick={() => onClick?.('hello')}>

View File

@ -4,7 +4,7 @@
"useDefineForClassFields": true,
"lib": ["DOM", "DOM.Iterable", "ESNext"],
"allowJs": false,
"skipLibCheck": false,
"skipLibCheck": true,
"esModuleInterop": false,
"allowSyntheticDefaultImports": true,
"strict": true,

View File

@ -18,7 +18,8 @@
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"eject": "react-scripts eject"
"eject": "react-scripts eject",
"typecheck": "tsc --noEmit"
},
"eslintConfig": {
"extends": [

View File

@ -4,7 +4,7 @@ type ButtonProps = {
title: string;
onClick?(props: string): void;
className?: string;
} & ButtonHTMLAttributes<HTMLButtonElement>;
} & Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onClick'>;
export default function Button({ onClick, title, ...attributes }: ButtonProps) {
return <button {...attributes} onClick={() => onClick?.('hello')}>

View File

@ -1,5 +1,5 @@
import { test, expect } from '@playwright/experimental-ct-react'
import { serverFixtures } from '../../../../tests/config/serverFixtures';
import { test, expect } from '@playwright/experimental-ct-react';
const { serverFixtures } = require('../../../../tests/config/serverFixtures');
import Fetch from './components/Fetch';
import DelayedData from './components/DelayedData';
import Button from './components/Button';
@ -143,7 +143,7 @@ test('get textContent of the empty fragment', async ({ mount }) => {
const testWithServer = test.extend(serverFixtures);
testWithServer('components routing should go through context', async ({ mount, context, server }) => {
server.setRoute('/hello', (req, res) => {
server.setRoute('/hello', (req: any, res: any) => {
res.write('served via server');
res.end();
});
@ -158,7 +158,7 @@ testWithServer('components routing should go through context', async ({ mount, c
});
const whoServedTheRequest = Promise.race([
server.waitForRequest('/hello').then((req) => `served via server: ${req.method} ${req.url}`),
server.waitForRequest('/hello').then((req: any) => `served via server: ${req.method} ${req.url}`),
routedViaContext.then(req => `served via context: ${req}`),
]);

View File

@ -6,7 +6,8 @@
"start": "vite",
"dev": "vite",
"build": "vite build",
"serve": "vite preview"
"serve": "vite preview",
"typecheck": "tsc --noEmit"
},
"license": "MIT",
"devDependencies": {

View File

@ -4,7 +4,7 @@ type ButtonProps = {
title: string;
onClick?(props: string): void;
className?: string;
} & JSX.ButtonHTMLAttributes<HTMLButtonElement>;
} & Omit<JSX.ButtonHTMLAttributes<HTMLButtonElement>, 'onClick'>;
export default function Button({ onClick, title, ...attributes }: ButtonProps) {
return <button {...attributes} onClick={() => onClick?.('hello')}>

View File

@ -71,7 +71,7 @@ test('execute callback when the button is clicked', async ({ mount }) => {
const component = await mount(
<Button
title="Submit"
onClick={(data) => {
onClick={data => {
messages.push(data);
}}
/>

View File

@ -10,6 +10,7 @@
"jsxImportSource": "solid-js",
"types": ["vite/client"],
"noEmit": true,
"isolatedModules": true
"isolatedModules": true,
"skipLibCheck": true
}
}

View File

@ -7,7 +7,7 @@
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"check": "svelte-check --tsconfig ./tsconfig.json"
"typecheck": "svelte-check --tsconfig ./tsconfig.json"
},
"devDependencies": {
"@sveltejs/vite-plugin-svelte": "^1.0.1",

View File

@ -1,7 +1,7 @@
<script lang="ts">
import { update, remountCount } from '../store'
import { createEventDispatcher } from "svelte";
export let count;
export let count: number;
const dispatch = createEventDispatcher();
update();
</script>

View File

@ -2,7 +2,7 @@ import App from './App.svelte';
import './assets/index.css';
const app = new App({
target: document.getElementById('app')
target: document.getElementById('app')!
});
export default app;

View File

@ -0,0 +1,4 @@
declare module '*.svelte' {
const value: any; // Add better type definitions here if desired.
export default value;
}

View File

@ -65,13 +65,13 @@ test('renderer updates event listeners without remounting', async ({ mount }) =>
})
test('emit an submit event when the button is clicked', async ({ mount }) => {
const messages = []
const messages: string[] = []
const component = await mount(Button, {
props: {
title: 'Submit'
},
on: {
submit: data => messages.push(data)
submit: (data: string) => messages.push(data)
}
})
await component.click()
@ -101,7 +101,7 @@ test('render a component with a named slot', async ({ mount }) => {
})
test('run hooks', async ({ page, mount }) => {
const messages = []
const messages: string[] = []
page.on('console', m => messages.push(m.text()))
await mount<HooksConfig>(Button, {
props: {

View File

@ -13,8 +13,10 @@
* of JS in `.svelte` files.
*/
"allowJs": true,
"checkJs": true
"checkJs": true,
"skipLibCheck": true,
"strict": true
},
"include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.js", "src/**/*.svelte"],
"include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.js", "src/**/*.svelte", "src/**/*.spec.*/*"],
"references": [{ "path": "./tsconfig.node.json" }]
}

View File

@ -5,7 +5,8 @@
"scripts": {
"build": "rollup -c",
"dev": "rollup -c -w",
"start": "sirv public --no-clear"
"start": "sirv public --no-clear",
"typecheck": "tsc --noEmit"
},
"devDependencies": {
"@rollup/plugin-commonjs": "^17.0.0",
@ -15,13 +16,13 @@
"rollup-plugin-livereload": "^2.0.0",
"rollup-plugin-svelte": "^7.0.0",
"rollup-plugin-terser": "^7.0.0",
"svelte": "^3.0.0"
"sirv-cli": "^2.0.0"
},
"@standaloneDevDependencies": {
"@playwright/experimental-ct-svelte": "^1.22.2",
"@playwright/test": "^1.22.2"
},
"dependencies": {
"sirv-cli": "^2.0.0"
"svelte": "^3.0.0"
}
}

View File

@ -1,4 +1,4 @@
<script lang="ts">
<script>
import { update, remountCount } from '../store'
import { createEventDispatcher } from "svelte";
export let count;

View File

@ -66,13 +66,13 @@ test('renderer updates event listeners without remounting', async ({ mount }) =>
})
test('emit an submit event when the button is clicked', async ({ mount }) => {
const messages = []
const messages: string[] = []
const component = await mount(Button, {
props: {
title: 'Submit'
},
on: {
submit: data => messages.push(data)
submit: (data: string) => messages.push(data)
}
})
await component.click()
@ -107,7 +107,7 @@ test('render a component without options', async ({ mount }) => {
})
test('run hooks', async ({ page, mount }) => {
const messages = []
const messages: string[] = []
page.on('console', m => messages.push(m.text()))
await mount<HooksConfig>(Button, {
props: {

View File

@ -0,0 +1,11 @@
{
"compilerOptions": {
"target": "ESNext",
"module": "ESNext",
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"strict": true,
"skipLibCheck": true,
"moduleResolution": "node"
}
}

View File

@ -1,6 +1,7 @@
.DS_Store
node_modules
/dist
*.tsbuildinfo
# local env files
.env.local

View File

@ -1,20 +0,0 @@
{
"compilerOptions": {
"target": "es5",
"jsx": "react-jsx",
"module": "esnext",
"baseUrl": "./",
"moduleResolution": "node",
"paths": {
"@/*": [
"src/*"
]
},
"lib": [
"esnext",
"dom",
"dom.iterable",
"scripthost"
]
}
}

View File

@ -5,7 +5,8 @@
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
"lint": "vue-cli-service lint",
"typecheck": "tsc --noEmit --project tsconfig.test.json"
},
"dependencies": {
"core-js": "^3.8.3",
@ -17,6 +18,7 @@
"@vue/cli-plugin-babel": "~5.0.0",
"@vue/cli-plugin-eslint": "~5.0.0",
"@vue/cli-service": "~5.0.0",
"@vue/tsconfig": "^0.1.3",
"eslint": "^7.32.0",
"eslint-plugin-vue": "^8.0.3"
},

View File

@ -1,4 +1,4 @@
<script setup>
<script lang="ts" setup>
defineProps({
title: {
type: String,

View File

@ -5,11 +5,11 @@
</div>
</template>
<script>
<script lang="ts">
let remountCount = 0
</script>
<script setup>
<script lang="ts" setup>
defineProps({
count: {
type: Number,

View File

@ -28,10 +28,13 @@ test('renderer and keep the component instance intact', async ({ mount }) => {
})
test('emit an submit event when the button is clicked', async ({ mount }) => {
const messages = []
const component = await mount(<Button title='Submit' v-on:submit={data => {
messages.push(data)
}}></Button>)
const messages: string[] = []
const component = await mount(<Button
title="Submit"
v-on:submit={(data: string) => {
messages.push(data)
}}
/>)
await component.click()
expect(messages).toEqual(['hello'])
})
@ -79,7 +82,7 @@ test('emit a event when a slot is clicked', async ({ mount }) => {
})
test('run hooks', async ({ page, mount }) => {
const messages = []
const messages: string[] = []
page.on('console', m => messages.push(m.text()))
await mount<HooksConfig>(<Button title="Submit" />, {
hooksConfig: { route: 'A' }

View File

@ -1,5 +1,4 @@
import { test, expect } from '@playwright/experimental-ct-vue'
import Button from './components/Button.vue'
import Counter from './components/Counter.vue'
import DefaultSlot from './components/DefaultSlot.vue'
@ -38,13 +37,13 @@ test('renderer and keep the component instance intact', async ({ mount }) => {
})
test('emit an submit event when the button is clicked', async ({ mount }) => {
const messages = []
const messages: string[] = []
const component = await mount(Button, {
props: {
title: 'Submit'
},
on: {
submit: data => messages.push(data)
submit: (data: string) => messages.push(data)
}
})
await component.click()
@ -89,7 +88,7 @@ test('render a component without options', async ({ mount }) => {
})
test('run hooks', async ({ page, mount }) => {
const messages = []
const messages: string[] = []
page.on('console', m => messages.push(m.text()))
await mount<HooksConfig>(Button, {
props: {

View File

@ -0,0 +1,12 @@
{
"extends": "@vue/tsconfig/tsconfig.web.json",
"include": ["src/**/*", "src/**/*.vue"],
"exclude": ["src/**/*.spec.*/*"],
"compilerOptions": {
"composite": true,
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
}
}
}

View File

@ -0,0 +1,8 @@
{
"extends": "@vue/tsconfig/tsconfig.node.json",
"include": ["playwright.config.*"],
"compilerOptions": {
"composite": true,
"types": ["node"]
}
}

View File

@ -0,0 +1,14 @@
{
"files": [],
"references": [
{
"path": "./tsconfig.config.json"
},
{
"path": "./tsconfig.app.json"
},
{
"path": "./tsconfig.test.json"
}
]
}

View File

@ -0,0 +1,11 @@
{
"extends": "./tsconfig.app.json",
"include": ["playwright"],
"exclude": [],
"compilerOptions": {
"composite": true,
"lib": [],
"jsx": "react-jsx",
"types": ["node"]
}
}

4
tests/components/ct-vue-cli/vue.d.ts vendored Normal file
View File

@ -0,0 +1,4 @@
declare module '*.vue' {
const value: any;
export default value;
}

View File

@ -6,6 +6,7 @@ yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
*.tsbuildinfo
node_modules
.DS_Store

1
tests/components/ct-vue-vite/env.d.ts vendored Normal file
View File

@ -0,0 +1 @@
/// <reference types="vite/client" />

View File

@ -4,14 +4,17 @@
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview --port 5050"
"preview": "vite preview --port 5050",
"typecheck": "vue-tsc --noEmit --project tsconfig.test.json"
},
"dependencies": {
"vue": "^3.2.31"
},
"devDependencies": {
"@vitejs/plugin-vue": "^2.2.2",
"vite": "^2.8.4"
"@vue/tsconfig": "^0.1.3",
"vite": "^2.8.4",
"vue-tsc": "^1.0.0"
},
"@standaloneDevDependencies": {
"@playwright/experimental-ct-vue": "^1.22.2",

View File

@ -1,10 +1,5 @@
<script setup>
defineProps({
title: {
type: String,
required: true
}
})
<script lang="ts" setup>
defineProps<{ title: string }>()
</script>
<template>

View File

@ -7,17 +7,13 @@
</div>
</template>
<script>
<script lang="ts">
let remountCount = 0
</script>
<script setup>
defineProps({
count: {
type: Number,
required: false
}
})
<script lang="ts" setup>
defineProps<{ count?: number }>()
remountCount++
</script>

View File

@ -3,7 +3,6 @@
<header>
<slot name="header" />
</header>
<main>
<slot name="main" />
</main>

View File

@ -33,8 +33,8 @@ test('renderer updates props without remounting', async ({ mount }) => {
test('renderer updates event listeners without remounting', async ({ mount }) => {
const component = await mount(<Counter />)
const messages = []
await component.update(<Counter v-on:submit={count => {
const messages: string[] = []
await component.update(<Counter v-on:submit={(count: string) => {
messages.push(count)
}} />)
await component.click();
@ -57,10 +57,13 @@ test('renderer updates slots without remounting', async ({ mount }) => {
})
test('emit an submit event when the button is clicked', async ({ mount }) => {
const messages = []
const component = await mount(<Button title='Submit' v-on:submit={data => {
messages.push(data)
}}></Button>)
const messages: string[] = []
const component = await mount(<Button
title="Submit"
v-on:submit={(data: string) => {
messages.push(data)
}}
/>)
await component.click()
expect(messages).toEqual(['hello'])
})
@ -108,7 +111,7 @@ test('emit a event when a slot is clicked', async ({ mount }) => {
})
test('run hooks', async ({ page, mount }) => {
const messages = []
const messages: string[] = []
page.on('console', m => messages.push(m.text()))
await mount<HooksConfig>(<Button title="Submit" />, {
hooksConfig: { route: 'A' }
@ -118,12 +121,9 @@ test('run hooks', async ({ page, mount }) => {
test('unmount a multi root component', async ({ mount, page }) => {
const component = await mount(<MultiRoot />)
await expect(page.locator('#root')).toContainText('root 1')
await expect(page.locator('#root')).toContainText('root 2')
await component.unmount()
await expect(page.locator('#root')).not.toContainText('root 1')
await expect(page.locator('#root')).not.toContainText('root 2')
})

View File

@ -40,7 +40,7 @@ test('renderer updates event listeners without remounting', async ({ mount }) =>
const messages = []
await component.update({
on: {
submit: count => messages.push(count)
submit: (count) => messages.push(count)
}
})
await component.click();
@ -71,7 +71,7 @@ test('emit an submit event when the button is clicked', async ({ mount }) => {
title: 'Submit'
},
on: {
submit: data => messages.push(data)
submit: (data) => messages.push(data)
}
})
await component.click()

View File

@ -38,10 +38,10 @@ test('renderer updates props without remounting', async ({ mount }) => {
test('renderer updates event listeners without remounting', async ({ mount }) => {
const component = await mount(Counter)
const messages = []
const messages: string[] = []
await component.update({
on: {
submit: data => messages.push(data)
submit: (data: string) => messages.push(data)
}
})
await component.click();
@ -66,13 +66,13 @@ test('renderer updates slots without remounting', async ({ mount }) => {
})
test('emit an submit event when the button is clicked', async ({ mount }) => {
const messages = []
const messages: string[] = []
const component = await mount(Button, {
props: {
title: 'Submit'
},
on: {
submit: data => messages.push(data)
submit: (data: string) => messages.push(data)
}
})
await component.click()
@ -120,7 +120,7 @@ test('render a component without options', async ({ mount }) => {
})
test('run hooks', async ({ page, mount }) => {
const messages = []
const messages: string[] = []
page.on('console', m => messages.push(m.text()))
await mount<HooksConfig>(Button, {
props: {

View File

@ -0,0 +1,12 @@
{
"extends": "@vue/tsconfig/tsconfig.web.json",
"include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
"exclude": ["src/**/*.spec.*/*"],
"compilerOptions": {
"composite": true,
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
}
}
}

View File

@ -0,0 +1,8 @@
{
"extends": "@vue/tsconfig/tsconfig.node.json",
"include": ["vite.config.*", "playwright.config.*"],
"compilerOptions": {
"composite": true,
"types": ["node"]
}
}

View File

@ -0,0 +1,14 @@
{
"files": [],
"references": [
{
"path": "./tsconfig.config.json"
},
{
"path": "./tsconfig.app.json"
},
{
"path": "./tsconfig.test.json"
}
]
}

View File

@ -0,0 +1,10 @@
{
"extends": "./tsconfig.app.json",
"include": ["playwright"],
"exclude": [],
"compilerOptions": {
"composite": true,
"lib": [],
"types": ["node"]
}
}

View File

@ -1 +0,0 @@
declare module '*.vue';

View File

@ -1,7 +1,7 @@
.DS_Store
node_modules
/dist
*.tsbuildinfo
# local env files
.env.local

View File

@ -5,7 +5,8 @@
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
"lint": "vue-cli-service lint",
"typecheck": "tsc --noEmit --project tsconfig.test.json"
},
"dependencies": {
"core-js": "^3.8.3",
@ -17,6 +18,7 @@
"@vue/cli-plugin-babel": "~5.0.0",
"@vue/cli-plugin-eslint": "~5.0.0",
"@vue/cli-service": "~5.0.0",
"@vue/tsconfig": "^0.1.3",
"eslint": "^7.32.0",
"eslint-plugin-vue": "^8.0.3",
"vue-template-compiler": "^2.6.14"

View File

@ -1,4 +1,3 @@
//@ts-check
import '../src/assets/index.css';
import { beforeMount, afterMount } from '@playwright/experimental-ct-vue2/hooks';

View File

@ -2,7 +2,7 @@
<button @click="$emit('submit', 'hello')">{{ title }}</button>
</template>
<script>
<script lang="ts">
export default {
name: 'ButtonButton',
props: ['title']

View File

@ -7,7 +7,7 @@
</div>
</template>
<script>
<script lang="ts">
let remountCount = 0;
export default {

View File

@ -30,7 +30,7 @@
</div>
</template>
<script>
<script lang="ts">
export default {
name: 'HelloWorld',
props: {

View File

@ -30,12 +30,14 @@ test('renderer updates props without remounting', async ({ mount }) => {
})
test('renderer updates event listeners without remounting', async ({ mount }) => {
const messages = []
const messages: string[] = []
const component = await mount(<Counter />)
await component.update(<Counter v-on:submit={count => {
messages.push(count)
}} />)
await component.update(<Counter
v-on:submit={(count: string) => {
messages.push(count)
}}
/>)
await component.click();
expect(messages).toEqual(['hello'])
@ -56,10 +58,13 @@ test('renderer updates slots without remounting', async ({ mount }) => {
})
test('emit an submit event when the button is clicked', async ({ mount }) => {
const messages = []
const component = await mount(<Button title='Submit' v-on:submit={data => {
messages.push(data)
}}></Button>)
const messages: string[] = []
const component = await mount(<Button
title="Submit"
v-on:submit={(data: string) => {
messages.push(data)
}}
/>)
await component.click()
expect(messages).toEqual(['hello'])
})
@ -107,7 +112,7 @@ test('emit a event when a slot is clicked', async ({ mount }) => {
})
test('run hooks', async ({ page, mount }) => {
const messages = []
const messages: string[] = []
page.on('console', m => messages.push(m.text()))
await mount<hooksConfig>(<Button title="Submit" />, {
hooksConfig: { route: 'A' }

View File

@ -36,10 +36,10 @@ test('renderer updates props without remounting', async ({ mount }) => {
test('renderer updates event listeners without remounting', async ({ mount }) => {
const component = await mount(Counter)
const messages = []
const messages: string[] = []
await component.update({
on: {
submit: data => messages.push(data)
submit: (data: string) => messages.push(data)
}
})
await component.click();
@ -70,13 +70,13 @@ test('renderer updates slots without remounting', async ({ mount }) => {
})
test('emit an submit event when the button is clicked', async ({ mount }) => {
const messages = []
const messages: string[] = []
const component = await mount(Button, {
props: {
title: 'Submit'
},
on: {
submit: data => messages.push(data)
submit: (data: string) => messages.push(data)
}
})
await component.click()
@ -121,7 +121,7 @@ test('render a component without options', async ({ mount }) => {
})
test('run hooks', async ({ page, mount }) => {
const messages = []
const messages: string[] = []
page.on('console', m => messages.push(m.text()))
await mount<hooksConfig>(Button, {
props: {

View File

@ -0,0 +1,4 @@
declare module '*.vue' {
import Vue from 'vue';
export default Vue;
}

View File

@ -1 +0,0 @@
declare module '*.vue';

View File

@ -0,0 +1,12 @@
{
"extends": "@vue/tsconfig/tsconfig.web.json",
"include": ["src/**/*", "src/**/*.vue"],
"exclude": ["src/**/*.spec.*/*"],
"compilerOptions": {
"composite": true,
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
}
}
}

View File

@ -0,0 +1,8 @@
{
"extends": "@vue/tsconfig/tsconfig.node.json",
"include": ["playwright.config.*"],
"compilerOptions": {
"composite": true,
"types": ["node"]
}
}

View File

@ -0,0 +1,14 @@
{
"files": [],
"references": [
{
"path": "./tsconfig.config.json"
},
{
"path": "./tsconfig.app.json"
},
{
"path": "./tsconfig.test.json"
}
]
}

View File

@ -0,0 +1,10 @@
{
"extends": "./tsconfig.app.json",
"include": ["playwright"],
"exclude": [],
"compilerOptions": {
"composite": true,
"lib": [],
"types": ["node"]
}
}

View File

@ -14,11 +14,15 @@ for (const dir of fs.readdirSync(__dirname)) {
await run('npm', ['i'], folder);
});
test('typecheck', async () => {
await run('npm', ['run', 'typecheck'], folder);
});
for (const project of ['chromium', 'firefox', 'webkit']) {
test(project, async () => {
await run('npx', ['playwright', 'test', '--project=' + project, '--reporter=list'], folder);
});
}
}
});
}