@torpor/build 0.4.14 → 1.0.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 (193) hide show
  1. package/README.md +20 -2
  2. package/dist/Jsonify-Dg6gChd3.d.mts +10 -0
  3. package/dist/Jsonify-Dg6gChd3.d.mts.map +1 -0
  4. package/dist/ParseRouteParams-DBmqlmLh.d.mts +42 -0
  5. package/dist/ParseRouteParams-DBmqlmLh.d.mts.map +1 -0
  6. package/dist/{RouteType-B6BMOyYw.mjs → Router-C4ADUfhv.mjs} +30 -42
  7. package/dist/Router-C4ADUfhv.mjs.map +1 -0
  8. package/dist/Server-BnjLJleZ.mjs +104 -0
  9. package/dist/Server-BnjLJleZ.mjs.map +1 -0
  10. package/dist/Server-Cler2w5O.d.mts +61 -0
  11. package/dist/Server-Cler2w5O.d.mts.map +1 -0
  12. package/dist/ServerEvent-CTx3Q-hk.d.mts +48 -0
  13. package/dist/ServerEvent-CTx3Q-hk.d.mts.map +1 -0
  14. package/dist/{ServerEvent-CxPwA4lH.mjs → ServerEvent-Dljn5i7A.mjs} +37 -11
  15. package/dist/ServerEvent-Dljn5i7A.mjs.map +1 -0
  16. package/dist/Site-CE0_o5Ci.d.mts +566 -0
  17. package/dist/Site-CE0_o5Ci.d.mts.map +1 -0
  18. package/dist/StandardSchema-D28L8_zZ.d.mts +100 -0
  19. package/dist/StandardSchema-D28L8_zZ.d.mts.map +1 -0
  20. package/dist/TypedResponse-6lznqN4U.d.mts +22 -0
  21. package/dist/TypedResponse-6lznqN4U.d.mts.map +1 -0
  22. package/dist/{_page-BQs4WvCO.mjs → _page-4cQKs_Dn.mjs} +3 -5
  23. package/dist/_page-4cQKs_Dn.mjs.map +1 -0
  24. package/dist/bin/index.d.mts +1 -1
  25. package/dist/bin/index.js +15 -11
  26. package/dist/bin/index.js.map +1 -1
  27. package/dist/clientEntry.d.mts +1 -0
  28. package/dist/clientEntry.mjs +59 -0
  29. package/dist/clientEntry.mjs.map +1 -0
  30. package/dist/clientEntryDev.d.mts +1 -0
  31. package/dist/clientEntryDev.mjs +7 -0
  32. package/dist/clientEntryDev.mjs.map +1 -0
  33. package/dist/dev.d.mts +3 -0
  34. package/dist/dev.mjs +3 -0
  35. package/dist/endpoint-EULRGCKA.mjs +108 -0
  36. package/dist/endpoint-EULRGCKA.mjs.map +1 -0
  37. package/dist/flattenHeaders-DM5qsSqO.mjs +13 -0
  38. package/dist/flattenHeaders-DM5qsSqO.mjs.map +1 -0
  39. package/dist/form.d.mts +35 -0
  40. package/dist/form.d.mts.map +1 -0
  41. package/dist/form.mjs +48 -0
  42. package/dist/form.mjs.map +1 -0
  43. package/dist/index.d.mts +72 -156
  44. package/dist/index.d.mts.map +1 -1
  45. package/dist/index.mjs +158 -26
  46. package/dist/index.mjs.map +1 -1
  47. package/dist/load-BntzvmwL.mjs +228 -0
  48. package/dist/load-BntzvmwL.mjs.map +1 -0
  49. package/dist/nav.d.mts +58 -5
  50. package/dist/nav.d.mts.map +1 -1
  51. package/dist/nav.mjs +63 -209
  52. package/dist/nav.mjs.map +1 -1
  53. package/dist/openapi.d.mts +144 -0
  54. package/dist/openapi.d.mts.map +1 -0
  55. package/dist/openapi.mjs +2 -0
  56. package/dist/pathTrie-D4Ax2Mu9.mjs +160 -0
  57. package/dist/pathTrie-D4Ax2Mu9.mjs.map +1 -0
  58. package/dist/plugin-D8Www11B.mjs +202 -0
  59. package/dist/plugin-D8Www11B.mjs.map +1 -0
  60. package/dist/{response-C5TtAsh1.mjs → response-Bg4w2S1q.mjs} +16 -39
  61. package/dist/response-Bg4w2S1q.mjs.map +1 -0
  62. package/dist/response.d.mts +309 -289
  63. package/dist/response.d.mts.map +1 -1
  64. package/dist/response.mjs +3 -4
  65. package/dist/run.d.mts +11 -4
  66. package/dist/run.d.mts.map +1 -1
  67. package/dist/run.mjs +2 -8
  68. package/dist/runOpenApi-DlOgF2Il.mjs +1419 -0
  69. package/dist/runOpenApi-DlOgF2Il.mjs.map +1 -0
  70. package/dist/schema.d.mts +32 -0
  71. package/dist/schema.d.mts.map +1 -0
  72. package/dist/schema.mjs +2 -0
  73. package/dist/server/Server.d.mts +2 -0
  74. package/dist/server/Server.mjs +2 -0
  75. package/dist/server.d.mts +11 -8
  76. package/dist/server.d.mts.map +1 -1
  77. package/dist/server.mjs +133 -4
  78. package/dist/server.mjs.map +1 -0
  79. package/dist/serverEntry-1qY3wZig.mjs +351 -0
  80. package/dist/serverEntry-1qY3wZig.mjs.map +1 -0
  81. package/dist/serverEntry-BAO8m03V.d.mts +6 -0
  82. package/dist/serverEntry-BAO8m03V.d.mts.map +1 -0
  83. package/dist/serverEntry.d.mts +2 -0
  84. package/dist/serverEntry.mjs +2 -0
  85. package/dist/state.d.mts.map +1 -1
  86. package/dist/state.mjs +2 -3
  87. package/dist/test.d.mts +8 -10
  88. package/dist/test.d.mts.map +1 -1
  89. package/dist/test.mjs +181 -79
  90. package/dist/test.mjs.map +1 -1
  91. package/dist/{seeOther-B4Yhu9iq.mjs → unprocessable-DAZbrDeR.mjs} +34 -13
  92. package/dist/unprocessable-DAZbrDeR.mjs.map +1 -0
  93. package/dist/validate-Ok4krlkX.mjs +40 -0
  94. package/dist/validate-Ok4krlkX.mjs.map +1 -0
  95. package/package.json +30 -18
  96. package/dist/RouteType-B6BMOyYw.mjs.map +0 -1
  97. package/dist/Server-CF5wDJp6.d.mts +0 -78
  98. package/dist/Server-CF5wDJp6.d.mts.map +0 -1
  99. package/dist/ServerEvent-CxPwA4lH.mjs.map +0 -1
  100. package/dist/Site-DgC6WWn1.d.mts +0 -78
  101. package/dist/Site-DgC6WWn1.d.mts.map +0 -1
  102. package/dist/_page-BQs4WvCO.mjs.map +0 -1
  103. package/dist/connectMiddleware-D7nehjj3.mjs +0 -252
  104. package/dist/connectMiddleware-D7nehjj3.mjs.map +0 -1
  105. package/dist/pathToRegex-TUAMc3zS.mjs +0 -11
  106. package/dist/pathToRegex-TUAMc3zS.mjs.map +0 -1
  107. package/dist/response-C5TtAsh1.mjs.map +0 -1
  108. package/dist/run-BPFtSYA3.mjs +0 -332
  109. package/dist/run-BPFtSYA3.mjs.map +0 -1
  110. package/dist/seeOther-B4Yhu9iq.mjs.map +0 -1
  111. package/src/bin/index.ts +0 -11
  112. package/src/index.ts +0 -30
  113. package/src/nav/formSubmit.ts +0 -56
  114. package/src/nav/load.ts +0 -9
  115. package/src/nav/loadData.ts +0 -134
  116. package/src/nav/navigate.ts +0 -164
  117. package/src/nav/reload.ts +0 -9
  118. package/src/nav.ts +0 -4
  119. package/src/response/badRequest.ts +0 -19
  120. package/src/response/created.ts +0 -20
  121. package/src/response/forbidden.ts +0 -21
  122. package/src/response/found.ts +0 -30
  123. package/src/response/methodNotAllowed.ts +0 -18
  124. package/src/response/movedPermanently.ts +0 -25
  125. package/src/response/notFound.ts +0 -24
  126. package/src/response/notModified.ts +0 -34
  127. package/src/response/ok.ts +0 -29
  128. package/src/response/permanentRedirect.ts +0 -30
  129. package/src/response/response.ts +0 -22
  130. package/src/response/seeOther.ts +0 -19
  131. package/src/response/serverError.ts +0 -24
  132. package/src/response/temporaryRedirect.ts +0 -31
  133. package/src/response/transfer.ts +0 -14
  134. package/src/response/unauthorized.ts +0 -21
  135. package/src/response/unprocessable.ts +0 -18
  136. package/src/response.ts +0 -37
  137. package/src/run/prepareTemplate.ts +0 -39
  138. package/src/run/run.ts +0 -62
  139. package/src/run/runBuild.ts +0 -77
  140. package/src/run/runDev.ts +0 -89
  141. package/src/run/runPreview.ts +0 -93
  142. package/src/run.ts +0 -6
  143. package/src/server/CookieHelper.ts +0 -36
  144. package/src/server/HeaderHelper.ts +0 -25
  145. package/src/server/Routerx.ts +0 -72
  146. package/src/server/Server.ts +0 -144
  147. package/src/server/ServerEvent.ts +0 -39
  148. package/src/server/connect/bufferToArrayBuffer.ts +0 -8
  149. package/src/server/connect/connectMiddleware.ts +0 -81
  150. package/src/server/connect/flattenHeaders.ts +0 -44
  151. package/src/server/connect/nodeMessageToNodeResponse.ts +0 -89
  152. package/src/server/connect/readableToBuffer.ts +0 -16
  153. package/src/server/connect/requestToNodeMessage.ts +0 -26
  154. package/src/server/contentType.ts +0 -85
  155. package/src/server/types/HttpMethod.ts +0 -12
  156. package/src/server/types/MiddlewareFunction.ts +0 -8
  157. package/src/server/types/ServerFunction.ts +0 -7
  158. package/src/server.ts +0 -7
  159. package/src/site/Router.ts +0 -164
  160. package/src/site/Site.ts +0 -214
  161. package/src/site/clientEntry.ts +0 -108
  162. package/src/site/clientEntryDev.ts +0 -3
  163. package/src/site/defaultAdapter.ts +0 -11
  164. package/src/site/manifest.ts +0 -54
  165. package/src/site/serverEntry.ts +0 -439
  166. package/src/state/$page.ts +0 -24
  167. package/src/state/client.ts +0 -15
  168. package/src/state.ts +0 -3
  169. package/src/test/runTest.ts +0 -350
  170. package/src/test.ts +0 -3
  171. package/src/types/Adapter.ts +0 -8
  172. package/src/types/ClientState.ts +0 -8
  173. package/src/types/InternalState.ts +0 -7
  174. package/src/types/LayoutHandler.ts +0 -5
  175. package/src/types/LayoutPath.ts +0 -10
  176. package/src/types/ManifestRoute.ts +0 -6
  177. package/src/types/PageEndPoint.ts +0 -39
  178. package/src/types/PageLoadEvent.ts +0 -14
  179. package/src/types/PageServerAction.ts +0 -7
  180. package/src/types/PageServerEndPoint.ts +0 -16
  181. package/src/types/PageServerLoad.ts +0 -7
  182. package/src/types/PageState.ts +0 -8
  183. package/src/types/Route.ts +0 -11
  184. package/src/types/RouteHandler.ts +0 -16
  185. package/src/types/RouteLayoutHandler.ts +0 -5
  186. package/src/types/RouteMatchResult.ts +0 -7
  187. package/src/types/RouteType.ts +0 -19
  188. package/src/types/ServerEndPoint.ts +0 -37
  189. package/src/types/ServerHook.ts +0 -11
  190. package/src/types/ServerLoadEvent.ts +0 -37
  191. package/src/types/ServerRequest.ts +0 -7
  192. package/src/utils/pathToRegex.ts +0 -15
  193. package/src/vite-env.d.ts +0 -2
@@ -1,332 +0,0 @@
1
- import { i as serverError } from "./response-C5TtAsh1.mjs";
2
- import { n as Server, t as connectMiddleware } from "./connectMiddleware-D7nehjj3.mjs";
3
- import fs, { existsSync, promises, readFileSync } from "node:fs";
4
- import fpath from "node:path";
5
- import { build, createServer, defineConfig, transformWithEsbuild } from "vite";
6
- import torpor from "@torpor/unplugin/vite";
7
- import estorpor from "@torpor/unplugin/esbuild";
8
- import { configDotenv } from "dotenv";
9
-
10
- //#region src/site/manifest.ts
11
- const moduleId = "@torpor/build/manifest";
12
- /**
13
- * A Vite plugin that provides information about the app to both clientEntry and
14
- * serverEntry.
15
- */
16
- function manifest(site, server = false) {
17
- return {
18
- name: "torpor-manifest",
19
- resolveId: {
20
- order: "pre",
21
- handler(id) {
22
- if (id === moduleId) return id;
23
- }
24
- },
25
- load(id, viteOptions) {
26
- if (id === moduleId) {
27
- let serverRequest = server && !!viteOptions?.ssr;
28
- return `
29
- ${!serverRequest ? "const load = { default: { load: true } };" : ""}
30
- export default {
31
- routes: [
32
- ${site.routes.map((r) => {
33
- let endPoint;
34
- if (serverRequest || !/server\.(ts|js)$/.test(r.file)) endPoint = `() => import(/* @vite-ignore */ "${fpath.join(site.root, r.file)}")`;
35
- else endPoint = readFileSync(fpath.join(site.root, r.file)).includes("load:") ? "() => load" : "undefined";
36
- const sub = r.subFolder ? `"${r.subFolder}"` : "undefined";
37
- return `{ path: "${r.path}", type: ${r.type}, endPoint: ${endPoint}, subFolder: ${sub} }`;
38
- }).join(",\n ")}
39
- ],
40
- };
41
- `;
42
- }
43
- }
44
- };
45
- }
46
-
47
- //#endregion
48
- //#region src/run/runBuild.ts
49
- async function runBuild(site) {
50
- const distFolder = fpath.resolve(site.root, "dist");
51
- if (existsSync(distFolder)) await promises.rm(distFolder, { recursive: true });
52
- const clientFolder = fpath.join(distFolder, "client");
53
- const serverFolder = fpath.join(distFolder, "server");
54
- if (site.adapter.prebuild) await site.adapter.prebuild(site);
55
- let siteHtml = fpath.resolve(site.root, "src/site.html");
56
- const siteFolder = fpath.resolve(site.root, "./node_modules/@torpor/build/src/site/");
57
- let clientScript = fpath.join(siteFolder, "clientEntry.ts");
58
- let serverScript = fpath.join(siteFolder, "serverEntry.ts");
59
- const clientConfig = structuredClone(site.viteConfig ?? {});
60
- clientConfig.plugins = [
61
- manifest(site),
62
- torpor(),
63
- ...site.plugins
64
- ];
65
- clientConfig.build ??= {};
66
- clientConfig.build.outDir = clientFolder;
67
- clientConfig.build.rollupOptions ??= {};
68
- clientConfig.build.rollupOptions.input = [
69
- siteHtml,
70
- clientScript,
71
- ...site.routes.filter((r) => !/server\.(ts|js)$/.test(r.file)).map((r) => fpath.resolve(site.root, r.file)),
72
- ...site.inputs.filter((f) => !/server\.(ts|js)$/.test(f))
73
- ];
74
- clientConfig.build.ssrManifest = true;
75
- await build(defineConfig(clientConfig));
76
- const serverConfig = structuredClone(site.viteConfig ?? {});
77
- serverConfig.plugins = [
78
- manifest(site, true),
79
- torpor(),
80
- ...site.plugins
81
- ];
82
- serverConfig.build ??= {};
83
- serverConfig.build.outDir = serverFolder;
84
- serverConfig.build.rollupOptions ??= {};
85
- serverConfig.build.rollupOptions.input = [
86
- serverScript,
87
- ...site.routes.map((r) => fpath.resolve(site.root, r.file)),
88
- ...site.inputs
89
- ];
90
- serverConfig.build.ssr = serverScript;
91
- await build(defineConfig(serverConfig));
92
- siteHtml = fpath.join(clientFolder, "site.html");
93
- await promises.rename(fpath.join(clientFolder, "src", "site.html"), siteHtml);
94
- await promises.rm(fpath.join(clientFolder, "src"), { recursive: true });
95
- if (site.adapter.postbuild) await site.adapter.postbuild(site);
96
- }
97
-
98
- //#endregion
99
- //#region src/run/prepareTemplate.ts
100
- function prepareTemplate(template, clientScript, clientDevScript) {
101
- let result = template;
102
- let headStart = result.indexOf("</head>");
103
- if (headStart === -1) throw new Error(`Couldn't find <head> end tag`);
104
- result = result.substring(0, headStart) + "%COMPONENT_HEAD%" + result.substring(headStart);
105
- let bodyStart = regexIndexOf(result, /<div\s+id=("app"|'app'|app)\s+/);
106
- bodyStart = result.indexOf(">", bodyStart) + 1;
107
- let bodyEnd = result.indexOf("</div>", bodyStart);
108
- if (bodyStart === -1 || bodyEnd === -1) throw new Error(`Couldn't find <div id="app"></div>`);
109
- result = result.substring(0, bodyStart) + "%COMPONENT_BODY%" + result.substring(bodyEnd);
110
- if (clientDevScript) result += `<script type="module" src="${clientDevScript}"><\/script>`;
111
- result += `<script type="module" src="${clientScript}"><\/script>`;
112
- return result;
113
- }
114
- function regexIndexOf(string, regex, position) {
115
- var indexOf = string.substring(position || 0).search(regex);
116
- return indexOf >= 0 ? indexOf + (position || 0) : indexOf;
117
- }
118
-
119
- //#endregion
120
- //#region src/run/runDev.ts
121
- async function runDev(site) {
122
- const server = new Server();
123
- const config = structuredClone(site.viteConfig ?? {});
124
- config.server = { middlewareMode: true };
125
- config.appType = "custom";
126
- config.plugins = [
127
- manifest(site, true),
128
- torpor({ dev: true }),
129
- ...site.plugins
130
- ];
131
- config.optimizeDeps ??= {};
132
- config.optimizeDeps.extensions ??= [];
133
- config.optimizeDeps.extensions.push(".torp");
134
- config.optimizeDeps.esbuildOptions ??= {};
135
- config.optimizeDeps.esbuildOptions.plugins ??= [];
136
- config.optimizeDeps.esbuildOptions.plugins.push(estorpor());
137
- const vite = await createServer(config);
138
- const templateFile = fpath.resolve(site.root, "src/site.html");
139
- let template = await promises.readFile(templateFile, "utf-8");
140
- template = await vite.transformIndexHtml("", template);
141
- const siteFolder = fpath.resolve(site.root, "./node_modules/@torpor/build/src/site/");
142
- let clientScript = fpath.join(siteFolder, "clientEntry.ts");
143
- let clientDevScript = fpath.join(siteFolder, "clientEntryDev.ts");
144
- let serverScript = fpath.join(siteFolder, "serverEntry.ts");
145
- template = prepareTemplate(template, clientScript, clientDevScript);
146
- server.use(connectMiddleware(vite.middlewares));
147
- server.add("*", async (ev) => {
148
- try {
149
- const { load } = await vite.ssrLoadModule(serverScript);
150
- return await load(ev, template);
151
- } catch (e) {
152
- vite.ssrFixStacktrace(e);
153
- return serverError(e);
154
- }
155
- });
156
- configDotenv();
157
- process.env.PROTOCOL ??= "http:";
158
- process.env.HOST ??= "localhost";
159
- process.env.PORT ??= "7059";
160
- site.adapter.serve(server, site);
161
- }
162
-
163
- //#endregion
164
- //#region src/server/contentType.ts
165
- function contentType(extension) {
166
- return types[extension] || "application/octet-stream";
167
- }
168
- const types = {
169
- ".aac": "audio/aac",
170
- ".abw": "application/x-abiword",
171
- ".apng": "image/apng",
172
- ".arc": "application/x-freearc",
173
- ".avif": "image/avif",
174
- ".avi": "video/x-msvideo",
175
- ".azw": "application/vnd.amazon.ebook",
176
- ".bin": "application/octet-stream",
177
- ".bmp": "image/bmp",
178
- ".bz": "application/x-bzip",
179
- ".bz2": "application/x-bzip2",
180
- ".cda": "application/x-cdf",
181
- ".csh": "application/x-csh",
182
- ".css": "text/css",
183
- ".csv": "text/csv",
184
- ".doc": "application/msword",
185
- ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
186
- ".eot": "application/vnd.ms-fontobject",
187
- ".epub": "application/epub+zip",
188
- ".gz": "application/gzip",
189
- ".gif": "image/gif",
190
- ".htm": "text/html",
191
- ".html": "text/html",
192
- ".ico": "image/vnd.microsoft.icon",
193
- ".ics": "text/calendar",
194
- ".jar": "application/java-archive",
195
- ".jpeg": "image/jpeg",
196
- ".jpg": "image/jpeg",
197
- ".js": "text/javascript",
198
- ".json": "application/json",
199
- ".jsonld": "application/ld+json",
200
- ".mid": "audio/midi",
201
- ".midi": "audio/midi",
202
- ".mjs": "text/javascript",
203
- ".mp3": "audio/mpeg",
204
- ".mp4": "video/mp4",
205
- ".mpeg": "video/mpeg",
206
- ".mpkg": "application/vnd.apple.installer+xml",
207
- ".odp": "application/vnd.oasis.opendocument.presentation",
208
- ".ods": "application/vnd.oasis.opendocument.spreadsheet",
209
- ".odt": "application/vnd.oasis.opendocument.text",
210
- ".oga": "audio/ogg",
211
- ".ogv": "video/ogg",
212
- ".ogx": "application/ogg",
213
- ".opus": "audio/ogg",
214
- ".otf": "font/otf",
215
- ".png": "image/png",
216
- ".pdf": "application/pdf",
217
- ".php": "application/x-httpd-php",
218
- ".ppt": "application/vnd.ms-powerpoint",
219
- ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
220
- ".rar": "application/vnd.rar",
221
- ".rtf": "application/rtf",
222
- ".sh": "application/x-sh",
223
- ".svg": "image/svg+xml",
224
- ".tar": "application/x-tar",
225
- ".tif": "image/tiff",
226
- ".tiff": "image/tiff",
227
- ".ts": "video/mp2t",
228
- ".ttf": "font/ttf",
229
- ".txt": "text/plain",
230
- ".vsd": "application/vnd.visio",
231
- ".wav": "audio/wav",
232
- ".weba": "audio/webm",
233
- ".webm": "video/webm",
234
- ".webp": "image/webp",
235
- ".woff": "font/woff",
236
- ".woff2": "font/woff2",
237
- ".xhtml": "application/xhtml+xml",
238
- ".xls": "application/vnd.ms-excel",
239
- ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
240
- ".xml": "application/xml",
241
- ".xul": "application/vnd.mozilla.xul+xml",
242
- ".zip": "application/zip",
243
- ".3gp": "video/3gpp",
244
- ".3g2": "video/3gpp2",
245
- ".7z": "application/x-7z-compressed"
246
- };
247
-
248
- //#endregion
249
- //#region src/run/runPreview.ts
250
- async function runPreview(site) {
251
- await runBuild(site);
252
- const distFolder = fpath.resolve(site.root, "dist");
253
- const clientFolder = fpath.join(distFolder, "client");
254
- const serverFolder = fpath.join(distFolder, "server");
255
- let clientScript = (await promises.readdir(fpath.join(clientFolder, "assets"))).find((f) => f.startsWith("clientEntry-"));
256
- if (!clientScript) throw new Error("clientEntry.js not found");
257
- clientScript = `/assets/${clientScript}`;
258
- let siteHtml = fpath.join(clientFolder, "site.html");
259
- let template = await promises.readFile(siteHtml, "utf-8");
260
- template = prepareTemplate(template, clientScript);
261
- const server = new Server();
262
- server.add("/assets/*", async (ev) => {
263
- try {
264
- const url = new URL(ev.request.url);
265
- const file = fpath.join(site.root, "dist", "client", url.pathname);
266
- if (existsSync(file)) {
267
- const body = bufferToArrayBuffer(await promises.readFile(file));
268
- return new Response(body, {
269
- status: 200,
270
- headers: { "Content-Type": contentType(fpath.extname(file)) }
271
- });
272
- }
273
- } catch (e) {
274
- return serverError(e);
275
- }
276
- });
277
- const serverScript = fpath.resolve(serverFolder, "serverEntry.js");
278
- server.add("*", async (ev) => {
279
- try {
280
- const { load } = await import(serverScript);
281
- return await load(ev, template);
282
- } catch (e) {
283
- return serverError(e);
284
- }
285
- });
286
- configDotenv();
287
- process.env.PROTOCOL ??= "http:";
288
- process.env.HOST ??= "localhost";
289
- process.env.PORT ??= "7059";
290
- site.adapter.serve(server, site);
291
- }
292
- function bufferToArrayBuffer(buffer) {
293
- return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);
294
- }
295
-
296
- //#endregion
297
- //#region src/run/run.ts
298
- async function run(folder, mode) {
299
- let configFile = "";
300
- let deleteConfigFile = false;
301
- const jsConfigFile = fpath.join(folder, "site.config.js");
302
- const tsConfigFile = fpath.join(folder, "site.config.ts");
303
- if (fs.existsSync(jsConfigFile)) configFile = jsConfigFile;
304
- else if (fs.existsSync(tsConfigFile)) {
305
- configFile = fpath.join(folder, "site.config.temp.js");
306
- let transformed = await transformWithEsbuild(fs.readFileSync(tsConfigFile, "utf-8"), tsConfigFile, { loader: "ts" });
307
- fs.writeFileSync(configFile, transformed.code);
308
- deleteConfigFile = true;
309
- } else throw new Error("site.config file not found");
310
- const site = (await import(configFile)).default;
311
- if (!site || !site.root || !site.routes) throw new Error("Invalid site in config file");
312
- if (deleteConfigFile) fs.rmSync(configFile);
313
- switch (mode) {
314
- case "dev":
315
- await runDev(site);
316
- break;
317
- case "build":
318
- await runBuild(site);
319
- break;
320
- case "preview":
321
- await runPreview(site);
322
- break;
323
- default:
324
- console.log("No mode passed, running in dev");
325
- await runDev(site);
326
- break;
327
- }
328
- }
329
-
330
- //#endregion
331
- export { runBuild as i, runPreview as n, runDev as r, run as t };
332
- //# sourceMappingURL=run-BPFtSYA3.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"run-BPFtSYA3.mjs","names":["endPoint: string","path","path","fs","createViteServer","path","fs","e: any","types: Record<string, string>","path","fs","e: any","path"],"sources":["../src/site/manifest.ts","../src/run/runBuild.ts","../src/run/prepareTemplate.ts","../src/run/runDev.ts","../src/server/contentType.ts","../src/run/runPreview.ts","../src/run/run.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Plugin } from \"vite\";\nimport Site from \"./Site\";\n\nconst moduleId = \"@torpor/build/manifest\";\n\n/**\n * A Vite plugin that provides information about the app to both clientEntry and\n * serverEntry.\n */\nexport default function manifest(site: Site, server = false): Plugin {\n\treturn {\n\t\tname: \"torpor-manifest\",\n\t\tresolveId: {\n\t\t\torder: \"pre\",\n\t\t\thandler(id) {\n\t\t\t\tif (id === moduleId) {\n\t\t\t\t\treturn id;\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\t// @ts-ignore\n\t\tload(id, viteOptions) {\n\t\t\tif (id === moduleId) {\n\t\t\t\tlet serverRequest = server && !!viteOptions?.ssr;\n\t\t\t\treturn `\n${!serverRequest ? \"const load = { default: { load: true } };\" : \"\"}\nexport default {\n routes: [\n ${site.routes\n\t\t\t.map((r) => {\n\t\t\t\tlet endPoint: string;\n\t\t\t\tif (serverRequest || !/server\\.(ts|js)$/.test(r.file)) {\n\t\t\t\t\tendPoint = `() => import(/* @vite-ignore */ \"${path.join(site.root, r.file)}\")`;\n\t\t\t\t} else {\n\t\t\t\t\t// On the client, for a server route, we need to check\n\t\t\t\t\t// whether there's a load function and set a dummy endPoint\n\t\t\t\t\t// if so. The correct endpoint will be hit in clientEntry\n\t\t\t\t\t// HACK: Should do this better than checking for `load:` in source...\n\t\t\t\t\tconst haveLoad = readFileSync(path.join(site.root, r.file)).includes(\"load:\");\n\t\t\t\t\tendPoint = haveLoad ? \"() => load\" : \"undefined\";\n\t\t\t\t}\n\t\t\t\tconst sub = r.subFolder ? `\"${r.subFolder}\"` : \"undefined\";\n\t\t\t\treturn `{ path: \"${r.path}\", type: ${r.type}, endPoint: ${endPoint}, subFolder: ${sub} }`;\n\t\t\t})\n\t\t\t.join(\",\\n \")}\n ],\n};\n`;\n\t\t\t}\n\t\t},\n\t};\n}\n","import torpor from \"@torpor/unplugin/vite\";\nimport { existsSync, promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { build, defineConfig } from \"vite\";\nimport Site from \"../site/Site\";\nimport manifest from \"../site/manifest.ts\";\n\n// TODO: Don't cache index.html in dev?\n// TODO: Multiple hook.server locations\n// TODO: Don't reload layouts during client routing\n// TODO: Call the correct +page and +server routes when in the same folder\n\nexport default async function runBuild(site: Site): Promise<void> {\n\t// Delete the dist folder if it exists\n\tconst distFolder = path.resolve(site.root, \"dist\");\n\tif (existsSync(distFolder)) {\n\t\tawait fs.rm(distFolder, { recursive: true });\n\t}\n\tconst clientFolder = path.join(distFolder, \"client\");\n\tconst serverFolder = path.join(distFolder, \"server\");\n\n\t// HOOK: Prebuild\n\tif (site.adapter.prebuild) {\n\t\tawait site.adapter.prebuild(site);\n\t}\n\n\t// TODO: From a setting\n\tlet siteHtml = path.resolve(site.root, \"src/site.html\");\n\n\tconst siteFolder = path.resolve(site.root, \"./node_modules/@torpor/build/src/site/\");\n\tlet clientScript = path.join(siteFolder, \"clientEntry.ts\");\n\tlet serverScript = path.join(siteFolder, \"serverEntry.ts\");\n\n\t// Build the client assets, including site.html and the route files\n\t// EXCLUDING anything with `server.js` in the name\n\tconst clientConfig = structuredClone(site.viteConfig ?? {});\n\tclientConfig.plugins = [manifest(site), torpor(), ...site.plugins];\n\tclientConfig.build ??= {};\n\tclientConfig.build.outDir = clientFolder;\n\tclientConfig.build.rollupOptions ??= {};\n\tclientConfig.build.rollupOptions.input = [\n\t\tsiteHtml,\n\t\tclientScript,\n\t\t...site.routes\n\t\t\t.filter((r) => !/server\\.(ts|js)$/.test(r.file))\n\t\t\t.map((r) => path.resolve(site.root, r.file)),\n\t\t...site.inputs.filter((f) => !/server\\.(ts|js)$/.test(f)),\n\t];\n\tclientConfig.build.ssrManifest = true;\n\tawait build(defineConfig(clientConfig));\n\n\t// Build the server assets, including the server entry script and the route\n\t// files\n\tconst serverConfig = structuredClone(site.viteConfig ?? {});\n\tserverConfig.plugins = [manifest(site, true), torpor(), ...site.plugins];\n\tserverConfig.build ??= {};\n\tserverConfig.build.outDir = serverFolder;\n\tserverConfig.build.rollupOptions ??= {};\n\tserverConfig.build.rollupOptions.input = [\n\t\tserverScript,\n\t\t...site.routes.map((r) => path.resolve(site.root, r.file)),\n\t\t...site.inputs,\n\t];\n\tserverConfig.build.ssr = serverScript;\n\tawait build(defineConfig(serverConfig));\n\n\t// Move the site.html file into /client\n\t// HACK: Should do this in Rollup if possible?\n\tsiteHtml = path.join(clientFolder, \"site.html\");\n\tawait fs.rename(path.join(clientFolder, \"src\", \"site.html\"), siteHtml);\n\tawait fs.rm(path.join(clientFolder, \"src\"), { recursive: true });\n\n\t// HOOK: Postbuild\n\tif (site.adapter.postbuild) {\n\t\tawait site.adapter.postbuild(site);\n\t}\n}\n","export default function prepareTemplate(\n\ttemplate: string,\n\tclientScript: string,\n\tclientDevScript?: string,\n): string {\n\tlet result = template;\n\n\t// Put %COMPONENT_HEAD% before </head>\n\t// This is where styles will go\n\tlet headStart = result.indexOf(\"</head>\");\n\tif (headStart === -1) {\n\t\tthrow new Error(`Couldn't find <head> end tag`);\n\t}\n\tresult = result.substring(0, headStart) + \"%COMPONENT_HEAD%\" + result.substring(headStart);\n\n\t// Put %COMPONENT_BODY% inside <div id=\"app\"></div>\n\t// This is where the component's HTML will go\n\tlet bodyStart = regexIndexOf(result, /<div\\s+id=(\"app\"|'app'|app)\\s+/);\n\tbodyStart = result.indexOf(\">\", bodyStart) + 1;\n\tlet bodyEnd = result.indexOf(\"</div>\", bodyStart);\n\tif (bodyStart === -1 || bodyEnd === -1) {\n\t\tthrow new Error(`Couldn't find <div id=\"app\"></div>`);\n\t}\n\tresult = result.substring(0, bodyStart) + \"%COMPONENT_BODY%\" + result.substring(bodyEnd);\n\n\t// Add the clientEntry script at the very end, for hydrating and navigating\n\tif (clientDevScript) {\n\t\tresult += `<script type=\"module\" src=\"${clientDevScript}\"></script>`;\n\t}\n\tresult += `<script type=\"module\" src=\"${clientScript}\"></script>`;\n\n\treturn result;\n}\n\n// From https://stackoverflow.com/a/274094\nfunction regexIndexOf(string: string, regex: RegExp, position?: number) {\n\tvar indexOf = string.substring(position || 0).search(regex);\n\treturn indexOf >= 0 ? indexOf + (position || 0) : indexOf;\n}\n","import estorpor from \"@torpor/unplugin/esbuild\";\nimport torpor from \"@torpor/unplugin/vite\";\nimport { configDotenv } from \"dotenv\";\nimport { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { createServer as createViteServer } from \"vite\";\nimport { serverError } from \"../response.ts\";\nimport Server from \"../server/Server.ts\";\nimport connectMiddleware from \"../server/connect/connectMiddleware.ts\";\nimport Site from \"../site/Site.ts\";\nimport manifest from \"../site/manifest.ts\";\nimport prepareTemplate from \"./prepareTemplate.ts\";\n\nexport default async function runDev(site: Site): Promise<void> {\n\tconst server = new Server();\n\n\t// Create the Vite server in middleware mode and configure the app type as\n\t// \"custom\", disabling Vite's own HTML serving logic so the parent server\n\t// can take control\n\tconst config = structuredClone(site.viteConfig ?? {});\n\tconfig.server = { middlewareMode: true };\n\tconfig.appType = \"custom\";\n\tconfig.plugins = [manifest(site, true), torpor({ dev: true }), ...site.plugins];\n\n\t// HACK: To be able to import `.torp` files from barrel files in\n\t// node_modules, we need to add their libraries to `ssr.noExternal` in\n\t// site.config.ts, and let esbuild know how to compile them here\n\tconfig.optimizeDeps ??= {};\n\tconfig.optimizeDeps.extensions ??= [];\n\tconfig.optimizeDeps.extensions.push(\".torp\");\n\tconfig.optimizeDeps.esbuildOptions ??= {};\n\tconfig.optimizeDeps.esbuildOptions.plugins ??= [];\n\tconfig.optimizeDeps.esbuildOptions.plugins.push(estorpor());\n\n\tconst vite = await createViteServer(config);\n\n\t// Read site.html\n\t// It's called site.html because @torpor/build builds the site (html, routes\n\t// etc) while the user builds the app (components etc)\n\tconst templateFile = path.resolve(site.root, \"src/site.html\");\n\tlet template = await fs.readFile(templateFile, \"utf-8\");\n\n\t// Apply Vite HTML transforms. This injects the Vite HMR client, and also\n\t// applies HTML transforms from Vite plugins. Note that we only support a\n\t// universal transform, not individual transforms for each route\n\ttemplate = await vite.transformIndexHtml(\"\", template);\n\n\tconst siteFolder = path.resolve(site.root, \"./node_modules/@torpor/build/src/site/\");\n\tlet clientScript = path.join(siteFolder, \"clientEntry.ts\");\n\tlet clientDevScript = path.join(siteFolder, \"clientEntryDev.ts\");\n\tlet serverScript = path.join(siteFolder, \"serverEntry.ts\");\n\n\t// Prepare site.html so that we can just splice components into it\n\ttemplate = prepareTemplate(template, clientScript, clientDevScript);\n\n\t// Use Vite's Connect instance as middleware. We need to wrap it with\n\t// createMiddlewareHandler that converts Connect middleware to\n\t// Request/Response web handlers\n\tserver.use(connectMiddleware(vite.middlewares));\n\n\t// Every request (GET, POST, etc) goes through loadEndPoint\n\tserver.add(\"*\", async (ev) => {\n\t\ttry {\n\t\t\t// Load the server entry. ssrLoadModule automatically transforms ESM\n\t\t\t// source code to be usable in Node.js. No bundling is required, and\n\t\t\t// it provides efficient invalidation similar to HMR\n\t\t\tconst { load } = await vite.ssrLoadModule(serverScript);\n\n\t\t\t// Render the app HTML (or fetch server data etc) via serverEntry's\n\t\t\t// exported `load` function\n\t\t\treturn await load(ev, template);\n\t\t} catch (e: any) {\n\t\t\t// If an error is caught, let Vite fix the stack trace so it maps\n\t\t\t// back to your actual source code\n\t\t\tvite.ssrFixStacktrace(e);\n\t\t\treturn serverError(e);\n\t\t}\n\t});\n\n\t// Load environment variables from a `.env` file, with defaults if not set\n\tconfigDotenv();\n\n\tprocess.env.PROTOCOL ??= \"http:\";\n\tprocess.env.HOST ??= \"localhost\";\n\tprocess.env.PORT ??= \"7059\";\n\n\t// Serve the site\n\tsite.adapter.serve(server, site);\n}\n","// From https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/MIME_types/Common_types\n\nexport default function contentType(extension: string): string {\n\treturn types[extension] || \"application/octet-stream\";\n}\n\nconst types: Record<string, string> = {\n\t\".aac\": \"audio/aac\",\n\t\".abw\": \"application/x-abiword\",\n\t\".apng\": \"image/apng\",\n\t\".arc\": \"application/x-freearc\",\n\t\".avif\": \"image/avif\",\n\t\".avi\": \"video/x-msvideo\",\n\t\".azw\": \"application/vnd.amazon.ebook\",\n\t\".bin\": \"application/octet-stream\",\n\t\".bmp\": \"image/bmp\",\n\t\".bz\": \"application/x-bzip\",\n\t\".bz2\": \"application/x-bzip2\",\n\t\".cda\": \"application/x-cdf\",\n\t\".csh\": \"application/x-csh\",\n\t\".css\": \"text/css\",\n\t\".csv\": \"text/csv\",\n\t\".doc\": \"application/msword\",\n\t\".docx\": \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n\t\".eot\": \"application/vnd.ms-fontobject\",\n\t\".epub\": \"application/epub+zip\",\n\t\".gz\": \"application/gzip\",\n\t\".gif\": \"image/gif\",\n\t\".htm\": \"text/html\",\n\t\".html\": \"text/html\",\n\t\".ico\": \"image/vnd.microsoft.icon\",\n\t\".ics\": \"text/calendar\",\n\t\".jar\": \"application/java-archive\",\n\t\".jpeg\": \"image/jpeg\",\n\t\".jpg\": \"image/jpeg\",\n\t\".js\": \"text/javascript\",\n\t\".json\": \"application/json\",\n\t\".jsonld\": \"application/ld+json\",\n\t\".mid\": \"audio/midi\",\n\t\".midi\": \"audio/midi\",\n\t\".mjs\": \"text/javascript\",\n\t\".mp3\": \"audio/mpeg\",\n\t\".mp4\": \"video/mp4\",\n\t\".mpeg\": \"video/mpeg\",\n\t\".mpkg\": \"application/vnd.apple.installer+xml\",\n\t\".odp\": \"application/vnd.oasis.opendocument.presentation\",\n\t\".ods\": \"application/vnd.oasis.opendocument.spreadsheet\",\n\t\".odt\": \"application/vnd.oasis.opendocument.text\",\n\t\".oga\": \"audio/ogg\",\n\t\".ogv\": \"video/ogg\",\n\t\".ogx\": \"application/ogg\",\n\t\".opus\": \"audio/ogg\",\n\t\".otf\": \"font/otf\",\n\t\".png\": \"image/png\",\n\t\".pdf\": \"application/pdf\",\n\t\".php\": \"application/x-httpd-php\",\n\t\".ppt\": \"application/vnd.ms-powerpoint\",\n\t\".pptx\": \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n\t\".rar\": \"application/vnd.rar\",\n\t\".rtf\": \"application/rtf\",\n\t\".sh\": \"application/x-sh\",\n\t\".svg\": \"image/svg+xml\",\n\t\".tar\": \"application/x-tar\",\n\t\".tif\": \"image/tiff\",\n\t\".tiff\": \"image/tiff\",\n\t\".ts\": \"video/mp2t\",\n\t\".ttf\": \"font/ttf\",\n\t\".txt\": \"text/plain\",\n\t\".vsd\": \"application/vnd.visio\",\n\t\".wav\": \"audio/wav\",\n\t\".weba\": \"audio/webm\",\n\t\".webm\": \"video/webm\",\n\t\".webp\": \"image/webp\",\n\t\".woff\": \"font/woff\",\n\t\".woff2\": \"font/woff2\",\n\t\".xhtml\": \"application/xhtml+xml\",\n\t\".xls\": \"application/vnd.ms-excel\",\n\t\".xlsx\": \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n\t\".xml\": \"application/xml\",\n\t\".xul\": \"application/vnd.mozilla.xul+xml\",\n\t\".zip\": \"application/zip\",\n\t\".3gp\": \"video/3gpp\",\n\t\".3g2\": \"video/3gpp2\",\n\t\".7z\": \"application/x-7z-compressed\",\n};\n","import { configDotenv } from \"dotenv\";\nimport { existsSync, promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { serverError } from \"../response.ts\";\nimport Server from \"../server/Server.ts\";\nimport contentType from \"../server/contentType.ts\";\nimport Site from \"../site/Site\";\nimport prepareTemplate from \"./prepareTemplate.ts\";\nimport runBuild from \"./runBuild\";\n\nexport default async function runPreview(site: Site): Promise<void> {\n\t// Build the site\n\tawait runBuild(site);\n\n\tconst distFolder = path.resolve(site.root, \"dist\");\n\tconst clientFolder = path.join(distFolder, \"client\");\n\tconst serverFolder = path.join(distFolder, \"server\");\n\n\t// Find the client script file in /assets\n\tlet clientScript = (await fs.readdir(path.join(clientFolder, \"assets\"))).find((f) =>\n\t\tf.startsWith(\"clientEntry-\"),\n\t);\n\tif (!clientScript) {\n\t\tthrow new Error(\"clientEntry.js not found\");\n\t}\n\tclientScript = `/assets/${clientScript}`;\n\n\t// Read site.html\n\t// It's called site.html because @torpor/build builds the site (html, routes\n\t// etc) while the user builds the app (components etc)\n\tlet siteHtml = path.join(clientFolder, \"site.html\");\n\tlet template = await fs.readFile(siteHtml, \"utf-8\");\n\n\t// Prepare site.html so that we can just splice components into it\n\ttemplate = prepareTemplate(template, clientScript);\n\n\t// Configure the server\n\tconst server = new Server();\n\n\t// Serve dist/client/assets statically\n\tserver.add(\"/assets/*\", async (ev) => {\n\t\ttry {\n\t\t\tconst url = new URL(ev.request.url);\n\t\t\tconst file = path.join(site.root, \"dist\", \"client\", url.pathname);\n\t\t\tif (existsSync(file)) {\n\t\t\t\t// TODO: Stream the data?\n\t\t\t\tconst body = bufferToArrayBuffer(await fs.readFile(file));\n\t\t\t\treturn new Response(body, {\n\t\t\t\t\tstatus: 200,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"Content-Type\": contentType(path.extname(file)),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (e: any) {\n\t\t\treturn serverError(e);\n\t\t}\n\t});\n\n\t// Every request (GET, POST, etc) goes through loadEndPoint\n\tconst serverScript = path.resolve(serverFolder, \"serverEntry.js\");\n\tserver.add(\"*\", async (ev) => {\n\t\ttry {\n\t\t\t// Load the server entry\n\t\t\tconst { load } = await import(serverScript);\n\n\t\t\t// Render the app HTML (or fetch server data etc) via serverEntry's\n\t\t\t// exported `load` function\n\t\t\treturn await load(ev, template);\n\t\t} catch (e: any) {\n\t\t\treturn serverError(e);\n\t\t}\n\t});\n\n\t// Load environment variables from a `.env` file, with defaults if not set\n\tconfigDotenv();\n\n\tprocess.env.PROTOCOL ??= \"http:\";\n\tprocess.env.HOST ??= \"localhost\";\n\tprocess.env.PORT ??= \"7059\";\n\n\t// Serve the site\n\tsite.adapter.serve(server, site);\n}\n\n// From https://stackoverflow.com/a/79345620\n// No idea why it is needed\nfunction bufferToArrayBuffer(buffer: Buffer): ArrayBuffer {\n\treturn buffer.buffer.slice(\n\t\tbuffer.byteOffset,\n\t\tbuffer.byteOffset + buffer.byteLength,\n\t) as ArrayBuffer;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { transformWithEsbuild } from \"vite\";\nimport Site from \"../site/Site\";\nimport runBuild from \"./runBuild\";\nimport runDev from \"./runDev\";\nimport runPreview from \"./runPreview\";\n\nexport default async function run(\n\tfolder: string,\n\tmode: \"dev\" | \"build\" | \"preview\",\n): Promise<void> {\n\t// Look for and load a site.config.js/ts file in the working directory\n\tlet configFile = \"\";\n\tlet deleteConfigFile = false;\n\tconst jsConfigFile = path.join(folder, \"site.config.js\");\n\tconst tsConfigFile = path.join(folder, \"site.config.ts\");\n\tif (fs.existsSync(jsConfigFile)) {\n\t\t// If it's JS, we can just import it straight up\n\t\tconfigFile = jsConfigFile;\n\t} else if (fs.existsSync(tsConfigFile)) {\n\t\t// If it's TS, we need to convert it to JS\n\t\t// TODO: Put the generated file somewhere better (dist?)\n\t\tconfigFile = path.join(folder, \"site.config.temp.js\");\n\t\tlet source = fs.readFileSync(tsConfigFile, \"utf-8\");\n\t\tlet transformed = await transformWithEsbuild(source, tsConfigFile, {\n\t\t\tloader: \"ts\",\n\t\t});\n\t\tfs.writeFileSync(configFile, transformed.code);\n\t\tdeleteConfigFile = true;\n\t} else {\n\t\tthrow new Error(\"site.config file not found\");\n\t}\n\n\tconst site = (await import(configFile)).default as Site;\n\tif (!site || !site.root || !site.routes) {\n\t\tthrow new Error(\"Invalid site in config file\");\n\t}\n\tif (deleteConfigFile) {\n\t\tfs.rmSync(configFile);\n\t}\n\n\tswitch (mode) {\n\t\tcase \"dev\": {\n\t\t\tawait runDev(site);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"build\": {\n\t\t\tawait runBuild(site);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"preview\": {\n\t\t\tawait runPreview(site);\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tconsole.log(\"No mode passed, running in dev\");\n\t\t\tawait runDev(site);\n\t\t\tbreak;\n\t\t}\n\t}\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"seeOther-B4Yhu9iq.mjs","names":["headers: Record<string, string> | undefined"],"sources":["../src/response/response.ts","../src/response/transfer.ts","../src/response/notFound.ts","../src/response/ok.ts","../src/response/seeOther.ts"],"sourcesContent":["/**\n * Creates a response with the supplied status code and optional body.\n *\n * If the body is an object, it will be converted to JSON and the content-type\n * header set to \"application/json\". Otherwise, if the body is a string, the\n * content-type header will be set to \"text/plain\".\n */\nexport default function response(status: number, body?: object | string): Response {\n\tlet headers: Record<string, string> | undefined = undefined;\n\tif (body) {\n\t\tif (typeof body === \"object\") {\n\t\t\theaders = { \"content-type\": \"application/json\" };\n\t\t\tbody = JSON.stringify(body);\n\t\t} else {\n\t\t\theaders = { \"content-type\": \"text/plain\" };\n\t\t}\n\t}\n\treturn new Response(body, {\n\t\tstatus,\n\t\theaders,\n\t});\n}\n","/**\n * Creates a redirect response with the supplied status code.\n */\nexport default function transfer(\n\tstatus: 300 | 301 | 302 | 303 | 304 | 307 | 308,\n\tlocation: string,\n): Response {\n\treturn new Response(null, {\n\t\tstatus,\n\t\theaders: {\n\t\t\tlocation,\n\t\t},\n\t});\n}\n","import response from \"./response\";\n\n/**\n * 404 Not Found\n *\n * The HTTP 404 Not Found client error response status code indicates that the\n * server cannot find the requested resource. Links that lead to a 404 page are\n * often called broken or dead links and can be subject to link rot.\n *\n * A 404 status code only indicates that the resource is missing without\n * indicating if this is temporary or permanent. If a resource is permanently\n * removed, servers should send the 410 Gone status instead.\n *\n * 404 errors on a website can lead to a poor user experience for your visitors,\n * so the number of broken links (internal and external) should be minimized to\n * prevent frustration for readers. Common causes of 404 responses are mistyped\n * URLs or pages that are moved or deleted without redirection. For more\n * information, see the Redirections in HTTP guide.\n *\n * See https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/404\n */\nexport default function notFound(body?: object | string): Response {\n\treturn response(404, body ?? \"Not found\");\n}\n","import response from \"./response\";\n\n/**\n * 200 OK\n *\n * The HTTP 200 OK successful response status code indicates that a request has\n * succeeded. A 200 OK response is cacheable by default.\n *\n * A 200 OK response has a different meaning and format depending on the HTTP\n * request method. Here's how they vary for different methods:\n *\n * - GET: A resource was retrieved by the server and included in the response\n * body.\n * - POST: An action succeeded; the response has a message body describing the\n * result.\n * - HEAD: Identical to GET, except there is no message body.\n * - TRACE: The response has a message body containing the request as received\n * by the server.\n *\n * Although possible, successful PUT or DELETE requests often do not result in a\n * 200 OK response. It is more common to see 201 Created if the resource is\n * uploaded or created for the first time, or 204 No Content upon successful\n * deletion of a resource.\n *\n * See https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/200\n */\nexport default function ok(body?: object | string): Response {\n\treturn response(200, body);\n}\n","import transfer from \"./transfer\";\n\n/**\n * 303 See Other\n *\n * The HTTP 303 See Other redirection response status code indicates that the\n * browser should redirect to the URL in the Location header instead of\n * rendering the requested resource.\n *\n * This response code is often sent back as a result of PUT or POST methods so\n * the client may retrieve a confirmation, or view a representation of a\n * real-world object (see HTTP range-14). The method to retrieve the redirected\n * resource is always GET.\n *\n * See https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/303\n */\nexport default function seeOther(location: string): Response {\n\treturn transfer(303, location);\n}\n"],"mappings":";;;;;;;;AAOA,SAAwB,SAAS,QAAgB,MAAkC;CAClF,IAAIA,UAA8C;AAClD,KAAI,KACH,KAAI,OAAO,SAAS,UAAU;AAC7B,YAAU,EAAE,gBAAgB,oBAAoB;AAChD,SAAO,KAAK,UAAU,KAAK;OAE3B,WAAU,EAAE,gBAAgB,cAAc;AAG5C,QAAO,IAAI,SAAS,MAAM;EACzB;EACA;EACA,CAAC;;;;;;;;ACjBH,SAAwB,SACvB,QACA,UACW;AACX,QAAO,IAAI,SAAS,MAAM;EACzB;EACA,SAAS,EACR,UACA;EACD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;ACSH,SAAwB,SAAS,MAAkC;AAClE,QAAO,SAAS,KAAK,QAAQ,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACI1C,SAAwB,GAAG,MAAkC;AAC5D,QAAO,SAAS,KAAK,KAAK;;;;;;;;;;;;;;;;;;;ACX3B,SAAwB,SAAS,UAA4B;AAC5D,QAAO,SAAS,KAAK,SAAS"}
package/src/bin/index.ts DELETED
@@ -1,11 +0,0 @@
1
- #! /usr/bin/env node
2
- import run from "../run/run";
3
-
4
- const workingDir = process.cwd();
5
- if (process.argv.includes("--dev")) {
6
- await run(workingDir, "dev");
7
- } else if (process.argv.includes("--build")) {
8
- await run(workingDir, "build");
9
- } else if (process.argv.includes("--preview")) {
10
- await run(workingDir, "preview");
11
- }
package/src/index.ts DELETED
@@ -1,30 +0,0 @@
1
- import Router from "./site/Router";
2
- import Site from "./site/Site";
3
- import type Adapter from "./types/Adapter";
4
- import type PageEndPoint from "./types/PageEndPoint";
5
- import type PageLoadEvent from "./types/PageLoadEvent";
6
- import type PageServerAction from "./types/PageServerAction";
7
- import type PageServerEndPoint from "./types/PageServerEndPoint";
8
- import type PageServerLoad from "./types/PageServerLoad";
9
- import type ServerEndPoint from "./types/ServerEndPoint";
10
- import type ServerHook from "./types/ServerHook";
11
- import type ServerLoadEvent from "./types/ServerLoadEvent";
12
- import type ServerRequest from "./types/ServerRequest";
13
-
14
- // NOTE: Don't export any general functionality from here -- it may result in
15
- // Vite errors like `Could not resolve '../pkg' in lightningcss` etc
16
-
17
- export { Site, Router };
18
-
19
- export type {
20
- Adapter,
21
- PageEndPoint,
22
- PageServerEndPoint,
23
- PageServerLoad,
24
- PageServerAction,
25
- ServerEndPoint,
26
- ServerRequest,
27
- ServerHook,
28
- PageLoadEvent,
29
- ServerLoadEvent,
30
- };
@@ -1,56 +0,0 @@
1
- import $page from "../state/$page";
2
- import load from "./load";
3
- import reload from "./reload";
4
-
5
- export default async function formSubmit(e: SubmitEvent): Promise<void> {
6
- // We'll take it from here
7
- e.preventDefault();
8
-
9
- // Reset $page on submit and link navigation
10
- // TODO: Should we put data in $page.data??
11
- $page.form = undefined;
12
-
13
- // Perform a POST fetch to the form's action location
14
- const form = e.target as HTMLFormElement;
15
- const button = e.submitter as HTMLButtonElement;
16
- // HACK: submit buttons have their formAction set to the current page if not
17
- // set, so we can't just check whether it's empty and fallback to form action
18
- //const action = button?.formAction ?? form.action;
19
- let action = form.action || document.URL;
20
- if (button && button.formAction && button.formAction !== document.URL) {
21
- action = button.formAction;
22
- }
23
- const options = {
24
- body: new FormData(form),
25
- method: "POST",
26
- mode: "cors",
27
- credentials: "same-origin",
28
- // Add a special header which tells the server that we want the raw
29
- // error response (if applicable) rather than the reloaded page that you
30
- // would get if submitting a page without javascript
31
- headers: {
32
- "x-torpor-form-submit": "",
33
- },
34
- };
35
- const response = await fetch(
36
- action,
37
- // @ts-ignore -- don't know what it's complaining about here
38
- options,
39
- );
40
-
41
- if (response.status === 200 && response.headers.has("x-torpor-form-redirect")) {
42
- // TODO: Should do the correct type of redirect e.g. seeOther etc
43
- const redirect = response.headers.get("location")!;
44
- await load(redirect);
45
- window.location.href = redirect;
46
- } else if (
47
- (response.status >= 200 && response.status <= 299) ||
48
- (response.status >= 400 && response.status <= 499)
49
- ) {
50
- // Put the response into `$page.form`, and it will be put into `$props` in reload
51
- if (response.headers.get("content-type") === "application/json") {
52
- $page.form = await response.json();
53
- }
54
- await reload();
55
- }
56
- }
package/src/nav/load.ts DELETED
@@ -1,9 +0,0 @@
1
- import navigate from "./navigate";
2
-
3
- /**
4
- * Loads and renders the page at the supplied path.
5
- */
6
- export default async function load(path: string): Promise<boolean> {
7
- const url = new URL(path, document.location.href);
8
- return await navigate(url);
9
- }
@@ -1,134 +0,0 @@
1
- import client from "../state/client";
2
- import type LayoutPath from "../types/LayoutPath";
3
- import type PageEndPoint from "../types/PageEndPoint";
4
- import type PageServerEndPoint from "../types/PageServerEndPoint";
5
- import type RouteHandler from "../types/RouteHandler";
6
-
7
- export default async function loadData(
8
- handler: RouteHandler,
9
- params: Record<string, string>,
10
- path: string,
11
- query: URLSearchParams,
12
- newLayoutStack: LayoutPath[],
13
- clientEndPoint: PageEndPoint | undefined,
14
- serverEndPoint: PageServerEndPoint | undefined,
15
- prefetch = false,
16
- ): Promise<Record<string, string> | void> {
17
- let data = {};
18
- if (handler.layouts) {
19
- let layoutStack = client.layoutStack;
20
- for (let [i, layout] of handler.layouts.entries()) {
21
- let layoutPath = layout.path;
22
- for (let key in params) {
23
- layoutPath = layoutPath.replace(`[${key}]`, params[key]);
24
- }
25
- if (layoutStack.at(i)?.path === layoutPath) {
26
- // We've already loaded this layout, we can just re-use its data and UI
27
- if (!prefetch) {
28
- layoutStack[i].reuse = true;
29
- }
30
- newLayoutStack[i] = layoutStack[i];
31
- Object.assign(data, layoutStack[i].data);
32
- } else {
33
- const stackLayout = { path: layoutPath, data: {}, reuse: false, slotRegion: null };
34
- const layoutEndPoint: PageEndPoint | undefined = (await layout.endPoint())?.default;
35
- const layoutServerEndPoint: PageServerEndPoint | undefined =
36
- layout.serverEndPoint && (await layout.serverEndPoint())?.default;
37
- const layoutResponse = await loadClientAndServerData(
38
- stackLayout.data,
39
- document.location.origin + layoutPath,
40
- query,
41
- params,
42
- layoutEndPoint,
43
- layoutServerEndPoint,
44
- );
45
- if (layoutResponse?.ok === false) {
46
- return;
47
- }
48
- Object.assign(data, stackLayout.data);
49
- newLayoutStack.push(stackLayout);
50
- }
51
- }
52
- }
53
- let endPointResponse = await loadClientAndServerData(
54
- data,
55
- document.location.origin + path,
56
- query,
57
- params,
58
- clientEndPoint,
59
- serverEndPoint,
60
- );
61
- if (endPointResponse?.ok === false) {
62
- return;
63
- }
64
- return data;
65
- }
66
-
67
- async function loadClientAndServerData(
68
- data: Record<string, any>,
69
- location: string,
70
- query: URLSearchParams,
71
- params: Record<string, string>,
72
- clientEndPoint?: PageEndPoint,
73
- serverEndPoint?: PageServerEndPoint,
74
- ): Promise<Response | undefined | void> {
75
- let prefetchedData = client.prefetchedData;
76
-
77
- if (clientEndPoint?.load) {
78
- const clientKey = location + (query.size > 0 ? `?${query}` : "");
79
- if (prefetchedData[clientKey]) {
80
- Object.assign(data, prefetchedData[clientKey]);
81
- } else {
82
- const clientUrl = new URL(document.location.href);
83
- for (let [name, value] of query) {
84
- clientUrl.searchParams.append(name, value);
85
- }
86
- const clientParams = buildClientParams(clientUrl, params, data);
87
- const clientResponse = await clientEndPoint.load(clientParams);
88
- if (clientResponse) {
89
- if (clientResponse.ok) {
90
- if (clientResponse.headers.get("Content-Type")?.includes("application/json")) {
91
- const clientData = await clientResponse.json();
92
- Object.assign(data, clientData);
93
- prefetchedData[clientKey] = clientData;
94
- }
95
- } else {
96
- return clientResponse;
97
- }
98
- }
99
- }
100
- }
101
-
102
- if (serverEndPoint?.load) {
103
- const serverLocation = location.replace(/\/$/, "") + "/~server";
104
- const serverKey = serverLocation + (query.size > 0 ? `?${query}` : "");
105
- if (prefetchedData[serverKey]) {
106
- Object.assign(data, prefetchedData[serverKey]);
107
- } else {
108
- const serverUrl = new URL(serverLocation);
109
- for (let [name, value] of query) {
110
- serverUrl.searchParams.append(name, value);
111
- }
112
- const serverResponse = await fetch(serverUrl);
113
- if (serverResponse) {
114
- if (serverResponse.ok) {
115
- if (serverResponse.headers.get("Content-Type")?.includes("application/json")) {
116
- const serverData = await serverResponse.json();
117
- Object.assign(data, serverData);
118
- prefetchedData[serverKey] = serverData;
119
- }
120
- } else {
121
- return serverResponse;
122
- }
123
- }
124
- }
125
- }
126
- }
127
-
128
- function buildClientParams(url: URL, params: Record<string, string>, data: Record<string, any>) {
129
- return {
130
- url,
131
- params,
132
- data,
133
- };
134
- }