@solidjs/start 2.0.0-alpha.0 → 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 (96) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/client/mount.d.ts +1 -7
  3. package/dist/client/mount.js +1 -99
  4. package/dist/config/constants.js +2 -2
  5. package/dist/config/fs-router.js +10 -22
  6. package/dist/config/fs-routes/fs-watcher.js +4 -4
  7. package/dist/config/fs-routes/index.js +4 -6
  8. package/dist/config/fs-routes/router.js +5 -5
  9. package/dist/config/fs-routes/tree-shake.js +12 -21
  10. package/dist/config/index.js +33 -36
  11. package/dist/config/lazy.js +9 -9
  12. package/dist/config/manifest.js +1 -1
  13. package/dist/http/index.d.ts +1 -4
  14. package/dist/http/index.js +3 -5
  15. package/dist/index.d.ts +0 -1
  16. package/dist/router.jsx +2 -2
  17. package/dist/server/assets/index.js +1 -1
  18. package/dist/server/assets/render.jsx +2 -2
  19. package/dist/server/fetchEvent.spec.js +1 -1
  20. package/dist/server/handler.js +29 -15
  21. package/dist/server/index.d.ts +1 -0
  22. package/dist/server/manifest/dev-client-manifest.js +1 -1
  23. package/dist/server/manifest/dev-ssr-manifest.js +1 -1
  24. package/dist/server/manifest/prod-ssr-manifest.js +7 -12
  25. package/dist/server/routes.js +3 -3
  26. package/dist/server/server-fns-runtime.js +2 -2
  27. package/dist/server/server-functions-handler.js +6 -11
  28. package/dist/server/server-runtime.js +8 -8
  29. package/dist/shared/dev-overlay/CodeView.d.ts +1 -1
  30. package/dist/shared/dev-overlay/CodeView.jsx +23 -34
  31. package/dist/shared/dev-overlay/DevOverlayDialog.jsx +4 -4
  32. package/dist/shared/dev-overlay/get-source-map.d.ts +1 -1
  33. package/dist/shared/dev-overlay/get-source-map.js +5 -5
  34. package/dist/shared/dev-overlay/icons.d.ts +10 -10
  35. package/dist/shared/dev-overlay/icons.jsx +91 -91
  36. package/dist/shared/dev-overlay/index.jsx +1 -1
  37. package/dist/shared/lazy.js +4 -2
  38. package/env.d.ts +9 -0
  39. package/package.json +5 -4
  40. package/scripts/build.js +3 -3
  41. package/scripts/validate-imports.js +8 -8
  42. package/src/client/mount.ts +1 -114
  43. package/src/config/constants.ts +3 -3
  44. package/src/config/dev-server.ts +95 -99
  45. package/src/config/fs-router.ts +140 -155
  46. package/src/config/fs-routes/fs-watcher.ts +57 -61
  47. package/src/config/fs-routes/index.ts +117 -119
  48. package/src/config/fs-routes/router.ts +7 -7
  49. package/src/config/fs-routes/tree-shake.ts +342 -363
  50. package/src/config/index.ts +36 -39
  51. package/src/config/lazy.ts +13 -13
  52. package/src/config/manifest.ts +5 -5
  53. package/src/config/vite-utils.ts +2 -6
  54. package/src/env.d.ts +10 -28
  55. package/src/http/index.ts +105 -142
  56. package/src/index.tsx +0 -12
  57. package/src/internal.d.ts +1 -1
  58. package/src/middleware/index.ts +39 -49
  59. package/src/router.tsx +4 -3
  60. package/src/server/StartServer.tsx +1 -7
  61. package/src/server/assets/index.ts +1 -1
  62. package/src/server/assets/render.tsx +6 -2
  63. package/src/server/collect-styles.ts +63 -70
  64. package/src/server/fetchEvent.spec.ts +71 -75
  65. package/src/server/fetchEvent.ts +17 -17
  66. package/src/server/handler.ts +136 -129
  67. package/src/server/index.tsx +13 -0
  68. package/src/server/manifest/client-manifest.ts +1 -1
  69. package/src/server/manifest/dev-client-manifest.ts +7 -5
  70. package/src/server/manifest/dev-ssr-manifest.ts +8 -6
  71. package/src/server/manifest/prod-client-manifest.ts +7 -4
  72. package/src/server/manifest/prod-ssr-manifest.ts +78 -94
  73. package/src/server/manifest/ssr-manifest.ts +4 -2
  74. package/src/server/routes.ts +96 -108
  75. package/src/server/server-fns-runtime.ts +3 -3
  76. package/src/server/server-functions-handler.ts +294 -319
  77. package/src/server/server-runtime.ts +13 -13
  78. package/src/server/spa/handler.ts +12 -12
  79. package/src/server/types.ts +46 -46
  80. package/src/server/util.ts +4 -4
  81. package/src/shared/ErrorBoundary.tsx +1 -1
  82. package/src/shared/HttpHeader.tsx +20 -20
  83. package/src/shared/HttpStatusCode.ts +14 -14
  84. package/src/shared/clientOnly.ts +3 -3
  85. package/src/shared/dev-overlay/CodeView.tsx +43 -46
  86. package/src/shared/dev-overlay/DevOverlayDialog.tsx +4 -4
  87. package/src/shared/dev-overlay/createStackFrame.ts +59 -62
  88. package/src/shared/dev-overlay/env.d.ts +2 -2
  89. package/src/shared/dev-overlay/get-source-map.ts +5 -7
  90. package/src/shared/dev-overlay/icons.tsx +289 -121
  91. package/src/shared/dev-overlay/index.tsx +1 -1
  92. package/src/shared/lazy.ts +4 -3
  93. package/src/shared/serverFunction.ts +1 -1
  94. package/src/virtual.d.ts +10 -10
  95. package/tsconfig.json +2 -2
  96. package/vitest.config.ts +2 -2
@@ -1,84 +1,80 @@
1
1
  import { NodeRequest, sendNodeResponse } from "srvx/node";
2
2
  import {
3
- type Connect,
4
- isRunnableDevEnvironment,
5
- type PluginOption,
6
- type ViteDevServer,
3
+ type Connect,
4
+ isRunnableDevEnvironment,
5
+ type PluginOption,
6
+ type ViteDevServer,
7
7
  } from "vite";
8
8
  import { VITE_ENVIRONMENTS } from "./constants.ts";
9
9
 
10
10
  export function devServer(): Array<PluginOption> {
11
- return [
12
- {
13
- name: "solid-start-dev-server",
14
- configureServer(viteDevServer) {
15
- (globalThis as any).VITE_DEV_SERVER = viteDevServer;
16
- return async () => {
17
- if (viteDevServer.config.server.middlewareMode) return
11
+ return [
12
+ {
13
+ name: "solid-start-dev-server",
14
+ configureServer(viteDevServer) {
15
+ (globalThis as any).VITE_DEV_SERVER = viteDevServer;
16
+ return async () => {
17
+ if (viteDevServer.config.server.middlewareMode) return;
18
18
 
19
- const serverEnv =
20
- viteDevServer.environments[VITE_ENVIRONMENTS.server];
19
+ const serverEnv = viteDevServer.environments[VITE_ENVIRONMENTS.server];
21
20
 
22
- if (!serverEnv) throw new Error("Server environment not found");
23
- if (
24
- // do not check via `isFetchableDevEnvironment` since nitro does implement the `FetchableDevEnvironment` interface but not via inheritance (which this helper checks)
25
- "dispatchFetch" in serverEnv
26
- )
27
- return;
28
- // another plugin is controlling the dev server
29
- if (!isRunnableDevEnvironment(serverEnv)) {
21
+ if (!serverEnv) throw new Error("Server environment not found");
22
+ if (
23
+ // do not check via `isFetchableDevEnvironment` since nitro does implement the `FetchableDevEnvironment` interface but not via inheritance (which this helper checks)
24
+ "dispatchFetch" in serverEnv
25
+ )
30
26
  return;
31
- }
27
+ // another plugin is controlling the dev server
28
+ if (!isRunnableDevEnvironment(serverEnv)) {
29
+ return;
30
+ }
32
31
 
33
32
  globalThis.USING_SOLID_START_DEV_SERVER = true;
34
33
 
35
- removeHtmlMiddlewares(viteDevServer);
34
+ removeHtmlMiddlewares(viteDevServer);
36
35
 
37
- viteDevServer.middlewares.use(async (req, res) => {
38
- if (req.originalUrl) {
39
- req.url = req.originalUrl;
40
- }
41
- const webReq = new NodeRequest({ req, res });
36
+ viteDevServer.middlewares.use(async (req, res) => {
37
+ if (req.originalUrl) {
38
+ req.url = req.originalUrl;
39
+ }
40
+ const webReq = new NodeRequest({ req, res });
42
41
 
43
- try {
44
- const serverEntry: {
45
- default: { fetch: (req: Request) => Promise<Response> };
46
- } = await serverEnv.runner.import("./src/entry-server.tsx");
42
+ try {
43
+ const serverEntry: {
44
+ default: { fetch: (req: Request) => Promise<Response> };
45
+ } = await serverEnv.runner.import("./src/entry-server.tsx");
47
46
 
48
- const webRes = await serverEntry.default.fetch(webReq);
47
+ const webRes = await serverEntry.default.fetch(webReq);
49
48
 
50
- return sendNodeResponse(res, webRes);
51
- } catch (e: unknown) {
52
- console.error(e);
53
- viteDevServer.ssrFixStacktrace(e as Error);
49
+ return sendNodeResponse(res, webRes);
50
+ } catch (e: unknown) {
51
+ console.error(e);
52
+ viteDevServer.ssrFixStacktrace(e as Error);
54
53
 
55
- if (
56
- webReq.headers.get("content-type")?.includes("application/json")
57
- ) {
58
- return sendNodeResponse(
59
- res,
60
- Response.json(
61
- {
62
- status: 500,
63
- error: "Internal Server Error",
64
- message:
65
- "An unexpected error occurred. Please try again later.",
66
- timestamp: new Date().toISOString(),
67
- },
68
- {
69
- status: 500,
70
- headers: {
71
- "Content-Type": "application/json",
72
- },
73
- },
74
- ),
75
- );
76
- }
54
+ if (webReq.headers.get("content-type")?.includes("application/json")) {
55
+ return sendNodeResponse(
56
+ res,
57
+ Response.json(
58
+ {
59
+ status: 500,
60
+ error: "Internal Server Error",
61
+ message: "An unexpected error occurred. Please try again later.",
62
+ timestamp: new Date().toISOString(),
63
+ },
64
+ {
65
+ status: 500,
66
+ headers: {
67
+ "Content-Type": "application/json",
68
+ },
69
+ },
70
+ ),
71
+ );
72
+ }
77
73
 
78
- return sendNodeResponse(
79
- res,
80
- new Response(
81
- `
74
+ return sendNodeResponse(
75
+ res,
76
+ new Response(
77
+ `
82
78
  <!DOCTYPE html>
83
79
  <html lang="en">
84
80
  <head>
@@ -87,26 +83,26 @@ export function devServer(): Array<PluginOption> {
87
83
  <script type="module">
88
84
  import { ErrorOverlay } from '/@vite/client'
89
85
  document.body.appendChild(new ErrorOverlay(${JSON.stringify(
90
- prepareError(req, e),
91
- ).replace(/</g, "\\u003c")}))
86
+ prepareError(req, e),
87
+ ).replace(/</g, "\\u003c")}))
92
88
  </script>
93
89
  </head>
94
90
  <body>
95
91
  </body>
96
92
  </html>
97
93
  `,
98
- {
99
- status: 500,
100
- headers: { "Content-Type": "text/html" },
101
- },
102
- ),
103
- );
104
- }
105
- });
106
- };
107
- },
108
- },
109
- ];
94
+ {
95
+ status: 500,
96
+ headers: { "Content-Type": "text/html" },
97
+ },
98
+ ),
99
+ );
100
+ }
101
+ });
102
+ };
103
+ },
104
+ },
105
+ ];
110
106
  }
111
107
 
112
108
  /**
@@ -115,21 +111,21 @@ export function devServer(): Array<PluginOption> {
115
111
  * @param server
116
112
  */
117
113
  function removeHtmlMiddlewares(server: ViteDevServer) {
118
- const html_middlewares = [
119
- "viteIndexHtmlMiddleware",
120
- "vite404Middleware",
121
- "viteSpaFallbackMiddleware",
122
- ];
123
- for (let i = server.middlewares.stack.length - 1; i > 0; i--) {
124
- if (
125
- html_middlewares.includes(
126
- // @ts-expect-error
127
- server.middlewares.stack[i].handle.name,
128
- )
129
- ) {
130
- server.middlewares.stack.splice(i, 1);
131
- }
132
- }
114
+ const html_middlewares = [
115
+ "viteIndexHtmlMiddleware",
116
+ "vite404Middleware",
117
+ "viteSpaFallbackMiddleware",
118
+ ];
119
+ for (let i = server.middlewares.stack.length - 1; i > 0; i--) {
120
+ if (
121
+ html_middlewares.includes(
122
+ // @ts-expect-error
123
+ server.middlewares.stack[i].handle.name,
124
+ )
125
+ ) {
126
+ server.middlewares.stack.splice(i, 1);
127
+ }
128
+ }
133
129
  }
134
130
 
135
131
  /**
@@ -139,11 +135,11 @@ function removeHtmlMiddlewares(server: ViteDevServer) {
139
135
  * @returns
140
136
  */
141
137
  function prepareError(req: Connect.IncomingMessage, error: unknown) {
142
- const e = error as Error;
143
- return {
144
- message: `An error occured while server rendering ${req.url}:\n\n\t${
145
- typeof e === "string" ? e : e.message
146
- } `,
147
- stack: typeof e === "string" ? "" : e.stack,
148
- };
138
+ const e = error as Error;
139
+ return {
140
+ message: `An error occured while server rendering ${req.url}:\n\n\t${
141
+ typeof e === "string" ? e : e.message
142
+ } `,
143
+ stack: typeof e === "string" ? "" : e.stack,
144
+ };
149
145
  }
@@ -1,177 +1,162 @@
1
1
  import type { ExportSpecifier } from "es-module-lexer";
2
2
  import {
3
- analyzeModule,
4
- BaseFileSystemRouter,
5
- cleanPath,
6
- type FileSystemRouterConfig,
3
+ analyzeModule,
4
+ BaseFileSystemRouter,
5
+ cleanPath,
6
+ type FileSystemRouterConfig,
7
7
  } from "./fs-routes/router.ts";
8
8
 
9
9
  export class SolidStartClientFileRouter extends BaseFileSystemRouter {
10
- toPath(src: string) {
11
- const routePath = cleanPath(src, this.config)
12
- // remove the initial slash
13
- .slice(1)
14
- .replace(/index$/, "")
15
- .replace(/\[([^/]+)\]/g, (_, m) => {
16
- if (m.length > 3 && m.startsWith("...")) {
17
- return `*${m.slice(3)}`;
18
- }
19
- if (m.length > 2 && m.startsWith("[") && m.endsWith("]")) {
20
- return `:${m.slice(1, -1)}?`;
21
- }
22
- return `:${m}`;
23
- });
10
+ toPath(src: string) {
11
+ const routePath = cleanPath(src, this.config)
12
+ // remove the initial slash
13
+ .slice(1)
14
+ .replace(/index$/, "")
15
+ .replace(/\[([^/]+)\]/g, (_, m) => {
16
+ if (m.length > 3 && m.startsWith("...")) {
17
+ return `*${m.slice(3)}`;
18
+ }
19
+ if (m.length > 2 && m.startsWith("[") && m.endsWith("]")) {
20
+ return `:${m.slice(1, -1)}?`;
21
+ }
22
+ return `:${m}`;
23
+ });
24
24
 
25
- return routePath?.length > 0 ? `/${routePath}` : "/";
26
- }
25
+ return routePath?.length > 0 ? `/${routePath}` : "/";
26
+ }
27
27
 
28
- toRoute(src: string) {
29
- const path = this.toPath(src);
28
+ toRoute(src: string) {
29
+ const path = this.toPath(src);
30
30
 
31
- if (src.endsWith(".md") || src.endsWith(".mdx")) {
32
- return {
33
- page: true,
34
- $component: {
35
- src: src,
36
- pick: ["$css"],
37
- },
38
- $$route: undefined,
39
- path,
40
- // filePath: src
41
- };
42
- }
31
+ if (src.endsWith(".md") || src.endsWith(".mdx")) {
32
+ return {
33
+ page: true,
34
+ $component: {
35
+ src: src,
36
+ pick: ["$css"],
37
+ },
38
+ $$route: undefined,
39
+ path,
40
+ // filePath: src
41
+ };
42
+ }
43
43
 
44
- const [_, exports] = analyzeModule(src);
45
- const hasDefault = !!exports.find((e) => e.n === "default");
46
- const hasRouteConfig = !!exports.find((e) => e.n === "route");
47
- if (hasDefault) {
48
- return {
49
- page: true,
50
- $component: {
51
- src: src,
52
- pick: [
53
- ...exports
54
- .filter((e) => e.n === e.ln && e.n !== "route")
55
- .map((e) => e.n),
56
- "default",
57
- "$css",
58
- ],
59
- },
60
- $$route: hasRouteConfig
61
- ? {
62
- src: src,
63
- pick: ["route"],
64
- }
65
- : undefined,
66
- path,
67
- // filePath: src
68
- };
69
- }
70
- }
44
+ const [_, exports] = analyzeModule(src);
45
+ const hasDefault = !!exports.find(e => e.n === "default");
46
+ const hasRouteConfig = !!exports.find(e => e.n === "route");
47
+ if (hasDefault) {
48
+ return {
49
+ page: true,
50
+ $component: {
51
+ src: src,
52
+ pick: [
53
+ ...exports.filter(e => e.n === e.ln && e.n !== "route").map(e => e.n),
54
+ "default",
55
+ "$css",
56
+ ],
57
+ },
58
+ $$route: hasRouteConfig
59
+ ? {
60
+ src: src,
61
+ pick: ["route"],
62
+ }
63
+ : undefined,
64
+ path,
65
+ // filePath: src
66
+ };
67
+ }
68
+ }
71
69
  }
72
70
 
73
- const HTTP_METHODS = [
74
- "HEAD",
75
- "GET",
76
- "POST",
77
- "PUT",
78
- "DELETE",
79
- "PATCH",
80
- "OPTIONS",
81
- ];
71
+ const HTTP_METHODS = ["HEAD", "GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"];
82
72
  function createHTTPHandlers(src: string, exports: readonly ExportSpecifier[]) {
83
- const handlers: Record<string, any> = {};
84
- for (const exp of exports) {
85
- if (HTTP_METHODS.includes(exp.n)) {
86
- handlers[`$${exp.n}`] = {
87
- src: src,
88
- pick: [exp.n],
89
- };
90
- if (exp.n === "GET" && !exports.find((exp) => exp.n === "HEAD")) {
91
- handlers.$HEAD = {
92
- src: src,
93
- pick: [exp.n],
94
- };
95
- }
96
- }
97
- }
73
+ const handlers: Record<string, any> = {};
74
+ for (const exp of exports) {
75
+ if (HTTP_METHODS.includes(exp.n)) {
76
+ handlers[`$${exp.n}`] = {
77
+ src: src,
78
+ pick: [exp.n],
79
+ };
80
+ if (exp.n === "GET" && !exports.find(exp => exp.n === "HEAD")) {
81
+ handlers.$HEAD = {
82
+ src: src,
83
+ pick: [exp.n],
84
+ };
85
+ }
86
+ }
87
+ }
98
88
 
99
- return handlers;
89
+ return handlers;
100
90
  }
101
91
 
102
92
  export class SolidStartServerFileRouter extends BaseFileSystemRouter {
103
- declare config: FileSystemRouterConfig & { dataOnly?: boolean };
93
+ declare config: FileSystemRouterConfig & { dataOnly?: boolean };
104
94
 
105
- constructor(config: FileSystemRouterConfig & { dataOnly?: boolean }) {
106
- super(config);
107
- }
95
+ constructor(config: FileSystemRouterConfig & { dataOnly?: boolean }) {
96
+ super(config);
97
+ }
108
98
 
109
- toPath(src: string) {
110
- const routePath = cleanPath(src, this.config)
111
- // remove the initial slash
112
- .slice(1)
113
- .replace(/index$/, "")
114
- .replace(/\[([^/]+)\]/g, (_, m) => {
115
- if (m.length > 3 && m.startsWith("...")) {
116
- return `*${m.slice(3)}`;
117
- }
118
- if (m.length > 2 && m.startsWith("[") && m.endsWith("]")) {
119
- return `:${m.slice(1, -1)}?`;
120
- }
121
- return `:${m}`;
122
- });
99
+ toPath(src: string) {
100
+ const routePath = cleanPath(src, this.config)
101
+ // remove the initial slash
102
+ .slice(1)
103
+ .replace(/index$/, "")
104
+ .replace(/\[([^/]+)\]/g, (_, m) => {
105
+ if (m.length > 3 && m.startsWith("...")) {
106
+ return `*${m.slice(3)}`;
107
+ }
108
+ if (m.length > 2 && m.startsWith("[") && m.endsWith("]")) {
109
+ return `:${m.slice(1, -1)}?`;
110
+ }
111
+ return `:${m}`;
112
+ });
123
113
 
124
- return routePath?.length > 0 ? `/${routePath}` : "/";
125
- }
114
+ return routePath?.length > 0 ? `/${routePath}` : "/";
115
+ }
126
116
 
127
- toRoute(src: string) {
128
- const path = this.toPath(src);
129
- if (src.endsWith(".md") || src.endsWith(".mdx")) {
130
- return {
131
- page: true,
132
- $component: {
133
- src: src,
134
- pick: ["$css"],
135
- },
136
- $$route: undefined,
137
- path,
138
- };
139
- }
117
+ toRoute(src: string) {
118
+ const path = this.toPath(src);
119
+ if (src.endsWith(".md") || src.endsWith(".mdx")) {
120
+ return {
121
+ page: true,
122
+ $component: {
123
+ src: src,
124
+ pick: ["$css"],
125
+ },
126
+ $$route: undefined,
127
+ path,
128
+ };
129
+ }
140
130
 
141
- const [_, exports] = analyzeModule(src);
142
- const hasRouteConfig = exports.find((e) => e.n === "route");
143
- const hasDefault = !!exports.find((e) => e.n === "default");
144
- const hasAPIRoutes = !!exports.find((exp) => HTTP_METHODS.includes(exp.n));
145
- if (hasDefault || hasAPIRoutes) {
146
- return {
147
- page: hasDefault,
148
- $component:
149
- !this.config.dataOnly && hasDefault
150
- ? {
151
- src: src,
152
- pick: [
153
- ...exports
154
- .filter(
155
- (e) =>
156
- e.n === e.ln &&
157
- e.n !== "route" &&
158
- !HTTP_METHODS.includes(e.n),
159
- )
160
- .map((e) => e.n),
161
- "default",
162
- "$css",
163
- ],
164
- }
165
- : undefined,
166
- $$route: hasRouteConfig
167
- ? {
168
- src: src,
169
- pick: ["route"],
170
- }
171
- : undefined,
172
- ...createHTTPHandlers(src, exports),
173
- path,
174
- };
175
- }
176
- }
131
+ const [_, exports] = analyzeModule(src);
132
+ const hasRouteConfig = exports.find(e => e.n === "route");
133
+ const hasDefault = !!exports.find(e => e.n === "default");
134
+ const hasAPIRoutes = !!exports.find(exp => HTTP_METHODS.includes(exp.n));
135
+ if (hasDefault || hasAPIRoutes) {
136
+ return {
137
+ page: hasDefault,
138
+ $component:
139
+ !this.config.dataOnly && hasDefault
140
+ ? {
141
+ src: src,
142
+ pick: [
143
+ ...exports
144
+ .filter(e => e.n === e.ln && e.n !== "route" && !HTTP_METHODS.includes(e.n))
145
+ .map(e => e.n),
146
+ "default",
147
+ "$css",
148
+ ],
149
+ }
150
+ : undefined,
151
+ $$route: hasRouteConfig
152
+ ? {
153
+ src: src,
154
+ pick: ["route"],
155
+ }
156
+ : undefined,
157
+ ...createHTTPHandlers(src, exports),
158
+ path,
159
+ };
160
+ }
161
+ }
177
162
  }