@demiurgejs/core 0.2.0-beta.4 → 0.2.0-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -0
- package/bin/demiurge.mjs +17 -1
- package/dist/adapter/index.d.ts +1 -1
- package/dist/adapter/index.d.ts.map +1 -1
- package/dist/browser/file-router.d.ts +1 -1
- package/dist/chunks/{document-shell-CpJnFtSC.js → document-shell-9GPwtcTt.js} +2 -2
- package/dist/chunks/{document-shell-CpJnFtSC.js.map → document-shell-9GPwtcTt.js.map} +1 -1
- package/dist/chunks/{image-codec-BmzWnH6W.js → image-codec-Dh1POFhE.js} +2 -2
- package/dist/chunks/{image-codec-BmzWnH6W.js.map → image-codec-Dh1POFhE.js.map} +1 -1
- package/dist/chunks/{images-BQ80950B.js → images-CG7ZzayG.js} +2 -2
- package/dist/chunks/{images-BQ80950B.js.map → images-CG7ZzayG.js.map} +1 -1
- package/dist/chunks/{index-BVk9zWbe.js → index-0MNiR_wo.js} +4 -3
- package/dist/chunks/{index-BVk9zWbe.js.map → index-0MNiR_wo.js.map} +1 -1
- package/dist/chunks/plugin-BZauDxRY.js +2310 -0
- package/dist/chunks/plugin-BZauDxRY.js.map +1 -0
- package/dist/chunks/streaming-GYIsVTQH.js +560 -0
- package/dist/chunks/streaming-GYIsVTQH.js.map +1 -0
- package/dist/chunks/testing-CUwGj2ie.js +4751 -0
- package/dist/chunks/testing-CUwGj2ie.js.map +1 -0
- package/dist/chunks/{vite-DO70kZA6.js → vite-QoqrGl6f.js} +43 -43
- package/dist/chunks/vite-QoqrGl6f.js.map +1 -0
- package/dist/cli.d.ts +4 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +224 -98
- package/dist/cli.js.map +1 -1
- package/dist/config/index.js +2 -2
- package/dist/config/types.d.ts +11 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/edge/index.js +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +161 -139
- package/dist/index.js.map +1 -1
- package/dist/inspect/command.d.ts +28 -0
- package/dist/inspect/command.d.ts.map +1 -0
- package/dist/inspect/index.d.ts +9 -0
- package/dist/inspect/index.d.ts.map +1 -0
- package/dist/inspect/redact.d.ts +35 -0
- package/dist/inspect/redact.d.ts.map +1 -0
- package/dist/inspect/report.d.ts +24 -0
- package/dist/inspect/report.d.ts.map +1 -0
- package/dist/inspect/types.d.ts +102 -0
- package/dist/inspect/types.d.ts.map +1 -0
- package/dist/internal/testing.js +12 -12
- package/dist/node/http.d.ts +5 -0
- package/dist/node/http.d.ts.map +1 -1
- package/dist/node/index.d.ts +1 -1
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +26 -24
- package/dist/node/index.js.map +1 -1
- package/dist/route/index.d.ts +1 -0
- package/dist/route/index.d.ts.map +1 -1
- package/dist/route/mutation.d.ts.map +1 -1
- package/dist/route/serialization.d.ts +24 -0
- package/dist/route/serialization.d.ts.map +1 -0
- package/dist/route/webhook.d.ts +6 -1
- package/dist/route/webhook.d.ts.map +1 -1
- package/dist/router/manifest.d.ts.map +1 -1
- package/dist/security/audit.d.ts +2 -1
- package/dist/security/audit.d.ts.map +1 -1
- package/dist/security/authorization.d.ts +36 -0
- package/dist/security/authorization.d.ts.map +1 -0
- package/dist/security/csrf.d.ts.map +1 -1
- package/dist/security/env-startup.d.ts +0 -2
- package/dist/security/env-startup.d.ts.map +1 -1
- package/dist/security/env.d.ts +27 -8
- package/dist/security/env.d.ts.map +1 -1
- package/dist/security/exceptions.d.ts +29 -0
- package/dist/security/exceptions.d.ts.map +1 -0
- package/dist/security/finding-codes.d.ts +56 -0
- package/dist/security/finding-codes.d.ts.map +1 -0
- package/dist/security/index.d.ts +5 -2
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/policy.d.ts +2 -5
- package/dist/security/policy.d.ts.map +1 -1
- package/dist/security/report.d.ts +2 -1
- package/dist/security/report.d.ts.map +1 -1
- package/dist/security/request.d.ts +1 -0
- package/dist/security/request.d.ts.map +1 -1
- package/dist/security/types.d.ts +138 -5
- package/dist/security/types.d.ts.map +1 -1
- package/dist/security/upload.d.ts +3 -3
- package/dist/security/upload.d.ts.map +1 -1
- package/dist/security/verification.d.ts.map +1 -1
- package/dist/server/request-handler.d.ts +3 -2
- package/dist/server/request-handler.d.ts.map +1 -1
- package/dist/server-only/browser.d.ts +2 -0
- package/dist/server-only/browser.d.ts.map +1 -0
- package/dist/server-only/browser.js +4 -0
- package/dist/server-only/browser.js.map +1 -0
- package/dist/server-only/index.d.ts +2 -0
- package/dist/server-only/index.d.ts.map +1 -0
- package/dist/server-only/index.js +2 -0
- package/dist/server-only/index.js.map +1 -0
- package/dist/static/index.js +4 -4
- package/dist/vite/index.d.ts +9 -4
- package/dist/vite/index.d.ts.map +1 -1
- package/dist/vite/index.js +28 -21
- package/dist/vite/plugin.d.ts +18 -2
- package/dist/vite/plugin.d.ts.map +1 -1
- package/dist/vite/policy-verification.d.ts +33 -2
- package/dist/vite/policy-verification.d.ts.map +1 -1
- package/dist/vite/route-audit.d.ts +14 -2
- package/dist/vite/route-audit.d.ts.map +1 -1
- package/dist/vite/server-only-boundary.d.ts +8 -0
- package/dist/vite/server-only-boundary.d.ts.map +1 -0
- package/package.json +6 -1
- package/dist/chunks/env-startup-DOBYWlZD.js +0 -257
- package/dist/chunks/env-startup-DOBYWlZD.js.map +0 -1
- package/dist/chunks/plugin-BQgMiHxa.js +0 -1827
- package/dist/chunks/plugin-BQgMiHxa.js.map +0 -1
- package/dist/chunks/streaming-BEbPN7Uk.js +0 -469
- package/dist/chunks/streaming-BEbPN7Uk.js.map +0 -1
- package/dist/chunks/testing-DueXbMo4.js +0 -4167
- package/dist/chunks/testing-DueXbMo4.js.map +0 -1
- package/dist/chunks/vite-DO70kZA6.js.map +0 -1
package/dist/node/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/node/static.ts","../../src/node/serve.ts","../../src/node/index.ts"],"sourcesContent":["import { constants } from \"node:fs\";\nimport { lstat, open, realpath } from \"node:fs/promises\";\nimport { extname, join, relative, resolve, sep } from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport {\n contentTypeForExtension,\n IMMUTABLE_FILE_CACHE_CONTROL,\n isContentHashedFileName,\n REVALIDATED_FILE_CACHE_CONTROL,\n} from \"../static-files\";\n\nexport type StaticFileHandler = (request: Request) => Promise<Response | null>;\n\nexport type StaticFileHandlerOptions = {\n // Receives the file's path relative to `root`, always \"/\"-separated, so a\n // predicate can distinguish `index.html` from `docs/index.html`.\n exclude?: (path: string) => boolean;\n immutable?: (fileName: string) => boolean;\n prefix?: string;\n root: string;\n};\n\n// A null result keeps the handler composable. It means that the request does not\n// identify an owned file. The route pipeline owns all other responses, including\n// the 404 body and security headers. A traversal attempt gives the same result.\n// Plain static requests must not access the framework build output. The output\n// includes the SPA shell and the Node configuration manifest. The route pipeline\n// serves the shell and applies the `@policy.ts` headers. The server never serves\n// `demiurge-manifest.json` publicly. This exclusion applies only to the two root\n// files. An application can serve a nested file such as `docs/index.html`.\nconst defaultExcludedPaths = new Set([\"demiurge-manifest.json\", \"index.html\"]);\n\nexport function createStaticFileHandler(\n options: StaticFileHandlerOptions,\n): StaticFileHandler {\n const root = resolve(options.root);\n const realRoot = realpath(root);\n const prefix = normalizePrefix(options.prefix);\n const isExcluded = options.exclude ?? defaultExcluded;\n const isImmutable = options.immutable ?? defaultImmutable;\n\n return async function handleStaticFile(request) {\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n return null;\n }\n\n const filePath = resolveFilePath(\n root,\n prefix,\n new URL(request.url).pathname,\n );\n\n if (!filePath || isExcluded(toRelativePath(root, filePath))) {\n return null;\n }\n\n const opened = await openStaticFile(root, await safeRealRoot(realRoot), filePath);\n\n if (!opened) {\n return null;\n }\n\n const { file, stats } = opened;\n\n const etag = createWeakEtag(stats.size, stats.mtimeMs);\n const lastModified = stats.mtime.toUTCString();\n const headers = new Headers({\n \"accept-ranges\": \"bytes\",\n \"cache-control\": isImmutable(fileNameOf(filePath))\n ? IMMUTABLE_FILE_CACHE_CONTROL\n : REVALIDATED_FILE_CACHE_CONTROL,\n \"content-length\": String(stats.size),\n \"content-type\": contentTypeOf(filePath),\n \"cross-origin-resource-policy\": \"same-origin\",\n etag,\n \"last-modified\": lastModified,\n \"x-content-type-options\": \"nosniff\",\n });\n\n if (isNotModified(request, etag, stats.mtimeMs)) {\n await file.close();\n headers.delete(\"content-length\");\n headers.delete(\"content-type\");\n\n return new Response(null, { headers, status: 304 });\n }\n\n const range = canApplyRange(request, stats.mtimeMs)\n ? parseRange(request.headers.get(\"range\"), stats.size)\n : null;\n\n if (range === \"unsatisfiable\") {\n await file.close();\n headers.delete(\"content-length\");\n headers.delete(\"content-type\");\n headers.set(\"content-range\", `bytes */${stats.size}`);\n\n return new Response(null, { headers, status: 416 });\n }\n\n if (range) {\n const contentLength = range.end - range.start + 1;\n headers.set(\"content-length\", String(contentLength));\n headers.set(\"content-range\", `bytes ${range.start}-${range.end}/${stats.size}`);\n\n if (request.method === \"HEAD\") {\n await file.close();\n return new Response(null, { headers, status: 206 });\n }\n\n // TYPE-EVIDENCE: Readable.toWeb returns a web stream that matches the DOM ReadableStream body type.\n return new Response(\n Readable.toWeb(\n file.createReadStream({ end: range.end, start: range.start }),\n ) as ReadableStream,\n { headers, status: 206 },\n );\n }\n\n if (request.method === \"HEAD\") {\n await file.close();\n return new Response(null, { headers });\n }\n\n // TYPE-EVIDENCE: Readable.toWeb returns a web stream that matches the DOM ReadableStream body type.\n return new Response(\n Readable.toWeb(file.createReadStream()) as ReadableStream,\n { headers },\n );\n };\n}\n\nfunction createWeakEtag(size: number, mtimeMs: number) {\n return `W/\"${size.toString(16)}-${Math.trunc(mtimeMs).toString(16)}\"`;\n}\n\nfunction isNotModified(request: Request, etag: string, mtimeMs: number) {\n const ifNoneMatch = request.headers.get(\"if-none-match\");\n\n // If-None-Match takes precedence over If-Modified-Since. Weak comparison is\n // correct for GET/HEAD cache validation, so W/ is removed from both sides.\n if (ifNoneMatch !== null) {\n return ifNoneMatch.trim() === \"*\" || ifNoneMatch.split(\",\").some(\n (candidate) => weakEtagValue(candidate) === weakEtagValue(etag),\n );\n }\n\n const ifModifiedSince = request.headers.get(\"if-modified-since\");\n\n if (ifModifiedSince === null) {\n return false;\n }\n\n const since = Date.parse(ifModifiedSince);\n\n // HTTP dates have one-second precision. Compare the file timestamp at the\n // same precision rather than making a freshly-written file look newer.\n return Number.isFinite(since) && Math.floor(mtimeMs / 1000) * 1000 <= since;\n}\n\nfunction weakEtagValue(value: string) {\n return value.trim().replace(/^W\\//i, \"\");\n}\n\ntype ByteRange = { end: number; start: number };\n\nfunction parseRange(\n header: string | null,\n size: number,\n): ByteRange | \"unsatisfiable\" | null {\n if (header === null) {\n return null;\n }\n\n const match = /^bytes=(\\d*)-(\\d*)$/.exec(header.trim());\n\n // A server that does not support the requested unit, syntax, or multiple\n // ranges ignores Range and returns the complete representation. A 416 is\n // reserved for a valid byte-range set that cannot select this resource.\n if (!match || (!match[1] && !match[2])) {\n return null;\n }\n\n if (size === 0) {\n return \"unsatisfiable\";\n }\n\n if (!match[1]) {\n const suffixLength = Number(match[2]);\n\n if (!Number.isSafeInteger(suffixLength) || suffixLength <= 0) {\n return null;\n }\n\n return { start: Math.max(0, size - suffixLength), end: size - 1 };\n }\n\n const start = Number(match[1]);\n const requestedEnd = match[2] ? Number(match[2]) : size - 1;\n\n if (!Number.isSafeInteger(start) || !Number.isSafeInteger(requestedEnd)) {\n return null;\n }\n\n if (start >= size) {\n return \"unsatisfiable\";\n }\n\n if (match[2] && requestedEnd < start) {\n return null;\n }\n\n return { start, end: Math.min(requestedEnd, size - 1) };\n}\n\nfunction canApplyRange(request: Request, mtimeMs: number) {\n const ifRange = request.headers.get(\"if-range\");\n\n if (ifRange === null) {\n return true;\n }\n\n // If-Range requires strong comparison for an entity-tag. This handler's\n // stat-derived validator is intentionally weak, so only an HTTP date can\n // authorize a partial response.\n if (ifRange.trim().startsWith('\"') || /^W\\//i.test(ifRange.trim())) {\n return false;\n }\n\n const date = Date.parse(ifRange);\n return Number.isFinite(date) && Math.floor(mtimeMs / 1000) * 1000 <= date;\n}\n\nfunction resolveFilePath(root: string, prefix: string, pathname: string) {\n let decoded: string;\n\n try {\n decoded = decodeURIComponent(pathname);\n } catch {\n return null;\n }\n\n // A null byte truncates the path for some system calls. A name such as\n // \"app.js\\0.txt\" could read a file that differs from the checked file.\n if (decoded.includes(\"\\0\")) {\n return null;\n }\n\n if (prefix) {\n if (!decoded.startsWith(prefix)) {\n return null;\n }\n\n decoded = decoded.slice(prefix.length - 1);\n }\n\n if (decoded.endsWith(\"/\")) {\n return null;\n }\n\n const candidate = resolve(root, `.${decoded}`);\n\n return candidate.startsWith(`${root}${sep}`) ? candidate : null;\n}\n\nasync function safeRealRoot(root: Promise<string>) {\n try {\n return await root;\n } catch {\n return null;\n }\n}\n\nasync function openStaticFile(\n root: string,\n realRoot: string | null,\n filePath: string,\n) {\n if (!realRoot || !(await hasNoSymlinkComponents(root, filePath))) {\n return null;\n }\n\n let resolvedTarget: string;\n\n try {\n resolvedTarget = await realpath(filePath);\n } catch {\n return null;\n }\n\n if (!isPathInside(realRoot, resolvedTarget)) {\n return null;\n }\n\n const noFollow =\n typeof constants.O_NOFOLLOW === \"number\" ? constants.O_NOFOLLOW : 0;\n let file: Awaited<ReturnType<typeof open>>;\n\n try {\n // O_NOFOLLOW closes the final-component race on platforms that expose it.\n // The component walk and realpath containment check cover directory links.\n file = await open(filePath, constants.O_RDONLY | noFollow);\n } catch {\n return null;\n }\n\n try {\n const stats = await file.stat();\n\n if (!stats.isFile()) {\n await file.close();\n return null;\n }\n\n return { file, stats };\n } catch {\n await file.close();\n return null;\n }\n}\n\nasync function hasNoSymlinkComponents(root: string, filePath: string) {\n const parts = relative(root, filePath).split(sep);\n let current = root;\n\n try {\n for (const part of parts) {\n current = join(current, part);\n\n if ((await lstat(current)).isSymbolicLink()) {\n return false;\n }\n }\n } catch {\n return false;\n }\n\n return true;\n}\n\nfunction isPathInside(root: string, candidate: string) {\n return candidate.startsWith(`${root}${sep}`);\n}\n\nfunction normalizePrefix(prefix: string | undefined) {\n if (!prefix || prefix === \"/\") {\n return \"\";\n }\n\n return `/${prefix.replace(/^\\/|\\/$/g, \"\")}/`;\n}\n\nfunction defaultImmutable(fileName: string) {\n return isContentHashedFileName(fileName);\n}\n\nfunction defaultExcluded(path: string) {\n return defaultExcludedPaths.has(path);\n}\n\nfunction toRelativePath(root: string, filePath: string) {\n return filePath.slice(root.length + 1).split(sep).join(\"/\");\n}\n\nfunction fileNameOf(filePath: string) {\n return filePath.slice(filePath.lastIndexOf(sep) + 1);\n}\n\nfunction contentTypeOf(filePath: string) {\n return contentTypeForExtension(extname(filePath));\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { parseClientManifest } from \"../manifest\";\nimport type { PageRenderer, RequestHandler } from \"../server\";\nimport {\n createNodeServer,\n type NodeGracefulShutdownOptions,\n type NodeRequestListenerOptions,\n type NodeServer,\n type NodeServerTimeouts,\n} from \"./index\";\nimport type { TrustProxy } from \"./http\";\nimport { renderNodePageResponse } from \"./streaming\";\nimport type { StaticFileHandler, StaticFileHandlerOptions } from \"./static\";\n\nexport type NodeBuildPageOptions = {\n clientEntry: string;\n renderPage: PageRenderer;\n styles: string[];\n};\n\nexport type NodeBuildContext = {\n page: NodeBuildPageOptions;\n root: string;\n waitUntil: (promise: Promise<unknown>) => void;\n};\n\nexport type ServeNodeBuildEnvironment = Record<string, string | undefined>;\n\nexport type ServeNodeBuildOptions = {\n allowedHosts?: readonly string[];\n base: string | URL;\n clientDir?: string;\n createHandler: (\n context: NodeBuildContext,\n ) => RequestHandler | Promise<RequestHandler>;\n env?: ServeNodeBuildEnvironment;\n host?: string;\n name?: string;\n onError?: NodeRequestListenerOptions[\"onError\"];\n // When set, this replaces the default listen log entirely, so `name` is\n // not used.\n onListen?: (address: { host: string; port: number; server: NodeServer }) => void;\n port?: number;\n readyPath?: string | false;\n shutdown?: NodeGracefulShutdownOptions;\n // A caller that needs a font handler or an image optimizer in front of the\n // plain file handler returns the composed handler from this factory.\n static?:\n | StaticFileHandlerOptions\n | ((context: NodeBuildContext) => StaticFileHandler | StaticFileHandlerOptions);\n timeouts?: Partial<NodeServerTimeouts>;\n trustProxy?: TrustProxy;\n};\n\nexport const defaultNodeBuildClientDir = \"dist/client\";\nexport const defaultNodeBuildReadyPath = \"/.well-known/ready\";\n\n/**\n * Boot a built Demiurge app as one production Node process.\n *\n * The helper reads the browser manifest, resolves the host allowlist and the\n * bind address from the environment, serves hashed assets from the client\n * build, answers the readiness path, and listens.\n */\nexport async function serveNodeBuild(\n options: ServeNodeBuildOptions,\n): Promise<NodeServer> {\n const environment = options.env ?? process.env;\n const root = fileURLToPath(\n new URL(options.clientDir ?? defaultNodeBuildClientDir, options.base),\n );\n const manifest = parseClientManifest(\n await readFile(join(root, \"demiurge-manifest.json\"), \"utf8\"),\n );\n const host = options.host ?? environment.HOST ?? \"127.0.0.1\";\n const port = resolvePort(environment.PORT, options.port);\n const allowedHosts = resolveAllowedHosts(\n options.allowedHosts,\n environment.ALLOWED_HOSTS,\n host,\n );\n const name = options.name ?? \"Demiurge Node server\";\n const readyPath = options.readyPath === false\n ? undefined\n : options.readyPath ?? defaultNodeBuildReadyPath;\n\n // A caller's createHandler may call waitUntil synchronously (for example to\n // warm a cache at startup), before the server exists. Buffer those promises\n // here and flush them into the real server once it is constructed, so an\n // early call just works instead of throwing.\n const pendingWaitUntil: Promise<unknown>[] = [];\n const context: NodeBuildContext = {\n page: {\n clientEntry: manifest.clientEntry,\n renderPage: renderNodePageResponse,\n styles: manifest.styles,\n },\n root,\n waitUntil(promise) {\n pendingWaitUntil.push(promise);\n },\n };\n const handler = await options.createHandler(context);\n\n const server = createNodeServer({\n allowedHosts,\n handler,\n onError: options.onError,\n readyPath,\n shutdown: options.shutdown,\n static: resolveStatic(options.static, context),\n timeouts: options.timeouts,\n trustProxy: options.trustProxy,\n });\n\n context.waitUntil = (promise) => {\n server.waitUntil(promise);\n };\n for (const promise of pendingWaitUntil) {\n server.waitUntil(promise);\n }\n\n await new Promise<void>((resolveListen, rejectListen) => {\n server.once(\"error\", rejectListen);\n server.listen(port, host, () => {\n server.off(\"error\", rejectListen);\n resolveListen();\n });\n });\n\n const address = server.address();\n // Port 0 asks the operating system for a free port. Report the bound port so\n // a caller can reach the server.\n const boundPort = typeof address === \"object\" && address\n ? address.port\n : port;\n\n if (options.onListen) {\n options.onListen({ host, port: boundPort, server });\n } else {\n console.log(`${name} listening on http://${host}:${boundPort}`);\n }\n\n return server;\n}\n\nfunction resolvePort(configured: string | undefined, fallback: number | undefined) {\n const value = configured ?? String(fallback ?? 4173);\n const port = Number(value);\n\n if (!Number.isSafeInteger(port) || port < 0 || port > 65_535) {\n throw new Error(\"Demiurge Node PORT must be an integer from 0 through 65535.\");\n }\n\n return port;\n}\n\nfunction resolveAllowedHosts(\n configured: readonly string[] | undefined,\n fromEnvironment: string | undefined,\n host: string,\n) {\n if (configured) {\n return configured;\n }\n\n if (fromEnvironment) {\n return fromEnvironment\n .split(\",\")\n .map((value) => value.trim())\n .filter(Boolean);\n }\n\n return host === \"localhost\" ? [host] : [host, \"localhost\"];\n}\n\nfunction resolveStatic(\n configured: ServeNodeBuildOptions[\"static\"],\n context: NodeBuildContext,\n) {\n if (!configured) {\n return { root: context.root };\n }\n\n if (typeof configured !== \"function\") {\n return configured;\n }\n\n const resolved = configured(context);\n\n // A factory returns a StaticFileHandler or a StaticFileHandlerOptions\n // object, both synchronously. A StaticFileHandler passed directly instead\n // (the shape createNodeServer's own `static` option accepts) is an async\n // function. Calling it here as a factory always returns a Promise. That\n // catches the mistake early, with a clear message, instead of a failure\n // deep inside the static file handler.\n if (resolved instanceof Promise) {\n throw new TypeError(\n \"The `static` option must be a StaticFileHandlerOptions object or a \" +\n \"factory `(context) => StaticFileHandler | StaticFileHandlerOptions`. \" +\n \"It looks like a StaticFileHandler was passed directly. Wrap it: \" +\n \"`static: () => yourHandler`.\",\n );\n }\n\n return resolved;\n}\n","import { createServer } from \"node:http\";\nimport type { IncomingMessage, Server, ServerResponse } from \"node:http\";\nimport type { Socket } from \"node:net\";\nimport { defineAdapter } from \"../adapter\";\nimport type { RequestHandler } from \"../server\";\nimport {\n UntrustedHostError,\n UnsupportedMethodError,\n toWebRequest,\n validateNodeOriginPolicy,\n writeNotImplemented,\n writeWebResponse,\n} from \"./http\";\nimport { createStaticFileHandler } from \"./static\";\nimport type { StaticFileHandler, StaticFileHandlerOptions } from \"./static\";\n\nexport {\n UntrustedHostError,\n UnsupportedMethodError,\n toHeaders,\n toWebRequest,\n validateNodeOriginPolicy,\n writeWebResponse,\n} from \"./http\";\nexport { createFontAssetHandler } from \"./font\";\nexport type { FontAssetHandlerOptions } from \"./font\";\nexport { createImageOptimizer } from \"./image\";\nexport type {\n ImageOptimizerFetch,\n ImageOptimizerOptions,\n} from \"./image\";\nexport { createStaticFileHandler } from \"./static\";\nexport {\n defaultNodeBuildClientDir,\n defaultNodeBuildReadyPath,\n serveNodeBuild,\n} from \"./serve\";\nexport type {\n NodeBuildContext,\n NodeBuildPageOptions,\n ServeNodeBuildEnvironment,\n ServeNodeBuildOptions,\n} from \"./serve\";\nexport {\n renderNodePageResponse,\n renderStreamingPageResponse,\n} from \"./streaming\";\nexport type {\n HttpScheme,\n NodeOriginPolicy,\n ToWebRequestOptions,\n TrustProxy,\n} from \"./http\";\nexport type { StaticFileHandler, StaticFileHandlerOptions } from \"./static\";\n\nexport const nodeAdapter = defineAdapter({\n name: \"node\",\n capabilities: {\n backgroundLifetime: true,\n crossOriginIsolationHeaders: true,\n nonceInjection: true,\n streaming: true,\n },\n});\n\nexport type NodeRequestListener = (\n request: IncomingMessage,\n response: ServerResponse,\n) => void;\n\nexport type NodeRequestListenerOptions = import(\"./http\").NodeOriginPolicy & {\n handler: RequestHandler;\n onError?: (error: unknown, request: IncomingMessage) => void;\n static?: StaticFileHandler | StaticFileHandlerOptions;\n};\n\nexport type NodeServerTimeouts = {\n headersTimeout: number;\n keepAliveTimeout: number;\n requestTimeout: number;\n};\n\nexport type NodeShutdownSignal = \"SIGINT\" | \"SIGTERM\";\nexport type NodeServerState = \"draining\" | \"ready\" | \"stopped\";\n\nexport type NodeGracefulShutdownOptions = {\n gracePeriod?: number;\n onBackgroundError?: (error: unknown) => void;\n onStateChange?: (state: NodeServerState) => void;\n signals?: readonly NodeShutdownSignal[];\n};\n\nexport type NodeServerOptions = NodeRequestListenerOptions & {\n readyPath?: string;\n shutdown?: NodeGracefulShutdownOptions;\n timeouts?: Partial<NodeServerTimeouts>;\n};\n\nexport type NodeServer = Server & {\n isReady: () => boolean;\n shutdown: () => Promise<void>;\n waitUntil: (promise: Promise<unknown>) => void;\n};\n\nexport const defaultNodeServerTimeouts = {\n headersTimeout: 66_000,\n keepAliveTimeout: 65_000,\n requestTimeout: 300_000,\n} as const satisfies NodeServerTimeouts;\n\nconst defaultShutdownGracePeriod = 30_000;\n\nexport function createNodeRequestListener(\n options: NodeRequestListenerOptions,\n): NodeRequestListener {\n validateNodeOriginPolicy(options);\n const serveStaticFile = toStaticFileHandler(options.static);\n const onError = options.onError ?? defaultOnError;\n\n return function handleNodeRequest(request, response) {\n const connection = createRequestAbort(request, response);\n\n void respond(request, response, connection.signal)\n .catch((error: unknown) => {\n if (connection.signal.aborted) {\n return;\n }\n\n onError(error, request);\n writeServerError(response);\n })\n .finally(connection.cleanup);\n };\n\n async function respond(\n request: IncomingMessage,\n response: ServerResponse,\n signal: AbortSignal,\n ) {\n let webRequest: Request;\n\n try {\n webRequest = toWebRequest(request, {\n allowedHosts: options.allowedHosts,\n signal,\n trustProxy: options.trustProxy,\n });\n } catch (error) {\n if (error instanceof UnsupportedMethodError) {\n writeNotImplemented(response);\n return;\n }\n\n if (error instanceof UntrustedHostError) {\n writeMisdirectedRequest(response);\n return;\n }\n\n throw error;\n }\n\n const staticResponse = await serveStaticFile?.(webRequest);\n\n await writeWebResponse(\n response,\n staticResponse ?? (await options.handler(webRequest)),\n );\n }\n}\n\nfunction createRequestAbort(\n request: IncomingMessage,\n response: ServerResponse,\n) {\n const controller = new AbortController();\n const abort = () => {\n if (!controller.signal.aborted) {\n controller.abort(new DOMException(\"Client disconnected.\", \"AbortError\"));\n }\n };\n const abortPrematureResponse = () => {\n if (!response.writableFinished) {\n abort();\n }\n };\n\n request.once(\"aborted\", abort);\n response.once(\"close\", abortPrematureResponse);\n\n return {\n cleanup() {\n request.off(\"aborted\", abort);\n response.off(\"close\", abortPrematureResponse);\n },\n signal: controller.signal,\n };\n}\n\nfunction writeMisdirectedRequest(response: ServerResponse) {\n response.statusCode = 421;\n response.setHeader(\"content-type\", \"text/plain; charset=utf-8\");\n response.end(\"Misdirected Request\");\n}\n\nexport function createNodeServer(\n options: NodeServerOptions,\n): NodeServer {\n const timeouts = normalizeNodeServerTimeouts(options.timeouts);\n const readyPath = normalizeReadyPath(options.readyPath);\n // The readiness answer needs the server the framework has not created yet.\n // The closure reads it after listen, so the later binding is always set.\n const handler: RequestHandler = readyPath\n ? async (request) => {\n if (new URL(request.url).pathname !== readyPath) {\n return options.handler(request);\n }\n\n const ready = server.isReady();\n\n return new Response(ready ? \"ready\" : \"draining\", {\n headers: {\n \"cache-control\": \"no-store\",\n \"content-type\": \"text/plain; charset=utf-8\",\n },\n status: ready ? 200 : 503,\n });\n }\n : options.handler;\n // TYPE-EVIDENCE: createServer returns an http.Server that the framework manages as a node server. The cast adds the framework lifecycle type.\n const server = createServer(\n createNodeRequestListener({ ...options, handler }),\n ) as NodeServer;\n server.keepAliveTimeout = timeouts.keepAliveTimeout;\n server.headersTimeout = timeouts.headersTimeout;\n server.requestTimeout = timeouts.requestTimeout;\n\n return attachNodeServerLifecycle(server, options.shutdown);\n}\n\nfunction normalizeReadyPath(configured: string | undefined) {\n if (configured === undefined) {\n return undefined;\n }\n\n if (!configured.startsWith(\"/\") || configured.includes(\"?\")) {\n throw new Error(\n \"Demiurge Node readyPath must be an absolute path without a query string.\",\n );\n }\n\n return configured;\n}\n\nfunction normalizeNodeServerTimeouts(\n configured: Partial<NodeServerTimeouts> | undefined,\n) {\n const timeouts = {\n ...defaultNodeServerTimeouts,\n ...configured,\n } satisfies NodeServerTimeouts;\n\n for (const [name, value] of Object.entries(timeouts)) {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new Error(\n `Demiurge Node ${name} must be a positive integer in milliseconds.`,\n );\n }\n }\n\n if (timeouts.headersTimeout <= timeouts.keepAliveTimeout) {\n throw new Error(\n \"Demiurge Node headersTimeout must be greater than keepAliveTimeout.\",\n );\n }\n\n return timeouts;\n}\n\nfunction attachNodeServerLifecycle(\n server: NodeServer,\n options: NodeGracefulShutdownOptions | undefined,\n) {\n const gracePeriod = options?.gracePeriod ?? defaultShutdownGracePeriod;\n\n if (!Number.isSafeInteger(gracePeriod) || gracePeriod < 0) {\n throw new Error(\n \"Demiurge Node shutdown gracePeriod must be a non-negative integer in milliseconds.\",\n );\n }\n\n let draining = false;\n let shutdownPromise: Promise<void> | undefined;\n let checkShutdownCompletion: (() => void) | undefined;\n const signalHandlers = new Map<NodeShutdownSignal, () => void>();\n const activeResponses = new Map<Socket, number>();\n const backgroundTasks = new Set<Promise<void>>();\n\n server.on(\"connection\", (socket) => {\n activeResponses.set(socket, 0);\n socket.once(\"close\", () => activeResponses.delete(socket));\n });\n server.on(\"request\", (_request, response) => {\n const socket = response.socket;\n\n if (!socket) {\n return;\n }\n\n activeResponses.set(socket, (activeResponses.get(socket) ?? 0) + 1);\n let settled = false;\n const settle = () => {\n if (settled) {\n return;\n }\n\n settled = true;\n const remaining = Math.max(0, (activeResponses.get(socket) ?? 1) - 1);\n activeResponses.set(socket, remaining);\n\n if (draining && remaining === 0) {\n socket.destroy();\n }\n };\n response.once(\"finish\", settle);\n response.once(\"close\", settle);\n });\n\n server.isReady = () => server.listening && !draining;\n server.waitUntil = (promise) => {\n const tracked = Promise.resolve(promise)\n .catch((error: unknown) => {\n try {\n (options?.onBackgroundError ?? defaultOnError)(error);\n } catch (reportingError) {\n defaultOnError(reportingError);\n }\n })\n .then(() => undefined)\n .finally(() => {\n backgroundTasks.delete(tracked);\n checkShutdownCompletion?.();\n });\n backgroundTasks.add(tracked);\n };\n server.shutdown = () => {\n if (shutdownPromise) {\n return shutdownPromise;\n }\n\n draining = true;\n options?.onStateChange?.(\"draining\");\n shutdownPromise = new Promise<void>((resolveShutdown, rejectShutdown) => {\n let closeError: Error | undefined;\n let deadlineReached = false;\n let serverClosed = false;\n let settled = false;\n const forceTimer = setTimeout(() => {\n deadlineReached = true;\n server.closeAllConnections();\n completeShutdown();\n }, gracePeriod);\n\n server.close((error) => {\n // TYPE-EVIDENCE: Node close callbacks pass an error with an optional code. The cast reads that code to detect an ordinary shutdown condition.\n if (error && (error as NodeJS.ErrnoException).code !== \"ERR_SERVER_NOT_RUNNING\") {\n closeError = error;\n }\n\n serverClosed = true;\n completeShutdown();\n });\n server.closeIdleConnections();\n closeTrackedIdleConnections();\n // A response can finish in the same turn shutdown begins and transition\n // from active to idle just after the first sweep.\n setImmediate(() => {\n server.closeIdleConnections();\n closeTrackedIdleConnections();\n });\n\n checkShutdownCompletion = completeShutdown;\n\n function completeShutdown() {\n if (\n settled ||\n !serverClosed ||\n (!deadlineReached && backgroundTasks.size > 0)\n ) {\n return;\n }\n\n settled = true;\n checkShutdownCompletion = undefined;\n clearTimeout(forceTimer);\n removeSignalHandlers();\n options?.onStateChange?.(\"stopped\");\n\n if (closeError) {\n rejectShutdown(closeError);\n return;\n }\n\n resolveShutdown();\n }\n });\n\n return shutdownPromise;\n };\n\n server.on(\"listening\", () => options?.onStateChange?.(\"ready\"));\n\n for (const signal of new Set(options?.signals ?? [])) {\n const handler = () => {\n void server.shutdown().catch(defaultOnError);\n };\n signalHandlers.set(signal, handler);\n process.once(signal, handler);\n }\n\n server.once(\"close\", removeSignalHandlers);\n\n return server;\n\n function removeSignalHandlers() {\n for (const [signal, handler] of signalHandlers) {\n process.off(signal, handler);\n }\n\n signalHandlers.clear();\n }\n\n function closeTrackedIdleConnections() {\n for (const [socket, count] of activeResponses) {\n if (count === 0) {\n socket.destroy();\n }\n }\n }\n}\n\nfunction toStaticFileHandler(\n value: StaticFileHandler | StaticFileHandlerOptions | undefined,\n) {\n if (!value) {\n return undefined;\n }\n\n return typeof value === \"function\" ? value : createStaticFileHandler(value);\n}\n\nfunction defaultOnError(error: unknown) {\n console.error(error);\n}\n\n// The body stays generic on purpose. A stack trace here would hand an attacker\n// file paths and framework internals for free.\nfunction writeServerError(response: ServerResponse) {\n if (response.headersSent) {\n response.destroy();\n return;\n }\n\n response.statusCode = 500;\n response.setHeader(\"content-type\", \"text/plain; charset=utf-8\");\n response.end(\"Internal Server Error\");\n}\n"],"names":["defaultExcludedPaths","createStaticFileHandler","options","root","resolve","realRoot","realpath","prefix","normalizePrefix","isExcluded","defaultExcluded","isImmutable","defaultImmutable","request","filePath","resolveFilePath","toRelativePath","opened","openStaticFile","safeRealRoot","file","stats","etag","createWeakEtag","lastModified","headers","fileNameOf","IMMUTABLE_FILE_CACHE_CONTROL","REVALIDATED_FILE_CACHE_CONTROL","contentTypeOf","isNotModified","range","canApplyRange","parseRange","contentLength","Readable","size","mtimeMs","ifNoneMatch","candidate","weakEtagValue","ifModifiedSince","since","value","header","match","suffixLength","start","requestedEnd","ifRange","date","pathname","decoded","sep","hasNoSymlinkComponents","resolvedTarget","isPathInside","noFollow","constants","open","parts","relative","current","part","join","lstat","fileName","isContentHashedFileName","path","contentTypeForExtension","extname","defaultNodeBuildClientDir","defaultNodeBuildReadyPath","serveNodeBuild","environment","fileURLToPath","manifest","parseClientManifest","readFile","host","port","resolvePort","allowedHosts","resolveAllowedHosts","name","readyPath","pendingWaitUntil","context","renderNodePageResponse","promise","handler","server","createNodeServer","resolveStatic","resolveListen","rejectListen","address","boundPort","configured","fallback","fromEnvironment","resolved","nodeAdapter","defineAdapter","defaultNodeServerTimeouts","defaultShutdownGracePeriod","createNodeRequestListener","validateNodeOriginPolicy","serveStaticFile","toStaticFileHandler","onError","defaultOnError","response","connection","createRequestAbort","respond","error","writeServerError","signal","webRequest","toWebRequest","UnsupportedMethodError","writeNotImplemented","UntrustedHostError","writeMisdirectedRequest","staticResponse","writeWebResponse","controller","abort","abortPrematureResponse","timeouts","normalizeNodeServerTimeouts","normalizeReadyPath","ready","createServer","attachNodeServerLifecycle","gracePeriod","draining","shutdownPromise","checkShutdownCompletion","signalHandlers","activeResponses","backgroundTasks","socket","_request","settled","settle","remaining","tracked","reportingError","resolveShutdown","rejectShutdown","closeError","deadlineReached","serverClosed","forceTimer","completeShutdown","closeTrackedIdleConnections","removeSignalHandlers","count"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/node/static.ts","../../src/node/serve.ts","../../src/node/index.ts"],"sourcesContent":["import { constants } from \"node:fs\";\nimport { lstat, open, realpath } from \"node:fs/promises\";\nimport { extname, join, relative, resolve, sep } from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport {\n contentTypeForExtension,\n IMMUTABLE_FILE_CACHE_CONTROL,\n isContentHashedFileName,\n REVALIDATED_FILE_CACHE_CONTROL,\n} from \"../static-files\";\n\nexport type StaticFileHandler = (request: Request) => Promise<Response | null>;\n\nexport type StaticFileHandlerOptions = {\n // Receives the file's path relative to `root`, always \"/\"-separated, so a\n // predicate can distinguish `index.html` from `docs/index.html`.\n exclude?: (path: string) => boolean;\n immutable?: (fileName: string) => boolean;\n prefix?: string;\n root: string;\n};\n\n// A null result keeps the handler composable. It means that the request does not\n// identify an owned file. The route pipeline owns all other responses, including\n// the 404 body and security headers. A traversal attempt gives the same result.\n// Plain static requests must not access the framework build output. The output\n// includes the SPA shell and the Node configuration manifest. The route pipeline\n// serves the shell and applies the `@policy.ts` headers. The server never serves\n// `demiurge-manifest.json` publicly. This exclusion applies only to the two root\n// files. An application can serve a nested file such as `docs/index.html`.\nconst defaultExcludedPaths = new Set([\"demiurge-manifest.json\", \"index.html\"]);\n\nexport function createStaticFileHandler(\n options: StaticFileHandlerOptions,\n): StaticFileHandler {\n const root = resolve(options.root);\n const realRoot = realpath(root);\n const prefix = normalizePrefix(options.prefix);\n const isExcluded = options.exclude ?? defaultExcluded;\n const isImmutable = options.immutable ?? defaultImmutable;\n\n return async function handleStaticFile(request) {\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n return null;\n }\n\n const filePath = resolveFilePath(\n root,\n prefix,\n new URL(request.url).pathname,\n );\n\n if (!filePath || isExcluded(toRelativePath(root, filePath))) {\n return null;\n }\n\n const opened = await openStaticFile(root, await safeRealRoot(realRoot), filePath);\n\n if (!opened) {\n return null;\n }\n\n const { file, stats } = opened;\n\n const etag = createWeakEtag(stats.size, stats.mtimeMs);\n const lastModified = stats.mtime.toUTCString();\n const headers = new Headers({\n \"accept-ranges\": \"bytes\",\n \"cache-control\": isImmutable(fileNameOf(filePath))\n ? IMMUTABLE_FILE_CACHE_CONTROL\n : REVALIDATED_FILE_CACHE_CONTROL,\n \"content-length\": String(stats.size),\n \"content-type\": contentTypeOf(filePath),\n \"cross-origin-resource-policy\": \"same-origin\",\n etag,\n \"last-modified\": lastModified,\n \"x-content-type-options\": \"nosniff\",\n });\n\n if (isNotModified(request, etag, stats.mtimeMs)) {\n await file.close();\n headers.delete(\"content-length\");\n headers.delete(\"content-type\");\n\n return new Response(null, { headers, status: 304 });\n }\n\n const range = canApplyRange(request, stats.mtimeMs)\n ? parseRange(request.headers.get(\"range\"), stats.size)\n : null;\n\n if (range === \"unsatisfiable\") {\n await file.close();\n headers.delete(\"content-length\");\n headers.delete(\"content-type\");\n headers.set(\"content-range\", `bytes */${stats.size}`);\n\n return new Response(null, { headers, status: 416 });\n }\n\n if (range) {\n const contentLength = range.end - range.start + 1;\n headers.set(\"content-length\", String(contentLength));\n headers.set(\"content-range\", `bytes ${range.start}-${range.end}/${stats.size}`);\n\n if (request.method === \"HEAD\") {\n await file.close();\n return new Response(null, { headers, status: 206 });\n }\n\n // TYPE-EVIDENCE: Readable.toWeb returns a web stream that matches the DOM ReadableStream body type.\n return new Response(\n Readable.toWeb(\n file.createReadStream({ end: range.end, start: range.start }),\n ) as ReadableStream,\n { headers, status: 206 },\n );\n }\n\n if (request.method === \"HEAD\") {\n await file.close();\n return new Response(null, { headers });\n }\n\n // TYPE-EVIDENCE: Readable.toWeb returns a web stream that matches the DOM ReadableStream body type.\n return new Response(\n Readable.toWeb(file.createReadStream()) as ReadableStream,\n { headers },\n );\n };\n}\n\nfunction createWeakEtag(size: number, mtimeMs: number) {\n return `W/\"${size.toString(16)}-${Math.trunc(mtimeMs).toString(16)}\"`;\n}\n\nfunction isNotModified(request: Request, etag: string, mtimeMs: number) {\n const ifNoneMatch = request.headers.get(\"if-none-match\");\n\n // If-None-Match takes precedence over If-Modified-Since. Weak comparison is\n // correct for GET/HEAD cache validation, so W/ is removed from both sides.\n if (ifNoneMatch !== null) {\n return ifNoneMatch.trim() === \"*\" || ifNoneMatch.split(\",\").some(\n (candidate) => weakEtagValue(candidate) === weakEtagValue(etag),\n );\n }\n\n const ifModifiedSince = request.headers.get(\"if-modified-since\");\n\n if (ifModifiedSince === null) {\n return false;\n }\n\n const since = Date.parse(ifModifiedSince);\n\n // HTTP dates have one-second precision. Compare the file timestamp at the\n // same precision rather than making a freshly-written file look newer.\n return Number.isFinite(since) && Math.floor(mtimeMs / 1000) * 1000 <= since;\n}\n\nfunction weakEtagValue(value: string) {\n return value.trim().replace(/^W\\//i, \"\");\n}\n\ntype ByteRange = { end: number; start: number };\n\nfunction parseRange(\n header: string | null,\n size: number,\n): ByteRange | \"unsatisfiable\" | null {\n if (header === null) {\n return null;\n }\n\n const match = /^bytes=(\\d*)-(\\d*)$/.exec(header.trim());\n\n // A server that does not support the requested unit, syntax, or multiple\n // ranges ignores Range and returns the complete representation. A 416 is\n // reserved for a valid byte-range set that cannot select this resource.\n if (!match || (!match[1] && !match[2])) {\n return null;\n }\n\n if (size === 0) {\n return \"unsatisfiable\";\n }\n\n if (!match[1]) {\n const suffixLength = Number(match[2]);\n\n if (!Number.isSafeInteger(suffixLength) || suffixLength <= 0) {\n return null;\n }\n\n return { start: Math.max(0, size - suffixLength), end: size - 1 };\n }\n\n const start = Number(match[1]);\n const requestedEnd = match[2] ? Number(match[2]) : size - 1;\n\n if (!Number.isSafeInteger(start) || !Number.isSafeInteger(requestedEnd)) {\n return null;\n }\n\n if (start >= size) {\n return \"unsatisfiable\";\n }\n\n if (match[2] && requestedEnd < start) {\n return null;\n }\n\n return { start, end: Math.min(requestedEnd, size - 1) };\n}\n\nfunction canApplyRange(request: Request, mtimeMs: number) {\n const ifRange = request.headers.get(\"if-range\");\n\n if (ifRange === null) {\n return true;\n }\n\n // If-Range requires strong comparison for an entity-tag. This handler's\n // stat-derived validator is intentionally weak, so only an HTTP date can\n // authorize a partial response.\n if (ifRange.trim().startsWith('\"') || /^W\\//i.test(ifRange.trim())) {\n return false;\n }\n\n const date = Date.parse(ifRange);\n return Number.isFinite(date) && Math.floor(mtimeMs / 1000) * 1000 <= date;\n}\n\nfunction resolveFilePath(root: string, prefix: string, pathname: string) {\n let decoded: string;\n\n try {\n decoded = decodeURIComponent(pathname);\n } catch {\n return null;\n }\n\n // A null byte truncates the path for some system calls. A name such as\n // \"app.js\\0.txt\" could read a file that differs from the checked file.\n if (decoded.includes(\"\\0\")) {\n return null;\n }\n\n if (prefix) {\n if (!decoded.startsWith(prefix)) {\n return null;\n }\n\n decoded = decoded.slice(prefix.length - 1);\n }\n\n if (decoded.endsWith(\"/\")) {\n return null;\n }\n\n const candidate = resolve(root, `.${decoded}`);\n\n return candidate.startsWith(`${root}${sep}`) ? candidate : null;\n}\n\nasync function safeRealRoot(root: Promise<string>) {\n try {\n return await root;\n } catch {\n return null;\n }\n}\n\nasync function openStaticFile(\n root: string,\n realRoot: string | null,\n filePath: string,\n) {\n if (!realRoot || !(await hasNoSymlinkComponents(root, filePath))) {\n return null;\n }\n\n let resolvedTarget: string;\n\n try {\n resolvedTarget = await realpath(filePath);\n } catch {\n return null;\n }\n\n if (!isPathInside(realRoot, resolvedTarget)) {\n return null;\n }\n\n const noFollow =\n typeof constants.O_NOFOLLOW === \"number\" ? constants.O_NOFOLLOW : 0;\n let file: Awaited<ReturnType<typeof open>>;\n\n try {\n // O_NOFOLLOW closes the final-component race on platforms that expose it.\n // The component walk and realpath containment check cover directory links.\n file = await open(filePath, constants.O_RDONLY | noFollow);\n } catch {\n return null;\n }\n\n try {\n const stats = await file.stat();\n\n if (!stats.isFile()) {\n await file.close();\n return null;\n }\n\n return { file, stats };\n } catch {\n await file.close();\n return null;\n }\n}\n\nasync function hasNoSymlinkComponents(root: string, filePath: string) {\n const parts = relative(root, filePath).split(sep);\n let current = root;\n\n try {\n for (const part of parts) {\n current = join(current, part);\n\n if ((await lstat(current)).isSymbolicLink()) {\n return false;\n }\n }\n } catch {\n return false;\n }\n\n return true;\n}\n\nfunction isPathInside(root: string, candidate: string) {\n return candidate.startsWith(`${root}${sep}`);\n}\n\nfunction normalizePrefix(prefix: string | undefined) {\n if (!prefix || prefix === \"/\") {\n return \"\";\n }\n\n return `/${prefix.replace(/^\\/|\\/$/g, \"\")}/`;\n}\n\nfunction defaultImmutable(fileName: string) {\n return isContentHashedFileName(fileName);\n}\n\nfunction defaultExcluded(path: string) {\n return defaultExcludedPaths.has(path);\n}\n\nfunction toRelativePath(root: string, filePath: string) {\n return filePath.slice(root.length + 1).split(sep).join(\"/\");\n}\n\nfunction fileNameOf(filePath: string) {\n return filePath.slice(filePath.lastIndexOf(sep) + 1);\n}\n\nfunction contentTypeOf(filePath: string) {\n return contentTypeForExtension(extname(filePath));\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { parseClientManifest } from \"../manifest\";\nimport type { PageRenderer, RequestHandler } from \"../server\";\nimport {\n createNodeServer,\n type NodeGracefulShutdownOptions,\n type NodeRequestListenerOptions,\n type NodeServer,\n type NodeServerTimeouts,\n} from \"./index\";\nimport type { TrustProxy } from \"./http\";\nimport { renderNodePageResponse } from \"./streaming\";\nimport type { StaticFileHandler, StaticFileHandlerOptions } from \"./static\";\n\nexport type NodeBuildPageOptions = {\n clientEntry: string;\n renderPage: PageRenderer;\n styles: string[];\n};\n\nexport type NodeBuildContext = {\n page: NodeBuildPageOptions;\n root: string;\n waitUntil: (promise: Promise<unknown>) => void;\n};\n\nexport type ServeNodeBuildEnvironment = Record<string, string | undefined>;\n\nexport type ServeNodeBuildOptions = {\n allowedHosts?: readonly string[];\n base: string | URL;\n clientDir?: string;\n createHandler: (\n context: NodeBuildContext,\n ) => RequestHandler | Promise<RequestHandler>;\n env?: ServeNodeBuildEnvironment;\n host?: string;\n name?: string;\n onError?: NodeRequestListenerOptions[\"onError\"];\n // When set, this replaces the default listen log entirely, so `name` is\n // not used.\n onListen?: (address: { host: string; port: number; server: NodeServer }) => void;\n port?: number;\n readyPath?: string | false;\n shutdown?: NodeGracefulShutdownOptions;\n // A caller that needs a font handler or an image optimizer in front of the\n // plain file handler returns the composed handler from this factory.\n static?:\n | StaticFileHandlerOptions\n | ((context: NodeBuildContext) => StaticFileHandler | StaticFileHandlerOptions);\n timeouts?: Partial<NodeServerTimeouts>;\n trustProxy?: TrustProxy;\n};\n\nexport const defaultNodeBuildClientDir = \"dist/client\";\nexport const defaultNodeBuildReadyPath = \"/.well-known/ready\";\n\n/**\n * Boot a built Demiurge app as one production Node process.\n *\n * The helper reads the browser manifest, resolves the host allowlist and the\n * bind address from the environment, serves hashed assets from the client\n * build, answers the readiness path, and listens.\n */\nexport async function serveNodeBuild(\n options: ServeNodeBuildOptions,\n): Promise<NodeServer> {\n const environment = options.env ?? process.env;\n const root = fileURLToPath(\n new URL(options.clientDir ?? defaultNodeBuildClientDir, options.base),\n );\n const manifest = parseClientManifest(\n await readFile(join(root, \"demiurge-manifest.json\"), \"utf8\"),\n );\n const host = options.host ?? environment.HOST ?? \"127.0.0.1\";\n const port = resolvePort(environment.PORT, options.port);\n const allowedHosts = resolveAllowedHosts(\n options.allowedHosts,\n environment.ALLOWED_HOSTS,\n host,\n );\n const name = options.name ?? \"Demiurge Node server\";\n const readyPath = options.readyPath === false\n ? undefined\n : options.readyPath ?? defaultNodeBuildReadyPath;\n\n // A caller's createHandler may call waitUntil synchronously (for example to\n // warm a cache at startup), before the server exists. Buffer those promises\n // here and flush them into the real server once it is constructed, so an\n // early call just works instead of throwing.\n const pendingWaitUntil: Promise<unknown>[] = [];\n const context: NodeBuildContext = {\n page: {\n clientEntry: manifest.clientEntry,\n renderPage: renderNodePageResponse,\n styles: manifest.styles,\n },\n root,\n waitUntil(promise) {\n pendingWaitUntil.push(promise);\n },\n };\n const handler = await options.createHandler(context);\n\n const server = createNodeServer({\n allowedHosts,\n handler,\n onError: options.onError,\n readyPath,\n shutdown: options.shutdown,\n static: resolveStatic(options.static, context),\n timeouts: options.timeouts,\n trustProxy: options.trustProxy,\n });\n\n context.waitUntil = (promise) => {\n server.waitUntil(promise);\n };\n for (const promise of pendingWaitUntil) {\n server.waitUntil(promise);\n }\n\n await new Promise<void>((resolveListen, rejectListen) => {\n server.once(\"error\", rejectListen);\n server.listen(port, host, () => {\n server.off(\"error\", rejectListen);\n resolveListen();\n });\n });\n\n const address = server.address();\n // Port 0 asks the operating system for a free port. Report the bound port so\n // a caller can reach the server.\n const boundPort = typeof address === \"object\" && address\n ? address.port\n : port;\n\n if (options.onListen) {\n options.onListen({ host, port: boundPort, server });\n } else {\n console.log(`${name} listening on http://${host}:${boundPort}`);\n }\n\n return server;\n}\n\nfunction resolvePort(configured: string | undefined, fallback: number | undefined) {\n const value = configured ?? String(fallback ?? 4173);\n const port = Number(value);\n\n if (!Number.isSafeInteger(port) || port < 0 || port > 65_535) {\n throw new Error(\"Demiurge Node PORT must be an integer from 0 through 65535.\");\n }\n\n return port;\n}\n\nfunction resolveAllowedHosts(\n configured: readonly string[] | undefined,\n fromEnvironment: string | undefined,\n host: string,\n) {\n if (configured) {\n return configured;\n }\n\n if (fromEnvironment) {\n return fromEnvironment\n .split(\",\")\n .map((value) => value.trim())\n .filter(Boolean);\n }\n\n return host === \"localhost\" ? [host] : [host, \"localhost\"];\n}\n\nfunction resolveStatic(\n configured: ServeNodeBuildOptions[\"static\"],\n context: NodeBuildContext,\n) {\n if (!configured) {\n return { root: context.root };\n }\n\n if (typeof configured !== \"function\") {\n return configured;\n }\n\n const resolved = configured(context);\n\n // A factory returns a StaticFileHandler or a StaticFileHandlerOptions\n // object, both synchronously. A StaticFileHandler passed directly instead\n // (the shape createNodeServer's own `static` option accepts) is an async\n // function. Calling it here as a factory always returns a Promise. That\n // catches the mistake early, with a clear message, instead of a failure\n // deep inside the static file handler.\n if (resolved instanceof Promise) {\n throw new TypeError(\n \"The `static` option must be a StaticFileHandlerOptions object or a \" +\n \"factory `(context) => StaticFileHandler | StaticFileHandlerOptions`. \" +\n \"It looks like a StaticFileHandler was passed directly. Wrap it: \" +\n \"`static: () => yourHandler`.\",\n );\n }\n\n return resolved;\n}\n","import { createServer } from \"node:http\";\nimport type { IncomingMessage, Server, ServerResponse } from \"node:http\";\nimport type { Socket } from \"node:net\";\nimport { defineAdapter } from \"../adapter\";\nimport type { RequestHandler } from \"../server\";\nimport {\n UntrustedHostError,\n UnsupportedMethodError,\n toWebRequest,\n validateNodeOriginPolicy,\n writeNotImplemented,\n writeWebResponse,\n} from \"./http\";\nimport { createStaticFileHandler } from \"./static\";\nimport type { StaticFileHandler, StaticFileHandlerOptions } from \"./static\";\n\nexport {\n ConsumedRequestBodyError,\n UntrustedHostError,\n UnsupportedMethodError,\n toHeaders,\n toWebRequest,\n validateNodeOriginPolicy,\n writeWebResponse,\n} from \"./http\";\nexport { createFontAssetHandler } from \"./font\";\nexport type { FontAssetHandlerOptions } from \"./font\";\nexport { createImageOptimizer } from \"./image\";\nexport type {\n ImageOptimizerFetch,\n ImageOptimizerOptions,\n} from \"./image\";\nexport { createStaticFileHandler } from \"./static\";\nexport {\n defaultNodeBuildClientDir,\n defaultNodeBuildReadyPath,\n serveNodeBuild,\n} from \"./serve\";\nexport type {\n NodeBuildContext,\n NodeBuildPageOptions,\n ServeNodeBuildEnvironment,\n ServeNodeBuildOptions,\n} from \"./serve\";\nexport {\n renderNodePageResponse,\n renderStreamingPageResponse,\n} from \"./streaming\";\nexport type {\n HttpScheme,\n NodeOriginPolicy,\n ToWebRequestOptions,\n TrustProxy,\n} from \"./http\";\nexport type { StaticFileHandler, StaticFileHandlerOptions } from \"./static\";\n\n// `requestTimeoutEnforcement` is true because `createNodeServer` sets a real\n// `headersTimeout`, `keepAliveTimeout`, and `requestTimeout` on the\n// `http.Server`. Those bound how long a connection can stay open while the\n// shared pipeline reads a body without a `Content-Length`. The shared\n// pipeline itself does not own that bound.\nexport const nodeAdapter = defineAdapter({\n name: \"node\",\n capabilities: {\n backgroundLifetime: true,\n crossOriginIsolationHeaders: true,\n nonceInjection: true,\n requestTimeoutEnforcement: true,\n streaming: true,\n },\n});\n\nexport type NodeRequestListener = (\n request: IncomingMessage,\n response: ServerResponse,\n) => void;\n\nexport type NodeRequestListenerOptions = import(\"./http\").NodeOriginPolicy & {\n handler: RequestHandler;\n onError?: (error: unknown, request: IncomingMessage) => void;\n static?: StaticFileHandler | StaticFileHandlerOptions;\n};\n\nexport type NodeServerTimeouts = {\n headersTimeout: number;\n keepAliveTimeout: number;\n requestTimeout: number;\n};\n\nexport type NodeShutdownSignal = \"SIGINT\" | \"SIGTERM\";\nexport type NodeServerState = \"draining\" | \"ready\" | \"stopped\";\n\nexport type NodeGracefulShutdownOptions = {\n gracePeriod?: number;\n onBackgroundError?: (error: unknown) => void;\n onStateChange?: (state: NodeServerState) => void;\n signals?: readonly NodeShutdownSignal[];\n};\n\nexport type NodeServerOptions = NodeRequestListenerOptions & {\n readyPath?: string;\n shutdown?: NodeGracefulShutdownOptions;\n timeouts?: Partial<NodeServerTimeouts>;\n};\n\nexport type NodeServer = Server & {\n isReady: () => boolean;\n shutdown: () => Promise<void>;\n waitUntil: (promise: Promise<unknown>) => void;\n};\n\nexport const defaultNodeServerTimeouts = {\n headersTimeout: 66_000,\n keepAliveTimeout: 65_000,\n requestTimeout: 300_000,\n} as const satisfies NodeServerTimeouts;\n\nconst defaultShutdownGracePeriod = 30_000;\n\nexport function createNodeRequestListener(\n options: NodeRequestListenerOptions,\n): NodeRequestListener {\n validateNodeOriginPolicy(options);\n const serveStaticFile = toStaticFileHandler(options.static);\n const onError = options.onError ?? defaultOnError;\n\n return function handleNodeRequest(request, response) {\n const connection = createRequestAbort(request, response);\n\n void respond(request, response, connection.signal)\n .catch((error: unknown) => {\n if (connection.signal.aborted) {\n return;\n }\n\n onError(error, request);\n writeServerError(response);\n })\n .finally(connection.cleanup);\n };\n\n async function respond(\n request: IncomingMessage,\n response: ServerResponse,\n signal: AbortSignal,\n ) {\n let webRequest: Request;\n\n try {\n webRequest = toWebRequest(request, {\n allowedHosts: options.allowedHosts,\n signal,\n trustProxy: options.trustProxy,\n });\n } catch (error) {\n if (error instanceof UnsupportedMethodError) {\n writeNotImplemented(response);\n return;\n }\n\n if (error instanceof UntrustedHostError) {\n writeMisdirectedRequest(response);\n return;\n }\n\n throw error;\n }\n\n const staticResponse = await serveStaticFile?.(webRequest);\n\n await writeWebResponse(\n response,\n staticResponse ?? (await options.handler(webRequest)),\n );\n }\n}\n\nfunction createRequestAbort(\n request: IncomingMessage,\n response: ServerResponse,\n) {\n const controller = new AbortController();\n const abort = () => {\n if (!controller.signal.aborted) {\n controller.abort(new DOMException(\"Client disconnected.\", \"AbortError\"));\n }\n };\n const abortPrematureResponse = () => {\n if (!response.writableFinished) {\n abort();\n }\n };\n\n request.once(\"aborted\", abort);\n response.once(\"close\", abortPrematureResponse);\n\n return {\n cleanup() {\n request.off(\"aborted\", abort);\n response.off(\"close\", abortPrematureResponse);\n },\n signal: controller.signal,\n };\n}\n\nfunction writeMisdirectedRequest(response: ServerResponse) {\n response.statusCode = 421;\n response.setHeader(\"content-type\", \"text/plain; charset=utf-8\");\n response.end(\"Misdirected Request\");\n}\n\nexport function createNodeServer(\n options: NodeServerOptions,\n): NodeServer {\n const timeouts = normalizeNodeServerTimeouts(options.timeouts);\n const readyPath = normalizeReadyPath(options.readyPath);\n // The readiness answer needs the server the framework has not created yet.\n // The closure reads it after listen, so the later binding is always set.\n const handler: RequestHandler = readyPath\n ? async (request) => {\n if (new URL(request.url).pathname !== readyPath) {\n return options.handler(request);\n }\n\n const ready = server.isReady();\n\n return new Response(ready ? \"ready\" : \"draining\", {\n headers: {\n \"cache-control\": \"no-store\",\n \"content-type\": \"text/plain; charset=utf-8\",\n },\n status: ready ? 200 : 503,\n });\n }\n : options.handler;\n // TYPE-EVIDENCE: createServer returns an http.Server that the framework manages as a node server. The cast adds the framework lifecycle type.\n const server = createServer(\n createNodeRequestListener({ ...options, handler }),\n ) as NodeServer;\n server.keepAliveTimeout = timeouts.keepAliveTimeout;\n server.headersTimeout = timeouts.headersTimeout;\n server.requestTimeout = timeouts.requestTimeout;\n\n return attachNodeServerLifecycle(server, options.shutdown);\n}\n\nfunction normalizeReadyPath(configured: string | undefined) {\n if (configured === undefined) {\n return undefined;\n }\n\n if (!configured.startsWith(\"/\") || configured.includes(\"?\")) {\n throw new Error(\n \"Demiurge Node readyPath must be an absolute path without a query string.\",\n );\n }\n\n return configured;\n}\n\nfunction normalizeNodeServerTimeouts(\n configured: Partial<NodeServerTimeouts> | undefined,\n) {\n const timeouts = {\n ...defaultNodeServerTimeouts,\n ...configured,\n } satisfies NodeServerTimeouts;\n\n for (const [name, value] of Object.entries(timeouts)) {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new Error(\n `Demiurge Node ${name} must be a positive integer in milliseconds.`,\n );\n }\n }\n\n if (timeouts.headersTimeout <= timeouts.keepAliveTimeout) {\n throw new Error(\n \"Demiurge Node headersTimeout must be greater than keepAliveTimeout.\",\n );\n }\n\n return timeouts;\n}\n\nfunction attachNodeServerLifecycle(\n server: NodeServer,\n options: NodeGracefulShutdownOptions | undefined,\n) {\n const gracePeriod = options?.gracePeriod ?? defaultShutdownGracePeriod;\n\n if (!Number.isSafeInteger(gracePeriod) || gracePeriod < 0) {\n throw new Error(\n \"Demiurge Node shutdown gracePeriod must be a non-negative integer in milliseconds.\",\n );\n }\n\n let draining = false;\n let shutdownPromise: Promise<void> | undefined;\n let checkShutdownCompletion: (() => void) | undefined;\n const signalHandlers = new Map<NodeShutdownSignal, () => void>();\n const activeResponses = new Map<Socket, number>();\n const backgroundTasks = new Set<Promise<void>>();\n\n server.on(\"connection\", (socket) => {\n activeResponses.set(socket, 0);\n socket.once(\"close\", () => activeResponses.delete(socket));\n });\n server.on(\"request\", (_request, response) => {\n const socket = response.socket;\n\n if (!socket) {\n return;\n }\n\n activeResponses.set(socket, (activeResponses.get(socket) ?? 0) + 1);\n let settled = false;\n const settle = () => {\n if (settled) {\n return;\n }\n\n settled = true;\n const remaining = Math.max(0, (activeResponses.get(socket) ?? 1) - 1);\n activeResponses.set(socket, remaining);\n\n if (draining && remaining === 0) {\n socket.destroy();\n }\n };\n response.once(\"finish\", settle);\n response.once(\"close\", settle);\n });\n\n server.isReady = () => server.listening && !draining;\n server.waitUntil = (promise) => {\n const tracked = Promise.resolve(promise)\n .catch((error: unknown) => {\n try {\n (options?.onBackgroundError ?? defaultOnError)(error);\n } catch (reportingError) {\n defaultOnError(reportingError);\n }\n })\n .then(() => undefined)\n .finally(() => {\n backgroundTasks.delete(tracked);\n checkShutdownCompletion?.();\n });\n backgroundTasks.add(tracked);\n };\n server.shutdown = () => {\n if (shutdownPromise) {\n return shutdownPromise;\n }\n\n draining = true;\n options?.onStateChange?.(\"draining\");\n shutdownPromise = new Promise<void>((resolveShutdown, rejectShutdown) => {\n let closeError: Error | undefined;\n let deadlineReached = false;\n let serverClosed = false;\n let settled = false;\n const forceTimer = setTimeout(() => {\n deadlineReached = true;\n server.closeAllConnections();\n completeShutdown();\n }, gracePeriod);\n\n server.close((error) => {\n // TYPE-EVIDENCE: Node close callbacks pass an error with an optional code. The cast reads that code to detect an ordinary shutdown condition.\n if (error && (error as NodeJS.ErrnoException).code !== \"ERR_SERVER_NOT_RUNNING\") {\n closeError = error;\n }\n\n serverClosed = true;\n completeShutdown();\n });\n server.closeIdleConnections();\n closeTrackedIdleConnections();\n // A response can finish in the same turn shutdown begins and transition\n // from active to idle just after the first sweep.\n setImmediate(() => {\n server.closeIdleConnections();\n closeTrackedIdleConnections();\n });\n\n checkShutdownCompletion = completeShutdown;\n\n function completeShutdown() {\n if (\n settled ||\n !serverClosed ||\n (!deadlineReached && backgroundTasks.size > 0)\n ) {\n return;\n }\n\n settled = true;\n checkShutdownCompletion = undefined;\n clearTimeout(forceTimer);\n removeSignalHandlers();\n options?.onStateChange?.(\"stopped\");\n\n if (closeError) {\n rejectShutdown(closeError);\n return;\n }\n\n resolveShutdown();\n }\n });\n\n return shutdownPromise;\n };\n\n server.on(\"listening\", () => options?.onStateChange?.(\"ready\"));\n\n for (const signal of new Set(options?.signals ?? [])) {\n const handler = () => {\n void server.shutdown().catch(defaultOnError);\n };\n signalHandlers.set(signal, handler);\n process.once(signal, handler);\n }\n\n server.once(\"close\", removeSignalHandlers);\n\n return server;\n\n function removeSignalHandlers() {\n for (const [signal, handler] of signalHandlers) {\n process.off(signal, handler);\n }\n\n signalHandlers.clear();\n }\n\n function closeTrackedIdleConnections() {\n for (const [socket, count] of activeResponses) {\n if (count === 0) {\n socket.destroy();\n }\n }\n }\n}\n\nfunction toStaticFileHandler(\n value: StaticFileHandler | StaticFileHandlerOptions | undefined,\n) {\n if (!value) {\n return undefined;\n }\n\n return typeof value === \"function\" ? value : createStaticFileHandler(value);\n}\n\nfunction defaultOnError(error: unknown) {\n console.error(error);\n}\n\n// The body stays generic on purpose. A stack trace here would hand an attacker\n// file paths and framework internals for free.\nfunction writeServerError(response: ServerResponse) {\n if (response.headersSent) {\n response.destroy();\n return;\n }\n\n response.statusCode = 500;\n response.setHeader(\"content-type\", \"text/plain; charset=utf-8\");\n response.end(\"Internal Server Error\");\n}\n"],"names":["defaultExcludedPaths","createStaticFileHandler","options","root","resolve","realRoot","realpath","prefix","normalizePrefix","isExcluded","defaultExcluded","isImmutable","defaultImmutable","request","filePath","resolveFilePath","toRelativePath","opened","openStaticFile","safeRealRoot","file","stats","etag","createWeakEtag","lastModified","headers","fileNameOf","IMMUTABLE_FILE_CACHE_CONTROL","REVALIDATED_FILE_CACHE_CONTROL","contentTypeOf","isNotModified","range","canApplyRange","parseRange","contentLength","Readable","size","mtimeMs","ifNoneMatch","candidate","weakEtagValue","ifModifiedSince","since","value","header","match","suffixLength","start","requestedEnd","ifRange","date","pathname","decoded","sep","hasNoSymlinkComponents","resolvedTarget","isPathInside","noFollow","constants","open","parts","relative","current","part","join","lstat","fileName","isContentHashedFileName","path","contentTypeForExtension","extname","defaultNodeBuildClientDir","defaultNodeBuildReadyPath","serveNodeBuild","environment","fileURLToPath","manifest","parseClientManifest","readFile","host","port","resolvePort","allowedHosts","resolveAllowedHosts","name","readyPath","pendingWaitUntil","context","renderNodePageResponse","promise","handler","server","createNodeServer","resolveStatic","resolveListen","rejectListen","address","boundPort","configured","fallback","fromEnvironment","resolved","nodeAdapter","defineAdapter","defaultNodeServerTimeouts","defaultShutdownGracePeriod","createNodeRequestListener","validateNodeOriginPolicy","serveStaticFile","toStaticFileHandler","onError","defaultOnError","response","connection","createRequestAbort","respond","error","writeServerError","signal","webRequest","toWebRequest","UnsupportedMethodError","writeNotImplemented","UntrustedHostError","writeMisdirectedRequest","staticResponse","writeWebResponse","controller","abort","abortPrematureResponse","timeouts","normalizeNodeServerTimeouts","normalizeReadyPath","ready","createServer","attachNodeServerLifecycle","gracePeriod","draining","shutdownPromise","checkShutdownCompletion","signalHandlers","activeResponses","backgroundTasks","socket","_request","settled","settle","remaining","tracked","reportingError","resolveShutdown","rejectShutdown","closeError","deadlineReached","serverClosed","forceTimer","completeShutdown","closeTrackedIdleConnections","removeSignalHandlers","count"],"mappings":"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"}
|
package/dist/route/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { mutation, mutationInput, MutationValidationError, MUTATION_REQUEST_HEADER, MUTATION_REQUEST_VALUE, MUTATION_RESPONSE_MEDIA_TYPE, } from "./mutation";
|
|
2
2
|
export { page } from "./page";
|
|
3
3
|
export { defineMiddleware } from "./middleware";
|
|
4
|
+
export { assertSerializableValue, RouteSerializationError, } from "./serialization";
|
|
4
5
|
export { HTTP_ERROR_STATUSES, HttpError, httpError, isHttpError, } from "./http-error";
|
|
5
6
|
export { html, json, jsonl, notFound, redirect, response, serverTiming, sse, stream, text, toResponse, } from "./response";
|
|
6
7
|
export { webhook } from "./webhook";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/route/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,aAAa,EACb,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,mBAAmB,EACnB,SAAS,EACT,SAAS,EACT,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,GAAG,EACH,MAAM,EACN,IAAI,EACJ,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EACV,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,+BAA+B,EAC/B,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,6BAA6B,EAC7B,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,cAAc,EACd,WAAW,EACX,WAAW,EACX,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,qBAAqB,EACrB,0BAA0B,EAC1B,UAAU,EACV,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,cAAc,GACf,MAAM,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/route/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,aAAa,EACb,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,mBAAmB,EACnB,SAAS,EACT,SAAS,EACT,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,GAAG,EACH,MAAM,EACN,IAAI,EACJ,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EACV,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,+BAA+B,EAC/B,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,6BAA6B,EAC7B,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,cAAc,EACd,WAAW,EACX,WAAW,EACX,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,qBAAqB,EACrB,0BAA0B,EAC1B,UAAU,EACV,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,cAAc,GACf,MAAM,SAAS,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutation.d.ts","sourceRoot":"","sources":["../../src/route/mutation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,gBAAgB,EACjB,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EACV,UAAU,EACV,mBAAmB,EACpB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EAClB,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"mutation.d.ts","sourceRoot":"","sources":["../../src/route/mutation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The error that the framework reports for a browser payload that it cannot
|
|
3
|
+
* serialize.
|
|
4
|
+
*
|
|
5
|
+
* The message names the route and the field path. The message does not
|
|
6
|
+
* contain the value.
|
|
7
|
+
*/
|
|
8
|
+
export declare class RouteSerializationError extends Error {
|
|
9
|
+
readonly field?: string;
|
|
10
|
+
readonly route: string;
|
|
11
|
+
constructor(message: string, route: string, field?: string);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Proves that the framework can serialize a page route browser payload.
|
|
15
|
+
*
|
|
16
|
+
* The return value of a page `data` function is the browser payload. This
|
|
17
|
+
* check names the value that `JSON.stringify` cannot represent, so it
|
|
18
|
+
* matches exactly the failures that already occur: a circular reference and
|
|
19
|
+
* a `bigint` value. It does not add a check for a value that
|
|
20
|
+
* `JSON.stringify` already accepts or silently drops, such as `undefined`,
|
|
21
|
+
* a function, a symbol key, or a non-finite number.
|
|
22
|
+
*/
|
|
23
|
+
export declare function assertSerializableValue(value: unknown, route: string, path?: readonly string[], seen?: Set<object>): void;
|
|
24
|
+
//# sourceMappingURL=serialization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialization.d.ts","sourceRoot":"","sources":["../../src/route/serialization.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAEX,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;CAM3D;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,SAAS,MAAM,EAAO,EAC5B,IAAI,cAAoB,GACvB,IAAI,CA4CN"}
|
package/dist/route/webhook.d.ts
CHANGED
|
@@ -18,7 +18,12 @@ export declare const webhook: {
|
|
|
18
18
|
kind: "response";
|
|
19
19
|
response: (context: HttpRouteContext<string, Record<never, never>>) => Promise<Response>;
|
|
20
20
|
security: {
|
|
21
|
-
csrf:
|
|
21
|
+
csrf: {
|
|
22
|
+
origin: "framework";
|
|
23
|
+
reason: string;
|
|
24
|
+
source: string;
|
|
25
|
+
value: false;
|
|
26
|
+
};
|
|
22
27
|
};
|
|
23
28
|
};
|
|
24
29
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/route/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EAEb,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,KAAK,CAAC;AACnD,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAErE,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,GAAG;IAClD,OAAO,EAAE,UAAU,CAAC;IACpB,IAAI,EAAE,MAAM,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,OAAO,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,YAAY,CAAC,QAAQ,CAAC,CAAC;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,OAAO;kBACJ,kBAAkB
|
|
1
|
+
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/route/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EAEb,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,KAAK,CAAC;AACnD,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAErE,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,GAAG;IAClD,OAAO,EAAE,UAAU,CAAC;IACpB,IAAI,EAAE,MAAM,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,OAAO,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,YAAY,CAAC,QAAQ,CAAC,CAAC;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,OAAO;kBACJ,kBAAkB;;;;;;;;;;;;CAyCjC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/router/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,EAAqB,KAAK,KAAK,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,OAAO,EACZ,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,eAAe,EAEf,aAAa,EAEb,UAAU,EACX,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/router/manifest.ts"],"names":[],"mappings":"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"}
|
package/dist/security/audit.d.ts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import type { HttpMethod } from "../route/types";
|
|
2
2
|
import type { ScriptTag } from "../document/scripts";
|
|
3
|
-
import type { CorsPolicy, RouteSecurityPolicy, ScriptDependencyAuditOptions, SecurityAuditFinding, SecurityAuditOptions } from "./types";
|
|
3
|
+
import type { CorsPolicy, ResolvedRouteAccess, RouteSecurityPolicy, ScriptDependencyAuditOptions, SecurityAuditFinding, SecurityAuditOptions } from "./types";
|
|
4
4
|
export declare function createSecurityAudit(options?: SecurityAuditOptions): {
|
|
5
5
|
findings: SecurityAuditFinding[];
|
|
6
6
|
headers: {
|
|
7
7
|
[k: string]: string;
|
|
8
8
|
};
|
|
9
9
|
route: {
|
|
10
|
+
access: ResolvedRouteAccess | undefined;
|
|
10
11
|
cors: CorsPolicy | undefined;
|
|
11
12
|
method: HttpMethod;
|
|
12
13
|
security: RouteSecurityPolicy | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/security/audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/security/audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAWrD,OAAO,KAAK,EAGV,UAAU,EAEV,mBAAmB,EACnB,mBAAmB,EACnB,4BAA4B,EAE5B,oBAAoB,EACpB,oBAAoB,EAGrB,MAAM,SAAS,CAAC;AAIjB,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB;;;;;;;;;;;EAsCrE;AA2ED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,SAAS,SAAS,EAAE,EAC7B,OAAO,GAAE,4BAAiC,0BAkD3C"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { HttpRouteContext, MaybePromise } from "../route/types";
|
|
2
|
+
import type { AuthorizationDecision, ResolvedRouteAccess, RouteAccessPolicy, RouteAccessSource, RouteAuthorizationHook } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* Declares an authorization hook with the request context values that
|
|
5
|
+
* inherited middleware supplies.
|
|
6
|
+
*/
|
|
7
|
+
export declare function defineAuthorization<TValues extends object = Record<never, never>>(hook: (context: HttpRouteContext<string, TValues>) => MaybePromise<AuthorizationDecision>): RouteAuthorizationHook;
|
|
8
|
+
/**
|
|
9
|
+
* Reads the access declarations of one cascade, from the root of the route
|
|
10
|
+
* tree to the route file.
|
|
11
|
+
*
|
|
12
|
+
* A declaration adds a restriction. The framework keeps each inherited hook,
|
|
13
|
+
* because a child must not weaken an ancestor. Only an explicit exception
|
|
14
|
+
* removes the inherited hooks.
|
|
15
|
+
*/
|
|
16
|
+
export declare function resolveRouteAccess(sources: readonly RouteAccessSource[]): ResolvedRouteAccess;
|
|
17
|
+
/**
|
|
18
|
+
* Merges the access declarations that `mergeRoutePolicies` receives.
|
|
19
|
+
*/
|
|
20
|
+
export declare function mergeRouteAccess(policies: readonly (RouteAccessPolicy | undefined)[]): ResolvedRouteAccess;
|
|
21
|
+
/**
|
|
22
|
+
* Runs each inherited authorization hook, from the root of the subtree to the
|
|
23
|
+
* route. The function returns a denial response. It returns `null` when every
|
|
24
|
+
* hook permits the request.
|
|
25
|
+
*
|
|
26
|
+
* The framework runs this check before a protected data loader, before a read
|
|
27
|
+
* of a protected cache entry, before a render, and before the effect of a
|
|
28
|
+
* mutation.
|
|
29
|
+
*/
|
|
30
|
+
export declare function authorizeRoute(access: ResolvedRouteAccess, context: HttpRouteContext<string, object>): Promise<Response | null>;
|
|
31
|
+
/**
|
|
32
|
+
* Reports if one decision permits the request. Each value other than `true`
|
|
33
|
+
* and `{ allow: true }` denies the request.
|
|
34
|
+
*/
|
|
35
|
+
export declare function permitsRequest(decision: unknown): boolean;
|
|
36
|
+
//# sourceMappingURL=authorization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authorization.d.ts","sourceRoot":"","sources":["../../src/security/authorization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAErE,OAAO,KAAK,EACV,qBAAqB,EAErB,mBAAmB,EAEnB,iBAAiB,EACjB,iBAAiB,EAEjB,sBAAsB,EACvB,MAAM,SAAS,CAAC;AAIjB;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,SAAS,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAE7C,IAAI,EAAE,CACJ,OAAO,EAAE,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,KACvC,YAAY,CAAC,qBAAqB,CAAC,GACvC,sBAAsB,CAGxB;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,SAAS,iBAAiB,EAAE,GACpC,mBAAmB,CAyCrB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,SAAS,CAAC,iBAAiB,GAAG,SAAS,CAAC,EAAE,GACnD,mBAAmB,CAErB;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,GACxC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CA2B1B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,WAM/C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csrf.d.ts","sourceRoot":"","sources":["../../src/security/csrf.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"csrf.d.ts","sourceRoot":"","sources":["../../src/security/csrf.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAqB,MAAM,SAAS,CAAC;AAK7D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAgB,eAAe,WAQ9B;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,iBAAsB,UAuBhC;AAED,wBAAgB,cAAc,CAAC,OAAO,GAAE,iBAAsB,GAAG,eAAe,CAO/E;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,UAAU,GAAG,SAAS,EAC9B,OAAO,EAAE,OAAO,4BA2CjB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,uBAuBtD"}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import { type EnvSchema, type EnvSchemaDescriptor, type EnvSource, type InferEnvSchema } from "./env";
|
|
2
2
|
export type EnvStartupOptions = {
|
|
3
3
|
source?: EnvSource;
|
|
4
|
-
warn?: (message: string) => void;
|
|
5
4
|
};
|
|
6
5
|
export type EnvStartupResult = {
|
|
7
6
|
values: Record<string, unknown>;
|
|
8
|
-
warnings: string[];
|
|
9
7
|
};
|
|
10
8
|
export declare function serializeEnvSchema(schema: EnvSchema): EnvSchemaDescriptor;
|
|
11
9
|
export declare function deserializeEnvSchema(descriptor: EnvSchemaDescriptor): EnvSchema;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-startup.d.ts","sourceRoot":"","sources":["../../src/security/env-startup.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,mBAAmB,EACxB,KAAK,SAAS,EAId,KAAK,cAAc,EACpB,MAAM,OAAO,CAAC;AAEf,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,CAAC,EAAE,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"env-startup.d.ts","sourceRoot":"","sources":["../../src/security/env-startup.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,mBAAmB,EACxB,KAAK,SAAS,EAId,KAAK,cAAc,EACpB,MAAM,OAAO,CAAC;AAEf,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC,CAAC;AAsCF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,mBAAmB,CAWzE;AAED,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,mBAAmB,GAC9B,SAAS,CAOX;AAMD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,GAAG,mBAAmB,EACvC,OAAO,GAAE,iBAAsB,GAC9B,gBAAgB,CA4ClB;AAKD,wBAAgB,OAAO,CAAC,MAAM,SAAS,SAAS,EAC9C,MAAM,EAAE,MAAM,GACb,cAAc,CAAC,MAAM,CAAC,CAmBxB;AAED,wBAAgB,gBAAgB,SAG/B"}
|
package/dist/security/env.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ export declare class EnvValidationError extends Error {
|
|
|
11
11
|
export type EnvVariableKind = "boolean" | "enum" | "integer" | "secret" | "string" | "url";
|
|
12
12
|
export type EnvVariableDescriptor = {
|
|
13
13
|
client: boolean;
|
|
14
|
-
|
|
14
|
+
deferred: boolean;
|
|
15
15
|
kind: EnvVariableKind;
|
|
16
16
|
optional: boolean;
|
|
17
17
|
options: Record<string, unknown>;
|
|
@@ -28,32 +28,47 @@ export type InferEnvSchema<Schema extends EnvSchema> = {
|
|
|
28
28
|
};
|
|
29
29
|
type SharedEnvVariableOptions = {
|
|
30
30
|
client?: boolean;
|
|
31
|
-
critical?: boolean;
|
|
32
31
|
};
|
|
33
32
|
type RequiredEnvVariableOptions = SharedEnvVariableOptions & {
|
|
33
|
+
deferred?: false;
|
|
34
34
|
optional?: false;
|
|
35
35
|
};
|
|
36
36
|
type OptionalEnvVariableOptions = SharedEnvVariableOptions & {
|
|
37
|
+
deferred?: false;
|
|
37
38
|
optional: true;
|
|
38
39
|
};
|
|
40
|
+
type DeferredEnvVariableOptions = {
|
|
41
|
+
client?: never;
|
|
42
|
+
deferred: true;
|
|
43
|
+
optional?: false;
|
|
44
|
+
};
|
|
39
45
|
type RequiredStringEnvOptions = RequiredEnvVariableOptions & {
|
|
40
46
|
minLength?: number;
|
|
41
47
|
};
|
|
42
48
|
type OptionalStringEnvOptions = OptionalEnvVariableOptions & {
|
|
43
49
|
minLength?: number;
|
|
44
50
|
};
|
|
51
|
+
type DeferredStringEnvOptions = DeferredEnvVariableOptions & {
|
|
52
|
+
minLength?: number;
|
|
53
|
+
};
|
|
45
54
|
type RequiredSecretEnvOptions = RequiredStringEnvOptions & {
|
|
46
55
|
client?: never;
|
|
47
56
|
};
|
|
48
57
|
type OptionalSecretEnvOptions = OptionalStringEnvOptions & {
|
|
49
58
|
client?: never;
|
|
50
59
|
};
|
|
60
|
+
type DeferredSecretEnvOptions = DeferredStringEnvOptions & {
|
|
61
|
+
client?: never;
|
|
62
|
+
};
|
|
51
63
|
type RequiredUrlEnvOptions = RequiredEnvVariableOptions & {
|
|
52
64
|
protocols?: readonly string[];
|
|
53
65
|
};
|
|
54
66
|
type OptionalUrlEnvOptions = OptionalEnvVariableOptions & {
|
|
55
67
|
protocols?: readonly string[];
|
|
56
68
|
};
|
|
69
|
+
type DeferredUrlEnvOptions = DeferredEnvVariableOptions & {
|
|
70
|
+
protocols?: readonly string[];
|
|
71
|
+
};
|
|
57
72
|
type RequiredIntegerEnvOptions = RequiredEnvVariableOptions & {
|
|
58
73
|
max?: number;
|
|
59
74
|
min?: number;
|
|
@@ -62,20 +77,24 @@ type OptionalIntegerEnvOptions = OptionalEnvVariableOptions & {
|
|
|
62
77
|
max?: number;
|
|
63
78
|
min?: number;
|
|
64
79
|
};
|
|
80
|
+
type DeferredIntegerEnvOptions = DeferredEnvVariableOptions & {
|
|
81
|
+
max?: number;
|
|
82
|
+
min?: number;
|
|
83
|
+
};
|
|
65
84
|
export declare function defineEnvSchema<Schema extends EnvSchema>(schema: Schema): Schema;
|
|
66
85
|
export declare function validateEnv<Schema extends EnvSchema>(schema: Schema, source: EnvSource): InferEnvSchema<Schema>;
|
|
67
86
|
declare function booleanEnv(options: OptionalEnvVariableOptions): EnvVariable<boolean, true>;
|
|
68
|
-
declare function booleanEnv(options?: RequiredEnvVariableOptions): EnvVariable<boolean, false>;
|
|
87
|
+
declare function booleanEnv(options?: RequiredEnvVariableOptions | DeferredEnvVariableOptions): EnvVariable<boolean, false>;
|
|
69
88
|
declare function enumEnv<const Values extends readonly [string, ...string[]]>(values: Values, options: OptionalEnvVariableOptions): EnvVariable<Values[number], true>;
|
|
70
|
-
declare function enumEnv<const Values extends readonly [string, ...string[]]>(values: Values, options?: RequiredEnvVariableOptions): EnvVariable<Values[number], false>;
|
|
89
|
+
declare function enumEnv<const Values extends readonly [string, ...string[]]>(values: Values, options?: RequiredEnvVariableOptions | DeferredEnvVariableOptions): EnvVariable<Values[number], false>;
|
|
71
90
|
declare function integerEnv(options: OptionalIntegerEnvOptions): EnvVariable<number, true>;
|
|
72
|
-
declare function integerEnv(options?: RequiredIntegerEnvOptions): EnvVariable<number, false>;
|
|
91
|
+
declare function integerEnv(options?: RequiredIntegerEnvOptions | DeferredIntegerEnvOptions): EnvVariable<number, false>;
|
|
73
92
|
declare function secretEnv(options: OptionalSecretEnvOptions): EnvVariable<string, true>;
|
|
74
|
-
declare function secretEnv(options?: RequiredSecretEnvOptions): EnvVariable<string, false>;
|
|
93
|
+
declare function secretEnv(options?: RequiredSecretEnvOptions | DeferredSecretEnvOptions): EnvVariable<string, false>;
|
|
75
94
|
declare function stringEnv(options: OptionalStringEnvOptions): EnvVariable<string, true>;
|
|
76
|
-
declare function stringEnv(options?: RequiredStringEnvOptions): EnvVariable<string, false>;
|
|
95
|
+
declare function stringEnv(options?: RequiredStringEnvOptions | DeferredStringEnvOptions): EnvVariable<string, false>;
|
|
77
96
|
declare function urlEnv(options: OptionalUrlEnvOptions): EnvVariable<URL, true>;
|
|
78
|
-
declare function urlEnv(options?: RequiredUrlEnvOptions): EnvVariable<URL, false>;
|
|
97
|
+
declare function urlEnv(options?: RequiredUrlEnvOptions | DeferredUrlEnvOptions): EnvVariable<URL, false>;
|
|
79
98
|
export declare const env: {
|
|
80
99
|
boolean: typeof booleanEnv;
|
|
81
100
|
enum: typeof enumEnv;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/security/env.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAE3D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,MAAM,EAAE,kBAAkB,EAAE,CAAC;gBAEjB,MAAM,EAAE,kBAAkB,EAAE;CAKzC;AAED,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,MAAM,GACN,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,KAAK,CAAC;AAKV,MAAM,MAAM,qBAAqB,GAAG;IAGlC,MAAM,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/security/env.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { BodySizeException, BodySizeValue, ContentSecurityPolicy, CspException, CsrfException, CsrfPolicy, CsrfPolicyOptions, RequestSecurityPolicy, RoutePolicy, SecurityException, SecurityPolicy } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Reports if a declaration is a typed security exception.
|
|
4
|
+
*
|
|
5
|
+
* An exception carries a `reason` and a `value`. No policy object of the
|
|
6
|
+
* framework uses both names, so the two fields identify the shape.
|
|
7
|
+
*/
|
|
8
|
+
export declare function isSecurityException(value: unknown): value is SecurityException<unknown>;
|
|
9
|
+
/** Returns the Content-Security-Policy that a document declaration selects. */
|
|
10
|
+
export declare function resolveCsp(csp: SecurityPolicy["csp"]): ContentSecurityPolicy | false | undefined;
|
|
11
|
+
/** Returns the exception of a document declaration, or `undefined`. */
|
|
12
|
+
export declare function getCspException(csp: SecurityPolicy["csp"]): CspException | undefined;
|
|
13
|
+
/** Returns the CSRF policy that a route declaration selects. */
|
|
14
|
+
export declare function resolveCsrf(csrf: CsrfPolicy | undefined): true | false | CsrfPolicyOptions | undefined;
|
|
15
|
+
/** Returns the exception of a CSRF declaration, or `undefined`. */
|
|
16
|
+
export declare function getCsrfException(csrf: CsrfPolicy | undefined): CsrfException | undefined;
|
|
17
|
+
/** Returns the request body limit that a route declaration selects. */
|
|
18
|
+
export declare function resolveMaxBodySize(maxBodySize: RequestSecurityPolicy["maxBodySize"]): BodySizeValue | undefined;
|
|
19
|
+
/** Returns the exception of a body limit declaration, or `undefined`. */
|
|
20
|
+
export declare function getBodySizeException(maxBodySize: RequestSecurityPolicy["maxBodySize"]): BodySizeException | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Adds the declaring file to each exception of one policy file.
|
|
23
|
+
*
|
|
24
|
+
* The framework merges the policy cascade into one policy, and the merge
|
|
25
|
+
* keeps no file name. This function stamps the file before the merge, so the
|
|
26
|
+
* audit can report the source of each exception.
|
|
27
|
+
*/
|
|
28
|
+
export declare function attachExceptionSource(policy: RoutePolicy | undefined, source: string | undefined): RoutePolicy | undefined;
|
|
29
|
+
//# sourceMappingURL=exceptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exceptions.d.ts","sourceRoot":"","sources":["../../src/security/exceptions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,YAAY,EACZ,aAAa,EACb,UAAU,EACV,iBAAiB,EACjB,qBAAqB,EACrB,WAAW,EACX,iBAAiB,EACjB,cAAc,EACf,MAAM,SAAS,CAAC;AAEjB;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAMrC;AAED,+EAA+E;AAC/E,wBAAgB,UAAU,CACxB,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,GACzB,qBAAqB,GAAG,KAAK,GAAG,SAAS,CAM3C;AAED,uEAAuE;AACvE,wBAAgB,eAAe,CAC7B,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,GACzB,YAAY,GAAG,SAAS,CAG1B;AAED,gEAAgE;AAChE,wBAAgB,WAAW,CACzB,IAAI,EAAE,UAAU,GAAG,SAAS,GAC3B,IAAI,GAAG,KAAK,GAAG,iBAAiB,GAAG,SAAS,CAM9C;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,UAAU,GAAG,SAAS,GAC3B,aAAa,GAAG,SAAS,CAG3B;AAED,uEAAuE;AACvE,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,qBAAqB,CAAC,aAAa,CAAC,GAChD,aAAa,GAAG,SAAS,CAO3B;AAED,yEAAyE;AACzE,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,qBAAqB,CAAC,aAAa,CAAC,GAChD,iBAAiB,GAAG,SAAS,CAK/B;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,WAAW,GAAG,SAAS,CAazB"}
|