@janit/fu 0.0.4 → 0.1.0
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/README.md +31 -14
- package/dist/app.d.ts +0 -2
- package/dist/app.js +0 -4
- package/dist/app.js.map +1 -1
- package/dist/build.d.ts +0 -2
- package/dist/build.js +10 -85
- package/dist/build.js.map +1 -1
- package/dist/cli.js +7 -7
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +7 -1
- package/dist/client.js +18 -7
- package/dist/client.js.map +1 -1
- package/dist/dev.js +13 -66
- package/dist/dev.js.map +1 -1
- package/dist/driver.d.ts +66 -0
- package/dist/driver.js +182 -0
- package/dist/driver.js.map +1 -0
- package/dist/hmr-runtime.js +21 -19
- package/dist/plugins.d.ts +7 -24
- package/dist/plugins.js +18 -58
- package/dist/plugins.js.map +1 -1
- package/dist/render.d.ts +3 -3
- package/dist/render.js +6 -9
- package/dist/render.js.map +1 -1
- package/dist/router.d.ts +17 -0
- package/dist/router.js +37 -6
- package/dist/router.js.map +1 -1
- package/package.json +2 -2
package/dist/driver.js
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { css, hash, jsx, selfAlias, virtual } from "./plugins.js";
|
|
4
|
+
/**
|
|
5
|
+
* Directory holding the framework's own runtime modules, whose paths are handed
|
|
6
|
+
* to rolldown. `import.meta.dirname` is undefined when this module is loaded
|
|
7
|
+
* from a remote URL, and a bundler cannot fetch `https:` modules anyway — so
|
|
8
|
+
* fail with the reason rather than a TypeError three frames later.
|
|
9
|
+
*/
|
|
10
|
+
const HERE = import.meta.dirname ?? remoteFrameworkError();
|
|
11
|
+
/** `.ts` when running from source (this repo, or JSR), `.js` from the compiled npm build. */
|
|
12
|
+
const EXT = import.meta.url.endsWith(".js") ? ".js" : ".ts";
|
|
13
|
+
function remoteFrameworkError() {
|
|
14
|
+
throw new Error("fu: the framework is loaded from a remote URL (" + import.meta.url + "), " +
|
|
15
|
+
"so its runtime modules cannot be handed to the bundler. Install it " +
|
|
16
|
+
"instead — `npm:@janit/fu` in a Deno import map, or `npm i @janit/fu` — " +
|
|
17
|
+
"so it resolves to a real directory.");
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The framework's own package name, read from the package.json above the
|
|
21
|
+
* runtime modules: this repo's at the root, or the installed package's. Absent
|
|
22
|
+
* when neither exists (a JSR install), in which case apps must alias it
|
|
23
|
+
* themselves.
|
|
24
|
+
*/
|
|
25
|
+
const PACKAGE_NAME = (() => {
|
|
26
|
+
try {
|
|
27
|
+
return JSON.parse(fs.readFileSync(path.join(HERE, "..", "package.json"), "utf8")).name ?? null;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
})();
|
|
33
|
+
/** Plugins every bundle of app code needs, client and server alike. */
|
|
34
|
+
function shared(sheets, jsxOpts) {
|
|
35
|
+
return [
|
|
36
|
+
...(PACKAGE_NAME ? [selfAlias(PACKAGE_NAME, HERE, EXT)] : []),
|
|
37
|
+
css(sheets),
|
|
38
|
+
jsx(jsxOpts),
|
|
39
|
+
];
|
|
40
|
+
}
|
|
41
|
+
/** Absolute paths of the runtime modules the generated code imports. */
|
|
42
|
+
export const runtime = {
|
|
43
|
+
client: path.join(HERE, `client${EXT}`),
|
|
44
|
+
render: path.join(HERE, `render${EXT}`),
|
|
45
|
+
hmr: path.join(HERE, "hmr-runtime.js"),
|
|
46
|
+
};
|
|
47
|
+
export function scanProject(root) {
|
|
48
|
+
root = path.resolve(root);
|
|
49
|
+
return {
|
|
50
|
+
root,
|
|
51
|
+
routeFiles: walk(root, "routes"),
|
|
52
|
+
islandFiles: walk(root, "islands"),
|
|
53
|
+
appPath: optional(root, "app.ts", "app.tsx"),
|
|
54
|
+
shellPath: optional(root, "routes/_app.tsx"),
|
|
55
|
+
errorPath: optional(root, "routes/_error.tsx"),
|
|
56
|
+
clientDir: path.join(root, "dist/client"),
|
|
57
|
+
genDir: path.join(root, ".fu"),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Recursively list source files under `<root>/<sub>`, as root-relative
|
|
62
|
+
* "/sub/a/b.tsx". Underscore-prefixed files are skipped: they are framework
|
|
63
|
+
* files (`routes/_app.tsx`), not routes.
|
|
64
|
+
*/
|
|
65
|
+
export function walk(root, sub) {
|
|
66
|
+
const out = [];
|
|
67
|
+
const visit = (dir) => {
|
|
68
|
+
if (!fs.existsSync(dir))
|
|
69
|
+
return;
|
|
70
|
+
for (const e of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
71
|
+
const f = path.join(dir, e.name);
|
|
72
|
+
if (e.isDirectory())
|
|
73
|
+
visit(f);
|
|
74
|
+
else if (/\.[tj]sx?$/.test(e.name) && !e.name.startsWith("_")) {
|
|
75
|
+
out.push("/" + path.relative(root, f).split(path.sep).join("/"));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
visit(path.join(root, sub));
|
|
80
|
+
return out;
|
|
81
|
+
}
|
|
82
|
+
/** Absolute path to an optional project file, or null when absent. */
|
|
83
|
+
export function optional(root, ...names) {
|
|
84
|
+
for (const n of names) {
|
|
85
|
+
const p = path.resolve(root, n);
|
|
86
|
+
if (fs.existsSync(p))
|
|
87
|
+
return p;
|
|
88
|
+
}
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
/** Recreate `dir` empty. */
|
|
92
|
+
export function emptyDir(dir) {
|
|
93
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
94
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
95
|
+
}
|
|
96
|
+
/** Rolldown input for the client bundle. */
|
|
97
|
+
export function clientInput(project, sheets, hmr = false) {
|
|
98
|
+
return {
|
|
99
|
+
input: { boot: "fu:boot" },
|
|
100
|
+
plugins: [virtual({ "fu:boot": bootModule(project) }), ...shared(sheets, { hmr })],
|
|
101
|
+
platform: "browser",
|
|
102
|
+
// rolldown types modules by extension and refuses to bundle CSS; css()
|
|
103
|
+
// has already replaced their contents with JS.
|
|
104
|
+
moduleTypes: { ".css": "js" },
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Nitro options both drivers share. `serverDir` is the generated dir, never the
|
|
109
|
+
* project root, or nitro claims `routes/` as its own server routes and shadows
|
|
110
|
+
* the catch-all. Islands are imported on the server too, so SSR needs the same
|
|
111
|
+
* CSS and JSX handling as the client.
|
|
112
|
+
*/
|
|
113
|
+
export function nitroOptions(project, ssrEntry) {
|
|
114
|
+
return {
|
|
115
|
+
rootDir: project.root,
|
|
116
|
+
serverDir: project.genDir,
|
|
117
|
+
scanDirs: [],
|
|
118
|
+
publicAssets: [{ dir: project.clientDir, baseURL: "/" }],
|
|
119
|
+
handlers: [{ route: "/**", handler: ssrEntry, format: "web", lazy: false }],
|
|
120
|
+
rollupConfig: {
|
|
121
|
+
plugins: shared(new Map(), { stampIslands: true }),
|
|
122
|
+
moduleTypes: { ".css": "js" },
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/** Concatenate collected stylesheets into one file; hashed unless a name is given. */
|
|
127
|
+
export function writeSheets(dir, sheets, name) {
|
|
128
|
+
if (sheets.size === 0)
|
|
129
|
+
return null;
|
|
130
|
+
const merged = [...sheets.values()].join("\n");
|
|
131
|
+
const file = name ?? `style-${hash(merged)}.css`;
|
|
132
|
+
fs.writeFileSync(path.join(dir, file), merged);
|
|
133
|
+
return file;
|
|
134
|
+
}
|
|
135
|
+
const lazyImport = (root, file) => `${JSON.stringify(file)}: () => import(${JSON.stringify(path.resolve(root, "." + file))})`;
|
|
136
|
+
/** The client entry: hydrate every island the page carries. */
|
|
137
|
+
export function bootModule(project) {
|
|
138
|
+
const manifest = project.islandFiles.map((f) => " " + lazyImport(project.root, f)).join(",\n");
|
|
139
|
+
return `import { hydrateIslands } from ${JSON.stringify(runtime.client)};\n` +
|
|
140
|
+
`hydrateIslands({\n${manifest}\n});\n`;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* The server entry: the route manifest, the optional app, shell and error
|
|
144
|
+
* page, and the handler wired to nitro.
|
|
145
|
+
*
|
|
146
|
+
* Nitro invokes the handler with an H3Event, not a Request. The event exposes
|
|
147
|
+
* `url`/`headers` directly — which is why routing worked long before anyone
|
|
148
|
+
* read a body — but has no json()/text()/formData(). The real Request is
|
|
149
|
+
* `event.req`.
|
|
150
|
+
*/
|
|
151
|
+
export function ssrModule(project, assets) {
|
|
152
|
+
const optionalImports = [
|
|
153
|
+
["app", project.appPath],
|
|
154
|
+
["Shell", project.shellPath],
|
|
155
|
+
["ErrorPage", project.errorPath],
|
|
156
|
+
];
|
|
157
|
+
const present = optionalImports.filter(([, file]) => file);
|
|
158
|
+
return [
|
|
159
|
+
`import { createHandler } from ${JSON.stringify(runtime.render)};`,
|
|
160
|
+
...present.map(([name, file]) => `import ${name} from ${JSON.stringify(file)};`),
|
|
161
|
+
`const manifest = {`,
|
|
162
|
+
project.routeFiles.map((f) => " " + lazyImport(project.root, f)).join(",\n"),
|
|
163
|
+
`};`,
|
|
164
|
+
`const assets = ${JSON.stringify(assets)};`,
|
|
165
|
+
`const handler = createHandler({ manifest, assets${present.map(([n]) => `, ${n}`).join("")} });`,
|
|
166
|
+
`const toRequest = (input) => input instanceof Request ? input : (input?.req ?? input);`,
|
|
167
|
+
`export default (input) => handler(toRequest(input));`,
|
|
168
|
+
``,
|
|
169
|
+
].join("\n");
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Write the generated server entry and return its path. It has to be a real
|
|
173
|
+
* file: nitro path-resolves `handlers[].handler`, so a virtual id would not
|
|
174
|
+
* survive its routing codegen.
|
|
175
|
+
*/
|
|
176
|
+
export function writeSsrEntry(project, assets) {
|
|
177
|
+
emptyDir(project.genDir);
|
|
178
|
+
const file = path.join(project.genDir, "ssr.ts");
|
|
179
|
+
fs.writeFileSync(file, ssrModule(project, assets));
|
|
180
|
+
return file;
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"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"}
|
package/dist/hmr-runtime.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// swap the module, re-run its factory, then fire its accept callbacks.
|
|
5
5
|
|
|
6
6
|
/** @type {any} */
|
|
7
|
-
|
|
7
|
+
const BaseDevRuntime = DevRuntime;
|
|
8
8
|
|
|
9
9
|
class ModuleHotContext {
|
|
10
10
|
/** @type {{ deps: string[], fn: (mod: any) => void }[]} */
|
|
@@ -17,11 +17,11 @@ class ModuleHotContext {
|
|
|
17
17
|
if (args.length === 1) {
|
|
18
18
|
this.acceptCallbacks.push({ deps: [this.moduleId], fn: args[0] });
|
|
19
19
|
} else if (args.length !== 0) {
|
|
20
|
-
throw new Error(
|
|
20
|
+
throw new Error("Invalid arguments for `import.meta.hot.accept`");
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
invalidate() {
|
|
24
|
-
socket.send(JSON.stringify({ type:
|
|
24
|
+
socket.send(JSON.stringify({ type: "hmr:invalidate", moduleId: this.moduleId }));
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
|
|
@@ -36,8 +36,8 @@ class FuDevRuntime extends BaseDevRuntime {
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
const clientId = crypto.randomUUID();
|
|
39
|
-
const addr = new URL(
|
|
40
|
-
addr.searchParams.set(
|
|
39
|
+
const addr = new URL("ws://$ADDR");
|
|
40
|
+
addr.searchParams.set("clientId", clientId);
|
|
41
41
|
const socket = new WebSocket(addr);
|
|
42
42
|
|
|
43
43
|
/** @type {any} */
|
|
@@ -54,21 +54,21 @@ async function applyPatch(url, allChangedIds) {
|
|
|
54
54
|
const rt = globalThis.__rolldown_runtime__;
|
|
55
55
|
// Stylesheets are swapped via the <link>, so they never need to accept and
|
|
56
56
|
// must not drag the page into a full reload.
|
|
57
|
-
const changedIds = (allChangedIds || []).filter((id) => !id.endsWith(
|
|
57
|
+
const changedIds = (allChangedIds || []).filter((id) => !id.endsWith(".css"));
|
|
58
58
|
const selfAccepting = changedIds.filter((id) => {
|
|
59
59
|
const ctx = rt.moduleHotContexts.get(id);
|
|
60
60
|
return ctx && ctx.acceptCallbacks.length > 0;
|
|
61
61
|
});
|
|
62
62
|
try {
|
|
63
|
-
await import(url + (url.includes(
|
|
63
|
+
await import(url + (url.includes("?") ? "&" : "?") + "t=" + Date.now());
|
|
64
64
|
} catch (err) {
|
|
65
|
-
console.error(
|
|
65
|
+
console.error("[hmr] failed to load patch", url, err);
|
|
66
66
|
location.reload();
|
|
67
67
|
return;
|
|
68
68
|
}
|
|
69
69
|
if (!changedIds || changedIds.length === 0) return;
|
|
70
70
|
if (selfAccepting.length !== changedIds.length) {
|
|
71
|
-
console.debug(
|
|
71
|
+
console.debug("[hmr] some modules did not accept; reloading");
|
|
72
72
|
location.reload();
|
|
73
73
|
return;
|
|
74
74
|
}
|
|
@@ -79,7 +79,7 @@ async function applyPatch(url, allChangedIds) {
|
|
|
79
79
|
const ctx = rt.moduleHotContexts.get(id);
|
|
80
80
|
for (const { fn } of ctx ? ctx.acceptCallbacks : []) fn(exports);
|
|
81
81
|
}
|
|
82
|
-
console.debug(
|
|
82
|
+
console.debug("[hmr] applied", selfAccepting.join(", "));
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
/**
|
|
@@ -90,23 +90,25 @@ async function applyPatch(url, allChangedIds) {
|
|
|
90
90
|
function swapStylesheet(href) {
|
|
91
91
|
const links = [...document.querySelectorAll('link[rel="stylesheet"]')];
|
|
92
92
|
const old = links[links.length - 1];
|
|
93
|
-
const next = document.createElement(
|
|
94
|
-
next.rel =
|
|
93
|
+
const next = document.createElement("link");
|
|
94
|
+
next.rel = "stylesheet";
|
|
95
95
|
next.href = href;
|
|
96
|
-
next.onload = () => {
|
|
96
|
+
next.onload = () => {
|
|
97
|
+
if (old && old !== next) old.remove();
|
|
98
|
+
};
|
|
97
99
|
(old ? old.parentNode : document.head).insertBefore(next, old ? old.nextSibling : null);
|
|
98
|
-
console.debug(
|
|
100
|
+
console.debug("[hmr] css swapped ->", href);
|
|
99
101
|
}
|
|
100
102
|
|
|
101
103
|
socket.onmessage = function (event) {
|
|
102
104
|
const data = JSON.parse(event.data);
|
|
103
|
-
if (data.type ===
|
|
104
|
-
console.debug(
|
|
105
|
-
} else if (data.type ===
|
|
105
|
+
if (data.type === "connected") {
|
|
106
|
+
console.debug("[hmr] connected");
|
|
107
|
+
} else if (data.type === "hmr:update") {
|
|
106
108
|
applyPatch(data.url, data.changedIds);
|
|
107
|
-
} else if (data.type ===
|
|
109
|
+
} else if (data.type === "fu:css") {
|
|
108
110
|
swapStylesheet(data.href);
|
|
109
|
-
} else if (data.type ===
|
|
111
|
+
} else if (data.type === "hmr:reload") {
|
|
110
112
|
location.reload();
|
|
111
113
|
}
|
|
112
114
|
};
|
package/dist/plugins.d.ts
CHANGED
|
@@ -39,30 +39,13 @@ export declare function stampIslands(js: string, key: string, id: string): {
|
|
|
39
39
|
* module by extension and refuses to bundle it.
|
|
40
40
|
*/
|
|
41
41
|
export declare function css(collected: Map<string, string>): Plugin;
|
|
42
|
+
/**
|
|
43
|
+
* Resolve a bare package name (and its subpaths) to files under `dir`, so an
|
|
44
|
+
* app importing the framework by name gets the copy the driver is running
|
|
45
|
+
* from. Node resolution would otherwise pick whatever `package.json` claims —
|
|
46
|
+
* in this repo, a stale compiled `dist/` — and bundle a second framework.
|
|
47
|
+
*/
|
|
48
|
+
export declare function selfAlias(name: string, dir: string, ext: string): Plugin;
|
|
42
49
|
/** Serve generated modules by exact id. */
|
|
43
50
|
export declare function virtual(mods: Record<string, string>): Plugin;
|
|
44
51
|
export declare function hash(s: string): string;
|
|
45
|
-
/**
|
|
46
|
-
* Recursively list source files under `dir`, as root-relative "/a/b.tsx".
|
|
47
|
-
* Underscore-prefixed files are skipped: they are framework files
|
|
48
|
-
* (`routes/_app.tsx`), not routes.
|
|
49
|
-
*/
|
|
50
|
-
export declare function walk(root: string, dir: string, out?: string[]): string[];
|
|
51
|
-
/** Absolute path to an optional project file, or null when absent. */
|
|
52
|
-
export declare function optional(root: string, ...names: string[]): string | null;
|
|
53
|
-
/** Generated module bodies both drivers need. */
|
|
54
|
-
export declare function bootModule(clientPath: string, islandFiles: string[], root: string): string;
|
|
55
|
-
export interface SsrModuleOptions {
|
|
56
|
-
renderPath: string;
|
|
57
|
-
routeFiles: string[];
|
|
58
|
-
root: string;
|
|
59
|
-
/** Serialized Assets literal. */
|
|
60
|
-
assets: string;
|
|
61
|
-
/** Absolute path to the project's `app.ts`, if it has one. */
|
|
62
|
-
appPath?: string | null;
|
|
63
|
-
/** Absolute path to the project's `routes/_app.tsx`, if it has one. */
|
|
64
|
-
shellPath?: string | null;
|
|
65
|
-
/** Absolute path to the project's `routes/_error.tsx`, if it has one. */
|
|
66
|
-
errorPath?: string | null;
|
|
67
|
-
}
|
|
68
|
-
export declare function ssrModule(o: SsrModuleOptions): string;
|
package/dist/plugins.js
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { parseSync, transformSync } from "rolldown/experimental";
|
|
2
2
|
import { transform as lightning } from "lightningcss";
|
|
3
|
-
import * as fs from "node:fs";
|
|
4
|
-
import * as path from "node:path";
|
|
5
3
|
/** Files a source transform must never touch. */
|
|
6
4
|
function isInternal(id) {
|
|
7
5
|
return id.includes("node_modules") ||
|
|
@@ -173,6 +171,24 @@ export function css(collected) {
|
|
|
173
171
|
},
|
|
174
172
|
};
|
|
175
173
|
}
|
|
174
|
+
/**
|
|
175
|
+
* Resolve a bare package name (and its subpaths) to files under `dir`, so an
|
|
176
|
+
* app importing the framework by name gets the copy the driver is running
|
|
177
|
+
* from. Node resolution would otherwise pick whatever `package.json` claims —
|
|
178
|
+
* in this repo, a stale compiled `dist/` — and bundle a second framework.
|
|
179
|
+
*/
|
|
180
|
+
export function selfAlias(name, dir, ext) {
|
|
181
|
+
return {
|
|
182
|
+
name: "fu:self-alias",
|
|
183
|
+
resolveId(id) {
|
|
184
|
+
if (id === name)
|
|
185
|
+
return `${dir}/mod${ext}`;
|
|
186
|
+
if (id.startsWith(name + "/"))
|
|
187
|
+
return `${dir}/${id.slice(name.length + 1)}${ext}`;
|
|
188
|
+
return null;
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
}
|
|
176
192
|
/** Serve generated modules by exact id. */
|
|
177
193
|
export function virtual(mods) {
|
|
178
194
|
return {
|
|
@@ -187,60 +203,4 @@ export function hash(s) {
|
|
|
187
203
|
h = (Math.imul(h, 31) + s.charCodeAt(i)) >>> 0;
|
|
188
204
|
return h.toString(36);
|
|
189
205
|
}
|
|
190
|
-
/**
|
|
191
|
-
* Recursively list source files under `dir`, as root-relative "/a/b.tsx".
|
|
192
|
-
* Underscore-prefixed files are skipped: they are framework files
|
|
193
|
-
* (`routes/_app.tsx`), not routes.
|
|
194
|
-
*/
|
|
195
|
-
export function walk(root, dir, out = []) {
|
|
196
|
-
if (!fs.existsSync(dir))
|
|
197
|
-
return out;
|
|
198
|
-
for (const e of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
199
|
-
const f = path.join(dir, e.name);
|
|
200
|
-
if (e.isDirectory())
|
|
201
|
-
walk(root, f, out);
|
|
202
|
-
else if (/\.[tj]sx?$/.test(e.name) && !e.name.startsWith("_")) {
|
|
203
|
-
out.push("/" + path.relative(root, f).split(path.sep).join("/"));
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
return out;
|
|
207
|
-
}
|
|
208
|
-
/** Absolute path to an optional project file, or null when absent. */
|
|
209
|
-
export function optional(root, ...names) {
|
|
210
|
-
for (const n of names) {
|
|
211
|
-
const p = path.resolve(root, n);
|
|
212
|
-
if (fs.existsSync(p))
|
|
213
|
-
return p;
|
|
214
|
-
}
|
|
215
|
-
return null;
|
|
216
|
-
}
|
|
217
|
-
/** Generated module bodies both drivers need. */
|
|
218
|
-
export function bootModule(clientPath, islandFiles, root) {
|
|
219
|
-
return `
|
|
220
|
-
import { hydrateIslands } from ${JSON.stringify(clientPath)};
|
|
221
|
-
hydrateIslands({
|
|
222
|
-
${islandFiles.map((f) => ` ${JSON.stringify(f)}: () => import(${JSON.stringify(path.resolve(root, "." + f))})`).join(",\n")}
|
|
223
|
-
});
|
|
224
|
-
`;
|
|
225
|
-
}
|
|
226
|
-
export function ssrModule(o) {
|
|
227
|
-
const lines = [
|
|
228
|
-
`import { createHandler } from ${JSON.stringify(o.renderPath)};`,
|
|
229
|
-
];
|
|
230
|
-
if (o.appPath)
|
|
231
|
-
lines.push(`import app from ${JSON.stringify(o.appPath)};`);
|
|
232
|
-
if (o.shellPath)
|
|
233
|
-
lines.push(`import Shell from ${JSON.stringify(o.shellPath)};`);
|
|
234
|
-
if (o.errorPath)
|
|
235
|
-
lines.push(`import ErrorPage from ${JSON.stringify(o.errorPath)};`);
|
|
236
|
-
lines.push(`const routes = {`, o.routeFiles
|
|
237
|
-
.map((f) => ` ${JSON.stringify(f)}: () => import(${JSON.stringify(path.resolve(o.root, "." + f))})`)
|
|
238
|
-
.join(",\n"), `};`, `const assets = ${o.assets};`, `const handler = createHandler({`, ` manifest: routes,`, ` assets,`, o.appPath ? ` app,` : ` app: undefined,`, o.shellPath ? ` Shell,` : ` Shell: undefined,`, o.errorPath ? ` ErrorPage,` : ` ErrorPage: undefined,`, `});`,
|
|
239
|
-
// Nitro invokes the handler with an H3Event, not a Request. The event
|
|
240
|
-
// exposes `url`/`headers` directly — which is why routing worked long
|
|
241
|
-
// before anyone read a body — but has no json()/text()/formData(). The
|
|
242
|
-
// real Request is `event.req`.
|
|
243
|
-
`const toRequest = (input) => input instanceof Request ? input : (input?.req ?? input);`, `export default (input) => handler(toRequest(input));`, ``);
|
|
244
|
-
return lines.join("\n");
|
|
245
|
-
}
|
|
246
206
|
//# sourceMappingURL=plugins.js.map
|
package/dist/plugins.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugins.js","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,SAAS,IAAI,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"plugins.js","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"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"}
|
package/dist/render.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { type ComponentType } from "preact";
|
|
2
|
-
import type
|
|
1
|
+
import { type ComponentChildren, type ComponentType } from "preact";
|
|
2
|
+
import { type App } from "./app.js";
|
|
3
3
|
import type { Assets, Ctx, Head, RouteManifest } from "./types.js";
|
|
4
4
|
/** Optional root wrapper (`routes/_app.tsx`) around every page. */
|
|
5
5
|
export interface ShellProps<S = Record<string, unknown>> {
|
|
6
6
|
ctx: Ctx<S>;
|
|
7
|
-
children:
|
|
7
|
+
children: ComponentChildren;
|
|
8
8
|
}
|
|
9
9
|
export interface HandlerParts<S> {
|
|
10
10
|
manifest: RouteManifest<S>;
|
package/dist/render.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { h, options } from "preact";
|
|
2
2
|
import { renderToStringAsync } from "preact-render-to-string";
|
|
3
3
|
import { buildRoutes, match } from "./router.js";
|
|
4
|
+
import { compose } from "./app.js";
|
|
4
5
|
import { HttpError, statusText, toRouteError } from "./errors.js";
|
|
5
6
|
/** Property the SSR transform stamps onto island exports. */
|
|
6
7
|
const ISLAND = "__island";
|
|
@@ -45,8 +46,7 @@ function installIslandHook() {
|
|
|
45
46
|
export function createHandler(parts) {
|
|
46
47
|
installIslandHook();
|
|
47
48
|
const routes = buildRoutes(parts.manifest);
|
|
48
|
-
const
|
|
49
|
-
const run = parts.app ? parts.app.compose(terminal) : composeBare(terminal);
|
|
49
|
+
const run = compose(parts.app?.middleware ?? [], (ctx) => renderRoute(ctx, routes, parts));
|
|
50
50
|
return (req) => {
|
|
51
51
|
const ctx = {
|
|
52
52
|
req,
|
|
@@ -61,16 +61,15 @@ export function createHandler(parts) {
|
|
|
61
61
|
return run(ctx).catch((err) => renderError(ctx, err, parts));
|
|
62
62
|
};
|
|
63
63
|
}
|
|
64
|
-
function composeBare(terminal) {
|
|
65
|
-
return (ctx) => Promise.resolve(terminal(ctx));
|
|
66
|
-
}
|
|
67
64
|
async function renderRoute(ctx, routes, parts) {
|
|
68
65
|
try {
|
|
69
66
|
const m = match(routes, ctx.url.pathname);
|
|
70
67
|
if (!m)
|
|
71
68
|
throw new HttpError(404);
|
|
72
69
|
ctx.params = m.params;
|
|
73
|
-
|
|
70
|
+
// Cached on the route: a dynamic import of a loaded module is cheap but
|
|
71
|
+
// not free, and the manifest never changes within one server process.
|
|
72
|
+
const mod = m.route.module ??= await m.route.load();
|
|
74
73
|
if (mod.handlers) {
|
|
75
74
|
const fn = mod.handlers[ctx.req.method];
|
|
76
75
|
if (!fn)
|
|
@@ -91,9 +90,7 @@ async function renderRoute(ctx, routes, parts) {
|
|
|
91
90
|
}
|
|
92
91
|
/** Render the page, wrapped in `routes/_app.tsx` when the project has one. */
|
|
93
92
|
async function renderTree(ctx, page, parts) {
|
|
94
|
-
const tree = parts.Shell
|
|
95
|
-
? h(parts.Shell, { ctx, children: page })
|
|
96
|
-
: page;
|
|
93
|
+
const tree = parts.Shell ? h(parts.Shell, { ctx, children: page }) : page;
|
|
97
94
|
return await renderToStringAsync(tree);
|
|
98
95
|
}
|
|
99
96
|
function htmlResponse(body, ctx, parts, status = 200) {
|
package/dist/render.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
|
package/dist/router.d.ts
CHANGED
|
@@ -6,6 +6,15 @@ export interface Route<S = Record<string, unknown>> {
|
|
|
6
6
|
load: () => Promise<RouteModule<S>>;
|
|
7
7
|
/** Lower sorts first: static beats dynamic beats wildcard. */
|
|
8
8
|
score: number;
|
|
9
|
+
/**
|
|
10
|
+
* The canonical pathname when the pattern has no pattern syntax at all, so
|
|
11
|
+
* the route can be matched by string equality instead of `URLPattern.exec`.
|
|
12
|
+
*/
|
|
13
|
+
literal: string | null;
|
|
14
|
+
/** Segments in the pattern. A wildcard matches one fewer or more; the rest exactly this many. */
|
|
15
|
+
segments: number;
|
|
16
|
+
/** The loaded module, cached by the renderer after the first request. */
|
|
17
|
+
module?: RouteModule<S>;
|
|
9
18
|
}
|
|
10
19
|
export interface Matched<S = Record<string, unknown>> {
|
|
11
20
|
route: Route<S>;
|
|
@@ -18,4 +27,12 @@ export interface Matched<S = Record<string, unknown>> {
|
|
|
18
27
|
*/
|
|
19
28
|
export declare function filePathToPattern(file: string): string;
|
|
20
29
|
export declare function buildRoutes<S = Record<string, unknown>>(manifest: RouteManifest<S>): Route<S>[];
|
|
30
|
+
/**
|
|
31
|
+
* First route that matches, in `buildRoutes` order.
|
|
32
|
+
*
|
|
33
|
+
* `URLPattern.exec` costs microseconds per call, so it only runs for routes
|
|
34
|
+
* that could match: literal routes compare by equality, and a pattern whose
|
|
35
|
+
* segment count cannot fit the path is skipped. The string input form is used
|
|
36
|
+
* because the `{ pathname }` dictionary form is several times slower on Deno.
|
|
37
|
+
*/
|
|
21
38
|
export declare function match<S = Record<string, unknown>>(routes: Route<S>[], pathname: string): Matched<S> | null;
|