Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: refactor type tests into a separate fixture #21007

Merged
merged 6 commits into from May 22, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 3 additions & 1 deletion package.json
Expand Up @@ -21,7 +21,9 @@
"test:fixtures:payload": "TEST_PAYLOAD=js pnpm test:fixtures",
"test:fixtures:dev": "TEST_ENV=dev pnpm test:fixtures",
"test:fixtures:webpack": "TEST_BUILDER=webpack pnpm test:fixtures",
"test:types": "nuxi prepare test/fixtures/basic && cd test/fixtures/basic && npx vue-tsc --noEmit",
"test:types": "pnpm test:types:basic && pnpm test:types:minimal",
"test:types:basic": "nuxi prepare test/fixtures/basic-types && cd test/fixtures/basic-types && npx vue-tsc --noEmit",
"test:types:minimal": "nuxi prepare test/fixtures/minimal-types && cd test/fixtures/minimal-types && npx vue-tsc --noEmit",
"test:unit": "vitest run --dir packages",
"typecheck": "tsc --noEmit"
},
Expand Down
25 changes: 25 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions test/fixtures/basic-types/.gitignore
@@ -0,0 +1 @@
!extends/node_modules
6 changes: 6 additions & 0 deletions test/fixtures/basic-types/app.config.ts
@@ -0,0 +1,6 @@
export default defineAppConfig({
userConfig: 123,
nested: {
val: 2
}
})
28 changes: 28 additions & 0 deletions test/fixtures/basic-types/components/WithTypes.vue
@@ -0,0 +1,28 @@
<script setup lang="ts">
defineProps({
aProp: Number
})
defineSlots<{
fallback: { id: string }
}>()
defineExpose<{
_exposedValue: boolean
}>()

const _exposedValue = 42

const emit = defineEmits<{
'some-event': [id: string]
}>()
emit('some-event', '42')

Check warning on line 17 in test/fixtures/basic-types/components/WithTypes.vue

View workflow job for this annotation

GitHub Actions / code

The "some-event" event has been triggered but not declared on `defineEmits`
// @ts-expect-error an invalid argument
emit('some-event', 42)

Check warning on line 19 in test/fixtures/basic-types/components/WithTypes.vue

View workflow job for this annotation

GitHub Actions / code

The "some-event" event has been triggered but not declared on `defineEmits`
// @ts-expect-error an unknown event
emit('unknown-event', 42)

Check warning on line 21 in test/fixtures/basic-types/components/WithTypes.vue

View workflow job for this annotation

GitHub Actions / code

The "unknown-event" event has been triggered but not declared on `defineEmits`
</script>

<template>
<div>
<!-- -->
</div>
</template>
3 changes: 3 additions & 0 deletions test/fixtures/basic-types/extends/bar/app.config.ts
@@ -0,0 +1,3 @@
export default {
fromLayer: true
}
5 changes: 5 additions & 0 deletions test/fixtures/basic-types/extends/bar/index.d.ts
@@ -0,0 +1,5 @@
declare module 'bing' {
interface BingInterface {
foo: 'bar'
}
}
6 changes: 6 additions & 0 deletions test/fixtures/basic-types/extends/bar/layouts/override.vue
@@ -0,0 +1,6 @@
<template>
<div>
<div>Extended layout from bar</div>
<NuxtPage />
</div>
</template>
3 changes: 3 additions & 0 deletions test/fixtures/basic-types/extends/bar/middleware/override.ts
@@ -0,0 +1,3 @@
export default defineNuxtRouteMiddleware((to) => {
to.meta.override = 'Injected by extended middleware from bar'
})
1 change: 1 addition & 0 deletions test/fixtures/basic-types/extends/bar/nuxt.config.ts
@@ -0,0 +1 @@
export default defineNuxtConfig({})
14 changes: 14 additions & 0 deletions test/fixtures/basic-types/extends/bar/pages/override.vue
@@ -0,0 +1,14 @@
<script setup>
definePageMeta({
layout: 'override',
middleware: 'override'
})
</script>

<template>
<div>
<div>Extended page from bar</div>
<div>Middleware | override: {{ $route.meta.override }}</div>
<ExtendsOverride />
</div>
</template>

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 19 additions & 0 deletions test/fixtures/basic-types/extends/node_modules/foo/pages/foo.vue

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Empty file.
6 changes: 6 additions & 0 deletions test/fixtures/basic-types/layouts/custom.vue
@@ -0,0 +1,6 @@
<template>
<div>
Custom Layout:
<slot />
</div>
</template>
7 changes: 7 additions & 0 deletions test/fixtures/basic-types/middleware/global.global.ts
@@ -0,0 +1,7 @@
export default defineNuxtRouteMiddleware((to) => {
if ('abort' in to.query) {
return abortNavigation({
statusCode: 401
})
}
})
3 changes: 3 additions & 0 deletions test/fixtures/basic-types/middleware/named.ts
@@ -0,0 +1,3 @@
export default defineNuxtRouteMiddleware((to) => {
to.meta.auth = 'Injected by injectAuth middleware'
})
15 changes: 15 additions & 0 deletions test/fixtures/basic-types/modules/auto-registered/index.ts
@@ -0,0 +1,15 @@
import { addServerHandler, createResolver, defineNuxtModule } from 'nuxt/kit'

export default defineNuxtModule({
meta: {
name: 'auto-registered-module'
},
setup () {
const resolver = createResolver(import.meta.url)

addServerHandler({
handler: resolver.resolve('./runtime/handler'),
route: '/auto-registered-module'
})
}
})
@@ -0,0 +1 @@
export default defineEventHandler(() => 'handler added by auto-registered module')
23 changes: 23 additions & 0 deletions test/fixtures/basic-types/modules/example.ts
@@ -0,0 +1,23 @@
import { addPlugin, createResolver, defineNuxtModule, useNuxt } from 'nuxt/kit'

export default defineNuxtModule({
defaults: {
enabled: true,
typeTest: (value: boolean) => typeof value === 'boolean'
},
meta: {
name: 'my-module',
configKey: 'sampleModule'
},
setup () {
const resolver = createResolver(import.meta.url)

addPlugin(resolver.resolve('./runtime/plugin'))
useNuxt().hook('app:resolve', (app) => {
app.middleware.push({
name: 'unctx-test',
path: resolver.resolve('./runtime/middleware')
})
})
}
})
19 changes: 19 additions & 0 deletions test/fixtures/basic-types/modules/page-extend.ts
@@ -0,0 +1,19 @@
import { createResolver, defineNuxtModule, useNuxt } from 'nuxt/kit'

export default defineNuxtModule({
meta: {
name: 'page-extend'
},
setup () {
const nuxt = useNuxt()
const resolver = createResolver(import.meta.url)

nuxt.hook('pages:extend', (pages) => {
pages.push({
name: 'page-extend',
path: '/page-extend',
file: resolver.resolve('./runtime/page.vue')
})
})
}
})
4 changes: 4 additions & 0 deletions test/fixtures/basic-types/modules/runtime/middleware.ts
@@ -0,0 +1,4 @@
export default defineNuxtRouteMiddleware(async () => {
await new Promise(resolve => setTimeout(resolve, 1))
useNuxtApp()
})
17 changes: 17 additions & 0 deletions test/fixtures/basic-types/modules/runtime/page.vue
@@ -0,0 +1,17 @@
<script setup lang="ts">
import { setResponseHeader } from 'h3'

definePageMeta({
value: 'added in pages:extend'
})

if (process.server) {
setResponseHeader(useRequestEvent(), 'x-extend', useRoute().meta.value as string)
}
</script>

<template>
<div>
added in pages:extend
</div>
</template>
4 changes: 4 additions & 0 deletions test/fixtures/basic-types/modules/runtime/plugin.ts
@@ -0,0 +1,4 @@
export default defineNuxtPlugin(async () => {
await new Promise(resolve => setTimeout(resolve, 1))
useNuxtApp()
})
7 changes: 7 additions & 0 deletions test/fixtures/basic-types/modules/test/index.ts
@@ -0,0 +1,7 @@
import { defineNuxtModule } from 'nuxt/kit'

export default defineNuxtModule({
meta: {
name: 'test'
}
})
76 changes: 76 additions & 0 deletions test/fixtures/basic-types/nuxt.config.ts
@@ -0,0 +1,76 @@
export default defineNuxtConfig({
experimental: {
typedPages: true
},
typescript: {
strict: true,
tsConfig: {
compilerOptions: {
moduleResolution: process.env.MODULE_RESOLUTION
}
}
},
buildDir: process.env.NITRO_BUILD_DIR,
builder: process.env.TEST_BUILDER as 'webpack' | 'vite' ?? 'vite',
theme: './extends/bar',
extends: [
'./extends/node_modules/foo'
],
runtimeConfig: {
baseURL: '',
baseAPIToken: '',
privateConfig: 'secret_key',
public: {
ids: [1, 2, 3],
needsFallback: undefined,
testConfig: 123
}
},
appConfig: {
fromNuxtConfig: true,
nested: {
val: 1
}
},
modules: [
'./modules/test',
[
'~/modules/example',
{
typeTest (val) {
// @ts-expect-error module type defines val as boolean
const b: string = val
return !!b
}
}
],
function (_options, nuxt) {
nuxt.hook('pages:extend', (pages) => {
pages.push({
name: 'internal-async-parent',
path: '/internal-async-parent'
})
})
}
],
telemetry: false, // for testing telemetry types - it is auto-disabled in tests
hooks: {
'schema:extend' (schemas) {
schemas.push({
appConfig: {
someThing: {
value: {
$default: 'default',
$schema: {
tsType: 'string | false'
}
}
}
}
})
},
'prepare:types' ({ tsConfig }) {
tsConfig.include = tsConfig.include!.filter(i => i !== '../../../../**/*')
}
}
})
16 changes: 16 additions & 0 deletions test/fixtures/basic-types/package.json
@@ -0,0 +1,16 @@
{
"private": true,
"name": "fixture-basic-types",
"scripts": {
"build": "nuxi build"
},
"dependencies": {
"nuxt": "workspace:*"
},
"devDependencies": {
"ofetch": "latest",
"unplugin": "latest",
"vitest": "latest",
"vue-router": "latest"
}
}