From 4e1e41b7ddd04c721364656999796a72dcd9914f Mon Sep 17 00:00:00 2001 From: Julien Huang Date: Sun, 30 Mar 2025 20:10:41 +0200 Subject: [PATCH 01/10] feat(cli): use youch for loading errors --- packages/nuxi/build.config.ts | 1 + packages/nuxi/package.json | 3 +++ packages/nuxi/src/commands/dev-child.ts | 3 +++ packages/nuxi/src/commands/dev.ts | 24 +++++++++++++++++++++++ packages/nuxi/src/utils/dev.ts | 26 +++++++++++++++++++++---- pnpm-lock.yaml | 4 ++++ 6 files changed, 57 insertions(+), 4 deletions(-) diff --git a/packages/nuxi/build.config.ts b/packages/nuxi/build.config.ts index 031d108cd..574d7da5b 100644 --- a/packages/nuxi/build.config.ts +++ b/packages/nuxi/build.config.ts @@ -38,5 +38,6 @@ export default defineBuildConfig({ 'node:process', 'node:path', 'node:os', + 'youch', ], }) diff --git a/packages/nuxi/package.json b/packages/nuxi/package.json index 34e4b9902..3f694fb90 100644 --- a/packages/nuxi/package.json +++ b/packages/nuxi/package.json @@ -38,6 +38,9 @@ "prepack": "unbuild", "test:dist": "node ./bin/nuxi.mjs info ./playground" }, + "dependencies": { + "youch": "^4.1.0-beta.6" + }, "devDependencies": { "@nuxt/kit": "^3.16.1", "@nuxt/schema": "^3.16.1", diff --git a/packages/nuxi/src/commands/dev-child.ts b/packages/nuxi/src/commands/dev-child.ts index bc9c890c2..9dd753bdd 100644 --- a/packages/nuxi/src/commands/dev-child.ts +++ b/packages/nuxi/src/commands/dev-child.ts @@ -77,6 +77,9 @@ export default defineCommand({ devContext, }) + nuxtDev.on('loading:error', (error) => { + sendIPCMessage({ type: 'nuxt:internal:dev:loading:error', error }) + }) nuxtDev.on('loading', (message) => { sendIPCMessage({ type: 'nuxt:internal:dev:loading', message }) }) diff --git a/packages/nuxi/src/commands/dev.ts b/packages/nuxi/src/commands/dev.ts index 10e340828..24756a852 100644 --- a/packages/nuxi/src/commands/dev.ts +++ b/packages/nuxi/src/commands/dev.ts @@ -17,6 +17,7 @@ import { resolve } from 'pathe' import { satisfies } from 'semver' import { isBun, isTest } from 'std-env' +import { Youch } from 'youch' import { showVersions } from '../utils/banner' import { _getDevServerDefaults, _getDevServerOverrides } from '../utils/dev' import { overrideEnv } from '../utils/env' @@ -123,6 +124,7 @@ type DevProxy = Awaited> async function _createDevProxy(nuxtOptions: NuxtOptions, listenOptions: Partial) { const jiti = createJiti(nuxtOptions.rootDir) let loadingMessage = 'Nuxt dev server is starting...' + let error: Error let loadingTemplate = nuxtOptions.devServer.loadingTemplate for (const url of nuxtOptions.modulesDir) { // @ts-expect-error this is for backwards compatibility @@ -138,6 +140,21 @@ async function _createDevProxy(nuxtOptions: NuxtOptions, listenOptions: Partial< let address: string | undefined const handler = (req: IncomingMessage, res: ServerResponse) => { + if (error) { + const youch = new Youch() + res.statusCode = 500 + res.setHeader('Content-Type', 'text/html') + youch.toHTML(error, { + request: { + url: req.url, + method: req.method, + headers: req.headers, + }, + }).then((html) => { + res.end(html) + }) + return + } if (!address) { res.statusCode = 503 res.setHeader('Content-Type', 'text/html') @@ -169,6 +186,9 @@ async function _createDevProxy(nuxtOptions: NuxtOptions, listenOptions: Partial< setLoadingMessage: (_msg: string) => { loadingMessage = _msg }, + setError: (_error: Error) => { + error = _error + }, } } @@ -227,6 +247,10 @@ async function _startSubprocess(devProxy: DevProxy, rawArgs: string[], listenArg devProxy.setAddress(undefined) devProxy.setLoadingMessage(message.message) } + else if (message.type === 'nuxt:internal:dev:loading:error') { + devProxy.setAddress(undefined) + devProxy.setError(message.error) + } else if (message.type === 'nuxt:internal:dev:restart') { restart() } diff --git a/packages/nuxi/src/utils/dev.ts b/packages/nuxi/src/utils/dev.ts index 7934f4a83..e0179763f 100644 --- a/packages/nuxi/src/utils/dev.ts +++ b/packages/nuxi/src/utils/dev.ts @@ -2,7 +2,7 @@ import type { Nuxt, NuxtConfig } from '@nuxt/schema' import type { FSWatcher } from 'chokidar' import type { Jiti } from 'jiti' import type { HTTPSOptions, Listener, ListenOptions, ListenURL } from 'listhen' -import type { RequestListener, ServerResponse } from 'node:http' +import type { IncomingMessage, RequestListener, ServerResponse } from 'node:http' import type { AddressInfo } from 'node:net' import EventEmitter from 'node:events' @@ -17,6 +17,7 @@ import { join, relative, resolve } from 'pathe' import { debounce } from 'perfect-debounce' import { provider } from 'std-env' import { joinURL } from 'ufo' +import { Youch } from 'youch' import { clearBuildDir } from '../utils/fs' import { loadKit } from '../utils/kit' @@ -28,6 +29,7 @@ export type NuxtDevIPCMessage = | { type: 'nuxt:internal:dev:loading', message: string } | { type: 'nuxt:internal:dev:restart' } | { type: 'nuxt:internal:dev:rejection', message: string } + | { type: 'nuxt:internal:dev:loading:error', error: Error } export interface NuxtDevContext { public?: boolean @@ -97,6 +99,7 @@ class NuxtDevServer extends EventEmitter { private _currentNuxt?: Nuxt private _loadingMessage?: string private _jiti: Jiti + private _loadingError?: Error loadDebounced: (reload?: boolean, reason?: string) => void handler: RequestListener @@ -123,7 +126,7 @@ class NuxtDevServer extends EventEmitter { this._handler(req, res) } else { - this._renderLoadingScreen(res) + this._renderLoadingScreen(req, res) } } @@ -131,7 +134,21 @@ class NuxtDevServer extends EventEmitter { this.listener = undefined } - async _renderLoadingScreen(res: ServerResponse) { + async _renderLoadingScreen(req: IncomingMessage, res: ServerResponse) { + if (this._loadingError) { + const youch = new Youch() + res.statusCode = 500 + res.setHeader('Content-Type', 'text/html') + return res.end( + await youch.toHTML(this._loadingError, { + request: { + url: req.url, + method: req.method, + headers: req.headers, + }, + }), + ) + } res.statusCode = 503 res.setHeader('Content-Type', 'text/html') const loadingTemplate @@ -158,9 +175,10 @@ class NuxtDevServer extends EventEmitter { catch (error) { logger.error(`Cannot ${reload ? 'restart' : 'start'} nuxt: `, error) this._handler = undefined + this._loadingError = error as Error this._loadingMessage = 'Error while loading Nuxt. Please check console and fix errors.' - this.emit('loading', this._loadingMessage) + this.emit('loading:error', error) } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 58bf7d86e..a3b09b4c5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -94,6 +94,10 @@ importers: version: link:../create-nuxt packages/nuxi: + dependencies: + youch: + specifier: ^4.1.0-beta.6 + version: 4.1.0-beta.6 devDependencies: '@nuxt/kit': specifier: ^3.16.1 From cbd89619f26b437554435b6b929c06340cfd7b15 Mon Sep 17 00:00:00 2001 From: Julien Huang Date: Sun, 30 Mar 2025 20:14:41 +0200 Subject: [PATCH 02/10] build(cli): missing external --- packages/nuxt-cli/build.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/nuxt-cli/build.config.ts b/packages/nuxt-cli/build.config.ts index 08da56903..8b2a3f777 100644 --- a/packages/nuxt-cli/build.config.ts +++ b/packages/nuxt-cli/build.config.ts @@ -26,5 +26,6 @@ export default defineBuildConfig({ entries: ['src/index'], externals: [ '@nuxt/test-utils', + 'youch', ], }) From 17d667c701945c60acc75d87fc01b9b699e6516e Mon Sep 17 00:00:00 2001 From: Julien Huang Date: Sun, 30 Mar 2025 20:24:59 +0200 Subject: [PATCH 03/10] chore: missing youch dep --- packages/nuxt-cli/package.json | 3 ++- pnpm-lock.yaml | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/nuxt-cli/package.json b/packages/nuxt-cli/package.json index a99f77ff7..cbda69cf5 100644 --- a/packages/nuxt-cli/package.json +++ b/packages/nuxt-cli/package.json @@ -55,7 +55,8 @@ "semver": "^7.7.1", "std-env": "^3.8.1", "tinyexec": "^1.0.1", - "ufo": "^1.5.4" + "ufo": "^1.5.4", + "youch": "^4.1.0-beta.6" }, "devDependencies": { "@types/node": "^22.13.14", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a3b09b4c5..df9dbd7d5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -279,6 +279,9 @@ importers: ufo: specifier: ^1.5.4 version: 1.5.4 + youch: + specifier: ^4.1.0-beta.6 + version: 4.1.0-beta.6 devDependencies: '@types/node': specifier: ^22.13.14 From 6aadde7727adc93f1e4e9be37aa43d1c8f72d532 Mon Sep 17 00:00:00 2001 From: Julien Huang Date: Sun, 30 Mar 2025 21:24:10 +0200 Subject: [PATCH 04/10] fix: correctly send all fields through IPC --- packages/nuxi/src/commands/dev-child.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/nuxi/src/commands/dev-child.ts b/packages/nuxi/src/commands/dev-child.ts index 9dd753bdd..b6711272b 100644 --- a/packages/nuxi/src/commands/dev-child.ts +++ b/packages/nuxi/src/commands/dev-child.ts @@ -77,8 +77,13 @@ export default defineCommand({ devContext, }) - nuxtDev.on('loading:error', (error) => { - sendIPCMessage({ type: 'nuxt:internal:dev:loading:error', error }) + nuxtDev.on('loading:error', (_error) => { + sendIPCMessage({ type: 'nuxt:internal:dev:loading:error', error: { + message: _error.message, + stack: _error.stack, + name: _error.name, + code: _error.code, + } }) }) nuxtDev.on('loading', (message) => { sendIPCMessage({ type: 'nuxt:internal:dev:loading', message }) From bc29b896eba89ee94b291557995537ca36039044 Mon Sep 17 00:00:00 2001 From: Julien Huang Date: Sun, 30 Mar 2025 23:55:42 +0200 Subject: [PATCH 05/10] move youch to devdeps --- packages/nuxt-cli/package.json | 6 +++--- pnpm-lock.yaml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/nuxt-cli/package.json b/packages/nuxt-cli/package.json index cbda69cf5..116750a13 100644 --- a/packages/nuxt-cli/package.json +++ b/packages/nuxt-cli/package.json @@ -55,8 +55,7 @@ "semver": "^7.7.1", "std-env": "^3.8.1", "tinyexec": "^1.0.1", - "ufo": "^1.5.4", - "youch": "^4.1.0-beta.6" + "ufo": "^1.5.4" }, "devDependencies": { "@types/node": "^22.13.14", @@ -65,6 +64,7 @@ "typescript": "^5.8.2", "unbuild": "^3.5.0", "unplugin-purge-polyfills": "^0.0.7", - "vitest": "^3.0.9" + "vitest": "^3.0.9", + "youch": "^4.1.0-beta.6" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index df9dbd7d5..abf8e4995 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -279,9 +279,6 @@ importers: ufo: specifier: ^1.5.4 version: 1.5.4 - youch: - specifier: ^4.1.0-beta.6 - version: 4.1.0-beta.6 devDependencies: '@types/node': specifier: ^22.13.14 @@ -304,6 +301,9 @@ importers: vitest: specifier: ^3.0.9 version: 3.0.9(@types/debug@4.1.12)(@types/node@22.13.14)(jiti@2.4.2)(terser@5.37.0)(yaml@2.7.0) + youch: + specifier: ^4.1.0-beta.6 + version: 4.1.0-beta.6 packages/nuxt-cli/playground: dependencies: From 3832539938c5e930b77586d64641078c2fd7f1cf Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Mon, 31 Mar 2025 11:34:56 +0100 Subject: [PATCH 06/10] build: update package.json + remove externals config --- packages/nuxi/build.config.ts | 1 - packages/nuxi/package.json | 6 ++---- packages/nuxt-cli/build.config.ts | 1 - packages/nuxt-cli/package.json | 3 ++- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/packages/nuxi/build.config.ts b/packages/nuxi/build.config.ts index 574d7da5b..031d108cd 100644 --- a/packages/nuxi/build.config.ts +++ b/packages/nuxi/build.config.ts @@ -38,6 +38,5 @@ export default defineBuildConfig({ 'node:process', 'node:path', 'node:os', - 'youch', ], }) diff --git a/packages/nuxi/package.json b/packages/nuxi/package.json index 3f694fb90..4b652d323 100644 --- a/packages/nuxi/package.json +++ b/packages/nuxi/package.json @@ -38,9 +38,6 @@ "prepack": "unbuild", "test:dist": "node ./bin/nuxi.mjs info ./playground" }, - "dependencies": { - "youch": "^4.1.0-beta.6" - }, "devDependencies": { "@nuxt/kit": "^3.16.1", "@nuxt/schema": "^3.16.1", @@ -77,6 +74,7 @@ "ufo": "^1.5.4", "unbuild": "^3.5.0", "unplugin-purge-polyfills": "^0.0.7", - "vitest": "^3.0.9" + "vitest": "^3.0.9", + "youch": "^4.1.0-beta.6" } } diff --git a/packages/nuxt-cli/build.config.ts b/packages/nuxt-cli/build.config.ts index 8b2a3f777..08da56903 100644 --- a/packages/nuxt-cli/build.config.ts +++ b/packages/nuxt-cli/build.config.ts @@ -26,6 +26,5 @@ export default defineBuildConfig({ entries: ['src/index'], externals: [ '@nuxt/test-utils', - 'youch', ], }) diff --git a/packages/nuxt-cli/package.json b/packages/nuxt-cli/package.json index 116750a13..77cab9ca1 100644 --- a/packages/nuxt-cli/package.json +++ b/packages/nuxt-cli/package.json @@ -55,7 +55,8 @@ "semver": "^7.7.1", "std-env": "^3.8.1", "tinyexec": "^1.0.1", - "ufo": "^1.5.4" + "ufo": "^1.5.4", + "youch": "^4.1.0-beta.6" }, "devDependencies": { "@types/node": "^22.13.14", From 30ae61632c7c98906fc61b6b91a3ef60be75102f Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Mon, 31 Mar 2025 11:51:58 +0100 Subject: [PATCH 07/10] fix: clear error on restart --- packages/nuxi/src/commands/dev.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/nuxi/src/commands/dev.ts b/packages/nuxi/src/commands/dev.ts index 24756a852..cdf6d3c67 100644 --- a/packages/nuxi/src/commands/dev.ts +++ b/packages/nuxi/src/commands/dev.ts @@ -124,7 +124,7 @@ type DevProxy = Awaited> async function _createDevProxy(nuxtOptions: NuxtOptions, listenOptions: Partial) { const jiti = createJiti(nuxtOptions.rootDir) let loadingMessage = 'Nuxt dev server is starting...' - let error: Error + let error: Error | undefined let loadingTemplate = nuxtOptions.devServer.loadingTemplate for (const url of nuxtOptions.modulesDir) { // @ts-expect-error this is for backwards compatibility @@ -189,6 +189,9 @@ async function _createDevProxy(nuxtOptions: NuxtOptions, listenOptions: Partial< setError: (_error: Error) => { error = _error }, + clearError() { + error = undefined + }, } } @@ -203,6 +206,7 @@ async function _startSubprocess(devProxy: DevProxy, rawArgs: string[], listenArg } const restart = async () => { + devProxy.clearError() // Kill previous process with restart signal (not supported on Windows) if (process.platform === 'win32') { kill('SIGTERM') @@ -246,6 +250,7 @@ async function _startSubprocess(devProxy: DevProxy, rawArgs: string[], listenArg else if (message.type === 'nuxt:internal:dev:loading') { devProxy.setAddress(undefined) devProxy.setLoadingMessage(message.message) + devProxy.clearError() } else if (message.type === 'nuxt:internal:dev:loading:error') { devProxy.setAddress(undefined) From cf6046e3919aba4f1c9cc24b4f8ebca76d6e3e2b Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Mon, 31 Mar 2025 11:52:03 +0100 Subject: [PATCH 08/10] chore: update lockfile --- pnpm-lock.yaml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index abf8e4995..9232f0495 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -94,10 +94,6 @@ importers: version: link:../create-nuxt packages/nuxi: - dependencies: - youch: - specifier: ^4.1.0-beta.6 - version: 4.1.0-beta.6 devDependencies: '@nuxt/kit': specifier: ^3.16.1 @@ -207,6 +203,9 @@ importers: vitest: specifier: ^3.0.9 version: 3.0.9(@types/debug@4.1.12)(@types/node@22.13.14)(jiti@2.4.2)(terser@5.37.0)(yaml@2.7.0) + youch: + specifier: ^4.1.0-beta.6 + version: 4.1.0-beta.6 packages/nuxt-cli: dependencies: @@ -279,6 +278,9 @@ importers: ufo: specifier: ^1.5.4 version: 1.5.4 + youch: + specifier: ^4.1.0-beta.6 + version: 4.1.0-beta.6 devDependencies: '@types/node': specifier: ^22.13.14 @@ -301,9 +303,6 @@ importers: vitest: specifier: ^3.0.9 version: 3.0.9(@types/debug@4.1.12)(@types/node@22.13.14)(jiti@2.4.2)(terser@5.37.0)(yaml@2.7.0) - youch: - specifier: ^4.1.0-beta.6 - version: 4.1.0-beta.6 packages/nuxt-cli/playground: dependencies: From 251d8260963ead621ec7dfdd440d987f7b8dc44d Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Mon, 31 Mar 2025 11:52:38 +0100 Subject: [PATCH 09/10] fix: handle errors in `--no-fork` mode as well --- packages/nuxi/src/commands/dev.ts | 15 +------ packages/nuxi/src/utils/dev.ts | 70 +++++++++++-------------------- packages/nuxi/src/utils/error.ts | 16 +++++++ 3 files changed, 42 insertions(+), 59 deletions(-) create mode 100644 packages/nuxi/src/utils/error.ts diff --git a/packages/nuxi/src/commands/dev.ts b/packages/nuxi/src/commands/dev.ts index cdf6d3c67..11c89b2fe 100644 --- a/packages/nuxi/src/commands/dev.ts +++ b/packages/nuxi/src/commands/dev.ts @@ -17,10 +17,10 @@ import { resolve } from 'pathe' import { satisfies } from 'semver' import { isBun, isTest } from 'std-env' -import { Youch } from 'youch' import { showVersions } from '../utils/banner' import { _getDevServerDefaults, _getDevServerOverrides } from '../utils/dev' import { overrideEnv } from '../utils/env' +import { renderError } from '../utils/error' import { loadKit } from '../utils/kit' import { logger } from '../utils/logger' import { cwdArgs, dotEnvArgs, envNameArgs, legacyRootDirArgs, logLevelArgs } from './_shared' @@ -141,18 +141,7 @@ async function _createDevProxy(nuxtOptions: NuxtOptions, listenOptions: Partial< const handler = (req: IncomingMessage, res: ServerResponse) => { if (error) { - const youch = new Youch() - res.statusCode = 500 - res.setHeader('Content-Type', 'text/html') - youch.toHTML(error, { - request: { - url: req.url, - method: req.method, - headers: req.headers, - }, - }).then((html) => { - res.end(html) - }) + renderError(req, res, error) return } if (!address) { diff --git a/packages/nuxi/src/utils/dev.ts b/packages/nuxi/src/utils/dev.ts index e0179763f..b4e9e4596 100644 --- a/packages/nuxi/src/utils/dev.ts +++ b/packages/nuxi/src/utils/dev.ts @@ -17,12 +17,12 @@ import { join, relative, resolve } from 'pathe' import { debounce } from 'perfect-debounce' import { provider } from 'std-env' import { joinURL } from 'ufo' -import { Youch } from 'youch' import { clearBuildDir } from '../utils/fs' import { loadKit } from '../utils/kit' import { logger } from '../utils/logger' import { loadNuxtManifest, resolveNuxtManifest, writeNuxtManifest } from '../utils/nuxt' +import { renderError } from './error' export type NuxtDevIPCMessage = | { type: 'nuxt:internal:dev:ready', port: number } @@ -55,10 +55,7 @@ interface NuxtDevServerOptions { devContext: NuxtDevContext } -export async function createNuxtDevServer( - options: NuxtDevServerOptions, - listenOptions?: Partial, -) { +export async function createNuxtDevServer(options: NuxtDevServerOptions, listenOptions?: Partial) { // Initialize dev server const devServer = new NuxtDevServer(options) @@ -90,8 +87,7 @@ export async function createNuxtDevServer( } // https://regex101.com/r/7HkR5c/1 -const RESTART_RE - = /^(?:nuxt\.config\.[a-z0-9]+|\.nuxtignore|\.nuxtrc|\.config\/nuxt(?:\.config)?\.[a-z0-9]+)$/ +const RESTART_RE = /^(?:nuxt\.config\.[a-z0-9]+|\.nuxtignore|\.nuxtrc|\.config\/nuxt(?:\.config)?\.[a-z0-9]+)$/ class NuxtDevServer extends EventEmitter { private _handler?: RequestListener @@ -121,6 +117,10 @@ class NuxtDevServer extends EventEmitter { this._jiti = createJiti(options.cwd) this.handler = async (req, res) => { + if (this._loadingError) { + this._renderError(req, res) + return + } await _initPromise if (this._handler) { this._handler(req, res) @@ -134,21 +134,11 @@ class NuxtDevServer extends EventEmitter { this.listener = undefined } + _renderError(req: IncomingMessage, res: ServerResponse) { + renderError(req, res, this._loadingError) + } + async _renderLoadingScreen(req: IncomingMessage, res: ServerResponse) { - if (this._loadingError) { - const youch = new Youch() - res.statusCode = 500 - res.setHeader('Content-Type', 'text/html') - return res.end( - await youch.toHTML(this._loadingError, { - request: { - url: req.url, - method: req.method, - headers: req.headers, - }, - }), - ) - } res.statusCode = 503 res.setHeader('Content-Type', 'text/html') const loadingTemplate @@ -171,13 +161,13 @@ class NuxtDevServer extends EventEmitter { async load(reload?: boolean, reason?: string) { try { await this._load(reload, reason) + this._loadingError = undefined } catch (error) { logger.error(`Cannot ${reload ? 'restart' : 'start'} nuxt: `, error) this._handler = undefined this._loadingError = error as Error - this._loadingMessage - = 'Error while loading Nuxt. Please check console and fix errors.' + this._loadingMessage = 'Error while loading Nuxt. Please check console and fix errors.' this.emit('loading:error', error) } } @@ -288,28 +278,19 @@ class NuxtDevServer extends EventEmitter { ) } - await this._currentNuxt.hooks.callHook( - 'listen', - this.listener.server, - this.listener, - ) + await this._currentNuxt.hooks.callHook('listen', this.listener.server, this.listener) // Sync internal server info to the internals // It is important for vite-node to use the internal URL but public proto const addr = this.listener.address this._currentNuxt.options.devServer.host = addr.address this._currentNuxt.options.devServer.port = addr.port - this._currentNuxt.options.devServer.url = _getAddressURL( - addr, - !!this.listener.https, - ) + this._currentNuxt.options.devServer.url = _getAddressURL(addr, !!this.listener.https) this._currentNuxt.options.devServer.https = this.options.devContext.proxy ?.https as boolean | { key: string, cert: string } if (this.listener.https && !process.env.NODE_TLS_REJECT_UNAUTHORIZED) { - logger.warn( - 'You might need `NODE_TLS_REJECT_UNAUTHORIZED=0` environment variable to make https work.', - ) + logger.warn('You might need `NODE_TLS_REJECT_UNAUTHORIZED=0` environment variable to make https work.') } await Promise.all([ @@ -318,10 +299,10 @@ class NuxtDevServer extends EventEmitter { ]) // Watch dist directory - this._distWatcher = chokidar.watch( - resolve(this._currentNuxt.options.buildDir, 'dist'), - { ignoreInitial: true, depth: 0 }, - ) + this._distWatcher = chokidar.watch(resolve(this._currentNuxt.options.buildDir, 'dist'), { + ignoreInitial: true, + depth: 0, + }) this._distWatcher.on('unlinkDir', () => { this.loadDebounced(true, '.nuxt/dist directory has been removed') }) @@ -331,13 +312,10 @@ class NuxtDevServer extends EventEmitter { } async _watchConfig() { - const configWatcher = chokidar.watch( - [this.options.cwd, join(this.options.cwd, '.config')], - { - ignoreInitial: true, - depth: 0, - }, - ) + const configWatcher = chokidar.watch([this.options.cwd, join(this.options.cwd, '.config')], { + ignoreInitial: true, + depth: 0, + }) configWatcher.on('all', (event, _file) => { if (event === 'all' || event === 'ready' || event === 'error' || event === 'raw') { return diff --git a/packages/nuxi/src/utils/error.ts b/packages/nuxi/src/utils/error.ts new file mode 100644 index 000000000..da5161de9 --- /dev/null +++ b/packages/nuxi/src/utils/error.ts @@ -0,0 +1,16 @@ +import type { IncomingMessage, ServerResponse } from 'node:http' +import { Youch } from 'youch' + +export async function renderError(req: IncomingMessage, res: ServerResponse, error: unknown) { + const youch = new Youch() + res.statusCode = 500 + res.setHeader('Content-Type', 'text/html') + const html = await youch.toHTML(error, { + request: { + url: req.url, + method: req.method, + headers: req.headers, + }, + }) + res.end(html) +} From b8957411ed09d5e9bb14a1e8f4f572c38565675b Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Mon, 31 Mar 2025 11:53:59 +0100 Subject: [PATCH 10/10] chore: update knip config --- knip.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/knip.json b/knip.json index fbcb79d1f..46b548390 100644 --- a/knip.json +++ b/knip.json @@ -35,7 +35,8 @@ "pkg-types", "scule", "semver", - "ufo" + "ufo", + "youch" ] } }