@torpor/build 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/RouteType-g8Ce5gOd.js +107 -0
  3. package/dist/RouteType-g8Ce5gOd.js.map +1 -0
  4. package/dist/Server-CSpY_-Ba.d.ts +78 -0
  5. package/dist/Server-CSpY_-Ba.d.ts.map +1 -0
  6. package/dist/ServerEvent-2-CnAy1W.js +74 -0
  7. package/dist/ServerEvent-2-CnAy1W.js.map +1 -0
  8. package/dist/Site-D4x1l0p5.d.ts +67 -0
  9. package/dist/Site-D4x1l0p5.d.ts.map +1 -0
  10. package/dist/_page-Cv6YWocY.js +33 -0
  11. package/dist/_page-Cv6YWocY.js.map +1 -0
  12. package/dist/bin/index.d.ts +1 -1
  13. package/dist/bin/index.js +14 -19
  14. package/dist/bin/index.js.map +1 -1
  15. package/dist/connectMiddleware-DbLj0St1.js +252 -0
  16. package/dist/connectMiddleware-DbLj0St1.js.map +1 -0
  17. package/dist/index.d.ts +188 -179
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +109 -145
  20. package/dist/index.js.map +1 -1
  21. package/dist/nav.d.ts +14 -0
  22. package/dist/nav.d.ts.map +1 -0
  23. package/dist/nav.js +206 -0
  24. package/dist/nav.js.map +1 -0
  25. package/dist/pathToRegex-CTgx7hQP.js +11 -0
  26. package/dist/pathToRegex-CTgx7hQP.js.map +1 -0
  27. package/dist/response-D-XpIuMH.js +307 -0
  28. package/dist/response-D-XpIuMH.js.map +1 -0
  29. package/dist/response.d.ts +336 -151
  30. package/dist/response.d.ts.map +1 -0
  31. package/dist/response.js +4 -37
  32. package/dist/run-CVKpO0HO.js +331 -0
  33. package/dist/run-CVKpO0HO.js.map +1 -0
  34. package/dist/run.d.ts +11 -8
  35. package/dist/run.d.ts.map +1 -0
  36. package/dist/run.js +8 -18
  37. package/dist/seeOther-BmehiI4C.js +110 -0
  38. package/dist/seeOther-BmehiI4C.js.map +1 -0
  39. package/dist/server.d.ts +12 -11
  40. package/dist/server.d.ts.map +1 -0
  41. package/dist/server.js +5 -18
  42. package/dist/state.d.ts +14 -10
  43. package/dist/state.d.ts.map +1 -0
  44. package/dist/state.js +3 -7
  45. package/dist/test.d.ts +12 -11
  46. package/dist/test.d.ts.map +1 -0
  47. package/dist/test.js +152 -225
  48. package/dist/test.js.map +1 -1
  49. package/package.json +25 -29
  50. package/src/bin/index.ts +9 -11
  51. package/src/index.ts +3 -0
  52. package/src/nav/formSubmit.ts +48 -0
  53. package/src/nav/load.ts +9 -0
  54. package/src/nav/loadData.ts +121 -0
  55. package/src/nav/navigate.ts +163 -0
  56. package/src/nav/reload.ts +9 -0
  57. package/src/nav.ts +4 -0
  58. package/src/response/badRequest.ts +9 -4
  59. package/src/response/created.ts +10 -3
  60. package/src/response/forbidden.ts +11 -4
  61. package/src/response/found.ts +30 -0
  62. package/src/response/methodNotAllowed.ts +8 -4
  63. package/src/response/movedPermanently.ts +25 -0
  64. package/src/response/notFound.ts +14 -7
  65. package/src/response/notModified.ts +24 -4
  66. package/src/response/ok.ts +19 -10
  67. package/src/response/permanentRedirect.ts +30 -0
  68. package/src/response/seeOther.ts +9 -3
  69. package/src/response/serverError.ts +14 -2
  70. package/src/response/temporaryRedirect.ts +31 -0
  71. package/src/response/unauthorized.ts +11 -4
  72. package/src/response/unprocessable.ts +8 -2
  73. package/src/response.ts +8 -4
  74. package/src/{site → run}/prepareTemplate.ts +1 -1
  75. package/src/{site → run}/run.ts +1 -1
  76. package/src/{site → run}/runBuild.ts +2 -2
  77. package/src/{site → run}/runDev.ts +2 -2
  78. package/src/{site → run}/runPreview.ts +1 -1
  79. package/src/run.ts +4 -4
  80. package/src/server/Routerx.ts +3 -3
  81. package/src/server/Server.ts +3 -3
  82. package/src/server/connect/connectMiddleware.ts +2 -1
  83. package/src/server/connect/nodeMessageToNodeResponse.ts +2 -2
  84. package/src/site/Router.ts +3 -3
  85. package/src/site/clientEntry.ts +16 -269
  86. package/src/site/defaultAdapter.ts +1 -1
  87. package/src/site/serverEntry.ts +86 -45
  88. package/src/state/$page.ts +3 -12
  89. package/src/state/client.ts +6 -0
  90. package/src/state/internal.ts +45 -0
  91. package/src/test/runTest.ts +1 -1
  92. package/src/types/Adapter.ts +2 -4
  93. package/src/types/ClientState.ts +8 -0
  94. package/src/types/InternalState.ts +7 -0
  95. package/src/types/LayoutHandler.ts +2 -4
  96. package/src/types/LayoutPath.ts +10 -0
  97. package/src/types/ManifestRoute.ts +2 -4
  98. package/src/types/PageEndPoint.ts +2 -4
  99. package/src/types/PageLoadEvent.ts +2 -4
  100. package/src/types/PageServerEndPoint.ts +2 -4
  101. package/src/types/PageState.ts +8 -0
  102. package/src/types/RouteHandler.ts +2 -4
  103. package/src/types/RouteLayoutHandler.ts +2 -4
  104. package/src/types/RouteMatchResult.ts +2 -4
  105. package/src/types/ServerHook.ts +3 -7
  106. package/src/types/ServerLoadEvent.ts +2 -4
  107. package/src/{site → utils}/pathToRegex.ts +1 -1
  108. package/{tsup.config.ts → tsdown.config.ts} +3 -4
  109. package/dist/Server-CNZWh5ca.d.cts +0 -71
  110. package/dist/Server-CNZWh5ca.d.ts +0 -71
  111. package/dist/Site-C2020GV_.d.ts +0 -63
  112. package/dist/Site-DQojGpE-.d.cts +0 -63
  113. package/dist/bin/index.cjs +0 -778
  114. package/dist/bin/index.cjs.map +0 -1
  115. package/dist/bin/index.d.cts +0 -1
  116. package/dist/chunk-565UOT3F.js +0 -18
  117. package/dist/chunk-565UOT3F.js.map +0 -1
  118. package/dist/chunk-B2UNTYN5.js +0 -68
  119. package/dist/chunk-B2UNTYN5.js.map +0 -1
  120. package/dist/chunk-CZHJQCPI.js +0 -286
  121. package/dist/chunk-CZHJQCPI.js.map +0 -1
  122. package/dist/chunk-PTVHEJZ5.js +0 -152
  123. package/dist/chunk-PTVHEJZ5.js.map +0 -1
  124. package/dist/chunk-SJVHHGVW.js +0 -13
  125. package/dist/chunk-SJVHHGVW.js.map +0 -1
  126. package/dist/chunk-TDOXEXG6.js +0 -85
  127. package/dist/chunk-TDOXEXG6.js.map +0 -1
  128. package/dist/chunk-WVXAN4IV.js +0 -50
  129. package/dist/chunk-WVXAN4IV.js.map +0 -1
  130. package/dist/chunk-YRBEYKQM.js +0 -372
  131. package/dist/chunk-YRBEYKQM.js.map +0 -1
  132. package/dist/index.cjs +0 -322
  133. package/dist/index.cjs.map +0 -1
  134. package/dist/index.d.cts +0 -199
  135. package/dist/metafile-cjs.json +0 -1
  136. package/dist/metafile-esm.json +0 -1
  137. package/dist/response.cjs +0 -150
  138. package/dist/response.cjs.map +0 -1
  139. package/dist/response.d.cts +0 -166
  140. package/dist/response.js.map +0 -1
  141. package/dist/run.cjs +0 -787
  142. package/dist/run.cjs.map +0 -1
  143. package/dist/run.d.cts +0 -14
  144. package/dist/run.js.map +0 -1
  145. package/dist/server.cjs +0 -398
  146. package/dist/server.cjs.map +0 -1
  147. package/dist/server.d.cts +0 -17
  148. package/dist/server.js.map +0 -1
  149. package/dist/state.cjs +0 -44
  150. package/dist/state.cjs.map +0 -1
  151. package/dist/state.d.cts +0 -11
  152. package/dist/state.js.map +0 -1
  153. package/dist/test.cjs +0 -538
  154. package/dist/test.cjs.map +0 -1
  155. package/dist/test.d.cts +0 -15
  156. package/src/response/moved.ts +0 -16
  157. package/src/response/redirect.ts +0 -17
  158. package/src/state/Page.ts +0 -8
package/dist/state.d.ts CHANGED
@@ -1,11 +1,15 @@
1
- type Page = {
2
- status: number;
3
- url: URL;
4
- error: {
5
- message: string;
6
- };
7
- };
8
-
9
- declare const $page: Page;
10
-
1
+ //#region src/types/PageState.d.ts
2
+ interface PageState {
3
+ status: number;
4
+ url: URL;
5
+ form?: Record<string, string>;
6
+ error?: {
7
+ message: string;
8
+ };
9
+ }
10
+ //#endregion
11
+ //#region src/state/$page.d.ts
12
+ declare const $page: PageState;
13
+ //#endregion
11
14
  export { $page };
15
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","names":["$page: PageState"],"sources":["../src/types/PageState.ts","../src/state/$page.ts"],"sourcesContent":[],"mappings":";UAAyB,SAAA;QAAA,EAAA,MAAA;EAAA,GAAA,EAEnB,GAFmB;SAGjB,MADF,CAAA,MAAA,EAAA,MAAA,CAAA;QACE,EAAA;IAAA,OAAA,EAAA,MAAA;;;;;cCAFA,KDHmB,ECGZ,SDHY"}
package/dist/state.js CHANGED
@@ -1,7 +1,3 @@
1
- import {
2
- page_default
3
- } from "./chunk-565UOT3F.js";
4
- export {
5
- page_default as $page
6
- };
7
- //# sourceMappingURL=state.js.map
1
+ import { $page_default } from "./_page-Cv6YWocY.js";
2
+
3
+ export { $page_default as $page };
package/dist/test.d.ts CHANGED
@@ -1,15 +1,16 @@
1
- import { a as ServerEvent } from './Server-CNZWh5ca.js';
2
- import { S as Site } from './Site-C2020GV_.js';
3
- import 'cookie';
4
- import 'vite';
1
+ import { ServerEvent } from "./Server-CSpY_-Ba.js";
2
+ import { Site } from "./Site-D4x1l0p5.js";
3
+
4
+ //#region src/test/runTest.d.ts
5
5
 
6
6
  /**
7
- * Runs a site route in test mode
8
- * @param site The site configuration, with routing configured
9
- * @param route The route path e.g. `/home`
10
- * @param ev An optional ServerEvent, which you can use to set test cookies and headers
11
- * @returns An HTTP response containing the requested data, HTML, or error status
12
- */
7
+ * Runs a site route in test mode
8
+ * @param site The site configuration, with routing configured
9
+ * @param route The route path e.g. `/home`
10
+ * @param ev An optional ServerEvent, which you can use to set test cookies and headers
11
+ * @returns An HTTP response containing the requested data, HTML, or error status
12
+ */
13
13
  declare function runTest(site: Site, route: string, ev?: ServerEvent): Promise<Response>;
14
-
14
+ //#endregion
15
15
  export { runTest };
16
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","names":[],"sources":["../src/test/runTest.ts"],"sourcesContent":[],"mappings":";;;;;;;AAOiB;;;;;AA6Bd,iBAJ2B,OAAA,CAI3B,IAAA,EAHI,IAGJ,EAAA,KAAA,EAAA,MAAA,EAAA,EAAA,CAAA,EADG,WACH,CAAA,EAAA,OAAA,CAAQ,QAAR,CAAA"}
package/dist/test.js CHANGED
@@ -1,243 +1,170 @@
1
- import {
2
- HOOK_ROUTE,
3
- HOOK_SERVER_ROUTE,
4
- LAYOUT_ROUTE,
5
- LAYOUT_SERVER_ROUTE,
6
- PAGE_ROUTE,
7
- PAGE_SERVER_ROUTE,
8
- Router,
9
- SERVER_ROUTE
10
- } from "./chunk-PTVHEJZ5.js";
11
- import {
12
- page_default
13
- } from "./chunk-565UOT3F.js";
14
- import {
15
- notFound,
16
- ok,
17
- seeOther
18
- } from "./chunk-WVXAN4IV.js";
19
- import {
20
- ServerEvent
21
- } from "./chunk-TDOXEXG6.js";
22
- import "./chunk-SJVHHGVW.js";
1
+ import "./pathToRegex-CTgx7hQP.js";
2
+ import { HOOK_ROUTE, HOOK_SERVER_ROUTE, LAYOUT_ROUTE, LAYOUT_SERVER_ROUTE, PAGE_ROUTE, PAGE_SERVER_ROUTE, Router, SERVER_ROUTE } from "./RouteType-g8Ce5gOd.js";
3
+ import { $page_default } from "./_page-Cv6YWocY.js";
4
+ import { notFound, ok, seeOther } from "./seeOther-BmehiI4C.js";
5
+ import { ServerEvent } from "./ServerEvent-2-CnAy1W.js";
6
+ import path from "node:path";
23
7
 
24
- // src/test/runTest.ts
25
- import path from "path";
8
+ //#region src/test/runTest.ts
9
+ /**
10
+ * Runs a site route in test mode
11
+ * @param site The site configuration, with routing configured
12
+ * @param route The route path e.g. `/home`
13
+ * @param ev An optional ServerEvent, which you can use to set test cookies and headers
14
+ * @returns An HTTP response containing the requested data, HTML, or error status
15
+ */
26
16
  async function runTest(site, route, ev) {
27
- if (!route.startsWith("/")) route += "/";
28
- if (!ev) {
29
- const req = new Request(`http://localhost${route}`);
30
- ev = new ServerEvent(req);
31
- }
32
- const router = new Router();
33
- router.addPages(
34
- site.routes.map((r) => ({
35
- path: r.path,
36
- type: r.type,
37
- endPoint: () => import(
38
- /* @vite-ignore */
39
- path.join(site.root, r.file)
40
- )
41
- }))
42
- );
43
- return await load(router, ev, "%COMPONENT_BODY%");
17
+ if (!route.startsWith("/")) route += "/";
18
+ if (!ev) {
19
+ const req = new Request(`http://localhost${route}`);
20
+ ev = new ServerEvent(req);
21
+ }
22
+ const router = new Router();
23
+ router.addPages(site.routes.map((r) => ({
24
+ path: r.path,
25
+ type: r.type,
26
+ endPoint: () => import(
27
+ /* @vite-ignore */
28
+ path.join(site.root, r.file)
29
+ )
30
+ })));
31
+ return await load(router, ev, "%COMPONENT_BODY%");
44
32
  }
45
33
  async function load(router, ev, template) {
46
- const url = new URL(ev.request.url);
47
- const path2 = url.pathname;
48
- const query = url.searchParams;
49
- const route = router.match(path2, query);
50
- if (!route) {
51
- return notFound();
52
- }
53
- page_default.url = url;
54
- const handler = route.handler;
55
- const params = route.params || {};
56
- switch (handler.type) {
57
- case PAGE_ROUTE:
58
- case LAYOUT_ROUTE: {
59
- if (ev.request.method === "GET") {
60
- return await loadView(ev, url, handler, params, template);
61
- } else if (ev.request.method === "POST") {
62
- return await runAction(ev, url, handler, params, query);
63
- }
64
- break;
65
- }
66
- case PAGE_SERVER_ROUTE:
67
- case LAYOUT_SERVER_ROUTE: {
68
- if (ev.request.method === "GET") {
69
- return await loadData(ev, url, handler, "load", params);
70
- }
71
- break;
72
- }
73
- case SERVER_ROUTE: {
74
- const functionName = ev.request.method.toLowerCase().replace("delete", "del");
75
- return await loadData(ev, url, handler, functionName, params);
76
- }
77
- case HOOK_ROUTE:
78
- case HOOK_SERVER_ROUTE: {
79
- break;
80
- }
81
- }
82
- return notFound();
34
+ const url = new URL(ev.request.url);
35
+ const path$1 = url.pathname;
36
+ const query = url.searchParams;
37
+ const route = router.match(path$1, query);
38
+ if (!route) return notFound();
39
+ $page_default.url = url;
40
+ const handler = route.handler;
41
+ const params = route.params || {};
42
+ switch (handler.type) {
43
+ case PAGE_ROUTE:
44
+ case LAYOUT_ROUTE:
45
+ if (ev.request.method === "GET") return await loadView(ev, url, handler, params, template);
46
+ else if (ev.request.method === "POST") return await runAction(ev, url, handler, params, query);
47
+ break;
48
+ case PAGE_SERVER_ROUTE:
49
+ case LAYOUT_SERVER_ROUTE:
50
+ if (ev.request.method === "GET") return await loadData(ev, url, handler, "load", params);
51
+ break;
52
+ case SERVER_ROUTE: {
53
+ const functionName = ev.request.method.toLowerCase().replace("delete", "del");
54
+ return await loadData(ev, url, handler, functionName, params);
55
+ }
56
+ case HOOK_ROUTE:
57
+ case HOOK_SERVER_ROUTE: break;
58
+ }
59
+ return notFound();
83
60
  }
84
61
  async function loadData(ev, url, handler, functionName, params) {
85
- const serverEndPoint = (await handler.endPoint()).default;
86
- if (serverEndPoint && serverEndPoint[functionName]) {
87
- const serverParams = buildServerParams(ev, url, params);
88
- if (handler.serverHook) {
89
- const serverHook = (await handler.serverHook()).default;
90
- if (serverHook?.handle) {
91
- await serverHook.handle(serverParams);
92
- }
93
- }
94
- const result = await serverEndPoint[functionName](serverParams);
95
- return result || ok();
96
- }
97
- return notFound();
62
+ const serverEndPoint = (await handler.endPoint()).default;
63
+ if (serverEndPoint && serverEndPoint[functionName]) {
64
+ const serverParams = buildServerParams(ev, url, params);
65
+ if (handler.serverHook) {
66
+ const serverHook = (await handler.serverHook()).default;
67
+ if (serverHook?.handle) await serverHook.handle(serverParams);
68
+ }
69
+ return await serverEndPoint[functionName](serverParams) || ok();
70
+ }
71
+ return notFound();
98
72
  }
99
73
  async function loadView(ev, url, handler, params, template) {
100
- const clientEndPoint = (await handler.endPoint()).default;
101
- if (!clientEndPoint?.component) {
102
- return notFound();
103
- }
104
- const serverEndPoint = handler.serverEndPoint && (await handler.serverEndPoint())?.default;
105
- const serverParams = buildServerParams(ev, url, params);
106
- if (handler.serverHook) {
107
- const serverHook = (await handler.serverHook()).default;
108
- if (serverHook?.handle) {
109
- await serverHook.handle(serverParams);
110
- }
111
- }
112
- let data = {};
113
- if (handler.layouts) {
114
- for (let layout of handler.layouts) {
115
- const layoutEndPoint = (await layout.endPoint())?.default;
116
- const layoutServerEndPoint = layout.serverEndPoint && (await layout.serverEndPoint())?.default;
117
- const layoutResponse = await loadClientAndServerData(
118
- url,
119
- params,
120
- serverParams,
121
- data,
122
- layoutEndPoint,
123
- layoutServerEndPoint
124
- );
125
- if (layoutResponse?.ok === false) {
126
- return layoutResponse;
127
- }
128
- }
129
- }
130
- let endPointResponse = await loadClientAndServerData(
131
- url,
132
- params,
133
- serverParams,
134
- data,
135
- clientEndPoint,
136
- serverEndPoint
137
- );
138
- if (endPointResponse?.ok === false) {
139
- return endPointResponse;
140
- }
141
- let $props = { data };
142
- let component = clientEndPoint.component;
143
- let slots = void 0;
144
- if (handler.layouts) {
145
- let slotFunctions = [];
146
- slotFunctions[handler.layouts.length] = (_, context) => clientEndPoint.component($props, context);
147
- for (let i = handler.layouts.length - 1; i >= 0; i--) {
148
- const layoutEndPoint = (await handler.layouts[i].endPoint())?.default;
149
- if (layoutEndPoint?.component) {
150
- if (i === 0) {
151
- component = layoutEndPoint.component;
152
- slots = { _: slotFunctions[i + 1] };
153
- } else {
154
- slotFunctions[i] = (_, context) => layoutEndPoint.component($props, context, {
155
- _: slotFunctions[i + 1]
156
- });
157
- }
158
- }
159
- }
160
- }
161
- let html;
162
- try {
163
- let { body, head } = component($props, void 0, slots);
164
- html = template.replace("%COMPONENT_BODY%", body).replace("%COMPONENT_HEAD", head);
165
- } catch (error) {
166
- html = '<span style="color: red">Script syntax error</span><p>' + error + "</p>";
167
- console.log(error);
168
- }
169
- return new Response(html, {
170
- status: 200,
171
- headers: {
172
- "Content-Type": "text/html"
173
- }
174
- });
74
+ const clientEndPoint = (await handler.endPoint()).default;
75
+ if (!clientEndPoint?.component) return notFound();
76
+ const serverEndPoint = handler.serverEndPoint && (await handler.serverEndPoint())?.default;
77
+ const serverParams = buildServerParams(ev, url, params);
78
+ if (handler.serverHook) {
79
+ const serverHook = (await handler.serverHook()).default;
80
+ if (serverHook?.handle) await serverHook.handle(serverParams);
81
+ }
82
+ let data = {};
83
+ if (handler.layouts) for (let layout of handler.layouts) {
84
+ const layoutEndPoint = (await layout.endPoint())?.default;
85
+ const layoutServerEndPoint = layout.serverEndPoint && (await layout.serverEndPoint())?.default;
86
+ const layoutResponse = await loadClientAndServerData(url, params, serverParams, data, layoutEndPoint, layoutServerEndPoint);
87
+ if (layoutResponse?.ok === false) return layoutResponse;
88
+ }
89
+ let endPointResponse = await loadClientAndServerData(url, params, serverParams, data, clientEndPoint, serverEndPoint);
90
+ if (endPointResponse?.ok === false) return endPointResponse;
91
+ let $props = { data };
92
+ let component = clientEndPoint.component;
93
+ let slots = void 0;
94
+ if (handler.layouts) {
95
+ let slotFunctions = [];
96
+ slotFunctions[handler.layouts.length] = (_, context) => clientEndPoint.component($props, context);
97
+ for (let i = handler.layouts.length - 1; i >= 0; i--) {
98
+ const layoutEndPoint = (await handler.layouts[i].endPoint())?.default;
99
+ if (layoutEndPoint?.component) if (i === 0) {
100
+ component = layoutEndPoint.component;
101
+ slots = { _: slotFunctions[i + 1] };
102
+ } else slotFunctions[i] = (_, context) => layoutEndPoint.component($props, context, { _: slotFunctions[i + 1] });
103
+ }
104
+ }
105
+ let html;
106
+ try {
107
+ let { body, head } = component($props, void 0, slots);
108
+ html = template.replace("%COMPONENT_BODY%", body).replace("%COMPONENT_HEAD", head);
109
+ } catch (error) {
110
+ html = "<span style=\"color: red\">Script syntax error</span><p>" + error + "</p>";
111
+ console.log(error);
112
+ }
113
+ return new Response(html, {
114
+ status: 200,
115
+ headers: { "Content-Type": "text/html" }
116
+ });
175
117
  }
176
118
  async function runAction(ev, url, handler, params, query) {
177
- const actionName = (Array.from(query.keys())[0] || "default").replace(/^\//, "");
178
- const serverEndPoint = handler.serverEndPoint && (await handler.serverEndPoint()).default;
179
- if (serverEndPoint?.actions) {
180
- const action = serverEndPoint.actions[actionName];
181
- if (action) {
182
- const serverParams = buildServerParams(ev, url, params);
183
- if (handler.serverHook) {
184
- const serverHook = (await handler.serverHook()).default;
185
- if (serverHook?.handle) {
186
- await serverHook.handle(serverParams);
187
- }
188
- }
189
- const result = await action(serverParams);
190
- return result || seeOther(url.pathname);
191
- }
192
- }
193
- return notFound();
119
+ const actionName = (Array.from(query.keys())[0] || "default").replace(/^\//, "");
120
+ const serverEndPoint = handler.serverEndPoint && (await handler.serverEndPoint()).default;
121
+ if (serverEndPoint?.actions) {
122
+ const action = serverEndPoint.actions[actionName];
123
+ if (action) {
124
+ const serverParams = buildServerParams(ev, url, params);
125
+ if (handler.serverHook) {
126
+ const serverHook = (await handler.serverHook()).default;
127
+ if (serverHook?.handle) await serverHook.handle(serverParams);
128
+ }
129
+ return await action(serverParams) || seeOther(url.pathname);
130
+ }
131
+ }
132
+ return notFound();
194
133
  }
195
134
  async function loadClientAndServerData(url, params, serverParams, data, clientEndPoint, serverEndPoint) {
196
- if (clientEndPoint?.load) {
197
- const clientParams = buildClientParams(url, data, params);
198
- const clientResponse = await clientEndPoint.load(clientParams);
199
- if (clientResponse) {
200
- if (clientResponse.ok) {
201
- if (clientResponse.headers.get("Content-Type")?.includes("application/json")) {
202
- Object.assign(data, await clientResponse.json());
203
- }
204
- } else {
205
- return clientResponse;
206
- }
207
- }
208
- }
209
- if (serverEndPoint?.load) {
210
- const serverResponse = await serverEndPoint.load(serverParams);
211
- if (serverResponse) {
212
- if (serverResponse.ok) {
213
- if (serverResponse.headers.get("Content-Type")?.includes("application/json")) {
214
- Object.assign(data, await serverResponse.json());
215
- }
216
- } else {
217
- return serverResponse;
218
- }
219
- }
220
- }
135
+ if (clientEndPoint?.load) {
136
+ const clientParams = buildClientParams(url, data, params);
137
+ const clientResponse = await clientEndPoint.load(clientParams);
138
+ if (clientResponse) if (clientResponse.ok) {
139
+ if (clientResponse.headers.get("Content-Type")?.includes("application/json")) Object.assign(data, await clientResponse.json());
140
+ } else return clientResponse;
141
+ }
142
+ if (serverEndPoint?.load) {
143
+ const serverResponse = await serverEndPoint.load(serverParams);
144
+ if (serverResponse) if (serverResponse.ok) {
145
+ if (serverResponse.headers.get("Content-Type")?.includes("application/json")) Object.assign(data, await serverResponse.json());
146
+ } else return serverResponse;
147
+ }
221
148
  }
222
149
  function buildClientParams(url, params, data) {
223
- return {
224
- url,
225
- params,
226
- data
227
- };
150
+ return {
151
+ url,
152
+ params,
153
+ data
154
+ };
228
155
  }
229
156
  function buildServerParams(ev, url, params) {
230
- return {
231
- url,
232
- params,
233
- appData: {},
234
- request: ev.request,
235
- cookies: ev.cookies,
236
- headers: ev.headers,
237
- adapter: ev.adapter
238
- };
157
+ return {
158
+ url,
159
+ params,
160
+ appData: {},
161
+ request: ev.request,
162
+ cookies: ev.cookies,
163
+ headers: ev.headers,
164
+ adapter: ev.adapter
165
+ };
239
166
  }
240
- export {
241
- runTest
242
- };
167
+
168
+ //#endregion
169
+ export { runTest };
243
170
  //# sourceMappingURL=test.js.map
package/dist/test.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/test/runTest.ts"],"sourcesContent":["import { type ServerComponent, type ServerSlotRender } from \"@torpor/view\";\nimport path from \"node:path\";\nimport notFound from \"../response/notFound.ts\";\nimport ok from \"../response/ok.ts\";\nimport seeOther from \"../response/seeOther.ts\";\nimport ServerEvent from \"../server/ServerEvent.ts\";\nimport Router from \"../site/Router.ts\";\nimport Site from \"../site/Site\";\nimport $page from \"../state/$page.ts\";\nimport type PageEndPoint from \"../types/PageEndPoint.ts\";\nimport type PageServerEndPoint from \"../types/PageServerEndPoint.ts\";\nimport RouteHandler from \"../types/RouteHandler.ts\";\nimport {\n\tHOOK_ROUTE,\n\tHOOK_SERVER_ROUTE,\n\tLAYOUT_ROUTE,\n\tLAYOUT_SERVER_ROUTE,\n\tPAGE_ROUTE,\n\tPAGE_SERVER_ROUTE,\n\tSERVER_ROUTE,\n} from \"../types/RouteType\";\nimport type ServerEndPoint from \"../types/ServerEndPoint.ts\";\nimport type ServerHook from \"../types/ServerHook.ts\";\nimport type ServerLoadEvent from \"../types/ServerLoadEvent.ts\";\n\n/**\n * Runs a site route in test mode\n * @param site The site configuration, with routing configured\n * @param route The route path e.g. `/home`\n * @param ev An optional ServerEvent, which you can use to set test cookies and headers\n * @returns An HTTP response containing the requested data, HTML, or error status\n */\nexport default async function runTest(\n\tsite: Site,\n\troute: string,\n\tev?: ServerEvent,\n): Promise<Response> {\n\tif (!route.startsWith(\"/\")) route += \"/\";\n\tif (!ev) {\n\t\tconst req = new Request(`http://localhost${route}`);\n\t\tev = new ServerEvent(req);\n\t}\n\n\t// Build the router from the Site object created by the user\n\tconst router = new Router();\n\trouter.addPages(\n\t\tsite.routes.map((r) => ({\n\t\t\tpath: r.path,\n\t\t\ttype: r.type,\n\t\t\tendPoint: () => import(/* @vite-ignore */ path.join(site.root, r.file)),\n\t\t})),\n\t);\n\n\treturn await load(router, ev, \"%COMPONENT_BODY%\");\n}\n\n// HACK: This is a copy of serverEntry\n// TODO: Make it shared instead!\nasync function load(router: Router, ev: ServerEvent, template: string): Promise<Response> {\n\t//const url = new URL(`http://${process.env.HOST ?? \"localhost\"}${ev.request.url}`);\n\tconst url = new URL(ev.request.url);\n\tconst path = url.pathname;\n\tconst query = url.searchParams;\n\n\t//console.log(`handling ${ev.request.method} for '${path}'${query.size ? ` with ${query}` : \"\"}`);\n\n\tconst route = router.match(path, query);\n\tif (!route) {\n\t\treturn notFound();\n\t}\n\n\t// Update $page before building the components\n\t// TODO: Find somewhere better to put this\n\t$page.url = url;\n\n\tconst handler = route.handler;\n\tconst params = route.params || {};\n\n\t// TODO: Hit the server hook out here\n\t// We could maybe set data loading up as middleware on a route??????\n\n\tswitch (handler.type) {\n\t\tcase PAGE_ROUTE:\n\t\tcase LAYOUT_ROUTE: {\n\t\t\t// It's a /+page.ts or /_layout.ts endpoint\n\t\t\tif (ev.request.method === \"GET\") {\n\t\t\t\treturn await loadView(ev, url, handler, params, template);\n\t\t\t} else if (ev.request.method === \"POST\") {\n\t\t\t\treturn await runAction(ev, url, handler, params, query);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase PAGE_SERVER_ROUTE:\n\t\tcase LAYOUT_SERVER_ROUTE: {\n\t\t\t// It's a /+page.server.ts or /_layout.server.ts endpoint\n\t\t\tif (ev.request.method === \"GET\") {\n\t\t\t\treturn await loadData(ev, url, handler, \"load\", params);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase SERVER_ROUTE: {\n\t\t\t// It's a /+server.ts endpoint\n\t\t\tconst functionName = ev.request.method.toLowerCase().replace(\"delete\", \"del\");\n\t\t\treturn await loadData(ev, url, handler, functionName, params);\n\t\t}\n\t\tcase HOOK_ROUTE:\n\t\tcase HOOK_SERVER_ROUTE: {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn notFound();\n}\n\nasync function loadData(\n\tev: ServerEvent,\n\turl: URL,\n\thandler: RouteHandler,\n\tfunctionName: string,\n\tparams: Record<string, string>,\n) {\n\tconst serverEndPoint: ServerEndPoint | undefined = (await handler.endPoint()).default;\n\tif (serverEndPoint && serverEndPoint[functionName]) {\n\t\tconst serverParams = buildServerParams(ev, url, params);\n\n\t\tif (handler.serverHook) {\n\t\t\tconst serverHook: ServerHook | undefined = (await handler.serverHook()).default;\n\t\t\tif (serverHook?.handle) {\n\t\t\t\tawait serverHook.handle(serverParams);\n\t\t\t}\n\t\t}\n\n\t\tconst result = await serverEndPoint[functionName](serverParams);\n\n\t\t// If there was no response returned from load (such as errors or a\n\t\t// redirect), send an ok response\n\t\treturn result || ok();\n\t}\n\n\treturn notFound();\n}\n\nasync function loadView(\n\tev: ServerEvent,\n\turl: URL,\n\thandler: RouteHandler,\n\tparams: Record<string, string>,\n\ttemplate: string,\n) {\n\t// There must be a client endpoint with a component\n\tconst clientEndPoint: PageEndPoint | undefined = (await handler.endPoint()).default;\n\tif (!clientEndPoint?.component) {\n\t\treturn notFound();\n\t}\n\n\t// There may be a server endpoint\n\tconst serverEndPoint: PageServerEndPoint | undefined =\n\t\thandler.serverEndPoint && (await handler.serverEndPoint())?.default;\n\n\t// Maybe hit the server hook\n\tconst serverParams = buildServerParams(ev, url, params);\n\tif (handler.serverHook) {\n\t\tconst serverHook: ServerHook | undefined = (await handler.serverHook()).default;\n\t\tif (serverHook?.handle) {\n\t\t\tawait serverHook.handle(serverParams);\n\t\t}\n\t}\n\n\t// Pass the data into $props\n\t// TODO: Promise.all\n\t// NOTE: We're loading data from top to bottom, overriding as we go, and I'm not sure if this is the best way to go\n\tlet data = {};\n\tif (handler.layouts) {\n\t\tfor (let layout of handler.layouts) {\n\t\t\tconst layoutEndPoint: PageEndPoint | undefined = (await layout.endPoint())?.default;\n\t\t\tconst layoutServerEndPoint: PageServerEndPoint | undefined =\n\t\t\t\tlayout.serverEndPoint && (await layout.serverEndPoint())?.default;\n\t\t\tconst layoutResponse = await loadClientAndServerData(\n\t\t\t\turl,\n\t\t\t\tparams,\n\t\t\t\tserverParams,\n\t\t\t\tdata,\n\t\t\t\tlayoutEndPoint,\n\t\t\t\tlayoutServerEndPoint,\n\t\t\t);\n\t\t\tif (layoutResponse?.ok === false) {\n\t\t\t\treturn layoutResponse;\n\t\t\t}\n\t\t}\n\t}\n\tlet endPointResponse = await loadClientAndServerData(\n\t\turl,\n\t\tparams,\n\t\tserverParams,\n\t\tdata,\n\t\tclientEndPoint,\n\t\tserverEndPoint,\n\t);\n\tif (endPointResponse?.ok === false) {\n\t\treturn endPointResponse;\n\t}\n\tlet $props: Record<string, any> = { data };\n\n\t// If there are layouts, work our way upwards, pushing each component into\n\t// the default slot of its parent\n\t// TODO: Also handle layout server data\n\t// TODO: There's probably a nicer way to do this with reducers or something\n\t// TODO: Re-use parent layouts\n\tlet component = clientEndPoint.component as ServerComponent;\n\tlet slots: Record<string, ServerSlotRender> | undefined = undefined;\n\tif (handler.layouts) {\n\t\tlet slotFunctions: ServerSlotRender[] = [];\n\t\tslotFunctions[handler.layouts.length] = (_, context) =>\n\t\t\t(clientEndPoint.component as ServerComponent)($props, context);\n\t\tfor (let i = handler.layouts.length - 1; i >= 0; i--) {\n\t\t\tconst layoutEndPoint: PageEndPoint | undefined = (await handler.layouts[i].endPoint())\n\t\t\t\t?.default;\n\t\t\tif (layoutEndPoint?.component) {\n\t\t\t\tif (i === 0) {\n\t\t\t\t\tcomponent = layoutEndPoint.component as ServerComponent;\n\t\t\t\t\tslots = { _: slotFunctions[i + 1] };\n\t\t\t\t} else {\n\t\t\t\t\tslotFunctions[i] = (_, context) =>\n\t\t\t\t\t\t(layoutEndPoint.component as ServerComponent)($props, context, {\n\t\t\t\t\t\t\t_: slotFunctions[i + 1],\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tlet html;\n\ttry {\n\t\tlet { body, head } = component($props, undefined, slots);\n\t\thtml = template.replace(\"%COMPONENT_BODY%\", body).replace(\"%COMPONENT_HEAD\", head);\n\t} catch (error) {\n\t\t// TODO: Show a proper Error component\n\t\thtml = '<span style=\"color: red\">Script syntax error</span><p>' + error + \"</p>\";\n\t\tconsole.log(error);\n\t}\n\n\treturn new Response(html, {\n\t\tstatus: 200,\n\t\theaders: {\n\t\t\t\"Content-Type\": \"text/html\",\n\t\t},\n\t});\n}\n\nasync function runAction(\n\tev: ServerEvent,\n\turl: URL,\n\thandler: RouteHandler,\n\tparams: Record<string, string>,\n\tquery: URLSearchParams,\n) {\n\tconst actionName = (Array.from(query.keys())[0] || \"default\").replace(/^\\//, \"\");\n\tconst serverEndPoint: PageServerEndPoint | undefined =\n\t\thandler.serverEndPoint && (await handler.serverEndPoint()).default;\n\tif (serverEndPoint?.actions) {\n\t\tconst action = serverEndPoint.actions[actionName];\n\t\tif (action) {\n\t\t\t// TODO: form.errors etc\n\t\t\tconst serverParams = buildServerParams(ev, url, params);\n\n\t\t\tif (handler.serverHook) {\n\t\t\t\tconst serverHook: ServerHook | undefined = (await handler.serverHook()).default;\n\t\t\t\tif (serverHook?.handle) {\n\t\t\t\t\tawait serverHook.handle(serverParams);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst result = await action(serverParams); // <--\n\n\t\t\t// If there was no response returned from the action (such as errors\n\t\t\t// or a redirect), reload the page by redirecting\n\t\t\treturn result || seeOther(url.pathname);\n\t\t}\n\t}\n\n\treturn notFound();\n}\n\nasync function loadClientAndServerData(\n\turl: URL,\n\tparams: Record<string, string>,\n\tserverParams: ServerLoadEvent,\n\tdata: Record<string, any>,\n\tclientEndPoint?: PageEndPoint,\n\tserverEndPoint?: PageServerEndPoint,\n) {\n\tif (clientEndPoint?.load) {\n\t\tconst clientParams = buildClientParams(url, data, params);\n\t\tconst clientResponse = await clientEndPoint.load(clientParams);\n\t\tif (clientResponse) {\n\t\t\tif (clientResponse.ok) {\n\t\t\t\tif (clientResponse.headers.get(\"Content-Type\")?.includes(\"application/json\")) {\n\t\t\t\t\tObject.assign(data, await clientResponse.json());\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn clientResponse;\n\t\t\t}\n\t\t}\n\t}\n\tif (serverEndPoint?.load) {\n\t\tconst serverResponse = await serverEndPoint.load(serverParams);\n\t\tif (serverResponse) {\n\t\t\tif (serverResponse.ok) {\n\t\t\t\tif (serverResponse.headers.get(\"Content-Type\")?.includes(\"application/json\")) {\n\t\t\t\t\tObject.assign(data, await serverResponse.json());\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn serverResponse;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction buildClientParams(url: URL, params: Record<string, string>, data: Record<string, any>) {\n\treturn {\n\t\turl,\n\t\tparams,\n\t\tdata,\n\t};\n}\n\nfunction buildServerParams(\n\tev: ServerEvent,\n\turl: URL,\n\tparams: Record<string, string>,\n): ServerLoadEvent {\n\treturn {\n\t\turl,\n\t\tparams,\n\t\tappData: {},\n\t\trequest: ev.request,\n\t\tcookies: ev.cookies,\n\t\theaders: ev.headers,\n\t\tadapter: ev.adapter,\n\t};\n}\n"],"mappings":"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","names":["path"]}
1
+ {"version":3,"file":"test.js","names":["path","serverEndPoint: ServerEndPoint | undefined","serverHook: ServerHook | undefined","clientEndPoint: PageEndPoint | undefined","serverEndPoint: PageServerEndPoint | undefined","layoutEndPoint: PageEndPoint | undefined","layoutServerEndPoint: PageServerEndPoint | undefined","$props: Record<string, any>","slots: Record<string, ServerSlotRender> | undefined","slotFunctions: ServerSlotRender[]"],"sources":["../src/test/runTest.ts"],"sourcesContent":["import { type ServerComponent, type ServerSlotRender } from \"@torpor/view\";\nimport path from \"node:path\";\nimport notFound from \"../response/notFound.ts\";\nimport ok from \"../response/ok.ts\";\nimport seeOther from \"../response/seeOther.ts\";\nimport ServerEvent from \"../server/ServerEvent.ts\";\nimport Router from \"../site/Router.ts\";\nimport Site from \"../site/Site\";\nimport $page from \"../state/$page.ts\";\nimport type PageEndPoint from \"../types/PageEndPoint.ts\";\nimport type PageServerEndPoint from \"../types/PageServerEndPoint.ts\";\nimport type RouteHandler from \"../types/RouteHandler.ts\";\nimport {\n\tHOOK_ROUTE,\n\tHOOK_SERVER_ROUTE,\n\tLAYOUT_ROUTE,\n\tLAYOUT_SERVER_ROUTE,\n\tPAGE_ROUTE,\n\tPAGE_SERVER_ROUTE,\n\tSERVER_ROUTE,\n} from \"../types/RouteType\";\nimport type ServerEndPoint from \"../types/ServerEndPoint.ts\";\nimport type ServerHook from \"../types/ServerHook.ts\";\nimport type ServerLoadEvent from \"../types/ServerLoadEvent.ts\";\n\n/**\n * Runs a site route in test mode\n * @param site The site configuration, with routing configured\n * @param route The route path e.g. `/home`\n * @param ev An optional ServerEvent, which you can use to set test cookies and headers\n * @returns An HTTP response containing the requested data, HTML, or error status\n */\nexport default async function runTest(\n\tsite: Site,\n\troute: string,\n\tev?: ServerEvent,\n): Promise<Response> {\n\tif (!route.startsWith(\"/\")) route += \"/\";\n\tif (!ev) {\n\t\tconst req = new Request(`http://localhost${route}`);\n\t\tev = new ServerEvent(req);\n\t}\n\n\t// Build the router from the Site object created by the user\n\tconst router = new Router();\n\trouter.addPages(\n\t\tsite.routes.map((r) => ({\n\t\t\tpath: r.path,\n\t\t\ttype: r.type,\n\t\t\tendPoint: () => import(/* @vite-ignore */ path.join(site.root, r.file)),\n\t\t})),\n\t);\n\n\treturn await load(router, ev, \"%COMPONENT_BODY%\");\n}\n\n// HACK: This is a copy of serverEntry\n// TODO: Make it shared instead!\nasync function load(router: Router, ev: ServerEvent, template: string): Promise<Response> {\n\t//const url = new URL(`http://${process.env.HOST ?? \"localhost\"}${ev.request.url}`);\n\tconst url = new URL(ev.request.url);\n\tconst path = url.pathname;\n\tconst query = url.searchParams;\n\n\t//console.log(`handling ${ev.request.method} for '${path}'${query.size ? ` with ${query}` : \"\"}`);\n\n\tconst route = router.match(path, query);\n\tif (!route) {\n\t\treturn notFound();\n\t}\n\n\t// Update $page before building the components\n\t// TODO: Find somewhere better to put this\n\t$page.url = url;\n\n\tconst handler = route.handler;\n\tconst params = route.params || {};\n\n\t// TODO: Hit the server hook out here\n\t// We could maybe set data loading up as middleware on a route??????\n\n\tswitch (handler.type) {\n\t\tcase PAGE_ROUTE:\n\t\tcase LAYOUT_ROUTE: {\n\t\t\t// It's a /+page.ts or /_layout.ts endpoint\n\t\t\tif (ev.request.method === \"GET\") {\n\t\t\t\treturn await loadView(ev, url, handler, params, template);\n\t\t\t} else if (ev.request.method === \"POST\") {\n\t\t\t\treturn await runAction(ev, url, handler, params, query);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase PAGE_SERVER_ROUTE:\n\t\tcase LAYOUT_SERVER_ROUTE: {\n\t\t\t// It's a /+page.server.ts or /_layout.server.ts endpoint\n\t\t\tif (ev.request.method === \"GET\") {\n\t\t\t\treturn await loadData(ev, url, handler, \"load\", params);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase SERVER_ROUTE: {\n\t\t\t// It's a /+server.ts endpoint\n\t\t\tconst functionName = ev.request.method.toLowerCase().replace(\"delete\", \"del\");\n\t\t\treturn await loadData(ev, url, handler, functionName, params);\n\t\t}\n\t\tcase HOOK_ROUTE:\n\t\tcase HOOK_SERVER_ROUTE: {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn notFound();\n}\n\nasync function loadData(\n\tev: ServerEvent,\n\turl: URL,\n\thandler: RouteHandler,\n\tfunctionName: string,\n\tparams: Record<string, string>,\n) {\n\tconst serverEndPoint: ServerEndPoint | undefined = (await handler.endPoint()).default;\n\tif (serverEndPoint && serverEndPoint[functionName]) {\n\t\tconst serverParams = buildServerParams(ev, url, params);\n\n\t\tif (handler.serverHook) {\n\t\t\tconst serverHook: ServerHook | undefined = (await handler.serverHook()).default;\n\t\t\tif (serverHook?.handle) {\n\t\t\t\tawait serverHook.handle(serverParams);\n\t\t\t}\n\t\t}\n\n\t\tconst result = await serverEndPoint[functionName](serverParams);\n\n\t\t// If there was no response returned from load (such as errors or a\n\t\t// redirect), send an ok response\n\t\treturn result || ok();\n\t}\n\n\treturn notFound();\n}\n\nasync function loadView(\n\tev: ServerEvent,\n\turl: URL,\n\thandler: RouteHandler,\n\tparams: Record<string, string>,\n\ttemplate: string,\n) {\n\t// There must be a client endpoint with a component\n\tconst clientEndPoint: PageEndPoint | undefined = (await handler.endPoint()).default;\n\tif (!clientEndPoint?.component) {\n\t\treturn notFound();\n\t}\n\n\t// There may be a server endpoint\n\tconst serverEndPoint: PageServerEndPoint | undefined =\n\t\thandler.serverEndPoint && (await handler.serverEndPoint())?.default;\n\n\t// Maybe hit the server hook\n\tconst serverParams = buildServerParams(ev, url, params);\n\tif (handler.serverHook) {\n\t\tconst serverHook: ServerHook | undefined = (await handler.serverHook()).default;\n\t\tif (serverHook?.handle) {\n\t\t\tawait serverHook.handle(serverParams);\n\t\t}\n\t}\n\n\t// Pass the data into $props\n\t// TODO: Promise.all\n\t// NOTE: We're loading data from top to bottom, overriding as we go, and I'm not sure if this is the best way to go\n\tlet data = {};\n\tif (handler.layouts) {\n\t\tfor (let layout of handler.layouts) {\n\t\t\tconst layoutEndPoint: PageEndPoint | undefined = (await layout.endPoint())?.default;\n\t\t\tconst layoutServerEndPoint: PageServerEndPoint | undefined =\n\t\t\t\tlayout.serverEndPoint && (await layout.serverEndPoint())?.default;\n\t\t\tconst layoutResponse = await loadClientAndServerData(\n\t\t\t\turl,\n\t\t\t\tparams,\n\t\t\t\tserverParams,\n\t\t\t\tdata,\n\t\t\t\tlayoutEndPoint,\n\t\t\t\tlayoutServerEndPoint,\n\t\t\t);\n\t\t\tif (layoutResponse?.ok === false) {\n\t\t\t\treturn layoutResponse;\n\t\t\t}\n\t\t}\n\t}\n\tlet endPointResponse = await loadClientAndServerData(\n\t\turl,\n\t\tparams,\n\t\tserverParams,\n\t\tdata,\n\t\tclientEndPoint,\n\t\tserverEndPoint,\n\t);\n\tif (endPointResponse?.ok === false) {\n\t\treturn endPointResponse;\n\t}\n\tlet $props: Record<string, any> = { data };\n\n\t// If there are layouts, work our way upwards, pushing each component into\n\t// the default slot of its parent\n\t// TODO: Also handle layout server data\n\t// TODO: There's probably a nicer way to do this with reducers or something\n\t// TODO: Re-use parent layouts\n\tlet component = clientEndPoint.component as ServerComponent;\n\tlet slots: Record<string, ServerSlotRender> | undefined = undefined;\n\tif (handler.layouts) {\n\t\tlet slotFunctions: ServerSlotRender[] = [];\n\t\tslotFunctions[handler.layouts.length] = (_, context) =>\n\t\t\t(clientEndPoint.component as ServerComponent)($props, context);\n\t\tfor (let i = handler.layouts.length - 1; i >= 0; i--) {\n\t\t\tconst layoutEndPoint: PageEndPoint | undefined = (await handler.layouts[i].endPoint())\n\t\t\t\t?.default;\n\t\t\tif (layoutEndPoint?.component) {\n\t\t\t\tif (i === 0) {\n\t\t\t\t\tcomponent = layoutEndPoint.component as ServerComponent;\n\t\t\t\t\tslots = { _: slotFunctions[i + 1] };\n\t\t\t\t} else {\n\t\t\t\t\tslotFunctions[i] = (_, context) =>\n\t\t\t\t\t\t(layoutEndPoint.component as ServerComponent)($props, context, {\n\t\t\t\t\t\t\t_: slotFunctions[i + 1],\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tlet html;\n\ttry {\n\t\tlet { body, head } = component($props, undefined, slots);\n\t\thtml = template.replace(\"%COMPONENT_BODY%\", body).replace(\"%COMPONENT_HEAD\", head);\n\t} catch (error) {\n\t\t// TODO: Show a proper Error component\n\t\thtml = '<span style=\"color: red\">Script syntax error</span><p>' + error + \"</p>\";\n\t\tconsole.log(error);\n\t}\n\n\treturn new Response(html, {\n\t\tstatus: 200,\n\t\theaders: {\n\t\t\t\"Content-Type\": \"text/html\",\n\t\t},\n\t});\n}\n\nasync function runAction(\n\tev: ServerEvent,\n\turl: URL,\n\thandler: RouteHandler,\n\tparams: Record<string, string>,\n\tquery: URLSearchParams,\n) {\n\tconst actionName = (Array.from(query.keys())[0] || \"default\").replace(/^\\//, \"\");\n\tconst serverEndPoint: PageServerEndPoint | undefined =\n\t\thandler.serverEndPoint && (await handler.serverEndPoint()).default;\n\tif (serverEndPoint?.actions) {\n\t\tconst action = serverEndPoint.actions[actionName];\n\t\tif (action) {\n\t\t\t// TODO: form.errors etc\n\t\t\tconst serverParams = buildServerParams(ev, url, params);\n\n\t\t\tif (handler.serverHook) {\n\t\t\t\tconst serverHook: ServerHook | undefined = (await handler.serverHook()).default;\n\t\t\t\tif (serverHook?.handle) {\n\t\t\t\t\tawait serverHook.handle(serverParams);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst result = await action(serverParams); // <--\n\n\t\t\t// If there was no response returned from the action (such as errors\n\t\t\t// or a redirect), reload the page by redirecting\n\t\t\treturn result || seeOther(url.pathname);\n\t\t}\n\t}\n\n\treturn notFound();\n}\n\nasync function loadClientAndServerData(\n\turl: URL,\n\tparams: Record<string, string>,\n\tserverParams: ServerLoadEvent,\n\tdata: Record<string, any>,\n\tclientEndPoint?: PageEndPoint,\n\tserverEndPoint?: PageServerEndPoint,\n) {\n\tif (clientEndPoint?.load) {\n\t\tconst clientParams = buildClientParams(url, data, params);\n\t\tconst clientResponse = await clientEndPoint.load(clientParams);\n\t\tif (clientResponse) {\n\t\t\tif (clientResponse.ok) {\n\t\t\t\tif (clientResponse.headers.get(\"Content-Type\")?.includes(\"application/json\")) {\n\t\t\t\t\tObject.assign(data, await clientResponse.json());\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn clientResponse;\n\t\t\t}\n\t\t}\n\t}\n\tif (serverEndPoint?.load) {\n\t\tconst serverResponse = await serverEndPoint.load(serverParams);\n\t\tif (serverResponse) {\n\t\t\tif (serverResponse.ok) {\n\t\t\t\tif (serverResponse.headers.get(\"Content-Type\")?.includes(\"application/json\")) {\n\t\t\t\t\tObject.assign(data, await serverResponse.json());\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn serverResponse;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction buildClientParams(url: URL, params: Record<string, string>, data: Record<string, any>) {\n\treturn {\n\t\turl,\n\t\tparams,\n\t\tdata,\n\t};\n}\n\nfunction buildServerParams(\n\tev: ServerEvent,\n\turl: URL,\n\tparams: Record<string, string>,\n): ServerLoadEvent {\n\treturn {\n\t\turl,\n\t\tparams,\n\t\tappData: {},\n\t\trequest: ev.request,\n\t\tcookies: ev.cookies,\n\t\theaders: ev.headers,\n\t\tadapter: ev.adapter,\n\t};\n}\n"],"mappings":";;;;;;;;;;;;;;;AAgCA,eAA8B,QAC7B,MACA,OACA,IACoB;AACpB,KAAI,CAAC,MAAM,WAAW,IAAI,CAAE,UAAS;AACrC,KAAI,CAAC,IAAI;EACR,MAAM,MAAM,IAAI,QAAQ,mBAAmB,QAAQ;AACnD,OAAK,IAAI,YAAY,IAAI;;CAI1B,MAAM,SAAS,IAAI,QAAQ;AAC3B,QAAO,SACN,KAAK,OAAO,KAAK,OAAO;EACvB,MAAM,EAAE;EACR,MAAM,EAAE;EACR,gBAAgB;;GAA0B,KAAK,KAAK,KAAK,MAAM,EAAE,KAAK;;EACtE,EAAE,CACH;AAED,QAAO,MAAM,KAAK,QAAQ,IAAI,mBAAmB;;AAKlD,eAAe,KAAK,QAAgB,IAAiB,UAAqC;CAEzF,MAAM,MAAM,IAAI,IAAI,GAAG,QAAQ,IAAI;CACnC,MAAMA,SAAO,IAAI;CACjB,MAAM,QAAQ,IAAI;CAIlB,MAAM,QAAQ,OAAO,MAAMA,QAAM,MAAM;AACvC,KAAI,CAAC,MACJ,QAAO,UAAU;AAKlB,eAAM,MAAM;CAEZ,MAAM,UAAU,MAAM;CACtB,MAAM,SAAS,MAAM,UAAU,EAAE;AAKjC,SAAQ,QAAQ,MAAhB;EACC,KAAK;EACL,KAAK;AAEJ,OAAI,GAAG,QAAQ,WAAW,MACzB,QAAO,MAAM,SAAS,IAAI,KAAK,SAAS,QAAQ,SAAS;YAC/C,GAAG,QAAQ,WAAW,OAChC,QAAO,MAAM,UAAU,IAAI,KAAK,SAAS,QAAQ,MAAM;AAExD;EAED,KAAK;EACL,KAAK;AAEJ,OAAI,GAAG,QAAQ,WAAW,MACzB,QAAO,MAAM,SAAS,IAAI,KAAK,SAAS,QAAQ,OAAO;AAExD;EAED,KAAK,cAAc;GAElB,MAAM,eAAe,GAAG,QAAQ,OAAO,aAAa,CAAC,QAAQ,UAAU,MAAM;AAC7E,UAAO,MAAM,SAAS,IAAI,KAAK,SAAS,cAAc,OAAO;;EAE9D,KAAK;EACL,KAAK,kBACJ;;AAIF,QAAO,UAAU;;AAGlB,eAAe,SACd,IACA,KACA,SACA,cACA,QACC;CACD,MAAMC,kBAA8C,MAAM,QAAQ,UAAU,EAAE;AAC9E,KAAI,kBAAkB,eAAe,eAAe;EACnD,MAAM,eAAe,kBAAkB,IAAI,KAAK,OAAO;AAEvD,MAAI,QAAQ,YAAY;GACvB,MAAMC,cAAsC,MAAM,QAAQ,YAAY,EAAE;AACxE,OAAI,YAAY,OACf,OAAM,WAAW,OAAO,aAAa;;AAQvC,SAJe,MAAM,eAAe,cAAc,aAAa,IAI9C,IAAI;;AAGtB,QAAO,UAAU;;AAGlB,eAAe,SACd,IACA,KACA,SACA,QACA,UACC;CAED,MAAMC,kBAA4C,MAAM,QAAQ,UAAU,EAAE;AAC5E,KAAI,CAAC,gBAAgB,UACpB,QAAO,UAAU;CAIlB,MAAMC,iBACL,QAAQ,mBAAmB,MAAM,QAAQ,gBAAgB,GAAG;CAG7D,MAAM,eAAe,kBAAkB,IAAI,KAAK,OAAO;AACvD,KAAI,QAAQ,YAAY;EACvB,MAAMF,cAAsC,MAAM,QAAQ,YAAY,EAAE;AACxE,MAAI,YAAY,OACf,OAAM,WAAW,OAAO,aAAa;;CAOvC,IAAI,OAAO,EAAE;AACb,KAAI,QAAQ,QACX,MAAK,IAAI,UAAU,QAAQ,SAAS;EACnC,MAAMG,kBAA4C,MAAM,OAAO,UAAU,GAAG;EAC5E,MAAMC,uBACL,OAAO,mBAAmB,MAAM,OAAO,gBAAgB,GAAG;EAC3D,MAAM,iBAAiB,MAAM,wBAC5B,KACA,QACA,cACA,MACA,gBACA,qBACA;AACD,MAAI,gBAAgB,OAAO,MAC1B,QAAO;;CAIV,IAAI,mBAAmB,MAAM,wBAC5B,KACA,QACA,cACA,MACA,gBACA,eACA;AACD,KAAI,kBAAkB,OAAO,MAC5B,QAAO;CAER,IAAIC,SAA8B,EAAE,MAAM;CAO1C,IAAI,YAAY,eAAe;CAC/B,IAAIC,QAAsD;AAC1D,KAAI,QAAQ,SAAS;EACpB,IAAIC,gBAAoC,EAAE;AAC1C,gBAAc,QAAQ,QAAQ,WAAW,GAAG,YAC1C,eAAe,UAA8B,QAAQ,QAAQ;AAC/D,OAAK,IAAI,IAAI,QAAQ,QAAQ,SAAS,GAAG,KAAK,GAAG,KAAK;GACrD,MAAMJ,kBAA4C,MAAM,QAAQ,QAAQ,GAAG,UAAU,GAClF;AACH,OAAI,gBAAgB,UACnB,KAAI,MAAM,GAAG;AACZ,gBAAY,eAAe;AAC3B,YAAQ,EAAE,GAAG,cAAc,IAAI,IAAI;SAEnC,eAAc,MAAM,GAAG,YACrB,eAAe,UAA8B,QAAQ,SAAS,EAC9D,GAAG,cAAc,IAAI,IACrB,CAAC;;;CAMP,IAAI;AACJ,KAAI;EACH,IAAI,EAAE,MAAM,SAAS,UAAU,QAAQ,QAAW,MAAM;AACxD,SAAO,SAAS,QAAQ,oBAAoB,KAAK,CAAC,QAAQ,mBAAmB,KAAK;UAC1E,OAAO;AAEf,SAAO,6DAA2D,QAAQ;AAC1E,UAAQ,IAAI,MAAM;;AAGnB,QAAO,IAAI,SAAS,MAAM;EACzB,QAAQ;EACR,SAAS,EACR,gBAAgB,aAChB;EACD,CAAC;;AAGH,eAAe,UACd,IACA,KACA,SACA,QACA,OACC;CACD,MAAM,cAAc,MAAM,KAAK,MAAM,MAAM,CAAC,CAAC,MAAM,WAAW,QAAQ,OAAO,GAAG;CAChF,MAAMD,iBACL,QAAQ,mBAAmB,MAAM,QAAQ,gBAAgB,EAAE;AAC5D,KAAI,gBAAgB,SAAS;EAC5B,MAAM,SAAS,eAAe,QAAQ;AACtC,MAAI,QAAQ;GAEX,MAAM,eAAe,kBAAkB,IAAI,KAAK,OAAO;AAEvD,OAAI,QAAQ,YAAY;IACvB,MAAMF,cAAsC,MAAM,QAAQ,YAAY,EAAE;AACxE,QAAI,YAAY,OACf,OAAM,WAAW,OAAO,aAAa;;AAQvC,UAJe,MAAM,OAAO,aAAa,IAIxB,SAAS,IAAI,SAAS;;;AAIzC,QAAO,UAAU;;AAGlB,eAAe,wBACd,KACA,QACA,cACA,MACA,gBACA,gBACC;AACD,KAAI,gBAAgB,MAAM;EACzB,MAAM,eAAe,kBAAkB,KAAK,MAAM,OAAO;EACzD,MAAM,iBAAiB,MAAM,eAAe,KAAK,aAAa;AAC9D,MAAI,eACH,KAAI,eAAe,IAClB;OAAI,eAAe,QAAQ,IAAI,eAAe,EAAE,SAAS,mBAAmB,CAC3E,QAAO,OAAO,MAAM,MAAM,eAAe,MAAM,CAAC;QAGjD,QAAO;;AAIV,KAAI,gBAAgB,MAAM;EACzB,MAAM,iBAAiB,MAAM,eAAe,KAAK,aAAa;AAC9D,MAAI,eACH,KAAI,eAAe,IAClB;OAAI,eAAe,QAAQ,IAAI,eAAe,EAAE,SAAS,mBAAmB,CAC3E,QAAO,OAAO,MAAM,MAAM,eAAe,MAAM,CAAC;QAGjD,QAAO;;;AAMX,SAAS,kBAAkB,KAAU,QAAgC,MAA2B;AAC/F,QAAO;EACN;EACA;EACA;EACA;;AAGF,SAAS,kBACR,IACA,KACA,QACkB;AAClB,QAAO;EACN;EACA;EACA,SAAS,EAAE;EACX,SAAS,GAAG;EACZ,SAAS,GAAG;EACZ,SAAS,GAAG;EACZ,SAAS,GAAG;EACZ"}
package/package.json CHANGED
@@ -1,41 +1,36 @@
1
1
  {
2
2
  "name": "@torpor/build",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "description": "A framework for building sites and apps with Torpor",
5
5
  "type": "module",
6
- "main": "dist/index.cjs",
7
- "module": "dist/index.js",
8
- "types": "dist/index.d.ts",
9
6
  "exports": {
10
7
  ".": {
11
8
  "types": "./dist/index.d.ts",
12
- "import": "./dist/index.js",
13
- "require": "./dist/index.cjs"
9
+ "import": "./dist/index.js"
10
+ },
11
+ "./nav": {
12
+ "types": "./dist/nav.d.ts",
13
+ "import": "./dist/nav.js"
14
14
  },
15
15
  "./response": {
16
16
  "types": "./dist/response.d.ts",
17
- "import": "./dist/response.js",
18
- "require": "./dist/response.cjs"
19
- },
20
- "./state": {
21
- "types": "./dist/state.d.ts",
22
- "import": "./dist/state.js",
23
- "require": "./dist/state.cjs"
17
+ "import": "./dist/response.js"
24
18
  },
25
19
  "./run": {
26
20
  "types": "./dist/run.d.ts",
27
- "import": "./dist/run.js",
28
- "require": "./dist/run.cjs"
21
+ "import": "./dist/run.js"
29
22
  },
30
23
  "./server": {
31
24
  "types": "./dist/server.d.ts",
32
- "import": "./dist/server.js",
33
- "require": "./dist/server.cjs"
25
+ "import": "./dist/server.js"
26
+ },
27
+ "./state": {
28
+ "types": "./dist/state.d.ts",
29
+ "import": "./dist/state.js"
34
30
  },
35
31
  "./test": {
36
32
  "types": "./dist/test.d.ts",
37
- "import": "./dist/test.js",
38
- "require": "./dist/test.cjs"
33
+ "import": "./dist/test.js"
39
34
  },
40
35
  "./manifest": {
41
36
  "types": "./src/types/manifest.d.ts"
@@ -52,23 +47,24 @@
52
47
  "license": "ISC",
53
48
  "dependencies": {
54
49
  "cookie": "^1.0.2",
55
- "dotenv": "^17.2.1",
56
- "vite": "^7.1.1",
50
+ "dotenv": "^17.2.3",
51
+ "vite": "^7.1.9",
57
52
  "vite-tsconfig-paths": "^5.1.4",
58
- "@torpor/view": "^0.2.0",
59
- "@torpor/unplugin": "^0.1.17"
53
+ "@torpor/view": "^0.3.2",
54
+ "@torpor/unplugin": "^0.2.0"
60
55
  },
61
56
  "devDependencies": {
62
57
  "@trivago/prettier-plugin-sort-imports": "^5.2.2",
63
- "tsup": "^8.5.0",
64
- "tsx": "^4.20.3",
65
- "typescript": "^5.9.2",
58
+ "@typescript/native-preview": "7.0.0-dev.20251005.1",
59
+ "oxlint-tsgolint": "^0.2.0",
60
+ "tsdown": "^0.15.6",
61
+ "typescript": "^5.9.3",
66
62
  "vitest": "^3.2.4"
67
63
  },
68
64
  "scripts": {
69
- "build": "tsc --noEmit && tsup",
70
- "build:watch": "tsup --watch",
71
- "check": "tsc --noEmit",
65
+ "build": "tsgo --noEmit && tsdown",
66
+ "build:watch": "tsdown --watch",
67
+ "check": "tsgo --noEmit && pnpm dlx oxlint --type-aware",
72
68
  "test": "vitest"
73
69
  }
74
70
  }