@solidjs/start 0.7.1 → 0.7.3
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.
- package/config/index.js +4 -4
- package/config/server-components.js +1 -1
- package/dist/client/StartClient.d.ts +3 -0
- package/{client/StartClient.tsx → dist/client/StartClient.jsx} +4 -9
- package/{client/index.tsx → dist/client/index.d.ts} +0 -1
- package/dist/client/index.jsx +4 -0
- package/dist/client/islands.d.ts +3 -0
- package/{client/islands.ts → dist/client/islands.jsx} +1 -1
- package/dist/client/mount.d.ts +3 -0
- package/dist/client/mount.js +85 -0
- package/dist/client/spa/index.d.ts +5 -0
- package/dist/client/spa/index.jsx +6 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.jsx +5 -0
- package/dist/middleware/index.d.ts +18 -0
- package/dist/middleware/index.js +40 -0
- package/dist/router/FileRoutes.d.ts +2 -0
- package/dist/router/FileRoutes.js +25 -0
- package/dist/router/index.jsx +2 -0
- package/dist/router/lazyRoute.d.ts +6 -0
- package/dist/router/lazyRoute.js +48 -0
- package/dist/router/routes.d.ts +25 -0
- package/dist/router/routes.js +51 -0
- package/dist/runtime/server-fns-runtime.d.ts +1 -0
- package/dist/runtime/server-fns-runtime.js +30 -0
- package/dist/runtime/server-handler.d.ts +2 -0
- package/dist/runtime/server-handler.js +242 -0
- package/dist/runtime/server-runtime.d.ts +3 -0
- package/dist/runtime/server-runtime.js +185 -0
- package/dist/server/StartServer.d.ts +5 -0
- package/dist/server/StartServer.jsx +78 -0
- package/dist/server/fetchEvent.d.ts +6 -0
- package/dist/server/fetchEvent.js +88 -0
- package/dist/server/handler.d.ts +3 -0
- package/dist/server/handler.js +98 -0
- package/dist/server/index.jsx +5 -0
- package/dist/server/islands/index.d.ts +19 -0
- package/dist/server/islands/index.jsx +62 -0
- package/dist/server/islands/utils.d.ts +1 -0
- package/dist/server/islands/utils.jsx +85 -0
- package/dist/server/pageEvent.d.ts +2 -0
- package/dist/server/pageEvent.js +43 -0
- package/dist/server/renderAsset.d.ts +2 -0
- package/dist/server/renderAsset.jsx +13 -0
- package/dist/server/serverFunction.d.ts +2 -0
- package/dist/server/serverFunction.jsx +4 -0
- package/dist/server/spa/StartServer.d.ts +5 -0
- package/dist/server/spa/StartServer.jsx +18 -0
- package/dist/server/spa/handler.d.ts +3 -0
- package/dist/server/spa/handler.js +17 -0
- package/{server/spa/index.tsx → dist/server/spa/index.d.ts} +0 -1
- package/dist/server/spa/index.jsx +4 -0
- package/dist/server/types.d.ts +79 -0
- package/dist/server/types.js +1 -0
- package/dist/shared/ErrorBoundary.d.ts +2 -0
- package/dist/shared/ErrorBoundary.jsx +16 -0
- package/dist/shared/GET.d.ts +1 -0
- package/dist/shared/GET.js +5 -0
- package/dist/shared/HttpHeader.d.ts +6 -0
- package/dist/shared/HttpHeader.jsx +32 -0
- package/dist/shared/HttpStatusCode.d.ts +5 -0
- package/dist/shared/HttpStatusCode.jsx +12 -0
- package/dist/shared/clientOnly.d.ts +6 -0
- package/dist/shared/clientOnly.jsx +19 -0
- package/dist/shared/dev-overlay/CodeView.d.ts +7 -0
- package/dist/shared/dev-overlay/CodeView.jsx +71 -0
- package/dist/shared/dev-overlay/DevOverlayDialog.d.ts +9 -0
- package/dist/shared/dev-overlay/DevOverlayDialog.jsx +209 -0
- package/dist/shared/dev-overlay/createStackFrame.d.ts +9 -0
- package/dist/shared/dev-overlay/createStackFrame.js +56 -0
- package/dist/shared/dev-overlay/download.d.ts +1 -0
- package/dist/shared/dev-overlay/download.js +6 -0
- package/dist/shared/dev-overlay/get-source-map.d.ts +2 -0
- package/dist/shared/dev-overlay/get-source-map.js +25 -0
- package/dist/shared/dev-overlay/icons.d.ts +28 -0
- package/{shared/dev-overlay/icons.tsx → dist/shared/dev-overlay/icons.jsx} +35 -173
- package/dist/shared/dev-overlay/index.d.ts +5 -0
- package/dist/shared/dev-overlay/index.jsx +42 -0
- package/package.json +22 -23
- package/client/mount.ts +0 -99
- package/client/spa/index.tsx +0 -10
- package/config/server-fns-runtime.ts +0 -28
- package/config/server-handler.ts +0 -261
- package/config/server-runtime.ts +0 -229
- package/middleware/index.ts +0 -70
- package/router/FileRoutes.ts +0 -35
- package/router/lazyRoute.ts +0 -55
- package/router/routes.ts +0 -87
- package/server/StartServer.tsx +0 -126
- package/server/fetchEvent.ts +0 -113
- package/server/handler.ts +0 -112
- package/server/islands/index.tsx +0 -103
- package/server/islands/utils.tsx +0 -89
- package/server/pageEvent.ts +0 -50
- package/server/renderAsset.tsx +0 -23
- package/server/serverFunction.tsx +0 -6
- package/server/spa/StartServer.tsx +0 -52
- package/server/spa/handler.ts +0 -24
- package/server/types.ts +0 -81
- package/shared/ErrorBoundary.tsx +0 -23
- package/shared/GET.ts +0 -5
- package/shared/HttpHeader.tsx +0 -35
- package/shared/HttpStatusCode.tsx +0 -19
- package/shared/clientOnly.tsx +0 -29
- package/shared/dev-overlay/CodeView.tsx +0 -95
- package/shared/dev-overlay/DevOverlayDialog.tsx +0 -280
- package/shared/dev-overlay/createStackFrame.ts +0 -77
- package/shared/dev-overlay/download.ts +0 -6
- package/shared/dev-overlay/env.d.ts +0 -4
- package/shared/dev-overlay/get-source-map.ts +0 -35
- package/shared/dev-overlay/index.tsx +0 -61
- package/shared/index.ts +0 -5
- /package/{router/index.ts → dist/router/index.d.ts} +0 -0
- /package/{server/index.tsx → dist/server/index.d.ts} +0 -0
- /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("
|
|
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("
|
|
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("
|
|
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("
|
|
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("
|
|
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"],
|
|
@@ -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
|
-
|
|
9
|
-
return props.children;
|
|
6
|
+
function Dummy(props) {
|
|
7
|
+
return props.children;
|
|
10
8
|
}
|
|
11
|
-
|
|
12
9
|
export function StartClient() {
|
|
13
|
-
|
|
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
|
}
|
|
@@ -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
|
+
}
|
package/dist/index.d.ts
ADDED
package/dist/index.jsx
ADDED
|
@@ -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.js";
|
|
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,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,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
|
+
}
|