Skip to content

Commit

Permalink
feat(nuxt): enable config schema by default (#19172)
Browse files Browse the repository at this point in the history
  • Loading branch information
pi0 committed Mar 4, 2023
1 parent 44d4aba commit 71225e5
Show file tree
Hide file tree
Showing 5 changed files with 27 additions and 26 deletions.
35 changes: 16 additions & 19 deletions packages/nuxt/src/core/schema.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
import { existsSync } from 'node:fs'
import { writeFile, mkdir, rm } from 'node:fs/promises'
import { writeFile, mkdir } from 'node:fs/promises'
import { dirname, resolve } from 'pathe'
import chokidar from 'chokidar'
import { defu } from 'defu'
import { debounce } from 'perfect-debounce'
import { defineNuxtModule, createResolver } from '@nuxt/kit'
import {
resolveSchema as resolveUntypedSchema,
generateMarkdown,
generateTypes
} from 'untyped'
import type { Schema, SchemaDefinition } from 'untyped'
Expand Down Expand Up @@ -39,9 +38,14 @@ export default defineNuxtModule({
})

// Register module types
nuxt.hook('prepare:types', (ctx) => {
nuxt.hook('prepare:types', async (ctx) => {
ctx.references.push({ path: 'nuxt-config-schema' })
ctx.references.push({ path: 'schema/nuxt.schema.d.ts' })
if (nuxt.options._prepare) {
await nuxt.hooks.callHook('schema:beforeWrite', schema)
await writeSchema(schema)
await nuxt.hooks.callHook('schema:written')
}
})

// Resolve schema after all modules initialized
Expand Down Expand Up @@ -122,26 +126,13 @@ export default defineNuxtModule({
}

async function writeSchema (schema: Schema) {
// Avoid writing empty schema
const isEmptySchema = !schema.properties || Object.keys(schema.properties).length === 0
if (isEmptySchema) {
await rm(resolve(nuxt.options.buildDir, 'schema'), { recursive: true }).catch(() => { })
return
}

// Write it to build dir
await mkdir(resolve(nuxt.options.buildDir, 'schema'), { recursive: true })
await writeFile(
resolve(nuxt.options.buildDir, 'schema/nuxt.schema.json'),
JSON.stringify(schema, null, 2),
'utf8'
)
const markdown = '# Nuxt Custom Config Schema' + generateMarkdown(schema)
await writeFile(
resolve(nuxt.options.buildDir, 'schema/nuxt.schema.md'),
markdown,
'utf8'
)
const _types = generateTypes(schema, {
addExport: true,
interfaceName: 'NuxtCustomSchema',
Expand All @@ -152,12 +143,18 @@ export default defineNuxtModule({
`
export type CustomAppConfig = Exclude<NuxtCustomSchema['appConfig'], undefined>
declare module '@nuxt/schema' {
interface NuxtConfig extends NuxtCustomSchema {}
interface NuxtOptions extends NuxtCustomSchema {}
interface CustomAppConfig extends CustomAppConfig {}
}
declare module 'nuxt/schema' {
interface NuxtConfig extends NuxtCustomSchema {}
interface NuxtOptions extends NuxtCustomSchema {}
interface AppConfigInput extends CustomAppConfig {}
interface AppConfig extends CustomAppConfig {}
}`
interface CustomAppConfig extends CustomAppConfig {}
}
`
const typesPath = resolve(
nuxt.options.buildDir,
'schema/nuxt.schema.d.ts'
Expand Down
4 changes: 2 additions & 2 deletions packages/schema/src/config/experimental.ts
Original file line number Diff line number Diff line change
Expand Up @@ -115,10 +115,10 @@ export default defineUntypedSchema({
componentIslands: false,

/**
* Enable experimental config schema support
* Config schema support
*
* @see https://github.com/nuxt/nuxt/issues/15592
*/
configSchema: false
configSchema: true
}
})
7 changes: 5 additions & 2 deletions packages/schema/src/types/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,10 @@ export interface RuntimeConfig extends RuntimeConfigNamespace {
}

// -- App Config --
export interface AppConfigInput extends Record<string, any> {

export interface CustomAppConfig extends Record<string, any> { }

export interface AppConfigInput extends CustomAppConfig {
/** @deprecated reserved */
private?: never
/** @deprecated reserved */
Expand All @@ -153,4 +156,4 @@ export interface NuxtAppConfig {
keepalive: boolean | KeepAliveProps
}

export interface AppConfig { }
export interface AppConfig extends CustomAppConfig { }
4 changes: 2 additions & 2 deletions test/fixtures/basic/nuxt.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ declare module 'nitropack' {
}

export default defineNuxtConfig({
typescript: { strict: true },
app: {
pageTransition: true,
layoutTransition: true,
Expand Down Expand Up @@ -161,8 +162,7 @@ export default defineNuxtConfig({
componentIslands: true,
reactivityTransform: true,
treeshakeClientOnly: true,
payloadExtraction: true,
configSchema: true
payloadExtraction: true
},
appConfig: {
fromNuxtConfig: true,
Expand Down
3 changes: 2 additions & 1 deletion test/fixtures/basic/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -247,8 +247,9 @@ describe('app config', () => {
val: number
},
userConfig: number
[key: string]: any
}
expectTypeOf<AppConfig>().toMatchTypeOf<ExpectedMergedAppConfig>()
expectTypeOf<AppConfig>().toEqualTypeOf<ExpectedMergedAppConfig>()
})
})

Expand Down

0 comments on commit 71225e5

Please sign in to comment.