Skip to content

Commit cddc4d0

Browse files
authored
feat!: upgrade to new major nitropack/h3 (#589)
1 parent 81fc9c8 commit cddc4d0

12 files changed

Lines changed: 156 additions & 230 deletions

File tree

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,12 @@
5050
"fs-extra": "^10.1.0",
5151
"get-port-please": "^2.6.1",
5252
"globby": "^13.1.2",
53-
"h3": "^0.7.21",
53+
"h3": "^0.8.5",
5454
"hash-sum": "^2.0.0",
5555
"knitwork": "^0.1.2",
5656
"magic-string": "^0.26.7",
5757
"mlly": "^0.5.16",
58-
"nitropack": "^0.5.4",
58+
"nitropack": "^0.6.0",
5959
"node-fetch": "^3.2.10",
6060
"nuxi": "3.0.0-rc.12",
6161
"ohash": "^0.1.5",

playground/nuxt.config.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { defineEventHandler } from 'h3'
12
import { defineNuxtConfig } from '..'
23

34
// @ts-ignore
@@ -7,10 +8,9 @@ export default defineNuxtConfig({
78
components: true,
89
serverMiddleware: [
910
{
10-
handle (req, _res, next) {
11-
req.spa = req.url.includes('?spa')
12-
next()
13-
}
11+
handle: defineEventHandler((event) => {
12+
event.req.spa = event.req.url.includes('?spa')
13+
})
1414
}
1515
],
1616
modules: [

playground/server/api/hello.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
export default () => 'Hello API'
1+
export default defineEventHandler(() => 'Hello API')

playground/server/api/hey/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export default () => ({
1+
export default defineEventHandler(() => ({
22
foo: 'bar',
33
baz: 'qux'
4-
})
4+
}))

src/nitro.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { addPluginTemplate, resolvePath, tryImportModule, useNuxt } from '@nuxt/
66
import { joinURL, stringifyQuery, withBase, withoutTrailingSlash } from 'ufo'
77
import { resolve, join, dirname, normalize } from 'pathe'
88
import { createNitro, createDevServer, build, writeTypes, prepare, copyPublicAssets, prerender } from 'nitropack'
9-
import { dynamicEventHandler, toEventHandler } from 'h3'
9+
import { dynamicEventHandler } from 'h3'
1010
import type { Nitro, NitroEventHandler, NitroDevEventHandler, NitroConfig } from 'nitropack'
1111
import { Nuxt, NuxtPage } from '@nuxt/schema'
1212
import { defu } from 'defu'
@@ -65,7 +65,6 @@ export async function setupNitroBridge () {
6565
rootDir: resolve(nuxt.options.rootDir),
6666
srcDir: resolve(nuxt.options.srcDir, 'server'),
6767
dev: nuxt.options.dev,
68-
preset: nuxt.options.dev ? 'nitro-dev' : undefined,
6968
buildDir: resolve(nuxt.options.buildDir),
7069
scanDirs: nuxt.options._layers.map(layer => join(layer.config.srcDir, 'server')),
7170
renderer: resolve(distDir, 'runtime/nitro/renderer'),
@@ -251,8 +250,8 @@ export async function setupNitroBridge () {
251250
})
252251

253252
// Setup handlers
254-
const devMidlewareHandler = dynamicEventHandler()
255-
nitro.options.devHandlers.unshift({ handler: devMidlewareHandler })
253+
const devMiddlewareHandler = dynamicEventHandler()
254+
nitro.options.devHandlers.unshift({ handler: devMiddlewareHandler })
256255
const { handlers, devHandlers } = await resolveHandlers(nuxt)
257256
nitro.options.handlers.push(...handlers)
258257
nitro.options.devHandlers.push(...devHandlers)
@@ -359,7 +358,7 @@ export async function setupNitroBridge () {
359358
nuxt.hook('build:compile', ({ compiler }) => {
360359
compiler.outputFileSystem = { ...fsExtra, join } as any
361360
})
362-
nuxt.hook('server:devMiddleware', (m) => { devMidlewareHandler.set(toEventHandler(m)) })
361+
nuxt.hook('server:devHandler', (h) => { devMiddlewareHandler.set(h) })
363362
}
364363

365364
// nuxt generate

src/runtime/composables.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,9 +197,9 @@ export const navigateTo = (to: RawLocation, options: NavigateToOptions = {}): Pr
197197
const router = useRouter()
198198
if (process.server && useNuxtApp().ssrContext) {
199199
// Server-side redirection using h3 res from ssrContext
200-
const res = useNuxtApp().ssrContext?.res
200+
const event = useNuxtApp().ssrContext?.event
201201
const redirectLocation = joinURL(useRuntimeConfig().app.baseURL, router.resolve(to).fullPath || '/')
202-
return sendRedirect(res, redirectLocation)
202+
return sendRedirect(event, redirectLocation)
203203
}
204204
// Client-side redirection using vue-router
205205
return options.replace ? router.replace(to) : router.push(to)

src/runtime/cookie.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Ref, ref, watch } from 'vue'
22
import { parse, serialize, CookieParseOptions, CookieSerializeOptions } from 'cookie-es'
33
import { appendHeader } from 'h3'
4-
import type { CompatibilityEvent } from 'h3'
4+
import type { H3Event } from 'h3'
55
import destr from 'destr'
66
import { useNuxtApp } from './app'
77
import { useRequestEvent } from './ssr'
@@ -64,7 +64,7 @@ function writeClientCookie (name: string, value: any, opts: CookieSerializeOptio
6464
}
6565
}
6666

67-
function writeServerCookie (event: CompatibilityEvent, name: string, value: any, opts: CookieSerializeOptions = {}) {
67+
function writeServerCookie (event: H3Event, name: string, value: any, opts: CookieSerializeOptions = {}) {
6868
if (event) {
6969
// TODO: Try to smart join with existing Set-Cookie headers
7070
appendHeader(event, 'Set-Cookie', serializeCookie(name, value, opts))

src/runtime/nitro/renderer.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { createRenderer } from 'vue-bundle-renderer/runtime'
22
import type { SSRContext } from 'vue-bundle-renderer/runtime'
3-
import { CompatibilityEvent, getQuery } from 'h3'
3+
import { H3Event, getQuery } from 'h3'
44
import devalue from '@nuxt/devalue'
55
import type { RuntimeConfig } from '@nuxt/schema'
66
import type { RenderResponse } from 'nitropack'
@@ -37,9 +37,11 @@ interface NuxtSSRContext extends SSRContext {
3737
url: string
3838
noSSR: boolean
3939
redirected?: boolean
40-
event: CompatibilityEvent
41-
req: CompatibilityEvent['req']
42-
res: CompatibilityEvent['res']
40+
event: H3Event
41+
/** @deprecated use `ssrContext.event` instead */
42+
req: H3Event['req']
43+
/** @deprecated use `ssrContext.event` instead */
44+
res: H3Event['res']
4345
runtimeConfig: RuntimeConfig
4446
error?: any
4547
nuxt?: any

src/runtime/ssr.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* eslint-disable no-redeclare */
2-
import type { CompatibilityEvent } from 'h3'
2+
import type { H3Event } from 'h3'
33
import { NuxtAppCompat, useNuxtApp } from './app'
44

55
export function useRequestHeaders<K extends string = string> (include: K[]): Record<K, string>
@@ -11,6 +11,6 @@ export function useRequestHeaders (include?) {
1111
return Object.fromEntries(include.filter(key => headers[key]).map(key => [key, headers[key]]))
1212
}
1313

14-
export function useRequestEvent (nuxtApp: NuxtAppCompat = useNuxtApp()): CompatibilityEvent {
15-
return nuxtApp.ssrContext?.event as CompatibilityEvent
14+
export function useRequestEvent (nuxtApp: NuxtAppCompat = useNuxtApp()): H3Event {
15+
return nuxtApp.ssrContext?.event as H3Event
1616
}

src/vite/client.ts

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { join, resolve } from 'pathe'
22
import createVuePlugin from '@vitejs/plugin-vue2'
33
import { logger } from '@nuxt/kit'
4-
import { joinURL, withLeadingSlash, withoutLeadingSlash, withTrailingSlash } from 'ufo'
5-
import escapeRE from 'escape-string-regexp'
4+
import { joinURL, withoutLeadingSlash } from 'ufo'
65
import { getPort } from 'get-port-please'
7-
import type { ServerOptions, Connect, InlineConfig } from 'vite'
6+
import type { ServerOptions, InlineConfig } from 'vite'
7+
import { defineEventHandler } from 'h3'
88
import defu from 'defu'
99
import PluginLegacy from './stub-legacy.cjs'
1010
import { mergeConfig, createServer, build } from './stub-vite.cjs'
@@ -24,6 +24,9 @@ export async function buildClient (ctx: ViteBuildContext) {
2424
}
2525

2626
const clientConfig: InlineConfig = await mergeConfig(ctx.config, {
27+
base: ctx.nuxt.options.dev
28+
? joinURL(ctx.nuxt.options.app.baseURL.replace(/^\.\//, '/') || '/', ctx.nuxt.options.app.buildAssetsDir)
29+
: './',
2730
experimental: {
2831
renderBuiltUrl: (filename, { type, hostType }) => {
2932
if (hostType !== 'js' || type === 'asset') {
@@ -104,18 +107,20 @@ export async function buildClient (ctx: ViteBuildContext) {
104107
const viteServer = await createServer(clientConfig)
105108
ctx.clientServer = viteServer
106109
await ctx.nuxt.callHook('vite:serverCreated', viteServer, { isClient: true, isServer: false })
107-
const baseURL = joinURL(ctx.nuxt.options.app.baseURL.replace(/^\./, '') || '/', ctx.nuxt.options.app.buildAssetsDir)
108-
const BASE_RE = new RegExp(`^${escapeRE(withTrailingSlash(withLeadingSlash(baseURL)))}`)
109-
const viteMiddleware: Connect.NextHandleFunction = (req, res, next) => {
110+
const viteMiddleware = defineEventHandler(async (event) => {
110111
// Workaround: vite devmiddleware modifies req.url
111-
const originalURL = req.url
112-
req.url = req.url.replace(BASE_RE, '/')
113-
viteServer.middlewares.handle(req, res, (err: unknown) => {
114-
req.url = originalURL
115-
next(err)
112+
const originalURL = event.req.url
113+
if (!originalURL.startsWith(clientConfig.base!)) {
114+
event.req.url = joinURL('/__url', originalURL)
115+
}
116+
await new Promise((resolve, reject) => {
117+
viteServer.middlewares.handle(event.req, event.res, (err: Error) => {
118+
event.req.url = originalURL
119+
return err ? reject(err) : resolve(null)
120+
})
116121
})
117-
}
118-
await ctx.nuxt.callHook('server:devMiddleware', viteMiddleware)
122+
})
123+
await ctx.nuxt.callHook('server:devHandler', viteMiddleware)
119124

120125
ctx.nuxt.hook('close', async () => {
121126
await viteServer.close()

0 commit comments

Comments
 (0)