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