@solidjs/start 1.2.1 → 2.0.0-alpha.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.
- package/CHANGELOG.md +14 -0
- package/README.md +2 -2
- package/dist/client/StartClient.d.ts +0 -1
- package/dist/client/StartClient.jsx +2 -4
- package/dist/client/index.d.ts +2 -3
- package/dist/client/index.jsx +2 -4
- package/dist/client/mount.d.ts +1 -7
- package/dist/client/mount.js +1 -91
- package/dist/client/spa/index.d.ts +1 -2
- package/dist/client/spa/index.jsx +1 -2
- package/dist/config/constants.d.ts +16 -0
- package/dist/config/constants.js +16 -0
- package/dist/config/dev-server.d.ts +2 -0
- package/dist/config/dev-server.js +108 -0
- package/dist/config/fs-router.d.ts +37 -0
- package/dist/config/fs-router.js +141 -0
- package/dist/config/fs-routes/fs-watcher.d.ts +3 -0
- package/dist/config/fs-routes/fs-watcher.js +49 -0
- package/dist/config/fs-routes/index.d.ts +7 -0
- package/dist/config/fs-routes/index.js +107 -0
- package/dist/config/fs-routes/router.d.ts +37 -0
- package/dist/config/fs-routes/router.js +136 -0
- package/dist/config/fs-routes/tree-shake.d.ts +2 -0
- package/dist/config/fs-routes/tree-shake.js +348 -0
- package/dist/config/index.d.ts +10 -0
- package/dist/config/index.js +214 -0
- package/dist/config/lazy.d.ts +3 -0
- package/dist/config/lazy.js +82 -0
- package/dist/config/manifest.d.ts +3 -0
- package/dist/config/manifest.js +74 -0
- package/dist/config/utils.d.ts +4 -0
- package/dist/config/utils.js +6 -0
- package/dist/config/vite-utils.d.ts +16 -0
- package/dist/config/vite-utils.js +81 -0
- package/dist/http/index.d.ts +81 -0
- package/dist/http/index.js +129 -0
- package/dist/index.d.ts +5 -5
- package/dist/index.jsx +5 -5
- package/dist/middleware/index.d.ts +6 -6
- package/dist/middleware/index.js +39 -0
- package/dist/{router/FileRoutes.js → router.jsx} +7 -8
- package/dist/server/StartServer.d.ts +3 -3
- package/dist/server/StartServer.jsx +9 -63
- package/dist/server/assets/index.d.ts +2 -0
- package/dist/server/assets/index.js +52 -0
- package/dist/server/assets/render.d.ts +19 -0
- package/dist/server/{renderAsset.jsx → assets/render.jsx} +1 -1
- package/dist/server/collect-styles.d.ts +3 -0
- package/dist/server/collect-styles.js +69 -0
- package/dist/server/fetchEvent.d.ts +4 -3
- package/dist/server/fetchEvent.js +12 -74
- package/dist/server/fetchEvent.spec.js +18 -197
- package/dist/server/handler.d.ts +6 -12
- package/dist/server/handler.js +193 -96
- package/dist/server/index.d.ts +9 -6
- package/dist/server/index.jsx +14 -6
- package/dist/server/manifest/client-manifest.d.ts +9 -0
- package/dist/server/manifest/client-manifest.js +6 -0
- package/dist/server/manifest/dev-client-manifest.d.ts +4 -0
- package/dist/server/manifest/dev-client-manifest.js +24 -0
- package/dist/server/manifest/dev-ssr-manifest.d.ts +5 -0
- package/dist/server/manifest/dev-ssr-manifest.js +23 -0
- package/dist/server/manifest/prod-client-manifest.d.ts +5 -0
- package/dist/server/manifest/prod-client-manifest.js +26 -0
- package/dist/server/manifest/prod-ssr-manifest.d.ts +6 -0
- package/dist/server/manifest/prod-ssr-manifest.js +85 -0
- package/dist/server/manifest/ssr-manifest.d.ts +4 -0
- package/dist/server/manifest/ssr-manifest.js +6 -0
- package/dist/{router → server}/routes.d.ts +5 -10
- package/dist/{router → server}/routes.js +32 -33
- package/dist/{runtime → server}/server-fns-runtime.d.ts +1 -1
- package/dist/{runtime → server}/server-fns-runtime.js +8 -7
- package/dist/server/server-functions-handler.d.ts +2 -0
- package/dist/{runtime/server-handler.js → server/server-functions-handler.js} +57 -97
- package/dist/server/server-runtime.d.ts +3 -0
- package/dist/{runtime → server}/server-runtime.js +17 -24
- package/dist/server/spa/StartServer.d.ts +1 -1
- package/dist/server/spa/StartServer.jsx +7 -9
- package/dist/server/spa/handler.d.ts +3 -3
- package/dist/server/spa/handler.js +9 -11
- package/dist/server/spa/index.d.ts +4 -3
- package/dist/server/spa/index.jsx +4 -3
- package/dist/server/types.d.ts +7 -9
- package/dist/server/util.d.ts +2 -0
- package/dist/server/util.js +8 -0
- package/dist/shared/ErrorBoundary.jsx +2 -2
- package/dist/shared/HttpHeader.jsx +4 -2
- package/dist/shared/{HttpStatusCode.jsx → HttpStatusCode.js} +3 -1
- package/dist/shared/dev-overlay/CodeView.d.ts +1 -1
- package/dist/shared/dev-overlay/CodeView.jsx +23 -34
- package/dist/shared/dev-overlay/DevOverlayDialog.d.ts +2 -2
- package/dist/shared/dev-overlay/DevOverlayDialog.jsx +73 -64
- package/dist/shared/dev-overlay/createStackFrame.js +3 -3
- package/dist/shared/dev-overlay/get-source-map.d.ts +1 -1
- package/dist/shared/dev-overlay/get-source-map.js +5 -5
- package/dist/shared/dev-overlay/icons.d.ts +10 -10
- package/dist/shared/dev-overlay/icons.jsx +91 -91
- package/dist/shared/dev-overlay/index.jsx +6 -9
- package/dist/shared/lazy.d.ts +3 -0
- package/dist/shared/lazy.js +42 -0
- package/dist/shared/serverFunction.d.ts +1 -1
- package/env.d.ts +2 -19
- package/package.json +44 -65
- package/scripts/build.js +15 -0
- package/scripts/validate-imports.js +316 -0
- package/src/client/StartClient.tsx +34 -0
- package/src/client/index.tsx +2 -0
- package/src/client/mount.ts +1 -0
- package/src/client/spa/index.tsx +9 -0
- package/src/config/constants.ts +19 -0
- package/src/config/dev-server.ts +145 -0
- package/{config/fs-router.js → src/config/fs-router.ts} +49 -29
- package/src/config/fs-routes/fs-watcher.ts +77 -0
- package/src/config/fs-routes/index.ts +136 -0
- package/src/config/fs-routes/router.ts +169 -0
- package/src/config/fs-routes/tree-shake.ts +371 -0
- package/src/config/index.ts +233 -0
- package/src/config/lazy.ts +100 -0
- package/src/config/manifest.ts +84 -0
- package/src/config/utils.ts +5 -0
- package/src/config/vite-utils.ts +109 -0
- package/src/env.d.ts +17 -0
- package/src/http/index.ts +216 -0
- package/src/index.tsx +7 -0
- package/src/internal.d.ts +14 -0
- package/src/middleware/index.ts +72 -0
- package/src/router.tsx +37 -0
- package/src/server/StartServer.tsx +56 -0
- package/src/server/assets/index.ts +70 -0
- package/src/server/assets/render.tsx +46 -0
- package/src/server/collect-styles.ts +87 -0
- package/src/server/fetchEvent.spec.ts +85 -0
- package/src/server/fetchEvent.ts +36 -0
- package/src/server/handler.ts +257 -0
- package/src/server/index.tsx +29 -0
- package/src/server/manifest/client-manifest.ts +8 -0
- package/src/server/manifest/dev-client-manifest.ts +21 -0
- package/src/server/manifest/dev-ssr-manifest.ts +23 -0
- package/src/server/manifest/prod-client-manifest.ts +21 -0
- package/src/server/manifest/prod-ssr-manifest.ts +109 -0
- package/src/server/manifest/ssr-manifest.ts +10 -0
- package/src/server/routes.ts +126 -0
- package/src/server/server-fns-runtime.ts +31 -0
- package/src/server/server-functions-handler.ts +339 -0
- package/src/server/server-runtime.ts +240 -0
- package/src/server/spa/StartServer.tsx +40 -0
- package/src/server/spa/handler.ts +29 -0
- package/src/server/spa/index.tsx +5 -0
- package/src/server/types.ts +82 -0
- package/src/server/util.ts +12 -0
- package/src/shared/ErrorBoundary.tsx +52 -0
- package/src/shared/GET.ts +8 -0
- package/src/shared/HttpHeader.tsx +42 -0
- package/src/shared/HttpStatusCode.ts +27 -0
- package/src/shared/clientOnly.ts +44 -0
- package/src/shared/dev-overlay/CodeView.tsx +92 -0
- package/src/shared/dev-overlay/DevOverlayDialog.tsx +316 -0
- package/src/shared/dev-overlay/createStackFrame.ts +74 -0
- package/src/shared/dev-overlay/download.ts +6 -0
- package/src/shared/dev-overlay/env.d.ts +4 -0
- package/src/shared/dev-overlay/get-source-map.ts +33 -0
- package/src/shared/dev-overlay/icons.tsx +456 -0
- package/src/shared/dev-overlay/index.tsx +63 -0
- package/src/shared/dev-overlay/styles.css +292 -0
- package/src/shared/lazy.ts +52 -0
- package/src/shared/serverFunction.ts +10 -0
- package/src/virtual.d.ts +27 -0
- package/tsconfig.json +23 -0
- package/vitest.config.ts +9 -0
- package/config/index.d.ts +0 -40
- package/config/index.js +0 -304
- package/config/server-components.js +0 -106
- package/dist/client/islands.d.ts +0 -7
- package/dist/client/islands.jsx +0 -10
- package/dist/middleware/index.jsx +0 -35
- package/dist/router/index.d.ts +0 -1
- package/dist/router/index.jsx +0 -2
- package/dist/router/lazyRoute.d.ts +0 -6
- package/dist/router/lazyRoute.js +0 -53
- package/dist/runtime/server-handler.d.ts +0 -2
- package/dist/runtime/server-runtime.d.ts +0 -3
- package/dist/server/islands/index.d.ts +0 -19
- package/dist/server/islands/index.jsx +0 -62
- package/dist/server/islands/utils.d.ts +0 -1
- package/dist/server/islands/utils.jsx +0 -85
- package/dist/server/pageEvent.d.ts +0 -2
- package/dist/server/pageEvent.js +0 -56
- package/dist/server/renderAsset.d.ts +0 -2
- /package/dist/{router/FileRoutes.d.ts → router.d.ts} +0 -0
- /package/dist/shared/{clientOnly.jsx → clientOnly.js} +0 -0
- /package/dist/shared/{serverFunction.jsx → serverFunction.js} +0 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# @solidjs/start
|
|
2
|
+
|
|
3
|
+
## 2.0.0-alpha.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 8256190: Rework `@solidjs/start/env`
|
|
8
|
+
- 6cbba24: Fix multiple Set-Cookie headers being lost on redirect responses
|
|
9
|
+
- d4cc548: ## Bump Seroval
|
|
10
|
+
|
|
11
|
+
- version `1.4.1`
|
|
12
|
+
|
|
13
|
+
- dd40610: Handle base url in api routes
|
|
14
|
+
- 0c8a5e2: export server types from /server
|
package/README.md
CHANGED
|
@@ -73,7 +73,7 @@ export default defineConfig({
|
|
|
73
73
|
});
|
|
74
74
|
```
|
|
75
75
|
|
|
76
|
-
Presets also include runtimes like Node.js, Bun or Deno. For example, a preset like `node-server` enables hosting on your server.
|
|
76
|
+
Presets also include runtimes like Node.js, Bun, or Deno. For example, a preset like `node-server` enables hosting on your server.
|
|
77
77
|
Learn more about [`defineConfig`](https://docs.solidjs.com/solid-start/reference/config/define-config)
|
|
78
78
|
|
|
79
79
|
## Building
|
|
@@ -89,4 +89,4 @@ After the build completes, you’ll be guided through deployment for your specif
|
|
|
89
89
|
## Contributing
|
|
90
90
|
|
|
91
91
|
- For contributing to the codebase, check [CONTRIBUTING.md](https://github.com/solidjs/solid-start/blob/main/CONTRIBUTING.md)
|
|
92
|
-
- For creating a new template, please head
|
|
92
|
+
- For creating a new template, please head over to [solidjs/templates](https://github.com/solidjs/templates)
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
// @refresh skip
|
|
2
|
-
|
|
3
|
-
import
|
|
4
|
-
import { ErrorBoundary } from "../shared/ErrorBoundary";
|
|
5
|
-
import "./mount";
|
|
2
|
+
import App from "solid-start:app";
|
|
3
|
+
import { ErrorBoundary } from "../shared/ErrorBoundary.jsx";
|
|
6
4
|
function Dummy(props) {
|
|
7
5
|
return props.children;
|
|
8
6
|
}
|
package/dist/client/index.d.ts
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
export { StartClient, StartClientTanstack } from "./StartClient";
|
|
3
|
-
export { mount } from "./mount";
|
|
1
|
+
export { mount } from "./mount.ts";
|
|
2
|
+
export { StartClient, StartClientTanstack } from "./StartClient.tsx";
|
package/dist/client/index.jsx
CHANGED
package/dist/client/mount.d.ts
CHANGED
|
@@ -1,7 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import { type MountableElement } from "solid-js/web";
|
|
3
|
-
/**
|
|
4
|
-
*
|
|
5
|
-
* Read more: https://docs.solidjs.com/solid-start/reference/client/mount
|
|
6
|
-
*/
|
|
7
|
-
export declare function mount(fn: () => JSX.Element, el: MountableElement): (() => void) | undefined;
|
|
1
|
+
export { hydrate as mount } from "solid-js/web";
|
package/dist/client/mount.js
CHANGED
|
@@ -1,91 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import { createComponent, getHydrationKey, getOwner, hydrate } from "solid-js/web";
|
|
3
|
-
/**
|
|
4
|
-
*
|
|
5
|
-
* Read more: https://docs.solidjs.com/solid-start/reference/client/mount
|
|
6
|
-
*/
|
|
7
|
-
export function mount(fn, el) {
|
|
8
|
-
if (import.meta.env.START_ISLANDS) {
|
|
9
|
-
const map = new WeakMap();
|
|
10
|
-
async function mountIsland(el) {
|
|
11
|
-
if (el.dataset.css) {
|
|
12
|
-
let css = JSON.parse(el.dataset.css);
|
|
13
|
-
for (let href of css) {
|
|
14
|
-
if (!document.querySelector(`link[href="${href}"]`)) {
|
|
15
|
-
let link = document.createElement("link");
|
|
16
|
-
link.rel = "stylesheet";
|
|
17
|
-
link.href = href;
|
|
18
|
-
document.head.appendChild(link);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
let mod = await import(
|
|
23
|
-
/* @vite-ignore */
|
|
24
|
-
import.meta.env.MANIFEST["client"].chunks[el.dataset.id.split("#")[0]].output
|
|
25
|
-
.path);
|
|
26
|
-
if (!mod || !el.dataset.hk)
|
|
27
|
-
return;
|
|
28
|
-
let Component = mod[el.dataset.id.split("#")[1]];
|
|
29
|
-
let hk = el.dataset.hk;
|
|
30
|
-
// _$DEBUG("hydrating island", el.dataset.island, hk.slice(0, hk.length - 1) + `1-`, el);
|
|
31
|
-
let props = createStore({
|
|
32
|
-
...JSON.parse(el.dataset.props),
|
|
33
|
-
get children() {
|
|
34
|
-
const p = el.getElementsByTagName("solid-children");
|
|
35
|
-
getHydrationKey();
|
|
36
|
-
[...p].forEach(a => {
|
|
37
|
-
a.__$owner = getOwner();
|
|
38
|
-
});
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
map.set(el, props);
|
|
43
|
-
hydrate(() => createComponent(Component, props[0]), el, {
|
|
44
|
-
renderId: hk.slice(0, hk.length - 1) + `${1 + Number(el.dataset.offset)}-`,
|
|
45
|
-
owner: lookupOwner(el)
|
|
46
|
-
});
|
|
47
|
-
delete el.dataset.hk;
|
|
48
|
-
el.dataset.hkk = hk;
|
|
49
|
-
}
|
|
50
|
-
let queue = [];
|
|
51
|
-
let queued = false;
|
|
52
|
-
function runTaskQueue(info) {
|
|
53
|
-
while (info.timeRemaining() > 0 && queue.length) {
|
|
54
|
-
mountIsland(queue.shift());
|
|
55
|
-
}
|
|
56
|
-
if (queue.length) {
|
|
57
|
-
requestIdleCallback(runTaskQueue);
|
|
58
|
-
}
|
|
59
|
-
else
|
|
60
|
-
queued = false;
|
|
61
|
-
}
|
|
62
|
-
const hydrateIslands = () => {
|
|
63
|
-
const islands = document.querySelectorAll("solid-island[data-hk]");
|
|
64
|
-
const assets = new Set();
|
|
65
|
-
islands.forEach((el) => el.dataset.id && assets.add(el.dataset.id));
|
|
66
|
-
Promise.all([...assets].map(asset => import(
|
|
67
|
-
/* @vite-ignore */ import.meta.env.MANIFEST["client"].chunks[asset.split("#")[0]].output.path)))
|
|
68
|
-
.then(() => {
|
|
69
|
-
islands.forEach((el) => {
|
|
70
|
-
if (el.dataset.when === "idle" && "requestIdleCallback" in window) {
|
|
71
|
-
if (!queued) {
|
|
72
|
-
queued = true;
|
|
73
|
-
requestIdleCallback(runTaskQueue);
|
|
74
|
-
}
|
|
75
|
-
queue.push(el);
|
|
76
|
-
}
|
|
77
|
-
else
|
|
78
|
-
mountIsland(el);
|
|
79
|
-
});
|
|
80
|
-
})
|
|
81
|
-
.catch(e => console.error(e));
|
|
82
|
-
};
|
|
83
|
-
function lookupOwner(el) {
|
|
84
|
-
const parent = el.closest("solid-children");
|
|
85
|
-
return parent && parent.__$owner;
|
|
86
|
-
}
|
|
87
|
-
hydrateIslands();
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
return hydrate(fn, el);
|
|
91
|
-
}
|
|
1
|
+
export { hydrate as mount } from "solid-js/web";
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { JSX } from "solid-js";
|
|
2
2
|
import { type MountableElement } from "solid-js/web";
|
|
3
|
-
import "vinxi/client";
|
|
4
3
|
export declare function mount(fn: () => JSX.Element, el: MountableElement): void;
|
|
5
|
-
export { StartClient
|
|
4
|
+
export { StartClient } from "../StartClient.tsx";
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const DEFAULT_EXTENSIONS: string[];
|
|
2
|
+
export declare const CLIENT_BASE_PATH = "_build";
|
|
3
|
+
export declare const VIRTUAL_MODULES: {
|
|
4
|
+
readonly clientViteManifest: "solid-start:client-vite-manifest";
|
|
5
|
+
readonly getClientManifest: "solid-start:get-client-manifest";
|
|
6
|
+
readonly getManifest: "solid-start:get-manifest";
|
|
7
|
+
readonly middleware: "solid-start:middleware";
|
|
8
|
+
readonly serverFnManifest: "solidstart:server-fn-manifest";
|
|
9
|
+
readonly clientEntry: "solid-start:client-entry";
|
|
10
|
+
readonly serverEntry: "solid-start:server-entry";
|
|
11
|
+
readonly app: "solid-start:app";
|
|
12
|
+
};
|
|
13
|
+
export declare const VITE_ENVIRONMENTS: {
|
|
14
|
+
client: string;
|
|
15
|
+
server: string;
|
|
16
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export const DEFAULT_EXTENSIONS = ["js", "jsx", "ts", "tsx"];
|
|
2
|
+
export const CLIENT_BASE_PATH = "_build";
|
|
3
|
+
export const VIRTUAL_MODULES = {
|
|
4
|
+
clientViteManifest: "solid-start:client-vite-manifest",
|
|
5
|
+
getClientManifest: "solid-start:get-client-manifest",
|
|
6
|
+
getManifest: "solid-start:get-manifest",
|
|
7
|
+
middleware: "solid-start:middleware",
|
|
8
|
+
serverFnManifest: "solidstart:server-fn-manifest",
|
|
9
|
+
clientEntry: "solid-start:client-entry",
|
|
10
|
+
serverEntry: "solid-start:server-entry",
|
|
11
|
+
app: "solid-start:app",
|
|
12
|
+
};
|
|
13
|
+
export const VITE_ENVIRONMENTS = {
|
|
14
|
+
client: "client",
|
|
15
|
+
server: "ssr",
|
|
16
|
+
};
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { NodeRequest, sendNodeResponse } from "srvx/node";
|
|
2
|
+
import { isRunnableDevEnvironment, } from "vite";
|
|
3
|
+
import { VITE_ENVIRONMENTS } from "./constants.js";
|
|
4
|
+
export function devServer() {
|
|
5
|
+
return [
|
|
6
|
+
{
|
|
7
|
+
name: "solid-start-dev-server",
|
|
8
|
+
configureServer(viteDevServer) {
|
|
9
|
+
globalThis.VITE_DEV_SERVER = viteDevServer;
|
|
10
|
+
return async () => {
|
|
11
|
+
if (viteDevServer.config.server.middlewareMode)
|
|
12
|
+
return;
|
|
13
|
+
const serverEnv = viteDevServer.environments[VITE_ENVIRONMENTS.server];
|
|
14
|
+
if (!serverEnv)
|
|
15
|
+
throw new Error("Server environment not found");
|
|
16
|
+
if (
|
|
17
|
+
// do not check via `isFetchableDevEnvironment` since nitro does implement the `FetchableDevEnvironment` interface but not via inheritance (which this helper checks)
|
|
18
|
+
"dispatchFetch" in serverEnv)
|
|
19
|
+
return;
|
|
20
|
+
// another plugin is controlling the dev server
|
|
21
|
+
if (!isRunnableDevEnvironment(serverEnv)) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
globalThis.USING_SOLID_START_DEV_SERVER = true;
|
|
25
|
+
removeHtmlMiddlewares(viteDevServer);
|
|
26
|
+
viteDevServer.middlewares.use(async (req, res) => {
|
|
27
|
+
if (req.originalUrl) {
|
|
28
|
+
req.url = req.originalUrl;
|
|
29
|
+
}
|
|
30
|
+
const webReq = new NodeRequest({ req, res });
|
|
31
|
+
try {
|
|
32
|
+
const serverEntry = await serverEnv.runner.import("./src/entry-server.tsx");
|
|
33
|
+
const webRes = await serverEntry.default.fetch(webReq);
|
|
34
|
+
return sendNodeResponse(res, webRes);
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
console.error(e);
|
|
38
|
+
viteDevServer.ssrFixStacktrace(e);
|
|
39
|
+
if (webReq.headers.get("content-type")?.includes("application/json")) {
|
|
40
|
+
return sendNodeResponse(res, Response.json({
|
|
41
|
+
status: 500,
|
|
42
|
+
error: "Internal Server Error",
|
|
43
|
+
message: "An unexpected error occurred. Please try again later.",
|
|
44
|
+
timestamp: new Date().toISOString(),
|
|
45
|
+
}, {
|
|
46
|
+
status: 500,
|
|
47
|
+
headers: {
|
|
48
|
+
"Content-Type": "application/json",
|
|
49
|
+
},
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
return sendNodeResponse(res, new Response(`
|
|
53
|
+
<!DOCTYPE html>
|
|
54
|
+
<html lang="en">
|
|
55
|
+
<head>
|
|
56
|
+
<meta charset="UTF-8" />
|
|
57
|
+
<title>Error</title>
|
|
58
|
+
<script type="module">
|
|
59
|
+
import { ErrorOverlay } from '/@vite/client'
|
|
60
|
+
document.body.appendChild(new ErrorOverlay(${JSON.stringify(prepareError(req, e)).replace(/</g, "\\u003c")}))
|
|
61
|
+
</script>
|
|
62
|
+
</head>
|
|
63
|
+
<body>
|
|
64
|
+
</body>
|
|
65
|
+
</html>
|
|
66
|
+
`, {
|
|
67
|
+
status: 500,
|
|
68
|
+
headers: { "Content-Type": "text/html" },
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
];
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Removes Vite internal middleware
|
|
79
|
+
*
|
|
80
|
+
* @param server
|
|
81
|
+
*/
|
|
82
|
+
function removeHtmlMiddlewares(server) {
|
|
83
|
+
const html_middlewares = [
|
|
84
|
+
"viteIndexHtmlMiddleware",
|
|
85
|
+
"vite404Middleware",
|
|
86
|
+
"viteSpaFallbackMiddleware",
|
|
87
|
+
];
|
|
88
|
+
for (let i = server.middlewares.stack.length - 1; i > 0; i--) {
|
|
89
|
+
if (html_middlewares.includes(
|
|
90
|
+
// @ts-expect-error
|
|
91
|
+
server.middlewares.stack[i].handle.name)) {
|
|
92
|
+
server.middlewares.stack.splice(i, 1);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Formats error for SSR message in error overlay
|
|
98
|
+
* @param req
|
|
99
|
+
* @param error
|
|
100
|
+
* @returns
|
|
101
|
+
*/
|
|
102
|
+
function prepareError(req, error) {
|
|
103
|
+
const e = error;
|
|
104
|
+
return {
|
|
105
|
+
message: `An error occured while server rendering ${req.url}:\n\n\t${typeof e === "string" ? e : e.message} `,
|
|
106
|
+
stack: typeof e === "string" ? "" : e.stack,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { BaseFileSystemRouter, type FileSystemRouterConfig } from "./fs-routes/router.ts";
|
|
2
|
+
export declare class SolidStartClientFileRouter extends BaseFileSystemRouter {
|
|
3
|
+
toPath(src: string): string;
|
|
4
|
+
toRoute(src: string): {
|
|
5
|
+
page: boolean;
|
|
6
|
+
$component: {
|
|
7
|
+
src: string;
|
|
8
|
+
pick: string[];
|
|
9
|
+
};
|
|
10
|
+
$$route: {
|
|
11
|
+
src: string;
|
|
12
|
+
pick: string[];
|
|
13
|
+
} | undefined;
|
|
14
|
+
path: string;
|
|
15
|
+
} | undefined;
|
|
16
|
+
}
|
|
17
|
+
export declare class SolidStartServerFileRouter extends BaseFileSystemRouter {
|
|
18
|
+
config: FileSystemRouterConfig & {
|
|
19
|
+
dataOnly?: boolean;
|
|
20
|
+
};
|
|
21
|
+
constructor(config: FileSystemRouterConfig & {
|
|
22
|
+
dataOnly?: boolean;
|
|
23
|
+
});
|
|
24
|
+
toPath(src: string): string;
|
|
25
|
+
toRoute(src: string): {
|
|
26
|
+
path: string;
|
|
27
|
+
page: boolean;
|
|
28
|
+
$component: {
|
|
29
|
+
src: string;
|
|
30
|
+
pick: string[];
|
|
31
|
+
} | undefined;
|
|
32
|
+
$$route: {
|
|
33
|
+
src: string;
|
|
34
|
+
pick: string[];
|
|
35
|
+
} | undefined;
|
|
36
|
+
} | undefined;
|
|
37
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { analyzeModule, BaseFileSystemRouter, cleanPath, } from "./fs-routes/router.js";
|
|
2
|
+
export class SolidStartClientFileRouter extends BaseFileSystemRouter {
|
|
3
|
+
toPath(src) {
|
|
4
|
+
const routePath = cleanPath(src, this.config)
|
|
5
|
+
// remove the initial slash
|
|
6
|
+
.slice(1)
|
|
7
|
+
.replace(/index$/, "")
|
|
8
|
+
.replace(/\[([^/]+)\]/g, (_, m) => {
|
|
9
|
+
if (m.length > 3 && m.startsWith("...")) {
|
|
10
|
+
return `*${m.slice(3)}`;
|
|
11
|
+
}
|
|
12
|
+
if (m.length > 2 && m.startsWith("[") && m.endsWith("]")) {
|
|
13
|
+
return `:${m.slice(1, -1)}?`;
|
|
14
|
+
}
|
|
15
|
+
return `:${m}`;
|
|
16
|
+
});
|
|
17
|
+
return routePath?.length > 0 ? `/${routePath}` : "/";
|
|
18
|
+
}
|
|
19
|
+
toRoute(src) {
|
|
20
|
+
const path = this.toPath(src);
|
|
21
|
+
if (src.endsWith(".md") || src.endsWith(".mdx")) {
|
|
22
|
+
return {
|
|
23
|
+
page: true,
|
|
24
|
+
$component: {
|
|
25
|
+
src: src,
|
|
26
|
+
pick: ["$css"],
|
|
27
|
+
},
|
|
28
|
+
$$route: undefined,
|
|
29
|
+
path,
|
|
30
|
+
// filePath: src
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const [_, exports] = analyzeModule(src);
|
|
34
|
+
const hasDefault = !!exports.find(e => e.n === "default");
|
|
35
|
+
const hasRouteConfig = !!exports.find(e => e.n === "route");
|
|
36
|
+
if (hasDefault) {
|
|
37
|
+
return {
|
|
38
|
+
page: true,
|
|
39
|
+
$component: {
|
|
40
|
+
src: src,
|
|
41
|
+
pick: [
|
|
42
|
+
...exports.filter(e => e.n === e.ln && e.n !== "route").map(e => e.n),
|
|
43
|
+
"default",
|
|
44
|
+
"$css",
|
|
45
|
+
],
|
|
46
|
+
},
|
|
47
|
+
$$route: hasRouteConfig
|
|
48
|
+
? {
|
|
49
|
+
src: src,
|
|
50
|
+
pick: ["route"],
|
|
51
|
+
}
|
|
52
|
+
: undefined,
|
|
53
|
+
path,
|
|
54
|
+
// filePath: src
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const HTTP_METHODS = ["HEAD", "GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"];
|
|
60
|
+
function createHTTPHandlers(src, exports) {
|
|
61
|
+
const handlers = {};
|
|
62
|
+
for (const exp of exports) {
|
|
63
|
+
if (HTTP_METHODS.includes(exp.n)) {
|
|
64
|
+
handlers[`$${exp.n}`] = {
|
|
65
|
+
src: src,
|
|
66
|
+
pick: [exp.n],
|
|
67
|
+
};
|
|
68
|
+
if (exp.n === "GET" && !exports.find(exp => exp.n === "HEAD")) {
|
|
69
|
+
handlers.$HEAD = {
|
|
70
|
+
src: src,
|
|
71
|
+
pick: [exp.n],
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return handlers;
|
|
77
|
+
}
|
|
78
|
+
export class SolidStartServerFileRouter extends BaseFileSystemRouter {
|
|
79
|
+
constructor(config) {
|
|
80
|
+
super(config);
|
|
81
|
+
}
|
|
82
|
+
toPath(src) {
|
|
83
|
+
const routePath = cleanPath(src, this.config)
|
|
84
|
+
// remove the initial slash
|
|
85
|
+
.slice(1)
|
|
86
|
+
.replace(/index$/, "")
|
|
87
|
+
.replace(/\[([^/]+)\]/g, (_, m) => {
|
|
88
|
+
if (m.length > 3 && m.startsWith("...")) {
|
|
89
|
+
return `*${m.slice(3)}`;
|
|
90
|
+
}
|
|
91
|
+
if (m.length > 2 && m.startsWith("[") && m.endsWith("]")) {
|
|
92
|
+
return `:${m.slice(1, -1)}?`;
|
|
93
|
+
}
|
|
94
|
+
return `:${m}`;
|
|
95
|
+
});
|
|
96
|
+
return routePath?.length > 0 ? `/${routePath}` : "/";
|
|
97
|
+
}
|
|
98
|
+
toRoute(src) {
|
|
99
|
+
const path = this.toPath(src);
|
|
100
|
+
if (src.endsWith(".md") || src.endsWith(".mdx")) {
|
|
101
|
+
return {
|
|
102
|
+
page: true,
|
|
103
|
+
$component: {
|
|
104
|
+
src: src,
|
|
105
|
+
pick: ["$css"],
|
|
106
|
+
},
|
|
107
|
+
$$route: undefined,
|
|
108
|
+
path,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
const [_, exports] = analyzeModule(src);
|
|
112
|
+
const hasRouteConfig = exports.find(e => e.n === "route");
|
|
113
|
+
const hasDefault = !!exports.find(e => e.n === "default");
|
|
114
|
+
const hasAPIRoutes = !!exports.find(exp => HTTP_METHODS.includes(exp.n));
|
|
115
|
+
if (hasDefault || hasAPIRoutes) {
|
|
116
|
+
return {
|
|
117
|
+
page: hasDefault,
|
|
118
|
+
$component: !this.config.dataOnly && hasDefault
|
|
119
|
+
? {
|
|
120
|
+
src: src,
|
|
121
|
+
pick: [
|
|
122
|
+
...exports
|
|
123
|
+
.filter(e => e.n === e.ln && e.n !== "route" && !HTTP_METHODS.includes(e.n))
|
|
124
|
+
.map(e => e.n),
|
|
125
|
+
"default",
|
|
126
|
+
"$css",
|
|
127
|
+
],
|
|
128
|
+
}
|
|
129
|
+
: undefined,
|
|
130
|
+
$$route: hasRouteConfig
|
|
131
|
+
? {
|
|
132
|
+
src: src,
|
|
133
|
+
pick: ["route"],
|
|
134
|
+
}
|
|
135
|
+
: undefined,
|
|
136
|
+
...createHTTPHandlers(src, exports),
|
|
137
|
+
path,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { moduleId } from "./index.js";
|
|
2
|
+
function setupWatcher(watcher, routes) {
|
|
3
|
+
watcher.on("unlink", path => routes.removeRoute(path));
|
|
4
|
+
watcher.on("add", path => routes.addRoute(path));
|
|
5
|
+
watcher.on("change", path => routes.updateRoute(path));
|
|
6
|
+
}
|
|
7
|
+
function createRoutesReloader(server, routes, environment) {
|
|
8
|
+
routes.addEventListener("reload", handleRoutesReload);
|
|
9
|
+
return () => routes.removeEventListener("reload", handleRoutesReload);
|
|
10
|
+
function handleRoutesReload() {
|
|
11
|
+
if (environment === "ssr") {
|
|
12
|
+
// Handle server environment HMR reload
|
|
13
|
+
const serverEnv = server.environments.server;
|
|
14
|
+
if (serverEnv && serverEnv.moduleGraph) {
|
|
15
|
+
const mod = serverEnv.moduleGraph.getModuleById(moduleId);
|
|
16
|
+
if (mod) {
|
|
17
|
+
const seen = new Set();
|
|
18
|
+
serverEnv.moduleGraph.invalidateModule(mod, seen);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
// Handle client environment HMR reload
|
|
24
|
+
const { moduleGraph } = server;
|
|
25
|
+
const mod = moduleGraph.getModuleById(moduleId);
|
|
26
|
+
if (mod) {
|
|
27
|
+
const seen = new Set();
|
|
28
|
+
moduleGraph.invalidateModule(mod, seen);
|
|
29
|
+
server.reloadModule(mod);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (!server.hot) {
|
|
33
|
+
server.ws.send({ type: "full-reload" });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export const fileSystemWatcher = (routers) => {
|
|
38
|
+
const plugin = {
|
|
39
|
+
name: "fs-watcher",
|
|
40
|
+
async configureServer(server) {
|
|
41
|
+
Object.keys(routers).forEach(environment => {
|
|
42
|
+
const router = globalThis.ROUTERS[environment];
|
|
43
|
+
setupWatcher(server.watcher, router);
|
|
44
|
+
createRoutesReloader(server, router, environment);
|
|
45
|
+
});
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
return plugin;
|
|
49
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type PluginOption } from "vite";
|
|
2
|
+
import type { BaseFileSystemRouter } from "./router.ts";
|
|
3
|
+
export declare const moduleId = "solid-start:routes";
|
|
4
|
+
export interface FsRoutesArgs {
|
|
5
|
+
routers: Record<"client" | "ssr", BaseFileSystemRouter>;
|
|
6
|
+
}
|
|
7
|
+
export declare function fsRoutes({ routers }: FsRoutesArgs): Array<PluginOption>;
|