@torpor/build 0.2.0 → 0.3.1

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 (158) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/RouteType-g8Ce5gOd.js +107 -0
  3. package/dist/RouteType-g8Ce5gOd.js.map +1 -0
  4. package/dist/Server-CSpY_-Ba.d.ts +78 -0
  5. package/dist/Server-CSpY_-Ba.d.ts.map +1 -0
  6. package/dist/ServerEvent-2-CnAy1W.js +74 -0
  7. package/dist/ServerEvent-2-CnAy1W.js.map +1 -0
  8. package/dist/Site-D4x1l0p5.d.ts +67 -0
  9. package/dist/Site-D4x1l0p5.d.ts.map +1 -0
  10. package/dist/_page-Cv6YWocY.js +33 -0
  11. package/dist/_page-Cv6YWocY.js.map +1 -0
  12. package/dist/bin/index.d.ts +1 -1
  13. package/dist/bin/index.js +14 -19
  14. package/dist/bin/index.js.map +1 -1
  15. package/dist/connectMiddleware-DbLj0St1.js +252 -0
  16. package/dist/connectMiddleware-DbLj0St1.js.map +1 -0
  17. package/dist/index.d.ts +188 -179
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +109 -145
  20. package/dist/index.js.map +1 -1
  21. package/dist/nav.d.ts +14 -0
  22. package/dist/nav.d.ts.map +1 -0
  23. package/dist/nav.js +206 -0
  24. package/dist/nav.js.map +1 -0
  25. package/dist/pathToRegex-CTgx7hQP.js +11 -0
  26. package/dist/pathToRegex-CTgx7hQP.js.map +1 -0
  27. package/dist/response-D-XpIuMH.js +307 -0
  28. package/dist/response-D-XpIuMH.js.map +1 -0
  29. package/dist/response.d.ts +336 -151
  30. package/dist/response.d.ts.map +1 -0
  31. package/dist/response.js +4 -37
  32. package/dist/run-CVKpO0HO.js +331 -0
  33. package/dist/run-CVKpO0HO.js.map +1 -0
  34. package/dist/run.d.ts +11 -8
  35. package/dist/run.d.ts.map +1 -0
  36. package/dist/run.js +8 -18
  37. package/dist/seeOther-BmehiI4C.js +110 -0
  38. package/dist/seeOther-BmehiI4C.js.map +1 -0
  39. package/dist/server.d.ts +12 -11
  40. package/dist/server.d.ts.map +1 -0
  41. package/dist/server.js +5 -18
  42. package/dist/state.d.ts +14 -10
  43. package/dist/state.d.ts.map +1 -0
  44. package/dist/state.js +3 -7
  45. package/dist/test.d.ts +12 -11
  46. package/dist/test.d.ts.map +1 -0
  47. package/dist/test.js +152 -225
  48. package/dist/test.js.map +1 -1
  49. package/package.json +25 -29
  50. package/src/bin/index.ts +9 -11
  51. package/src/index.ts +3 -0
  52. package/src/nav/formSubmit.ts +48 -0
  53. package/src/nav/load.ts +9 -0
  54. package/src/nav/loadData.ts +121 -0
  55. package/src/nav/navigate.ts +163 -0
  56. package/src/nav/reload.ts +9 -0
  57. package/src/nav.ts +4 -0
  58. package/src/response/badRequest.ts +9 -4
  59. package/src/response/created.ts +10 -3
  60. package/src/response/forbidden.ts +11 -4
  61. package/src/response/found.ts +30 -0
  62. package/src/response/methodNotAllowed.ts +8 -4
  63. package/src/response/movedPermanently.ts +25 -0
  64. package/src/response/notFound.ts +14 -7
  65. package/src/response/notModified.ts +24 -4
  66. package/src/response/ok.ts +19 -10
  67. package/src/response/permanentRedirect.ts +30 -0
  68. package/src/response/seeOther.ts +9 -3
  69. package/src/response/serverError.ts +14 -2
  70. package/src/response/temporaryRedirect.ts +31 -0
  71. package/src/response/unauthorized.ts +11 -4
  72. package/src/response/unprocessable.ts +8 -2
  73. package/src/response.ts +8 -4
  74. package/src/{site → run}/prepareTemplate.ts +1 -1
  75. package/src/{site → run}/run.ts +1 -1
  76. package/src/{site → run}/runBuild.ts +2 -2
  77. package/src/{site → run}/runDev.ts +2 -2
  78. package/src/{site → run}/runPreview.ts +1 -1
  79. package/src/run.ts +4 -4
  80. package/src/server/Routerx.ts +3 -3
  81. package/src/server/Server.ts +3 -3
  82. package/src/server/connect/connectMiddleware.ts +2 -1
  83. package/src/server/connect/nodeMessageToNodeResponse.ts +2 -2
  84. package/src/site/Router.ts +3 -3
  85. package/src/site/clientEntry.ts +16 -269
  86. package/src/site/defaultAdapter.ts +1 -1
  87. package/src/site/serverEntry.ts +86 -45
  88. package/src/state/$page.ts +3 -12
  89. package/src/state/client.ts +6 -0
  90. package/src/state/internal.ts +45 -0
  91. package/src/test/runTest.ts +1 -1
  92. package/src/types/Adapter.ts +2 -4
  93. package/src/types/ClientState.ts +8 -0
  94. package/src/types/InternalState.ts +7 -0
  95. package/src/types/LayoutHandler.ts +2 -4
  96. package/src/types/LayoutPath.ts +10 -0
  97. package/src/types/ManifestRoute.ts +2 -4
  98. package/src/types/PageEndPoint.ts +2 -4
  99. package/src/types/PageLoadEvent.ts +2 -4
  100. package/src/types/PageServerEndPoint.ts +2 -4
  101. package/src/types/PageState.ts +8 -0
  102. package/src/types/RouteHandler.ts +2 -4
  103. package/src/types/RouteLayoutHandler.ts +2 -4
  104. package/src/types/RouteMatchResult.ts +2 -4
  105. package/src/types/ServerHook.ts +3 -7
  106. package/src/types/ServerLoadEvent.ts +2 -4
  107. package/src/{site → utils}/pathToRegex.ts +1 -1
  108. package/{tsup.config.ts → tsdown.config.ts} +3 -4
  109. package/dist/Server-CNZWh5ca.d.cts +0 -71
  110. package/dist/Server-CNZWh5ca.d.ts +0 -71
  111. package/dist/Site-C2020GV_.d.ts +0 -63
  112. package/dist/Site-DQojGpE-.d.cts +0 -63
  113. package/dist/bin/index.cjs +0 -778
  114. package/dist/bin/index.cjs.map +0 -1
  115. package/dist/bin/index.d.cts +0 -1
  116. package/dist/chunk-565UOT3F.js +0 -18
  117. package/dist/chunk-565UOT3F.js.map +0 -1
  118. package/dist/chunk-B2UNTYN5.js +0 -68
  119. package/dist/chunk-B2UNTYN5.js.map +0 -1
  120. package/dist/chunk-CZHJQCPI.js +0 -286
  121. package/dist/chunk-CZHJQCPI.js.map +0 -1
  122. package/dist/chunk-PTVHEJZ5.js +0 -152
  123. package/dist/chunk-PTVHEJZ5.js.map +0 -1
  124. package/dist/chunk-SJVHHGVW.js +0 -13
  125. package/dist/chunk-SJVHHGVW.js.map +0 -1
  126. package/dist/chunk-TDOXEXG6.js +0 -85
  127. package/dist/chunk-TDOXEXG6.js.map +0 -1
  128. package/dist/chunk-WVXAN4IV.js +0 -50
  129. package/dist/chunk-WVXAN4IV.js.map +0 -1
  130. package/dist/chunk-YRBEYKQM.js +0 -372
  131. package/dist/chunk-YRBEYKQM.js.map +0 -1
  132. package/dist/index.cjs +0 -322
  133. package/dist/index.cjs.map +0 -1
  134. package/dist/index.d.cts +0 -199
  135. package/dist/metafile-cjs.json +0 -1
  136. package/dist/metafile-esm.json +0 -1
  137. package/dist/response.cjs +0 -150
  138. package/dist/response.cjs.map +0 -1
  139. package/dist/response.d.cts +0 -166
  140. package/dist/response.js.map +0 -1
  141. package/dist/run.cjs +0 -787
  142. package/dist/run.cjs.map +0 -1
  143. package/dist/run.d.cts +0 -14
  144. package/dist/run.js.map +0 -1
  145. package/dist/server.cjs +0 -398
  146. package/dist/server.cjs.map +0 -1
  147. package/dist/server.d.cts +0 -17
  148. package/dist/server.js.map +0 -1
  149. package/dist/state.cjs +0 -44
  150. package/dist/state.cjs.map +0 -1
  151. package/dist/state.d.cts +0 -11
  152. package/dist/state.js.map +0 -1
  153. package/dist/test.cjs +0 -538
  154. package/dist/test.cjs.map +0 -1
  155. package/dist/test.d.cts +0 -15
  156. package/src/response/moved.ts +0 -16
  157. package/src/response/redirect.ts +0 -17
  158. package/src/state/Page.ts +0 -8
package/dist/run.cjs DELETED
@@ -1,787 +0,0 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
-
30
- // src/run.ts
31
- var run_exports = {};
32
- __export(run_exports, {
33
- run: () => run,
34
- runBuild: () => runBuild,
35
- runDev: () => runDev,
36
- runPreview: () => runPreview
37
- });
38
- module.exports = __toCommonJS(run_exports);
39
-
40
- // src/site/run.ts
41
- var import_node_fs5 = __toESM(require("fs"), 1);
42
- var import_node_path5 = __toESM(require("path"), 1);
43
- var import_vite5 = require("vite");
44
-
45
- // src/site/runBuild.ts
46
- var import_vite = __toESM(require("@torpor/unplugin/vite"), 1);
47
- var import_node_fs2 = require("fs");
48
- var import_node_path2 = __toESM(require("path"), 1);
49
- var import_vite2 = require("vite");
50
-
51
- // src/site/manifest.ts
52
- var import_node_fs = require("fs");
53
- var import_node_path = __toESM(require("path"), 1);
54
- var moduleId = "@torpor/build/manifest";
55
- function manifest(site, server = false) {
56
- return {
57
- name: "torpor-manifest",
58
- resolveId: {
59
- order: "pre",
60
- handler(id) {
61
- if (id === moduleId) {
62
- return id;
63
- }
64
- }
65
- },
66
- // @ts-ignore
67
- load(id, viteOptions) {
68
- if (id === moduleId) {
69
- let serverRequest = server && !!viteOptions?.ssr;
70
- return `
71
- ${!serverRequest ? "const load = { default: { load: true } };" : ""}
72
- export default {
73
- routes: [
74
- ${site.routes.map((r) => {
75
- if (serverRequest || !/server\.(ts|js)$/.test(r.file)) {
76
- return `{ path: "${r.path}", type: ${r.type}, endPoint: ${serverRequest || !/server\.(ts|js)$/.test(r.file) ? `() => import(/* @vite-ignore */ "${import_node_path.default.join(site.root, r.file)}")` : "undefined"} }`;
77
- } else {
78
- const haveLoad = (0, import_node_fs.readFileSync)(import_node_path.default.join(site.root, r.file)).includes("load:");
79
- return `{ path: "${r.path}", type: ${r.type}, endPoint: ${haveLoad ? "() => load" : "undefined"} }`;
80
- }
81
- }).join(",\n ")}
82
- ],
83
- };
84
- `;
85
- }
86
- }
87
- };
88
- }
89
-
90
- // src/site/runBuild.ts
91
- async function runBuild(site) {
92
- const distFolder = import_node_path2.default.resolve(site.root, "dist");
93
- if ((0, import_node_fs2.existsSync)(distFolder)) {
94
- await import_node_fs2.promises.rm(distFolder, { recursive: true });
95
- }
96
- const clientFolder = import_node_path2.default.join(distFolder, "client");
97
- const serverFolder = import_node_path2.default.join(distFolder, "server");
98
- if (site.adapter.prebuild) {
99
- await site.adapter.prebuild(site);
100
- }
101
- let siteHtml = import_node_path2.default.resolve(site.root, "src/site.html");
102
- const siteFolder = import_node_path2.default.resolve(site.root, "./node_modules/@torpor/build/src/site/");
103
- let clientScript = import_node_path2.default.join(siteFolder, "clientEntry.ts");
104
- let serverScript = import_node_path2.default.join(siteFolder, "serverEntry.ts");
105
- const clientConfig = structuredClone(site.viteConfig ?? {});
106
- clientConfig.plugins = [manifest(site), (0, import_vite.default)(), ...site.plugins];
107
- clientConfig.build ??= {};
108
- clientConfig.build.outDir = clientFolder;
109
- clientConfig.build.rollupOptions ??= {};
110
- clientConfig.build.rollupOptions.input = [
111
- siteHtml,
112
- clientScript,
113
- ...site.routes.filter((r) => !/server\.(ts|js)$/.test(r.file)).map((r) => import_node_path2.default.resolve(site.root, r.file)),
114
- ...site.inputs.filter((f) => !/server\.(ts|js)$/.test(f))
115
- ];
116
- clientConfig.build.ssrManifest = true;
117
- await (0, import_vite2.build)((0, import_vite2.defineConfig)(clientConfig));
118
- const serverConfig = structuredClone(site.viteConfig ?? {});
119
- serverConfig.plugins = [manifest(site, true), (0, import_vite.default)(), ...site.plugins];
120
- serverConfig.build ??= {};
121
- serverConfig.build.outDir = serverFolder;
122
- serverConfig.build.rollupOptions ??= {};
123
- serverConfig.build.rollupOptions.input = [
124
- serverScript,
125
- ...site.routes.map((r) => import_node_path2.default.resolve(site.root, r.file)),
126
- ...site.inputs
127
- ];
128
- serverConfig.build.ssr = serverScript;
129
- await (0, import_vite2.build)((0, import_vite2.defineConfig)(serverConfig));
130
- siteHtml = import_node_path2.default.join(clientFolder, "site.html");
131
- await import_node_fs2.promises.rename(import_node_path2.default.join(clientFolder, "src", "site.html"), siteHtml);
132
- await import_node_fs2.promises.rm(import_node_path2.default.join(clientFolder, "src"), { recursive: true });
133
- if (site.adapter.postbuild) {
134
- await site.adapter.postbuild(site);
135
- }
136
- }
137
-
138
- // src/site/runDev.ts
139
- var import_esbuild = __toESM(require("@torpor/unplugin/esbuild"), 1);
140
- var import_vite3 = __toESM(require("@torpor/unplugin/vite"), 1);
141
- var import_dotenv = require("dotenv");
142
- var import_node_fs3 = require("fs");
143
- var import_node_path3 = __toESM(require("path"), 1);
144
- var import_vite4 = require("vite");
145
-
146
- // src/response/response.ts
147
- function response(status, body) {
148
- let headers = void 0;
149
- if (body) {
150
- if (typeof body === "object") {
151
- headers = { "content-type": "application/json" };
152
- body = JSON.stringify(body);
153
- } else {
154
- headers = { "content-type": "text/plain" };
155
- }
156
- }
157
- return new Response(body, {
158
- status,
159
- headers
160
- });
161
- }
162
-
163
- // src/response/serverError.ts
164
- function serverError(body) {
165
- return response(500, body ?? "Server error");
166
- }
167
-
168
- // src/site/pathToRegex.ts
169
- function pathToRegex(path6) {
170
- const pattern = path6.split("/").map((p) => {
171
- return p.replace(/\[([^\/]+?)\]/, "(?<$1>[^\\/]+?)");
172
- }).join("\\/").replaceAll("*", ".*") + // Ignore trailing slashes -- `/path` should be treated the same as `/path/`
173
- "/*";
174
- return new RegExp(`^${pattern}/*$`);
175
- }
176
-
177
- // src/server/CookieHelper.ts
178
- var import_cookie = require("cookie");
179
- var CookieHelper = class {
180
- request;
181
- cookies = /* @__PURE__ */ new Map();
182
- constructor(request) {
183
- this.request = request;
184
- }
185
- get(name) {
186
- if (this.cookies.has(name)) {
187
- return (0, import_cookie.parse)(this.cookies.get(name))[name];
188
- }
189
- const header = this.request.headers.get("cookie");
190
- return (0, import_cookie.parse)(header ?? "")[name];
191
- }
192
- set(name, value, options) {
193
- options ??= {};
194
- options.httpOnly ??= true;
195
- options.secure ??= true;
196
- options.sameSite ??= "lax";
197
- this.cookies.set(name, (0, import_cookie.serialize)(name, value, options));
198
- }
199
- delete(name, options) {
200
- options ??= {};
201
- options.expires = /* @__PURE__ */ new Date(0);
202
- this.cookies.set(name, (0, import_cookie.serialize)(name, "", options));
203
- }
204
- };
205
-
206
- // src/server/HeaderHelper.ts
207
- var HeaderHelper = class {
208
- request;
209
- headers = /* @__PURE__ */ new Map();
210
- constructor(request) {
211
- this.request = request;
212
- }
213
- get(name) {
214
- if (this.headers.has(name)) {
215
- return this.headers.get(name);
216
- }
217
- return this.request.headers.get(name) ?? void 0;
218
- }
219
- set(name, value) {
220
- this.headers.set(name, value);
221
- }
222
- delete(name) {
223
- this.headers.delete(name);
224
- }
225
- };
226
-
227
- // src/server/ServerEvent.ts
228
- var ServerEvent = class {
229
- request;
230
- response;
231
- // TODO: Should we cast types??
232
- params;
233
- adapter;
234
- cookies;
235
- headers;
236
- constructor(request, params) {
237
- this.request = request;
238
- this.params = params;
239
- this.cookies = new CookieHelper(request);
240
- this.headers = new HeaderHelper(request);
241
- this.adapter = globalThis.adapter;
242
- }
243
- addHeaders() {
244
- if (!this.response) {
245
- throw new Error("Response not created yet");
246
- }
247
- for (let cookie of this.cookies.cookies.values()) {
248
- this.response.headers.append("set-cookie", cookie);
249
- }
250
- for (let header of this.headers.headers.entries()) {
251
- this.response.headers.append(header[0], header[1]);
252
- }
253
- }
254
- };
255
-
256
- // src/server/Server.ts
257
- var noop = () => {
258
- };
259
- var Server = class {
260
- // TODO: We don't use any of the routes, just add("*") in runDev/runBuild...
261
- routes = [];
262
- // TODO: We only use the Vite middleware here
263
- middleware = [];
264
- constructor() {
265
- this.routes = [];
266
- this.middleware = [];
267
- }
268
- /**
269
- * The standard Fetch API method that should work in any runtime (including
270
- * Node with polyfills).
271
- * @returns
272
- */
273
- fetch = async (input, init) => {
274
- const request = new Request(input, init);
275
- const url = new URL(request.url);
276
- const match = this.match(url.pathname);
277
- let ev = new ServerEvent(request, match?.params);
278
- if (this.middleware.length) {
279
- let buildNext2 = function(middleware, i) {
280
- if (ev.response) {
281
- return noop;
282
- }
283
- if (i < middleware.length - 1) {
284
- let next = middleware[i + 1];
285
- return async () => next(ev, buildNext2(middleware, i + 1));
286
- } else {
287
- return match ? async () => {
288
- ev.response = await match.fn(ev);
289
- } : noop;
290
- }
291
- };
292
- var buildNext = buildNext2;
293
- await this.middleware[0](ev, buildNext2(this.middleware, 0));
294
- } else if (match) {
295
- ev.response = await match.fn(ev);
296
- } else {
297
- return new Response(null, { status: 404 });
298
- }
299
- ev.response ??= new Response(null, { status: 200 });
300
- ev.addHeaders();
301
- return ev.response;
302
- };
303
- /**
304
- * Adds a server function at a route path.
305
- * @param path The route path pattern.
306
- * @param fn The function to call when the pattern is matched.
307
- * @returns
308
- */
309
- add(path6, fn) {
310
- this.routes.push(new RouteHandler(path6, fn));
311
- this.#sortRoutes();
312
- return this;
313
- }
314
- match(path6) {
315
- for (let handler of this.routes) {
316
- let match = path6.match(handler.regex);
317
- if (match) {
318
- return {
319
- fn: handler.fn,
320
- params: match.groups
321
- };
322
- }
323
- }
324
- console.log(`Server path not found: ${path6}`);
325
- }
326
- // TODO:
327
- //use(path: string, ...fn: MiddlewareFunction[])
328
- use(...fn) {
329
- this.middleware = this.middleware.concat(fn);
330
- return this;
331
- }
332
- #sortRoutes() {
333
- this.routes = this.routes.sort((a, b) => {
334
- for (let i = 0; i < Math.min(a.path.length, b.path.length); i++) {
335
- if (a.path[i] === "[" && b.path[i] !== "[") {
336
- return 1;
337
- } else if (b.path[i] === "[" && a.path[i] !== "[") {
338
- return -1;
339
- } else if (a.path[i] === b.path[i]) {
340
- } else {
341
- return a.path[i].localeCompare(b.path[i]);
342
- }
343
- }
344
- return a.path.length - b.path.length;
345
- });
346
- }
347
- };
348
- var RouteHandler = class {
349
- path;
350
- regex;
351
- fn;
352
- constructor(path6, fn) {
353
- this.path = path6;
354
- this.regex = pathToRegex(path6);
355
- this.fn = fn;
356
- }
357
- };
358
-
359
- // src/server/connect/bufferToArrayBuffer.ts
360
- function bufferToArrayBuffer(buffer) {
361
- return buffer.buffer.slice(
362
- buffer.byteOffset,
363
- buffer.byteOffset + buffer.byteLength
364
- );
365
- }
366
-
367
- // src/server/connect/flattenHeaders.ts
368
- function flattenHeaders(headers) {
369
- const flatHeaders = new Headers();
370
- for (const [key, value] of Object.entries(headers)) {
371
- if (value === void 0 || value === null) {
372
- continue;
373
- } else if (Array.isArray(value)) {
374
- for (const v of value) {
375
- if (v !== void 0 && v !== null) {
376
- value.forEach((v2) => flatHeaders.append(key, v2));
377
- }
378
- }
379
- } else {
380
- flatHeaders.set(key, String(value));
381
- }
382
- }
383
- return flatHeaders;
384
- }
385
-
386
- // src/server/connect/nodeMessageToNodeResponse.ts
387
- var import_node_http = require("http");
388
- var import_node_stream = require("stream");
389
- function nodeMessageToNodeResponse(incomingMessage) {
390
- const res = new import_node_http.ServerResponse(incomingMessage);
391
- const passThrough = new import_node_stream.PassThrough();
392
- let handled = false;
393
- const onReadable = (cb) => {
394
- const handleReadable = () => {
395
- if (handled) return;
396
- handled = true;
397
- cb({
398
- readable: import_node_stream.Readable.from(passThrough),
399
- headers: res.getHeaders(),
400
- status: res.statusCode
401
- });
402
- };
403
- passThrough.once("readable", handleReadable);
404
- passThrough.once("end", handleReadable);
405
- };
406
- passThrough.once("finish", () => {
407
- res.emit("finish");
408
- });
409
- passThrough.once("close", () => {
410
- res.destroy();
411
- res.emit("close");
412
- });
413
- passThrough.on("drain", () => {
414
- res.emit("drain");
415
- });
416
- res.write = passThrough.write.bind(passThrough);
417
- res.end = passThrough.end.bind(passThrough);
418
- res.writeHead = function writeHead(statusCode, statusMessage, headers) {
419
- res.statusCode = statusCode;
420
- if (typeof statusMessage === "object") {
421
- headers = statusMessage;
422
- statusMessage = void 0;
423
- }
424
- if (headers) {
425
- for (const [key, value] of Object.entries(headers)) {
426
- if (value !== void 0) {
427
- res.setHeader(key, value);
428
- }
429
- }
430
- }
431
- return res;
432
- };
433
- return {
434
- res,
435
- onReadable
436
- };
437
- }
438
-
439
- // src/server/connect/readableToBuffer.ts
440
- function readableToBuffer(req) {
441
- return new Promise((resolve, reject) => {
442
- const chunks = [];
443
- req.on("data", (chunk) => {
444
- chunks.push(chunk);
445
- });
446
- req.on("end", () => {
447
- resolve(Buffer.concat(chunks));
448
- });
449
- req.on("error", (err) => {
450
- reject(err);
451
- });
452
- });
453
- }
454
-
455
- // src/server/connect/requestToNodeMessage.ts
456
- var import_node_stream2 = require("stream");
457
- var DUMMY_BASE_URL = "http://localhost";
458
- function requestToNodeMessage(request) {
459
- const parsedUrl = new URL(request.url, DUMMY_BASE_URL);
460
- const pathAndQuery = (parsedUrl.pathname || "") + (parsedUrl.search || "");
461
- const body = (
462
- /*request.body ? Readable.fromWeb(request.body as any) :*/
463
- import_node_stream2.Readable.from([])
464
- );
465
- return Object.assign(body, {
466
- url: pathAndQuery,
467
- method: request.method,
468
- headers: Object.fromEntries(request.headers)
469
- });
470
- }
471
-
472
- // src/server/connect/connectMiddleware.ts
473
- function connectMiddleware(handler) {
474
- return async (ev, next) => {
475
- const req = requestToNodeMessage(ev.request);
476
- const { res, onReadable } = nodeMessageToNodeResponse(req);
477
- return new Promise(async (resolve, reject) => {
478
- onReadable(async ({ readable, headers, status }) => {
479
- const responseBody = statusCodesWithoutBody.includes(status) ? null : (
480
- //(Readable.toWeb(readable) as ReadableStream);
481
- // HACK: Chunked bodies are not being
482
- // read correctly somewhere...
483
- bufferToArrayBuffer(await readableToBuffer(readable))
484
- );
485
- ev.response = new Response(responseBody, {
486
- status,
487
- headers: flattenHeaders(headers)
488
- });
489
- resolve();
490
- });
491
- const cnext = async (error) => {
492
- if (error) {
493
- reject(error instanceof Error ? error : new Error(String(error)));
494
- } else {
495
- await next();
496
- resolve();
497
- }
498
- };
499
- try {
500
- const handled = await handler(req, res, cnext);
501
- if (handled === false) {
502
- res.destroy();
503
- resolve();
504
- }
505
- } catch (e) {
506
- cnext(e);
507
- }
508
- });
509
- };
510
- }
511
- var statusCodesWithoutBody = [
512
- 100,
513
- // Continue
514
- 101,
515
- // Switching Protocols
516
- 102,
517
- // Processing (WebDAV)
518
- 103,
519
- // Early Hints
520
- 204,
521
- // No Content
522
- 205,
523
- // Reset Content
524
- 304
525
- // Not Modified
526
- ];
527
-
528
- // src/site/prepareTemplate.ts
529
- function prepareTemplate(template, clientScript) {
530
- let result = template;
531
- let headStart = result.indexOf("</head>");
532
- if (headStart === -1) {
533
- throw new Error(`Couldn't find <head> end tag`);
534
- }
535
- result = result.substring(0, headStart) + "%COMPONENT_HEAD%" + result.substring(headStart);
536
- let bodyStart = regexIndexOf(result, /\<div\s+id=("app"|'app'|app)\s+/);
537
- bodyStart = result.indexOf(">", bodyStart) + 1;
538
- let bodyEnd = result.indexOf("</div>", bodyStart);
539
- if (bodyStart === -1 || bodyEnd === -1) {
540
- throw new Error(`Couldn't find <div id="app"></div>`);
541
- }
542
- result = result.substring(0, bodyStart) + "%COMPONENT_BODY%" + result.substring(bodyEnd);
543
- result += `<script type="module" src="${clientScript}"></script>`;
544
- return result;
545
- }
546
- function regexIndexOf(string, regex, position) {
547
- var indexOf = string.substring(position || 0).search(regex);
548
- return indexOf >= 0 ? indexOf + (position || 0) : indexOf;
549
- }
550
-
551
- // src/site/runDev.ts
552
- async function runDev(site) {
553
- const server = new Server();
554
- const config = structuredClone(site.viteConfig ?? {});
555
- config.server = { middlewareMode: true };
556
- config.appType = "custom";
557
- config.plugins = [manifest(site, true), (0, import_vite3.default)(), ...site.plugins];
558
- config.optimizeDeps ??= {};
559
- config.optimizeDeps.extensions ??= [];
560
- config.optimizeDeps.extensions.push(".torp");
561
- config.optimizeDeps.esbuildOptions ??= {};
562
- config.optimizeDeps.esbuildOptions.plugins ??= [];
563
- config.optimizeDeps.esbuildOptions.plugins.push((0, import_esbuild.default)());
564
- const vite = await (0, import_vite4.createServer)(config);
565
- const templateFile = import_node_path3.default.resolve(site.root, "src/site.html");
566
- let template = await import_node_fs3.promises.readFile(templateFile, "utf-8");
567
- template = await vite.transformIndexHtml("", template);
568
- const siteFolder = import_node_path3.default.resolve(site.root, "./node_modules/@torpor/build/src/site/");
569
- let clientScript = import_node_path3.default.join(siteFolder, "clientEntry.ts");
570
- let serverScript = import_node_path3.default.join(siteFolder, "serverEntry.ts");
571
- template = prepareTemplate(template, clientScript);
572
- server.use(connectMiddleware(vite.middlewares));
573
- server.add("*", async (ev) => {
574
- try {
575
- const { load } = await vite.ssrLoadModule(serverScript);
576
- return await load(ev, template);
577
- } catch (e) {
578
- vite.ssrFixStacktrace(e);
579
- return serverError(e);
580
- }
581
- });
582
- (0, import_dotenv.configDotenv)();
583
- process.env.PROTOCOL ??= "http:";
584
- process.env.HOST ??= "localhost";
585
- process.env.PORT ??= "7059";
586
- site.adapter.serve(server, site);
587
- }
588
-
589
- // src/site/runPreview.ts
590
- var import_dotenv2 = require("dotenv");
591
- var import_node_fs4 = require("fs");
592
- var import_node_path4 = __toESM(require("path"), 1);
593
-
594
- // src/server/contentType.ts
595
- function contentType(extension) {
596
- return types[extension] || "application/octet-stream";
597
- }
598
- var types = {
599
- ".aac": "audio/aac",
600
- ".abw": "application/x-abiword",
601
- ".apng": "image/apng",
602
- ".arc": "application/x-freearc",
603
- ".avif": "image/avif",
604
- ".avi": "video/x-msvideo",
605
- ".azw": "application/vnd.amazon.ebook",
606
- ".bin": "application/octet-stream",
607
- ".bmp": "image/bmp",
608
- ".bz": "application/x-bzip",
609
- ".bz2": "application/x-bzip2",
610
- ".cda": "application/x-cdf",
611
- ".csh": "application/x-csh",
612
- ".css": "text/css",
613
- ".csv": "text/csv",
614
- ".doc": "application/msword",
615
- ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
616
- ".eot": "application/vnd.ms-fontobject",
617
- ".epub": "application/epub+zip",
618
- ".gz": "application/gzip",
619
- ".gif": "image/gif",
620
- ".htm": "text/html",
621
- ".html": "text/html",
622
- ".ico": "image/vnd.microsoft.icon",
623
- ".ics": "text/calendar",
624
- ".jar": "application/java-archive",
625
- ".jpeg": "image/jpeg",
626
- ".jpg": "image/jpeg",
627
- ".js": "text/javascript",
628
- ".json": "application/json",
629
- ".jsonld": "application/ld+json",
630
- ".mid": "audio/midi",
631
- ".midi": "audio/midi",
632
- ".mjs": "text/javascript",
633
- ".mp3": "audio/mpeg",
634
- ".mp4": "video/mp4",
635
- ".mpeg": "video/mpeg",
636
- ".mpkg": "application/vnd.apple.installer+xml",
637
- ".odp": "application/vnd.oasis.opendocument.presentation",
638
- ".ods": "application/vnd.oasis.opendocument.spreadsheet",
639
- ".odt": "application/vnd.oasis.opendocument.text",
640
- ".oga": "audio/ogg",
641
- ".ogv": "video/ogg",
642
- ".ogx": "application/ogg",
643
- ".opus": "audio/ogg",
644
- ".otf": "font/otf",
645
- ".png": "image/png",
646
- ".pdf": "application/pdf",
647
- ".php": "application/x-httpd-php",
648
- ".ppt": "application/vnd.ms-powerpoint",
649
- ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
650
- ".rar": "application/vnd.rar",
651
- ".rtf": "application/rtf",
652
- ".sh": "application/x-sh",
653
- ".svg": "image/svg+xml",
654
- ".tar": "application/x-tar",
655
- ".tif": "image/tiff",
656
- ".tiff": "image/tiff",
657
- ".ts": "video/mp2t",
658
- ".ttf": "font/ttf",
659
- ".txt": "text/plain",
660
- ".vsd": "application/vnd.visio",
661
- ".wav": "audio/wav",
662
- ".weba": "audio/webm",
663
- ".webm": "video/webm",
664
- ".webp": "image/webp",
665
- ".woff": "font/woff",
666
- ".woff2": "font/woff2",
667
- ".xhtml": "application/xhtml+xml",
668
- ".xls": "application/vnd.ms-excel",
669
- ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
670
- ".xml": "application/xml",
671
- ".xul": "application/vnd.mozilla.xul+xml",
672
- ".zip": "application/zip",
673
- ".3gp": "video/3gpp",
674
- ".3g2": "video/3gpp2",
675
- ".7z": "application/x-7z-compressed"
676
- };
677
-
678
- // src/site/runPreview.ts
679
- async function runPreview(site) {
680
- await runBuild(site);
681
- const distFolder = import_node_path4.default.resolve(site.root, "dist");
682
- const clientFolder = import_node_path4.default.join(distFolder, "client");
683
- const serverFolder = import_node_path4.default.join(distFolder, "server");
684
- let clientScript = (await import_node_fs4.promises.readdir(import_node_path4.default.join(clientFolder, "assets"))).find(
685
- (f) => f.startsWith("clientEntry-")
686
- );
687
- if (!clientScript) {
688
- throw new Error("clientEntry.js not found");
689
- }
690
- clientScript = `/assets/${clientScript}`;
691
- let siteHtml = import_node_path4.default.join(clientFolder, "site.html");
692
- let template = await import_node_fs4.promises.readFile(siteHtml, "utf-8");
693
- template = prepareTemplate(template, clientScript);
694
- const server = new Server();
695
- server.add("/assets/*", async (ev) => {
696
- try {
697
- const url = new URL(ev.request.url);
698
- const file = import_node_path4.default.join(site.root, "dist", "client", url.pathname);
699
- if ((0, import_node_fs4.existsSync)(file)) {
700
- const body = bufferToArrayBuffer2(await import_node_fs4.promises.readFile(file));
701
- return new Response(body, {
702
- status: 200,
703
- headers: {
704
- "Content-Type": contentType(import_node_path4.default.extname(file))
705
- }
706
- });
707
- }
708
- } catch (e) {
709
- return serverError(e);
710
- }
711
- });
712
- const serverScript = import_node_path4.default.resolve(serverFolder, "serverEntry.js");
713
- server.add("*", async (ev) => {
714
- try {
715
- const { load } = await import(serverScript);
716
- return await load(ev, template);
717
- } catch (e) {
718
- return serverError(e);
719
- }
720
- });
721
- (0, import_dotenv2.configDotenv)();
722
- process.env.PROTOCOL ??= "http:";
723
- process.env.HOST ??= "localhost";
724
- process.env.PORT ??= "7059";
725
- site.adapter.serve(server, site);
726
- }
727
- function bufferToArrayBuffer2(buffer) {
728
- return buffer.buffer.slice(
729
- buffer.byteOffset,
730
- buffer.byteOffset + buffer.byteLength
731
- );
732
- }
733
-
734
- // src/site/run.ts
735
- async function run(folder, mode) {
736
- let configFile = "";
737
- let deleteConfigFile = false;
738
- const jsConfigFile = import_node_path5.default.join(folder, "site.config.js");
739
- const tsConfigFile = import_node_path5.default.join(folder, "site.config.ts");
740
- if (import_node_fs5.default.existsSync(jsConfigFile)) {
741
- configFile = jsConfigFile;
742
- } else if (import_node_fs5.default.existsSync(tsConfigFile)) {
743
- configFile = import_node_path5.default.join(folder, "site.config.temp.js");
744
- let source = import_node_fs5.default.readFileSync(tsConfigFile, "utf-8");
745
- let transformed = await (0, import_vite5.transformWithEsbuild)(source, tsConfigFile, {
746
- loader: "ts"
747
- });
748
- import_node_fs5.default.writeFileSync(configFile, transformed.code);
749
- deleteConfigFile = true;
750
- } else {
751
- throw new Error("site.config file not found");
752
- }
753
- const site = (await import(configFile)).default;
754
- if (!site || !site.root || !site.routes) {
755
- throw new Error("Invalid site in config file");
756
- }
757
- if (deleteConfigFile) {
758
- import_node_fs5.default.rmSync(configFile);
759
- }
760
- switch (mode) {
761
- case "dev": {
762
- await runDev(site);
763
- break;
764
- }
765
- case "build": {
766
- await runBuild(site);
767
- break;
768
- }
769
- case "preview": {
770
- await runPreview(site);
771
- break;
772
- }
773
- default: {
774
- console.log("No mode passed, running in dev");
775
- await runDev(site);
776
- break;
777
- }
778
- }
779
- }
780
- // Annotate the CommonJS export names for ESM import in node:
781
- 0 && (module.exports = {
782
- run,
783
- runBuild,
784
- runDev,
785
- runPreview
786
- });
787
- //# sourceMappingURL=run.cjs.map