@solidjs/start 1.1.7 → 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.
Files changed (185) hide show
  1. package/README.md +88 -8
  2. package/dist/client/StartClient.d.ts +0 -1
  3. package/dist/client/StartClient.jsx +2 -4
  4. package/dist/client/index.d.ts +2 -3
  5. package/dist/client/index.jsx +2 -4
  6. package/dist/client/mount.js +10 -2
  7. package/dist/client/spa/index.d.ts +1 -2
  8. package/dist/client/spa/index.jsx +1 -2
  9. package/dist/config/constants.d.ts +16 -0
  10. package/dist/config/constants.js +16 -0
  11. package/dist/config/dev-server.d.ts +2 -0
  12. package/dist/config/dev-server.js +108 -0
  13. package/dist/config/fs-router.d.ts +37 -0
  14. package/dist/config/fs-router.js +153 -0
  15. package/dist/config/fs-routes/fs-watcher.d.ts +3 -0
  16. package/dist/config/fs-routes/fs-watcher.js +49 -0
  17. package/dist/config/fs-routes/index.d.ts +7 -0
  18. package/dist/config/fs-routes/index.js +109 -0
  19. package/dist/config/fs-routes/router.d.ts +37 -0
  20. package/dist/config/fs-routes/router.js +136 -0
  21. package/dist/config/fs-routes/tree-shake.d.ts +2 -0
  22. package/dist/config/fs-routes/tree-shake.js +357 -0
  23. package/dist/config/index.d.ts +10 -0
  24. package/dist/config/index.js +217 -0
  25. package/dist/config/lazy.d.ts +3 -0
  26. package/dist/config/lazy.js +82 -0
  27. package/dist/config/manifest.d.ts +3 -0
  28. package/dist/config/manifest.js +74 -0
  29. package/dist/config/utils.d.ts +4 -0
  30. package/dist/config/utils.js +6 -0
  31. package/dist/config/vite-utils.d.ts +16 -0
  32. package/dist/config/vite-utils.js +81 -0
  33. package/dist/http/index.d.ts +84 -0
  34. package/dist/http/index.js +131 -0
  35. package/dist/index.d.ts +6 -5
  36. package/dist/index.jsx +5 -5
  37. package/dist/middleware/index.d.ts +6 -6
  38. package/dist/middleware/index.js +39 -0
  39. package/dist/{router/FileRoutes.js → router.jsx} +5 -6
  40. package/dist/server/StartServer.d.ts +3 -3
  41. package/dist/server/StartServer.jsx +9 -63
  42. package/dist/server/assets/index.d.ts +2 -0
  43. package/dist/server/assets/index.js +52 -0
  44. package/dist/server/assets/render.d.ts +19 -0
  45. package/dist/server/{renderAsset.jsx → assets/render.jsx} +1 -1
  46. package/dist/server/collect-styles.d.ts +3 -0
  47. package/dist/server/collect-styles.js +69 -0
  48. package/dist/server/fetchEvent.d.ts +4 -3
  49. package/dist/server/fetchEvent.js +12 -74
  50. package/dist/server/fetchEvent.spec.d.ts +1 -0
  51. package/dist/server/fetchEvent.spec.js +65 -0
  52. package/dist/server/handler.d.ts +6 -12
  53. package/dist/server/handler.js +180 -95
  54. package/dist/server/index.d.ts +8 -6
  55. package/dist/server/index.jsx +14 -6
  56. package/dist/server/manifest/client-manifest.d.ts +9 -0
  57. package/dist/server/manifest/client-manifest.js +6 -0
  58. package/dist/server/manifest/dev-client-manifest.d.ts +4 -0
  59. package/dist/server/manifest/dev-client-manifest.js +24 -0
  60. package/dist/server/manifest/dev-ssr-manifest.d.ts +5 -0
  61. package/dist/server/manifest/dev-ssr-manifest.js +23 -0
  62. package/dist/server/manifest/prod-client-manifest.d.ts +5 -0
  63. package/dist/server/manifest/prod-client-manifest.js +26 -0
  64. package/dist/server/manifest/prod-ssr-manifest.d.ts +6 -0
  65. package/dist/server/manifest/prod-ssr-manifest.js +90 -0
  66. package/dist/server/manifest/ssr-manifest.d.ts +4 -0
  67. package/dist/server/manifest/ssr-manifest.js +6 -0
  68. package/dist/{router → server}/routes.d.ts +6 -10
  69. package/dist/{router → server}/routes.js +35 -27
  70. package/dist/{runtime → server}/server-fns-runtime.d.ts +1 -1
  71. package/dist/{runtime → server}/server-fns-runtime.js +7 -6
  72. package/dist/server/server-functions-handler.d.ts +2 -0
  73. package/dist/{runtime/server-handler.js → server/server-functions-handler.js} +76 -103
  74. package/dist/server/server-runtime.d.ts +3 -0
  75. package/dist/{runtime → server}/server-runtime.js +9 -16
  76. package/dist/server/spa/StartServer.d.ts +1 -1
  77. package/dist/server/spa/StartServer.jsx +7 -9
  78. package/dist/server/spa/handler.d.ts +3 -3
  79. package/dist/server/spa/handler.js +9 -11
  80. package/dist/server/spa/index.d.ts +4 -3
  81. package/dist/server/spa/index.jsx +4 -3
  82. package/dist/server/types.d.ts +7 -9
  83. package/dist/server/util.d.ts +2 -0
  84. package/dist/server/util.js +8 -0
  85. package/dist/shared/ErrorBoundary.jsx +2 -2
  86. package/dist/shared/HttpHeader.jsx +4 -2
  87. package/dist/shared/{HttpStatusCode.jsx → HttpStatusCode.js} +3 -1
  88. package/dist/shared/dev-overlay/DevOverlayDialog.d.ts +2 -2
  89. package/dist/shared/dev-overlay/DevOverlayDialog.jsx +75 -66
  90. package/dist/shared/dev-overlay/createStackFrame.js +3 -3
  91. package/dist/shared/dev-overlay/index.jsx +5 -8
  92. package/dist/shared/lazy.d.ts +3 -0
  93. package/dist/shared/lazy.js +40 -0
  94. package/dist/shared/serverFunction.d.ts +1 -1
  95. package/package.json +47 -65
  96. package/scripts/build.js +15 -0
  97. package/scripts/validate-imports.js +316 -0
  98. package/src/client/StartClient.tsx +34 -0
  99. package/src/client/index.tsx +2 -0
  100. package/src/client/mount.ts +114 -0
  101. package/src/client/spa/index.tsx +9 -0
  102. package/src/config/constants.ts +19 -0
  103. package/src/config/dev-server.ts +149 -0
  104. package/src/config/fs-router.ts +177 -0
  105. package/src/config/fs-routes/fs-watcher.ts +81 -0
  106. package/src/config/fs-routes/index.ts +138 -0
  107. package/src/config/fs-routes/router.ts +169 -0
  108. package/src/config/fs-routes/tree-shake.ts +392 -0
  109. package/src/config/index.ts +236 -0
  110. package/src/config/lazy.ts +100 -0
  111. package/src/config/manifest.ts +84 -0
  112. package/src/config/utils.ts +5 -0
  113. package/src/config/vite-utils.ts +113 -0
  114. package/src/env.d.ts +35 -0
  115. package/src/http/index.ts +253 -0
  116. package/src/index.tsx +19 -0
  117. package/src/internal.d.ts +14 -0
  118. package/src/middleware/index.ts +82 -0
  119. package/src/router.tsx +36 -0
  120. package/src/server/StartServer.tsx +62 -0
  121. package/src/server/assets/index.ts +70 -0
  122. package/src/server/assets/render.tsx +42 -0
  123. package/src/server/collect-styles.ts +94 -0
  124. package/src/server/fetchEvent.spec.ts +89 -0
  125. package/src/server/fetchEvent.ts +36 -0
  126. package/src/server/handler.ts +250 -0
  127. package/src/server/index.tsx +16 -0
  128. package/src/server/manifest/client-manifest.ts +8 -0
  129. package/src/server/manifest/dev-client-manifest.ts +19 -0
  130. package/src/server/manifest/dev-ssr-manifest.ts +21 -0
  131. package/src/server/manifest/prod-client-manifest.ts +18 -0
  132. package/src/server/manifest/prod-ssr-manifest.ts +125 -0
  133. package/src/server/manifest/ssr-manifest.ts +8 -0
  134. package/src/server/routes.ts +138 -0
  135. package/src/server/server-fns-runtime.ts +31 -0
  136. package/src/server/server-functions-handler.ts +364 -0
  137. package/src/server/server-runtime.ts +240 -0
  138. package/src/server/spa/StartServer.tsx +40 -0
  139. package/src/server/spa/handler.ts +29 -0
  140. package/src/server/spa/index.tsx +5 -0
  141. package/src/server/types.ts +82 -0
  142. package/src/server/util.ts +12 -0
  143. package/src/shared/ErrorBoundary.tsx +52 -0
  144. package/src/shared/GET.ts +8 -0
  145. package/src/shared/HttpHeader.tsx +42 -0
  146. package/src/shared/HttpStatusCode.ts +27 -0
  147. package/src/shared/clientOnly.ts +44 -0
  148. package/src/shared/dev-overlay/CodeView.tsx +95 -0
  149. package/src/shared/dev-overlay/DevOverlayDialog.tsx +316 -0
  150. package/src/shared/dev-overlay/createStackFrame.ts +77 -0
  151. package/src/shared/dev-overlay/download.ts +6 -0
  152. package/src/shared/dev-overlay/env.d.ts +4 -0
  153. package/src/shared/dev-overlay/get-source-map.ts +35 -0
  154. package/src/shared/dev-overlay/icons.tsx +288 -0
  155. package/src/shared/dev-overlay/index.tsx +63 -0
  156. package/src/shared/dev-overlay/styles.css +292 -0
  157. package/src/shared/lazy.ts +51 -0
  158. package/src/shared/serverFunction.ts +10 -0
  159. package/src/virtual.d.ts +27 -0
  160. package/tsconfig.json +23 -0
  161. package/vitest.config.ts +9 -0
  162. package/config/fs-router.js +0 -142
  163. package/config/index.d.ts +0 -39
  164. package/config/index.js +0 -303
  165. package/config/server-components.js +0 -106
  166. package/dist/client/islands.d.ts +0 -7
  167. package/dist/client/islands.jsx +0 -10
  168. package/dist/middleware/index.jsx +0 -35
  169. package/dist/router/index.d.ts +0 -1
  170. package/dist/router/index.jsx +0 -2
  171. package/dist/router/lazyRoute.d.ts +0 -6
  172. package/dist/router/lazyRoute.js +0 -53
  173. package/dist/runtime/server-handler.d.ts +0 -2
  174. package/dist/runtime/server-runtime.d.ts +0 -3
  175. package/dist/server/islands/index.d.ts +0 -19
  176. package/dist/server/islands/index.jsx +0 -62
  177. package/dist/server/islands/utils.d.ts +0 -1
  178. package/dist/server/islands/utils.jsx +0 -85
  179. package/dist/server/pageEvent.d.ts +0 -2
  180. package/dist/server/pageEvent.js +0 -56
  181. package/dist/server/renderAsset.d.ts +0 -2
  182. package/env.d.ts +0 -26
  183. /package/dist/{router/FileRoutes.d.ts → router.d.ts} +0 -0
  184. /package/dist/shared/{clientOnly.jsx → clientOnly.js} +0 -0
  185. /package/dist/shared/{serverFunction.jsx → serverFunction.js} +0 -0
package/README.md CHANGED
@@ -1,12 +1,92 @@
1
- # Solid Start
1
+ <div align="center">
2
2
 
3
- This is the SolidStart framework and CLI.
3
+ [![Banner](https://assets.solidjs.com/banner?project=Start&type=core)](https://github.com/solidjs)
4
4
 
5
- The quickest way to get started:
5
+ [![Version](https://img.shields.io/npm/v/@solidjs/start.svg?style=for-the-badge&color=blue&logo=npm)](https://npmjs.com/package/@solidjs/start)
6
+ [![Downloads](https://img.shields.io/npm/dm/@solidjs/start.svg?style=for-the-badge&color=green&logo=npm)](https://npmjs.com/package/@solidjs/start)
7
+ [![Stars](https://img.shields.io/github/stars/solidjs/solid-start?style=for-the-badge&color=yellow&logo=github)](https://github.com/solidjs/solid-start)
8
+ [![Discord](https://img.shields.io/discord/722131463138705510?label=join&style=for-the-badge&color=5865F2&logo=discord&logoColor=white)](https://discord.com/invite/solidjs)
9
+ [![Reddit](https://img.shields.io/reddit/subreddit-subscribers/solidjs?label=join&style=for-the-badge&color=FF4500&logo=reddit&logoColor=white)](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
- npm init solid@latest my-app
9
- cd my-app
10
- npm install
11
- npm run dev
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,5 +1,4 @@
1
1
  import type { JSX } from "solid-js";
2
- import "./mount";
3
2
  /**
4
3
  *
5
4
  * Read more: https://docs.solidjs.com/solid-start/reference/client/start-client
@@ -1,8 +1,6 @@
1
1
  // @refresh skip
2
- // @ts-ignore
3
- import App from "#start/app";
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
  }
@@ -1,3 +1,2 @@
1
- import "vinxi/client";
2
- export { StartClient, StartClientTanstack } from "./StartClient";
3
- export { mount } from "./mount";
1
+ export { mount } from "./mount.ts";
2
+ export { StartClient, StartClientTanstack } from "./StartClient.tsx";
@@ -1,4 +1,2 @@
1
- // @refresh skip
2
- import "vinxi/client";
3
- export { StartClient, StartClientTanstack } from "./StartClient";
4
- export { mount } from "./mount";
1
+ export { mount } from "./mount.js";
2
+ export { StartClient, StartClientTanstack } from "./StartClient.jsx";
@@ -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, StartClientTanstack } from "../StartClient";
4
+ export { StartClient } from "../StartClient.tsx";
@@ -1,6 +1,5 @@
1
1
  import { render } from "solid-js/web";
2
- import "vinxi/client";
3
2
  export function mount(fn, el) {
4
3
  render(fn, el);
5
4
  }
6
- export { StartClient, StartClientTanstack } from "../StartClient";
5
+ export { StartClient } from "../StartClient.jsx";
@@ -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,2 @@
1
+ import { type PluginOption } from "vite";
2
+ export declare function devServer(): Array<PluginOption>;
@@ -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,3 @@
1
+ import type { PluginOption } from "vite";
2
+ import type { BaseFileSystemRouter } from "./router.ts";
3
+ export declare const fileSystemWatcher: (routers: Record<"client" | "ssr", BaseFileSystemRouter>) => PluginOption;
@@ -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>;