Skip to content
This repository has been archived by the owner on Apr 6, 2023. It is now read-only.

refactor(nuxt)!: cleanup schema and split nuxt 2 types #8487

Merged
merged 15 commits into from Oct 27, 2022
1 change: 0 additions & 1 deletion docs/content/3.api/4.advanced/2.kit.md
Expand Up @@ -74,7 +74,6 @@ description: Nuxt Kit provides composable utilities to help interacting with Nux

[source code](https://github.com/nuxt/framework/blob/main/packages/kit/src/nitro.ts)

- ~~`addServerMiddleware(serverMiddleware)`~~
- `addServerHandler (handler)`
- `addDevServerHandler (handler)`
- `useNitro()` (only usable after `ready` hook)
Expand Down
4 changes: 2 additions & 2 deletions packages/kit/src/layout.ts
Expand Up @@ -13,13 +13,13 @@ export function addLayout (this: any, template: NuxtTemplate, name?: string) {

if (isNuxt2(nuxt)) {
// Nuxt 2 adds layouts in options
const layout = nuxt.options.layouts[layoutName]
const layout = (nuxt.options as any).layouts[layoutName]
if (layout) {
return logger.warn(
`Not overriding \`${layoutName}\` (provided by \`${layout}\`) with \`${src || filename}\`.`
)
}
nuxt.options.layouts[layoutName] = `./${filename}`
(nuxt.options as any).layouts[layoutName] = `./${filename}`
if (name === 'error') {
this.addErrorLayout(filename)
}
Expand Down
7 changes: 4 additions & 3 deletions packages/kit/src/loader/config.ts
Expand Up @@ -34,11 +34,12 @@ export async function loadNuxtConfig (opts: LoadNuxtConfigOptions): Promise<Nuxt
}

// Filter layers
nuxtConfig._layers = layers.filter(layer => layer.configFile && !layer.configFile.endsWith('.nuxtrc'))
const _layers = layers.filter(layer => layer.configFile && !layer.configFile.endsWith('.nuxtrc'))
;(nuxtConfig as any)._layers = _layers

// Ensure at least one layer remains (without nuxt.config)
if (!nuxtConfig._layers.length) {
nuxtConfig._layers.push({
if (!_layers.length) {
_layers.push({
cwd,
config: {
rootDir: cwd,
Expand Down
8 changes: 4 additions & 4 deletions packages/kit/src/module/container.ts
Expand Up @@ -3,7 +3,6 @@ import type { Nuxt, ModuleContainer } from '@nuxt/schema'
import { chainFn } from '../internal/task'
import { addTemplate } from '../template'
import { addLayout } from '../layout'
import { addServerMiddleware } from '../nitro'
import { isNuxt2 } from '../compatibility'
import { addPluginTemplate } from '../plugin'
import { useNuxt } from '../context'
Expand Down Expand Up @@ -44,7 +43,8 @@ export function useModuleContainer (nuxt: Nuxt = useNuxt()): ModuleContainer {
requireModule,
addModule: requireModule,

addServerMiddleware,
// TODO
addServerMiddleware: () => { },

addTemplate (template) {
if (typeof template === 'string') {
Expand All @@ -66,7 +66,7 @@ export function useModuleContainer (nuxt: Nuxt = useNuxt()): ModuleContainer {

addErrorLayout (dst) {
const relativeBuildDir = relative(nuxt.options.rootDir, nuxt.options.buildDir)
nuxt.options.ErrorPage = `~/${relativeBuildDir}/${dst}`
;(nuxt as any).options.ErrorPage = `~/${relativeBuildDir}/${dst}`
},

extendBuild (fn) {
Expand All @@ -80,7 +80,7 @@ export function useModuleContainer (nuxt: Nuxt = useNuxt()): ModuleContainer {

extendRoutes (fn) {
if (isNuxt2(nuxt)) {
nuxt.options.router.extendRoutes = chainFn(nuxt.options.router.extendRoutes, fn)
(nuxt.options.router as any).extendRoutes = chainFn((nuxt.options.router as any).extendRoutes, fn)
} else {
nuxt.hook('pages:extend', async (pages, ...args) => {
const maybeRoutes = await fn(pages, ...args)
Expand Down
4 changes: 3 additions & 1 deletion packages/kit/src/module/define.ts
Expand Up @@ -109,12 +109,14 @@ function nuxt2Shims (nuxt: Nuxt) {

// Support virtual templates with getContents() by writing them to .nuxt directory
let virtualTemplates: ResolvedNuxtTemplate[]
// @ts-ignore Nuxt 2 hook
nuxt.hook('builder:prepared', (_builder, buildOptions) => {
virtualTemplates = buildOptions.templates.filter(t => t.getContents)
virtualTemplates = buildOptions.templates.filter((t: any) => t.getContents)
for (const template of virtualTemplates) {
buildOptions.templates.splice(buildOptions.templates.indexOf(template), 1)
}
})
// @ts-ignore Nuxt 2 hook
nuxt.hook('build:templates', async (templates) => {
const context = {
nuxt,
Expand Down
17 changes: 0 additions & 17 deletions packages/kit/src/nitro.ts
@@ -1,14 +1,6 @@
import type { NodeMiddleware } from 'h3'
import type { NitroEventHandler, NitroDevEventHandler, Nitro } from 'nitropack'
import { useNuxt } from './context'

export interface LegacyServerMiddleware {
route?: string,
path?: string,
handle?: NodeMiddleware | string
handler: NodeMiddleware | string
}

/**
* normalize handler object
*
Expand All @@ -22,15 +14,6 @@ function normalizeHandlerMethod (handler: NitroEventHandler) {
}
}

/**
* Adds a new server middleware to the end of the server middleware array.
*
* @deprecated Use addServerHandler instead
*/
export function addServerMiddleware (middleware: LegacyServerMiddleware) {
useNuxt().options.serverMiddleware.push(middleware)
}

/**
* Adds a nitro server handler
*
Expand Down
1 change: 1 addition & 0 deletions packages/kit/src/pages.ts
Expand Up @@ -5,6 +5,7 @@ import { isNuxt2 } from './compatibility'
export function extendPages (cb: NuxtHooks['pages:extend']) {
const nuxt = useNuxt()
if (isNuxt2(nuxt)) {
// @ts-expect-error
nuxt.hook('build:extendRoutes', cb)
} else {
nuxt.hook('pages:extend', cb)
Expand Down
8 changes: 4 additions & 4 deletions packages/nuxi/src/commands/dev.ts
Expand Up @@ -92,10 +92,10 @@ export default defineNuxtCommand({

await currentNuxt.hooks.callHook('listen', listener.server, listener)
const address = listener.server.address() as AddressInfo
currentNuxt.options.server.url = listener.url
currentNuxt.options.server.port = address.port
currentNuxt.options.server.host = address.address
currentNuxt.options.server.https = listener.https
currentNuxt.options.devServer.url = listener.url
currentNuxt.options.devServer.port = address.port
currentNuxt.options.devServer.host = address.address
currentNuxt.options.devServer.https = listener.https

await Promise.all([
writeTypes(currentNuxt).catch(console.error),
Expand Down
3 changes: 2 additions & 1 deletion packages/nuxi/src/utils/prepare.ts
Expand Up @@ -100,7 +100,8 @@ export const writeTypes = async (nuxt: Nuxt) => {

// This is needed for Nuxt 2 which clears the build directory again before building
// https://github.com/nuxt/nuxt.js/blob/dev/packages/builder/src/builder.js#L144
nuxt.hook('builder:prepared', writeFile)
// TODO
// nuxt.hook('builder:prepared', writeFile)

await writeFile()
}
Expand Down
4 changes: 2 additions & 2 deletions packages/nuxt/src/core/builder.ts
Expand Up @@ -30,10 +30,10 @@ export async function build (nuxt: Nuxt) {
})
}

await nuxt.callHook('build:before', { nuxt }, nuxt.options.build)
await nuxt.callHook('build:before')
if (!nuxt.options._prepare) {
await bundle(nuxt)
await nuxt.callHook('build:done', { nuxt })
await nuxt.callHook('build:done')
}

if (!nuxt.options.dev) {
Expand Down
55 changes: 11 additions & 44 deletions packages/nuxt/src/core/nitro.ts
@@ -1,7 +1,7 @@
import { existsSync, promises as fsp } from 'node:fs'
import { resolve, join } from 'pathe'
import { createNitro, createDevServer, build, prepare, copyPublicAssets, writeTypes, scanHandlers, prerender, Nitro } from 'nitropack'
import type { NitroEventHandler, NitroDevEventHandler, NitroConfig } from 'nitropack'
import type { NitroConfig } from 'nitropack'
import type { Nuxt } from '@nuxt/schema'
import { resolvePath } from '@nuxt/kit'
import defu from 'defu'
Expand All @@ -12,9 +12,6 @@ import { distDir } from '../dirs'
import { ImportProtectionPlugin } from './plugins/import-protection'

export async function initNitro (nuxt: Nuxt & { _nitro?: Nitro }) {
// Resolve handlers
const { handlers, devHandlers } = await resolveHandlers(nuxt)

// Resolve config
const _nitroConfig = ((nuxt.options as any).nitro || {}) as NitroConfig
const nitroConfig: NitroConfig = defu(_nitroConfig, <NitroConfig>{
Expand All @@ -33,7 +30,7 @@ export async function initNitro (nuxt: Nuxt & { _nitro?: Nitro }) {
renderer: resolve(distDir, 'core/runtime/nitro/renderer'),
errorHandler: resolve(distDir, 'core/runtime/nitro/error'),
nodeModulesDirs: nuxt.options.modulesDir,
handlers,
handlers: nuxt.options.serverHandlers,
devHandlers: [],
baseURL: nuxt.options.app.baseURL,
virtual: {},
Expand All @@ -58,7 +55,7 @@ export async function initNitro (nuxt: Nuxt & { _nitro?: Nitro }) {
.map(dir => ({ dir }))
],
prerender: {
crawlLinks: nuxt.options._generate ? nuxt.options.generate.crawler : false,
crawlLinks: nuxt.options._generate ?? undefined,
routes: ([] as string[])
.concat(nuxt.options.generate.routes)
.concat(nuxt.options._generate ? [nuxt.options.ssr ? '/' : '/index.html', '/200.html', '/404.html'] : [])
Expand Down Expand Up @@ -155,7 +152,7 @@ export async function initNitro (nuxt: Nuxt & { _nitro?: Nitro }) {
// Setup handlers
const devMiddlewareHandler = dynamicEventHandler()
nitro.options.devHandlers.unshift({ handler: devMiddlewareHandler })
nitro.options.devHandlers.push(...devHandlers)
nitro.options.devHandlers.push(...nuxt.options.devServerHandlers)
nitro.options.handlers.unshift({
route: '/__nuxt_error',
lazy: true,
Expand Down Expand Up @@ -185,61 +182,31 @@ export async function initNitro (nuxt: Nuxt & { _nitro?: Nitro }) {
} else {
const distDir = resolve(nuxt.options.rootDir, 'dist')
if (!existsSync(distDir)) {
await fsp.symlink(nitro.options.output.publicDir, distDir, 'junction').catch(() => {})
await fsp.symlink(nitro.options.output.publicDir, distDir, 'junction').catch(() => { })
}
}
}
})

// nuxt dev
if (nuxt.options.dev) {
nuxt.hook('build:compile', ({ compiler }) => {
compiler.outputFileSystem = { ...fsExtra, join } as any
})
nuxt.hook('webpack:compile', ({ compiler }) => { compiler.outputFileSystem = { ...fsExtra, join } as any })
nuxt.hook('webpack:compiled', () => { nuxt.server.reload() })
nuxt.hook('vite:compiled', () => { nuxt.server.reload() })

nuxt.hook('server:devHandler', (h) => { devMiddlewareHandler.set(h) })
nuxt.server = createDevServer(nitro)
nuxt.hook('build:resources', () => {
nuxt.server.reload()
})

const waitUntilCompile = new Promise<void>(resolve => nitro.hooks.hook('compiled', () => resolve()))
nuxt.hook('build:done', () => waitUntilCompile)
}
}

async function resolveHandlers (nuxt: Nuxt) {
const handlers: NitroEventHandler[] = [...nuxt.options.serverHandlers]
const devHandlers: NitroDevEventHandler[] = [...nuxt.options.devServerHandlers]

// Map legacy serverMiddleware to handlers
for (let m of nuxt.options.serverMiddleware) {
if (typeof m === 'string' || typeof m === 'function' /* legacy middleware */) { m = { handler: m } }
const route = m.path || m.route || '/'
const handler = m.handler || m.handle
if (typeof handler !== 'string' || typeof route !== 'string') {
devHandlers.push({ route, handler })
} else {
delete m.handler
delete m.path
handlers.push({
...m,
route,
middleware: true,
handler: await resolvePath(handler)
})
}
}

return {
handlers,
devHandlers
}
}

declare module 'nitropack' {
interface NitroRouteConfig {
ssr?: boolean
}
interface NitroRouteOptions {
interface NitroRouteRules {
ssr?: boolean
}
}
pi0 marked this conversation as resolved.
Show resolved Hide resolved
6 changes: 3 additions & 3 deletions packages/nuxt/src/core/nuxt.ts
@@ -1,6 +1,6 @@
import { join, normalize, resolve } from 'pathe'
import { createHooks, createDebugger } from 'hookable'
import type { Nuxt, NuxtOptions, NuxtConfig, ModuleContainer, NuxtHooks } from '@nuxt/schema'
import type { Nuxt, NuxtOptions, NuxtConfig, NuxtHooks } from '@nuxt/schema'
import { loadNuxtConfig, LoadNuxtOptions, nuxtCtx, installModule, addComponent, addVitePlugin, addWebpackPlugin, tryResolveModule, addPlugin } from '@nuxt/kit'
// Temporary until finding better placement
/* eslint-disable import/no-restricted-paths */
Expand Down Expand Up @@ -109,7 +109,7 @@ async function initNuxt (nuxt: Nuxt) {
)

// Init user modules
await nuxt.callHook('modules:before', { nuxt } as ModuleContainer)
await nuxt.callHook('modules:before')
const modulesToInstall = [
...nuxt.options.buildModules,
...nuxt.options.modules,
Expand Down Expand Up @@ -201,7 +201,7 @@ async function initNuxt (nuxt: Nuxt) {
}
}

await nuxt.callHook('modules:done', { nuxt } as ModuleContainer)
await nuxt.callHook('modules:done')

// Normalize windows transpile paths added by modules
nuxt.options.build.transpile = nuxt.options.build.transpile.map(t => typeof t === 'string' ? normalize(t) : t)
Expand Down
2 changes: 1 addition & 1 deletion packages/schema/build.config.ts
Expand Up @@ -15,7 +15,7 @@ export default defineBuildConfig({
}
}
},
'src/index'
'src/index',
],
externals: [
// Type imports
Expand Down