@torpor/build 0.1.1 → 0.1.3

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.
Files changed (68) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/{Server-CB99REgs.d.cts → Site-Df1k0TuQ.d.cts} +27 -1
  3. package/dist/{Server-CB99REgs.d.ts → Site-Df1k0TuQ.d.ts} +27 -1
  4. package/dist/bin/index.cjs +357 -199
  5. package/dist/bin/index.cjs.map +1 -1
  6. package/dist/bin/index.js +10 -507
  7. package/dist/bin/index.js.map +1 -1
  8. package/dist/chunk-L3QBUPXY.js +176 -0
  9. package/dist/chunk-L3QBUPXY.js.map +1 -0
  10. package/dist/chunk-Q623TPGO.js +527 -0
  11. package/dist/chunk-Q623TPGO.js.map +1 -0
  12. package/dist/index.cjs +174 -118
  13. package/dist/index.cjs.map +1 -1
  14. package/dist/index.d.cts +2 -2
  15. package/dist/index.d.ts +2 -2
  16. package/dist/index.js +12 -4
  17. package/dist/index.js.map +1 -1
  18. package/dist/metafile-cjs.json +1 -1
  19. package/dist/metafile-esm.json +1 -1
  20. package/dist/run.cjs +753 -0
  21. package/dist/run.cjs.map +1 -0
  22. package/dist/run.d.cts +13 -0
  23. package/dist/run.d.ts +13 -0
  24. package/dist/run.js +15 -0
  25. package/package.json +8 -3
  26. package/src/bin/index.ts +7 -43
  27. package/src/index.ts +4 -1
  28. package/src/run.ts +6 -0
  29. package/src/site/Site.ts +2 -2
  30. package/src/site/defaultAdapter.ts +11 -0
  31. package/src/site/run.ts +60 -0
  32. package/src/site/runBuild.ts +4 -5
  33. package/src/site/runDev.ts +4 -6
  34. package/tsconfig.json +1 -1
  35. package/tsup.config.ts +1 -8
  36. package/dist/Site-CgoeDt8k.d.cts +0 -29
  37. package/dist/Site-D95nwrAg.d.ts +0 -29
  38. package/dist/adapters/cloudflare/index.cjs +0 -125
  39. package/dist/adapters/cloudflare/index.cjs.map +0 -1
  40. package/dist/adapters/cloudflare/index.d.cts +0 -13
  41. package/dist/adapters/cloudflare/index.d.ts +0 -13
  42. package/dist/adapters/cloudflare/index.js +0 -80
  43. package/dist/adapters/cloudflare/index.js.map +0 -1
  44. package/dist/adapters/node/index.cjs +0 -152
  45. package/dist/adapters/node/index.cjs.map +0 -1
  46. package/dist/adapters/node/index.d.cts +0 -8
  47. package/dist/adapters/node/index.d.ts +0 -8
  48. package/dist/adapters/node/index.js +0 -8
  49. package/dist/chunk-5X4T3PZN.js +0 -23
  50. package/dist/chunk-5X4T3PZN.js.map +0 -1
  51. package/dist/chunk-ALHFYD7U.js +0 -113
  52. package/dist/chunk-ALHFYD7U.js.map +0 -1
  53. package/dist/chunk-V4XTDQEV.js +0 -19
  54. package/dist/chunk-V4XTDQEV.js.map +0 -1
  55. package/src/adapters/cloudflare/_worker.ts +0 -38
  56. package/src/adapters/cloudflare/index.ts +0 -98
  57. package/src/adapters/node/constants.ts +0 -1
  58. package/src/adapters/node/createFetchHandler.ts +0 -29
  59. package/src/adapters/node/createNodeServer.ts +0 -8
  60. package/src/adapters/node/index.ts +0 -18
  61. package/src/adapters/node/nodeMessageToRequest.ts +0 -43
  62. package/src/adapters/node/responseToNodeResponse.ts +0 -44
  63. /package/dist/{adapters/node/index.js.map → run.js.map} +0 -0
  64. /package/src/{adapters/node → server/connect}/createMiddlewareHandler.ts +0 -0
  65. /package/src/{adapters/node → server/connect}/flattenHeaders.ts +0 -0
  66. /package/src/{adapters/node → server/connect}/nodeMessageToNodeResponse.ts +0 -0
  67. /package/src/{adapters/node → server/connect}/readableToBuffer.ts +0 -0
  68. /package/src/{adapters/node → server/connect}/requestToNodeMessage.ts +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/site/prepareTemplate.ts"],"sourcesContent":["export default function prepareTemplate(template: string, clientScript: string) {\n\tlet contentStart = regexIndexOf(template, /\\<div\\s+id=(\"app\"|'app'|app)\\s+/);\n\tcontentStart = template.indexOf(\">\", contentStart) + 1;\n\tlet contentEnd = template.indexOf(\"</div>\", contentStart);\n\tif (contentStart === -1 || contentEnd === -1) {\n\t\tthrow new Error(`Couldn't find <div id=\"app\"></div>`);\n\t}\n\treturn (\n\t\ttemplate.substring(0, contentStart) +\n\t\t\"%COMPONENT_HTML%\" +\n\t\ttemplate.substring(contentEnd) +\n\t\t`<script type=\"module\" src=\"${clientScript}\"></script>`\n\t);\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"],"mappings":";AAAe,SAAR,gBAAiC,UAAkB,cAAsB;AAC/E,MAAI,eAAe,aAAa,UAAU,iCAAiC;AAC3E,iBAAe,SAAS,QAAQ,KAAK,YAAY,IAAI;AACrD,MAAI,aAAa,SAAS,QAAQ,UAAU,YAAY;AACxD,MAAI,iBAAiB,MAAM,eAAe,IAAI;AAC7C,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACrD;AACA,SACC,SAAS,UAAU,GAAG,YAAY,IAClC,qBACA,SAAS,UAAU,UAAU,IAC7B,8BAA8B,YAAY;AAE5C;AAGA,SAAS,aAAa,QAAgB,OAAe,UAAmB;AACvE,MAAI,UAAU,OAAO,UAAU,YAAY,CAAC,EAAE,OAAO,KAAK;AAC1D,SAAO,WAAW,IAAI,WAAW,YAAY,KAAK;AACnD;","names":[]}
@@ -1,38 +0,0 @@
1
- // @ts-ignore
2
- import Server from "%SERVER_CLASS%";
3
- // @ts-ignore
4
- import { load } from "%SERVER_SCRIPT%";
5
-
6
- // This file has the above imports replaced and is then compiled to create a Cloudflare Pages Worker
7
-
8
- const template = `%HTML_TEMPLATE%`;
9
-
10
- // Send all requests through Server to handle middleware, cookies, headers, etc
11
- const server = new Server();
12
- server.add("*", async (ev: any) => {
13
- try {
14
- // Render the app HTML (or fetch server data etc) via serverEntry's
15
- // exported `load` function
16
- return await load(ev, template);
17
- } catch (e: any) {
18
- // TODO: Message?
19
- console.log("ERROR:", e);
20
- return new Response(null, {
21
- status: 500,
22
- });
23
- }
24
- });
25
-
26
- export default {
27
- async fetch(request: Request, env: any) {
28
- const url = new URL(request.url);
29
-
30
- // Serve dist/client/assets statically
31
- if (url.pathname.startsWith("/assets/")) {
32
- return env.ASSETS.fetch(request);
33
- }
34
-
35
- // Every request (GET, POST, etc) goes through loadEndPoint
36
- return await server.fetch(request);
37
- },
38
- };
@@ -1,98 +0,0 @@
1
- import { promises as fs } from "node:fs";
2
- import path from "node:path";
3
- import { fileURLToPath } from "node:url";
4
- import { build, defineConfig } from "vite";
5
- import Site from "../../site/Site";
6
- import prepareTemplate from "../../site/prepareTemplate";
7
- import type Adapter from "../../types/Adapter";
8
-
9
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
10
-
11
- export default {
12
- postbuild,
13
- serve: (/* server: Server, site: Site*/) => {
14
- console.log("TODO");
15
- },
16
- } satisfies Adapter;
17
-
18
- async function postbuild(site: Site) {
19
- // Build _worker.js as per
20
- // https://developers.cloudflare.com/pages/functions/advanced-mode/
21
-
22
- const distFolder = path.resolve(site.root, "dist");
23
- const clientFolder = path.join(distFolder, "client");
24
- const serverFolder = path.join(distFolder, "server");
25
- const tempFolder = path.join(distFolder, "temp");
26
- const cloudflareFolder = path.join(distFolder, "cloudflare");
27
-
28
- // Compile _worker.ts
29
- let workerFile = path.resolve(__dirname, "../../../src/adapters/cloudflare/_worker.ts");
30
- let workerSource = await fs.readFile(workerFile, "utf-8");
31
-
32
- // Find the client script file in /assets
33
- let clientScript = (await fs.readdir(path.join(clientFolder, "assets"))).find((f) =>
34
- f.startsWith("clientEntry-"),
35
- );
36
- if (!clientScript) {
37
- throw new Error("clientEntry.js not found");
38
- }
39
- clientScript = `/assets/${clientScript}`;
40
-
41
- // Read and prepare site.html so that we can just splice components into it
42
- let siteHtml = path.join(clientFolder, "site.html");
43
- let template = await fs.readFile(siteHtml, "utf-8");
44
- template = prepareTemplate(template, clientScript);
45
-
46
- const serverClass = path.resolve(__dirname, "../../../src/server/Server.ts");
47
- const serverScript = path.join(serverFolder, "serverEntry.js");
48
-
49
- // Splice file names into _worker.ts
50
- //let workerSource = await fs.readFile(workerFile, "utf-8");
51
- workerSource = workerSource
52
- .replace("%SERVER_CLASS%", serverClass)
53
- .replace("%SERVER_SCRIPT%", serverScript)
54
- .replace("%HTML_TEMPLATE%", template);
55
-
56
- workerFile = path.join(tempFolder, "_worker.ts");
57
- await fs.mkdir(tempFolder);
58
- await fs.writeFile(workerFile, workerSource);
59
-
60
- await build(
61
- defineConfig({
62
- build: {
63
- outDir: cloudflareFolder,
64
- rollupOptions: {
65
- input: [workerFile],
66
- output: {
67
- entryFileNames: `[name].js`,
68
- chunkFileNames: `[name].js`,
69
- assetFileNames: `[name].[ext]`,
70
- },
71
- preserveEntrySignatures: "strict",
72
- },
73
- // HACK: We don't need to minify as the worker isn't downloaded?
74
- // And it makes debugging easier
75
- minify: false,
76
- // HACK: Disable preload so that the _worker.js file doesn't end
77
- // up with document and window references that are not available
78
- modulePreload: false,
79
- },
80
- }),
81
- );
82
- workerFile = path.join(distFolder, "cloudflare", "_worker.js");
83
-
84
- // Build a wrangler.json file for running with `wrangler dev`
85
- const wranglerConfig = {
86
- name: "torpor-miniflare",
87
- main: "cloudflare/_worker.js",
88
- compatibility_date: "2025-01-01",
89
- assets: {
90
- directory: "./client",
91
- binding: "ASSETS",
92
- },
93
- };
94
- const wranglerFile = path.join(distFolder, "wrangler.json");
95
- await fs.writeFile(wranglerFile, JSON.stringify(wranglerConfig, null, 2).replaceAll(" ", "\t"));
96
-
97
- await fs.rm(tempFolder, { recursive: true });
98
- }
@@ -1 +0,0 @@
1
- export const INTERNAL_BODY = Symbol("internal_body");
@@ -1,29 +0,0 @@
1
- import { type IncomingMessage, ServerResponse } from "node:http";
2
- import { Http2ServerRequest, Http2ServerResponse } from "node:http2";
3
- import { INTERNAL_BODY } from "./constants";
4
- import nodeMessageToRequest from "./nodeMessageToRequest";
5
- import responseToNodeResponse from "./responseToNodeResponse";
6
-
7
- // From https://gist.github.com/marvinhagemeister/cc236ec97235ce0305ae9d48a24a607d
8
- // Referenced from https://marvinh.dev/blog/modern-way-to-write-javascript-servers/
9
-
10
- const GlobalResponse = Response;
11
- globalThis.Response = class Response extends GlobalResponse {
12
- [INTERNAL_BODY]: BodyInit | null | undefined = null;
13
-
14
- constructor(body?: BodyInit | null, init?: ResponseInit) {
15
- super(body, init);
16
- this[INTERNAL_BODY] = body;
17
- }
18
- };
19
-
20
- export function createFetchHandler(handler: (req: Request) => Response | Promise<Response>) {
21
- return async (
22
- incoming: IncomingMessage | Http2ServerRequest,
23
- outgoing: ServerResponse | Http2ServerResponse,
24
- ) => {
25
- const req = await nodeMessageToRequest(incoming);
26
- const res = await handler(req);
27
- return await responseToNodeResponse(res, outgoing);
28
- };
29
- }
@@ -1,8 +0,0 @@
1
- import { createServer } from "node:http";
2
- import { createFetchHandler } from "./createFetchHandler";
3
-
4
- export default function createNodeServer(handler: (req: Request) => Response | Promise<Response>) {
5
- // Create a server, polyfill it so that it can handle standard fetch methods,
6
- // and pass our app fetch method to the handler
7
- return createServer(createFetchHandler(handler));
8
- }
@@ -1,18 +0,0 @@
1
- import Server from "../../server/Server";
2
- import type Adapter from "../../types/Adapter";
3
- import createNodeServer from "./createNodeServer";
4
-
5
- export default {
6
- serve: (server: Server) => {
7
- process.env.PROTOCOL ??= "http:";
8
- process.env.HOST ??= "localhost";
9
- process.env.PORT ??= "7059";
10
-
11
- // Create the Node server and start listening
12
- console.log(`\nConnecting to ${process.env.HOST}:${process.env.PORT}`);
13
- const devServer = createNodeServer(server.fetch);
14
- devServer.listen(parseInt(process.env.PORT), process.env.HOST, () => {
15
- console.log(`Listening on ${process.env.HOST}:${process.env.PORT}\n`);
16
- });
17
- },
18
- } satisfies Adapter;
@@ -1,43 +0,0 @@
1
- import { type IncomingMessage } from "node:http";
2
- import { Http2ServerRequest } from "node:http2";
3
- import { Readable } from "node:stream";
4
- import flattenHeaders from "./flattenHeaders";
5
-
6
- // From https://stackoverflow.com/a/78849544
7
- // and https://gist.github.com/marvinhagemeister/cc236ec97235ce0305ae9d48a24a607d
8
-
9
- export default async function nodeMessageToRequest(
10
- req: IncomingMessage | Http2ServerRequest,
11
- ): Promise<Request> {
12
- // Build the full url
13
- let path = req.url;
14
- if (path === undefined) {
15
- throw new Error(`Empty request URL`);
16
- }
17
- if (!path.startsWith("/")) {
18
- path = "/" + path;
19
- }
20
- const { host } = req.headers;
21
- if (host == undefined) {
22
- throw new Error(`Missing "Host" header`);
23
- }
24
- const protocol = "encrypted" in req.socket && req.socket.encrypted ? "https" : "http";
25
- const url = `${protocol}://${host}${path}`;
26
-
27
- // Flatten the headers
28
- const headers = flattenHeaders(req.headers);
29
-
30
- // Convert body to Buffer if applicable
31
- const body =
32
- req.method !== "GET" && req.method !== "HEAD"
33
- ? (Readable.toWeb(req) as ReadableStream) // await readableToBuffer(req)
34
- : null;
35
-
36
- return new Request(url, {
37
- method: req.method,
38
- headers: headers,
39
- body: body,
40
- // @ts-ignore this is needed for using a Readable for some reason
41
- duplex: "half",
42
- });
43
- }
@@ -1,44 +0,0 @@
1
- import { ServerResponse } from "node:http";
2
- import { Http2ServerResponse } from "node:http2";
3
- import { isArrayBufferView } from "node:util/types";
4
- import { INTERNAL_BODY } from "./constants";
5
-
6
- export default async function responseToNodeResponse(
7
- res: Response,
8
- outgoing: ServerResponse | Http2ServerResponse,
9
- ) {
10
- outgoing.statusCode = res.status;
11
- outgoing.statusMessage = res.statusText;
12
-
13
- res.headers.forEach((value, key) => {
14
- outgoing.setHeader(key, value);
15
- });
16
-
17
- const body = (res as any)[INTERNAL_BODY];
18
-
19
- if (body === null || body === undefined) {
20
- outgoing.writeHead(res.status, res.statusText);
21
- outgoing.end();
22
- } else if (typeof body === "string" || body instanceof Uint8Array) {
23
- outgoing.writeHead(res.status, res.statusText);
24
- outgoing.end(body);
25
- } else if (body instanceof Blob) {
26
- outgoing.writeHead(res.status, res.statusText);
27
- outgoing.end(new Uint8Array(await body.arrayBuffer()));
28
- } else if (body instanceof ArrayBuffer) {
29
- outgoing.writeHead(res.status, res.statusText);
30
- outgoing.end(new Uint8Array(body));
31
- } else if (isArrayBufferView(body)) {
32
- outgoing.writeHead(res.status, res.statusText);
33
- outgoing.end(new Uint8Array(body.buffer));
34
- } else if (body instanceof FormData) {
35
- // TODO
36
- outgoing.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
37
-
38
- outgoing.writeHead(res.status, res.statusText);
39
- outgoing.end();
40
- } else {
41
- outgoing.writeHead(res.status, res.statusText);
42
- outgoing.end();
43
- }
44
- }
File without changes