@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
@@ -0,0 +1,176 @@
1
+ // src/site/pathToRegex.ts
2
+ function pathToRegex(path) {
3
+ const pattern = path.split("/").map((p) => {
4
+ return p.replace(/\[([^\/]+?)\]/, "(?<$1>[^\\/]+?)");
5
+ }).join("\\/").replaceAll("*", ".*");
6
+ return new RegExp(`^${pattern}$`);
7
+ }
8
+
9
+ // src/server/CookieHelper.ts
10
+ import { parse, serialize } from "cookie";
11
+ var CookieHelper = class {
12
+ request;
13
+ cookies = /* @__PURE__ */ new Map();
14
+ constructor(request) {
15
+ this.request = request;
16
+ }
17
+ get(name) {
18
+ if (this.cookies.has(name)) {
19
+ return this.cookies.get(name);
20
+ }
21
+ const header = this.request.headers.get("cookie");
22
+ return parse(header ?? "")[name];
23
+ }
24
+ set(name, value, options) {
25
+ options ??= {};
26
+ options.httpOnly ??= true;
27
+ options.secure ??= true;
28
+ options.sameSite ??= "lax";
29
+ this.cookies.set(name, serialize(name, value, options));
30
+ }
31
+ delete(name, options) {
32
+ options ??= {};
33
+ options.expires = /* @__PURE__ */ new Date(0);
34
+ this.cookies.set(name, serialize(name, "", options));
35
+ }
36
+ };
37
+
38
+ // src/server/HeaderHelper.ts
39
+ var HeaderHelper = class {
40
+ request;
41
+ headers = /* @__PURE__ */ new Map();
42
+ constructor(request) {
43
+ this.request = request;
44
+ }
45
+ get(name) {
46
+ if (this.headers.has(name)) {
47
+ return this.headers.get(name);
48
+ }
49
+ return this.request.headers.get(name) ?? void 0;
50
+ }
51
+ set(name, value) {
52
+ this.headers.set(name, value);
53
+ }
54
+ delete(name) {
55
+ this.headers.delete(name);
56
+ }
57
+ };
58
+
59
+ // src/server/ServerEvent.ts
60
+ var ServerEvent = class {
61
+ request;
62
+ response;
63
+ // TODO: Should we cast types??
64
+ params;
65
+ cookies;
66
+ headers;
67
+ constructor(request, params) {
68
+ this.request = request;
69
+ this.params = params;
70
+ this.cookies = new CookieHelper(request);
71
+ this.headers = new HeaderHelper(request);
72
+ }
73
+ addHeaders() {
74
+ if (!this.response) {
75
+ throw new Error("Response not created yet");
76
+ }
77
+ for (let cookie of this.cookies.cookies.values()) {
78
+ this.response.headers.append("set-cookie", cookie);
79
+ }
80
+ for (let header of this.headers.headers.entries()) {
81
+ this.response.headers.append(header[0], header[1]);
82
+ }
83
+ }
84
+ };
85
+
86
+ // src/server/Server.ts
87
+ var noop = () => {
88
+ };
89
+ var Server = class {
90
+ // TODO: We don't use any of the routes, just add("*") in runDev/runBuild...
91
+ routes = [];
92
+ // TODO: We only use the Vite middleware here
93
+ middleware = [];
94
+ constructor() {
95
+ this.routes = [];
96
+ this.middleware = [];
97
+ }
98
+ /**
99
+ * The standard Fetch API method that should work in any runtime (including
100
+ * Node with polyfills).
101
+ * @returns
102
+ */
103
+ fetch = async (input, init) => {
104
+ const request = new Request(input, init);
105
+ const url = new URL(request.url);
106
+ const match = this.match(url.pathname);
107
+ let ev = new ServerEvent(request, match?.params);
108
+ if (this.middleware.length) {
109
+ let buildNext2 = function(middleware, i) {
110
+ if (ev.response) {
111
+ return noop;
112
+ }
113
+ if (i < middleware.length - 1) {
114
+ let next = middleware[i + 1];
115
+ return async () => next(ev, buildNext2(middleware, i + 1));
116
+ } else {
117
+ return match ? async () => {
118
+ ev.response = await match.fn(ev);
119
+ } : noop;
120
+ }
121
+ };
122
+ var buildNext = buildNext2;
123
+ await this.middleware[0](ev, buildNext2(this.middleware, 0));
124
+ } else if (match) {
125
+ ev.response = await match.fn(ev);
126
+ } else {
127
+ return new Response(null, { status: 404 });
128
+ }
129
+ ev.response ??= new Response(null, { status: 200 });
130
+ ev.addHeaders();
131
+ return ev.response;
132
+ };
133
+ /**
134
+ * Adds a server function at a route path.
135
+ * @param path The route path pattern.
136
+ * @param fn The function to call when the pattern is matched.
137
+ * @returns
138
+ */
139
+ add(path, fn) {
140
+ this.routes.push(new RouteHandler(path, fn));
141
+ return this;
142
+ }
143
+ match(path) {
144
+ for (let handler of this.routes) {
145
+ let match = path.match(handler.regex);
146
+ if (match) {
147
+ return {
148
+ fn: handler.fn,
149
+ params: match.groups
150
+ };
151
+ }
152
+ }
153
+ console.log(`Server path not found: ${path}`);
154
+ }
155
+ // TODO:
156
+ //use(path: string, ...fn: MiddlewareFunction[])
157
+ use(...fn) {
158
+ this.middleware = this.middleware.concat(fn);
159
+ return this;
160
+ }
161
+ };
162
+ var RouteHandler = class {
163
+ path;
164
+ regex;
165
+ fn;
166
+ constructor(path, fn) {
167
+ this.path = path;
168
+ this.regex = pathToRegex(path);
169
+ this.fn = fn;
170
+ }
171
+ };
172
+
173
+ export {
174
+ Server
175
+ };
176
+ //# sourceMappingURL=chunk-L3QBUPXY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/site/pathToRegex.ts","../src/server/CookieHelper.ts","../src/server/HeaderHelper.ts","../src/server/ServerEvent.ts","../src/server/Server.ts"],"sourcesContent":["export default function pathToRegex(path: string): RegExp {\n\tconst pattern = path\n\t\t.split(\"/\")\n\t\t.map((p) => {\n\t\t\treturn p.replace(/\\[([^\\/]+?)\\]/, \"(?<$1>[^\\\\/]+?)\");\n\t\t})\n\t\t.join(\"\\\\/\")\n\t\t.replaceAll(\"*\", \".*\");\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 updated value\n\t\tif (this.cookies.has(name)) {\n\t\t\treturn this.cookies.get(name);\n\t\t}\n\t\t// Otherwise, return the cookie 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) {\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) {\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) {\n\t\tthis.headers.set(name, value);\n\t}\n\n\tdelete(name: string) {\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;\n\t// TODO: Should we cast types??\n\tparams?: { [key: string]: string };\n\n\tcookies: CookieHelper;\n\theaders: HeaderHelper;\n\n\tconstructor(request: Request, params?: { [key: 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\t}\n\n\taddHeaders() {\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 type MiddlewareFunction from \"../types/MiddlewareFunction\";\nimport ServerEvent from \"./ServerEvent\";\nimport type ServerFunction from \"./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\treturn this;\n\t}\n\n\tmatch(path: string) {\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\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"],"mappings":"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","names":["buildNext"]}