@solidjs/start 1.2.0 → 2.0.0-alpha.0
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/README.md +88 -8
- 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.js +10 -2
- 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 +153 -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 +109 -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 +357 -0
- package/dist/config/index.d.ts +10 -0
- package/dist/config/index.js +217 -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 +84 -0
- package/dist/http/index.js +131 -0
- package/dist/index.d.ts +6 -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} +5 -6
- 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 +180 -97
- package/dist/server/index.d.ts +8 -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 +90 -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 +35 -36
- package/dist/{runtime → server}/server-fns-runtime.d.ts +1 -1
- package/dist/{runtime → server}/server-fns-runtime.js +7 -6
- package/dist/server/server-functions-handler.d.ts +2 -0
- package/dist/{runtime/server-handler.js → server/server-functions-handler.js} +65 -100
- package/dist/server/server-runtime.d.ts +3 -0
- package/dist/{runtime → server}/server-runtime.js +9 -16
- 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/DevOverlayDialog.d.ts +2 -2
- package/dist/shared/dev-overlay/DevOverlayDialog.jsx +75 -66
- package/dist/shared/dev-overlay/createStackFrame.js +3 -3
- package/dist/shared/dev-overlay/index.jsx +5 -8
- package/dist/shared/lazy.d.ts +3 -0
- package/dist/shared/lazy.js +40 -0
- package/dist/shared/serverFunction.d.ts +1 -1
- package/package.json +45 -67
- 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 +114 -0
- package/src/client/spa/index.tsx +9 -0
- package/src/config/constants.ts +19 -0
- package/src/config/dev-server.ts +149 -0
- package/src/config/fs-router.ts +177 -0
- package/src/config/fs-routes/fs-watcher.ts +81 -0
- package/src/config/fs-routes/index.ts +138 -0
- package/src/config/fs-routes/router.ts +169 -0
- package/src/config/fs-routes/tree-shake.ts +392 -0
- package/src/config/index.ts +236 -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 +113 -0
- package/src/env.d.ts +35 -0
- package/src/http/index.ts +253 -0
- package/src/index.tsx +19 -0
- package/src/internal.d.ts +14 -0
- package/src/middleware/index.ts +82 -0
- package/src/router.tsx +36 -0
- package/src/server/StartServer.tsx +62 -0
- package/src/server/assets/index.ts +70 -0
- package/src/server/assets/render.tsx +42 -0
- package/src/server/collect-styles.ts +94 -0
- package/src/server/fetchEvent.spec.ts +89 -0
- package/src/server/fetchEvent.ts +36 -0
- package/src/server/handler.ts +250 -0
- package/src/server/index.tsx +16 -0
- package/src/server/manifest/client-manifest.ts +8 -0
- package/src/server/manifest/dev-client-manifest.ts +19 -0
- package/src/server/manifest/dev-ssr-manifest.ts +21 -0
- package/src/server/manifest/prod-client-manifest.ts +18 -0
- package/src/server/manifest/prod-ssr-manifest.ts +125 -0
- package/src/server/manifest/ssr-manifest.ts +8 -0
- package/src/server/routes.ts +138 -0
- package/src/server/server-fns-runtime.ts +31 -0
- package/src/server/server-functions-handler.ts +364 -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 +95 -0
- package/src/shared/dev-overlay/DevOverlayDialog.tsx +316 -0
- package/src/shared/dev-overlay/createStackFrame.ts +77 -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 +35 -0
- package/src/shared/dev-overlay/icons.tsx +288 -0
- package/src/shared/dev-overlay/index.tsx +63 -0
- package/src/shared/dev-overlay/styles.css +292 -0
- package/src/shared/lazy.ts +51 -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/fs-router.js +0 -142
- 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/env.d.ts +0 -26
- /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/README.md
CHANGED
|
@@ -1,12 +1,92 @@
|
|
|
1
|
-
|
|
1
|
+
<div align="center">
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://github.com/solidjs)
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
[](https://npmjs.com/package/@solidjs/start)
|
|
6
|
+
[](https://npmjs.com/package/@solidjs/start)
|
|
7
|
+
[](https://github.com/solidjs/solid-start)
|
|
8
|
+
[](https://discord.com/invite/solidjs)
|
|
9
|
+
[](https://reddit.com/r/solidjs)
|
|
10
|
+
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
**SolidStart** brings fine-grained reactivity fullstack with full flexibility. Built with features like unified rendering and isomorphic code execution, SolidStart enables you to create highly performant and scalable web applications.
|
|
14
|
+
|
|
15
|
+
Explore the official [documentation](https://docs.solidjs.com/solid-start) for detailed guides and examples.
|
|
16
|
+
|
|
17
|
+
## Core Features
|
|
18
|
+
|
|
19
|
+
- **All Rendering Modes**:
|
|
20
|
+
- Server-Side Rendering _(SSR)_ with sync, async, and stream [modes](https://docs.solidjs.com/solid-start/reference/server/create-handler)
|
|
21
|
+
- Client-Side Rendering _(CSR)_ with the possibility of being page/component [scoped](https://docs.solidjs.com/solid-start/reference/client/client-only)
|
|
22
|
+
- Static Site Generation _(SSG)_ with route [pre-rendering](https://docs.solidjs.com/solid-start/building-your-application/route-prerendering)
|
|
23
|
+
- **TypeScript**: Full integration for robust, type-safe development
|
|
24
|
+
- **File-Based Routing**: Intuitive routing based on your project’s file structure
|
|
25
|
+
- **API Routes**: Dedicated server-side endpoints for seamless API development
|
|
26
|
+
- **Streaming**: Efficient data rendering for faster page loads
|
|
27
|
+
- **Build Optimizations**: Code splitting, tree shaking, and dead code elimination
|
|
28
|
+
- **Deployment Adapters**: Easily deploy to platforms like Vercel, Netlify, Cloudflare, and more
|
|
29
|
+
|
|
30
|
+
## Getting Started
|
|
31
|
+
|
|
32
|
+
### Installation
|
|
33
|
+
|
|
34
|
+
Create a SolidStart template project with your preferred package manager
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
# using npm
|
|
38
|
+
npm create solid@latest -- -s
|
|
39
|
+
```
|
|
6
40
|
|
|
7
41
|
```bash
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
```
|
|
42
|
+
# using pnpm
|
|
43
|
+
pnpm create solid@latest -s
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
# using bun
|
|
48
|
+
bun create solid@latest --s
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Project Structure
|
|
52
|
+
|
|
53
|
+
- `public/`: Static assets like icons, images, and fonts
|
|
54
|
+
- `src/`: Core application (aliased to `~/`)
|
|
55
|
+
- `routes/`: File-based routing for pages and APIs
|
|
56
|
+
- `app.tsx`: Root component of your application
|
|
57
|
+
- `entry-client.tsx`: Handles client-side hydration
|
|
58
|
+
- `entry-server.tsx`: Manages server-side request handling
|
|
59
|
+
- **Configuration Files**: `app.config.ts`, `package.json`, and more
|
|
60
|
+
|
|
61
|
+
Learn more about [routing](https://docs.solidjs.com/solid-start/building-your-application/routing)
|
|
62
|
+
|
|
63
|
+
## Adapters
|
|
64
|
+
|
|
65
|
+
Configure adapters in `app.config.ts` to deploy to platforms like Vercel, Netlify, Cloudflare, and others
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
import { defineConfig } from "@solidjs/start/config";
|
|
69
|
+
|
|
70
|
+
export default defineConfig({
|
|
71
|
+
ssr: true, // false for client-side rendering only
|
|
72
|
+
server: { preset: "netlify" },
|
|
73
|
+
});
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Presets also include runtimes like Node.js, Bun, or Deno. For example, a preset like `node-server` enables hosting on your server.
|
|
77
|
+
Learn more about [`defineConfig`](https://docs.solidjs.com/solid-start/reference/config/define-config)
|
|
78
|
+
|
|
79
|
+
## Building
|
|
80
|
+
|
|
81
|
+
Generate production-ready bundles
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
npm run build # or pnpm build or bun build
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
After the build completes, you’ll be guided through deployment for your specific preset.
|
|
88
|
+
|
|
89
|
+
## Contributing
|
|
90
|
+
|
|
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 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.js
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
2
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
3
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
4
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
5
|
+
});
|
|
6
|
+
}
|
|
7
|
+
return path;
|
|
8
|
+
};
|
|
1
9
|
import { createStore } from "solid-js/store";
|
|
2
10
|
import { createComponent, getHydrationKey, getOwner, hydrate } from "solid-js/web";
|
|
3
11
|
/**
|
|
@@ -19,10 +27,10 @@ export function mount(fn, el) {
|
|
|
19
27
|
}
|
|
20
28
|
}
|
|
21
29
|
}
|
|
22
|
-
let mod = await import(
|
|
30
|
+
let mod = await import(__rewriteRelativeImportExtension(
|
|
23
31
|
/* @vite-ignore */
|
|
24
32
|
import.meta.env.MANIFEST["client"].chunks[el.dataset.id.split("#")[0]].output
|
|
25
|
-
.path);
|
|
33
|
+
.path, true));
|
|
26
34
|
if (!mod || !el.dataset.hk)
|
|
27
35
|
return;
|
|
28
36
|
let Component = mod[el.dataset.id.split("#")[1]];
|
|
@@ -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,153 @@
|
|
|
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
|
|
43
|
+
.filter((e) => e.n === e.ln && e.n !== "route")
|
|
44
|
+
.map((e) => e.n),
|
|
45
|
+
"default",
|
|
46
|
+
"$css",
|
|
47
|
+
],
|
|
48
|
+
},
|
|
49
|
+
$$route: hasRouteConfig
|
|
50
|
+
? {
|
|
51
|
+
src: src,
|
|
52
|
+
pick: ["route"],
|
|
53
|
+
}
|
|
54
|
+
: undefined,
|
|
55
|
+
path,
|
|
56
|
+
// filePath: src
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const HTTP_METHODS = [
|
|
62
|
+
"HEAD",
|
|
63
|
+
"GET",
|
|
64
|
+
"POST",
|
|
65
|
+
"PUT",
|
|
66
|
+
"DELETE",
|
|
67
|
+
"PATCH",
|
|
68
|
+
"OPTIONS",
|
|
69
|
+
];
|
|
70
|
+
function createHTTPHandlers(src, exports) {
|
|
71
|
+
const handlers = {};
|
|
72
|
+
for (const exp of exports) {
|
|
73
|
+
if (HTTP_METHODS.includes(exp.n)) {
|
|
74
|
+
handlers[`$${exp.n}`] = {
|
|
75
|
+
src: src,
|
|
76
|
+
pick: [exp.n],
|
|
77
|
+
};
|
|
78
|
+
if (exp.n === "GET" && !exports.find((exp) => exp.n === "HEAD")) {
|
|
79
|
+
handlers.$HEAD = {
|
|
80
|
+
src: src,
|
|
81
|
+
pick: [exp.n],
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return handlers;
|
|
87
|
+
}
|
|
88
|
+
export class SolidStartServerFileRouter extends BaseFileSystemRouter {
|
|
89
|
+
constructor(config) {
|
|
90
|
+
super(config);
|
|
91
|
+
}
|
|
92
|
+
toPath(src) {
|
|
93
|
+
const routePath = cleanPath(src, this.config)
|
|
94
|
+
// remove the initial slash
|
|
95
|
+
.slice(1)
|
|
96
|
+
.replace(/index$/, "")
|
|
97
|
+
.replace(/\[([^/]+)\]/g, (_, m) => {
|
|
98
|
+
if (m.length > 3 && m.startsWith("...")) {
|
|
99
|
+
return `*${m.slice(3)}`;
|
|
100
|
+
}
|
|
101
|
+
if (m.length > 2 && m.startsWith("[") && m.endsWith("]")) {
|
|
102
|
+
return `:${m.slice(1, -1)}?`;
|
|
103
|
+
}
|
|
104
|
+
return `:${m}`;
|
|
105
|
+
});
|
|
106
|
+
return routePath?.length > 0 ? `/${routePath}` : "/";
|
|
107
|
+
}
|
|
108
|
+
toRoute(src) {
|
|
109
|
+
const path = this.toPath(src);
|
|
110
|
+
if (src.endsWith(".md") || src.endsWith(".mdx")) {
|
|
111
|
+
return {
|
|
112
|
+
page: true,
|
|
113
|
+
$component: {
|
|
114
|
+
src: src,
|
|
115
|
+
pick: ["$css"],
|
|
116
|
+
},
|
|
117
|
+
$$route: undefined,
|
|
118
|
+
path,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
const [_, exports] = analyzeModule(src);
|
|
122
|
+
const hasRouteConfig = exports.find((e) => e.n === "route");
|
|
123
|
+
const hasDefault = !!exports.find((e) => e.n === "default");
|
|
124
|
+
const hasAPIRoutes = !!exports.find((exp) => HTTP_METHODS.includes(exp.n));
|
|
125
|
+
if (hasDefault || hasAPIRoutes) {
|
|
126
|
+
return {
|
|
127
|
+
page: hasDefault,
|
|
128
|
+
$component: !this.config.dataOnly && hasDefault
|
|
129
|
+
? {
|
|
130
|
+
src: src,
|
|
131
|
+
pick: [
|
|
132
|
+
...exports
|
|
133
|
+
.filter((e) => e.n === e.ln &&
|
|
134
|
+
e.n !== "route" &&
|
|
135
|
+
!HTTP_METHODS.includes(e.n))
|
|
136
|
+
.map((e) => e.n),
|
|
137
|
+
"default",
|
|
138
|
+
"$css",
|
|
139
|
+
],
|
|
140
|
+
}
|
|
141
|
+
: undefined,
|
|
142
|
+
$$route: hasRouteConfig
|
|
143
|
+
? {
|
|
144
|
+
src: src,
|
|
145
|
+
pick: ["route"],
|
|
146
|
+
}
|
|
147
|
+
: undefined,
|
|
148
|
+
...createHTTPHandlers(src, exports),
|
|
149
|
+
path,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
@@ -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>;
|