@solidjs/start 2.0.0-alpha.0 → 2.0.0-alpha.2

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 (108) hide show
  1. package/CHANGELOG.md +28 -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/dev-server.js +10 -0
  6. package/dist/config/fs-router.js +10 -22
  7. package/dist/config/fs-routes/fs-watcher.js +4 -4
  8. package/dist/config/fs-routes/index.js +4 -6
  9. package/dist/config/fs-routes/router.js +10 -11
  10. package/dist/config/fs-routes/tree-shake.js +12 -21
  11. package/dist/config/index.js +42 -42
  12. package/dist/config/lazy.js +42 -12
  13. package/dist/config/manifest.js +4 -3
  14. package/dist/config/vite-utils.d.ts +5 -0
  15. package/dist/config/vite-utils.js +7 -3
  16. package/dist/http/index.d.ts +1 -4
  17. package/dist/http/index.js +3 -5
  18. package/dist/index.d.ts +0 -1
  19. package/dist/middleware/index.d.ts +5 -2
  20. package/dist/middleware/index.js +6 -1
  21. package/dist/router.jsx +2 -2
  22. package/dist/server/StartServer.jsx +2 -0
  23. package/dist/server/assets/PatchVirtualDevStyles.d.ts +4 -0
  24. package/dist/server/assets/PatchVirtualDevStyles.jsx +28 -0
  25. package/dist/server/assets/index.js +1 -1
  26. package/dist/server/assets/render.jsx +2 -2
  27. package/dist/server/collect-styles.js +9 -21
  28. package/dist/server/fetchEvent.spec.js +1 -1
  29. package/dist/server/handler.js +30 -15
  30. package/dist/server/index.d.ts +1 -0
  31. package/dist/server/manifest/dev-client-manifest.js +1 -1
  32. package/dist/server/manifest/dev-ssr-manifest.js +1 -1
  33. package/dist/server/manifest/prod-ssr-manifest.js +7 -12
  34. package/dist/server/routes.js +3 -3
  35. package/dist/server/server-fns-runtime.js +2 -2
  36. package/dist/server/server-functions-handler.js +6 -11
  37. package/dist/server/server-runtime.js +8 -8
  38. package/dist/server/spa/StartServer.jsx +2 -0
  39. package/dist/shared/dev-overlay/CodeView.d.ts +1 -1
  40. package/dist/shared/dev-overlay/CodeView.jsx +23 -34
  41. package/dist/shared/dev-overlay/DevOverlayDialog.jsx +4 -4
  42. package/dist/shared/dev-overlay/get-source-map.d.ts +1 -1
  43. package/dist/shared/dev-overlay/get-source-map.js +5 -5
  44. package/dist/shared/dev-overlay/icons.d.ts +10 -10
  45. package/dist/shared/dev-overlay/icons.jsx +91 -91
  46. package/dist/shared/dev-overlay/index.jsx +1 -1
  47. package/dist/shared/lazy.js +4 -2
  48. package/env.d.ts +9 -0
  49. package/package.json +5 -4
  50. package/scripts/build.js +3 -3
  51. package/scripts/validate-imports.js +8 -8
  52. package/src/client/mount.ts +1 -114
  53. package/src/config/constants.ts +3 -3
  54. package/src/config/dev-server.ts +107 -99
  55. package/src/config/fs-router.ts +140 -155
  56. package/src/config/fs-routes/fs-watcher.ts +57 -61
  57. package/src/config/fs-routes/index.ts +117 -119
  58. package/src/config/fs-routes/router.ts +12 -13
  59. package/src/config/fs-routes/tree-shake.ts +342 -363
  60. package/src/config/index.ts +42 -43
  61. package/src/config/lazy.ts +47 -16
  62. package/src/config/manifest.ts +8 -7
  63. package/src/config/vite-utils.ts +9 -9
  64. package/src/env.d.ts +10 -28
  65. package/src/http/index.ts +105 -142
  66. package/src/index.tsx +0 -12
  67. package/src/internal.d.ts +1 -1
  68. package/src/middleware/index.ts +42 -49
  69. package/src/router.tsx +4 -3
  70. package/src/server/StartServer.tsx +3 -7
  71. package/src/server/assets/PatchVirtualDevStyles.tsx +31 -0
  72. package/src/server/assets/index.ts +1 -1
  73. package/src/server/assets/render.tsx +6 -2
  74. package/src/server/collect-styles.ts +49 -73
  75. package/src/server/fetchEvent.spec.ts +71 -75
  76. package/src/server/fetchEvent.ts +17 -17
  77. package/src/server/handler.ts +138 -129
  78. package/src/server/index.tsx +13 -0
  79. package/src/server/manifest/client-manifest.ts +1 -1
  80. package/src/server/manifest/dev-client-manifest.ts +7 -5
  81. package/src/server/manifest/dev-ssr-manifest.ts +8 -6
  82. package/src/server/manifest/prod-client-manifest.ts +7 -4
  83. package/src/server/manifest/prod-ssr-manifest.ts +78 -94
  84. package/src/server/manifest/ssr-manifest.ts +4 -2
  85. package/src/server/routes.ts +96 -108
  86. package/src/server/server-fns-runtime.ts +3 -3
  87. package/src/server/server-functions-handler.ts +294 -319
  88. package/src/server/server-runtime.ts +13 -13
  89. package/src/server/spa/StartServer.tsx +2 -0
  90. package/src/server/spa/handler.ts +12 -12
  91. package/src/server/types.ts +46 -46
  92. package/src/server/util.ts +4 -4
  93. package/src/shared/ErrorBoundary.tsx +1 -1
  94. package/src/shared/HttpHeader.tsx +20 -20
  95. package/src/shared/HttpStatusCode.ts +14 -14
  96. package/src/shared/clientOnly.ts +3 -3
  97. package/src/shared/dev-overlay/CodeView.tsx +43 -46
  98. package/src/shared/dev-overlay/DevOverlayDialog.tsx +4 -4
  99. package/src/shared/dev-overlay/createStackFrame.ts +59 -62
  100. package/src/shared/dev-overlay/env.d.ts +2 -2
  101. package/src/shared/dev-overlay/get-source-map.ts +5 -7
  102. package/src/shared/dev-overlay/icons.tsx +289 -121
  103. package/src/shared/dev-overlay/index.tsx +1 -1
  104. package/src/shared/lazy.ts +4 -3
  105. package/src/shared/serverFunction.ts +1 -1
  106. package/src/virtual.d.ts +10 -10
  107. package/tsconfig.json +2 -2
  108. package/vitest.config.ts +2 -2
@@ -1,81 +1,77 @@
1
1
  import type {
2
- EnvironmentModuleNode,
3
- FSWatcher,
4
- ModuleGraph,
5
- ModuleNode,
6
- PluginOption,
7
- ViteDevServer,
2
+ EnvironmentModuleNode,
3
+ FSWatcher,
4
+ ModuleGraph,
5
+ ModuleNode,
6
+ PluginOption,
7
+ ViteDevServer,
8
8
  } from "vite";
9
9
  import { moduleId } from "./index.ts";
10
10
  import type { BaseFileSystemRouter } from "./router.ts";
11
11
 
12
12
  interface CompiledRouter {
13
- removeRoute(path: string): void;
14
- addRoute(path: string): void;
15
- updateRoute(path: string): void;
16
- addEventListener(event: "reload", handler: () => void): void;
17
- removeEventListener(event: "reload", handler: () => void): void;
13
+ removeRoute(path: string): void;
14
+ addRoute(path: string): void;
15
+ updateRoute(path: string): void;
16
+ addEventListener(event: "reload", handler: () => void): void;
17
+ removeEventListener(event: "reload", handler: () => void): void;
18
18
  }
19
19
 
20
20
  function setupWatcher(watcher: FSWatcher, routes: CompiledRouter): void {
21
- watcher.on("unlink", (path) => routes.removeRoute(path));
22
- watcher.on("add", (path) => routes.addRoute(path));
23
- watcher.on("change", (path) => routes.updateRoute(path));
21
+ watcher.on("unlink", path => routes.removeRoute(path));
22
+ watcher.on("add", path => routes.addRoute(path));
23
+ watcher.on("change", path => routes.updateRoute(path));
24
24
  }
25
25
 
26
26
  function createRoutesReloader(
27
- server: ViteDevServer,
28
- routes: CompiledRouter,
29
- environment: "client" | "ssr",
27
+ server: ViteDevServer,
28
+ routes: CompiledRouter,
29
+ environment: "client" | "ssr",
30
30
  ): () => void {
31
- routes.addEventListener("reload", handleRoutesReload);
32
- return () => routes.removeEventListener("reload", handleRoutesReload);
31
+ routes.addEventListener("reload", handleRoutesReload);
32
+ return () => routes.removeEventListener("reload", handleRoutesReload);
33
33
 
34
- function handleRoutesReload(): void {
35
- if (environment === "ssr") {
36
- // Handle server environment HMR reload
37
- const serverEnv = server.environments.server;
38
- if (serverEnv && serverEnv.moduleGraph) {
39
- const mod: EnvironmentModuleNode | undefined =
40
- serverEnv.moduleGraph.getModuleById(moduleId);
41
- if (mod) {
42
- const seen = new Set<EnvironmentModuleNode>();
43
- serverEnv.moduleGraph.invalidateModule(mod, seen);
44
- }
45
- }
46
- } else {
47
- // Handle client environment HMR reload
48
- const { moduleGraph }: { moduleGraph: ModuleGraph } = server;
49
- const mod: ModuleNode | undefined = moduleGraph.getModuleById(moduleId);
50
- if (mod) {
51
- const seen = new Set<ModuleNode>();
52
- moduleGraph.invalidateModule(mod, seen);
53
- server.reloadModule(mod);
54
- }
55
- }
34
+ function handleRoutesReload(): void {
35
+ if (environment === "ssr") {
36
+ // Handle server environment HMR reload
37
+ const serverEnv = server.environments.server;
38
+ if (serverEnv && serverEnv.moduleGraph) {
39
+ const mod: EnvironmentModuleNode | undefined =
40
+ serverEnv.moduleGraph.getModuleById(moduleId);
41
+ if (mod) {
42
+ const seen = new Set<EnvironmentModuleNode>();
43
+ serverEnv.moduleGraph.invalidateModule(mod, seen);
44
+ }
45
+ }
46
+ } else {
47
+ // Handle client environment HMR reload
48
+ const { moduleGraph }: { moduleGraph: ModuleGraph } = server;
49
+ const mod: ModuleNode | undefined = moduleGraph.getModuleById(moduleId);
50
+ if (mod) {
51
+ const seen = new Set<ModuleNode>();
52
+ moduleGraph.invalidateModule(mod, seen);
53
+ server.reloadModule(mod);
54
+ }
55
+ }
56
56
 
57
- if (!server.hot) {
58
- server.ws.send({ type: "full-reload" });
59
- }
60
- }
57
+ if (!server.hot) {
58
+ server.ws.send({ type: "full-reload" });
59
+ }
60
+ }
61
61
  }
62
62
 
63
63
  export const fileSystemWatcher = (
64
- routers: Record<"client" | "ssr", BaseFileSystemRouter>,
64
+ routers: Record<"client" | "ssr", BaseFileSystemRouter>,
65
65
  ): PluginOption => {
66
- const plugin: PluginOption = {
67
- name: "fs-watcher",
68
- async configureServer(server: ViteDevServer) {
69
- Object.keys(routers).forEach((environment) => {
70
- const router = (globalThis as any).ROUTERS[environment];
71
- setupWatcher(server.watcher, router);
72
- createRoutesReloader(
73
- server,
74
- router,
75
- environment as keyof typeof routers,
76
- );
77
- });
78
- },
79
- };
80
- return plugin;
66
+ const plugin: PluginOption = {
67
+ name: "fs-watcher",
68
+ async configureServer(server: ViteDevServer) {
69
+ Object.keys(routers).forEach(environment => {
70
+ const router = (globalThis as any).ROUTERS[environment];
71
+ setupWatcher(server.watcher, router);
72
+ createRoutesReloader(server, router, environment as keyof typeof routers);
73
+ });
74
+ },
75
+ };
76
+ return plugin;
81
77
  };
@@ -8,131 +8,129 @@ import { treeShake } from "./tree-shake.ts";
8
8
  export const moduleId = "solid-start:routes";
9
9
 
10
10
  export interface FsRoutesArgs {
11
- routers: Record<"client" | "ssr", BaseFileSystemRouter>;
11
+ routers: Record<"client" | "ssr", BaseFileSystemRouter>;
12
12
  }
13
13
 
14
14
  export function fsRoutes({ routers }: FsRoutesArgs): Array<PluginOption> {
15
- (globalThis as any).ROUTERS = routers;
16
-
17
- return [
18
- {
19
- name: "solid-start-fs-routes",
20
- enforce: "pre",
21
- resolveId(id) {
22
- if (id === moduleId) return id;
23
- },
24
- async load(id) {
25
- const root = this.environment.config.root;
26
- const isBuild = this.environment.mode === "build";
27
-
28
- if (id !== moduleId) return;
29
- const js = jsCode();
30
-
31
- const router = (globalThis as any).ROUTERS[this.environment.name];
32
-
33
- const routes = await router.getRoutes();
34
-
35
- let routesCode = JSON.stringify(routes ?? [], (k, v) => {
36
- if (v === undefined) return undefined;
37
-
38
- if (k.startsWith("$$")) {
39
- const buildId = `${v.src}?${v.pick.map((p: any) => `pick=${p}`).join("&")}`;
40
-
41
- /**
42
- * @type {{ [key: string]: string }}
43
- */
44
- const refs: Record<string, string> = {};
45
- for (var pick of v.pick) {
46
- refs[pick] = js.addNamedImport(pick, buildId);
47
- }
48
- return {
49
- require: `_$() => ({ ${Object.entries(refs)
50
- .map(([pick, namedImport]) => `'${pick}': ${namedImport}`)
51
- .join(", ")} })$_`,
52
- // src: isBuild ? relative(root, buildId) : buildId
53
- };
54
- } else if (k.startsWith("$")) {
55
- const buildId = `${v.src}?${v.pick.map((p: any) => `pick=${p}`).join("&")}`;
56
- return {
57
- src: relative(root, buildId),
58
- build: isBuild
59
- ? `_$() => import(/* @vite-ignore */ '${buildId}')$_`
60
- : undefined,
61
- import: `_$() => import(/* @vite-ignore */ '${buildId}')$_`
62
- };
63
- }
64
- return v;
65
- });
66
-
67
- routesCode = routesCode.replaceAll('"_$(', "(").replaceAll(')$_"', ")");
68
-
69
- const code = `
15
+ (globalThis as any).ROUTERS = routers;
16
+
17
+ return [
18
+ {
19
+ name: "solid-start-fs-routes",
20
+ enforce: "pre",
21
+ resolveId(id) {
22
+ if (id === moduleId) return id;
23
+ },
24
+ async load(id) {
25
+ const root = this.environment.config.root;
26
+ const isBuild = this.environment.mode === "build";
27
+
28
+ if (id !== moduleId) return;
29
+ const js = jsCode();
30
+
31
+ const router = (globalThis as any).ROUTERS[this.environment.name];
32
+
33
+ const routes = await router.getRoutes();
34
+
35
+ let routesCode = JSON.stringify(routes ?? [], (k, v) => {
36
+ if (v === undefined) return undefined;
37
+
38
+ if (k.startsWith("$$")) {
39
+ const buildId = `${v.src}?${v.pick.map((p: any) => `pick=${p}`).join("&")}`;
40
+
41
+ /**
42
+ * @type {{ [key: string]: string }}
43
+ */
44
+ const refs: Record<string, string> = {};
45
+ for (var pick of v.pick) {
46
+ refs[pick] = js.addNamedImport(pick, buildId);
47
+ }
48
+ return {
49
+ require: `_$() => ({ ${Object.entries(refs)
50
+ .map(([pick, namedImport]) => `'${pick}': ${namedImport}`)
51
+ .join(", ")} })$_`,
52
+ // src: isBuild ? relative(root, buildId) : buildId
53
+ };
54
+ } else if (k.startsWith("$")) {
55
+ const buildId = `${v.src}?${v.pick.map((p: any) => `pick=${p}`).join("&")}`;
56
+ return {
57
+ src: relative(root, buildId),
58
+ build: isBuild ? `_$() => import(/* @vite-ignore */ '${buildId}')$_` : undefined,
59
+ import: `_$() => import(/* @vite-ignore */ '${buildId}')$_`,
60
+ };
61
+ }
62
+ return v;
63
+ });
64
+
65
+ routesCode = routesCode.replaceAll('"_$(', "(").replaceAll(')$_"', ")");
66
+
67
+ const code = `
70
68
  ${js.getImportStatements()}
71
69
  export default ${routesCode}`;
72
- return code;
73
- },
74
- },
75
- treeShake(),
76
- fileSystemWatcher(routers),
77
- ];
70
+ return code;
71
+ },
72
+ },
73
+ treeShake(),
74
+ fileSystemWatcher(routers),
75
+ ];
78
76
  }
79
77
 
80
78
  function jsCode() {
81
- const imports = new Map();
82
- let vars = 0;
83
-
84
- function addImport(p: any) {
85
- let id = imports.get(p);
86
- if (!id) {
87
- id = {};
88
- imports.set(p, id);
89
- }
90
-
91
- const d = "routeData" + vars++;
92
- id["default"] = d;
93
- return d;
94
- }
95
-
96
- function addNamedImport(name: string | number, p: any) {
97
- let id = imports.get(p);
98
- if (!id) {
99
- id = {};
100
- imports.set(p, id);
101
- }
102
-
103
- const d = "routeData" + vars++;
104
- id[name] = d;
105
- return d;
106
- }
107
-
108
- const getNamedExport = (p: any) => {
109
- const id = imports.get(p);
110
-
111
- delete id["default"];
112
-
113
- return Object.keys(id).length > 0
114
- ? `{ ${Object.keys(id)
115
- .map((k) => `${k} as ${id[k]}`)
116
- .join(", ")} }`
117
- : "";
118
- };
119
-
120
- const getImportStatements = () => {
121
- return `${[...imports.keys()]
122
- .map(
123
- (i) =>
124
- `import ${
125
- imports.get(i).default
126
- ? `${imports.get(i).default}${Object.keys(imports.get(i)).length > 1 ? ", " : ""}`
127
- : ""
128
- } ${getNamedExport(i)} from '${i}';`,
129
- )
130
- .join("\n")}`;
131
- };
132
-
133
- return {
134
- addImport,
135
- addNamedImport,
136
- getImportStatements,
137
- };
79
+ const imports = new Map();
80
+ let vars = 0;
81
+
82
+ function addImport(p: any) {
83
+ let id = imports.get(p);
84
+ if (!id) {
85
+ id = {};
86
+ imports.set(p, id);
87
+ }
88
+
89
+ const d = "routeData" + vars++;
90
+ id["default"] = d;
91
+ return d;
92
+ }
93
+
94
+ function addNamedImport(name: string | number, p: any) {
95
+ let id = imports.get(p);
96
+ if (!id) {
97
+ id = {};
98
+ imports.set(p, id);
99
+ }
100
+
101
+ const d = "routeData" + vars++;
102
+ id[name] = d;
103
+ return d;
104
+ }
105
+
106
+ const getNamedExport = (p: any) => {
107
+ const id = imports.get(p);
108
+
109
+ delete id["default"];
110
+
111
+ return Object.keys(id).length > 0
112
+ ? `{ ${Object.keys(id)
113
+ .map(k => `${k} as ${id[k]}`)
114
+ .join(", ")} }`
115
+ : "";
116
+ };
117
+
118
+ const getImportStatements = () => {
119
+ return `${[...imports.keys()]
120
+ .map(
121
+ i =>
122
+ `import ${
123
+ imports.get(i).default
124
+ ? `${imports.get(i).default}${Object.keys(imports.get(i)).length > 1 ? ", " : ""}`
125
+ : ""
126
+ } ${getNamedExport(i)} from '${i}';`,
127
+ )
128
+ .join("\n")}`;
129
+ };
130
+
131
+ return {
132
+ addImport,
133
+ addNamedImport,
134
+ getImportStatements,
135
+ };
138
136
  }
@@ -1,5 +1,4 @@
1
- import { init } from "es-module-lexer";
2
- import { parse } from "es-module-lexer";
1
+ import { init, parse } from "es-module-lexer";
3
2
  import esbuild from "esbuild";
4
3
  import fg from "fast-glob";
5
4
  import fs from "fs";
@@ -7,7 +6,7 @@ import micromatch from "micromatch";
7
6
  import { posix } from "path";
8
7
  import { pathToRegexp } from "path-to-regexp";
9
8
 
10
- import { normalize } from "node:path";
9
+ import { normalizePath } from "vite";
11
10
 
12
11
  export { pathToRegexp };
13
12
 
@@ -27,9 +26,9 @@ export function analyzeModule(src: string) {
27
26
  esbuild.transformSync(fs.readFileSync(src, "utf-8"), {
28
27
  jsx: "transform",
29
28
  format: "esm",
30
- loader: "tsx"
29
+ loader: "tsx",
31
30
  }).code,
32
- src
31
+ src,
33
32
  );
34
33
  }
35
34
 
@@ -86,9 +85,9 @@ export class BaseFileSystemRouter extends EventTarget {
86
85
  return {
87
86
  $component: {
88
87
  src: src,
89
- pick: ["default", "$css"]
88
+ pick: ["default", "$css"],
90
89
  },
91
- path
90
+ path,
92
91
  // filePath: src
93
92
  };
94
93
  }
@@ -104,7 +103,7 @@ export class BaseFileSystemRouter extends EventTarget {
104
103
  }
105
104
 
106
105
  async addRoute(src: string) {
107
- src = normalize(src);
106
+ src = normalizePath(src);
108
107
  if (this.isRoute(src)) {
109
108
  try {
110
109
  const route = this.toRoute(src);
@@ -123,14 +122,14 @@ export class BaseFileSystemRouter extends EventTarget {
123
122
  new Event("reload", {
124
123
  // @ts-ignore
125
124
  detail: {
126
- route
127
- }
128
- })
125
+ route,
126
+ },
127
+ }),
129
128
  );
130
129
  }
131
130
 
132
131
  async updateRoute(src: string) {
133
- src = normalize(src);
132
+ src = normalizePath(src);
134
133
  if (this.isRoute(src)) {
135
134
  try {
136
135
  const route = this.toRoute(src);
@@ -146,7 +145,7 @@ export class BaseFileSystemRouter extends EventTarget {
146
145
  }
147
146
 
148
147
  removeRoute(src: string) {
149
- src = normalize(src);
148
+ src = normalizePath(src);
150
149
  if (this.isRoute(src)) {
151
150
  const path = this.toPath(src);
152
151
  if (path === undefined) {