@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.
Files changed (191) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +2 -2
  3. package/dist/client/StartClient.d.ts +0 -1
  4. package/dist/client/StartClient.jsx +2 -4
  5. package/dist/client/index.d.ts +2 -3
  6. package/dist/client/index.jsx +2 -4
  7. package/dist/client/mount.d.ts +1 -7
  8. package/dist/client/mount.js +1 -91
  9. package/dist/client/spa/index.d.ts +1 -2
  10. package/dist/client/spa/index.jsx +1 -2
  11. package/dist/config/constants.d.ts +16 -0
  12. package/dist/config/constants.js +16 -0
  13. package/dist/config/dev-server.d.ts +2 -0
  14. package/dist/config/dev-server.js +108 -0
  15. package/dist/config/fs-router.d.ts +37 -0
  16. package/dist/config/fs-router.js +141 -0
  17. package/dist/config/fs-routes/fs-watcher.d.ts +3 -0
  18. package/dist/config/fs-routes/fs-watcher.js +49 -0
  19. package/dist/config/fs-routes/index.d.ts +7 -0
  20. package/dist/config/fs-routes/index.js +107 -0
  21. package/dist/config/fs-routes/router.d.ts +37 -0
  22. package/dist/config/fs-routes/router.js +136 -0
  23. package/dist/config/fs-routes/tree-shake.d.ts +2 -0
  24. package/dist/config/fs-routes/tree-shake.js +348 -0
  25. package/dist/config/index.d.ts +10 -0
  26. package/dist/config/index.js +214 -0
  27. package/dist/config/lazy.d.ts +3 -0
  28. package/dist/config/lazy.js +82 -0
  29. package/dist/config/manifest.d.ts +3 -0
  30. package/dist/config/manifest.js +74 -0
  31. package/dist/config/utils.d.ts +4 -0
  32. package/dist/config/utils.js +6 -0
  33. package/dist/config/vite-utils.d.ts +16 -0
  34. package/dist/config/vite-utils.js +81 -0
  35. package/dist/http/index.d.ts +81 -0
  36. package/dist/http/index.js +129 -0
  37. package/dist/index.d.ts +5 -5
  38. package/dist/index.jsx +5 -5
  39. package/dist/middleware/index.d.ts +6 -6
  40. package/dist/middleware/index.js +39 -0
  41. package/dist/{router/FileRoutes.js → router.jsx} +7 -8
  42. package/dist/server/StartServer.d.ts +3 -3
  43. package/dist/server/StartServer.jsx +9 -63
  44. package/dist/server/assets/index.d.ts +2 -0
  45. package/dist/server/assets/index.js +52 -0
  46. package/dist/server/assets/render.d.ts +19 -0
  47. package/dist/server/{renderAsset.jsx → assets/render.jsx} +1 -1
  48. package/dist/server/collect-styles.d.ts +3 -0
  49. package/dist/server/collect-styles.js +69 -0
  50. package/dist/server/fetchEvent.d.ts +4 -3
  51. package/dist/server/fetchEvent.js +12 -74
  52. package/dist/server/fetchEvent.spec.js +18 -197
  53. package/dist/server/handler.d.ts +6 -12
  54. package/dist/server/handler.js +193 -96
  55. package/dist/server/index.d.ts +9 -6
  56. package/dist/server/index.jsx +14 -6
  57. package/dist/server/manifest/client-manifest.d.ts +9 -0
  58. package/dist/server/manifest/client-manifest.js +6 -0
  59. package/dist/server/manifest/dev-client-manifest.d.ts +4 -0
  60. package/dist/server/manifest/dev-client-manifest.js +24 -0
  61. package/dist/server/manifest/dev-ssr-manifest.d.ts +5 -0
  62. package/dist/server/manifest/dev-ssr-manifest.js +23 -0
  63. package/dist/server/manifest/prod-client-manifest.d.ts +5 -0
  64. package/dist/server/manifest/prod-client-manifest.js +26 -0
  65. package/dist/server/manifest/prod-ssr-manifest.d.ts +6 -0
  66. package/dist/server/manifest/prod-ssr-manifest.js +85 -0
  67. package/dist/server/manifest/ssr-manifest.d.ts +4 -0
  68. package/dist/server/manifest/ssr-manifest.js +6 -0
  69. package/dist/{router → server}/routes.d.ts +5 -10
  70. package/dist/{router → server}/routes.js +32 -33
  71. package/dist/{runtime → server}/server-fns-runtime.d.ts +1 -1
  72. package/dist/{runtime → server}/server-fns-runtime.js +8 -7
  73. package/dist/server/server-functions-handler.d.ts +2 -0
  74. package/dist/{runtime/server-handler.js → server/server-functions-handler.js} +57 -97
  75. package/dist/server/server-runtime.d.ts +3 -0
  76. package/dist/{runtime → server}/server-runtime.js +17 -24
  77. package/dist/server/spa/StartServer.d.ts +1 -1
  78. package/dist/server/spa/StartServer.jsx +7 -9
  79. package/dist/server/spa/handler.d.ts +3 -3
  80. package/dist/server/spa/handler.js +9 -11
  81. package/dist/server/spa/index.d.ts +4 -3
  82. package/dist/server/spa/index.jsx +4 -3
  83. package/dist/server/types.d.ts +7 -9
  84. package/dist/server/util.d.ts +2 -0
  85. package/dist/server/util.js +8 -0
  86. package/dist/shared/ErrorBoundary.jsx +2 -2
  87. package/dist/shared/HttpHeader.jsx +4 -2
  88. package/dist/shared/{HttpStatusCode.jsx → HttpStatusCode.js} +3 -1
  89. package/dist/shared/dev-overlay/CodeView.d.ts +1 -1
  90. package/dist/shared/dev-overlay/CodeView.jsx +23 -34
  91. package/dist/shared/dev-overlay/DevOverlayDialog.d.ts +2 -2
  92. package/dist/shared/dev-overlay/DevOverlayDialog.jsx +73 -64
  93. package/dist/shared/dev-overlay/createStackFrame.js +3 -3
  94. package/dist/shared/dev-overlay/get-source-map.d.ts +1 -1
  95. package/dist/shared/dev-overlay/get-source-map.js +5 -5
  96. package/dist/shared/dev-overlay/icons.d.ts +10 -10
  97. package/dist/shared/dev-overlay/icons.jsx +91 -91
  98. package/dist/shared/dev-overlay/index.jsx +6 -9
  99. package/dist/shared/lazy.d.ts +3 -0
  100. package/dist/shared/lazy.js +42 -0
  101. package/dist/shared/serverFunction.d.ts +1 -1
  102. package/env.d.ts +2 -19
  103. package/package.json +44 -65
  104. package/scripts/build.js +15 -0
  105. package/scripts/validate-imports.js +316 -0
  106. package/src/client/StartClient.tsx +34 -0
  107. package/src/client/index.tsx +2 -0
  108. package/src/client/mount.ts +1 -0
  109. package/src/client/spa/index.tsx +9 -0
  110. package/src/config/constants.ts +19 -0
  111. package/src/config/dev-server.ts +145 -0
  112. package/{config/fs-router.js → src/config/fs-router.ts} +49 -29
  113. package/src/config/fs-routes/fs-watcher.ts +77 -0
  114. package/src/config/fs-routes/index.ts +136 -0
  115. package/src/config/fs-routes/router.ts +169 -0
  116. package/src/config/fs-routes/tree-shake.ts +371 -0
  117. package/src/config/index.ts +233 -0
  118. package/src/config/lazy.ts +100 -0
  119. package/src/config/manifest.ts +84 -0
  120. package/src/config/utils.ts +5 -0
  121. package/src/config/vite-utils.ts +109 -0
  122. package/src/env.d.ts +17 -0
  123. package/src/http/index.ts +216 -0
  124. package/src/index.tsx +7 -0
  125. package/src/internal.d.ts +14 -0
  126. package/src/middleware/index.ts +72 -0
  127. package/src/router.tsx +37 -0
  128. package/src/server/StartServer.tsx +56 -0
  129. package/src/server/assets/index.ts +70 -0
  130. package/src/server/assets/render.tsx +46 -0
  131. package/src/server/collect-styles.ts +87 -0
  132. package/src/server/fetchEvent.spec.ts +85 -0
  133. package/src/server/fetchEvent.ts +36 -0
  134. package/src/server/handler.ts +257 -0
  135. package/src/server/index.tsx +29 -0
  136. package/src/server/manifest/client-manifest.ts +8 -0
  137. package/src/server/manifest/dev-client-manifest.ts +21 -0
  138. package/src/server/manifest/dev-ssr-manifest.ts +23 -0
  139. package/src/server/manifest/prod-client-manifest.ts +21 -0
  140. package/src/server/manifest/prod-ssr-manifest.ts +109 -0
  141. package/src/server/manifest/ssr-manifest.ts +10 -0
  142. package/src/server/routes.ts +126 -0
  143. package/src/server/server-fns-runtime.ts +31 -0
  144. package/src/server/server-functions-handler.ts +339 -0
  145. package/src/server/server-runtime.ts +240 -0
  146. package/src/server/spa/StartServer.tsx +40 -0
  147. package/src/server/spa/handler.ts +29 -0
  148. package/src/server/spa/index.tsx +5 -0
  149. package/src/server/types.ts +82 -0
  150. package/src/server/util.ts +12 -0
  151. package/src/shared/ErrorBoundary.tsx +52 -0
  152. package/src/shared/GET.ts +8 -0
  153. package/src/shared/HttpHeader.tsx +42 -0
  154. package/src/shared/HttpStatusCode.ts +27 -0
  155. package/src/shared/clientOnly.ts +44 -0
  156. package/src/shared/dev-overlay/CodeView.tsx +92 -0
  157. package/src/shared/dev-overlay/DevOverlayDialog.tsx +316 -0
  158. package/src/shared/dev-overlay/createStackFrame.ts +74 -0
  159. package/src/shared/dev-overlay/download.ts +6 -0
  160. package/src/shared/dev-overlay/env.d.ts +4 -0
  161. package/src/shared/dev-overlay/get-source-map.ts +33 -0
  162. package/src/shared/dev-overlay/icons.tsx +456 -0
  163. package/src/shared/dev-overlay/index.tsx +63 -0
  164. package/src/shared/dev-overlay/styles.css +292 -0
  165. package/src/shared/lazy.ts +52 -0
  166. package/src/shared/serverFunction.ts +10 -0
  167. package/src/virtual.d.ts +27 -0
  168. package/tsconfig.json +23 -0
  169. package/vitest.config.ts +9 -0
  170. package/config/index.d.ts +0 -40
  171. package/config/index.js +0 -304
  172. package/config/server-components.js +0 -106
  173. package/dist/client/islands.d.ts +0 -7
  174. package/dist/client/islands.jsx +0 -10
  175. package/dist/middleware/index.jsx +0 -35
  176. package/dist/router/index.d.ts +0 -1
  177. package/dist/router/index.jsx +0 -2
  178. package/dist/router/lazyRoute.d.ts +0 -6
  179. package/dist/router/lazyRoute.js +0 -53
  180. package/dist/runtime/server-handler.d.ts +0 -2
  181. package/dist/runtime/server-runtime.d.ts +0 -3
  182. package/dist/server/islands/index.d.ts +0 -19
  183. package/dist/server/islands/index.jsx +0 -62
  184. package/dist/server/islands/utils.d.ts +0 -1
  185. package/dist/server/islands/utils.jsx +0 -85
  186. package/dist/server/pageEvent.d.ts +0 -2
  187. package/dist/server/pageEvent.js +0 -56
  188. package/dist/server/renderAsset.d.ts +0 -2
  189. /package/dist/{router/FileRoutes.d.ts → router.d.ts} +0 -0
  190. /package/dist/shared/{clientOnly.jsx → clientOnly.js} +0 -0
  191. /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 on to [solidjs/templates](https://github.com/solidjs/templates)
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,7 +1 @@
1
- import type { JSX } from "solid-js";
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";
@@ -1,91 +1 @@
1
- import { createStore } from "solid-js/store";
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, 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,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,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>;