From 302611e1eb7ca2a193f8d643390334eb05bbde1e Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Thu, 11 Dec 2025 17:21:30 +0100 Subject: [PATCH 1/6] feat: use subpath imports for mocked virtuals --- package.json | 5 ++-- src/build/plugins/resolve.ts | 7 ++--- src/build/virtual/database.ts | 2 +- src/build/virtual/error-handler.ts | 2 +- src/build/virtual/feature-flags.ts | 2 +- src/build/virtual/plugins.ts | 2 +- src/build/virtual/public-assets.ts | 22 ++++++++-------- src/build/virtual/renderer-template.ts | 2 +- src/build/virtual/routing-meta.ts | 2 +- src/build/virtual/routing.ts | 4 +-- src/build/virtual/runtime-config.ts | 2 +- src/build/virtual/server-assets.ts | 2 +- src/build/virtual/storage.ts | 4 +-- src/build/virtual/tasks.ts | 2 +- src/build/virtual/types/feature-flags.d.ts | 7 ----- src/build/virtual/types/plugins.d.ts | 3 --- src/build/virtual/types/public-assets.d.ts | 5 ---- .../virtual/types/renderer-template.d.ts | 7 ----- src/build/virtual/types/routing-meta.d.ts | 8 ------ src/build/virtual/types/routing.d.ts | 26 ------------------- src/build/virtual/types/runtime-config.d.ts | 3 --- src/build/virtual/types/server-assets.d.ts | 3 --- src/build/virtual/types/storage.d.ts | 3 --- src/presets/_nitro/runtime/nitro-dev.ts | 8 +++--- src/presets/_nitro/runtime/service-worker.ts | 2 +- src/presets/bun/runtime/bun.ts | 8 +++--- src/presets/cloudflare/entry-exports.ts | 2 +- .../cloudflare/runtime/_module-handler.ts | 2 +- .../cloudflare/runtime/cloudflare-durable.ts | 6 ++--- .../cloudflare/runtime/cloudflare-module.ts | 6 ++--- .../cloudflare/runtime/cloudflare-pages.ts | 8 +++--- src/presets/deno/runtime/deno-deploy.ts | 4 +-- src/presets/deno/runtime/deno-server.ts | 8 +++--- src/presets/netlify/runtime/netlify-edge.ts | 2 +- src/presets/node/runtime/node-cluster.ts | 8 +++--- src/presets/node/runtime/node-middleware.ts | 6 ++--- src/presets/node/runtime/node-server.ts | 8 +++--- src/runtime/internal/app.ts | 12 +++++---- src/runtime/internal/database.ts | 2 +- src/runtime/internal/routes/dev-tasks.ts | 2 +- src/runtime/internal/routes/openapi.ts | 2 +- .../internal/routes/renderer-template.dev.ts | 2 +- .../internal/routes/renderer-template.ts | 2 +- src/runtime/internal/runtime-config.ts | 2 +- src/runtime/internal/static.ts | 2 +- src/runtime/internal/storage.ts | 2 +- src/runtime/internal/task.ts | 2 +- .../internal/virtual/database.ts} | 4 +-- .../internal/virtual/error-handler.ts} | 4 ++- src/runtime/internal/virtual/feature-flags.ts | 7 +++++ src/runtime/internal/virtual/plugins.d.ts | 3 +++ .../internal/virtual}/polyfills.ts | 0 src/runtime/internal/virtual/public-assets.ts | 15 +++++++++++ .../internal/virtual/renderer-template.ts | 7 +++++ src/runtime/internal/virtual/routing-meta.ts | 7 +++++ src/runtime/internal/virtual/routing.ts | 26 +++++++++++++++++++ .../internal/virtual/runtime-config.ts | 6 +++++ src/runtime/internal/virtual/server-assets.ts | 13 ++++++++++ src/runtime/internal/virtual/storage.ts | 5 ++++ .../internal/virtual/tasks.ts} | 0 src/runtime/internal/vite/dev-entry.mjs | 4 +-- src/runtime/internal/vite/ssr-renderer.mjs | 2 +- tsconfig.json | 2 +- 63 files changed, 182 insertions(+), 156 deletions(-) delete mode 100644 src/build/virtual/types/feature-flags.d.ts delete mode 100644 src/build/virtual/types/plugins.d.ts delete mode 100644 src/build/virtual/types/public-assets.d.ts delete mode 100644 src/build/virtual/types/renderer-template.d.ts delete mode 100644 src/build/virtual/types/routing-meta.d.ts delete mode 100644 src/build/virtual/types/routing.d.ts delete mode 100644 src/build/virtual/types/runtime-config.d.ts delete mode 100644 src/build/virtual/types/server-assets.d.ts delete mode 100644 src/build/virtual/types/storage.d.ts rename src/{build/virtual/types/database.d.ts => runtime/internal/virtual/database.ts} (73%) rename src/{build/virtual/types/error-handler.d.ts => runtime/internal/virtual/error-handler.ts} (74%) create mode 100644 src/runtime/internal/virtual/feature-flags.ts create mode 100644 src/runtime/internal/virtual/plugins.d.ts rename src/{build/virtual/types => runtime/internal/virtual}/polyfills.ts (100%) create mode 100644 src/runtime/internal/virtual/public-assets.ts create mode 100644 src/runtime/internal/virtual/renderer-template.ts create mode 100644 src/runtime/internal/virtual/routing-meta.ts create mode 100644 src/runtime/internal/virtual/routing.ts create mode 100644 src/runtime/internal/virtual/runtime-config.ts create mode 100644 src/runtime/internal/virtual/server-assets.ts create mode 100644 src/runtime/internal/virtual/storage.ts rename src/{build/virtual/types/tasks.d.ts => runtime/internal/virtual/tasks.ts} (100%) diff --git a/package.json b/package.json index 93205b5566..d4359515ef 100644 --- a/package.json +++ b/package.json @@ -27,8 +27,9 @@ "./vite": "./dist/vite.mjs" }, "imports": { - "#runtime/*": "./dist/runtime/internal/*.mjs", - "#vite-runtime": "./dist/runtime/vite-runtime.mjs" + "#nitro/runtime/*": "./dist/runtime/internal/*.mjs", + "#nitro/vite/runtime": "./dist/runtime/vite-runtime.mjs", + "#nitro/virtual/*": "./dist/builder/virtual/*.mjs" }, "types": "./lib/index.d.mts", "bin": { diff --git a/src/build/plugins/resolve.ts b/src/build/plugins/resolve.ts index 12133183ec..dc95524efc 100644 --- a/src/build/plugins/resolve.ts +++ b/src/build/plugins/resolve.ts @@ -14,11 +14,8 @@ export function nitroResolveIds(): Plugin { order: "pre", handler(id, importer, rOpts) { // Resolve ids with a virtual template parent - if ( - importer && - importer.startsWith("\0nitro:virtual:#nitro-internal-virtual") - ) { - return this.resolve(id, runtimeDir, { skipSelf: true }); + if (importer?.includes("#nitro/virtual")) { + return this.resolve(id, runtimeDir, { ...rOpts }); } // Resolve mapped subpaths const mappedId = subpathMap[id as keyof typeof subpathMap]; diff --git a/src/build/virtual/database.ts b/src/build/virtual/database.ts index 391e2efc40..671eb636ce 100644 --- a/src/build/virtual/database.ts +++ b/src/build/virtual/database.ts @@ -4,7 +4,7 @@ import { camelCase } from "scule"; export default function database(nitro: Nitro) { return { - id: "#nitro-internal-virtual/database", + id: "#nitro/virtual/database", template: () => { if (!nitro.options.experimental.database) { return /* js */ `export const connectionConfigs = {};`; diff --git a/src/build/virtual/error-handler.ts b/src/build/virtual/error-handler.ts index 25f8e4c8df..02edc1e63b 100644 --- a/src/build/virtual/error-handler.ts +++ b/src/build/virtual/error-handler.ts @@ -4,7 +4,7 @@ import { join } from "pathe"; export default function errorHandler(nitro: Nitro) { return { - id: "#nitro-internal-virtual/error-handler", + id: "#nitro/virtual/error-handler", template: () => { const errorHandlers = Array.isArray(nitro.options.errorHandler) ? nitro.options.errorHandler diff --git a/src/build/virtual/feature-flags.ts b/src/build/virtual/feature-flags.ts index 51f60ac9a4..b603a92996 100644 --- a/src/build/virtual/feature-flags.ts +++ b/src/build/virtual/feature-flags.ts @@ -2,7 +2,7 @@ import type { Nitro } from "nitro/types"; export default function featureFlags(nitro: Nitro) { return { - id: "#nitro-internal-virtual/feature-flags", + id: "#nitro/virtual/feature-flags", template: () => { const featureFlags: Record = { // Routing diff --git a/src/build/virtual/plugins.ts b/src/build/virtual/plugins.ts index 6d8186ddd2..0465b00dec 100644 --- a/src/build/virtual/plugins.ts +++ b/src/build/virtual/plugins.ts @@ -3,7 +3,7 @@ import { hash } from "ohash"; export default function plugins(nitro: Nitro) { return { - id: "#nitro-internal-virtual/plugins", + id: "#nitro/virtual/plugins", template: () => { const nitroPlugins = [...new Set(nitro.options.plugins)]; diff --git a/src/build/virtual/public-assets.ts b/src/build/virtual/public-assets.ts index b15b9e24bc..1d30782f60 100644 --- a/src/build/virtual/public-assets.ts +++ b/src/build/virtual/public-assets.ts @@ -22,7 +22,7 @@ export default function publicAssets(nitro: Nitro) { return [ // public-assets-data { - id: "#nitro-internal-virtual/public-assets-data", + id: "#nitro/virtual/public-assets-data", template: async () => { const assets: Record = {}; const files = await glob("**", { @@ -73,7 +73,7 @@ export default function publicAssets(nitro: Nitro) { // public-assets { - id: "#nitro-internal-virtual/public-assets", + id: "#nitro/virtual/public-assets", template: () => { const publicAssetBases = Object.fromEntries( nitro.options.publicAssets @@ -90,10 +90,10 @@ export default function publicAssets(nitro: Nitro) { type _serveStaticAsKey = Exclude | "true" | "false"; // prettier-ignore const handlerName = readAssetHandler[nitro.options.serveStatic as _serveStaticAsKey] || "null"; - const readAssetImport = `#nitro-internal-virtual/public-assets-${handlerName}`; + const readAssetImport = `#nitro/virtual/public-assets-${handlerName}`; return /* js */ ` -import assets from '#nitro-internal-virtual/public-assets-data' +import assets from '#nitro/virtual/public-assets-data' export { readAsset } from "${readAssetImport}" export const publicAssetBases = ${JSON.stringify(publicAssetBases)} @@ -125,13 +125,13 @@ export function getAsset (id) { // public-assets-node { - id: "#nitro-internal-virtual/public-assets-node", + id: "#nitro/virtual/public-assets-node", template: () => { return /* js */ ` import { promises as fsp } from 'node:fs' import { fileURLToPath } from 'node:url' import { resolve, dirname } from 'node:path' -import assets from '#nitro-internal-virtual/public-assets-data' +import assets from '#nitro/virtual/public-assets-data' export function readAsset (id) { const serverDir = dirname(fileURLToPath(globalThis.__nitro_main__)) return fsp.readFile(resolve(serverDir, assets[id].path)) @@ -141,10 +141,10 @@ export function readAsset (id) { // public-assets-deno { - id: "#nitro-internal-virtual/public-assets-deno", + id: "#nitro/virtual/public-assets-deno", template: () => { return /* js */ ` -import assets from '#nitro-internal-virtual/public-assets-data' +import assets from '#nitro/virtual/public-assets-data' export function readAsset (id) { // https://deno.com/deploy/docs/serve-static-assets const path = '.' + decodeURIComponent(new URL(\`../public\${id}\`, 'file://').pathname) @@ -155,7 +155,7 @@ export function readAsset (id) { // public-assets-null { - id: "#nitro-internal-virtual/public-assets-null", + id: "#nitro/virtual/public-assets-null", template: () => { return /* js */ ` export function readAsset (id) { @@ -166,10 +166,10 @@ export function readAsset (id) { // public-assets-inline { - id: "#nitro-internal-virtual/public-assets-inline", + id: "#nitro/virtual/public-assets-inline", template: () => { return /* js */ ` - import assets from '#nitro-internal-virtual/public-assets-data' + import assets from '#nitro/virtual/public-assets-data' export function readAsset (id) { if (!assets[id]) { return undefined } if (assets[id]._data) { return assets[id]._data } diff --git a/src/build/virtual/renderer-template.ts b/src/build/virtual/renderer-template.ts index fa1228e99d..ab15297b94 100644 --- a/src/build/virtual/renderer-template.ts +++ b/src/build/virtual/renderer-template.ts @@ -8,7 +8,7 @@ import { export default function rendererTemplate(nitro: Nitro) { return { - id: "#nitro-internal-virtual/renderer-template", + id: "#nitro/virtual/renderer-template", template: async () => { const template = nitro.options.renderer?.template; if (typeof template !== "string") { diff --git a/src/build/virtual/routing-meta.ts b/src/build/virtual/routing-meta.ts index 5bd88779ee..e865955700 100644 --- a/src/build/virtual/routing-meta.ts +++ b/src/build/virtual/routing-meta.ts @@ -2,7 +2,7 @@ import type { Nitro } from "nitro/types"; export default function routingMeta(nitro: Nitro) { return { - id: "#nitro-internal-virtual/routing-meta", + id: "#nitro/virtual/routing-meta", template: () => { const routeHandlers = uniqueBy( Object.values(nitro.routing.routes.routes).flatMap((h) => h.data), diff --git a/src/build/virtual/routing.ts b/src/build/virtual/routing.ts index 4275106a6d..3d3b171f66 100644 --- a/src/build/virtual/routing.ts +++ b/src/build/virtual/routing.ts @@ -9,7 +9,7 @@ export const RuntimeRouteRules = [ export default function routing(nitro: Nitro) { return { - id: "#nitro-internal-virtual/routing", + id: "#nitro/virtual/routing", template: () => { const allHandlers = uniqueBy( [ @@ -23,7 +23,7 @@ export default function routing(nitro: Nitro) { ); return /* js */ ` -import * as __routeRules__ from "#runtime/route-rules"; +import * as __routeRules__ from "#nitro/runtime/route-rules"; import * as srvxNode from "srvx/node" import * as h3 from "h3"; diff --git a/src/build/virtual/runtime-config.ts b/src/build/virtual/runtime-config.ts index d2f3da76a7..c667c9c669 100644 --- a/src/build/virtual/runtime-config.ts +++ b/src/build/virtual/runtime-config.ts @@ -2,7 +2,7 @@ import type { Nitro } from "nitro/types"; export default function runtimeConfig(nitro: Nitro) { return { - id: "#nitro-internal-virtual/runtime-config", + id: "#nitro/virtual/runtime-config", template: () => { return /* js */ `export const runtimeConfig = ${JSON.stringify( nitro.options.runtimeConfig || {} diff --git a/src/build/virtual/server-assets.ts b/src/build/virtual/server-assets.ts index e6a96f527d..ad5fb1d087 100644 --- a/src/build/virtual/server-assets.ts +++ b/src/build/virtual/server-assets.ts @@ -17,7 +17,7 @@ interface ResolvedAsset { export default function serverAssets(nitro: Nitro) { return { - id: "#nitro-internal-virtual/server-assets", + id: "#nitro/virtual/server-assets", template: async () => { if (nitro.options.dev || nitro.options.preset === "nitro-prerender") { return /* js */ ` diff --git a/src/build/virtual/storage.ts b/src/build/virtual/storage.ts index 059e59c061..37377d651a 100644 --- a/src/build/virtual/storage.ts +++ b/src/build/virtual/storage.ts @@ -4,7 +4,7 @@ import { builtinDrivers } from "unstorage"; export default function storage(nitro: Nitro) { return { - id: "#nitro-internal-virtual/storage", + id: "#nitro/virtual/storage", template: () => { const mounts: { path: string; driver: string; opts: object }[] = []; @@ -29,7 +29,7 @@ export default function storage(nitro: Nitro) { return /* js */ ` import { createStorage } from 'unstorage' -import { assets } from '#nitro-internal-virtual/server-assets' +import { assets } from '#nitro/virtual/server-assets' ${driverImports.map((i) => genImport(i, genSafeVariableName(i))).join("\n")} diff --git a/src/build/virtual/tasks.ts b/src/build/virtual/tasks.ts index 83906c8fc3..2560f7574f 100644 --- a/src/build/virtual/tasks.ts +++ b/src/build/virtual/tasks.ts @@ -3,7 +3,7 @@ import { normalize } from "pathe"; export default function tasks(nitro: Nitro) { return { - id: "#nitro-internal-virtual/tasks", + id: "#nitro/virtual/tasks", template: () => { const _scheduledTasks = Object.entries(nitro.options.scheduledTasks || {}) .map(([cron, _tasks]) => { diff --git a/src/build/virtual/types/feature-flags.d.ts b/src/build/virtual/types/feature-flags.d.ts deleted file mode 100644 index cf394dbb50..0000000000 --- a/src/build/virtual/types/feature-flags.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const hasRoutes: boolean; -export const hasRouteRules: boolean; -export const hasGlobalMiddleware: boolean; -export const hasRoutedMiddleware: boolean; -export const hasPlugins: boolean; -export const hasHooks: boolean; -export const hasWebSocket: boolean; diff --git a/src/build/virtual/types/plugins.d.ts b/src/build/virtual/types/plugins.d.ts deleted file mode 100644 index 8cf685b76b..0000000000 --- a/src/build/virtual/types/plugins.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { NitroAppPlugin } from "../plugin.ts"; - -export const plugins: NitroAppPlugin[] = []; diff --git a/src/build/virtual/types/public-assets.d.ts b/src/build/virtual/types/public-assets.d.ts deleted file mode 100644 index 9f07b0dfa7..0000000000 --- a/src/build/virtual/types/public-assets.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const publicAssetBases: string[]; -export const isPublicAssetURL: (id: string) => boolean; -export const getPublicAssetMeta: (id: string) => { maxAge?: number }; -export const readAsset: (id: string) => Promise; -export const getAsset: (id: string) => PublicAsset; diff --git a/src/build/virtual/types/renderer-template.d.ts b/src/build/virtual/types/renderer-template.d.ts deleted file mode 100644 index acc6202fb9..0000000000 --- a/src/build/virtual/types/renderer-template.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -export declare function rendererTemplate( - request: Request -): string | Promise; - -// dev only -export declare const rendererTemplateFile: string | undefined; -export declare const isStaticTemplate: boolean | undefined; diff --git a/src/build/virtual/types/routing-meta.d.ts b/src/build/virtual/types/routing-meta.d.ts deleted file mode 100644 index 873622fe22..0000000000 --- a/src/build/virtual/types/routing-meta.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { OperationObject } from "../openapi-ts.ts"; -import { NitroRouteMeta } from "nitro/types"; - -export const handlersMeta: { - route?: string; - method?: string; - meta?: NitroRouteMeta; -}[]; diff --git a/src/build/virtual/types/routing.d.ts b/src/build/virtual/types/routing.d.ts deleted file mode 100644 index 2ee80d48c3..0000000000 --- a/src/build/virtual/types/routing.d.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { - H3EventHandler, - Middleware, - H3Route, - LazyEventHandler, - RouterMethod, -} from "h3"; -import type { MatchedRoute } from "rou3"; -import type { MatchedRouteRule } from "../route-rules.ts"; - -export function findRoute( - method: string, - path: string -): MatchedRoute | undefined; - -export function findRouteRules( - method: string, - path: string -): MatchedRoute[]; - -export const globalMiddleware: Middleware[]; - -export function findRoutedMiddleware( - method: string, - path: string -): MatchedRoute[]; diff --git a/src/build/virtual/types/runtime-config.d.ts b/src/build/virtual/types/runtime-config.d.ts deleted file mode 100644 index 8ab86fc756..0000000000 --- a/src/build/virtual/types/runtime-config.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { NitroRuntimeConfig } from "../config.ts"; - -export const runtimeConfig: NitroRuntimeConfig; diff --git a/src/build/virtual/types/server-assets.d.ts b/src/build/virtual/types/server-assets.d.ts deleted file mode 100644 index b710273313..0000000000 --- a/src/build/virtual/types/server-assets.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function readAsset(id: string): Promise; -export function statAsset(id: string): Promise; -export function getKeys(): Promise; diff --git a/src/build/virtual/types/storage.d.ts b/src/build/virtual/types/storage.d.ts deleted file mode 100644 index 67814fc38b..0000000000 --- a/src/build/virtual/types/storage.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { Storage } from "unstorage"; - -export declare const initStorage: () => Storage; diff --git a/src/presets/_nitro/runtime/nitro-dev.ts b/src/presets/_nitro/runtime/nitro-dev.ts index dacb215454..3b213fd957 100644 --- a/src/presets/_nitro/runtime/nitro-dev.ts +++ b/src/presets/_nitro/runtime/nitro-dev.ts @@ -6,10 +6,10 @@ import { toNodeHandler } from "srvx/node"; import { getSocketAddress, isSocketSupported } from "get-port-please"; import { useNitroApp, useNitroHooks } from "nitro/app"; -import { startScheduleRunner } from "#runtime/task"; -import { trapUnhandledErrors } from "#runtime/error/hooks"; -import { resolveWebsocketHooks } from "#runtime/app"; -import { hasWebSocket } from "#nitro-internal-virtual/feature-flags"; +import { startScheduleRunner } from "#nitro/runtime/task"; +import { trapUnhandledErrors } from "#nitro/runtime/error/hooks"; +import { resolveWebsocketHooks } from "#nitro/runtime/app"; +import { hasWebSocket } from "#nitro/virtual/feature-flags"; // Listen for shutdown signal from runner parentPort?.on("message", (msg) => { diff --git a/src/presets/_nitro/runtime/service-worker.ts b/src/presets/_nitro/runtime/service-worker.ts index ad6d872642..af577ba651 100644 --- a/src/presets/_nitro/runtime/service-worker.ts +++ b/src/presets/_nitro/runtime/service-worker.ts @@ -1,6 +1,6 @@ import "#nitro-internal-polyfills"; import { useNitroApp } from "nitro/app"; -import { isPublicAssetURL } from "#nitro-internal-virtual/public-assets"; +import { isPublicAssetURL } from "#nitro/virtual/public-assets"; import type { ServerRequest } from "srvx"; const nitroApp = useNitroApp(); diff --git a/src/presets/bun/runtime/bun.ts b/src/presets/bun/runtime/bun.ts index d3627a0a7c..900b8490d7 100644 --- a/src/presets/bun/runtime/bun.ts +++ b/src/presets/bun/runtime/bun.ts @@ -4,10 +4,10 @@ import { serve } from "srvx/bun"; import wsAdapter from "crossws/adapters/bun"; import { useNitroApp } from "nitro/app"; -import { startScheduleRunner } from "#runtime/task"; -import { trapUnhandledErrors } from "#runtime/error/hooks"; -import { resolveWebsocketHooks } from "#runtime/app"; -import { hasWebSocket } from "#nitro-internal-virtual/feature-flags"; +import { startScheduleRunner } from "#nitro/runtime/task"; +import { trapUnhandledErrors } from "#nitro/runtime/error/hooks"; +import { resolveWebsocketHooks } from "#nitro/runtime/app"; +import { hasWebSocket } from "#nitro/virtual/feature-flags"; const port = Number.parseInt(process.env.NITRO_PORT || process.env.PORT || "") || 3000; diff --git a/src/presets/cloudflare/entry-exports.ts b/src/presets/cloudflare/entry-exports.ts index 1f90eb34c4..78f1579339 100644 --- a/src/presets/cloudflare/entry-exports.ts +++ b/src/presets/cloudflare/entry-exports.ts @@ -11,7 +11,7 @@ export async function setupEntryExports(nitro: Nitro) { const originalEntry = nitro.options.entry; const virtualEntryId = (nitro.options.entry = - "#nitro-internal-virtual/cloudflare-server-entry"); + "#nitro/virtual/cloudflare-server-entry"); nitro.options.virtual[virtualEntryId] = /* ts */ ` export * from "${exportsEntry}"; export * from "${originalEntry}"; diff --git a/src/presets/cloudflare/runtime/_module-handler.ts b/src/presets/cloudflare/runtime/_module-handler.ts index 1dca522c32..bedc9597ee 100644 --- a/src/presets/cloudflare/runtime/_module-handler.ts +++ b/src/presets/cloudflare/runtime/_module-handler.ts @@ -3,7 +3,7 @@ import type * as CF from "@cloudflare/workers-types"; import type { ExportedHandler } from "@cloudflare/workers-types"; import type { ServerRequest } from "srvx"; -import { runCronTasks } from "#runtime/task"; +import { runCronTasks } from "#nitro/runtime/task"; import { useNitroApp, useNitroHooks } from "nitro/app"; type MaybePromise = T | Promise; diff --git a/src/presets/cloudflare/runtime/cloudflare-durable.ts b/src/presets/cloudflare/runtime/cloudflare-durable.ts index 68b50708b7..627b23e08e 100644 --- a/src/presets/cloudflare/runtime/cloudflare-durable.ts +++ b/src/presets/cloudflare/runtime/cloudflare-durable.ts @@ -5,9 +5,9 @@ import wsAdapter from "crossws/adapters/cloudflare"; import { createHandler, fetchHandler } from "./_module-handler.ts"; import { useNitroApp, useNitroHooks } from "nitro/app"; -import { isPublicAssetURL } from "#nitro-internal-virtual/public-assets"; -import { resolveWebsocketHooks } from "#runtime/app"; -import { hasWebSocket } from "#nitro-internal-virtual/feature-flags"; +import { isPublicAssetURL } from "#nitro/virtual/public-assets"; +import { resolveWebsocketHooks } from "#nitro/runtime/app"; +import { hasWebSocket } from "#nitro/virtual/feature-flags"; const DURABLE_BINDING = "$DurableObject"; const DURABLE_INSTANCE = "server"; diff --git a/src/presets/cloudflare/runtime/cloudflare-module.ts b/src/presets/cloudflare/runtime/cloudflare-module.ts index 2955f0b4dc..d1d14ea732 100644 --- a/src/presets/cloudflare/runtime/cloudflare-module.ts +++ b/src/presets/cloudflare/runtime/cloudflare-module.ts @@ -2,10 +2,10 @@ import "#nitro-internal-polyfills"; import type { fetch } from "@cloudflare/workers-types"; import wsAdapter from "crossws/adapters/cloudflare"; -import { isPublicAssetURL } from "#nitro-internal-virtual/public-assets"; +import { isPublicAssetURL } from "#nitro/virtual/public-assets"; import { createHandler } from "./_module-handler.ts"; -import { resolveWebsocketHooks } from "#runtime/app"; -import { hasWebSocket } from "#nitro-internal-virtual/feature-flags"; +import { resolveWebsocketHooks } from "#nitro/runtime/app"; +import { hasWebSocket } from "#nitro/virtual/feature-flags"; const ws = hasWebSocket ? wsAdapter({ resolve: resolveWebsocketHooks }) diff --git a/src/presets/cloudflare/runtime/cloudflare-pages.ts b/src/presets/cloudflare/runtime/cloudflare-pages.ts index 3a2feb175f..4e500546d5 100644 --- a/src/presets/cloudflare/runtime/cloudflare-pages.ts +++ b/src/presets/cloudflare/runtime/cloudflare-pages.ts @@ -8,10 +8,10 @@ import type { import wsAdapter from "crossws/adapters/cloudflare"; import { useNitroApp } from "nitro/app"; -import { isPublicAssetURL } from "#nitro-internal-virtual/public-assets"; -import { runCronTasks } from "#runtime/task"; -import { resolveWebsocketHooks } from "#runtime/app"; -import { hasWebSocket } from "#nitro-internal-virtual/feature-flags"; +import { isPublicAssetURL } from "#nitro/virtual/public-assets"; +import { runCronTasks } from "#nitro/runtime/task"; +import { resolveWebsocketHooks } from "#nitro/runtime/app"; +import { hasWebSocket } from "#nitro/virtual/feature-flags"; /** * Reference: https://developers.cloudflare.com/workers/runtime-apis/fetch-event/#parameters diff --git a/src/presets/deno/runtime/deno-deploy.ts b/src/presets/deno/runtime/deno-deploy.ts index f6e2c58aba..a39764d0fb 100644 --- a/src/presets/deno/runtime/deno-deploy.ts +++ b/src/presets/deno/runtime/deno-deploy.ts @@ -4,8 +4,8 @@ import type { Deno as _Deno } from "@deno/types"; import wsAdapter from "crossws/adapters/deno"; import { useNitroApp } from "nitro/app"; -import { resolveWebsocketHooks } from "#runtime/app"; -import { hasWebSocket } from "#nitro-internal-virtual/feature-flags"; +import { resolveWebsocketHooks } from "#nitro/runtime/app"; +import { hasWebSocket } from "#nitro/virtual/feature-flags"; declare global { var Deno: typeof _Deno; diff --git a/src/presets/deno/runtime/deno-server.ts b/src/presets/deno/runtime/deno-server.ts index 5e0f8d8968..f73d921658 100644 --- a/src/presets/deno/runtime/deno-server.ts +++ b/src/presets/deno/runtime/deno-server.ts @@ -4,10 +4,10 @@ import { serve } from "srvx/deno"; import wsAdapter from "crossws/adapters/deno"; import { useNitroApp } from "nitro/app"; -import { startScheduleRunner } from "#runtime/task"; -import { trapUnhandledErrors } from "#runtime/error/hooks"; -import { resolveWebsocketHooks } from "#runtime/app"; -import { hasWebSocket } from "#nitro-internal-virtual/feature-flags"; +import { startScheduleRunner } from "#nitro/runtime/task"; +import { trapUnhandledErrors } from "#nitro/runtime/error/hooks"; +import { resolveWebsocketHooks } from "#nitro/runtime/app"; +import { hasWebSocket } from "#nitro/virtual/feature-flags"; const port = Number.parseInt(process.env.NITRO_PORT || process.env.PORT || "") || 3000; diff --git a/src/presets/netlify/runtime/netlify-edge.ts b/src/presets/netlify/runtime/netlify-edge.ts index f1efd45604..f5155cddfb 100644 --- a/src/presets/netlify/runtime/netlify-edge.ts +++ b/src/presets/netlify/runtime/netlify-edge.ts @@ -1,6 +1,6 @@ import "#nitro-internal-polyfills"; import { useNitroApp } from "nitro/app"; -import { isPublicAssetURL } from "#nitro-internal-virtual/public-assets"; +import { isPublicAssetURL } from "#nitro/virtual/public-assets"; import type { Context } from "@netlify/edge-functions"; import type { ServerRequest } from "srvx"; diff --git a/src/presets/node/runtime/node-cluster.ts b/src/presets/node/runtime/node-cluster.ts index 9c3ffc8334..de2eb00f66 100644 --- a/src/presets/node/runtime/node-cluster.ts +++ b/src/presets/node/runtime/node-cluster.ts @@ -4,10 +4,10 @@ import { NodeRequest, serve } from "srvx/node"; import wsAdapter from "crossws/adapters/node"; import { useNitroApp } from "nitro/app"; -import { startScheduleRunner } from "#runtime/task"; -import { trapUnhandledErrors } from "#runtime/error/hooks"; -import { resolveWebsocketHooks } from "#runtime/app"; -import { hasWebSocket } from "#nitro-internal-virtual/feature-flags"; +import { startScheduleRunner } from "#nitro/runtime/task"; +import { trapUnhandledErrors } from "#nitro/runtime/error/hooks"; +import { resolveWebsocketHooks } from "#nitro/runtime/app"; +import { hasWebSocket } from "#nitro/virtual/feature-flags"; const port = Number.parseInt(process.env.NITRO_PORT || process.env.PORT || "") || 3000; diff --git a/src/presets/node/runtime/node-middleware.ts b/src/presets/node/runtime/node-middleware.ts index 0af507abf9..50dd3b4708 100644 --- a/src/presets/node/runtime/node-middleware.ts +++ b/src/presets/node/runtime/node-middleware.ts @@ -3,9 +3,9 @@ import { toNodeHandler } from "srvx/node"; import wsAdapter from "crossws/adapters/node"; import { useNitroApp } from "nitro/app"; -import { startScheduleRunner } from "#runtime/task"; -import { resolveWebsocketHooks } from "#runtime/app"; -import { hasWebSocket } from "#nitro-internal-virtual/feature-flags"; +import { startScheduleRunner } from "#nitro/runtime/task"; +import { resolveWebsocketHooks } from "#nitro/runtime/app"; +import { hasWebSocket } from "#nitro/virtual/feature-flags"; const nitroApp = useNitroApp(); diff --git a/src/presets/node/runtime/node-server.ts b/src/presets/node/runtime/node-server.ts index f517a7a66f..b32c57280c 100644 --- a/src/presets/node/runtime/node-server.ts +++ b/src/presets/node/runtime/node-server.ts @@ -3,10 +3,10 @@ import { NodeRequest, serve } from "srvx/node"; import wsAdapter from "crossws/adapters/node"; import { useNitroApp } from "nitro/app"; -import { startScheduleRunner } from "#runtime/task"; -import { trapUnhandledErrors } from "#runtime/error/hooks"; -import { resolveWebsocketHooks } from "#runtime/app"; -import { hasWebSocket } from "#nitro-internal-virtual/feature-flags"; +import { startScheduleRunner } from "#nitro/runtime/task"; +import { trapUnhandledErrors } from "#nitro/runtime/error/hooks"; +import { resolveWebsocketHooks } from "#nitro/runtime/app"; +import { hasWebSocket } from "#nitro/virtual/feature-flags"; const port = Number.parseInt(process.env.NITRO_PORT || process.env.PORT || "") || 3000; diff --git a/src/runtime/internal/app.ts b/src/runtime/internal/app.ts index ba4128633f..f29d78b7da 100644 --- a/src/runtime/internal/app.ts +++ b/src/runtime/internal/app.ts @@ -12,14 +12,14 @@ import { HookableCore } from "hookable"; import { nitroAsyncContext } from "./context.ts"; // IMPORTANT: virtual imports and user code should be imported last to avoid initialization order issues -import errorHandler from "#nitro-internal-virtual/error-handler"; -import { plugins } from "#nitro-internal-virtual/plugins"; +import errorHandler from "#nitro/virtual/error-handler"; +import { plugins } from "#nitro/virtual/plugins"; import { findRoute, findRouteRules, globalMiddleware, findRoutedMiddleware, -} from "#nitro-internal-virtual/routing"; +} from "#nitro/virtual/routing"; import { hasRouteRules, hasRoutedMiddleware, @@ -27,7 +27,7 @@ import { hasRoutes, hasHooks, hasPlugins, -} from "#nitro-internal-virtual/feature-flags"; +} from "#nitro/virtual/feature-flags"; declare global { var __nitro__: NitroApp | undefined; @@ -87,7 +87,9 @@ function initNitroApp(): NitroApp { if (hasPlugins) { for (const plugin of plugins) { try { - plugin(nitroApp); + plugin( + nitroApp as NitroApp & { hooks: NonNullable } + ); } catch (error: any) { nitroApp.captureError?.(error, { tags: ["plugin"] }); throw error; diff --git a/src/runtime/internal/database.ts b/src/runtime/internal/database.ts index 7d713a1afe..632e252fa3 100644 --- a/src/runtime/internal/database.ts +++ b/src/runtime/internal/database.ts @@ -1,6 +1,6 @@ import type { Database } from "db0"; import { createDatabase } from "db0"; -import { connectionConfigs } from "#nitro-internal-virtual/database"; +import { connectionConfigs } from "#nitro/virtual/database"; const instances: Record = Object.create(null); diff --git a/src/runtime/internal/routes/dev-tasks.ts b/src/runtime/internal/routes/dev-tasks.ts index c1a6c96c5a..ccf81ff660 100644 --- a/src/runtime/internal/routes/dev-tasks.ts +++ b/src/runtime/internal/routes/dev-tasks.ts @@ -1,7 +1,7 @@ import { H3 } from "h3"; import { runTask } from "../task.ts"; -import { scheduledTasks, tasks } from "#nitro-internal-virtual/tasks"; +import { scheduledTasks, tasks } from "#nitro/virtual/tasks"; export default new H3() .get("/_nitro/tasks", async () => { diff --git a/src/runtime/internal/routes/openapi.ts b/src/runtime/internal/routes/openapi.ts index 1b4a2017c5..a12edac806 100644 --- a/src/runtime/internal/routes/openapi.ts +++ b/src/runtime/internal/routes/openapi.ts @@ -10,7 +10,7 @@ import type { } from "../../../types/openapi-ts.ts"; import { joinURL } from "ufo"; import { defu } from "defu"; -import { handlersMeta } from "#nitro-internal-virtual/routing-meta"; +import { handlersMeta } from "#nitro/virtual/routing-meta"; import { useRuntimeConfig } from "../runtime-config.ts"; // Served as /_openapi.json diff --git a/src/runtime/internal/routes/renderer-template.dev.ts b/src/runtime/internal/routes/renderer-template.dev.ts index 9272883708..0b31a8f998 100644 --- a/src/runtime/internal/routes/renderer-template.dev.ts +++ b/src/runtime/internal/routes/renderer-template.dev.ts @@ -4,7 +4,7 @@ import { rendererTemplate, rendererTemplateFile, isStaticTemplate, -} from "#nitro-internal-virtual/renderer-template"; +} from "#nitro/virtual/renderer-template"; import { HTTPResponse } from "h3"; import { hasTemplateSyntax, renderToResponse, compileTemplate } from "rendu"; diff --git a/src/runtime/internal/routes/renderer-template.ts b/src/runtime/internal/routes/renderer-template.ts index 00263fda09..1a9e1269cf 100644 --- a/src/runtime/internal/routes/renderer-template.ts +++ b/src/runtime/internal/routes/renderer-template.ts @@ -1,5 +1,5 @@ import type { H3Event } from "h3"; -import { rendererTemplate } from "#nitro-internal-virtual/renderer-template"; +import { rendererTemplate } from "#nitro/virtual/renderer-template"; export default function renderIndexHTML(event: H3Event) { return rendererTemplate(event.req as Request); diff --git a/src/runtime/internal/runtime-config.ts b/src/runtime/internal/runtime-config.ts index 88070e9779..704a695d33 100644 --- a/src/runtime/internal/runtime-config.ts +++ b/src/runtime/internal/runtime-config.ts @@ -1,6 +1,6 @@ import type { NitroRuntimeConfig } from "nitro/types"; import { applyEnv } from "./runtime-config.utils.ts"; -import { runtimeConfig } from "#nitro-internal-virtual/runtime-config"; +import { runtimeConfig } from "#nitro/virtual/runtime-config"; export function useRuntimeConfig(): NitroRuntimeConfig { return ((useRuntimeConfig as any)._cached ||= getRuntimeConfig()); diff --git a/src/runtime/internal/static.ts b/src/runtime/internal/static.ts index b6d80fb0ab..bde55405a3 100644 --- a/src/runtime/internal/static.ts +++ b/src/runtime/internal/static.ts @@ -11,7 +11,7 @@ import { getAsset, isPublicAssetURL, readAsset, -} from "#nitro-internal-virtual/public-assets"; +} from "#nitro/virtual/public-assets"; const METHODS = new Set(["HEAD", "GET"] as HTTPMethod[]); diff --git a/src/runtime/internal/storage.ts b/src/runtime/internal/storage.ts index ea13c2c6c4..b57138f5dd 100644 --- a/src/runtime/internal/storage.ts +++ b/src/runtime/internal/storage.ts @@ -1,6 +1,6 @@ import type { Storage, StorageValue } from "unstorage"; import { prefixStorage } from "unstorage"; -import { initStorage } from "#nitro-internal-virtual/storage"; +import { initStorage } from "#nitro/virtual/storage"; export function useStorage( base = "" diff --git a/src/runtime/internal/task.ts b/src/runtime/internal/task.ts index 0ed1a97b5b..843437999c 100644 --- a/src/runtime/internal/task.ts +++ b/src/runtime/internal/task.ts @@ -7,7 +7,7 @@ import type { TaskPayload, TaskResult, } from "nitro/types"; -import { scheduledTasks, tasks } from "#nitro-internal-virtual/tasks"; +import { scheduledTasks, tasks } from "#nitro/virtual/tasks"; /** @experimental */ export function defineTask(def: Task): Task { diff --git a/src/build/virtual/types/database.d.ts b/src/runtime/internal/virtual/database.ts similarity index 73% rename from src/build/virtual/types/database.d.ts rename to src/runtime/internal/virtual/database.ts index f191e3b335..98ceb87c44 100644 --- a/src/build/virtual/types/database.d.ts +++ b/src/runtime/internal/virtual/database.ts @@ -1,8 +1,8 @@ import type { Connector } from "db0"; -export declare const connectionConfigs: { +export const connectionConfigs: { [name: string]: { connector: (options: any) => Connector; options: any; }; -}; +} = {}; diff --git a/src/build/virtual/types/error-handler.d.ts b/src/runtime/internal/virtual/error-handler.ts similarity index 74% rename from src/build/virtual/types/error-handler.d.ts rename to src/runtime/internal/virtual/error-handler.ts index 0319d26328..8fc797bfdb 100644 --- a/src/build/virtual/types/error-handler.d.ts +++ b/src/runtime/internal/virtual/error-handler.ts @@ -3,6 +3,8 @@ import type { NitroErrorHandler } from "nitro/types"; type EParams = Parameters; type EReturn = ReturnType; -const errorHandler: (error: EParams[0], event: EParams[1]) => EReturn; +const errorHandler: (error: EParams[0], event: EParams[1]) => EReturn = () => { + return new Response("Internal Server Error", { status: 500 }); +}; export default errorHandler; diff --git a/src/runtime/internal/virtual/feature-flags.ts b/src/runtime/internal/virtual/feature-flags.ts new file mode 100644 index 0000000000..1abb99b95d --- /dev/null +++ b/src/runtime/internal/virtual/feature-flags.ts @@ -0,0 +1,7 @@ +export const hasRoutes: boolean = true; +export const hasRouteRules: boolean = true; +export const hasGlobalMiddleware: boolean = true; +export const hasRoutedMiddleware: boolean = true; +export const hasPlugins: boolean = true; +export const hasHooks: boolean = true; +export const hasWebSocket: boolean = true; diff --git a/src/runtime/internal/virtual/plugins.d.ts b/src/runtime/internal/virtual/plugins.d.ts new file mode 100644 index 0000000000..1402249e73 --- /dev/null +++ b/src/runtime/internal/virtual/plugins.d.ts @@ -0,0 +1,3 @@ +import type { NitroAppPlugin } from "nitro/types"; + +export const plugins: NitroAppPlugin[] = []; diff --git a/src/build/virtual/types/polyfills.ts b/src/runtime/internal/virtual/polyfills.ts similarity index 100% rename from src/build/virtual/types/polyfills.ts rename to src/runtime/internal/virtual/polyfills.ts diff --git a/src/runtime/internal/virtual/public-assets.ts b/src/runtime/internal/virtual/public-assets.ts new file mode 100644 index 0000000000..703c7ba6e4 --- /dev/null +++ b/src/runtime/internal/virtual/public-assets.ts @@ -0,0 +1,15 @@ +import type { PublicAsset } from "nitro/types"; + +export const publicAssetBases: string[] = []; + +export const isPublicAssetURL: (id: string) => boolean = () => false; + +export const getPublicAssetMeta: ( + id: string +) => { maxAge?: number } | null = () => null; + +export const readAsset: (id: string) => Promise = async () => { + throw new Error("Asset not found"); +}; + +export const getAsset: (id: string) => PublicAsset | null = () => null; diff --git a/src/runtime/internal/virtual/renderer-template.ts b/src/runtime/internal/virtual/renderer-template.ts new file mode 100644 index 0000000000..8cb0406b10 --- /dev/null +++ b/src/runtime/internal/virtual/renderer-template.ts @@ -0,0 +1,7 @@ +export function rendererTemplate(_req: Request): string | Promise { + return ``; +} + +// dev only +export const rendererTemplateFile: string | undefined = undefined; +export const isStaticTemplate: boolean | undefined = undefined; diff --git a/src/runtime/internal/virtual/routing-meta.ts b/src/runtime/internal/virtual/routing-meta.ts new file mode 100644 index 0000000000..cc9bee327e --- /dev/null +++ b/src/runtime/internal/virtual/routing-meta.ts @@ -0,0 +1,7 @@ +import type { NitroRouteMeta } from "nitro/types"; + +export const handlersMeta: { + route?: string; + method?: string; + meta?: NitroRouteMeta; +}[] = []; diff --git a/src/runtime/internal/virtual/routing.ts b/src/runtime/internal/virtual/routing.ts new file mode 100644 index 0000000000..63bed820dc --- /dev/null +++ b/src/runtime/internal/virtual/routing.ts @@ -0,0 +1,26 @@ +import type { Middleware, H3Route } from "h3"; +import type { MatchedRoute } from "rou3"; +import type { MatchedRouteRule } from "nitro/types"; + +export function findRoute( + _method: string, + _path: string +): MatchedRoute | undefined { + return undefined; +} + +export function findRouteRules( + _method: string, + _path: string +): MatchedRoute[] { + return []; +} + +export const globalMiddleware: Middleware[] = []; + +export function findRoutedMiddleware( + _method: string, + _path: string +): MatchedRoute[] { + return []; +} diff --git a/src/runtime/internal/virtual/runtime-config.ts b/src/runtime/internal/virtual/runtime-config.ts new file mode 100644 index 0000000000..334fce7458 --- /dev/null +++ b/src/runtime/internal/virtual/runtime-config.ts @@ -0,0 +1,6 @@ +import type { NitroRuntimeConfig } from "nitro/types"; + +export const runtimeConfig: NitroRuntimeConfig = { + app: {}, + nitro: {}, +}; diff --git a/src/runtime/internal/virtual/server-assets.ts b/src/runtime/internal/virtual/server-assets.ts new file mode 100644 index 0000000000..65b77fa478 --- /dev/null +++ b/src/runtime/internal/virtual/server-assets.ts @@ -0,0 +1,13 @@ +import type { AssetMeta } from "nitro/types"; + +export function readAsset(_id: string): Promise { + return Promise.resolve({} as T); +} + +export function statAsset(_id: string): Promise { + return Promise.resolve({}); +} + +export function getKeys(): Promise { + return Promise.resolve([]); +} diff --git a/src/runtime/internal/virtual/storage.ts b/src/runtime/internal/virtual/storage.ts new file mode 100644 index 0000000000..d9940b1bf5 --- /dev/null +++ b/src/runtime/internal/virtual/storage.ts @@ -0,0 +1,5 @@ +import type { Storage } from "unstorage"; + +export function initStorage(): Storage { + throw new Error("Storage is only available in a Nitro runtime."); +} diff --git a/src/build/virtual/types/tasks.d.ts b/src/runtime/internal/virtual/tasks.ts similarity index 100% rename from src/build/virtual/types/tasks.d.ts rename to src/runtime/internal/virtual/tasks.ts diff --git a/src/runtime/internal/vite/dev-entry.mjs b/src/runtime/internal/vite/dev-entry.mjs index d68c4374dc..10b96d1854 100644 --- a/src/runtime/internal/vite/dev-entry.mjs +++ b/src/runtime/internal/vite/dev-entry.mjs @@ -2,8 +2,8 @@ import "#nitro-internal-polyfills"; import wsAdapter from "crossws/adapters/node"; import { useNitroApp } from "nitro/app"; -import { resolveWebsocketHooks } from "#runtime/app"; -import { hasWebSocket } from "#nitro-internal-virtual/feature-flags"; +import { resolveWebsocketHooks } from "#nitro/runtime/app"; +import { hasWebSocket } from "#nitro/virtual/feature-flags"; const nitroApp = useNitroApp(); diff --git a/src/runtime/internal/vite/ssr-renderer.mjs b/src/runtime/internal/vite/ssr-renderer.mjs index 5e6c1f3c88..34aa0706a5 100644 --- a/src/runtime/internal/vite/ssr-renderer.mjs +++ b/src/runtime/internal/vite/ssr-renderer.mjs @@ -1,4 +1,4 @@ -import { fetchViteEnv } from "#vite-runtime"; +import { fetchViteEnv } from "#nitro/vite/runtime"; /** @param {{ req: Request }} HTTPEvent */ export default function ssrRenderer({ req }) { diff --git a/tsconfig.json b/tsconfig.json index 268fe04c9d..739d87480a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,7 +11,7 @@ "lib": ["es2022", "webworker", "dom.iterable"], "types": ["node", "@cloudflare/workers-types"], "paths": { - "#nitro-internal-virtual/*": ["./src/build/virtual/types/*.ts"] + "#nitro/virtual/*": ["./src/runtime/internal/virtual/*.ts"] } }, "exclude": [ From 4d91de9e52b7e4b3668692c0ea6c86efdefe30b6 Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Thu, 11 Dec 2025 17:43:48 +0100 Subject: [PATCH 2/6] update --- package.json | 6 +- src/runtime/internal/runtime-config.ts | 64 +++++++++++++++++++- src/runtime/internal/runtime-config.utils.ts | 61 ------------------- src/runtime/internal/vite/ssr-renderer.mjs | 2 +- src/runtime/virtual/database.ts | 8 +++ src/runtime/virtual/error-handler.ts | 17 ++++++ src/runtime/virtual/feature-flags.ts | 7 +++ src/runtime/virtual/plugins.ts | 3 + src/runtime/virtual/polyfills.ts | 1 + src/runtime/virtual/public-assets.ts | 15 +++++ src/runtime/virtual/renderer-template.ts | 7 +++ src/runtime/virtual/routing-meta.ts | 7 +++ src/runtime/virtual/routing.ts | 26 ++++++++ src/runtime/virtual/runtime-config.ts | 6 ++ src/runtime/virtual/server-assets.ts | 13 ++++ src/runtime/virtual/storage.ts | 5 ++ src/runtime/virtual/tasks.ts | 8 +++ src/runtime/{vite-runtime.ts => vite.ts} | 0 test/unit/runtime-config.env.test.ts | 2 +- test/unit/virtual.test.ts | 11 ++++ tsconfig.json | 2 +- 21 files changed, 203 insertions(+), 68 deletions(-) delete mode 100644 src/runtime/internal/runtime-config.utils.ts create mode 100644 src/runtime/virtual/database.ts create mode 100644 src/runtime/virtual/error-handler.ts create mode 100644 src/runtime/virtual/feature-flags.ts create mode 100644 src/runtime/virtual/plugins.ts create mode 100644 src/runtime/virtual/polyfills.ts create mode 100644 src/runtime/virtual/public-assets.ts create mode 100644 src/runtime/virtual/renderer-template.ts create mode 100644 src/runtime/virtual/routing-meta.ts create mode 100644 src/runtime/virtual/routing.ts create mode 100644 src/runtime/virtual/runtime-config.ts create mode 100644 src/runtime/virtual/server-assets.ts create mode 100644 src/runtime/virtual/storage.ts create mode 100644 src/runtime/virtual/tasks.ts rename src/runtime/{vite-runtime.ts => vite.ts} (100%) create mode 100644 test/unit/virtual.test.ts diff --git a/package.json b/package.json index d4359515ef..f9581259a0 100644 --- a/package.json +++ b/package.json @@ -24,12 +24,12 @@ "./task": "./dist/runtime/task.mjs", "./tsconfig": "./lib/tsconfig.json", "./types": "./dist/types/index.mjs", - "./vite": "./dist/vite.mjs" + "./vite": "./dist/vite.mjs", + "./vite/runtime": "./dist/runtime/vite.mjs" }, "imports": { "#nitro/runtime/*": "./dist/runtime/internal/*.mjs", - "#nitro/vite/runtime": "./dist/runtime/vite-runtime.mjs", - "#nitro/virtual/*": "./dist/builder/virtual/*.mjs" + "#nitro/virtual/*": "./dist/runtime/virtual/*.mjs" }, "types": "./lib/index.d.mts", "bin": { diff --git a/src/runtime/internal/runtime-config.ts b/src/runtime/internal/runtime-config.ts index 704a695d33..c48d76366c 100644 --- a/src/runtime/internal/runtime-config.ts +++ b/src/runtime/internal/runtime-config.ts @@ -1,5 +1,5 @@ import type { NitroRuntimeConfig } from "nitro/types"; -import { applyEnv } from "./runtime-config.utils.ts"; +import { snakeCase } from "scule"; import { runtimeConfig } from "#nitro/virtual/runtime-config"; export function useRuntimeConfig(): NitroRuntimeConfig { @@ -17,3 +17,65 @@ function getRuntimeConfig() { }); return runtimeConfig; } + +// ---- utils ---- + +type EnvOptions = { + prefix?: string; + altPrefix?: string; + envExpansion?: boolean; +}; + +export function applyEnv( + obj: Record, + opts: EnvOptions, + parentKey = "" +) { + for (const key in obj) { + const subKey = parentKey ? `${parentKey}_${key}` : key; + const envValue = getEnv(subKey, opts); + if (_isObject(obj[key])) { + // Same as before + if (_isObject(envValue)) { + obj[key] = { ...(obj[key] as any), ...(envValue as any) }; + applyEnv(obj[key], opts, subKey); + } + // If envValue is undefined + // Then proceed to nested properties + else if (envValue === undefined) { + applyEnv(obj[key], opts, subKey); + } + // If envValue is a primitive other than undefined + // Then set objValue and ignore the nested properties + else { + obj[key] = envValue ?? obj[key]; + } + } else { + obj[key] = envValue ?? obj[key]; + } + // Experimental env expansion + if (opts.envExpansion && typeof obj[key] === "string") { + obj[key] = _expandFromEnv(obj[key]); + } + } + return obj; +} + +const envExpandRx = /\{\{([^{}]*)\}\}/g; + +function _expandFromEnv(value: string) { + return value.replace(envExpandRx, (match, key) => { + return process.env[key] || match; + }); +} + +function getEnv(key: string, opts: EnvOptions) { + const envKey = snakeCase(key).toUpperCase(); + return ( + process.env[opts.prefix + envKey] ?? process.env[opts.altPrefix + envKey] + ); +} + +function _isObject(input: unknown) { + return typeof input === "object" && !Array.isArray(input); +} diff --git a/src/runtime/internal/runtime-config.utils.ts b/src/runtime/internal/runtime-config.utils.ts deleted file mode 100644 index 434de1daa7..0000000000 --- a/src/runtime/internal/runtime-config.utils.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { snakeCase } from "scule"; - -type EnvOptions = { - prefix?: string; - altPrefix?: string; - envExpansion?: boolean; -}; - -export function applyEnv( - obj: Record, - opts: EnvOptions, - parentKey = "" -) { - for (const key in obj) { - const subKey = parentKey ? `${parentKey}_${key}` : key; - const envValue = getEnv(subKey, opts); - if (_isObject(obj[key])) { - // Same as before - if (_isObject(envValue)) { - obj[key] = { ...(obj[key] as any), ...(envValue as any) }; - applyEnv(obj[key], opts, subKey); - } - // If envValue is undefined - // Then proceed to nested properties - else if (envValue === undefined) { - applyEnv(obj[key], opts, subKey); - } - // If envValue is a primitive other than undefined - // Then set objValue and ignore the nested properties - else { - obj[key] = envValue ?? obj[key]; - } - } else { - obj[key] = envValue ?? obj[key]; - } - // Experimental env expansion - if (opts.envExpansion && typeof obj[key] === "string") { - obj[key] = _expandFromEnv(obj[key]); - } - } - return obj; -} - -const envExpandRx = /\{\{([^{}]*)\}\}/g; - -function _expandFromEnv(value: string) { - return value.replace(envExpandRx, (match, key) => { - return process.env[key] || match; - }); -} - -function getEnv(key: string, opts: EnvOptions) { - const envKey = snakeCase(key).toUpperCase(); - return ( - process.env[opts.prefix + envKey] ?? process.env[opts.altPrefix + envKey] - ); -} - -function _isObject(input: unknown) { - return typeof input === "object" && !Array.isArray(input); -} diff --git a/src/runtime/internal/vite/ssr-renderer.mjs b/src/runtime/internal/vite/ssr-renderer.mjs index 34aa0706a5..45e3e63c7d 100644 --- a/src/runtime/internal/vite/ssr-renderer.mjs +++ b/src/runtime/internal/vite/ssr-renderer.mjs @@ -1,4 +1,4 @@ -import { fetchViteEnv } from "#nitro/vite/runtime"; +import { fetchViteEnv } from "nitro/vite/runtime"; /** @param {{ req: Request }} HTTPEvent */ export default function ssrRenderer({ req }) { diff --git a/src/runtime/virtual/database.ts b/src/runtime/virtual/database.ts new file mode 100644 index 0000000000..98ceb87c44 --- /dev/null +++ b/src/runtime/virtual/database.ts @@ -0,0 +1,8 @@ +import type { Connector } from "db0"; + +export const connectionConfigs: { + [name: string]: { + connector: (options: any) => Connector; + options: any; + }; +} = {}; diff --git a/src/runtime/virtual/error-handler.ts b/src/runtime/virtual/error-handler.ts new file mode 100644 index 0000000000..8711b6f621 --- /dev/null +++ b/src/runtime/virtual/error-handler.ts @@ -0,0 +1,17 @@ +import type { NitroErrorHandler } from "nitro/types"; +import { H3Event, toResponse } from "h3"; + +type EParams = Parameters; +type EReturn = ReturnType; + +const errorHandler: (error: EParams[0], event: EParams[1]) => EReturn = ( + error, + event +) => { + if (error.status !== 404) { + console.error(error as any); + } + return toResponse(error, event as H3Event); +}; + +export default errorHandler; diff --git a/src/runtime/virtual/feature-flags.ts b/src/runtime/virtual/feature-flags.ts new file mode 100644 index 0000000000..1abb99b95d --- /dev/null +++ b/src/runtime/virtual/feature-flags.ts @@ -0,0 +1,7 @@ +export const hasRoutes: boolean = true; +export const hasRouteRules: boolean = true; +export const hasGlobalMiddleware: boolean = true; +export const hasRoutedMiddleware: boolean = true; +export const hasPlugins: boolean = true; +export const hasHooks: boolean = true; +export const hasWebSocket: boolean = true; diff --git a/src/runtime/virtual/plugins.ts b/src/runtime/virtual/plugins.ts new file mode 100644 index 0000000000..1402249e73 --- /dev/null +++ b/src/runtime/virtual/plugins.ts @@ -0,0 +1,3 @@ +import type { NitroAppPlugin } from "nitro/types"; + +export const plugins: NitroAppPlugin[] = []; diff --git a/src/runtime/virtual/polyfills.ts b/src/runtime/virtual/polyfills.ts new file mode 100644 index 0000000000..ff8b4c5632 --- /dev/null +++ b/src/runtime/virtual/polyfills.ts @@ -0,0 +1 @@ +export default {}; diff --git a/src/runtime/virtual/public-assets.ts b/src/runtime/virtual/public-assets.ts new file mode 100644 index 0000000000..703c7ba6e4 --- /dev/null +++ b/src/runtime/virtual/public-assets.ts @@ -0,0 +1,15 @@ +import type { PublicAsset } from "nitro/types"; + +export const publicAssetBases: string[] = []; + +export const isPublicAssetURL: (id: string) => boolean = () => false; + +export const getPublicAssetMeta: ( + id: string +) => { maxAge?: number } | null = () => null; + +export const readAsset: (id: string) => Promise = async () => { + throw new Error("Asset not found"); +}; + +export const getAsset: (id: string) => PublicAsset | null = () => null; diff --git a/src/runtime/virtual/renderer-template.ts b/src/runtime/virtual/renderer-template.ts new file mode 100644 index 0000000000..8cb0406b10 --- /dev/null +++ b/src/runtime/virtual/renderer-template.ts @@ -0,0 +1,7 @@ +export function rendererTemplate(_req: Request): string | Promise { + return ``; +} + +// dev only +export const rendererTemplateFile: string | undefined = undefined; +export const isStaticTemplate: boolean | undefined = undefined; diff --git a/src/runtime/virtual/routing-meta.ts b/src/runtime/virtual/routing-meta.ts new file mode 100644 index 0000000000..cc9bee327e --- /dev/null +++ b/src/runtime/virtual/routing-meta.ts @@ -0,0 +1,7 @@ +import type { NitroRouteMeta } from "nitro/types"; + +export const handlersMeta: { + route?: string; + method?: string; + meta?: NitroRouteMeta; +}[] = []; diff --git a/src/runtime/virtual/routing.ts b/src/runtime/virtual/routing.ts new file mode 100644 index 0000000000..63bed820dc --- /dev/null +++ b/src/runtime/virtual/routing.ts @@ -0,0 +1,26 @@ +import type { Middleware, H3Route } from "h3"; +import type { MatchedRoute } from "rou3"; +import type { MatchedRouteRule } from "nitro/types"; + +export function findRoute( + _method: string, + _path: string +): MatchedRoute | undefined { + return undefined; +} + +export function findRouteRules( + _method: string, + _path: string +): MatchedRoute[] { + return []; +} + +export const globalMiddleware: Middleware[] = []; + +export function findRoutedMiddleware( + _method: string, + _path: string +): MatchedRoute[] { + return []; +} diff --git a/src/runtime/virtual/runtime-config.ts b/src/runtime/virtual/runtime-config.ts new file mode 100644 index 0000000000..334fce7458 --- /dev/null +++ b/src/runtime/virtual/runtime-config.ts @@ -0,0 +1,6 @@ +import type { NitroRuntimeConfig } from "nitro/types"; + +export const runtimeConfig: NitroRuntimeConfig = { + app: {}, + nitro: {}, +}; diff --git a/src/runtime/virtual/server-assets.ts b/src/runtime/virtual/server-assets.ts new file mode 100644 index 0000000000..65b77fa478 --- /dev/null +++ b/src/runtime/virtual/server-assets.ts @@ -0,0 +1,13 @@ +import type { AssetMeta } from "nitro/types"; + +export function readAsset(_id: string): Promise { + return Promise.resolve({} as T); +} + +export function statAsset(_id: string): Promise { + return Promise.resolve({}); +} + +export function getKeys(): Promise { + return Promise.resolve([]); +} diff --git a/src/runtime/virtual/storage.ts b/src/runtime/virtual/storage.ts new file mode 100644 index 0000000000..d9940b1bf5 --- /dev/null +++ b/src/runtime/virtual/storage.ts @@ -0,0 +1,5 @@ +import type { Storage } from "unstorage"; + +export function initStorage(): Storage { + throw new Error("Storage is only available in a Nitro runtime."); +} diff --git a/src/runtime/virtual/tasks.ts b/src/runtime/virtual/tasks.ts new file mode 100644 index 0000000000..c1d965f163 --- /dev/null +++ b/src/runtime/virtual/tasks.ts @@ -0,0 +1,8 @@ +import type { Task, TaskMeta } from "nitro/types"; + +export const tasks: Record< + string, + { resolve?: () => Promise; meta: TaskMeta } +> = {}; + +export const scheduledTasks: false | { cron: string; tasks: string[] }[] = []; diff --git a/src/runtime/vite-runtime.ts b/src/runtime/vite.ts similarity index 100% rename from src/runtime/vite-runtime.ts rename to src/runtime/vite.ts diff --git a/test/unit/runtime-config.env.test.ts b/test/unit/runtime-config.env.test.ts index 039fb09275..d21f95cf30 100644 --- a/test/unit/runtime-config.env.test.ts +++ b/test/unit/runtime-config.env.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest"; -import { applyEnv } from "../../src/runtime/internal/runtime-config.utils.ts"; +import { applyEnv } from "../../src/runtime/internal/runtime-config.ts"; describe("env utils", () => { describe("applyEnv", () => { diff --git a/test/unit/virtual.test.ts b/test/unit/virtual.test.ts new file mode 100644 index 0000000000..5a8f857dcc --- /dev/null +++ b/test/unit/virtual.test.ts @@ -0,0 +1,11 @@ +import { describe, expect, it } from "vitest"; + +import { serverFetch } from "nitro/app"; + +describe("virtual modules", () => { + it("app fetch", async () => { + const res = await serverFetch("/"); + expect(res.status).toBe(404); + expect(await res.text()).to.include("Cannot find any route matching"); + }); +}); diff --git a/tsconfig.json b/tsconfig.json index 739d87480a..4afff2d8b4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,7 +11,7 @@ "lib": ["es2022", "webworker", "dom.iterable"], "types": ["node", "@cloudflare/workers-types"], "paths": { - "#nitro/virtual/*": ["./src/runtime/internal/virtual/*.ts"] + "#nitro/virtual/*": ["src/runtime/virtual/*.ts"] } }, "exclude": [ From 117f9910d6de53817c9610d045781b86ac9ab35f Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Thu, 11 Dec 2025 17:53:49 +0100 Subject: [PATCH 3/6] update --- src/runtime/virtual/_runtime_warn.ts | 8 ++++++++ src/runtime/virtual/database.ts | 1 + src/runtime/virtual/error-handler.ts | 3 ++- src/runtime/virtual/feature-flags.ts | 2 ++ src/runtime/virtual/plugins.ts | 1 + src/runtime/virtual/polyfills.ts | 2 ++ src/runtime/virtual/public-assets.ts | 1 + src/runtime/virtual/renderer-template.ts | 2 ++ src/runtime/virtual/routing-meta.ts | 1 + src/runtime/virtual/routing.ts | 2 ++ src/runtime/virtual/runtime-config.ts | 1 + src/runtime/virtual/server-assets.ts | 1 + src/runtime/virtual/storage.ts | 5 +++-- src/runtime/virtual/tasks.ts | 1 + tsconfig.json | 5 +---- 15 files changed, 29 insertions(+), 7 deletions(-) create mode 100644 src/runtime/virtual/_runtime_warn.ts diff --git a/src/runtime/virtual/_runtime_warn.ts b/src/runtime/virtual/_runtime_warn.ts new file mode 100644 index 0000000000..ad6a06f2de --- /dev/null +++ b/src/runtime/virtual/_runtime_warn.ts @@ -0,0 +1,8 @@ +import consola from "consola"; +import { isTest } from "std-env"; + +if (!isTest) { + consola.warn( + "Nitro runtime imports detected without a builder or Nitro plugin. A stub implementation will be used." + ); +} diff --git a/src/runtime/virtual/database.ts b/src/runtime/virtual/database.ts index 98ceb87c44..dbbeeafa65 100644 --- a/src/runtime/virtual/database.ts +++ b/src/runtime/virtual/database.ts @@ -1,3 +1,4 @@ +import "./_runtime_warn.ts"; import type { Connector } from "db0"; export const connectionConfigs: { diff --git a/src/runtime/virtual/error-handler.ts b/src/runtime/virtual/error-handler.ts index 8711b6f621..67de15ad51 100644 --- a/src/runtime/virtual/error-handler.ts +++ b/src/runtime/virtual/error-handler.ts @@ -1,5 +1,6 @@ -import type { NitroErrorHandler } from "nitro/types"; +import "./_runtime_warn.ts"; import { H3Event, toResponse } from "h3"; +import type { NitroErrorHandler } from "nitro/types"; type EParams = Parameters; type EReturn = ReturnType; diff --git a/src/runtime/virtual/feature-flags.ts b/src/runtime/virtual/feature-flags.ts index 1abb99b95d..ecf7d2da6c 100644 --- a/src/runtime/virtual/feature-flags.ts +++ b/src/runtime/virtual/feature-flags.ts @@ -1,3 +1,5 @@ +import "./_runtime_warn.ts"; + export const hasRoutes: boolean = true; export const hasRouteRules: boolean = true; export const hasGlobalMiddleware: boolean = true; diff --git a/src/runtime/virtual/plugins.ts b/src/runtime/virtual/plugins.ts index 1402249e73..f77a96cccd 100644 --- a/src/runtime/virtual/plugins.ts +++ b/src/runtime/virtual/plugins.ts @@ -1,3 +1,4 @@ +import "./_runtime_warn.ts"; import type { NitroAppPlugin } from "nitro/types"; export const plugins: NitroAppPlugin[] = []; diff --git a/src/runtime/virtual/polyfills.ts b/src/runtime/virtual/polyfills.ts index ff8b4c5632..e01315c156 100644 --- a/src/runtime/virtual/polyfills.ts +++ b/src/runtime/virtual/polyfills.ts @@ -1 +1,3 @@ +import "./_runtime_warn.ts"; + export default {}; diff --git a/src/runtime/virtual/public-assets.ts b/src/runtime/virtual/public-assets.ts index 703c7ba6e4..b24af76ede 100644 --- a/src/runtime/virtual/public-assets.ts +++ b/src/runtime/virtual/public-assets.ts @@ -1,3 +1,4 @@ +import "./_runtime_warn.ts"; import type { PublicAsset } from "nitro/types"; export const publicAssetBases: string[] = []; diff --git a/src/runtime/virtual/renderer-template.ts b/src/runtime/virtual/renderer-template.ts index 8cb0406b10..dd0add08a4 100644 --- a/src/runtime/virtual/renderer-template.ts +++ b/src/runtime/virtual/renderer-template.ts @@ -1,3 +1,5 @@ +import "./_runtime_warn.ts"; + export function rendererTemplate(_req: Request): string | Promise { return ``; } diff --git a/src/runtime/virtual/routing-meta.ts b/src/runtime/virtual/routing-meta.ts index cc9bee327e..07e4f3c588 100644 --- a/src/runtime/virtual/routing-meta.ts +++ b/src/runtime/virtual/routing-meta.ts @@ -1,3 +1,4 @@ +import "./_runtime_warn.ts"; import type { NitroRouteMeta } from "nitro/types"; export const handlersMeta: { diff --git a/src/runtime/virtual/routing.ts b/src/runtime/virtual/routing.ts index 63bed820dc..10ab53fd1f 100644 --- a/src/runtime/virtual/routing.ts +++ b/src/runtime/virtual/routing.ts @@ -1,3 +1,5 @@ +import "./_runtime_warn.ts"; + import type { Middleware, H3Route } from "h3"; import type { MatchedRoute } from "rou3"; import type { MatchedRouteRule } from "nitro/types"; diff --git a/src/runtime/virtual/runtime-config.ts b/src/runtime/virtual/runtime-config.ts index 334fce7458..bf741a7765 100644 --- a/src/runtime/virtual/runtime-config.ts +++ b/src/runtime/virtual/runtime-config.ts @@ -1,3 +1,4 @@ +import "./_runtime_warn.ts"; import type { NitroRuntimeConfig } from "nitro/types"; export const runtimeConfig: NitroRuntimeConfig = { diff --git a/src/runtime/virtual/server-assets.ts b/src/runtime/virtual/server-assets.ts index 65b77fa478..040813d2fc 100644 --- a/src/runtime/virtual/server-assets.ts +++ b/src/runtime/virtual/server-assets.ts @@ -1,3 +1,4 @@ +import "./_runtime_warn.ts"; import type { AssetMeta } from "nitro/types"; export function readAsset(_id: string): Promise { diff --git a/src/runtime/virtual/storage.ts b/src/runtime/virtual/storage.ts index d9940b1bf5..973215b9eb 100644 --- a/src/runtime/virtual/storage.ts +++ b/src/runtime/virtual/storage.ts @@ -1,5 +1,6 @@ -import type { Storage } from "unstorage"; +import "./_runtime_warn.ts"; +import { type Storage, createStorage } from "unstorage"; export function initStorage(): Storage { - throw new Error("Storage is only available in a Nitro runtime."); + return createStorage(); } diff --git a/src/runtime/virtual/tasks.ts b/src/runtime/virtual/tasks.ts index c1d965f163..f4f23972ce 100644 --- a/src/runtime/virtual/tasks.ts +++ b/src/runtime/virtual/tasks.ts @@ -1,3 +1,4 @@ +import "./_runtime_warn.ts"; import type { Task, TaskMeta } from "nitro/types"; export const tasks: Record< diff --git a/tsconfig.json b/tsconfig.json index 4afff2d8b4..86db00fea8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,10 +9,7 @@ "noImplicitReturns": false, "jsx": "preserve", "lib": ["es2022", "webworker", "dom.iterable"], - "types": ["node", "@cloudflare/workers-types"], - "paths": { - "#nitro/virtual/*": ["src/runtime/virtual/*.ts"] - } + "types": ["node", "@cloudflare/workers-types"] }, "exclude": [ "examples/import-alias/**", From 9086728f301d07d6059fc976c76a233f8f295656 Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Thu, 11 Dec 2025 17:57:46 +0100 Subject: [PATCH 4/6] add missing server-assets export --- src/runtime/virtual/server-assets.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/runtime/virtual/server-assets.ts b/src/runtime/virtual/server-assets.ts index 040813d2fc..376a2505d9 100644 --- a/src/runtime/virtual/server-assets.ts +++ b/src/runtime/virtual/server-assets.ts @@ -1,6 +1,10 @@ import "./_runtime_warn.ts"; +import { createStorage } from "unstorage"; + import type { AssetMeta } from "nitro/types"; +export const assets = createStorage(); + export function readAsset(_id: string): Promise { return Promise.resolve({} as T); } From d9df65dd172c73118c6481e633a3f81b8d6b0654 Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Thu, 11 Dec 2025 17:59:06 +0100 Subject: [PATCH 5/6] fix check --- src/runtime/internal/runtime-config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/internal/runtime-config.ts b/src/runtime/internal/runtime-config.ts index c48d76366c..51e0bc55d2 100644 --- a/src/runtime/internal/runtime-config.ts +++ b/src/runtime/internal/runtime-config.ts @@ -77,5 +77,5 @@ function getEnv(key: string, opts: EnvOptions) { } function _isObject(input: unknown) { - return typeof input === "object" && !Array.isArray(input); + return input !== null && typeof input === "object" && !Array.isArray(input); } From c670b36a7a0cf74f79ad3f2994a7b0bebd0e4f07 Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Thu, 11 Dec 2025 18:01:06 +0100 Subject: [PATCH 6/6] remove dangling files --- src/runtime/internal/virtual/database.ts | 8 ------ src/runtime/internal/virtual/error-handler.ts | 10 ------- src/runtime/internal/virtual/feature-flags.ts | 7 ----- src/runtime/internal/virtual/plugins.d.ts | 3 --- src/runtime/internal/virtual/polyfills.ts | 1 - src/runtime/internal/virtual/public-assets.ts | 15 ----------- .../internal/virtual/renderer-template.ts | 7 ----- src/runtime/internal/virtual/routing-meta.ts | 7 ----- src/runtime/internal/virtual/routing.ts | 26 ------------------- .../internal/virtual/runtime-config.ts | 6 ----- src/runtime/internal/virtual/server-assets.ts | 13 ---------- src/runtime/internal/virtual/storage.ts | 5 ---- src/runtime/internal/virtual/tasks.ts | 8 ------ 13 files changed, 116 deletions(-) delete mode 100644 src/runtime/internal/virtual/database.ts delete mode 100644 src/runtime/internal/virtual/error-handler.ts delete mode 100644 src/runtime/internal/virtual/feature-flags.ts delete mode 100644 src/runtime/internal/virtual/plugins.d.ts delete mode 100644 src/runtime/internal/virtual/polyfills.ts delete mode 100644 src/runtime/internal/virtual/public-assets.ts delete mode 100644 src/runtime/internal/virtual/renderer-template.ts delete mode 100644 src/runtime/internal/virtual/routing-meta.ts delete mode 100644 src/runtime/internal/virtual/routing.ts delete mode 100644 src/runtime/internal/virtual/runtime-config.ts delete mode 100644 src/runtime/internal/virtual/server-assets.ts delete mode 100644 src/runtime/internal/virtual/storage.ts delete mode 100644 src/runtime/internal/virtual/tasks.ts diff --git a/src/runtime/internal/virtual/database.ts b/src/runtime/internal/virtual/database.ts deleted file mode 100644 index 98ceb87c44..0000000000 --- a/src/runtime/internal/virtual/database.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { Connector } from "db0"; - -export const connectionConfigs: { - [name: string]: { - connector: (options: any) => Connector; - options: any; - }; -} = {}; diff --git a/src/runtime/internal/virtual/error-handler.ts b/src/runtime/internal/virtual/error-handler.ts deleted file mode 100644 index 8fc797bfdb..0000000000 --- a/src/runtime/internal/virtual/error-handler.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { NitroErrorHandler } from "nitro/types"; - -type EParams = Parameters; -type EReturn = ReturnType; - -const errorHandler: (error: EParams[0], event: EParams[1]) => EReturn = () => { - return new Response("Internal Server Error", { status: 500 }); -}; - -export default errorHandler; diff --git a/src/runtime/internal/virtual/feature-flags.ts b/src/runtime/internal/virtual/feature-flags.ts deleted file mode 100644 index 1abb99b95d..0000000000 --- a/src/runtime/internal/virtual/feature-flags.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const hasRoutes: boolean = true; -export const hasRouteRules: boolean = true; -export const hasGlobalMiddleware: boolean = true; -export const hasRoutedMiddleware: boolean = true; -export const hasPlugins: boolean = true; -export const hasHooks: boolean = true; -export const hasWebSocket: boolean = true; diff --git a/src/runtime/internal/virtual/plugins.d.ts b/src/runtime/internal/virtual/plugins.d.ts deleted file mode 100644 index 1402249e73..0000000000 --- a/src/runtime/internal/virtual/plugins.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { NitroAppPlugin } from "nitro/types"; - -export const plugins: NitroAppPlugin[] = []; diff --git a/src/runtime/internal/virtual/polyfills.ts b/src/runtime/internal/virtual/polyfills.ts deleted file mode 100644 index ff8b4c5632..0000000000 --- a/src/runtime/internal/virtual/polyfills.ts +++ /dev/null @@ -1 +0,0 @@ -export default {}; diff --git a/src/runtime/internal/virtual/public-assets.ts b/src/runtime/internal/virtual/public-assets.ts deleted file mode 100644 index 703c7ba6e4..0000000000 --- a/src/runtime/internal/virtual/public-assets.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { PublicAsset } from "nitro/types"; - -export const publicAssetBases: string[] = []; - -export const isPublicAssetURL: (id: string) => boolean = () => false; - -export const getPublicAssetMeta: ( - id: string -) => { maxAge?: number } | null = () => null; - -export const readAsset: (id: string) => Promise = async () => { - throw new Error("Asset not found"); -}; - -export const getAsset: (id: string) => PublicAsset | null = () => null; diff --git a/src/runtime/internal/virtual/renderer-template.ts b/src/runtime/internal/virtual/renderer-template.ts deleted file mode 100644 index 8cb0406b10..0000000000 --- a/src/runtime/internal/virtual/renderer-template.ts +++ /dev/null @@ -1,7 +0,0 @@ -export function rendererTemplate(_req: Request): string | Promise { - return ``; -} - -// dev only -export const rendererTemplateFile: string | undefined = undefined; -export const isStaticTemplate: boolean | undefined = undefined; diff --git a/src/runtime/internal/virtual/routing-meta.ts b/src/runtime/internal/virtual/routing-meta.ts deleted file mode 100644 index cc9bee327e..0000000000 --- a/src/runtime/internal/virtual/routing-meta.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { NitroRouteMeta } from "nitro/types"; - -export const handlersMeta: { - route?: string; - method?: string; - meta?: NitroRouteMeta; -}[] = []; diff --git a/src/runtime/internal/virtual/routing.ts b/src/runtime/internal/virtual/routing.ts deleted file mode 100644 index 63bed820dc..0000000000 --- a/src/runtime/internal/virtual/routing.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { Middleware, H3Route } from "h3"; -import type { MatchedRoute } from "rou3"; -import type { MatchedRouteRule } from "nitro/types"; - -export function findRoute( - _method: string, - _path: string -): MatchedRoute | undefined { - return undefined; -} - -export function findRouteRules( - _method: string, - _path: string -): MatchedRoute[] { - return []; -} - -export const globalMiddleware: Middleware[] = []; - -export function findRoutedMiddleware( - _method: string, - _path: string -): MatchedRoute[] { - return []; -} diff --git a/src/runtime/internal/virtual/runtime-config.ts b/src/runtime/internal/virtual/runtime-config.ts deleted file mode 100644 index 334fce7458..0000000000 --- a/src/runtime/internal/virtual/runtime-config.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { NitroRuntimeConfig } from "nitro/types"; - -export const runtimeConfig: NitroRuntimeConfig = { - app: {}, - nitro: {}, -}; diff --git a/src/runtime/internal/virtual/server-assets.ts b/src/runtime/internal/virtual/server-assets.ts deleted file mode 100644 index 65b77fa478..0000000000 --- a/src/runtime/internal/virtual/server-assets.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { AssetMeta } from "nitro/types"; - -export function readAsset(_id: string): Promise { - return Promise.resolve({} as T); -} - -export function statAsset(_id: string): Promise { - return Promise.resolve({}); -} - -export function getKeys(): Promise { - return Promise.resolve([]); -} diff --git a/src/runtime/internal/virtual/storage.ts b/src/runtime/internal/virtual/storage.ts deleted file mode 100644 index d9940b1bf5..0000000000 --- a/src/runtime/internal/virtual/storage.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { Storage } from "unstorage"; - -export function initStorage(): Storage { - throw new Error("Storage is only available in a Nitro runtime."); -} diff --git a/src/runtime/internal/virtual/tasks.ts b/src/runtime/internal/virtual/tasks.ts deleted file mode 100644 index c1d965f163..0000000000 --- a/src/runtime/internal/virtual/tasks.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { Task, TaskMeta } from "nitro/types"; - -export const tasks: Record< - string, - { resolve?: () => Promise; meta: TaskMeta } -> = {}; - -export const scheduledTasks: false | { cron: string; tasks: string[] }[] = [];