@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,439 +0,0 @@
1
- import manifest from "@torpor/build/manifest";
2
- import { type ServerComponent, type ServerSlotRender } from "@torpor/view/ssr";
3
- import notFound from "../response/notFound.ts";
4
- import ok from "../response/ok.ts";
5
- import seeOther from "../response/seeOther.ts";
6
- import ServerEvent from "../server/ServerEvent.ts";
7
- import $page from "../state/$page";
8
- import type PageEndPoint from "../types/PageEndPoint.ts";
9
- import type PageServerEndPoint from "../types/PageServerEndPoint.ts";
10
- import type RouteHandler from "../types/RouteHandler.ts";
11
- import {
12
- ERROR_ROUTE,
13
- HOOK_ROUTE,
14
- HOOK_SERVER_ROUTE,
15
- LAYOUT_ROUTE,
16
- LAYOUT_SERVER_ROUTE,
17
- PAGE_ROUTE,
18
- PAGE_SERVER_ROUTE,
19
- SERVER_ROUTE,
20
- } from "../types/RouteType";
21
- import type ServerEndPoint from "../types/ServerEndPoint.ts";
22
- import type ServerHook from "../types/ServerHook.ts";
23
- import type ServerLoadEvent from "../types/ServerLoadEvent.ts";
24
- import Router from "./Router.ts";
25
-
26
- // Build the router from the Site object created by the user
27
- const router = new Router();
28
- router.addPages(manifest.routes);
29
-
30
- //console.log(`routes:\n ${router.routes.map((r) => r.path).join("\n ")}`);
31
-
32
- export async function load(ev: ServerEvent, template: string): Promise<Response> {
33
- const url = new URL(ev.request.url);
34
- const path = url.pathname;
35
- const query = url.searchParams;
36
-
37
- //console.log(`handling ${ev.request.method} for '${path}'${query.size ? ` with ${query}` : ""}`);
38
-
39
- let route = router.match(path, query);
40
- if (!route) {
41
- // If the route wasn't found, the user may be posting a form to a
42
- // +page.server.ts route that doesn't have a corresponding +page.ts
43
- // route, which is allowed, so check for that as well
44
- if (ev.request.method === "POST" && !path.endsWith("/~server")) {
45
- const serverPath =
46
- (path.endsWith("/") ? path.substring(0, path.length - 1) : path) + "/~server";
47
- route = router.match(serverPath, query);
48
- }
49
- }
50
- if (!route) {
51
- return handleResponse(notFound());
52
- }
53
- const handler = route.handler;
54
- const params = route.params || {};
55
-
56
- // Update $page before building the components
57
- $page.url = url;
58
- if (path.endsWith("/_error")) {
59
- $page.status = parseInt(query.get("status") ?? "404");
60
- $page.error = { message: query.get("message") ?? "" };
61
- } else {
62
- $page.status = 200;
63
- }
64
-
65
- // TODO: Hit the server hook out here
66
- // We could maybe set data loading up as middleware on a route??????
67
-
68
- switch (handler.type) {
69
- case PAGE_ROUTE:
70
- case LAYOUT_ROUTE: {
71
- // It's a /+page.ts or /_layout.ts endpoint
72
- if (ev.request.method === "GET") {
73
- return handleResponse(await loadView(ev, url, handler, params, template));
74
- } else if (ev.request.method === "POST") {
75
- // The server end point comes from the sibling /+page.server.ts, if applicable
76
- const serverEndPoint: PageServerEndPoint | undefined =
77
- handler.serverEndPoint && (await handler.serverEndPoint()).default;
78
- return handleResponse(
79
- await runAction(ev, url, handler, serverEndPoint, params, query, template),
80
- true,
81
- );
82
- }
83
- break;
84
- }
85
- case PAGE_SERVER_ROUTE:
86
- case LAYOUT_SERVER_ROUTE: {
87
- // It's a /+page.server.ts or /_layout.server.ts endpoint
88
- if (ev.request.method === "GET") {
89
- return await loadData(ev, url, handler, "load", params);
90
- } else if (ev.request.method === "POST") {
91
- const serverEndPoint: PageServerEndPoint | undefined =
92
- handler.endPoint && (await handler.endPoint()).default;
93
- return handleResponse(
94
- await runAction(ev, url, handler, serverEndPoint, params, query, template),
95
- true,
96
- );
97
- }
98
- break;
99
- }
100
- case SERVER_ROUTE: {
101
- // It's a /+server.ts endpoint
102
- const functionName = ev.request.method.toLowerCase().replace("delete", "del");
103
- return await loadData(ev, url, handler, functionName, params);
104
- }
105
- case HOOK_ROUTE:
106
- case HOOK_SERVER_ROUTE: {
107
- break;
108
- }
109
- case ERROR_ROUTE: {
110
- return await loadView(ev, url, handler, params, template);
111
- }
112
- }
113
-
114
- return notFound();
115
- }
116
-
117
- async function handleResponse(response: Response, fromForm = false): Promise<Response> {
118
- $page.status = response.status;
119
-
120
- // Success codes and redirect codes are acceptable
121
- if (response.status >= 200 && response.status <= 399) {
122
- return response;
123
- }
124
-
125
- // 4xx error codes are acceptable from form actions
126
- if (fromForm && response.status >= 400 && response.status <= 499) {
127
- return response;
128
- }
129
-
130
- // It's an error, so redirect to the error page
131
- // We're just pushing the status and message in the URL, but maybe there's a
132
- // more sophisticated way to do this?
133
- // TODO: Should be returning loadView rather than redirecting
134
- // TODO: Should be returning the NEAREST error page to this path, including layouts
135
- let params = new URLSearchParams();
136
- params.append("status", $page.status.toString());
137
- let message = await response.text();
138
- if (response.headers.get("Content-Type")?.includes("application/json")) {
139
- const data = JSON.parse(message);
140
- message = data.message ?? message;
141
- }
142
- if (message) {
143
- if ($page.error) {
144
- $page.error.message = message;
145
- } else {
146
- $page.error = { message };
147
- }
148
- params.append("message", message);
149
- }
150
- return seeOther(`/_error?${params.toString()}`);
151
- }
152
-
153
- async function loadData(
154
- ev: ServerEvent,
155
- url: URL,
156
- handler: RouteHandler,
157
- functionName: string,
158
- params: Record<string, string>,
159
- ) {
160
- const serverEndPoint: ServerEndPoint | undefined = (await handler.endPoint()).default;
161
- if (serverEndPoint && serverEndPoint[functionName]) {
162
- const serverParams = buildServerParams(ev, url, params);
163
-
164
- if (handler.serverHook) {
165
- const serverHook: ServerHook | undefined = (await handler.serverHook()).default;
166
- if (serverHook?.handle) {
167
- await serverHook.handle(serverParams);
168
- }
169
- }
170
-
171
- const result = await serverEndPoint[functionName](serverParams);
172
-
173
- // If there was no response returned from load (such as errors or a
174
- // redirect), send an ok response
175
- return result || ok();
176
- }
177
-
178
- return notFound();
179
- }
180
-
181
- async function loadView(
182
- ev: ServerEvent,
183
- url: URL,
184
- handler: RouteHandler,
185
- params: Record<string, string>,
186
- template: string,
187
- formStatus?: number,
188
- form?: Record<string, string | number>,
189
- ) {
190
- // There must be a client endpoint with a component
191
- const clientEndPoint: PageEndPoint | undefined = (await handler.endPoint()).default;
192
- if (!clientEndPoint?.component) {
193
- return notFound();
194
- }
195
-
196
- // There may be a server endpoint
197
- const serverEndPoint: PageServerEndPoint | undefined =
198
- handler.serverEndPoint && (await handler.serverEndPoint())?.default;
199
-
200
- // Maybe hit the server hook
201
- const serverParams = buildServerParams(ev, url, params);
202
- if (handler.serverHook) {
203
- const serverHook: ServerHook | undefined = (await handler.serverHook()).default;
204
- if (serverHook?.handle) {
205
- await serverHook.handle(serverParams);
206
- }
207
- }
208
-
209
- // Pass the data into $props
210
- // TODO: Promise.all
211
- // NOTE: We're loading data from top to bottom, overriding as we go, and I'm
212
- // not sure if this is the best way to go
213
- let data = {};
214
- if (handler.layouts) {
215
- for (let layout of handler.layouts) {
216
- const layoutEndPoint: PageEndPoint | undefined = (await layout.endPoint())?.default;
217
- const layoutServerEndPoint: PageServerEndPoint | undefined =
218
- layout.serverEndPoint && (await layout.serverEndPoint())?.default;
219
- const layoutResponse = await loadClientAndServerData(
220
- url,
221
- params,
222
- serverParams,
223
- data,
224
- layoutEndPoint,
225
- layoutServerEndPoint,
226
- );
227
- if (layoutResponse?.ok === false) {
228
- return layoutResponse;
229
- }
230
- }
231
- }
232
- let endPointResponse = await loadClientAndServerData(
233
- url,
234
- params,
235
- serverParams,
236
- data,
237
- clientEndPoint,
238
- serverEndPoint,
239
- );
240
- if (endPointResponse?.ok === false) {
241
- return endPointResponse;
242
- }
243
- let $props: Record<string, any> = { data, form };
244
-
245
- let styles = "";
246
-
247
- // If there are layouts, work our way upwards, pushing each component into
248
- // the default slot of its parent
249
- // TODO: Also handle layout server data
250
- // TODO: There's probably a nicer way to do this with reducers or something
251
- let component = clientEndPoint.component as ServerComponent;
252
- let slots: Record<string, ServerSlotRender> | undefined = undefined;
253
- if (handler.layouts) {
254
- let slotFunctions: ServerSlotRender[] = [];
255
- slotFunctions[handler.layouts.length] = (_, $context) => {
256
- let { body, head } = (clientEndPoint.component as ServerComponent)($props, $context);
257
- styles += head;
258
- return body;
259
- };
260
- for (let i = handler.layouts.length - 1; i >= 0; i--) {
261
- const layoutEndPoint: PageEndPoint | undefined = (await handler.layouts[i].endPoint())
262
- ?.default;
263
- if (layoutEndPoint?.component) {
264
- if (i === 0) {
265
- component = layoutEndPoint.component as ServerComponent;
266
- slots = { _: slotFunctions[i + 1] };
267
- } else {
268
- slotFunctions[i] = (_, $context) => {
269
- let { body, head } = (layoutEndPoint.component as ServerComponent)($props, $context, {
270
- _: slotFunctions[i + 1],
271
- });
272
- styles += head;
273
- return body;
274
- };
275
- }
276
- }
277
- }
278
- }
279
-
280
- let html;
281
- try {
282
- let { body, head } = component($props, undefined, slots);
283
-
284
- // Put the form info in a hidden input so that it can be accessed on the client
285
- if (form) {
286
- body += `\n<input type="hidden" id="t-form-data" value='${JSON.stringify(form).replaceAll("'", "\\'")}' />`;
287
- }
288
-
289
- styles += head;
290
- html = template.replace("%COMPONENT_BODY%", body).replace("%COMPONENT_HEAD%", styles);
291
- } catch (error) {
292
- // TODO: Show a proper Error component
293
- html = '<span style="color: red">Script syntax error</span><p>' + error + "</p>";
294
- console.log(error);
295
- }
296
-
297
- return new Response(html, {
298
- status: formStatus ?? 200,
299
- headers: {
300
- "Content-Type": "text/html",
301
- },
302
- });
303
- }
304
-
305
- async function runAction(
306
- ev: ServerEvent,
307
- url: URL,
308
- handler: RouteHandler,
309
- serverEndPoint: PageServerEndPoint | undefined,
310
- params: Record<string, string>,
311
- query: URLSearchParams,
312
- template: string,
313
- ) {
314
- const actionName = (Array.from(query.keys())[0] || "default").replace(/^\//, "");
315
- if (serverEndPoint?.actions) {
316
- const action = serverEndPoint.actions[actionName];
317
- if (action) {
318
- const serverParams = buildServerParams(ev, url, params);
319
-
320
- if (handler.serverHook) {
321
- const serverHook: ServerHook | undefined = (await handler.serverHook()).default;
322
- if (serverHook?.handle) {
323
- await serverHook.handle(serverParams);
324
- }
325
- }
326
-
327
- let result = await action(serverParams);
328
-
329
- if (ev.request.headers.has("x-torpor-form-submit")) {
330
- // If the form was submitted from javascript, just return the
331
- // response and it will be handled on the client
332
- // TODO: Should we make the user return a response??
333
- result ??= ok();
334
-
335
- // If it's a redirect, we need to stop the browser handling it
336
- if (result.status >= 300 && result.status <= 399) {
337
- const location = result.headers.get("location") ?? "";
338
- result = ok();
339
- result.headers.set("x-torpor-form-redirect", "");
340
- result.headers.set("location", location);
341
- }
342
-
343
- return result;
344
- } else if (
345
- !result ||
346
- (result.status >= 200 && result.status <= 299) ||
347
- (result.status >= 400 && result.status <= 499)
348
- ) {
349
- // If the form was submitted without javascript, and there was
350
- // no result, an ok result, or a 4xx error, re-render the view
351
- // with the form result
352
- // TODO: do not re-run hooks?
353
- const newUrl = new URL(url.pathname, url);
354
- const formStatus = result?.status;
355
- let formMessage = await result?.text();
356
- if (formMessage && result?.headers.get("Content-Type")?.includes("application/json")) {
357
- $page.form = JSON.parse(formMessage);
358
- formMessage = undefined;
359
- } else {
360
- $page.form = {};
361
- }
362
- // Set status and message if they haven't already been set,
363
- // which means that you can just return e.g. forbidden() or
364
- // forbidden("no!") and there will be something you can work
365
- // with in your component, or you can set a completely custom
366
- // object with whatever info you need
367
- $page.form!.status ??= formStatus ?? 0;
368
- $page.form!.message ??= formMessage ?? "";
369
- return await loadView(ev, newUrl, handler, params, template, formStatus, $page.form);
370
- } else {
371
- // If the form was submitted without javascript and there was a
372
- // redirect or server error, just return the result to handle it
373
- // as normal
374
- return result;
375
- }
376
- }
377
- }
378
-
379
- return notFound();
380
- }
381
-
382
- async function loadClientAndServerData(
383
- url: URL,
384
- params: Record<string, string>,
385
- serverParams: ServerLoadEvent,
386
- data: Record<string, any>,
387
- clientEndPoint?: PageEndPoint,
388
- serverEndPoint?: PageServerEndPoint,
389
- ) {
390
- if (clientEndPoint?.load) {
391
- const clientParams = buildClientParams(url, params, data);
392
- const clientResponse = await clientEndPoint.load(clientParams);
393
- if (clientResponse) {
394
- if (clientResponse.ok) {
395
- if (clientResponse.headers.get("Content-Type")?.includes("application/json")) {
396
- Object.assign(data, await clientResponse.json());
397
- }
398
- } else {
399
- return clientResponse;
400
- }
401
- }
402
- }
403
- if (serverEndPoint?.load) {
404
- const serverResponse = await serverEndPoint.load(serverParams);
405
- if (serverResponse) {
406
- if (serverResponse.ok) {
407
- if (serverResponse.headers.get("Content-Type")?.includes("application/json")) {
408
- Object.assign(data, await serverResponse.json());
409
- }
410
- } else {
411
- return serverResponse;
412
- }
413
- }
414
- }
415
- }
416
-
417
- function buildClientParams(url: URL, params: Record<string, string>, data: Record<string, any>) {
418
- return {
419
- url,
420
- params,
421
- data,
422
- };
423
- }
424
-
425
- function buildServerParams(
426
- ev: ServerEvent,
427
- url: URL,
428
- params: Record<string, string>,
429
- ): ServerLoadEvent {
430
- return {
431
- url,
432
- params,
433
- appData: {},
434
- request: ev.request,
435
- cookies: ev.cookies,
436
- headers: ev.headers,
437
- adapter: ev.adapter,
438
- };
439
- }
@@ -1,24 +0,0 @@
1
- import { $watch } from "@torpor/view";
2
- import type PageState from "../types/PageState";
3
-
4
- const PAGE_SYMBOL: unique symbol = Symbol.for("torp.Page");
5
-
6
- const $page: PageState =
7
- // @ts-ignore
8
- (globalThis[PAGE_SYMBOL] ??=
9
- // TODO: Should use the SSR $watch if entering via serverEntry
10
- $watch(
11
- {
12
- status: 404,
13
- url: new URL("http://localhost"),
14
- form: undefined,
15
- error: {
16
- message: "",
17
- },
18
- },
19
- {
20
- shallow: true,
21
- },
22
- ));
23
-
24
- export default $page;
@@ -1,15 +0,0 @@
1
- import type ClientState from "../types/ClientState";
2
-
3
- const CLIENT_SYMBOL: unique symbol = Symbol.for("torp.Client");
4
-
5
- const client: ClientState =
6
- // @ts-ignore
7
- (globalThis[CLIENT_SYMBOL] ??= {
8
- // @ts-ignore This will definitely, 100% get set
9
- router: null,
10
- layoutStack: [],
11
- // TODO: Probably expire after 30 seconds or something?
12
- prefetchedData: {},
13
- });
14
-
15
- export default client;
package/src/state.ts DELETED
@@ -1,3 +0,0 @@
1
- import $page from "./state/$page";
2
-
3
- export { $page };