@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.
- package/CHANGELOG.md +28 -0
- package/dist/client/mount.d.ts +1 -7
- package/dist/client/mount.js +1 -99
- package/dist/config/constants.js +2 -2
- package/dist/config/dev-server.js +10 -0
- package/dist/config/fs-router.js +10 -22
- package/dist/config/fs-routes/fs-watcher.js +4 -4
- package/dist/config/fs-routes/index.js +4 -6
- package/dist/config/fs-routes/router.js +10 -11
- package/dist/config/fs-routes/tree-shake.js +12 -21
- package/dist/config/index.js +42 -42
- package/dist/config/lazy.js +42 -12
- package/dist/config/manifest.js +4 -3
- package/dist/config/vite-utils.d.ts +5 -0
- package/dist/config/vite-utils.js +7 -3
- package/dist/http/index.d.ts +1 -4
- package/dist/http/index.js +3 -5
- package/dist/index.d.ts +0 -1
- package/dist/middleware/index.d.ts +5 -2
- package/dist/middleware/index.js +6 -1
- package/dist/router.jsx +2 -2
- package/dist/server/StartServer.jsx +2 -0
- package/dist/server/assets/PatchVirtualDevStyles.d.ts +4 -0
- package/dist/server/assets/PatchVirtualDevStyles.jsx +28 -0
- package/dist/server/assets/index.js +1 -1
- package/dist/server/assets/render.jsx +2 -2
- package/dist/server/collect-styles.js +9 -21
- package/dist/server/fetchEvent.spec.js +1 -1
- package/dist/server/handler.js +30 -15
- package/dist/server/index.d.ts +1 -0
- package/dist/server/manifest/dev-client-manifest.js +1 -1
- package/dist/server/manifest/dev-ssr-manifest.js +1 -1
- package/dist/server/manifest/prod-ssr-manifest.js +7 -12
- package/dist/server/routes.js +3 -3
- package/dist/server/server-fns-runtime.js +2 -2
- package/dist/server/server-functions-handler.js +6 -11
- package/dist/server/server-runtime.js +8 -8
- package/dist/server/spa/StartServer.jsx +2 -0
- package/dist/shared/dev-overlay/CodeView.d.ts +1 -1
- package/dist/shared/dev-overlay/CodeView.jsx +23 -34
- package/dist/shared/dev-overlay/DevOverlayDialog.jsx +4 -4
- package/dist/shared/dev-overlay/get-source-map.d.ts +1 -1
- package/dist/shared/dev-overlay/get-source-map.js +5 -5
- package/dist/shared/dev-overlay/icons.d.ts +10 -10
- package/dist/shared/dev-overlay/icons.jsx +91 -91
- package/dist/shared/dev-overlay/index.jsx +1 -1
- package/dist/shared/lazy.js +4 -2
- package/env.d.ts +9 -0
- package/package.json +5 -4
- package/scripts/build.js +3 -3
- package/scripts/validate-imports.js +8 -8
- package/src/client/mount.ts +1 -114
- package/src/config/constants.ts +3 -3
- package/src/config/dev-server.ts +107 -99
- package/src/config/fs-router.ts +140 -155
- package/src/config/fs-routes/fs-watcher.ts +57 -61
- package/src/config/fs-routes/index.ts +117 -119
- package/src/config/fs-routes/router.ts +12 -13
- package/src/config/fs-routes/tree-shake.ts +342 -363
- package/src/config/index.ts +42 -43
- package/src/config/lazy.ts +47 -16
- package/src/config/manifest.ts +8 -7
- package/src/config/vite-utils.ts +9 -9
- package/src/env.d.ts +10 -28
- package/src/http/index.ts +105 -142
- package/src/index.tsx +0 -12
- package/src/internal.d.ts +1 -1
- package/src/middleware/index.ts +42 -49
- package/src/router.tsx +4 -3
- package/src/server/StartServer.tsx +3 -7
- package/src/server/assets/PatchVirtualDevStyles.tsx +31 -0
- package/src/server/assets/index.ts +1 -1
- package/src/server/assets/render.tsx +6 -2
- package/src/server/collect-styles.ts +49 -73
- package/src/server/fetchEvent.spec.ts +71 -75
- package/src/server/fetchEvent.ts +17 -17
- package/src/server/handler.ts +138 -129
- package/src/server/index.tsx +13 -0
- package/src/server/manifest/client-manifest.ts +1 -1
- package/src/server/manifest/dev-client-manifest.ts +7 -5
- package/src/server/manifest/dev-ssr-manifest.ts +8 -6
- package/src/server/manifest/prod-client-manifest.ts +7 -4
- package/src/server/manifest/prod-ssr-manifest.ts +78 -94
- package/src/server/manifest/ssr-manifest.ts +4 -2
- package/src/server/routes.ts +96 -108
- package/src/server/server-fns-runtime.ts +3 -3
- package/src/server/server-functions-handler.ts +294 -319
- package/src/server/server-runtime.ts +13 -13
- package/src/server/spa/StartServer.tsx +2 -0
- package/src/server/spa/handler.ts +12 -12
- package/src/server/types.ts +46 -46
- package/src/server/util.ts +4 -4
- package/src/shared/ErrorBoundary.tsx +1 -1
- package/src/shared/HttpHeader.tsx +20 -20
- package/src/shared/HttpStatusCode.ts +14 -14
- package/src/shared/clientOnly.ts +3 -3
- package/src/shared/dev-overlay/CodeView.tsx +43 -46
- package/src/shared/dev-overlay/DevOverlayDialog.tsx +4 -4
- package/src/shared/dev-overlay/createStackFrame.ts +59 -62
- package/src/shared/dev-overlay/env.d.ts +2 -2
- package/src/shared/dev-overlay/get-source-map.ts +5 -7
- package/src/shared/dev-overlay/icons.tsx +289 -121
- package/src/shared/dev-overlay/index.tsx +1 -1
- package/src/shared/lazy.ts +4 -3
- package/src/shared/serverFunction.ts +1 -1
- package/src/virtual.d.ts +10 -10
- package/tsconfig.json +2 -2
- package/vitest.config.ts +2 -2
|
@@ -1,81 +1,77 @@
|
|
|
1
1
|
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
server: ViteDevServer,
|
|
28
|
+
routes: CompiledRouter,
|
|
29
|
+
environment: "client" | "ssr",
|
|
30
30
|
): () => void {
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
routes.addEventListener("reload", handleRoutesReload);
|
|
32
|
+
return () => routes.removeEventListener("reload", handleRoutesReload);
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
58
|
-
|
|
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
|
-
|
|
64
|
+
routers: Record<"client" | "ssr", BaseFileSystemRouter>,
|
|
65
65
|
): PluginOption => {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
11
|
+
routers: Record<"client" | "ssr", BaseFileSystemRouter>;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
export function fsRoutes({ routers }: FsRoutesArgs): Array<PluginOption> {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
70
|
+
return code;
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
treeShake(),
|
|
74
|
+
fileSystemWatcher(routers),
|
|
75
|
+
];
|
|
78
76
|
}
|
|
79
77
|
|
|
80
78
|
function jsCode() {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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 {
|
|
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 =
|
|
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 =
|
|
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 =
|
|
148
|
+
src = normalizePath(src);
|
|
150
149
|
if (this.isRoute(src)) {
|
|
151
150
|
const path = this.toPath(src);
|
|
152
151
|
if (path === undefined) {
|