@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,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
  }
@@ -27,9 +27,9 @@ export function analyzeModule(src: string) {
27
27
  esbuild.transformSync(fs.readFileSync(src, "utf-8"), {
28
28
  jsx: "transform",
29
29
  format: "esm",
30
- loader: "tsx"
30
+ loader: "tsx",
31
31
  }).code,
32
- src
32
+ src,
33
33
  );
34
34
  }
35
35
 
@@ -86,9 +86,9 @@ export class BaseFileSystemRouter extends EventTarget {
86
86
  return {
87
87
  $component: {
88
88
  src: src,
89
- pick: ["default", "$css"]
89
+ pick: ["default", "$css"],
90
90
  },
91
- path
91
+ path,
92
92
  // filePath: src
93
93
  };
94
94
  }
@@ -123,9 +123,9 @@ export class BaseFileSystemRouter extends EventTarget {
123
123
  new Event("reload", {
124
124
  // @ts-ignore
125
125
  detail: {
126
- route
127
- }
128
- })
126
+ route,
127
+ },
128
+ }),
129
129
  );
130
130
  }
131
131