@solidjs/start 0.7.0 → 0.7.2

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 (115) hide show
  1. package/config/index.js +4 -4
  2. package/config/server-components.js +1 -1
  3. package/dist/client/StartClient.d.ts +3 -0
  4. package/{client/StartClient.tsx → dist/client/StartClient.jsx} +4 -9
  5. package/{client/index.ts → dist/client/index.d.ts} +0 -1
  6. package/dist/client/index.jsx +4 -0
  7. package/dist/client/islands.d.ts +3 -0
  8. package/{client/islands.ts → dist/client/islands.jsx} +1 -1
  9. package/dist/client/mount.d.ts +3 -0
  10. package/dist/client/mount.js +85 -0
  11. package/dist/client/spa/index.d.ts +5 -0
  12. package/dist/client/spa/index.jsx +6 -0
  13. package/dist/index.d.ts +4 -0
  14. package/dist/index.jsx +5 -0
  15. package/dist/middleware/index.d.ts +18 -0
  16. package/dist/middleware/index.js +40 -0
  17. package/dist/router/FileRoutes.d.ts +2 -0
  18. package/dist/router/FileRoutes.js +25 -0
  19. package/dist/router/index.jsx +2 -0
  20. package/dist/router/lazyRoute.d.ts +6 -0
  21. package/dist/router/lazyRoute.js +48 -0
  22. package/dist/router/routes.d.ts +25 -0
  23. package/dist/router/routes.js +51 -0
  24. package/dist/runtime/server-fns-runtime.d.ts +1 -0
  25. package/dist/runtime/server-fns-runtime.js +30 -0
  26. package/dist/runtime/server-handler.d.ts +2 -0
  27. package/dist/runtime/server-handler.js +242 -0
  28. package/dist/runtime/server-runtime.d.ts +3 -0
  29. package/dist/runtime/server-runtime.js +185 -0
  30. package/dist/server/StartServer.d.ts +5 -0
  31. package/dist/server/StartServer.jsx +78 -0
  32. package/dist/server/fetchEvent.d.ts +6 -0
  33. package/dist/server/fetchEvent.js +88 -0
  34. package/dist/server/handler.d.ts +3 -0
  35. package/dist/server/handler.js +98 -0
  36. package/dist/server/index.jsx +5 -0
  37. package/dist/server/islands/index.d.ts +19 -0
  38. package/dist/server/islands/index.jsx +62 -0
  39. package/dist/server/islands/utils.d.ts +1 -0
  40. package/dist/server/islands/utils.jsx +85 -0
  41. package/dist/server/pageEvent.d.ts +2 -0
  42. package/dist/server/pageEvent.js +43 -0
  43. package/dist/server/renderAsset.d.ts +2 -0
  44. package/dist/server/renderAsset.jsx +13 -0
  45. package/dist/server/serverFunction.d.ts +2 -0
  46. package/dist/server/serverFunction.jsx +4 -0
  47. package/dist/server/spa/StartServer.d.ts +5 -0
  48. package/dist/server/spa/StartServer.jsx +18 -0
  49. package/dist/server/spa/handler.d.ts +3 -0
  50. package/dist/server/spa/handler.js +17 -0
  51. package/{server/spa/index.ts → dist/server/spa/index.d.ts} +0 -1
  52. package/dist/server/spa/index.jsx +4 -0
  53. package/dist/server/types.d.ts +79 -0
  54. package/dist/server/types.js +1 -0
  55. package/dist/shared/ErrorBoundary.d.ts +2 -0
  56. package/dist/shared/ErrorBoundary.jsx +16 -0
  57. package/dist/shared/GET.d.ts +1 -0
  58. package/dist/shared/GET.js +5 -0
  59. package/dist/shared/HttpHeader.d.ts +6 -0
  60. package/dist/shared/HttpHeader.jsx +32 -0
  61. package/dist/shared/HttpStatusCode.d.ts +5 -0
  62. package/dist/shared/HttpStatusCode.jsx +12 -0
  63. package/dist/shared/clientOnly.d.ts +6 -0
  64. package/dist/shared/clientOnly.jsx +19 -0
  65. package/dist/shared/dev-overlay/CodeView.d.ts +7 -0
  66. package/dist/shared/dev-overlay/CodeView.jsx +71 -0
  67. package/dist/shared/dev-overlay/DevOverlayDialog.d.ts +9 -0
  68. package/dist/shared/dev-overlay/DevOverlayDialog.jsx +209 -0
  69. package/dist/shared/dev-overlay/createStackFrame.d.ts +9 -0
  70. package/dist/shared/dev-overlay/createStackFrame.js +56 -0
  71. package/dist/shared/dev-overlay/download.d.ts +1 -0
  72. package/dist/shared/dev-overlay/download.js +6 -0
  73. package/dist/shared/dev-overlay/get-source-map.d.ts +2 -0
  74. package/dist/shared/dev-overlay/get-source-map.js +25 -0
  75. package/dist/shared/dev-overlay/icons.d.ts +28 -0
  76. package/{shared/dev-overlay/icons.tsx → dist/shared/dev-overlay/icons.jsx} +35 -173
  77. package/dist/shared/dev-overlay/index.d.ts +5 -0
  78. package/dist/shared/dev-overlay/index.jsx +37 -0
  79. package/package.json +20 -22
  80. package/client/mount.ts +0 -99
  81. package/client/spa/index.ts +0 -10
  82. package/config/server-fns-runtime.ts +0 -28
  83. package/config/server-handler.ts +0 -261
  84. package/config/server-runtime.ts +0 -229
  85. package/middleware/index.ts +0 -70
  86. package/router/FileRoutes.ts +0 -35
  87. package/router/lazyRoute.ts +0 -55
  88. package/router/routes.ts +0 -87
  89. package/server/StartServer.tsx +0 -126
  90. package/server/fetchEvent.ts +0 -113
  91. package/server/handler.ts +0 -112
  92. package/server/islands/index.tsx +0 -103
  93. package/server/islands/utils.tsx +0 -89
  94. package/server/pageEvent.ts +0 -50
  95. package/server/renderAsset.tsx +0 -23
  96. package/server/serverFunction.tsx +0 -6
  97. package/server/spa/StartServer.tsx +0 -52
  98. package/server/spa/handler.ts +0 -24
  99. package/server/types.ts +0 -81
  100. package/shared/ErrorBoundary.tsx +0 -23
  101. package/shared/GET.ts +0 -5
  102. package/shared/HttpHeader.tsx +0 -35
  103. package/shared/HttpStatusCode.tsx +0 -19
  104. package/shared/clientOnly.tsx +0 -29
  105. package/shared/dev-overlay/CodeView.tsx +0 -95
  106. package/shared/dev-overlay/DevOverlayDialog.tsx +0 -280
  107. package/shared/dev-overlay/createStackFrame.ts +0 -77
  108. package/shared/dev-overlay/download.ts +0 -6
  109. package/shared/dev-overlay/env.d.ts +0 -4
  110. package/shared/dev-overlay/get-source-map.ts +0 -35
  111. package/shared/dev-overlay/index.tsx +0 -61
  112. package/shared/index.ts +0 -5
  113. /package/{router/index.ts → dist/router/index.d.ts} +0 -0
  114. /package/{server/index.ts → dist/server/index.d.ts} +0 -0
  115. /package/{shared → dist/shared}/dev-overlay/styles.css +0 -0
package/config/index.js CHANGED
@@ -108,7 +108,7 @@ export function defineConfig(baseConfig = {}) {
108
108
  }),
109
109
  ...plugins,
110
110
  serverTransform({
111
- runtime: normalize(fileURLToPath(new URL("./server-fns-runtime.ts", import.meta.url)))
111
+ runtime: normalize(fileURLToPath(new URL("../dist/runtime/server-fns-runtime.js", import.meta.url)))
112
112
  }),
113
113
  start.experimental.islands ? serverComponents.server() : null,
114
114
  solid({ ...start.solid, ssr: true, extensions: extensions.map(ext => `.${ext}`) }),
@@ -167,7 +167,7 @@ export function defineConfig(baseConfig = {}) {
167
167
  }),
168
168
  ...plugins,
169
169
  serverFunctions.client({
170
- runtime: normalize(fileURLToPath(new URL("./server-runtime.ts", import.meta.url)))
170
+ runtime: normalize(fileURLToPath(new URL("../dist/runtime/server-runtime.js", import.meta.url)))
171
171
  }),
172
172
  start.experimental.islands ? serverComponents.client() : null,
173
173
  solid({ ...start.solid, ssr: start.ssr, extensions: extensions.map(ext => `.${ext}`) }),
@@ -207,7 +207,7 @@ export function defineConfig(baseConfig = {}) {
207
207
  name: "server-fns",
208
208
  type: "http",
209
209
  base: "/_server",
210
- handler: normalize(fileURLToPath(new URL("./server-handler.ts", import.meta.url))),
210
+ handler: normalize(fileURLToPath(new URL("../dist/runtime/server-handler.js", import.meta.url))),
211
211
  middleware: start.middleware,
212
212
  target: "server",
213
213
  routes: solidStartServerFsRouter({ dir: routeDir, extensions }),
@@ -230,7 +230,7 @@ export function defineConfig(baseConfig = {}) {
230
230
  }),
231
231
  ...plugins,
232
232
  serverFunctionServer({
233
- runtime: normalize(fileURLToPath(new URL("./server-fns-runtime.ts", import.meta.url)))
233
+ runtime: normalize(fileURLToPath(new URL("../dist/runtime/server-fns-runtime.js", import.meta.url)))
234
234
  }),
235
235
  solid({ ...start.solid, ssr: true, extensions: extensions.map(ext => `.${ext}`) }),
236
236
  config("app-server", {
@@ -20,7 +20,7 @@ function client() {
20
20
  }
21
21
 
22
22
  function server() {
23
- const runtime = normalize(fileURLToPath(new URL("./server-runtime.ts", import.meta.url)));
23
+ const runtime = normalize(fileURLToPath(new URL("../dist/runtime/server-runtime.js", import.meta.url)));
24
24
  // export function serverComponents({
25
25
  // resolve = {
26
26
  // conditions: ["react-server"],
@@ -0,0 +1,3 @@
1
+ import type { JSX } from "solid-js";
2
+ import "./mount";
3
+ export declare function StartClient(): JSX.Element;
@@ -1,22 +1,17 @@
1
1
  // @refresh skip
2
2
  // @ts-ignore
3
3
  import App from "#start/app";
4
- import type { JSX } from "solid-js";
5
4
  import { ErrorBoundary } from "../shared/ErrorBoundary";
6
5
  import "./mount";
7
-
8
- function Dummy(props: { children: JSX.Element }) {
9
- return props.children;
6
+ function Dummy(props) {
7
+ return props.children;
10
8
  }
11
-
12
9
  export function StartClient() {
13
- return (
14
- <Dummy>
10
+ return (<Dummy>
15
11
  <Dummy>
16
12
  <ErrorBoundary>
17
13
  <App />
18
14
  </ErrorBoundary>
19
15
  </Dummy>
20
- </Dummy>
21
- );
16
+ </Dummy>);
22
17
  }
@@ -1,4 +1,3 @@
1
1
  import "vinxi/client";
2
2
  export { StartClient } from "./StartClient";
3
3
  export { mount } from "./mount";
4
-
@@ -0,0 +1,4 @@
1
+ // @refresh skip
2
+ import "vinxi/client";
3
+ export { StartClient } from "./StartClient";
4
+ export { mount } from "./mount";
@@ -0,0 +1,3 @@
1
+ import "vinxi/client";
2
+ export declare function StartClient(): null;
3
+ export { mount } from "./mount";
@@ -1,6 +1,6 @@
1
1
  // @refresh skip
2
2
  import "vinxi/client";
3
3
  export function StartClient() {
4
- return null;
4
+ return null;
5
5
  }
6
6
  export { mount } from "./mount";
@@ -0,0 +1,3 @@
1
+ import type { JSX } from "solid-js";
2
+ import { type MountableElement } from "solid-js/web";
3
+ export declare function mount(fn: () => JSX.Element, el: MountableElement): (() => void) | undefined;
@@ -0,0 +1,85 @@
1
+ import { createStore } from "solid-js/store";
2
+ import { createComponent, getHydrationKey, getOwner, hydrate } from "solid-js/web";
3
+ export function mount(fn, el) {
4
+ if (import.meta.env.START_ISLANDS) {
5
+ const map = new WeakMap();
6
+ async function mountIsland(el) {
7
+ if (el.dataset.css) {
8
+ let css = JSON.parse(el.dataset.css);
9
+ for (let href of css) {
10
+ if (!document.querySelector(`link[href="${href}"]`)) {
11
+ let link = document.createElement("link");
12
+ link.rel = "stylesheet";
13
+ link.href = href;
14
+ document.head.appendChild(link);
15
+ }
16
+ }
17
+ }
18
+ let mod = await import(
19
+ /* @vite-ignore */
20
+ import.meta.env.MANIFEST["client"].chunks[el.dataset.id.split("#")[0]].output.path);
21
+ if (!mod || !el.dataset.hk)
22
+ return;
23
+ let Component = mod[el.dataset.id.split("#")[1]];
24
+ let hk = el.dataset.hk;
25
+ // _$DEBUG("hydrating island", el.dataset.island, hk.slice(0, hk.length - 1) + `1-`, el);
26
+ let props = createStore({
27
+ ...JSON.parse(el.dataset.props),
28
+ get children() {
29
+ const p = el.getElementsByTagName("solid-children");
30
+ getHydrationKey();
31
+ [...p].forEach(a => {
32
+ a.__$owner = getOwner();
33
+ });
34
+ return;
35
+ }
36
+ });
37
+ map.set(el, props);
38
+ hydrate(() => createComponent(Component, props[0]), el, {
39
+ renderId: hk.slice(0, hk.length - 1) + `${1 + Number(el.dataset.offset)}-`,
40
+ owner: lookupOwner(el)
41
+ });
42
+ delete el.dataset.hk;
43
+ el.dataset.hkk = hk;
44
+ }
45
+ let queue = [];
46
+ let queued = false;
47
+ function runTaskQueue(info) {
48
+ while (info.timeRemaining() > 0 && queue.length) {
49
+ mountIsland(queue.shift());
50
+ }
51
+ if (queue.length) {
52
+ requestIdleCallback(runTaskQueue);
53
+ }
54
+ else
55
+ queued = false;
56
+ }
57
+ const hydrateIslands = () => {
58
+ const islands = document.querySelectorAll("solid-island[data-hk]");
59
+ const assets = new Set();
60
+ islands.forEach((el) => el.dataset.id && assets.add(el.dataset.id));
61
+ Promise.all([...assets].map(asset => import(/* @vite-ignore */ import.meta.env.MANIFEST["client"].chunks[asset.split("#")[0]].output.path)))
62
+ .then(() => {
63
+ islands.forEach((el) => {
64
+ if (el.dataset.when === "idle" && "requestIdleCallback" in window) {
65
+ if (!queued) {
66
+ queued = true;
67
+ requestIdleCallback(runTaskQueue);
68
+ }
69
+ queue.push(el);
70
+ }
71
+ else
72
+ mountIsland(el);
73
+ });
74
+ })
75
+ .catch(e => console.error(e));
76
+ };
77
+ function lookupOwner(el) {
78
+ const parent = el.closest("solid-children");
79
+ return parent && parent.__$owner;
80
+ }
81
+ hydrateIslands();
82
+ return;
83
+ }
84
+ return hydrate(fn, el);
85
+ }
@@ -0,0 +1,5 @@
1
+ import type { JSX } from "solid-js";
2
+ import { type MountableElement } from "solid-js/web";
3
+ import "vinxi/client";
4
+ export declare function mount(fn: () => JSX.Element, el: MountableElement): void;
5
+ export { StartClient } from "../StartClient";
@@ -0,0 +1,6 @@
1
+ import { render } from "solid-js/web";
2
+ import "vinxi/client";
3
+ export function mount(fn, el) {
4
+ render(fn, el);
5
+ }
6
+ export { StartClient } from "../StartClient";
@@ -0,0 +1,4 @@
1
+ export { GET } from "./shared/GET";
2
+ export { HttpHeader } from "./shared/HttpHeader";
3
+ export { HttpStatusCode } from "./shared/HttpStatusCode";
4
+ export { default as clientOnly } from "./shared/clientOnly";
package/dist/index.jsx ADDED
@@ -0,0 +1,5 @@
1
+ // @refresh skip
2
+ export { GET } from "./shared/GET";
3
+ export { HttpHeader } from "./shared/HttpHeader";
4
+ export { HttpStatusCode } from "./shared/HttpStatusCode";
5
+ export { default as clientOnly } from "./shared/clientOnly";
@@ -0,0 +1,18 @@
1
+ import type { FetchEvent } from "../server/types";
2
+ /** Function responsible for receiving an observable [operation]{@link Operation} and returning a [result]{@link OperationResult}. */
3
+ export type MiddlewareFn = (event: FetchEvent) => Promise<unknown> | unknown;
4
+ /** This composes an array of Exchanges into a single ExchangeIO function */
5
+ export type RequestMiddleware = (event: FetchEvent) => Response | Promise<Response> | void | Promise<void>;
6
+ type EventHandlerResponse<T = any> = T | Promise<T>;
7
+ type ResponseMiddlewareResponseParam = {
8
+ body?: Awaited<EventHandlerResponse>;
9
+ };
10
+ export type ResponseMiddleware = (event: FetchEvent, response: ResponseMiddlewareResponseParam) => Response | Promise<Response> | void | Promise<void>;
11
+ export declare function createMiddleware({ onRequest, onBeforeResponse }: {
12
+ onRequest?: RequestMiddleware | RequestMiddleware[] | undefined;
13
+ onBeforeResponse?: ResponseMiddleware | ResponseMiddleware[] | undefined;
14
+ }): {
15
+ onRequest?: import("h3")._RequestMiddleware<import("h3").EventHandlerRequest> | import("h3")._RequestMiddleware<import("h3").EventHandlerRequest>[] | undefined;
16
+ onBeforeResponse?: import("h3")._ResponseMiddleware<import("h3").EventHandlerRequest, any> | import("h3")._ResponseMiddleware<import("h3").EventHandlerRequest, any>[] | undefined;
17
+ };
18
+ export {};
@@ -0,0 +1,40 @@
1
+ import { defineMiddleware, sendWebResponse } from "vinxi/http";
2
+ import { getFetchEvent } from "../server/fetchEvent";
3
+ function wrapRequestMiddleware(onRequest) {
4
+ return async (h3Event) => {
5
+ const fetchEvent = getFetchEvent(h3Event);
6
+ const response = await onRequest(fetchEvent);
7
+ if (!response) {
8
+ return;
9
+ }
10
+ else {
11
+ sendWebResponse(h3Event, response);
12
+ }
13
+ };
14
+ }
15
+ function wrapResponseMiddleware(onBeforeResponse) {
16
+ return async (h3Event, response) => {
17
+ const fetchEvent = getFetchEvent(h3Event);
18
+ const mwResponse = await onBeforeResponse(fetchEvent, response);
19
+ if (!mwResponse) {
20
+ return;
21
+ }
22
+ else {
23
+ sendWebResponse(h3Event, mwResponse);
24
+ }
25
+ };
26
+ }
27
+ export function createMiddleware({ onRequest, onBeforeResponse }) {
28
+ return defineMiddleware({
29
+ onRequest: typeof onRequest === "function"
30
+ ? wrapRequestMiddleware(onRequest)
31
+ : Array.isArray(onRequest)
32
+ ? onRequest.map(wrapRequestMiddleware)
33
+ : undefined,
34
+ onBeforeResponse: typeof onBeforeResponse === "function"
35
+ ? wrapResponseMiddleware(onBeforeResponse)
36
+ : Array.isArray(onBeforeResponse)
37
+ ? onBeforeResponse.map(wrapResponseMiddleware)
38
+ : undefined
39
+ });
40
+ }
@@ -0,0 +1,2 @@
1
+ export declare function createRoutes(): any[];
2
+ export declare const FileRoutes: () => any[];
@@ -0,0 +1,25 @@
1
+ import { getRequestEvent, isServer } from "solid-js/web";
2
+ import lazyRoute from "./lazyRoute";
3
+ import { pageRoutes as routeConfigs } from "./routes";
4
+ export function createRoutes() {
5
+ function createRoute(route) {
6
+ return {
7
+ ...route,
8
+ ...(route.$$route ? route.$$route.require().route : undefined),
9
+ info: {
10
+ ...(route.$$route ? route.$$route.require().route.info : {}),
11
+ filesystem: true
12
+ },
13
+ component: lazyRoute(route.$component, import.meta.env.START_ISLANDS
14
+ ? import.meta.env.MANIFEST["ssr"]
15
+ : import.meta.env.MANIFEST["client"], import.meta.env.MANIFEST["ssr"]),
16
+ children: route.children ? route.children.map(createRoute) : undefined
17
+ };
18
+ }
19
+ const routes = routeConfigs.map(createRoute);
20
+ return routes;
21
+ }
22
+ let routes;
23
+ export const FileRoutes = isServer
24
+ ? () => getRequestEvent().routes
25
+ : () => routes || (routes = createRoutes());
@@ -0,0 +1,2 @@
1
+ /* @refresh skip */
2
+ export { FileRoutes } from "./FileRoutes";
@@ -0,0 +1,6 @@
1
+ import { type Component } from "solid-js";
2
+ export default function lazyRoute<T>(component: any, clientManifest: any, serverManifest: any, exported?: string): Component<T> & {
3
+ preload: () => Promise<{
4
+ default: Component<T>;
5
+ }>;
6
+ };
@@ -0,0 +1,48 @@
1
+ /// <reference types="vinxi/types/client" />
2
+ import { createComponent, lazy, onCleanup } from "solid-js";
3
+ import { appendStyles, cleanupStyles, preloadStyles, updateStyles } from "vinxi/css";
4
+ import { renderAsset } from "../server/renderAsset";
5
+ export default function lazyRoute(component, clientManifest, serverManifest, exported = "default") {
6
+ return lazy(async () => {
7
+ if (import.meta.env.DEV) {
8
+ let manifest = import.meta.env.SSR ? serverManifest : clientManifest;
9
+ const mod = await manifest.inputs[component.src].import();
10
+ if (!mod[exported])
11
+ console.error(`Module ${component.src} does not export ${exported}`);
12
+ const Component = mod[exported];
13
+ let assets = await clientManifest.inputs?.[component.src].assets();
14
+ const styles = assets.filter((asset) => asset.tag === "style");
15
+ if (typeof window !== "undefined" && import.meta.hot) {
16
+ import.meta.hot.on("css-update", data => {
17
+ updateStyles(styles, data);
18
+ });
19
+ }
20
+ const Comp = props => {
21
+ if (typeof window !== "undefined") {
22
+ appendStyles(styles);
23
+ }
24
+ onCleanup(() => {
25
+ if (typeof window !== "undefined") {
26
+ // remove style tags added by vite when a CSS file is imported
27
+ cleanupStyles(styles);
28
+ }
29
+ });
30
+ return [...assets.map((asset) => renderAsset(asset)), createComponent(Component, props)];
31
+ };
32
+ return { default: Comp };
33
+ }
34
+ else {
35
+ const mod = await component.import();
36
+ const Component = mod[exported];
37
+ let assets = await clientManifest.inputs?.[component.src].assets();
38
+ const styles = assets.filter((asset) => asset.tag === "style" || asset.attrs.rel === "stylesheet");
39
+ if (typeof window !== "undefined") {
40
+ preloadStyles(styles);
41
+ }
42
+ const Comp = props => {
43
+ return [...styles.map((asset) => renderAsset(asset)), createComponent(Component, props)];
44
+ };
45
+ return { default: Comp };
46
+ }
47
+ });
48
+ }
@@ -0,0 +1,25 @@
1
+ interface Route {
2
+ path: string;
3
+ id: string;
4
+ children?: Route[];
5
+ $component?: any;
6
+ $GET?: any;
7
+ $POST?: any;
8
+ $PUT?: any;
9
+ $PATCH?: any;
10
+ $DELETE?: any;
11
+ }
12
+ declare module "vinxi/routes" {
13
+ interface Register {
14
+ route: {
15
+ path: string;
16
+ children?: Route[];
17
+ };
18
+ }
19
+ }
20
+ export declare const pageRoutes: Route[];
21
+ export declare function matchAPIRoute(path: string, method: string): {
22
+ handler: any;
23
+ params: Record<string, any> | undefined;
24
+ } | undefined;
25
+ export {};
@@ -0,0 +1,51 @@
1
+ import { createRouter } from "radix3";
2
+ import fileRoutes from "vinxi/routes";
3
+ export const pageRoutes = defineRoutes(fileRoutes.filter(o => o.$component));
4
+ function defineRoutes(fileRoutes) {
5
+ function processRoute(routes, route, id, full) {
6
+ const parentRoute = Object.values(routes).find(o => {
7
+ return id.startsWith(o.id + "/");
8
+ });
9
+ if (!parentRoute) {
10
+ routes.push({ ...route, id, path: id.replace(/\/\([^)/]+\)/g, "").replace(/\./g, "/") });
11
+ return routes;
12
+ }
13
+ processRoute(parentRoute.children || (parentRoute.children = []), route, id.slice(parentRoute.id.length), full);
14
+ return routes;
15
+ }
16
+ return fileRoutes
17
+ .sort((a, b) => a.path.length - b.path.length)
18
+ .reduce((prevRoutes, route) => {
19
+ return processRoute(prevRoutes, route, route.path, route.path);
20
+ }, []);
21
+ }
22
+ export function matchAPIRoute(path, method) {
23
+ const match = router.lookup(path);
24
+ if (match) {
25
+ const handler = match.route[`$${method}`];
26
+ if (handler === undefined)
27
+ return;
28
+ return {
29
+ handler,
30
+ params: match.params
31
+ };
32
+ }
33
+ }
34
+ function containsHTTP(route) {
35
+ return route["$GET"] || route["$POST"] || route["$PUT"] || route["$PATCH"] || route["$DELETE"];
36
+ }
37
+ const router = createRouter({
38
+ routes: fileRoutes.reduce((memo, route) => {
39
+ if (!containsHTTP(route))
40
+ return memo;
41
+ let path = route.path.replace(/\(.*\)\/?/g, "").replace(/\*([^/]*)/g, (_, m) => `**:${m}`);
42
+ if (/:[^/]*\?/g.test(path)) {
43
+ throw new Error(`Optional parameters are not supported in API routes: ${path}`);
44
+ }
45
+ if (memo[path]) {
46
+ throw new Error(`Duplicate API routes for "${path}" found at "${memo[path].route.path}" and "${route.path}"`);
47
+ }
48
+ memo[path] = { route };
49
+ return memo;
50
+ }, {})
51
+ });
@@ -0,0 +1 @@
1
+ export declare function createServerReference(fn: Function, id: string, name: string): Function;
@@ -0,0 +1,30 @@
1
+ import { getRequestEvent } from "solid-js/web";
2
+ import { provideRequestEvent } from "solid-js/web/storage";
3
+ import { cloneEvent } from "../server/fetchEvent";
4
+ export function createServerReference(fn, id, name) {
5
+ if (typeof fn !== "function")
6
+ throw new Error("Export from a 'use server' module must be a function");
7
+ const baseURL = import.meta.env.SERVER_BASE_URL;
8
+ return new Proxy(fn, {
9
+ get(target, prop, receiver) {
10
+ if (prop === "url") {
11
+ return `${baseURL}/_server?id=${encodeURIComponent(id)}&name=${encodeURIComponent(name)}`;
12
+ }
13
+ if (prop === "GET")
14
+ return receiver;
15
+ },
16
+ apply(target, thisArg, args) {
17
+ const ogEvt = getRequestEvent();
18
+ if (!ogEvt)
19
+ throw new Error("Cannot call server function outside of a request");
20
+ const evt = cloneEvent(ogEvt);
21
+ evt.locals.serverFunctionMeta = {
22
+ id: id + "#" + name,
23
+ };
24
+ evt.serverOnly = true;
25
+ return provideRequestEvent(evt, () => {
26
+ return fn.apply(thisArg, args);
27
+ });
28
+ }
29
+ });
30
+ }
@@ -0,0 +1,2 @@
1
+ declare const _default: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<unknown>>;
2
+ export default _default;