@torpor/build 0.2.0 → 0.3.0
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/CHANGELOG.md +31 -0
- package/dist/RouteType-g8Ce5gOd.js +107 -0
- package/dist/RouteType-g8Ce5gOd.js.map +1 -0
- package/dist/Server-CSpY_-Ba.d.ts +78 -0
- package/dist/Server-CSpY_-Ba.d.ts.map +1 -0
- package/dist/ServerEvent-2-CnAy1W.js +74 -0
- package/dist/ServerEvent-2-CnAy1W.js.map +1 -0
- package/dist/Site-D4x1l0p5.d.ts +67 -0
- package/dist/Site-D4x1l0p5.d.ts.map +1 -0
- package/dist/_page-CsdPubw4.js +33 -0
- package/dist/_page-CsdPubw4.js.map +1 -0
- package/dist/bin/index.d.ts +1 -1
- package/dist/bin/index.js +14 -19
- package/dist/bin/index.js.map +1 -1
- package/dist/connectMiddleware-DbLj0St1.js +252 -0
- package/dist/connectMiddleware-DbLj0St1.js.map +1 -0
- package/dist/index.d.ts +188 -179
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +109 -145
- package/dist/index.js.map +1 -1
- package/dist/nav.d.ts +14 -0
- package/dist/nav.d.ts.map +1 -0
- package/dist/nav.js +184 -0
- package/dist/nav.js.map +1 -0
- package/dist/pathToRegex-CTgx7hQP.js +11 -0
- package/dist/pathToRegex-CTgx7hQP.js.map +1 -0
- package/dist/response-D-XpIuMH.js +307 -0
- package/dist/response-D-XpIuMH.js.map +1 -0
- package/dist/response.d.ts +336 -151
- package/dist/response.d.ts.map +1 -0
- package/dist/response.js +4 -37
- package/dist/run-CNdaKSPR.js +331 -0
- package/dist/run-CNdaKSPR.js.map +1 -0
- package/dist/run.d.ts +11 -8
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +8 -18
- package/dist/seeOther-BmehiI4C.js +110 -0
- package/dist/seeOther-BmehiI4C.js.map +1 -0
- package/dist/server.d.ts +12 -11
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +5 -18
- package/dist/state.d.ts +14 -10
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +3 -7
- package/dist/test.d.ts +12 -11
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +152 -225
- package/dist/test.js.map +1 -1
- package/package.json +25 -29
- package/src/bin/index.ts +9 -11
- package/src/index.ts +3 -0
- package/src/nav/load.ts +9 -0
- package/src/nav/loadData.ts +121 -0
- package/src/nav/navigate.ts +154 -0
- package/src/nav/reload.ts +9 -0
- package/src/nav.ts +4 -0
- package/src/response/badRequest.ts +9 -4
- package/src/response/created.ts +10 -3
- package/src/response/forbidden.ts +11 -4
- package/src/response/found.ts +30 -0
- package/src/response/methodNotAllowed.ts +8 -4
- package/src/response/movedPermanently.ts +25 -0
- package/src/response/notFound.ts +14 -7
- package/src/response/notModified.ts +24 -4
- package/src/response/ok.ts +19 -10
- package/src/response/permanentRedirect.ts +30 -0
- package/src/response/seeOther.ts +9 -3
- package/src/response/serverError.ts +14 -2
- package/src/response/temporaryRedirect.ts +31 -0
- package/src/response/unauthorized.ts +11 -4
- package/src/response/unprocessable.ts +8 -2
- package/src/response.ts +8 -4
- package/src/{site → run}/prepareTemplate.ts +1 -1
- package/src/{site → run}/run.ts +1 -1
- package/src/{site → run}/runBuild.ts +2 -2
- package/src/{site → run}/runDev.ts +2 -2
- package/src/{site → run}/runPreview.ts +1 -1
- package/src/run.ts +4 -4
- package/src/server/Routerx.ts +3 -3
- package/src/server/Server.ts +3 -3
- package/src/server/connect/connectMiddleware.ts +2 -1
- package/src/server/connect/nodeMessageToNodeResponse.ts +2 -2
- package/src/site/Router.ts +3 -3
- package/src/site/clientEntry.ts +11 -269
- package/src/site/defaultAdapter.ts +1 -1
- package/src/site/serverEntry.ts +67 -44
- package/src/state/$page.ts +3 -12
- package/src/state/client.ts +6 -0
- package/src/state/internal.ts +45 -0
- package/src/test/runTest.ts +1 -1
- package/src/types/Adapter.ts +2 -4
- package/src/types/ClientState.ts +8 -0
- package/src/types/InternalState.ts +7 -0
- package/src/types/LayoutHandler.ts +2 -4
- package/src/types/LayoutPath.ts +10 -0
- package/src/types/ManifestRoute.ts +2 -4
- package/src/types/PageEndPoint.ts +2 -4
- package/src/types/PageLoadEvent.ts +2 -4
- package/src/types/PageServerEndPoint.ts +2 -4
- package/src/types/PageState.ts +8 -0
- package/src/types/RouteHandler.ts +2 -4
- package/src/types/RouteLayoutHandler.ts +2 -4
- package/src/types/RouteMatchResult.ts +2 -4
- package/src/types/ServerHook.ts +3 -7
- package/src/types/ServerLoadEvent.ts +2 -4
- package/src/{site → utils}/pathToRegex.ts +1 -1
- package/{tsup.config.ts → tsdown.config.ts} +3 -4
- package/dist/Server-CNZWh5ca.d.cts +0 -71
- package/dist/Server-CNZWh5ca.d.ts +0 -71
- package/dist/Site-C2020GV_.d.ts +0 -63
- package/dist/Site-DQojGpE-.d.cts +0 -63
- package/dist/bin/index.cjs +0 -778
- package/dist/bin/index.cjs.map +0 -1
- package/dist/bin/index.d.cts +0 -1
- package/dist/chunk-565UOT3F.js +0 -18
- package/dist/chunk-565UOT3F.js.map +0 -1
- package/dist/chunk-B2UNTYN5.js +0 -68
- package/dist/chunk-B2UNTYN5.js.map +0 -1
- package/dist/chunk-CZHJQCPI.js +0 -286
- package/dist/chunk-CZHJQCPI.js.map +0 -1
- package/dist/chunk-PTVHEJZ5.js +0 -152
- package/dist/chunk-PTVHEJZ5.js.map +0 -1
- package/dist/chunk-SJVHHGVW.js +0 -13
- package/dist/chunk-SJVHHGVW.js.map +0 -1
- package/dist/chunk-TDOXEXG6.js +0 -85
- package/dist/chunk-TDOXEXG6.js.map +0 -1
- package/dist/chunk-WVXAN4IV.js +0 -50
- package/dist/chunk-WVXAN4IV.js.map +0 -1
- package/dist/chunk-YRBEYKQM.js +0 -372
- package/dist/chunk-YRBEYKQM.js.map +0 -1
- package/dist/index.cjs +0 -322
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -199
- package/dist/metafile-cjs.json +0 -1
- package/dist/metafile-esm.json +0 -1
- package/dist/response.cjs +0 -150
- package/dist/response.cjs.map +0 -1
- package/dist/response.d.cts +0 -166
- package/dist/response.js.map +0 -1
- package/dist/run.cjs +0 -787
- package/dist/run.cjs.map +0 -1
- package/dist/run.d.cts +0 -14
- package/dist/run.js.map +0 -1
- package/dist/server.cjs +0 -398
- package/dist/server.cjs.map +0 -1
- package/dist/server.d.cts +0 -17
- package/dist/server.js.map +0 -1
- package/dist/state.cjs +0 -44
- package/dist/state.cjs.map +0 -1
- package/dist/state.d.cts +0 -11
- package/dist/state.js.map +0 -1
- package/dist/test.cjs +0 -538
- package/dist/test.cjs.map +0 -1
- package/dist/test.d.cts +0 -15
- package/src/response/moved.ts +0 -16
- package/src/response/redirect.ts +0 -17
- package/src/state/Page.ts +0 -8
package/dist/run.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/run.ts","../src/site/run.ts","../src/site/runBuild.ts","../src/site/manifest.ts","../src/site/runDev.ts","../src/response/response.ts","../src/response/serverError.ts","../src/site/pathToRegex.ts","../src/server/CookieHelper.ts","../src/server/HeaderHelper.ts","../src/server/ServerEvent.ts","../src/server/Server.ts","../src/server/connect/bufferToArrayBuffer.ts","../src/server/connect/flattenHeaders.ts","../src/server/connect/nodeMessageToNodeResponse.ts","../src/server/connect/readableToBuffer.ts","../src/server/connect/requestToNodeMessage.ts","../src/server/connect/connectMiddleware.ts","../src/site/prepareTemplate.ts","../src/site/runPreview.ts","../src/server/contentType.ts"],"sourcesContent":["import run from \"./site/run\";\nimport runBuild from \"./site/runBuild\";\nimport runDev from \"./site/runDev\";\nimport runPreview from \"./site/runPreview\";\n\nexport { run, runDev, runBuild, runPreview };\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { transformWithEsbuild } from \"vite\";\nimport Site from \"./Site\";\nimport runBuild from \"./runBuild\";\nimport runDev from \"./runDev\";\nimport runPreview from \"./runPreview\";\n\nexport default async function run(\n\tfolder: string,\n\tmode: \"dev\" | \"build\" | \"preview\",\n): Promise<void> {\n\t// Look for and load a site.config.js/ts file in the working directory\n\tlet configFile = \"\";\n\tlet deleteConfigFile = false;\n\tconst jsConfigFile = path.join(folder, \"site.config.js\");\n\tconst tsConfigFile = path.join(folder, \"site.config.ts\");\n\tif (fs.existsSync(jsConfigFile)) {\n\t\t// If it's JS, we can just import it straight up\n\t\tconfigFile = jsConfigFile;\n\t} else if (fs.existsSync(tsConfigFile)) {\n\t\t// If it's TS, we need to convert it to JS\n\t\t// TODO: Put the generated file somewhere better (dist?)\n\t\tconfigFile = path.join(folder, \"site.config.temp.js\");\n\t\tlet source = fs.readFileSync(tsConfigFile, \"utf-8\");\n\t\tlet transformed = await transformWithEsbuild(source, tsConfigFile, {\n\t\t\tloader: \"ts\",\n\t\t});\n\t\tfs.writeFileSync(configFile, transformed.code);\n\t\tdeleteConfigFile = true;\n\t} else {\n\t\tthrow new Error(\"site.config file not found\");\n\t}\n\n\tconst site = (await import(configFile)).default as Site;\n\tif (!site || !site.root || !site.routes) {\n\t\tthrow new Error(\"Invalid site in config file\");\n\t}\n\tif (deleteConfigFile) {\n\t\tfs.rmSync(configFile);\n\t}\n\n\tswitch (mode) {\n\t\tcase \"dev\": {\n\t\t\tawait runDev(site);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"build\": {\n\t\t\tawait runBuild(site);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"preview\": {\n\t\t\tawait runPreview(site);\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tconsole.log(\"No mode passed, running in dev\");\n\t\t\tawait runDev(site);\n\t\t\tbreak;\n\t\t}\n\t}\n}\n","import torpor from \"@torpor/unplugin/vite\";\nimport { existsSync, promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { build, defineConfig } from \"vite\";\nimport Site from \"./Site.ts\";\nimport manifest from \"./manifest.ts\";\n\n// TODO: Don't cache index.html in dev?\n// TODO: Multiple hook.server locations\n// TODO: Don't reload layouts during client routing\n// TODO: Call the correct +page and +server routes when in the same folder\n\nexport default async function runBuild(site: Site): Promise<void> {\n\t// Delete the dist folder if it exists\n\tconst distFolder = path.resolve(site.root, \"dist\");\n\tif (existsSync(distFolder)) {\n\t\tawait fs.rm(distFolder, { recursive: true });\n\t}\n\tconst clientFolder = path.join(distFolder, \"client\");\n\tconst serverFolder = path.join(distFolder, \"server\");\n\n\t// HOOK: Prebuild\n\tif (site.adapter.prebuild) {\n\t\tawait site.adapter.prebuild(site);\n\t}\n\n\t// TODO: From a setting\n\tlet siteHtml = path.resolve(site.root, \"src/site.html\");\n\n\t// TODO: Is this going to be the correct path after installing from npm?\n\tconst siteFolder = path.resolve(site.root, \"./node_modules/@torpor/build/src/site/\");\n\tlet clientScript = path.join(siteFolder, \"clientEntry.ts\");\n\tlet serverScript = path.join(siteFolder, \"serverEntry.ts\");\n\n\t// Build the client assets, including site.html and the route files\n\t// EXCLUDING anything with `server.js` in the name\n\tconst clientConfig = structuredClone(site.viteConfig ?? {});\n\tclientConfig.plugins = [manifest(site), torpor(), ...site.plugins];\n\tclientConfig.build ??= {};\n\tclientConfig.build.outDir = clientFolder;\n\tclientConfig.build.rollupOptions ??= {};\n\tclientConfig.build.rollupOptions.input = [\n\t\tsiteHtml,\n\t\tclientScript,\n\t\t...site.routes\n\t\t\t.filter((r) => !/server\\.(ts|js)$/.test(r.file))\n\t\t\t.map((r) => path.resolve(site.root, r.file)),\n\t\t...site.inputs.filter((f) => !/server\\.(ts|js)$/.test(f)),\n\t];\n\tclientConfig.build.ssrManifest = true;\n\tawait build(defineConfig(clientConfig));\n\n\t// Build the server assets, including the server entry script and the route\n\t// files\n\tconst serverConfig = structuredClone(site.viteConfig ?? {});\n\tserverConfig.plugins = [manifest(site, true), torpor(), ...site.plugins];\n\tserverConfig.build ??= {};\n\tserverConfig.build.outDir = serverFolder;\n\tserverConfig.build.rollupOptions ??= {};\n\tserverConfig.build.rollupOptions.input = [\n\t\tserverScript,\n\t\t...site.routes.map((r) => path.resolve(site.root, r.file)),\n\t\t...site.inputs,\n\t];\n\tserverConfig.build.ssr = serverScript;\n\tawait build(defineConfig(serverConfig));\n\n\t// Move the site.html file into /client\n\t// HACK: Should do this in Rollup if possible?\n\tsiteHtml = path.join(clientFolder, \"site.html\");\n\tawait fs.rename(path.join(clientFolder, \"src\", \"site.html\"), siteHtml);\n\tawait fs.rm(path.join(clientFolder, \"src\"), { recursive: true });\n\n\t// HOOK: Postbuild\n\tif (site.adapter.postbuild) {\n\t\tawait site.adapter.postbuild(site);\n\t}\n}\n","import { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Plugin } from \"vite\";\nimport Site from \"./Site\";\n\nconst moduleId = \"@torpor/build/manifest\";\n\n/**\n * A Vite plugin that provides information about the app to both clientEntry and\n * serverEntry.\n */\nexport default function manifest(site: Site, server = false): Plugin {\n\treturn {\n\t\tname: \"torpor-manifest\",\n\t\tresolveId: {\n\t\t\torder: \"pre\",\n\t\t\thandler(id) {\n\t\t\t\tif (id === moduleId) {\n\t\t\t\t\treturn id;\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\t// @ts-ignore\n\t\tload(id, viteOptions) {\n\t\t\tif (id === moduleId) {\n\t\t\t\tlet serverRequest = server && !!viteOptions?.ssr;\n\t\t\t\treturn `\n${!serverRequest ? \"const load = { default: { load: true } };\" : \"\"}\nexport default {\n routes: [\n ${site.routes\n\t\t\t.map((r) => {\n\t\t\t\tif (serverRequest || !/server\\.(ts|js)$/.test(r.file)) {\n\t\t\t\t\treturn `{ path: \"${r.path}\", type: ${r.type}, endPoint: ${serverRequest || !/server\\.(ts|js)$/.test(r.file) ? `() => import(/* @vite-ignore */ \"${path.join(site.root, r.file)}\")` : \"undefined\"} }`;\n\t\t\t\t} else {\n\t\t\t\t\t// On the client, for a server route, we need to check\n\t\t\t\t\t// whether there's a load function and set a dummy endPoint\n\t\t\t\t\t// if so. The correct endpoint will be hit in clientEntry\n\t\t\t\t\t// HACK: Should do this better than checking for `load:` in source...\n\t\t\t\t\tconst haveLoad = readFileSync(path.join(site.root, r.file)).includes(\"load:\");\n\t\t\t\t\treturn `{ path: \"${r.path}\", type: ${r.type}, endPoint: ${haveLoad ? \"() => load\" : \"undefined\"} }`;\n\t\t\t\t}\n\t\t\t})\n\t\t\t.join(\",\\n \")}\n ],\n};\n`;\n\t\t\t}\n\t\t},\n\t};\n}\n","import estorpor from \"@torpor/unplugin/esbuild\";\nimport torpor from \"@torpor/unplugin/vite\";\nimport { configDotenv } from \"dotenv\";\nimport { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { createServer as createViteServer } from \"vite\";\nimport { serverError } from \"../response.ts\";\nimport Server from \"../server/Server.ts\";\nimport connectMiddleware from \"../server/connect/connectMiddleware.ts\";\nimport Site from \"./Site.ts\";\nimport manifest from \"./manifest.ts\";\nimport prepareTemplate from \"./prepareTemplate.ts\";\n\nexport default async function runDev(site: Site): Promise<void> {\n\tconst server = new Server();\n\n\t// Create the Vite server in middleware mode and configure the app type as\n\t// \"custom\", disabling Vite's own HTML serving logic so the parent server\n\t// can take control\n\tconst config = structuredClone(site.viteConfig ?? {});\n\tconfig.server = { middlewareMode: true };\n\tconfig.appType = \"custom\";\n\tconfig.plugins = [manifest(site, true), torpor(), ...site.plugins];\n\n\t// HACK: To be able to import `.torp` files from barrel files in\n\t// node_modules, we need to add their libraries to `ssr.noExternal` in\n\t// site.config.ts, and let esbuild know how to compile them here\n\tconfig.optimizeDeps ??= {};\n\tconfig.optimizeDeps.extensions ??= [];\n\tconfig.optimizeDeps.extensions.push(\".torp\");\n\tconfig.optimizeDeps.esbuildOptions ??= {};\n\tconfig.optimizeDeps.esbuildOptions.plugins ??= [];\n\tconfig.optimizeDeps.esbuildOptions.plugins.push(estorpor());\n\n\tconst vite = await createViteServer(config);\n\n\t// Read site.html\n\t// It's called site.html because @torpor/build builds the site (html, routes\n\t// etc) while the user builds the app (components etc)\n\tconst templateFile = path.resolve(site.root, \"src/site.html\");\n\tlet template = await fs.readFile(templateFile, \"utf-8\");\n\n\t// Apply Vite HTML transforms. This injects the Vite HMR client, and also\n\t// applies HTML transforms from Vite plugins. Note that we only support a\n\t// universal transform, not individual transforms for each route\n\ttemplate = await vite.transformIndexHtml(\"\", template);\n\n\t// TODO: Is this going to be the correct path after installing from npm?\n\tconst siteFolder = path.resolve(site.root, \"./node_modules/@torpor/build/src/site/\");\n\tlet clientScript = path.join(siteFolder, \"clientEntry.ts\");\n\tlet serverScript = path.join(siteFolder, \"serverEntry.ts\");\n\n\t// Prepare site.html so that we can just splice components into it\n\ttemplate = prepareTemplate(template, clientScript);\n\n\t// Use Vite's Connect instance as middleware. We need to wrap it with\n\t// createMiddlewareHandler that converts Connect middleware to\n\t// Request/Response web handlers\n\tserver.use(connectMiddleware(vite.middlewares));\n\n\t// Every request (GET, POST, etc) goes through loadEndPoint\n\tserver.add(\"*\", async (ev) => {\n\t\ttry {\n\t\t\t// Load the server entry. ssrLoadModule automatically transforms ESM\n\t\t\t// source code to be usable in Node.js. No bundling is required, and\n\t\t\t// it provides efficient invalidation similar to HMR\n\t\t\tconst { load } = await vite.ssrLoadModule(serverScript);\n\n\t\t\t// Render the app HTML (or fetch server data etc) via serverEntry's\n\t\t\t// exported `load` function\n\t\t\treturn await load(ev, template);\n\t\t} catch (e: any) {\n\t\t\t// If an error is caught, let Vite fix the stack trace so it maps\n\t\t\t// back to your actual source code\n\t\t\tvite.ssrFixStacktrace(e);\n\t\t\treturn serverError(e);\n\t\t}\n\t});\n\n\t// Load environment variables from a `.env` file, with defaults if not set\n\tconfigDotenv();\n\n\tprocess.env.PROTOCOL ??= \"http:\";\n\tprocess.env.HOST ??= \"localhost\";\n\tprocess.env.PORT ??= \"7059\";\n\n\t// Serve the site\n\tsite.adapter.serve(server, site);\n}\n","/**\n * Creates a response with the supplied status code and optional body.\n *\n * If the body is an object, it will be converted to JSON and the content-type\n * header set to \"application/json\". Otherwise, if the body is a string, the\n * content-type header will be set to \"text/plain\".\n */\nexport default function response(status: number, body?: object | string): Response {\n\tlet headers: Record<string, string> | undefined = undefined;\n\tif (body) {\n\t\tif (typeof body === \"object\") {\n\t\t\theaders = { \"content-type\": \"application/json\" };\n\t\t\tbody = JSON.stringify(body);\n\t\t} else {\n\t\t\theaders = { \"content-type\": \"text/plain\" };\n\t\t}\n\t}\n\treturn new Response(body, {\n\t\tstatus,\n\t\theaders,\n\t});\n}\n","import response from \"./response\";\n\n/**\n * 500 Server Error\n *\n * The server has encountered a situation it does not know how to handle.\n *\n * See https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500\n */\nexport default function serverError(body?: object | string): Response {\n\treturn response(500, body ?? \"Server error\");\n}\n","export default function pathToRegex(path: string): RegExp {\n\tconst pattern =\n\t\tpath\n\t\t\t.split(\"/\")\n\t\t\t// Replace `[slug]` with a grouped match so we can pull out params\n\t\t\t.map((p) => {\n\t\t\t\treturn p.replace(/\\[([^\\/]+?)\\]/, \"(?<$1>[^\\\\/]+?)\");\n\t\t\t})\n\t\t\t.join(\"\\\\/\")\n\t\t\t// Replace globs with regex syntax\n\t\t\t.replaceAll(\"*\", \".*\") +\n\t\t// Ignore trailing slashes -- `/path` should be treated the same as `/path/`\n\t\t\"/*\";\n\treturn new RegExp(`^${pattern}/*$`);\n}\n","import { SerializeOptions, parse, serialize } from \"cookie\";\n\nexport default class CookieHelper {\n\trequest: Request;\n\tcookies: Map<string, string> = new Map();\n\n\tconstructor(request: Request) {\n\t\tthis.request = request;\n\t}\n\n\tget(name: string): string | undefined {\n\t\t// If it's been set, return the value from the map\n\t\tif (this.cookies.has(name)) {\n\t\t\treturn parse(this.cookies.get(name)!)[name];\n\t\t}\n\t\t// Otherwise, return the value from the `cookie` header\n\t\tconst header = this.request.headers.get(\"cookie\");\n\t\treturn parse(header ?? \"\")[name];\n\t}\n\n\tset(name: string, value: string, options?: SerializeOptions): void {\n\t\t// Set a cookie header with some default values for security\n\t\toptions ??= {};\n\t\toptions.httpOnly ??= true;\n\t\toptions.secure ??= true;\n\t\toptions.sameSite ??= \"lax\";\n\t\tthis.cookies.set(name, serialize(name, value, options));\n\t}\n\n\tdelete(name: string, options?: SerializeOptions): void {\n\t\t// Set a cookie header with an immediate expiry date\n\t\toptions ??= {};\n\t\toptions.expires = new Date(0);\n\t\tthis.cookies.set(name, serialize(name, \"\", options));\n\t}\n}\n","export default class HeaderHelper {\n\trequest: Request;\n\theaders: Map<string, string> = new Map();\n\n\tconstructor(request: Request) {\n\t\tthis.request = request;\n\t}\n\n\tget(name: string): string | undefined {\n\t\t// If it's been set, return the updated value\n\t\tif (this.headers.has(name)) {\n\t\t\treturn this.headers.get(name);\n\t\t}\n\t\t// Otherwise, return the value from the header\n\t\treturn this.request.headers.get(name) ?? undefined;\n\t}\n\n\tset(name: string, value: string): void {\n\t\tthis.headers.set(name, value);\n\t}\n\n\tdelete(name: string): void {\n\t\tthis.headers.delete(name);\n\t}\n}\n","import CookieHelper from \"./CookieHelper\";\nimport HeaderHelper from \"./HeaderHelper\";\n\nexport default class ServerEvent {\n\trequest: Request;\n\tresponse: Response | undefined | void;\n\t// TODO: Should we cast types??\n\tparams?: Record<string, string>;\n\n\tadapter: any;\n\n\tcookies: CookieHelper;\n\theaders: HeaderHelper;\n\n\tconstructor(request: Request, params?: Record<string, string>) {\n\t\tthis.request = request;\n\t\tthis.params = params;\n\t\tthis.cookies = new CookieHelper(request);\n\t\tthis.headers = new HeaderHelper(request);\n\n\t\t// Adapters may have added the `adapter` property to globalThis\n\t\t// @ts-ignore\n\t\tthis.adapter = globalThis.adapter;\n\t}\n\n\taddHeaders(): void {\n\t\tif (!this.response) {\n\t\t\tthrow new Error(\"Response not created yet\");\n\t\t}\n\n\t\tfor (let cookie of this.cookies.cookies.values()) {\n\t\t\tthis.response.headers.append(\"set-cookie\", cookie);\n\t\t}\n\n\t\tfor (let header of this.headers.headers.entries()) {\n\t\t\tthis.response.headers.append(header[0], header[1]);\n\t\t}\n\t}\n}\n","import pathToRegex from \"../site/pathToRegex\";\nimport ServerEvent from \"./ServerEvent\";\nimport type MiddlewareFunction from \"./types/MiddlewareFunction\";\nimport type ServerFunction from \"./types/ServerFunction\";\n\nconst noop = () => {};\n\n/**\n * A Fetch API Request/Response server.\n */\nexport default class Server {\n\t// TODO: We don't use any of the routes, just add(\"*\") in runDev/runBuild...\n\troutes: RouteHandler[] = [];\n\t// TODO: We only use the Vite middleware here\n\tmiddleware: MiddlewareFunction[] = [];\n\n\tconstructor() {\n\t\tthis.routes = [];\n\t\tthis.middleware = [];\n\t}\n\n\t/**\n\t * The standard Fetch API method that should work in any runtime (including\n\t * Node with polyfills).\n\t * @returns\n\t */\n\tfetch = async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n\t\tconst request = new Request(input, init);\n\t\tconst url = new URL(request.url);\n\t\tconst match = this.match(url.pathname);\n\t\tlet ev = new ServerEvent(request, match?.params);\n\n\t\tif (this.middleware.length) {\n\t\t\t// TODO: Get middleware that applies to this route only?\n\t\t\tawait this.middleware[0](ev, buildNext(this.middleware, 0));\n\t\t\tfunction buildNext(middleware: MiddlewareFunction[], i: number): () => void | Promise<void> {\n\t\t\t\tif (ev.response) {\n\t\t\t\t\treturn noop;\n\t\t\t\t}\n\n\t\t\t\tif (i < middleware.length - 1) {\n\t\t\t\t\tlet next = middleware[i + 1];\n\t\t\t\t\treturn async () => next(ev, buildNext(middleware, i + 1));\n\t\t\t\t} else {\n\t\t\t\t\treturn match\n\t\t\t\t\t\t? async () => {\n\t\t\t\t\t\t\t\tev.response = await match.fn(ev);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: noop;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (match) {\n\t\t\tev.response = await match.fn(ev);\n\t\t} else {\n\t\t\treturn new Response(null, { status: 404 });\n\t\t}\n\n\t\t// TODO: Should I be returning 200 if there's no response? Because it's not an error??\n\t\tev.response ??= new Response(null, { status: 200 });\n\t\tev.addHeaders();\n\n\t\treturn ev.response;\n\t};\n\n\t/**\n\t * Adds a server function at a route path.\n\t * @param path The route path pattern.\n\t * @param fn The function to call when the pattern is matched.\n\t * @returns\n\t */\n\tadd(path: string, fn: ServerFunction): Server {\n\t\tthis.routes.push(new RouteHandler(path, fn));\n\t\tthis.#sortRoutes();\n\t\treturn this;\n\t}\n\n\tmatch(path: string): Match | undefined {\n\t\tfor (let handler of this.routes) {\n\t\t\tlet match = path.match(handler.regex);\n\t\t\tif (match) {\n\t\t\t\treturn {\n\t\t\t\t\tfn: handler.fn,\n\t\t\t\t\tparams: match.groups,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\tconsole.log(`Server path not found: ${path}`);\n\t}\n\n\t// TODO:\n\t//use(path: string, ...fn: MiddlewareFunction[])\n\tuse(...fn: MiddlewareFunction[]): Server {\n\t\tthis.middleware = this.middleware.concat(fn);\n\t\treturn this;\n\t}\n\n\t#sortRoutes() {\n\t\tthis.routes = this.routes.sort((a, b) => {\n\t\t\t// Sort [param]s after paths\n\t\t\t// There might be a quicker/easier way to do this\n\t\t\tfor (let i = 0; i < Math.min(a.path.length, b.path.length); i++) {\n\t\t\t\tif (a.path[i] === \"[\" && b.path[i] !== \"[\") {\n\t\t\t\t\treturn 1;\n\t\t\t\t} else if (b.path[i] === \"[\" && a.path[i] !== \"[\") {\n\t\t\t\t\treturn -1;\n\t\t\t\t} else if (a.path[i] === b.path[i]) {\n\t\t\t\t\t// Keep going...\n\t\t\t\t} else {\n\t\t\t\t\treturn a.path[i].localeCompare(b.path[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn a.path.length - b.path.length;\n\t\t});\n\t}\n}\n\nclass RouteHandler {\n\tpath: string;\n\tregex: RegExp;\n\tfn: ServerFunction;\n\n\tconstructor(path: string, fn: ServerFunction) {\n\t\tthis.path = path;\n\t\tthis.regex = pathToRegex(path);\n\t\tthis.fn = fn;\n\t}\n}\n\n//class MiddlewareHandler {\n//\tpath: string;\n//\tregex: RegExp;\n//\tfn: MiddlewareFunction;\n//\n//\tconstructor(path: string, fn: MiddlewareFunction) {\n//\t\tthis.path = path;\n//\t\tthis.regex = pathToRegex(path);\n//\t\tthis.fn = fn;\n//\t}\n//}\n\ntype Match = {\n\tfn: ServerFunction;\n\tparams?: Record<string, string>;\n};\n","// From https://stackoverflow.com/a/79345620\n// No idea why it is needed\nexport default function bufferToArrayBuffer(buffer: Buffer): ArrayBuffer {\n\treturn buffer.buffer.slice(\n\t\tbuffer.byteOffset,\n\t\tbuffer.byteOffset + buffer.byteLength,\n\t) as ArrayBuffer;\n}\n","import { IncomingHttpHeaders } from \"node:http\";\nimport { OutgoingHttpHeaders } from \"node:http2\";\n\nexport default function flattenHeaders(\n\theaders: IncomingHttpHeaders | OutgoingHttpHeaders,\n): HeadersInit {\n\tconst flatHeaders = new Headers();\n\tfor (const [key, value] of Object.entries(headers)) {\n\t\tif (value === undefined || value === null) {\n\t\t\tcontinue;\n\t\t} else if (Array.isArray(value)) {\n\t\t\tfor (const v of value) {\n\t\t\t\tif (v !== undefined && v !== null) {\n\t\t\t\t\tvalue.forEach((v) => flatHeaders.append(key, v));\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tflatHeaders.set(key, String(value));\n\t\t}\n\t}\n\treturn flatHeaders;\n\n\t/*\n const flatHeaders: [string, string][] = [];\n\n\tfor (const [key, value] of Object.entries(headers)) {\n\t\tif (value === undefined || value === null) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (Array.isArray(value)) {\n\t\t\tfor (const v of value) {\n\t\t\t\tif (v != null) {\n\t\t\t\t\tflatHeaders.push([key, String(v)]);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tflatHeaders.push([key, String(value)]);\n\t\t}\n\t}\n\n\treturn flatHeaders;\n */\n}\n","import {\n\ttype IncomingMessage,\n\ttype OutgoingHttpHeader,\n\ttype OutgoingHttpHeaders,\n\tServerResponse,\n} from \"node:http\";\nimport { PassThrough, Readable } from \"node:stream\";\n\n// From https://github.com/vikejs/vike-node/blob/main/packages/vike-node/src/runtime/adapters/createServerResponse.ts\n\n/**\n * Creates a custom ServerResponse object that allows for intercepting and\n * streaming the response.\n *\n * @param incomingMessage The incoming HTTP request message.\n * @returns An object containing the custom ServerResponse and a function that\n * takes a callback to invoke when the response is readable, providing an object\n * with the readable stream, headers and status code.\n */\nexport default function nodeMessageToNodeResponse(\n\tincomingMessage: IncomingMessage,\n): ServerResponseResponse {\n\tconst res = new ServerResponse(incomingMessage);\n\tconst passThrough = new PassThrough();\n\tlet handled = false;\n\n\tconst onReadable = (\n\t\tcb: (result: { readable: Readable; headers: OutgoingHttpHeaders; status: number }) => void,\n\t) => {\n\t\tconst handleReadable = () => {\n\t\t\tif (handled) return;\n\t\t\thandled = true;\n\t\t\tcb({\n\t\t\t\treadable: Readable.from(passThrough),\n\t\t\t\theaders: res.getHeaders(),\n\t\t\t\tstatus: res.statusCode,\n\t\t\t});\n\t\t};\n\n\t\tpassThrough.once(\"readable\", handleReadable);\n\t\tpassThrough.once(\"end\", handleReadable);\n\t};\n\n\tpassThrough.once(\"finish\", () => {\n\t\tres.emit(\"finish\");\n\t});\n\tpassThrough.once(\"close\", () => {\n\t\tres.destroy();\n\t\tres.emit(\"close\");\n\t});\n\tpassThrough.on(\"drain\", () => {\n\t\tres.emit(\"drain\");\n\t});\n\n\tres.write = passThrough.write.bind(passThrough);\n\tres.end = passThrough.end.bind(passThrough) as any;\n\n\tres.writeHead = function writeHead(\n\t\tstatusCode: number,\n\t\tstatusMessage?: string | OutgoingHttpHeaders | OutgoingHttpHeader[],\n\t\theaders?: OutgoingHttpHeaders | OutgoingHttpHeader[],\n\t): ServerResponse {\n\t\tres.statusCode = statusCode;\n\t\tif (typeof statusMessage === \"object\") {\n\t\t\theaders = statusMessage;\n\t\t\tstatusMessage = undefined;\n\t\t}\n\t\tif (headers) {\n\t\t\tfor (const [key, value] of Object.entries(headers)) {\n\t\t\t\tif (value !== undefined) {\n\t\t\t\t\tres.setHeader(key, value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn res;\n\t};\n\n\treturn {\n\t\tres,\n\t\tonReadable,\n\t};\n}\n\ntype ServerResponseResponse = {\n\tres: ServerResponse;\n\tonReadable: (\n\t\tcb: (result: { readable: Readable; headers: OutgoingHttpHeaders; status: number }) => void,\n\t) => void;\n};\n","import { Readable } from \"node:stream\";\n\nexport default function readableToBuffer(req: Readable): Promise<Buffer> {\n\treturn new Promise<Buffer>((resolve, reject) => {\n\t\tconst chunks: Buffer[] = [];\n\t\treq.on(\"data\", (chunk: Buffer) => {\n\t\t\tchunks.push(chunk);\n\t\t});\n\t\treq.on(\"end\", () => {\n\t\t\tresolve(Buffer.concat(chunks));\n\t\t});\n\t\treq.on(\"error\", (err) => {\n\t\t\treject(err);\n\t\t});\n\t});\n}\n","import { type IncomingMessage } from \"node:http\";\nimport { Readable } from \"node:stream\";\n\n// From https://github.com/vikejs/vike-node/blob/main/packages/vike-node/src/runtime/adapters/connectToWeb.ts\n\nconst DUMMY_BASE_URL = \"http://localhost\";\n\n/**\n * Creates an IncomingMessage object from a web Request.\n *\n * @param {Request} request - The web Request object.\n * @returns {IncomingMessage} An IncomingMessage-like object compatible with Node.js HTTP module.\n */\nexport default function requestToNodeMessage(request: Request): IncomingMessage {\n\tconst parsedUrl = new URL(request.url, DUMMY_BASE_URL);\n\tconst pathAndQuery = (parsedUrl.pathname || \"\") + (parsedUrl.search || \"\");\n\t// HACK: Using Readable.fromWeb locks request.body so that the request cannot be used again\n\t// As we're only using this for Vite middlewares, it's safe to discard the body for now?\n\tconst body = /*request.body ? Readable.fromWeb(request.body as any) :*/ Readable.from([]);\n\n\treturn Object.assign(body, {\n\t\turl: pathAndQuery,\n\t\tmethod: request.method,\n\t\theaders: Object.fromEntries(request.headers),\n\t}) as IncomingMessage;\n}\n","import { IncomingMessage, ServerResponse } from \"node:http\";\nimport type MiddlewareFunction from \"../types/MiddlewareFunction\";\nimport bufferToArrayBuffer from \"./bufferToArrayBuffer\";\nimport flattenHeaders from \"./flattenHeaders\";\nimport nodeMessageToNodeResponse from \"./nodeMessageToNodeResponse\";\nimport readableToBuffer from \"./readableToBuffer\";\nimport requestToNodeMessage from \"./requestToNodeMessage\";\n\n// From https://github.com/vikejs/vike-node/blob/main/packages/vike-node/src/runtime/adapters/connectToWeb.ts\n\n/**\n * Converts a Connect-style middleware to a web-compatible request handler.\n *\n * @param handler - The Connect-style middleware function to be converted.\n * @returns A function that handles web requests and returns a Response or undefined.\n */\nexport default function connectMiddleware(\n\thandler: ConnectMiddleware | ConnectMiddlewareBoolean,\n): MiddlewareFunction {\n\treturn async (ev, next) => {\n\t\tconst req = requestToNodeMessage(ev.request);\n\t\tconst { res, onReadable } = nodeMessageToNodeResponse(req);\n\n\t\treturn new Promise<void>(async (resolve, reject) => {\n\t\t\tonReadable(async ({ readable, headers, status }) => {\n\t\t\t\tconst responseBody = statusCodesWithoutBody.includes(status)\n\t\t\t\t\t? null\n\t\t\t\t\t: //(Readable.toWeb(readable) as ReadableStream);\n\t\t\t\t\t\t// HACK: Chunked bodies are not being\n\t\t\t\t\t\t// read correctly somewhere...\n\t\t\t\t\t\tbufferToArrayBuffer(await readableToBuffer(readable));\n\t\t\t\tev.response = new Response(responseBody, {\n\t\t\t\t\tstatus,\n\t\t\t\t\theaders: flattenHeaders(headers),\n\t\t\t\t});\n\t\t\t\tresolve();\n\t\t\t});\n\n\t\t\tconst cnext = async (error?: unknown) => {\n\t\t\t\tif (error) {\n\t\t\t\t\treject(error instanceof Error ? error : new Error(String(error)));\n\t\t\t\t} else {\n\t\t\t\t\t// TODO: Can we nest the next functions less? This is a bit weird\n\t\t\t\t\tawait next();\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\tconst handled = await handler(req, res, cnext);\n\t\t\t\tif (handled === false) {\n\t\t\t\t\tres.destroy();\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tcnext(e);\n\t\t\t}\n\t\t});\n\t};\n}\n\nconst statusCodesWithoutBody = [\n\t100, // Continue\n\t101, // Switching Protocols\n\t102, // Processing (WebDAV)\n\t103, // Early Hints\n\t204, // No Content\n\t205, // Reset Content\n\t304, // Not Modified\n];\n\ntype NextFunction = (err?: unknown) => void;\ntype ConnectMiddleware<\n\tPlatformRequest extends IncomingMessage = IncomingMessage,\n\tPlatformResponse extends ServerResponse = ServerResponse,\n> = (req: PlatformRequest, res: PlatformResponse, next: NextFunction) => void | Promise<void>;\ntype ConnectMiddlewareBoolean<\n\tPlatformRequest extends IncomingMessage = IncomingMessage,\n\tPlatformResponse extends ServerResponse = ServerResponse,\n> = (req: PlatformRequest, res: PlatformResponse, next: NextFunction) => boolean | Promise<boolean>;\n","export default function prepareTemplate(template: string, clientScript: string): string {\n\tlet result = template;\n\n\t// Put %COMPONENT_HEAD% before </head>\n\t// This is where styles will go\n\tlet headStart = result.indexOf(\"</head>\");\n\tif (headStart === -1) {\n\t\tthrow new Error(`Couldn't find <head> end tag`);\n\t}\n\tresult = result.substring(0, headStart) + \"%COMPONENT_HEAD%\" + result.substring(headStart);\n\n\t// Put %COMPONENT_BODY% inside <div id=\"app\"></div>\n\t// This is where the component's HTML will go\n\tlet bodyStart = regexIndexOf(result, /\\<div\\s+id=(\"app\"|'app'|app)\\s+/);\n\tbodyStart = result.indexOf(\">\", bodyStart) + 1;\n\tlet bodyEnd = result.indexOf(\"</div>\", bodyStart);\n\tif (bodyStart === -1 || bodyEnd === -1) {\n\t\tthrow new Error(`Couldn't find <div id=\"app\"></div>`);\n\t}\n\tresult = result.substring(0, bodyStart) + \"%COMPONENT_BODY%\" + result.substring(bodyEnd);\n\n\t// Add the clientEntry script at the very end, for hydrating and navigating\n\tresult += `<script type=\"module\" src=\"${clientScript}\"></script>`;\n\n\treturn result;\n}\n\n// From https://stackoverflow.com/a/274094\nfunction regexIndexOf(string: string, regex: RegExp, position?: number) {\n\tvar indexOf = string.substring(position || 0).search(regex);\n\treturn indexOf >= 0 ? indexOf + (position || 0) : indexOf;\n}\n","import { configDotenv } from \"dotenv\";\nimport { existsSync, promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { serverError } from \"../response.ts\";\nimport Server from \"../server/Server.ts\";\nimport contentType from \"../server/contentType.ts\";\nimport Site from \"./Site\";\nimport prepareTemplate from \"./prepareTemplate.ts\";\nimport runBuild from \"./runBuild\";\n\nexport default async function runPreview(site: Site): Promise<void> {\n\t// Build the site\n\tawait runBuild(site);\n\n\tconst distFolder = path.resolve(site.root, \"dist\");\n\tconst clientFolder = path.join(distFolder, \"client\");\n\tconst serverFolder = path.join(distFolder, \"server\");\n\n\t// Find the client script file in /assets\n\tlet clientScript = (await fs.readdir(path.join(clientFolder, \"assets\"))).find((f) =>\n\t\tf.startsWith(\"clientEntry-\"),\n\t);\n\tif (!clientScript) {\n\t\tthrow new Error(\"clientEntry.js not found\");\n\t}\n\tclientScript = `/assets/${clientScript}`;\n\n\t// Read site.html\n\t// It's called site.html because @torpor/build builds the site (html, routes\n\t// etc) while the user builds the app (components etc)\n\tlet siteHtml = path.join(clientFolder, \"site.html\");\n\tlet template = await fs.readFile(siteHtml, \"utf-8\");\n\n\t// Prepare site.html so that we can just splice components into it\n\ttemplate = prepareTemplate(template, clientScript);\n\n\t// Configure the server\n\tconst server = new Server();\n\n\t// Serve dist/client/assets statically\n\tserver.add(\"/assets/*\", async (ev) => {\n\t\ttry {\n\t\t\tconst url = new URL(ev.request.url);\n\t\t\tconst file = path.join(site.root, \"dist\", \"client\", url.pathname);\n\t\t\tif (existsSync(file)) {\n\t\t\t\t// TODO: Stream the data?\n\t\t\t\tconst body = bufferToArrayBuffer(await fs.readFile(file));\n\t\t\t\treturn new Response(body, {\n\t\t\t\t\tstatus: 200,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"Content-Type\": contentType(path.extname(file)),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (e: any) {\n\t\t\treturn serverError(e);\n\t\t}\n\t});\n\n\t// Every request (GET, POST, etc) goes through loadEndPoint\n\tconst serverScript = path.resolve(serverFolder, \"serverEntry.js\");\n\tserver.add(\"*\", async (ev) => {\n\t\ttry {\n\t\t\t// Load the server entry\n\t\t\tconst { load } = await import(serverScript);\n\n\t\t\t// Render the app HTML (or fetch server data etc) via serverEntry's\n\t\t\t// exported `load` function\n\t\t\treturn await load(ev, template);\n\t\t} catch (e: any) {\n\t\t\treturn serverError(e);\n\t\t}\n\t});\n\n\t// Load environment variables from a `.env` file, with defaults if not set\n\tconfigDotenv();\n\n\tprocess.env.PROTOCOL ??= \"http:\";\n\tprocess.env.HOST ??= \"localhost\";\n\tprocess.env.PORT ??= \"7059\";\n\n\t// Serve the site\n\tsite.adapter.serve(server, site);\n}\n\n// From https://stackoverflow.com/a/79345620\n// No idea why it is needed\nfunction bufferToArrayBuffer(buffer: Buffer): ArrayBuffer {\n\treturn buffer.buffer.slice(\n\t\tbuffer.byteOffset,\n\t\tbuffer.byteOffset + buffer.byteLength,\n\t) as ArrayBuffer;\n}\n","// From https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/MIME_types/Common_types\n\nexport default function contentType(extension: string): string {\n\treturn types[extension] || \"application/octet-stream\";\n}\n\nconst types: Record<string, string> = {\n\t\".aac\": \"audio/aac\",\n\t\".abw\": \"application/x-abiword\",\n\t\".apng\": \"image/apng\",\n\t\".arc\": \"application/x-freearc\",\n\t\".avif\": \"image/avif\",\n\t\".avi\": \"video/x-msvideo\",\n\t\".azw\": \"application/vnd.amazon.ebook\",\n\t\".bin\": \"application/octet-stream\",\n\t\".bmp\": \"image/bmp\",\n\t\".bz\": \"application/x-bzip\",\n\t\".bz2\": \"application/x-bzip2\",\n\t\".cda\": \"application/x-cdf\",\n\t\".csh\": \"application/x-csh\",\n\t\".css\": \"text/css\",\n\t\".csv\": \"text/csv\",\n\t\".doc\": \"application/msword\",\n\t\".docx\": \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n\t\".eot\": \"application/vnd.ms-fontobject\",\n\t\".epub\": \"application/epub+zip\",\n\t\".gz\": \"application/gzip\",\n\t\".gif\": \"image/gif\",\n\t\".htm\": \"text/html\",\n\t\".html\": \"text/html\",\n\t\".ico\": \"image/vnd.microsoft.icon\",\n\t\".ics\": \"text/calendar\",\n\t\".jar\": \"application/java-archive\",\n\t\".jpeg\": \"image/jpeg\",\n\t\".jpg\": \"image/jpeg\",\n\t\".js\": \"text/javascript\",\n\t\".json\": \"application/json\",\n\t\".jsonld\": \"application/ld+json\",\n\t\".mid\": \"audio/midi\",\n\t\".midi\": \"audio/midi\",\n\t\".mjs\": \"text/javascript\",\n\t\".mp3\": \"audio/mpeg\",\n\t\".mp4\": \"video/mp4\",\n\t\".mpeg\": \"video/mpeg\",\n\t\".mpkg\": \"application/vnd.apple.installer+xml\",\n\t\".odp\": \"application/vnd.oasis.opendocument.presentation\",\n\t\".ods\": \"application/vnd.oasis.opendocument.spreadsheet\",\n\t\".odt\": \"application/vnd.oasis.opendocument.text\",\n\t\".oga\": \"audio/ogg\",\n\t\".ogv\": \"video/ogg\",\n\t\".ogx\": \"application/ogg\",\n\t\".opus\": \"audio/ogg\",\n\t\".otf\": \"font/otf\",\n\t\".png\": \"image/png\",\n\t\".pdf\": \"application/pdf\",\n\t\".php\": \"application/x-httpd-php\",\n\t\".ppt\": \"application/vnd.ms-powerpoint\",\n\t\".pptx\": \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n\t\".rar\": \"application/vnd.rar\",\n\t\".rtf\": \"application/rtf\",\n\t\".sh\": \"application/x-sh\",\n\t\".svg\": \"image/svg+xml\",\n\t\".tar\": \"application/x-tar\",\n\t\".tif\": \"image/tiff\",\n\t\".tiff\": \"image/tiff\",\n\t\".ts\": \"video/mp2t\",\n\t\".ttf\": \"font/ttf\",\n\t\".txt\": \"text/plain\",\n\t\".vsd\": \"application/vnd.visio\",\n\t\".wav\": \"audio/wav\",\n\t\".weba\": \"audio/webm\",\n\t\".webm\": \"video/webm\",\n\t\".webp\": \"image/webp\",\n\t\".woff\": \"font/woff\",\n\t\".woff2\": \"font/woff2\",\n\t\".xhtml\": \"application/xhtml+xml\",\n\t\".xls\": \"application/vnd.ms-excel\",\n\t\".xlsx\": \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n\t\".xml\": \"application/xml\",\n\t\".xul\": \"application/vnd.mozilla.xul+xml\",\n\t\".zip\": \"application/zip\",\n\t\".3gp\": \"video/3gpp\",\n\t\".3g2\": \"video/3gpp2\",\n\t\".7z\": \"application/x-7z-compressed\",\n};\n"],"mappings":"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","names":["import_node_fs","import_node_path","import_vite","import_node_fs","import_node_path","import_vite","path","path","fs","torpor","import_vite","import_node_fs","import_node_path","path","buildNext","path","v","import_node_stream","torpor","estorpor","createViteServer","path","fs","import_dotenv","import_node_fs","import_node_path","path","fs","bufferToArrayBuffer","path","fs"]}
|
package/dist/run.d.cts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { S as Site } from './Site-DQojGpE-.cjs';
|
|
2
|
-
import 'vite';
|
|
3
|
-
import './Server-CNZWh5ca.cjs';
|
|
4
|
-
import 'cookie';
|
|
5
|
-
|
|
6
|
-
declare function run(folder: string, mode: "dev" | "build" | "preview"): Promise<void>;
|
|
7
|
-
|
|
8
|
-
declare function runBuild(site: Site): Promise<void>;
|
|
9
|
-
|
|
10
|
-
declare function runDev(site: Site): Promise<void>;
|
|
11
|
-
|
|
12
|
-
declare function runPreview(site: Site): Promise<void>;
|
|
13
|
-
|
|
14
|
-
export { run, runBuild, runDev, runPreview };
|
package/dist/run.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/server.cjs
DELETED
|
@@ -1,398 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
|
|
20
|
-
// src/server.ts
|
|
21
|
-
var server_exports = {};
|
|
22
|
-
__export(server_exports, {
|
|
23
|
-
CookieHelper: () => CookieHelper,
|
|
24
|
-
HeaderHelper: () => HeaderHelper,
|
|
25
|
-
Server: () => Server,
|
|
26
|
-
ServerEvent: () => ServerEvent,
|
|
27
|
-
connectMiddleware: () => connectMiddleware
|
|
28
|
-
});
|
|
29
|
-
module.exports = __toCommonJS(server_exports);
|
|
30
|
-
|
|
31
|
-
// src/server/CookieHelper.ts
|
|
32
|
-
var import_cookie = require("cookie");
|
|
33
|
-
var CookieHelper = class {
|
|
34
|
-
request;
|
|
35
|
-
cookies = /* @__PURE__ */ new Map();
|
|
36
|
-
constructor(request) {
|
|
37
|
-
this.request = request;
|
|
38
|
-
}
|
|
39
|
-
get(name) {
|
|
40
|
-
if (this.cookies.has(name)) {
|
|
41
|
-
return (0, import_cookie.parse)(this.cookies.get(name))[name];
|
|
42
|
-
}
|
|
43
|
-
const header = this.request.headers.get("cookie");
|
|
44
|
-
return (0, import_cookie.parse)(header ?? "")[name];
|
|
45
|
-
}
|
|
46
|
-
set(name, value, options) {
|
|
47
|
-
options ??= {};
|
|
48
|
-
options.httpOnly ??= true;
|
|
49
|
-
options.secure ??= true;
|
|
50
|
-
options.sameSite ??= "lax";
|
|
51
|
-
this.cookies.set(name, (0, import_cookie.serialize)(name, value, options));
|
|
52
|
-
}
|
|
53
|
-
delete(name, options) {
|
|
54
|
-
options ??= {};
|
|
55
|
-
options.expires = /* @__PURE__ */ new Date(0);
|
|
56
|
-
this.cookies.set(name, (0, import_cookie.serialize)(name, "", options));
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
// src/server/HeaderHelper.ts
|
|
61
|
-
var HeaderHelper = class {
|
|
62
|
-
request;
|
|
63
|
-
headers = /* @__PURE__ */ new Map();
|
|
64
|
-
constructor(request) {
|
|
65
|
-
this.request = request;
|
|
66
|
-
}
|
|
67
|
-
get(name) {
|
|
68
|
-
if (this.headers.has(name)) {
|
|
69
|
-
return this.headers.get(name);
|
|
70
|
-
}
|
|
71
|
-
return this.request.headers.get(name) ?? void 0;
|
|
72
|
-
}
|
|
73
|
-
set(name, value) {
|
|
74
|
-
this.headers.set(name, value);
|
|
75
|
-
}
|
|
76
|
-
delete(name) {
|
|
77
|
-
this.headers.delete(name);
|
|
78
|
-
}
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
// src/site/pathToRegex.ts
|
|
82
|
-
function pathToRegex(path) {
|
|
83
|
-
const pattern = path.split("/").map((p) => {
|
|
84
|
-
return p.replace(/\[([^\/]+?)\]/, "(?<$1>[^\\/]+?)");
|
|
85
|
-
}).join("\\/").replaceAll("*", ".*") + // Ignore trailing slashes -- `/path` should be treated the same as `/path/`
|
|
86
|
-
"/*";
|
|
87
|
-
return new RegExp(`^${pattern}/*$`);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// src/server/ServerEvent.ts
|
|
91
|
-
var ServerEvent = class {
|
|
92
|
-
request;
|
|
93
|
-
response;
|
|
94
|
-
// TODO: Should we cast types??
|
|
95
|
-
params;
|
|
96
|
-
adapter;
|
|
97
|
-
cookies;
|
|
98
|
-
headers;
|
|
99
|
-
constructor(request, params) {
|
|
100
|
-
this.request = request;
|
|
101
|
-
this.params = params;
|
|
102
|
-
this.cookies = new CookieHelper(request);
|
|
103
|
-
this.headers = new HeaderHelper(request);
|
|
104
|
-
this.adapter = globalThis.adapter;
|
|
105
|
-
}
|
|
106
|
-
addHeaders() {
|
|
107
|
-
if (!this.response) {
|
|
108
|
-
throw new Error("Response not created yet");
|
|
109
|
-
}
|
|
110
|
-
for (let cookie of this.cookies.cookies.values()) {
|
|
111
|
-
this.response.headers.append("set-cookie", cookie);
|
|
112
|
-
}
|
|
113
|
-
for (let header of this.headers.headers.entries()) {
|
|
114
|
-
this.response.headers.append(header[0], header[1]);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
// src/server/Server.ts
|
|
120
|
-
var noop = () => {
|
|
121
|
-
};
|
|
122
|
-
var Server = class {
|
|
123
|
-
// TODO: We don't use any of the routes, just add("*") in runDev/runBuild...
|
|
124
|
-
routes = [];
|
|
125
|
-
// TODO: We only use the Vite middleware here
|
|
126
|
-
middleware = [];
|
|
127
|
-
constructor() {
|
|
128
|
-
this.routes = [];
|
|
129
|
-
this.middleware = [];
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* The standard Fetch API method that should work in any runtime (including
|
|
133
|
-
* Node with polyfills).
|
|
134
|
-
* @returns
|
|
135
|
-
*/
|
|
136
|
-
fetch = async (input, init) => {
|
|
137
|
-
const request = new Request(input, init);
|
|
138
|
-
const url = new URL(request.url);
|
|
139
|
-
const match = this.match(url.pathname);
|
|
140
|
-
let ev = new ServerEvent(request, match?.params);
|
|
141
|
-
if (this.middleware.length) {
|
|
142
|
-
let buildNext2 = function(middleware, i) {
|
|
143
|
-
if (ev.response) {
|
|
144
|
-
return noop;
|
|
145
|
-
}
|
|
146
|
-
if (i < middleware.length - 1) {
|
|
147
|
-
let next = middleware[i + 1];
|
|
148
|
-
return async () => next(ev, buildNext2(middleware, i + 1));
|
|
149
|
-
} else {
|
|
150
|
-
return match ? async () => {
|
|
151
|
-
ev.response = await match.fn(ev);
|
|
152
|
-
} : noop;
|
|
153
|
-
}
|
|
154
|
-
};
|
|
155
|
-
var buildNext = buildNext2;
|
|
156
|
-
await this.middleware[0](ev, buildNext2(this.middleware, 0));
|
|
157
|
-
} else if (match) {
|
|
158
|
-
ev.response = await match.fn(ev);
|
|
159
|
-
} else {
|
|
160
|
-
return new Response(null, { status: 404 });
|
|
161
|
-
}
|
|
162
|
-
ev.response ??= new Response(null, { status: 200 });
|
|
163
|
-
ev.addHeaders();
|
|
164
|
-
return ev.response;
|
|
165
|
-
};
|
|
166
|
-
/**
|
|
167
|
-
* Adds a server function at a route path.
|
|
168
|
-
* @param path The route path pattern.
|
|
169
|
-
* @param fn The function to call when the pattern is matched.
|
|
170
|
-
* @returns
|
|
171
|
-
*/
|
|
172
|
-
add(path, fn) {
|
|
173
|
-
this.routes.push(new RouteHandler(path, fn));
|
|
174
|
-
this.#sortRoutes();
|
|
175
|
-
return this;
|
|
176
|
-
}
|
|
177
|
-
match(path) {
|
|
178
|
-
for (let handler of this.routes) {
|
|
179
|
-
let match = path.match(handler.regex);
|
|
180
|
-
if (match) {
|
|
181
|
-
return {
|
|
182
|
-
fn: handler.fn,
|
|
183
|
-
params: match.groups
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
console.log(`Server path not found: ${path}`);
|
|
188
|
-
}
|
|
189
|
-
// TODO:
|
|
190
|
-
//use(path: string, ...fn: MiddlewareFunction[])
|
|
191
|
-
use(...fn) {
|
|
192
|
-
this.middleware = this.middleware.concat(fn);
|
|
193
|
-
return this;
|
|
194
|
-
}
|
|
195
|
-
#sortRoutes() {
|
|
196
|
-
this.routes = this.routes.sort((a, b) => {
|
|
197
|
-
for (let i = 0; i < Math.min(a.path.length, b.path.length); i++) {
|
|
198
|
-
if (a.path[i] === "[" && b.path[i] !== "[") {
|
|
199
|
-
return 1;
|
|
200
|
-
} else if (b.path[i] === "[" && a.path[i] !== "[") {
|
|
201
|
-
return -1;
|
|
202
|
-
} else if (a.path[i] === b.path[i]) {
|
|
203
|
-
} else {
|
|
204
|
-
return a.path[i].localeCompare(b.path[i]);
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
return a.path.length - b.path.length;
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
|
-
};
|
|
211
|
-
var RouteHandler = class {
|
|
212
|
-
path;
|
|
213
|
-
regex;
|
|
214
|
-
fn;
|
|
215
|
-
constructor(path, fn) {
|
|
216
|
-
this.path = path;
|
|
217
|
-
this.regex = pathToRegex(path);
|
|
218
|
-
this.fn = fn;
|
|
219
|
-
}
|
|
220
|
-
};
|
|
221
|
-
|
|
222
|
-
// src/server/connect/bufferToArrayBuffer.ts
|
|
223
|
-
function bufferToArrayBuffer(buffer) {
|
|
224
|
-
return buffer.buffer.slice(
|
|
225
|
-
buffer.byteOffset,
|
|
226
|
-
buffer.byteOffset + buffer.byteLength
|
|
227
|
-
);
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
// src/server/connect/flattenHeaders.ts
|
|
231
|
-
function flattenHeaders(headers) {
|
|
232
|
-
const flatHeaders = new Headers();
|
|
233
|
-
for (const [key, value] of Object.entries(headers)) {
|
|
234
|
-
if (value === void 0 || value === null) {
|
|
235
|
-
continue;
|
|
236
|
-
} else if (Array.isArray(value)) {
|
|
237
|
-
for (const v of value) {
|
|
238
|
-
if (v !== void 0 && v !== null) {
|
|
239
|
-
value.forEach((v2) => flatHeaders.append(key, v2));
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
} else {
|
|
243
|
-
flatHeaders.set(key, String(value));
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
return flatHeaders;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
// src/server/connect/nodeMessageToNodeResponse.ts
|
|
250
|
-
var import_node_http = require("http");
|
|
251
|
-
var import_node_stream = require("stream");
|
|
252
|
-
function nodeMessageToNodeResponse(incomingMessage) {
|
|
253
|
-
const res = new import_node_http.ServerResponse(incomingMessage);
|
|
254
|
-
const passThrough = new import_node_stream.PassThrough();
|
|
255
|
-
let handled = false;
|
|
256
|
-
const onReadable = (cb) => {
|
|
257
|
-
const handleReadable = () => {
|
|
258
|
-
if (handled) return;
|
|
259
|
-
handled = true;
|
|
260
|
-
cb({
|
|
261
|
-
readable: import_node_stream.Readable.from(passThrough),
|
|
262
|
-
headers: res.getHeaders(),
|
|
263
|
-
status: res.statusCode
|
|
264
|
-
});
|
|
265
|
-
};
|
|
266
|
-
passThrough.once("readable", handleReadable);
|
|
267
|
-
passThrough.once("end", handleReadable);
|
|
268
|
-
};
|
|
269
|
-
passThrough.once("finish", () => {
|
|
270
|
-
res.emit("finish");
|
|
271
|
-
});
|
|
272
|
-
passThrough.once("close", () => {
|
|
273
|
-
res.destroy();
|
|
274
|
-
res.emit("close");
|
|
275
|
-
});
|
|
276
|
-
passThrough.on("drain", () => {
|
|
277
|
-
res.emit("drain");
|
|
278
|
-
});
|
|
279
|
-
res.write = passThrough.write.bind(passThrough);
|
|
280
|
-
res.end = passThrough.end.bind(passThrough);
|
|
281
|
-
res.writeHead = function writeHead(statusCode, statusMessage, headers) {
|
|
282
|
-
res.statusCode = statusCode;
|
|
283
|
-
if (typeof statusMessage === "object") {
|
|
284
|
-
headers = statusMessage;
|
|
285
|
-
statusMessage = void 0;
|
|
286
|
-
}
|
|
287
|
-
if (headers) {
|
|
288
|
-
for (const [key, value] of Object.entries(headers)) {
|
|
289
|
-
if (value !== void 0) {
|
|
290
|
-
res.setHeader(key, value);
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
return res;
|
|
295
|
-
};
|
|
296
|
-
return {
|
|
297
|
-
res,
|
|
298
|
-
onReadable
|
|
299
|
-
};
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
// src/server/connect/readableToBuffer.ts
|
|
303
|
-
function readableToBuffer(req) {
|
|
304
|
-
return new Promise((resolve, reject) => {
|
|
305
|
-
const chunks = [];
|
|
306
|
-
req.on("data", (chunk) => {
|
|
307
|
-
chunks.push(chunk);
|
|
308
|
-
});
|
|
309
|
-
req.on("end", () => {
|
|
310
|
-
resolve(Buffer.concat(chunks));
|
|
311
|
-
});
|
|
312
|
-
req.on("error", (err) => {
|
|
313
|
-
reject(err);
|
|
314
|
-
});
|
|
315
|
-
});
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
// src/server/connect/requestToNodeMessage.ts
|
|
319
|
-
var import_node_stream2 = require("stream");
|
|
320
|
-
var DUMMY_BASE_URL = "http://localhost";
|
|
321
|
-
function requestToNodeMessage(request) {
|
|
322
|
-
const parsedUrl = new URL(request.url, DUMMY_BASE_URL);
|
|
323
|
-
const pathAndQuery = (parsedUrl.pathname || "") + (parsedUrl.search || "");
|
|
324
|
-
const body = (
|
|
325
|
-
/*request.body ? Readable.fromWeb(request.body as any) :*/
|
|
326
|
-
import_node_stream2.Readable.from([])
|
|
327
|
-
);
|
|
328
|
-
return Object.assign(body, {
|
|
329
|
-
url: pathAndQuery,
|
|
330
|
-
method: request.method,
|
|
331
|
-
headers: Object.fromEntries(request.headers)
|
|
332
|
-
});
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
// src/server/connect/connectMiddleware.ts
|
|
336
|
-
function connectMiddleware(handler) {
|
|
337
|
-
return async (ev, next) => {
|
|
338
|
-
const req = requestToNodeMessage(ev.request);
|
|
339
|
-
const { res, onReadable } = nodeMessageToNodeResponse(req);
|
|
340
|
-
return new Promise(async (resolve, reject) => {
|
|
341
|
-
onReadable(async ({ readable, headers, status }) => {
|
|
342
|
-
const responseBody = statusCodesWithoutBody.includes(status) ? null : (
|
|
343
|
-
//(Readable.toWeb(readable) as ReadableStream);
|
|
344
|
-
// HACK: Chunked bodies are not being
|
|
345
|
-
// read correctly somewhere...
|
|
346
|
-
bufferToArrayBuffer(await readableToBuffer(readable))
|
|
347
|
-
);
|
|
348
|
-
ev.response = new Response(responseBody, {
|
|
349
|
-
status,
|
|
350
|
-
headers: flattenHeaders(headers)
|
|
351
|
-
});
|
|
352
|
-
resolve();
|
|
353
|
-
});
|
|
354
|
-
const cnext = async (error) => {
|
|
355
|
-
if (error) {
|
|
356
|
-
reject(error instanceof Error ? error : new Error(String(error)));
|
|
357
|
-
} else {
|
|
358
|
-
await next();
|
|
359
|
-
resolve();
|
|
360
|
-
}
|
|
361
|
-
};
|
|
362
|
-
try {
|
|
363
|
-
const handled = await handler(req, res, cnext);
|
|
364
|
-
if (handled === false) {
|
|
365
|
-
res.destroy();
|
|
366
|
-
resolve();
|
|
367
|
-
}
|
|
368
|
-
} catch (e) {
|
|
369
|
-
cnext(e);
|
|
370
|
-
}
|
|
371
|
-
});
|
|
372
|
-
};
|
|
373
|
-
}
|
|
374
|
-
var statusCodesWithoutBody = [
|
|
375
|
-
100,
|
|
376
|
-
// Continue
|
|
377
|
-
101,
|
|
378
|
-
// Switching Protocols
|
|
379
|
-
102,
|
|
380
|
-
// Processing (WebDAV)
|
|
381
|
-
103,
|
|
382
|
-
// Early Hints
|
|
383
|
-
204,
|
|
384
|
-
// No Content
|
|
385
|
-
205,
|
|
386
|
-
// Reset Content
|
|
387
|
-
304
|
|
388
|
-
// Not Modified
|
|
389
|
-
];
|
|
390
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
391
|
-
0 && (module.exports = {
|
|
392
|
-
CookieHelper,
|
|
393
|
-
HeaderHelper,
|
|
394
|
-
Server,
|
|
395
|
-
ServerEvent,
|
|
396
|
-
connectMiddleware
|
|
397
|
-
});
|
|
398
|
-
//# sourceMappingURL=server.cjs.map
|
package/dist/server.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server.ts","../src/server/CookieHelper.ts","../src/server/HeaderHelper.ts","../src/site/pathToRegex.ts","../src/server/ServerEvent.ts","../src/server/Server.ts","../src/server/connect/bufferToArrayBuffer.ts","../src/server/connect/flattenHeaders.ts","../src/server/connect/nodeMessageToNodeResponse.ts","../src/server/connect/readableToBuffer.ts","../src/server/connect/requestToNodeMessage.ts","../src/server/connect/connectMiddleware.ts"],"sourcesContent":["import CookieHelper from \"./server/CookieHelper\";\nimport HeaderHelper from \"./server/HeaderHelper\";\nimport Server from \"./server/Server\";\nimport ServerEvent from \"./server/ServerEvent\";\nimport connectMiddleware from \"./server/connect/connectMiddleware\";\n\nexport { Server, ServerEvent, CookieHelper, HeaderHelper, connectMiddleware };\n","import { SerializeOptions, parse, serialize } from \"cookie\";\n\nexport default class CookieHelper {\n\trequest: Request;\n\tcookies: Map<string, string> = new Map();\n\n\tconstructor(request: Request) {\n\t\tthis.request = request;\n\t}\n\n\tget(name: string): string | undefined {\n\t\t// If it's been set, return the value from the map\n\t\tif (this.cookies.has(name)) {\n\t\t\treturn parse(this.cookies.get(name)!)[name];\n\t\t}\n\t\t// Otherwise, return the value from the `cookie` header\n\t\tconst header = this.request.headers.get(\"cookie\");\n\t\treturn parse(header ?? \"\")[name];\n\t}\n\n\tset(name: string, value: string, options?: SerializeOptions): void {\n\t\t// Set a cookie header with some default values for security\n\t\toptions ??= {};\n\t\toptions.httpOnly ??= true;\n\t\toptions.secure ??= true;\n\t\toptions.sameSite ??= \"lax\";\n\t\tthis.cookies.set(name, serialize(name, value, options));\n\t}\n\n\tdelete(name: string, options?: SerializeOptions): void {\n\t\t// Set a cookie header with an immediate expiry date\n\t\toptions ??= {};\n\t\toptions.expires = new Date(0);\n\t\tthis.cookies.set(name, serialize(name, \"\", options));\n\t}\n}\n","export default class HeaderHelper {\n\trequest: Request;\n\theaders: Map<string, string> = new Map();\n\n\tconstructor(request: Request) {\n\t\tthis.request = request;\n\t}\n\n\tget(name: string): string | undefined {\n\t\t// If it's been set, return the updated value\n\t\tif (this.headers.has(name)) {\n\t\t\treturn this.headers.get(name);\n\t\t}\n\t\t// Otherwise, return the value from the header\n\t\treturn this.request.headers.get(name) ?? undefined;\n\t}\n\n\tset(name: string, value: string): void {\n\t\tthis.headers.set(name, value);\n\t}\n\n\tdelete(name: string): void {\n\t\tthis.headers.delete(name);\n\t}\n}\n","export default function pathToRegex(path: string): RegExp {\n\tconst pattern =\n\t\tpath\n\t\t\t.split(\"/\")\n\t\t\t// Replace `[slug]` with a grouped match so we can pull out params\n\t\t\t.map((p) => {\n\t\t\t\treturn p.replace(/\\[([^\\/]+?)\\]/, \"(?<$1>[^\\\\/]+?)\");\n\t\t\t})\n\t\t\t.join(\"\\\\/\")\n\t\t\t// Replace globs with regex syntax\n\t\t\t.replaceAll(\"*\", \".*\") +\n\t\t// Ignore trailing slashes -- `/path` should be treated the same as `/path/`\n\t\t\"/*\";\n\treturn new RegExp(`^${pattern}/*$`);\n}\n","import CookieHelper from \"./CookieHelper\";\nimport HeaderHelper from \"./HeaderHelper\";\n\nexport default class ServerEvent {\n\trequest: Request;\n\tresponse: Response | undefined | void;\n\t// TODO: Should we cast types??\n\tparams?: Record<string, string>;\n\n\tadapter: any;\n\n\tcookies: CookieHelper;\n\theaders: HeaderHelper;\n\n\tconstructor(request: Request, params?: Record<string, string>) {\n\t\tthis.request = request;\n\t\tthis.params = params;\n\t\tthis.cookies = new CookieHelper(request);\n\t\tthis.headers = new HeaderHelper(request);\n\n\t\t// Adapters may have added the `adapter` property to globalThis\n\t\t// @ts-ignore\n\t\tthis.adapter = globalThis.adapter;\n\t}\n\n\taddHeaders(): void {\n\t\tif (!this.response) {\n\t\t\tthrow new Error(\"Response not created yet\");\n\t\t}\n\n\t\tfor (let cookie of this.cookies.cookies.values()) {\n\t\t\tthis.response.headers.append(\"set-cookie\", cookie);\n\t\t}\n\n\t\tfor (let header of this.headers.headers.entries()) {\n\t\t\tthis.response.headers.append(header[0], header[1]);\n\t\t}\n\t}\n}\n","import pathToRegex from \"../site/pathToRegex\";\nimport ServerEvent from \"./ServerEvent\";\nimport type MiddlewareFunction from \"./types/MiddlewareFunction\";\nimport type ServerFunction from \"./types/ServerFunction\";\n\nconst noop = () => {};\n\n/**\n * A Fetch API Request/Response server.\n */\nexport default class Server {\n\t// TODO: We don't use any of the routes, just add(\"*\") in runDev/runBuild...\n\troutes: RouteHandler[] = [];\n\t// TODO: We only use the Vite middleware here\n\tmiddleware: MiddlewareFunction[] = [];\n\n\tconstructor() {\n\t\tthis.routes = [];\n\t\tthis.middleware = [];\n\t}\n\n\t/**\n\t * The standard Fetch API method that should work in any runtime (including\n\t * Node with polyfills).\n\t * @returns\n\t */\n\tfetch = async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n\t\tconst request = new Request(input, init);\n\t\tconst url = new URL(request.url);\n\t\tconst match = this.match(url.pathname);\n\t\tlet ev = new ServerEvent(request, match?.params);\n\n\t\tif (this.middleware.length) {\n\t\t\t// TODO: Get middleware that applies to this route only?\n\t\t\tawait this.middleware[0](ev, buildNext(this.middleware, 0));\n\t\t\tfunction buildNext(middleware: MiddlewareFunction[], i: number): () => void | Promise<void> {\n\t\t\t\tif (ev.response) {\n\t\t\t\t\treturn noop;\n\t\t\t\t}\n\n\t\t\t\tif (i < middleware.length - 1) {\n\t\t\t\t\tlet next = middleware[i + 1];\n\t\t\t\t\treturn async () => next(ev, buildNext(middleware, i + 1));\n\t\t\t\t} else {\n\t\t\t\t\treturn match\n\t\t\t\t\t\t? async () => {\n\t\t\t\t\t\t\t\tev.response = await match.fn(ev);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: noop;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (match) {\n\t\t\tev.response = await match.fn(ev);\n\t\t} else {\n\t\t\treturn new Response(null, { status: 404 });\n\t\t}\n\n\t\t// TODO: Should I be returning 200 if there's no response? Because it's not an error??\n\t\tev.response ??= new Response(null, { status: 200 });\n\t\tev.addHeaders();\n\n\t\treturn ev.response;\n\t};\n\n\t/**\n\t * Adds a server function at a route path.\n\t * @param path The route path pattern.\n\t * @param fn The function to call when the pattern is matched.\n\t * @returns\n\t */\n\tadd(path: string, fn: ServerFunction): Server {\n\t\tthis.routes.push(new RouteHandler(path, fn));\n\t\tthis.#sortRoutes();\n\t\treturn this;\n\t}\n\n\tmatch(path: string): Match | undefined {\n\t\tfor (let handler of this.routes) {\n\t\t\tlet match = path.match(handler.regex);\n\t\t\tif (match) {\n\t\t\t\treturn {\n\t\t\t\t\tfn: handler.fn,\n\t\t\t\t\tparams: match.groups,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\tconsole.log(`Server path not found: ${path}`);\n\t}\n\n\t// TODO:\n\t//use(path: string, ...fn: MiddlewareFunction[])\n\tuse(...fn: MiddlewareFunction[]): Server {\n\t\tthis.middleware = this.middleware.concat(fn);\n\t\treturn this;\n\t}\n\n\t#sortRoutes() {\n\t\tthis.routes = this.routes.sort((a, b) => {\n\t\t\t// Sort [param]s after paths\n\t\t\t// There might be a quicker/easier way to do this\n\t\t\tfor (let i = 0; i < Math.min(a.path.length, b.path.length); i++) {\n\t\t\t\tif (a.path[i] === \"[\" && b.path[i] !== \"[\") {\n\t\t\t\t\treturn 1;\n\t\t\t\t} else if (b.path[i] === \"[\" && a.path[i] !== \"[\") {\n\t\t\t\t\treturn -1;\n\t\t\t\t} else if (a.path[i] === b.path[i]) {\n\t\t\t\t\t// Keep going...\n\t\t\t\t} else {\n\t\t\t\t\treturn a.path[i].localeCompare(b.path[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn a.path.length - b.path.length;\n\t\t});\n\t}\n}\n\nclass RouteHandler {\n\tpath: string;\n\tregex: RegExp;\n\tfn: ServerFunction;\n\n\tconstructor(path: string, fn: ServerFunction) {\n\t\tthis.path = path;\n\t\tthis.regex = pathToRegex(path);\n\t\tthis.fn = fn;\n\t}\n}\n\n//class MiddlewareHandler {\n//\tpath: string;\n//\tregex: RegExp;\n//\tfn: MiddlewareFunction;\n//\n//\tconstructor(path: string, fn: MiddlewareFunction) {\n//\t\tthis.path = path;\n//\t\tthis.regex = pathToRegex(path);\n//\t\tthis.fn = fn;\n//\t}\n//}\n\ntype Match = {\n\tfn: ServerFunction;\n\tparams?: Record<string, string>;\n};\n","// From https://stackoverflow.com/a/79345620\n// No idea why it is needed\nexport default function bufferToArrayBuffer(buffer: Buffer): ArrayBuffer {\n\treturn buffer.buffer.slice(\n\t\tbuffer.byteOffset,\n\t\tbuffer.byteOffset + buffer.byteLength,\n\t) as ArrayBuffer;\n}\n","import { IncomingHttpHeaders } from \"node:http\";\nimport { OutgoingHttpHeaders } from \"node:http2\";\n\nexport default function flattenHeaders(\n\theaders: IncomingHttpHeaders | OutgoingHttpHeaders,\n): HeadersInit {\n\tconst flatHeaders = new Headers();\n\tfor (const [key, value] of Object.entries(headers)) {\n\t\tif (value === undefined || value === null) {\n\t\t\tcontinue;\n\t\t} else if (Array.isArray(value)) {\n\t\t\tfor (const v of value) {\n\t\t\t\tif (v !== undefined && v !== null) {\n\t\t\t\t\tvalue.forEach((v) => flatHeaders.append(key, v));\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tflatHeaders.set(key, String(value));\n\t\t}\n\t}\n\treturn flatHeaders;\n\n\t/*\n const flatHeaders: [string, string][] = [];\n\n\tfor (const [key, value] of Object.entries(headers)) {\n\t\tif (value === undefined || value === null) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (Array.isArray(value)) {\n\t\t\tfor (const v of value) {\n\t\t\t\tif (v != null) {\n\t\t\t\t\tflatHeaders.push([key, String(v)]);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tflatHeaders.push([key, String(value)]);\n\t\t}\n\t}\n\n\treturn flatHeaders;\n */\n}\n","import {\n\ttype IncomingMessage,\n\ttype OutgoingHttpHeader,\n\ttype OutgoingHttpHeaders,\n\tServerResponse,\n} from \"node:http\";\nimport { PassThrough, Readable } from \"node:stream\";\n\n// From https://github.com/vikejs/vike-node/blob/main/packages/vike-node/src/runtime/adapters/createServerResponse.ts\n\n/**\n * Creates a custom ServerResponse object that allows for intercepting and\n * streaming the response.\n *\n * @param incomingMessage The incoming HTTP request message.\n * @returns An object containing the custom ServerResponse and a function that\n * takes a callback to invoke when the response is readable, providing an object\n * with the readable stream, headers and status code.\n */\nexport default function nodeMessageToNodeResponse(\n\tincomingMessage: IncomingMessage,\n): ServerResponseResponse {\n\tconst res = new ServerResponse(incomingMessage);\n\tconst passThrough = new PassThrough();\n\tlet handled = false;\n\n\tconst onReadable = (\n\t\tcb: (result: { readable: Readable; headers: OutgoingHttpHeaders; status: number }) => void,\n\t) => {\n\t\tconst handleReadable = () => {\n\t\t\tif (handled) return;\n\t\t\thandled = true;\n\t\t\tcb({\n\t\t\t\treadable: Readable.from(passThrough),\n\t\t\t\theaders: res.getHeaders(),\n\t\t\t\tstatus: res.statusCode,\n\t\t\t});\n\t\t};\n\n\t\tpassThrough.once(\"readable\", handleReadable);\n\t\tpassThrough.once(\"end\", handleReadable);\n\t};\n\n\tpassThrough.once(\"finish\", () => {\n\t\tres.emit(\"finish\");\n\t});\n\tpassThrough.once(\"close\", () => {\n\t\tres.destroy();\n\t\tres.emit(\"close\");\n\t});\n\tpassThrough.on(\"drain\", () => {\n\t\tres.emit(\"drain\");\n\t});\n\n\tres.write = passThrough.write.bind(passThrough);\n\tres.end = passThrough.end.bind(passThrough) as any;\n\n\tres.writeHead = function writeHead(\n\t\tstatusCode: number,\n\t\tstatusMessage?: string | OutgoingHttpHeaders | OutgoingHttpHeader[],\n\t\theaders?: OutgoingHttpHeaders | OutgoingHttpHeader[],\n\t): ServerResponse {\n\t\tres.statusCode = statusCode;\n\t\tif (typeof statusMessage === \"object\") {\n\t\t\theaders = statusMessage;\n\t\t\tstatusMessage = undefined;\n\t\t}\n\t\tif (headers) {\n\t\t\tfor (const [key, value] of Object.entries(headers)) {\n\t\t\t\tif (value !== undefined) {\n\t\t\t\t\tres.setHeader(key, value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn res;\n\t};\n\n\treturn {\n\t\tres,\n\t\tonReadable,\n\t};\n}\n\ntype ServerResponseResponse = {\n\tres: ServerResponse;\n\tonReadable: (\n\t\tcb: (result: { readable: Readable; headers: OutgoingHttpHeaders; status: number }) => void,\n\t) => void;\n};\n","import { Readable } from \"node:stream\";\n\nexport default function readableToBuffer(req: Readable): Promise<Buffer> {\n\treturn new Promise<Buffer>((resolve, reject) => {\n\t\tconst chunks: Buffer[] = [];\n\t\treq.on(\"data\", (chunk: Buffer) => {\n\t\t\tchunks.push(chunk);\n\t\t});\n\t\treq.on(\"end\", () => {\n\t\t\tresolve(Buffer.concat(chunks));\n\t\t});\n\t\treq.on(\"error\", (err) => {\n\t\t\treject(err);\n\t\t});\n\t});\n}\n","import { type IncomingMessage } from \"node:http\";\nimport { Readable } from \"node:stream\";\n\n// From https://github.com/vikejs/vike-node/blob/main/packages/vike-node/src/runtime/adapters/connectToWeb.ts\n\nconst DUMMY_BASE_URL = \"http://localhost\";\n\n/**\n * Creates an IncomingMessage object from a web Request.\n *\n * @param {Request} request - The web Request object.\n * @returns {IncomingMessage} An IncomingMessage-like object compatible with Node.js HTTP module.\n */\nexport default function requestToNodeMessage(request: Request): IncomingMessage {\n\tconst parsedUrl = new URL(request.url, DUMMY_BASE_URL);\n\tconst pathAndQuery = (parsedUrl.pathname || \"\") + (parsedUrl.search || \"\");\n\t// HACK: Using Readable.fromWeb locks request.body so that the request cannot be used again\n\t// As we're only using this for Vite middlewares, it's safe to discard the body for now?\n\tconst body = /*request.body ? Readable.fromWeb(request.body as any) :*/ Readable.from([]);\n\n\treturn Object.assign(body, {\n\t\turl: pathAndQuery,\n\t\tmethod: request.method,\n\t\theaders: Object.fromEntries(request.headers),\n\t}) as IncomingMessage;\n}\n","import { IncomingMessage, ServerResponse } from \"node:http\";\nimport type MiddlewareFunction from \"../types/MiddlewareFunction\";\nimport bufferToArrayBuffer from \"./bufferToArrayBuffer\";\nimport flattenHeaders from \"./flattenHeaders\";\nimport nodeMessageToNodeResponse from \"./nodeMessageToNodeResponse\";\nimport readableToBuffer from \"./readableToBuffer\";\nimport requestToNodeMessage from \"./requestToNodeMessage\";\n\n// From https://github.com/vikejs/vike-node/blob/main/packages/vike-node/src/runtime/adapters/connectToWeb.ts\n\n/**\n * Converts a Connect-style middleware to a web-compatible request handler.\n *\n * @param handler - The Connect-style middleware function to be converted.\n * @returns A function that handles web requests and returns a Response or undefined.\n */\nexport default function connectMiddleware(\n\thandler: ConnectMiddleware | ConnectMiddlewareBoolean,\n): MiddlewareFunction {\n\treturn async (ev, next) => {\n\t\tconst req = requestToNodeMessage(ev.request);\n\t\tconst { res, onReadable } = nodeMessageToNodeResponse(req);\n\n\t\treturn new Promise<void>(async (resolve, reject) => {\n\t\t\tonReadable(async ({ readable, headers, status }) => {\n\t\t\t\tconst responseBody = statusCodesWithoutBody.includes(status)\n\t\t\t\t\t? null\n\t\t\t\t\t: //(Readable.toWeb(readable) as ReadableStream);\n\t\t\t\t\t\t// HACK: Chunked bodies are not being\n\t\t\t\t\t\t// read correctly somewhere...\n\t\t\t\t\t\tbufferToArrayBuffer(await readableToBuffer(readable));\n\t\t\t\tev.response = new Response(responseBody, {\n\t\t\t\t\tstatus,\n\t\t\t\t\theaders: flattenHeaders(headers),\n\t\t\t\t});\n\t\t\t\tresolve();\n\t\t\t});\n\n\t\t\tconst cnext = async (error?: unknown) => {\n\t\t\t\tif (error) {\n\t\t\t\t\treject(error instanceof Error ? error : new Error(String(error)));\n\t\t\t\t} else {\n\t\t\t\t\t// TODO: Can we nest the next functions less? This is a bit weird\n\t\t\t\t\tawait next();\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\tconst handled = await handler(req, res, cnext);\n\t\t\t\tif (handled === false) {\n\t\t\t\t\tres.destroy();\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tcnext(e);\n\t\t\t}\n\t\t});\n\t};\n}\n\nconst statusCodesWithoutBody = [\n\t100, // Continue\n\t101, // Switching Protocols\n\t102, // Processing (WebDAV)\n\t103, // Early Hints\n\t204, // No Content\n\t205, // Reset Content\n\t304, // Not Modified\n];\n\ntype NextFunction = (err?: unknown) => void;\ntype ConnectMiddleware<\n\tPlatformRequest extends IncomingMessage = IncomingMessage,\n\tPlatformResponse extends ServerResponse = ServerResponse,\n> = (req: PlatformRequest, res: PlatformResponse, next: NextFunction) => void | Promise<void>;\ntype ConnectMiddlewareBoolean<\n\tPlatformRequest extends IncomingMessage = IncomingMessage,\n\tPlatformResponse extends ServerResponse = ServerResponse,\n> = (req: PlatformRequest, res: PlatformResponse, next: NextFunction) => boolean | Promise<boolean>;\n"],"mappings":"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","names":["buildNext","v","import_node_stream"]}
|
package/dist/server.d.cts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { M as MiddlewareFunction } from './Server-CNZWh5ca.cjs';
|
|
2
|
-
export { C as CookieHelper, H as HeaderHelper, S as Server, a as ServerEvent } from './Server-CNZWh5ca.cjs';
|
|
3
|
-
import { IncomingMessage, ServerResponse } from 'node:http';
|
|
4
|
-
import 'cookie';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Converts a Connect-style middleware to a web-compatible request handler.
|
|
8
|
-
*
|
|
9
|
-
* @param handler - The Connect-style middleware function to be converted.
|
|
10
|
-
* @returns A function that handles web requests and returns a Response or undefined.
|
|
11
|
-
*/
|
|
12
|
-
declare function connectMiddleware(handler: ConnectMiddleware | ConnectMiddlewareBoolean): MiddlewareFunction;
|
|
13
|
-
type NextFunction = (err?: unknown) => void;
|
|
14
|
-
type ConnectMiddleware<PlatformRequest extends IncomingMessage = IncomingMessage, PlatformResponse extends ServerResponse = ServerResponse> = (req: PlatformRequest, res: PlatformResponse, next: NextFunction) => void | Promise<void>;
|
|
15
|
-
type ConnectMiddlewareBoolean<PlatformRequest extends IncomingMessage = IncomingMessage, PlatformResponse extends ServerResponse = ServerResponse> = (req: PlatformRequest, res: PlatformResponse, next: NextFunction) => boolean | Promise<boolean>;
|
|
16
|
-
|
|
17
|
-
export { connectMiddleware };
|
package/dist/server.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|