diff --git a/packages/nitro/package.json b/packages/nitro/package.json index 354269d3dc..8a27bef2e3 100644 --- a/packages/nitro/package.json +++ b/packages/nitro/package.json @@ -83,5 +83,12 @@ "vue": "3.0.11", "vue-bundle-renderer": "^0.2.3", "vue-server-renderer": "^2.6.12" + }, + "devDependencies": { + "@types/debounce": "^1.2.0", + "@types/fs-extra": "^9.0.10", + "@types/http-proxy": "^1.17.5", + "@types/node-fetch": "^2.5.9", + "@types/serve-static": "^1.13.9" } } diff --git a/packages/nitro/src/build.ts b/packages/nitro/src/build.ts index f6ea30f02e..a94bfe4784 100644 --- a/packages/nitro/src/build.ts +++ b/packages/nitro/src/build.ts @@ -81,7 +81,7 @@ async function _build (nitroContext: NitroContext) { function startRollupWatcher (nitroContext: NitroContext) { const watcher = rollupWatch(nitroContext.rollupConfig) - let start + let start: number watcher.on('event', (event) => { switch (event.code) { diff --git a/packages/nitro/src/runtime/types.d.ts b/packages/nitro/src/runtime/types.d.ts index 902e786658..8edd170b81 100644 --- a/packages/nitro/src/runtime/types.d.ts +++ b/packages/nitro/src/runtime/types.d.ts @@ -1,6 +1,11 @@ -declare module NodeJS { - interface Global { - __timing__: any - $config: any +declare global { + namespace NodeJS { + interface Global { + __timing__: any + $config: any + } } } + +// type export required to turn this into a module for TS augmentation purposes +export type A = {} diff --git a/packages/nitro/src/server/dev.ts b/packages/nitro/src/server/dev.ts index 3b7873678d..053102f253 100644 --- a/packages/nitro/src/server/dev.ts +++ b/packages/nitro/src/server/dev.ts @@ -1,21 +1,24 @@ import { Worker } from 'worker_threads' -import { createApp } from 'h3' -import { resolve } from 'upath' + +import chokidar, { FSWatcher } from 'chokidar' +import type { Server } from 'connect' import debounce from 'debounce' -import chokidar from 'chokidar' -import { listen, Listener } from 'listhen' -import serveStatic from 'serve-static' -import servePlaceholder from 'serve-placeholder' -import { createProxy } from 'http-proxy' import { stat } from 'fs-extra' +import { createApp, Middleware } from 'h3' +import { createProxy } from 'http-proxy' +import { listen, Listener, ListenOptions } from 'listhen' +import servePlaceholder from 'serve-placeholder' +import serveStatic from 'serve-static' +import { resolve } from 'upath' import type { NitroContext } from '../context' +import type { ServerMiddleware } from './middleware' export function createDevServer (nitroContext: NitroContext) { // Worker const workerEntry = resolve(nitroContext.output.dir, nitroContext.output.serverDir, 'index.js') - let pendingWorker: Worker + let pendingWorker: Worker | null let activeWorker: Worker - let workerAddress: string + let workerAddress: string | null async function reload () { if (pendingWorker) { await pendingWorker.terminate() @@ -68,7 +71,7 @@ export function createDevServer (nitroContext: NitroContext) { const proxy = createProxy() app.use((req, res) => { if (workerAddress) { - proxy.web(req, res, { target: workerAddress }, (_err) => { + proxy.web(req, res, { target: workerAddress }, (_err: unknown) => { // console.error('[proxy]', err) }) } else { @@ -78,7 +81,7 @@ export function createDevServer (nitroContext: NitroContext) { // Listen let listeners: Listener[] = [] - const _listen = async (port, opts?) => { + const _listen = async (port: ListenOptions['port'], opts?: Partial) => { const listener = await listen(app, { port, ...opts }) listeners.push(listener) return listener @@ -87,7 +90,7 @@ export function createDevServer (nitroContext: NitroContext) { // Watch for dist and reload worker const pattern = '**/*.{js,json}' const events = ['add', 'change'] - let watcher + let watcher: FSWatcher function watch () { if (watcher) { return } const dReload = debounce(() => reload().catch(console.warn), 200, true) @@ -123,17 +126,22 @@ export function createDevServer (nitroContext: NitroContext) { } } -function createDynamicMiddleware () { - let middleware +interface DynamicMiddleware { + set: (input: Middleware | ServerMiddleware[]) => void + middleware: Middleware +} + +function createDynamicMiddleware (): DynamicMiddleware { + let middleware: Middleware return { set: (input) => { if (!Array.isArray(input)) { middleware = input return } - const app = require('connect')() + const app: Server = require('connect')() for (const m of input) { - app.use(m.path || m.route || '/', m.handler || m.handle) + app.use(m.path || m.route || '/', m.handler || m.handle!) } middleware = app }, diff --git a/packages/nitro/src/server/middleware.ts b/packages/nitro/src/server/middleware.ts index 6c81e90cb3..18adec1fc3 100644 --- a/packages/nitro/src/server/middleware.ts +++ b/packages/nitro/src/server/middleware.ts @@ -2,11 +2,22 @@ import { resolve, join, extname } from 'upath' import { joinURL } from 'ufo' import globby from 'globby' import { watch } from 'chokidar' +import type { Middleware } from 'h3' import { tryResolvePath, Nuxt } from '@nuxt/kit' export interface ServerMiddleware { route: string - handle: string + /** + * @deprecated use route + */ + path?: string + + handle?: Middleware + /** + * @deprecated use handle + */ + handler?: Middleware + lazy?: boolean // Default is true promisify?: boolean // Default is true } diff --git a/packages/nitro/src/utils/index.ts b/packages/nitro/src/utils/index.ts index 4f48b57d57..50d9682597 100644 --- a/packages/nitro/src/utils/index.ts +++ b/packages/nitro/src/utils/index.ts @@ -44,7 +44,7 @@ export function tryImport (dir: string, path: string) { } catch (_err) { } } -export async function writeFile (file, contents, log = false) { +export async function writeFile (file: string, contents: string, log = false) { await fse.mkdirp(dirname(file)) await fse.writeFile(file, contents, 'utf-8') if (log) { @@ -52,7 +52,7 @@ export async function writeFile (file, contents, log = false) { } } -export function resolvePath (nitroContext: NitroInput, path: string | ((nitroContext) => string), resolveBase: string = ''): string { +export function resolvePath (nitroContext: NitroInput, path: string | ((nitroContext: NitroInput) => string), resolveBase: string = ''): string { if (typeof path === 'function') { path = path(nitroContext) } diff --git a/packages/nitro/src/utils/tree.ts b/packages/nitro/src/utils/tree.ts index 2f20ad83f3..a70ea8239f 100644 --- a/packages/nitro/src/utils/tree.ts +++ b/packages/nitro/src/utils/tree.ts @@ -6,7 +6,7 @@ import { readFile } from 'fs-extra' import chalk from 'chalk' import stdenv from 'std-env' -export async function printFSTree (dir) { +export async function printFSTree (dir: string) { if (stdenv.test) { return } diff --git a/yarn.lock b/yarn.lock index ba7e87c684..bc82782458 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1772,7 +1772,7 @@ __metadata: languageName: unknown linkType: soft -"@nuxt/nitro@^0.2.0, @nuxt/nitro@workspace:packages/nitro": +"@nuxt/nitro@^0.2.1, @nuxt/nitro@workspace:packages/nitro": version: 0.0.0-use.local resolution: "@nuxt/nitro@workspace:packages/nitro" dependencies: @@ -1788,6 +1788,11 @@ __metadata: "@rollup/plugin-replace": ^2.4.2 "@rollup/plugin-virtual": ^2.0.3 "@rollup/pluginutils": ^4.1.0 + "@types/debounce": ^1.2.0 + "@types/fs-extra": ^9.0.10 + "@types/http-proxy": ^1.17.5 + "@types/node-fetch": ^2.5.9 + "@types/serve-static": ^1.13.9 "@vercel/nft": ^0.9.6 "@vue/server-renderer": ^3.0.11 archiver: ^5.3.0 @@ -2278,6 +2283,13 @@ __metadata: languageName: node linkType: hard +"@types/debounce@npm:^1.2.0": + version: 1.2.0 + resolution: "@types/debounce@npm:1.2.0" + checksum: c45dbc5fa369b9d29616f994a83ca6833a82ebdabbb455a92fed3c292d0f15482e6ba76c8fed7ea3c947df398fd89754880e38d6a247323dac467241f7ae5be0 + languageName: node + linkType: hard + "@types/eslint-scope@npm:^3.7.0": version: 3.7.0 resolution: "@types/eslint-scope@npm:3.7.0" @@ -2312,6 +2324,15 @@ __metadata: languageName: node linkType: hard +"@types/fs-extra@npm:^9.0.10": + version: 9.0.10 + resolution: "@types/fs-extra@npm:9.0.10" + dependencies: + "@types/node": "*" + checksum: 047a134510d86e1d5041a89d591a328392d62567b8d67d40f238fb3029dc08971f163798077ed0679870a6842381f05d50d14f75ae6b05b736cb18ece0eb7f4f + languageName: node + linkType: hard + "@types/graceful-fs@npm:^4.1.2": version: 4.1.5 resolution: "@types/graceful-fs@npm:4.1.5" @@ -2321,6 +2342,15 @@ __metadata: languageName: node linkType: hard +"@types/http-proxy@npm:^1.17.5": + version: 1.17.5 + resolution: "@types/http-proxy@npm:1.17.5" + dependencies: + "@types/node": "*" + checksum: 21aefcc88273cb99474a7682209c795ee0dad15cc277b027ea504e65faab5cbb799b067662f7ae7c0255651bf9433a41811930c76f7561757f02f2c8262ee592 + languageName: node + linkType: hard + "@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": version: 2.0.3 resolution: "@types/istanbul-lib-coverage@npm:2.0.3" @@ -2370,6 +2400,13 @@ __metadata: languageName: node linkType: hard +"@types/mime@npm:^1": + version: 1.3.2 + resolution: "@types/mime@npm:1.3.2" + checksum: c354bc135628c2f4ab64801ca3867c3acbd4050611579c4c9f5bdfecfb70db71bb8540bf8611b4319f5ef44139c5f7c5af81254369add5ed59e7e02ce929b96f + languageName: node + linkType: hard + "@types/mime@npm:^2.0.2": version: 2.0.3 resolution: "@types/mime@npm:2.0.3" @@ -2391,6 +2428,16 @@ __metadata: languageName: node linkType: hard +"@types/node-fetch@npm:^2.5.9": + version: 2.5.9 + resolution: "@types/node-fetch@npm:2.5.9" + dependencies: + "@types/node": "*" + form-data: ^3.0.0 + checksum: 0c25139d135382dfe6c63bcbfc059d29350a3d950a258d4611f13180e207926d68b07bd3d1937e6eb4a98213a6da1aa285cc94167b9cf67e41d4634d3d2f5b3b + languageName: node + linkType: hard + "@types/node@npm:*": version: 14.14.35 resolution: "@types/node@npm:14.14.35" @@ -2442,6 +2489,16 @@ __metadata: languageName: node linkType: hard +"@types/serve-static@npm:^1.13.9": + version: 1.13.9 + resolution: "@types/serve-static@npm:1.13.9" + dependencies: + "@types/mime": ^1 + "@types/node": "*" + checksum: f261127514057b5c038d76259128d7b765dd92bfeaf769d05b8ddf5f254d066ce6142a935e2fc707bb3009d6544a979591852f0d135d0ed4d0c56db08738df6b + languageName: node + linkType: hard + "@types/source-list-map@npm:*": version: 0.1.2 resolution: "@types/source-list-map@npm:0.1.2" @@ -4489,7 +4546,7 @@ __metadata: languageName: node linkType: hard -"combined-stream@npm:^1.0.6, combined-stream@npm:~1.0.6": +"combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8, combined-stream@npm:~1.0.6": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" dependencies: @@ -6648,6 +6705,17 @@ __metadata: languageName: node linkType: hard +"form-data@npm:^3.0.0": + version: 3.0.1 + resolution: "form-data@npm:3.0.1" + dependencies: + asynckit: ^0.4.0 + combined-stream: ^1.0.8 + mime-types: ^2.1.12 + checksum: 6574ff4d2d845c47ba288151a6e0573767eefdee9da358be199e0f0b66aa5c454e7d62ed5e0daef6f84167ba1e9596e064f36f206488e460ef449ef7b653cdfc + languageName: node + linkType: hard + "form-data@npm:~2.3.2": version: 2.3.3 resolution: "form-data@npm:2.3.3" @@ -10368,7 +10436,7 @@ __metadata: dependencies: "@nuxt/app": ^0.2.0 "@nuxt/kit": ^0.2.0 - "@nuxt/nitro": ^0.2.0 + "@nuxt/nitro": ^0.2.1 "@nuxt/vite-builder": ^0.1.1 "@nuxt/webpack-builder": ^0.1.1 chokidar: ^3.5.1