@torpor/build 0.0.6 → 0.1.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 (106) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +1 -1
  3. package/dist/Server-CB99REgs.d.cts +74 -0
  4. package/dist/Server-CB99REgs.d.ts +74 -0
  5. package/dist/Site-CgoeDt8k.d.cts +29 -0
  6. package/dist/Site-D95nwrAg.d.ts +29 -0
  7. package/dist/adapters/cloudflare/index.cjs +125 -0
  8. package/dist/adapters/cloudflare/index.cjs.map +1 -0
  9. package/dist/adapters/cloudflare/index.d.cts +13 -0
  10. package/dist/adapters/cloudflare/index.d.ts +13 -0
  11. package/dist/adapters/cloudflare/index.js +80 -0
  12. package/dist/adapters/cloudflare/index.js.map +1 -0
  13. package/dist/adapters/node/index.cjs +152 -0
  14. package/dist/adapters/node/index.cjs.map +1 -0
  15. package/dist/adapters/node/index.d.cts +8 -0
  16. package/dist/adapters/node/index.d.ts +8 -0
  17. package/dist/adapters/node/index.js +8 -0
  18. package/dist/adapters/node/index.js.map +1 -0
  19. package/dist/bin/index.cjs +541 -93
  20. package/dist/bin/index.cjs.map +1 -1
  21. package/dist/bin/index.js +511 -22
  22. package/dist/bin/index.js.map +1 -1
  23. package/dist/chunk-5X4T3PZN.js +23 -0
  24. package/dist/chunk-5X4T3PZN.js.map +1 -0
  25. package/dist/chunk-ALHFYD7U.js +113 -0
  26. package/dist/chunk-ALHFYD7U.js.map +1 -0
  27. package/dist/chunk-V4XTDQEV.js +19 -0
  28. package/dist/chunk-V4XTDQEV.js.map +1 -0
  29. package/dist/chunk-VAGHGWM5.js +110 -0
  30. package/dist/chunk-VAGHGWM5.js.map +1 -0
  31. package/dist/index.cjs +200 -97
  32. package/dist/index.cjs.map +1 -1
  33. package/dist/index.d.cts +20 -28
  34. package/dist/index.d.ts +20 -28
  35. package/dist/index.js +85 -17
  36. package/dist/index.js.map +1 -1
  37. package/dist/metafile-cjs.json +1 -1
  38. package/dist/metafile-esm.json +1 -1
  39. package/dist/response.js +17 -91
  40. package/dist/response.js.map +1 -1
  41. package/package.json +26 -9
  42. package/src/adapters/cloudflare/_worker.ts +38 -0
  43. package/src/adapters/cloudflare/index.ts +98 -0
  44. package/src/adapters/node/constants.ts +1 -0
  45. package/src/adapters/node/createFetchHandler.ts +29 -0
  46. package/src/adapters/node/createMiddlewareHandler.ts +79 -0
  47. package/src/adapters/node/createNodeServer.ts +8 -0
  48. package/src/adapters/node/flattenHeaders.ts +44 -0
  49. package/src/adapters/node/index.ts +18 -0
  50. package/src/adapters/node/nodeMessageToNodeResponse.ts +89 -0
  51. package/src/adapters/node/nodeMessageToRequest.ts +43 -0
  52. package/src/adapters/node/readableToBuffer.ts +16 -0
  53. package/src/adapters/node/requestToNodeMessage.ts +26 -0
  54. package/src/adapters/node/responseToNodeResponse.ts +44 -0
  55. package/src/bin/index.ts +43 -36
  56. package/src/index.ts +6 -14
  57. package/src/server/CookieHelper.ts +36 -0
  58. package/src/server/HeaderHelper.ts +25 -0
  59. package/src/server/Server.ts +119 -0
  60. package/src/server/ServerEvent.ts +33 -0
  61. package/src/server/ServerFunction.ts +5 -0
  62. package/src/server/contentType.ts +85 -0
  63. package/src/site/Router.ts +136 -0
  64. package/src/site/Routerx.ts +67 -0
  65. package/src/site/Site.ts +114 -0
  66. package/src/site/clientEntry.ts +22 -20
  67. package/src/site/manifest.ts +49 -0
  68. package/src/site/pathToRegex.ts +10 -0
  69. package/src/site/prepareTemplate.ts +20 -0
  70. package/src/site/runBuild.ts +92 -0
  71. package/src/site/runDev.ts +84 -0
  72. package/src/site/runPreview.ts +83 -0
  73. package/src/site/serverEntry.ts +113 -200
  74. package/src/types/Adapter.ts +10 -0
  75. package/src/types/HttpMethod.ts +12 -0
  76. package/src/types/LayoutHandler.ts +7 -0
  77. package/src/types/ManifestRoute.ts +8 -0
  78. package/src/types/MiddlewareFunction.ts +8 -0
  79. package/src/types/PageEndPoint.ts +4 -3
  80. package/src/types/{PageEvent.ts → PageLoadEvent.ts} +3 -2
  81. package/src/types/PageServerAction.ts +5 -2
  82. package/src/types/PageServerEndPoint.ts +1 -0
  83. package/src/types/PageServerLoad.ts +5 -2
  84. package/src/types/RouteHandler.ts +6 -5
  85. package/src/types/RouteHandlerCollection.ts +1 -0
  86. package/src/types/RouteLayoutHandler.ts +3 -2
  87. package/src/types/RouteMatchResult.ts +3 -2
  88. package/src/types/RouteType.ts +7 -0
  89. package/src/types/ServerEndPoint.ts +1 -0
  90. package/src/types/ServerHook.ts +3 -2
  91. package/src/types/{ServerEvent.ts → ServerLoadEvent.ts} +13 -6
  92. package/src/types/ServerRequest.ts +5 -2
  93. package/src/types/manifest.d.ts +7 -0
  94. package/test/app.test.ts +47 -0
  95. package/tsconfig.json +1 -1
  96. package/tsup.config.ts +11 -1
  97. package/vitest.config.ts +3 -0
  98. package/dist/chunk-IE5EKBNX.js +0 -93
  99. package/dist/chunk-IE5EKBNX.js.map +0 -1
  100. package/src/site/FileSystemRouter.ts +0 -25
  101. package/src/site/buildRoutePath.ts +0 -25
  102. package/src/site/defineConfig.ts +0 -75
  103. package/src/site/lazyRoute.ts +0 -72
  104. package/src/site/routeHandlers.ts +0 -126
  105. package/src/types/CookieHelper.ts +0 -8
  106. package/src/types/UserConfig.ts +0 -4
@@ -1,45 +1,42 @@
1
+ import manifest from "@torpor/build/manifest";
1
2
  import { type ServerComponent, type ServerSlotRender } from "@torpor/view";
2
- import fs from "node:fs";
3
- import { IncomingMessage } from "node:http";
4
- import path from "node:path";
5
- import { deleteCookie, eventHandler, getCookie, setCookie } from "vinxi/http";
6
- import { type CookieSerializeOptions, type EventHandlerRequest, H3Event } from "vinxi/http";
7
- import { getManifest } from "vinxi/manifest";
8
- import notFound from "../response/notFound";
9
- import ok from "../response/ok";
10
- import seeOther from "../response/seeOther";
11
- import serverError from "../response/serverError";
12
- import $page from "../state/$page";
13
- import type PageEndPoint from "../types/PageEndPoint";
14
- import type PageServerEndPoint from "../types/PageServerEndPoint";
15
- import type RouteHandler from "../types/RouteHandler";
16
- import type ServerEndPoint from "../types/ServerEndPoint";
17
- import type ServerEvent from "../types/ServerEvent";
18
- import type ServerHook from "../types/ServerHook";
19
- import routeHandlers from "./routeHandlers";
20
-
21
- let printedRoutes = false;
22
-
23
- export default eventHandler(async (event) => {
24
- const url = new URL(`http://${process.env.HOST ?? "localhost"}${event.node.req.url}`);
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.ts";
8
+ import type PageEndPoint from "../types/PageEndPoint.ts";
9
+ import type PageServerEndPoint from "../types/PageServerEndPoint.ts";
10
+ import RouteHandler from "../types/RouteHandler.ts";
11
+ import {
12
+ HOOK_ROUTE,
13
+ HOOK_SERVER_ROUTE,
14
+ LAYOUT_ROUTE,
15
+ LAYOUT_SERVER_ROUTE,
16
+ PAGE_ROUTE,
17
+ PAGE_SERVER_ROUTE,
18
+ SERVER_ROUTE,
19
+ } from "../types/RouteType";
20
+ import type ServerEndPoint from "../types/ServerEndPoint.ts";
21
+ import type ServerHook from "../types/ServerHook.ts";
22
+ import type ServerLoadEvent from "../types/ServerLoadEvent.ts";
23
+ import Router from "./Router.ts";
24
+
25
+ // Build the router from the Site object created by the user
26
+ const router = new Router();
27
+ router.addPages(manifest.routes);
28
+
29
+ console.log(`routes:\n ${router.routes.map((r) => r.path).join("\n ")}`);
30
+
31
+ export async function load(ev: ServerEvent, template: string) {
32
+ //const url = new URL(`http://${process.env.HOST ?? "localhost"}${ev.request.url}`);
33
+ const url = new URL(ev.request.url);
25
34
  const path = url.pathname;
35
+ const query = url.searchParams;
26
36
 
27
- const searchParams = url.searchParams;
28
-
29
- console.log(
30
- "handling server",
31
- event.method,
32
- "for",
33
- path,
34
- searchParams.size ? `with ${searchParams}` : "",
35
- );
36
-
37
- if (!printedRoutes) {
38
- printedRoutes = true;
39
- console.log("routes:\n " + routeHandlers.handlers.map((h) => h.path).join("\n "));
40
- }
37
+ console.log(`handling ${ev.request.method} for '${path}'${query.size ? ` with ${query}` : ""}`);
41
38
 
42
- const route = routeHandlers.match(path, searchParams);
39
+ const route = router.match(path, query);
43
40
  if (!route) {
44
41
  return notFound();
45
42
  }
@@ -49,121 +46,93 @@ export default eventHandler(async (event) => {
49
46
  $page.url = url;
50
47
 
51
48
  const handler = route.handler;
52
- const params = route.routeParams || {};
49
+ const params = route.params || {};
53
50
 
54
51
  // TODO: Hit the server hook out here
55
-
56
- // HACK: Support any +server location??
57
- if (path.startsWith("/api/")) {
58
- return await loadData(event, url, handler, params);
59
- } else if (path.endsWith("~server")) {
60
- // HACK: Is this the best way to signal that we want server data??
61
- // And can we maybe combine this with the above method, or are they too different?
62
- if (event.method === "GET") {
63
- return await loadServerData(event, url, handler, params);
52
+ // We could maybe set data loading up as middleware on a route??????
53
+
54
+ switch (handler.type) {
55
+ case PAGE_ROUTE:
56
+ case LAYOUT_ROUTE: {
57
+ // It's a /+page.ts or /_layout.ts endpoint
58
+ if (ev.request.method === "GET") {
59
+ return await loadView(ev, url, handler, params, template);
60
+ } else if (ev.request.method === "POST") {
61
+ return await runAction(ev, url, handler, params, query);
62
+ }
63
+ break;
64
64
  }
65
- } else {
66
- if (event.method === "GET") {
67
- return await loadView(event, url, handler, params);
68
- } else if (event.method === "POST") {
69
- return await runAction(event, url, handler, params, searchParams);
65
+ case PAGE_SERVER_ROUTE:
66
+ case LAYOUT_SERVER_ROUTE: {
67
+ // It's a /+page.server.ts or /_layout.server.ts endpoint
68
+ if (ev.request.method === "GET") {
69
+ return await loadData(ev, url, handler, "load", params);
70
+ }
71
+ break;
72
+ }
73
+ case SERVER_ROUTE: {
74
+ // It's a /+server.ts endpoint
75
+ const functionName = ev.request.method.toLowerCase().replace("delete", "del");
76
+ return await loadData(ev, url, handler, functionName, params);
77
+ }
78
+ case HOOK_ROUTE:
79
+ case HOOK_SERVER_ROUTE: {
80
+ break;
70
81
  }
71
82
  }
72
- });
83
+
84
+ return notFound();
85
+ }
73
86
 
74
87
  async function loadData(
75
- event: H3Event<EventHandlerRequest>,
88
+ ev: ServerEvent,
76
89
  url: URL,
77
90
  handler: RouteHandler,
91
+ functionName: string,
78
92
  params: Record<string, string>,
79
93
  ) {
80
- const functionName = event.method.toLowerCase().replace("delete", "del");
81
-
82
- const serverEndPoint: ServerEndPoint | undefined = (await handler.endPoint).default;
94
+ const serverEndPoint: ServerEndPoint | undefined = (await handler.endPoint()).default;
83
95
  if (serverEndPoint && serverEndPoint[functionName]) {
84
- const serverParams = await buildServerParams(event, url, params);
96
+ const serverParams = buildServerParams(ev, url, params);
85
97
 
86
98
  if (handler.serverHook) {
87
- const serverHook: ServerHook | undefined = (await handler.serverHook).default;
99
+ const serverHook: ServerHook | undefined = (await handler.serverHook()).default;
88
100
  if (serverHook?.handle) {
89
101
  await serverHook.handle(serverParams);
90
102
  }
91
103
  }
92
104
 
93
105
  const result = await serverEndPoint[functionName](serverParams);
94
- // If there was no response returned from load (such as errors or a
95
- // redirect), send an ok response
96
- return result || ok();
97
- }
98
- }
99
-
100
- async function loadServerData(
101
- event: H3Event<EventHandlerRequest>,
102
- url: URL,
103
- handler: RouteHandler,
104
- params: Record<string, string>,
105
- ) {
106
- const serverEndPoint: PageServerEndPoint | undefined = (await handler.endPoint).default;
107
- if (serverEndPoint?.load) {
108
- const serverParams = await buildServerParams(event, url, params);
109
106
 
110
- if (handler.serverHook) {
111
- const serverHook: ServerHook | undefined = (await handler.serverHook).default;
112
- if (serverHook?.handle) {
113
- await serverHook.handle(serverParams);
114
- }
115
- }
116
-
117
- const result = await serverEndPoint.load(serverParams);
118
107
  // If there was no response returned from load (such as errors or a
119
108
  // redirect), send an ok response
120
109
  return result || ok();
121
110
  }
122
111
 
123
- // It's ok if there's no load method -- we can't tell whether there will be
124
- // when loading routes
125
- //return ok();
112
+ return notFound();
126
113
  }
127
114
 
128
115
  async function loadView(
129
- event: H3Event<EventHandlerRequest>,
116
+ ev: ServerEvent,
130
117
  url: URL,
131
118
  handler: RouteHandler,
132
119
  params: Record<string, string>,
120
+ template: string,
133
121
  ) {
134
122
  // There must be a client endpoint with a component
135
- const clientEndPoint: PageEndPoint | undefined = (await handler.endPoint).default;
123
+ const clientEndPoint: PageEndPoint | undefined = (await handler.endPoint()).default;
136
124
  if (!clientEndPoint?.component) {
137
125
  return notFound();
138
126
  }
139
127
 
140
128
  // There may be a server endpoint
141
- const serverEndPoint: PageServerEndPoint | undefined = (await handler.serverEndPoint)?.default;
142
-
143
- // HACK: wrangle the view into app.html
144
- // We could instead have an App.torp component with a slot, but you can run
145
- // into hydration problems that way e.g. if there is a browser plugin that
146
- // injects elements into <head> or <body>
147
- const appHtml = loadAppHtml();
148
- let contentStart = regexIndexOf(appHtml, /\<div\s+id=("app"|'app'|app)\s+/);
149
- contentStart = appHtml.indexOf(">", contentStart) + 1;
150
- let contentEnd = appHtml.indexOf("</div>", contentStart);
151
- if (contentStart === -1 || contentEnd === -1) {
152
- return serverError;
153
- }
154
-
155
- // Build client scripts
156
- const clientManifest = getManifest("client");
157
- const clientHandler = clientManifest.inputs[clientManifest.handler];
158
- const clientScript = clientHandler.output.path;
159
- const hasClientScript = !!clientScript;
160
- const manifestJson = JSON.stringify(clientManifest.json());
161
- const hasManifestJson = manifestJson !== "{}";
129
+ const serverEndPoint: PageServerEndPoint | undefined =
130
+ handler.serverEndPoint && (await handler.serverEndPoint())?.default;
162
131
 
163
132
  // Maybe hit the server hook
164
- const serverParams = await buildServerParams(event, url, params);
133
+ const serverParams = buildServerParams(ev, url, params);
165
134
  if (handler.serverHook) {
166
- const serverHook: ServerHook | undefined = (await handler.serverHook).default;
135
+ const serverHook: ServerHook | undefined = (await handler.serverHook()).default;
167
136
  if (serverHook?.handle) {
168
137
  await serverHook.handle(serverParams);
169
138
  }
@@ -175,9 +144,9 @@ async function loadView(
175
144
  let data = {};
176
145
  if (handler.layouts) {
177
146
  for (let layout of handler.layouts) {
178
- const layoutEndPoint: PageEndPoint | undefined = (await layout.endPoint)?.default;
179
- const layoutServerEndPoint: PageServerEndPoint | undefined = (await layout.serverEndPoint)
180
- ?.default;
147
+ const layoutEndPoint: PageEndPoint | undefined = (await layout.endPoint())?.default;
148
+ const layoutServerEndPoint: PageServerEndPoint | undefined =
149
+ layout.serverEndPoint && (await layout.serverEndPoint())?.default;
181
150
  const layoutData = await loadClientAndServerData(
182
151
  url,
183
152
  params,
@@ -212,7 +181,8 @@ async function loadView(
212
181
  slotFunctions[handler.layouts.length] = (_, context) =>
213
182
  (clientEndPoint.component as ServerComponent)($props, context);
214
183
  for (let i = handler.layouts.length - 1; i >= 0; i--) {
215
- const layoutEndPoint: PageEndPoint | undefined = (await handler.layouts[i].endPoint)?.default;
184
+ const layoutEndPoint: PageEndPoint | undefined = (await handler.layouts[i].endPoint())
185
+ ?.default;
216
186
  if (layoutEndPoint?.component) {
217
187
  if (i === 0) {
218
188
  component = layoutEndPoint.component as ServerComponent;
@@ -227,64 +197,62 @@ async function loadView(
227
197
  }
228
198
  }
229
199
 
230
- event.node.res.setHeader("content-type", "text/html");
231
-
232
- let componentCode = "";
200
+ let html;
233
201
  try {
234
- componentCode = component($props, undefined, slots);
202
+ html = component($props, undefined, slots);
203
+ html = template.replace("%COMPONENT_HTML%", html);
235
204
  } catch (error) {
236
205
  // TODO: Show a proper Error component
237
- componentCode = '<span style="color: red">Script syntax error</span><p>' + error + "</p>";
206
+ html = '<span style="color: red">Script syntax error</span><p>' + error + "</p>";
238
207
  console.log(error);
239
208
  }
240
209
 
241
- // Put it all together
242
- let html =
243
- appHtml.substring(0, contentStart) +
244
- componentCode +
245
- appHtml.substring(contentEnd) +
246
- (hasClientScript ? `<script type="module" src="${clientScript}"></script>` : "") +
247
- (hasManifestJson ? `<script>window.manifest = ${manifestJson}</script>` : "");
248
-
249
- //console.log(html);
250
-
251
- return html;
210
+ return new Response(html, {
211
+ status: 200,
212
+ headers: {
213
+ "Content-Type": "text/html",
214
+ },
215
+ });
252
216
  }
253
217
 
254
218
  async function runAction(
255
- event: H3Event<EventHandlerRequest>,
219
+ ev: ServerEvent,
256
220
  url: URL,
257
221
  handler: RouteHandler,
258
222
  params: Record<string, string>,
259
- searchParams: URLSearchParams,
223
+ query: URLSearchParams,
260
224
  ) {
261
- const actionName = (Array.from(searchParams.keys())[0] || "default").replace(/^\//, "");
262
- const serverEndPoint: PageServerEndPoint | undefined = (await handler.serverEndPoint).default;
225
+ const actionName = (Array.from(query.keys())[0] || "default").replace(/^\//, "");
226
+ const serverEndPoint: PageServerEndPoint | undefined =
227
+ handler.serverEndPoint && (await handler.serverEndPoint()).default;
263
228
  if (serverEndPoint?.actions) {
264
229
  const action = serverEndPoint.actions[actionName];
265
230
  if (action) {
266
231
  // TODO: form.errors etc
267
- const serverParams = await buildServerParams(event, url, params);
232
+ const serverParams = buildServerParams(ev, url, params);
268
233
 
269
234
  if (handler.serverHook) {
270
- const serverHook: ServerHook | undefined = (await handler.serverHook).default;
235
+ const serverHook: ServerHook | undefined = (await handler.serverHook()).default;
271
236
  if (serverHook?.handle) {
272
237
  await serverHook.handle(serverParams);
273
238
  }
274
239
  }
275
240
 
276
- const result = await action(serverParams);
241
+ const result = await action(serverParams); // <--
242
+
277
243
  // If there was no response returned from the action (such as errors
278
244
  // or a redirect), reload the page by redirecting
279
245
  return result || seeOther(url.pathname);
280
246
  }
281
247
  }
248
+
249
+ return notFound();
282
250
  }
283
251
 
284
252
  async function loadClientAndServerData(
285
253
  url: URL,
286
254
  params: Record<string, string>,
287
- serverParams: ServerEvent,
255
+ serverParams: ServerLoadEvent,
288
256
  data: Record<string, any>,
289
257
  clientEndPoint?: PageEndPoint,
290
258
  serverEndPoint?: PageServerEndPoint,
@@ -314,72 +282,17 @@ function buildClientParams(url: URL, params: Record<string, string>, data: Recor
314
282
  };
315
283
  }
316
284
 
317
- async function buildServerParams(
318
- event: H3Event<EventHandlerRequest>,
285
+ function buildServerParams(
286
+ ev: ServerEvent,
319
287
  url: URL,
320
288
  params: Record<string, string>,
321
- ): Promise<ServerEvent> {
289
+ ): ServerLoadEvent {
322
290
  return {
323
291
  url,
324
292
  params,
325
293
  appData: {},
326
- request: await incomingMessageToRequest(event.node.req, url),
327
- response: event.node.res,
328
- cookies: {
329
- get: (name: string) => getCookie(event, name),
330
- set: (name: string, value: string, options?: CookieSerializeOptions) =>
331
- setCookie(event, name, value, options),
332
- delete: (name: string, options?: CookieSerializeOptions) =>
333
- deleteCookie(event, name, options),
334
- },
294
+ request: ev.request,
295
+ cookies: ev.cookies,
296
+ headers: ev.headers,
335
297
  };
336
298
  }
337
-
338
- // From https://stackoverflow.com/a/78849544
339
- async function incomingMessageToRequest(req: IncomingMessage, url: URL): Promise<Request> {
340
- const headers = new Headers();
341
- for (const [key, value] of Object.entries(req.headers)) {
342
- if (Array.isArray(value)) {
343
- value.forEach((v) => headers.append(key, v));
344
- } else if (value !== undefined) {
345
- headers.set(key, value);
346
- }
347
- }
348
- // Convert body to Buffer if applicable
349
- const body = req.method !== "GET" && req.method !== "HEAD" ? await getRequestBody(req) : null;
350
- return new Request(url, {
351
- method: req.method,
352
- headers: headers,
353
- body: body,
354
- });
355
- }
356
-
357
- function getRequestBody(req: IncomingMessage): Promise<Buffer> {
358
- return new Promise<Buffer>((resolve, reject) => {
359
- const chunks: Buffer[] = [];
360
- req.on("data", (chunk: Buffer) => {
361
- chunks.push(chunk);
362
- });
363
- req.on("end", () => {
364
- resolve(Buffer.concat(chunks));
365
- });
366
- req.on("error", (err) => {
367
- reject(err);
368
- });
369
- });
370
- }
371
-
372
- let loadedAppHtml = "";
373
- function loadAppHtml() {
374
- if (!loadedAppHtml) {
375
- let file = path.resolve("src/app.html");
376
- loadedAppHtml = fs.readFileSync(file).toString();
377
- }
378
- return loadedAppHtml;
379
- }
380
-
381
- // From https://stackoverflow.com/a/274094
382
- function regexIndexOf(string: string, regex: RegExp, position?: number) {
383
- var indexOf = string.substring(position || 0).search(regex);
384
- return indexOf >= 0 ? indexOf + (position || 0) : indexOf;
385
- }
@@ -0,0 +1,10 @@
1
+ import Server from "../server/Server";
2
+ import Site from "../site/Site";
3
+
4
+ type Adapter = {
5
+ prebuild?: (site: Site) => Promise<void> | void;
6
+ postbuild?: (site: Site) => Promise<void> | void;
7
+ serve: (server: Server, site: Site) => void;
8
+ };
9
+
10
+ export default Adapter;
@@ -0,0 +1,12 @@
1
+ type HttpMethod =
2
+ | "GET"
3
+ | "HEAD"
4
+ | "PATCH"
5
+ | "POST"
6
+ | "PUT"
7
+ | "DELETE"
8
+ | "OPTIONS"
9
+ | "CONNECT"
10
+ | "TRACE";
11
+
12
+ export default HttpMethod;
@@ -0,0 +1,7 @@
1
+ type LayoutHandler = {
2
+ path: string;
3
+ endPoint: () => Promise<any>;
4
+ serverEndPoint?: () => Promise<any>;
5
+ };
6
+
7
+ export default LayoutHandler;
@@ -0,0 +1,8 @@
1
+ type ManifestRoute = {
2
+ path: string;
3
+ type: number;
4
+ file: string;
5
+ endPoint: () => Promise<any>;
6
+ };
7
+
8
+ export default ManifestRoute;
@@ -0,0 +1,8 @@
1
+ import ServerEvent from "../server/ServerEvent";
2
+
3
+ type MiddlewareFunction = (
4
+ ev: ServerEvent,
5
+ next: () => void | Promise<void>,
6
+ ) => void | Promise<void>;
7
+
8
+ export default MiddlewareFunction;
@@ -1,5 +1,5 @@
1
1
  import { type Component } from "@torpor/view";
2
- import type PageEvent from "./PageEvent";
2
+ import type PageLoadEvent from "./PageLoadEvent";
3
3
 
4
4
  /**
5
5
  * For +page.
@@ -13,7 +13,7 @@ type PageEndPoint = {
13
13
  /**
14
14
  * Loads data for the page.
15
15
  */
16
- load?: (event: PageEvent) => any;
16
+ load?: (event: PageLoadEvent) => any;
17
17
  /**
18
18
  * The component that is displayed for the page.
19
19
  */
@@ -22,8 +22,9 @@ type PageEndPoint = {
22
22
  /**
23
23
  * The head element data for the page, which may include a <title> and <meta> elements.
24
24
  */
25
- head?: HeadElement[] | ((event: PageEvent) => HeadElement[]);
25
+ head?: HeadElement[] | ((event: PageLoadEvent) => HeadElement[]);
26
26
  };
27
+
27
28
  export default PageEndPoint;
28
29
 
29
30
  type HeadElement = TitleElement | MetaElement;
@@ -1,4 +1,4 @@
1
- type PageEvent = {
1
+ type PageLoadEvent = {
2
2
  /**
3
3
  * The URL for the server function.
4
4
  */
@@ -12,4 +12,5 @@ type PageEvent = {
12
12
  */
13
13
  data: Record<string, any>;
14
14
  };
15
- export default PageEvent;
15
+
16
+ export default PageLoadEvent;
@@ -1,4 +1,7 @@
1
- import type ServerEvent from "./ServerEvent";
1
+ import type ServerLoadEvent from "./ServerLoadEvent";
2
+
3
+ type PageServerAction = (
4
+ event: ServerLoadEvent,
5
+ ) => Response | Promise<Response | undefined> | Promise<void> | void;
2
6
 
3
- type PageServerAction = (event: ServerEvent) => Response | Promise<Response | undefined> | void;
4
7
  export default PageServerAction;
@@ -14,4 +14,5 @@ type PageServerEndPoint = {
14
14
  */
15
15
  actions?: Record<string, PageServerAction>;
16
16
  };
17
+
17
18
  export default PageServerEndPoint;
@@ -1,4 +1,7 @@
1
- import type ServerEvent from "./ServerEvent";
1
+ import type ServerLoadEvent from "./ServerLoadEvent";
2
+
3
+ type PageServerLoad = (
4
+ event: ServerLoadEvent,
5
+ ) => Response | Promise<Response | undefined> | Promise<void> | void;
2
6
 
3
- type PageServerLoad = (event: ServerEvent) => Response | Promise<Response | undefined> | void;
4
7
  export default PageServerLoad;
@@ -2,12 +2,13 @@ import type RouteLayoutHandler from "./RouteLayoutHandler";
2
2
 
3
3
  type RouteHandler = {
4
4
  path: string;
5
- regex: RegExp;
6
- endPoint: Promise<any>;
5
+ type: number;
6
+ endPoint: () => Promise<any>;
7
7
 
8
- loaded: boolean;
8
+ loaded?: boolean;
9
9
  layouts?: RouteLayoutHandler[];
10
- serverEndPoint?: Promise<any>;
11
- serverHook?: Promise<any>;
10
+ serverEndPoint?: () => Promise<any>;
11
+ serverHook?: () => Promise<any>;
12
12
  };
13
+
13
14
  export default RouteHandler;
@@ -5,4 +5,5 @@ type RouteHandlerCollection = {
5
5
  handlers: RouteHandler[];
6
6
  match(path: string, urlParams?: URLSearchParams): RouteMatchResult | undefined;
7
7
  };
8
+
8
9
  export default RouteHandlerCollection;
@@ -1,6 +1,7 @@
1
1
  type RouteLayoutHandler = {
2
2
  path: string;
3
- endPoint: Promise<any>;
4
- serverEndPoint?: Promise<any>;
3
+ endPoint: () => Promise<any>;
4
+ serverEndPoint?: () => Promise<any>;
5
5
  };
6
+
6
7
  export default RouteLayoutHandler;
@@ -2,7 +2,8 @@ import type RouteHandler from "./RouteHandler";
2
2
 
3
3
  type RouteMatchResult = {
4
4
  handler: RouteHandler;
5
- routeParams?: Record<string, string>;
6
- urlParams?: Record<string, string>;
5
+ params?: Record<string, string>;
6
+ query?: Record<string, string>;
7
7
  };
8
+
8
9
  export default RouteMatchResult;
@@ -0,0 +1,7 @@
1
+ export const PAGE_ROUTE = 0;
2
+ export const PAGE_SERVER_ROUTE = 1;
3
+ export const SERVER_ROUTE = 3;
4
+ export const LAYOUT_ROUTE = 4;
5
+ export const LAYOUT_SERVER_ROUTE = 5;
6
+ export const HOOK_ROUTE = 6;
7
+ export const HOOK_SERVER_ROUTE = 7;
@@ -33,4 +33,5 @@ type ServerEndPoint = { [key: string]: ServerRequest } & {
33
33
  */
34
34
  head?: ServerRequest;
35
35
  };
36
+
36
37
  export default ServerEndPoint;
@@ -1,4 +1,4 @@
1
- import type ServerEvent from "./ServerEvent";
1
+ import type ServerLoadEvent from "./ServerLoadEvent";
2
2
 
3
3
  /**
4
4
  * For _hook.server.
@@ -9,6 +9,7 @@ type ServerHook = {
9
9
  */
10
10
  handle?: ServerLoad;
11
11
  };
12
+
12
13
  export default ServerHook;
13
14
 
14
- type ServerLoad = (event: ServerEvent) => Promise<void> | void;
15
+ type ServerLoad = (event: ServerLoadEvent) => Promise<void> | void;