fuzor 0.0.1 → 0.2.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.
- package/LICENSE +21 -0
- package/README.md +112 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +97 -0
- package/dist/cli.js.map +1 -0
- package/dist/compiler/index.d.ts +28 -0
- package/dist/compiler/index.d.ts.map +1 -0
- package/dist/compiler/index.js +184 -0
- package/dist/compiler/index.js.map +1 -0
- package/dist/compiler/islands.d.ts +17 -0
- package/dist/compiler/islands.d.ts.map +1 -0
- package/dist/compiler/islands.js +78 -0
- package/dist/compiler/islands.js.map +1 -0
- package/dist/create.d.ts +21 -0
- package/dist/create.d.ts.map +1 -0
- package/dist/create.js +111 -0
- package/dist/create.js.map +1 -0
- package/dist/index.d.ts +8 -8
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/islands/react.d.ts +8 -0
- package/dist/islands/react.d.ts.map +1 -0
- package/dist/islands/react.js +19 -0
- package/dist/islands/react.js.map +1 -0
- package/dist/islands/solid.d.ts +8 -0
- package/dist/islands/solid.d.ts.map +1 -0
- package/dist/islands/solid.js +15 -0
- package/dist/islands/solid.js.map +1 -0
- package/dist/islands/vue.d.ts +5 -0
- package/dist/islands/vue.d.ts.map +1 -0
- package/dist/islands/vue.js +13 -0
- package/dist/islands/vue.js.map +1 -0
- package/dist/runtime/atom.d.ts +10 -0
- package/dist/runtime/atom.d.ts.map +1 -0
- package/dist/runtime/atom.js +38 -0
- package/dist/runtime/atom.js.map +1 -0
- package/dist/runtime/index.d.ts +31 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +121 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/islands.d.ts +6 -0
- package/dist/runtime/islands.d.ts.map +1 -0
- package/dist/runtime/islands.js +43 -0
- package/dist/runtime/islands.js.map +1 -0
- package/dist/ssr/node.d.ts +7 -0
- package/dist/ssr/node.d.ts.map +1 -0
- package/dist/ssr/node.js +46 -0
- package/dist/ssr/node.js.map +1 -0
- package/dist/ssr.d.ts +10 -0
- package/dist/ssr.d.ts.map +1 -0
- package/dist/ssr.js +19 -0
- package/dist/ssr.js.map +1 -0
- package/dist/vite.d.ts +8 -0
- package/dist/vite.d.ts.map +1 -0
- package/dist/vite.js +310 -0
- package/dist/vite.js.map +1 -0
- package/package.json +71 -56
- package/templates/basic/README.md +16 -0
- package/templates/basic/_gitignore +3 -0
- package/templates/basic/components/app-badge.html +1 -0
- package/templates/basic/index.html +12 -0
- package/templates/basic/islands/counter.ts +13 -0
- package/templates/basic/package.json +20 -0
- package/templates/basic/pages/about/index.html +5 -0
- package/templates/basic/pages/docs/index.md +9 -0
- package/templates/basic/pages/index.html +9 -0
- package/templates/basic/pages/layout.html +8 -0
- package/templates/basic/pnpm-workspace.yaml +5 -0
- package/templates/basic/server.mjs +10 -0
- package/templates/basic/style.css +1 -0
- package/templates/basic/tsconfig.json +13 -0
- package/templates/basic/vite.config.ts +4 -0
- package/bin/index.js +0 -13
- package/dist/core/init.d.ts +0 -7
- package/dist/core/router.d.ts +0 -4
- package/dist/core/vite-config.d.ts +0 -5
- package/dist/init.cjs +0 -237
- package/dist/init.js +0 -468
- package/dist/lib.cjs +0 -222
- package/dist/lib.js +0 -19247
- package/dist/render/lit.d.ts +0 -1
- package/dist/render/preact.d.ts +0 -1
- package/dist/render/react.d.ts +0 -7
- package/dist/render/solid.d.ts +0 -1
- package/dist/render/svelte.d.ts +0 -6
- package/dist/render/vue.d.ts +0 -1
- package/dist/utils/create-file-if-not-exists.d.ts +0 -1
- package/dist/utils/create-folder-if-not-exist.d.ts +0 -2
- package/dist/utils/default-theme-files.d.ts +0 -7
- package/dist/utils/file-path-helpers.d.ts +0 -3
- package/dist/utils/is-valid-wordpress-slug.d.ts +0 -17
- package/dist/utils/read-write-file.d.ts +0 -1
- package/dist/utils/remove-file-exists.d.ts +0 -2
- package/dist/utils/remove-trailing-slash-url.d.ts +0 -1
- package/dist/utils/router-helpers.d.ts +0 -19
- package/dist/utils/zip-wp-theme.d.ts +0 -2
- package/types/index.d.ts +0 -6
package/dist/create.js
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { cp, mkdir, readFile, readdir, rename, writeFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { defineCommand, runMain } from "citty";
|
|
6
|
+
import * as prompts from "@clack/prompts";
|
|
7
|
+
import colors from "picocolors";
|
|
8
|
+
const packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
9
|
+
const templateRoot = path.join(packageRoot, "templates/basic");
|
|
10
|
+
async function available(directory) {
|
|
11
|
+
try {
|
|
12
|
+
return (await readdir(directory)).length === 0;
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
if (error.code === "ENOENT")
|
|
16
|
+
return true;
|
|
17
|
+
throw error;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async function installDependencies(directory) {
|
|
21
|
+
await new Promise((resolve, reject) => {
|
|
22
|
+
const child = spawn("pnpm", ["install"], { cwd: directory, stdio: "inherit" });
|
|
23
|
+
child.once("error", reject);
|
|
24
|
+
child.once("exit", (code) => code === 0 ? resolve() : reject(new Error(`pnpm install exited with ${code}`)));
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
export async function createApp(directory, options = {}) {
|
|
28
|
+
prompts.intro(colors.cyan(colors.bold("◉ Create Fuzor")));
|
|
29
|
+
let selected = directory;
|
|
30
|
+
if (!selected) {
|
|
31
|
+
if (options.yes)
|
|
32
|
+
selected = "fuzor-app";
|
|
33
|
+
else if (!process.stdin.isTTY)
|
|
34
|
+
throw new Error("Pass a directory or --yes in a non-interactive terminal.");
|
|
35
|
+
else {
|
|
36
|
+
const answer = await prompts.text({ message: "Where should we create your app?", placeholder: "my-fuzor-app", defaultValue: "my-fuzor-app" });
|
|
37
|
+
if (typeof answer !== "string") {
|
|
38
|
+
prompts.cancel("Creation cancelled.");
|
|
39
|
+
return "";
|
|
40
|
+
}
|
|
41
|
+
selected = answer.trim();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (!selected)
|
|
45
|
+
throw new Error("App directory cannot be empty.");
|
|
46
|
+
const destination = path.resolve(selected);
|
|
47
|
+
if (!(await available(destination)))
|
|
48
|
+
throw new Error(`${destination} is not empty. Choose another directory.`);
|
|
49
|
+
const name = path.basename(destination).toLowerCase().replace(/[^a-z0-9-]+/g, "-").replace(/^-+|-+$/g, "") || "fuzor-app";
|
|
50
|
+
const frameworkPackage = JSON.parse(await readFile(path.join(packageRoot, "package.json"), "utf8"));
|
|
51
|
+
const dependency = frameworkPackage.private
|
|
52
|
+
? `file:${packageRoot}`
|
|
53
|
+
: `^${frameworkPackage.version}`;
|
|
54
|
+
const spin = process.stdout.isTTY ? prompts.spinner() : undefined;
|
|
55
|
+
if (spin)
|
|
56
|
+
spin.start("Creating your app");
|
|
57
|
+
else
|
|
58
|
+
console.log("Creating your app...");
|
|
59
|
+
try {
|
|
60
|
+
await mkdir(destination, { recursive: true });
|
|
61
|
+
await cp(templateRoot, destination, { recursive: true });
|
|
62
|
+
await rename(path.join(destination, "_gitignore"), path.join(destination, ".gitignore"));
|
|
63
|
+
const packageFile = path.join(destination, "package.json");
|
|
64
|
+
const contents = (await readFile(packageFile, "utf8"))
|
|
65
|
+
.replaceAll("__APP_NAME__", name)
|
|
66
|
+
.replaceAll("__FUZOR_VERSION__", dependency);
|
|
67
|
+
await writeFile(packageFile, contents);
|
|
68
|
+
const readmeFile = path.join(destination, "README.md");
|
|
69
|
+
await writeFile(readmeFile, (await readFile(readmeFile, "utf8")).replaceAll("__APP_NAME__", name));
|
|
70
|
+
if (spin)
|
|
71
|
+
spin.stop(`Created ${colors.cyan(name)}`);
|
|
72
|
+
else
|
|
73
|
+
console.log(`Created ${name}`);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
if (spin)
|
|
77
|
+
spin.stop("Could not create app");
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
let installed = false;
|
|
81
|
+
if (options.install) {
|
|
82
|
+
prompts.log.info("Installing dependencies with pnpm");
|
|
83
|
+
await installDependencies(destination);
|
|
84
|
+
installed = true;
|
|
85
|
+
}
|
|
86
|
+
else if (!options.yes && process.stdin.isTTY) {
|
|
87
|
+
const answer = await prompts.confirm({ message: "Install dependencies now?", initialValue: true });
|
|
88
|
+
if (prompts.isCancel(answer))
|
|
89
|
+
prompts.cancel("Dependency installation skipped.");
|
|
90
|
+
else if (answer) {
|
|
91
|
+
await installDependencies(destination);
|
|
92
|
+
installed = true;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
prompts.note(`cd ${path.relative(process.cwd(), destination) || "."}\n${installed ? "" : "pnpm install\n"}pnpm dev`, "Next steps");
|
|
96
|
+
prompts.outro(colors.green("Ready to build with Fuzor"));
|
|
97
|
+
return destination;
|
|
98
|
+
}
|
|
99
|
+
export const createCommand = defineCommand({
|
|
100
|
+
meta: { name: "create", description: "Scaffold a new Fuzor app" },
|
|
101
|
+
args: {
|
|
102
|
+
directory: { type: "positional", description: "Directory for the new app", required: false },
|
|
103
|
+
yes: { type: "boolean", description: "Use defaults without prompting" },
|
|
104
|
+
install: { type: "boolean", description: "Install dependencies with pnpm" }
|
|
105
|
+
},
|
|
106
|
+
async run({ args }) { await createApp(args.directory, { yes: args.yes ?? false, install: args.install ?? false }); }
|
|
107
|
+
});
|
|
108
|
+
export function runCreateCli() {
|
|
109
|
+
void runMain({ ...createCommand, meta: { name: "create-fuzor", description: "Scaffold a new Fuzor app" } });
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
export { compileProject, compileProjectEffect } from "./compiler/index.js";
|
|
2
|
+
export { CompilerError, CompilerFileSystem, CompilerFileSystemLive } from "./compiler/index.js";
|
|
3
|
+
export type { CompiledProject, CompiledRoute } from "./compiler/index.js";
|
|
4
|
+
export { fuzorPlugin } from "./vite.js";
|
|
5
|
+
export type { FuzorPluginOptions } from "./vite.js";
|
|
6
|
+
export * as Schema from "effect/Schema";
|
|
7
|
+
export { Effect } from "effect";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAChG,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,YAAY,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { compileProject, compileProjectEffect } from "./compiler/index.js";
|
|
2
|
+
export { CompilerError, CompilerFileSystem, CompilerFileSystemLive } from "./compiler/index.js";
|
|
3
|
+
export { fuzorPlugin } from "./vite.js";
|
|
4
|
+
export * as Schema from "effect/Schema";
|
|
5
|
+
export { Effect } from "effect";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAEhG,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ComponentType } from "react";
|
|
2
|
+
export declare function reactIsland<Props extends Record<string, unknown>>(Component: ComponentType<Props>): {
|
|
3
|
+
mount: ((host: HTMLElement, props: Props) => () => void) & {
|
|
4
|
+
component: ComponentType<Props>;
|
|
5
|
+
framework: "react";
|
|
6
|
+
};
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=react.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/islands/react.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAG1D,wBAAgB,WAAW,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,aAAa,CAAC,KAAK,CAAC;mBAC7D,WAAW,SAAS,KAAK;;;;EAc7D"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createElement } from "react";
|
|
2
|
+
import { createRoot, hydrateRoot } from "react-dom/client";
|
|
3
|
+
export function reactIsland(Component) {
|
|
4
|
+
const mount = Object.assign((host, props) => {
|
|
5
|
+
const element = createElement(Component, props);
|
|
6
|
+
const id = host.getAttribute("data-fuzor-island-id");
|
|
7
|
+
if (host.hasAttribute("data-fuzor-prerendered")) {
|
|
8
|
+
const root = hydrateRoot(host, element, id ? { identifierPrefix: `fuzor-${id}-` } : {});
|
|
9
|
+
return () => root.unmount();
|
|
10
|
+
}
|
|
11
|
+
const root = createRoot(host);
|
|
12
|
+
root.render(element);
|
|
13
|
+
return () => root.unmount();
|
|
14
|
+
}, { component: Component, framework: "react" });
|
|
15
|
+
return {
|
|
16
|
+
mount
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=react.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.js","sourceRoot":"","sources":["../../src/islands/react.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAsB,MAAM,OAAO,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE3D,MAAM,UAAU,WAAW,CAAwC,SAA+B;IAChG,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAiB,EAAE,KAAY,EAAE,EAAE;QAC9D,MAAM,OAAO,GAAG,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAChD,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC;QACrD,IAAI,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACxF,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC9B,CAAC;QACD,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,OAAgB,EAAE,CAAC,CAAC;IAC1D,OAAO;QACL,KAAK;KACN,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type Component } from "solid-js";
|
|
2
|
+
export declare function solidIsland<Props extends Record<string, unknown>>(Component: Component<Props>): {
|
|
3
|
+
mount: ((host: HTMLElement, props: Props) => () => void) & {
|
|
4
|
+
component: Component<Props>;
|
|
5
|
+
framework: "solid";
|
|
6
|
+
};
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=solid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solid.d.ts","sourceRoot":"","sources":["../../src/islands/solid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAG3D,wBAAgB,WAAW,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC;mBACzD,WAAW,SAAS,KAAK;;;;EAU7D"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createComponent } from "solid-js";
|
|
2
|
+
import { hydrate, render } from "solid-js/web";
|
|
3
|
+
export function solidIsland(Component) {
|
|
4
|
+
const mount = Object.assign((host, props) => {
|
|
5
|
+
if (host.hasAttribute("data-fuzor-prerendered")) {
|
|
6
|
+
const id = host.getAttribute("data-fuzor-island-id");
|
|
7
|
+
return hydrate(() => createComponent(Component, props), host, id ? { renderId: id } : {});
|
|
8
|
+
}
|
|
9
|
+
return render(() => createComponent(Component, props), host);
|
|
10
|
+
}, { component: Component, framework: "solid" });
|
|
11
|
+
return {
|
|
12
|
+
mount
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=solid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solid.js","sourceRoot":"","sources":["../../src/islands/solid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAkB,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,UAAU,WAAW,CAAwC,SAA2B;IAC5F,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAiB,EAAE,KAAY,EAAE,EAAE;QAC9D,IAAI,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,EAAE,CAAC;YAChD,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC;YACrD,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,OAAO,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/D,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,OAAgB,EAAE,CAAC,CAAC;IAC1D,OAAO;QACL,KAAK;KACN,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vue.d.ts","sourceRoot":"","sources":["../../src/islands/vue.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,SAAS,EAAE,MAAM,KAAK,CAAC;AAE9D,wBAAgB,SAAS,CAAC,SAAS,EAAE,SAAS;gBAE9B,WAAW,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;EAQ1D"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createApp, createSSRApp } from "vue";
|
|
2
|
+
export function vueIsland(Component) {
|
|
3
|
+
return {
|
|
4
|
+
mount(host, props) {
|
|
5
|
+
const app = host.hasAttribute("data-fuzor-prerendered")
|
|
6
|
+
? createSSRApp(Component, props)
|
|
7
|
+
: createApp(Component, props);
|
|
8
|
+
app.mount(host);
|
|
9
|
+
return () => app.unmount();
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=vue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vue.js","sourceRoot":"","sources":["../../src/islands/vue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAkB,MAAM,KAAK,CAAC;AAE9D,MAAM,UAAU,SAAS,CAAC,SAAoB;IAC5C,OAAO;QACL,KAAK,CAAC,IAAiB,EAAE,KAA8B;YACrD,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC;gBACrD,CAAC,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC;gBAChC,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAChC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChB,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAC7B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Effect, Schema } from "effect";
|
|
2
|
+
import type { HistoryHost } from "./index.js";
|
|
3
|
+
export declare function createUrlAtom<Value>(host: HistoryHost, key: string, schema: Schema.Codec<Value, unknown>, initialValue: Value): {
|
|
4
|
+
get: () => Value;
|
|
5
|
+
set: (value: Value) => Effect.Effect<void, Schema.SchemaError, never>;
|
|
6
|
+
refresh: () => Effect.Effect<Value, Error | Schema.SchemaError, never>;
|
|
7
|
+
subscribe: (listener: (value: Value) => void) => () => void;
|
|
8
|
+
dispose: () => void;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=atom.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atom.d.ts","sourceRoot":"","sources":["../../src/runtime/atom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAExC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,aAAa,CAAC,KAAK,EACjC,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,EACpC,YAAY,EAAE,KAAK;;iBAqBC,KAAK;;0BAcD,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI;;EAG/C"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Effect, Schema } from "effect";
|
|
2
|
+
import { Atom, AtomRegistry } from "effect/unstable/reactivity";
|
|
3
|
+
export function createUrlAtom(host, key, schema, initialValue) {
|
|
4
|
+
const registry = AtomRegistry.make();
|
|
5
|
+
const atom = Atom.make(initialValue);
|
|
6
|
+
const refresh = () => Effect.gen(function* () {
|
|
7
|
+
const href = yield* host.current();
|
|
8
|
+
const raw = new URL(href, "http://fuzor.local").searchParams.get(key);
|
|
9
|
+
if (raw === null) {
|
|
10
|
+
registry.set(atom, initialValue);
|
|
11
|
+
return initialValue;
|
|
12
|
+
}
|
|
13
|
+
const encoded = yield* Effect.try({
|
|
14
|
+
try: () => JSON.parse(raw),
|
|
15
|
+
catch: (error) => new Error(`Invalid URL atom ${key}: ${String(error)}`)
|
|
16
|
+
});
|
|
17
|
+
const value = yield* Schema.decodeUnknownEffect(schema)(encoded);
|
|
18
|
+
registry.set(atom, value);
|
|
19
|
+
return value;
|
|
20
|
+
});
|
|
21
|
+
const set = (value) => Effect.gen(function* () {
|
|
22
|
+
const encoded = yield* Schema.encodeUnknownEffect(schema)(value);
|
|
23
|
+
const href = yield* host.current();
|
|
24
|
+
const url = new URL(href, "http://fuzor.local");
|
|
25
|
+
url.searchParams.set(key, JSON.stringify(encoded));
|
|
26
|
+
yield* host.replace(`${url.pathname}${url.search}${url.hash}`);
|
|
27
|
+
registry.set(atom, value);
|
|
28
|
+
});
|
|
29
|
+
const stop = host.listen(() => { void Effect.runPromise(refresh()); });
|
|
30
|
+
return {
|
|
31
|
+
get: () => registry.get(atom),
|
|
32
|
+
set,
|
|
33
|
+
refresh,
|
|
34
|
+
subscribe: (listener) => registry.subscribe(atom, listener),
|
|
35
|
+
dispose: () => { stop(); registry.dispose(); }
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=atom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atom.js","sourceRoot":"","sources":["../../src/runtime/atom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAGhE,MAAM,UAAU,aAAa,CAC3B,IAAiB,EACjB,GAAW,EACX,MAAoC,EACpC,YAAmB;IAEnB,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAErC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACxC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtE,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YACjC,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;YAChC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY;YACrC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,oBAAoB,GAAG,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;SACzE,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC;QACjE,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,CAAC,KAAY,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAChD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;QAChD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QACnD,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/D,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,OAAO;QACL,GAAG,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QAC7B,GAAG;QACH,OAAO;QACP,SAAS,EAAE,CAAC,QAAgC,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC;QACnF,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;KAC/C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
export { createUrlAtom } from "./atom.js";
|
|
3
|
+
import { type IslandRegistry } from "./islands.js";
|
|
4
|
+
export { mountIslands } from "./islands.js";
|
|
5
|
+
export type { IslandModule, IslandRegistry } from "./islands.js";
|
|
6
|
+
export type HistoryHost = {
|
|
7
|
+
readonly current: () => Effect.Effect<string>;
|
|
8
|
+
readonly push: (path: string) => Effect.Effect<void>;
|
|
9
|
+
readonly replace: (path: string) => Effect.Effect<void>;
|
|
10
|
+
readonly back: () => Effect.Effect<void>;
|
|
11
|
+
readonly forward: () => Effect.Effect<void>;
|
|
12
|
+
readonly listen: (listener: (path: string) => void) => () => void;
|
|
13
|
+
};
|
|
14
|
+
export declare const PlatformHistory: Context.Service<HistoryHost, HistoryHost>;
|
|
15
|
+
export declare function browserHistory(): HistoryHost;
|
|
16
|
+
export declare function memoryHistory(initialPath?: string): HistoryHost;
|
|
17
|
+
export declare const BrowserHistoryLive: Layer.Layer<HistoryHost, never, never>;
|
|
18
|
+
export declare const VirtualHistoryLive: (initialPath?: string) => Layer.Layer<HistoryHost, never, never>;
|
|
19
|
+
export declare function normalizePath(path: string): string;
|
|
20
|
+
export declare function normalizeHref(path: string): string;
|
|
21
|
+
export type RouterOptions = {
|
|
22
|
+
readonly host?: HistoryHost;
|
|
23
|
+
readonly islands?: IslandRegistry;
|
|
24
|
+
};
|
|
25
|
+
export declare function createRouter(outlet: HTMLElement, options?: RouterOptions): {
|
|
26
|
+
start: () => Promise<() => void>;
|
|
27
|
+
navigate: (path: string, replace?: boolean) => Promise<void>;
|
|
28
|
+
path: () => string;
|
|
29
|
+
subscribe: (listener: (path: string) => void) => () => void;
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAU,MAAM,QAAQ,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEjE,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACrD,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxD,QAAQ,CAAC,IAAI,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;CACnE,CAAC;AAEF,eAAO,MAAM,eAAe,2CAAuD,CAAC;AAIpF,wBAAgB,cAAc,IAAI,WAAW,CAa5C;AAED,wBAAgB,aAAa,CAAC,WAAW,SAAM,GAAG,WAAW,CAqB5D;AAED,eAAO,MAAM,kBAAkB,wCAAmD,CAAC;AACnF,eAAO,MAAM,kBAAkB,GAAI,oBAAiB,2CAA+D,CAAC;AAEpH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;CACnC,CAAC;AAEF,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,aAAkB;;qBAwB7C,MAAM;;0BAgCgD,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI;EAC3G"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { Context, Effect, Layer, Schema } from "effect";
|
|
2
|
+
import { Atom, AtomRegistry } from "effect/unstable/reactivity";
|
|
3
|
+
export { createUrlAtom } from "./atom.js";
|
|
4
|
+
import { mountIslands } from "./islands.js";
|
|
5
|
+
export { mountIslands } from "./islands.js";
|
|
6
|
+
export const PlatformHistory = Context.Service("FuzorPlatformHistory");
|
|
7
|
+
const PathSchema = Schema.String;
|
|
8
|
+
export function browserHistory() {
|
|
9
|
+
return {
|
|
10
|
+
current: () => Effect.sync(() => `${window.location.pathname}${window.location.search}${window.location.hash}`),
|
|
11
|
+
push: (path) => Effect.sync(() => window.history.pushState(null, "", path)),
|
|
12
|
+
replace: (path) => Effect.sync(() => window.history.replaceState(null, "", path)),
|
|
13
|
+
back: () => Effect.sync(() => window.history.back()),
|
|
14
|
+
forward: () => Effect.sync(() => window.history.forward()),
|
|
15
|
+
listen: (listener) => {
|
|
16
|
+
const onPop = () => listener(`${window.location.pathname}${window.location.search}${window.location.hash}`);
|
|
17
|
+
window.addEventListener("popstate", onPop);
|
|
18
|
+
return () => window.removeEventListener("popstate", onPop);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export function memoryHistory(initialPath = "/") {
|
|
23
|
+
const entries = [normalizeHref(initialPath)];
|
|
24
|
+
let index = 0;
|
|
25
|
+
const listeners = new Set();
|
|
26
|
+
const notify = () => listeners.forEach((listener) => listener(entries[index]));
|
|
27
|
+
return {
|
|
28
|
+
current: () => Effect.sync(() => entries[index]),
|
|
29
|
+
push: (path) => Effect.sync(() => {
|
|
30
|
+
entries.splice(index + 1, entries.length, normalizeHref(path));
|
|
31
|
+
index++;
|
|
32
|
+
}),
|
|
33
|
+
replace: (path) => Effect.sync(() => {
|
|
34
|
+
entries[index] = normalizeHref(path);
|
|
35
|
+
}),
|
|
36
|
+
back: () => Effect.sync(() => { if (index > 0) {
|
|
37
|
+
index--;
|
|
38
|
+
notify();
|
|
39
|
+
} }),
|
|
40
|
+
forward: () => Effect.sync(() => { if (index < entries.length - 1) {
|
|
41
|
+
index++;
|
|
42
|
+
notify();
|
|
43
|
+
} }),
|
|
44
|
+
listen: (listener) => {
|
|
45
|
+
listeners.add(listener);
|
|
46
|
+
return () => listeners.delete(listener);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export const BrowserHistoryLive = Layer.succeed(PlatformHistory, browserHistory());
|
|
51
|
+
export const VirtualHistoryLive = (initialPath = "/") => Layer.succeed(PlatformHistory, memoryHistory(initialPath));
|
|
52
|
+
export function normalizePath(path) {
|
|
53
|
+
const pathname = new URL(path, "http://fuzor.local").pathname;
|
|
54
|
+
return pathname === "/" ? "/" : `${pathname.replace(/\/+$/, "")}/`;
|
|
55
|
+
}
|
|
56
|
+
export function normalizeHref(path) {
|
|
57
|
+
const url = new URL(path, "http://fuzor.local");
|
|
58
|
+
return `${normalizePath(url.pathname)}${url.search}${url.hash}`;
|
|
59
|
+
}
|
|
60
|
+
export function createRouter(outlet, options = {}) {
|
|
61
|
+
const history = options.host ?? (typeof window === "undefined" ? memoryHistory() : browserHistory());
|
|
62
|
+
const registry = AtomRegistry.make();
|
|
63
|
+
const pathAtom = Atom.make("/");
|
|
64
|
+
const templates = new Map();
|
|
65
|
+
for (const template of document.querySelectorAll("template[data-fuzor-route]")) {
|
|
66
|
+
templates.set(normalizePath(template.dataset.fuzorRoute), template);
|
|
67
|
+
}
|
|
68
|
+
let cleanupIslands = () => { };
|
|
69
|
+
let renderVersion = 0;
|
|
70
|
+
const render = async (path) => {
|
|
71
|
+
const version = ++renderVersion;
|
|
72
|
+
const normalized = Schema.decodeUnknownSync(PathSchema)(normalizePath(path));
|
|
73
|
+
const template = templates.get(normalized);
|
|
74
|
+
if (!template)
|
|
75
|
+
throw new Error(`No Fuzor route for ${normalized}`);
|
|
76
|
+
cleanupIslands();
|
|
77
|
+
outlet.replaceChildren(template.content.cloneNode(true));
|
|
78
|
+
registry.set(pathAtom, normalized);
|
|
79
|
+
const cleanup = await mountIslands(outlet, options.islands ?? {});
|
|
80
|
+
if (version === renderVersion)
|
|
81
|
+
cleanupIslands = cleanup;
|
|
82
|
+
else
|
|
83
|
+
cleanup();
|
|
84
|
+
};
|
|
85
|
+
const navigate = async (path, replace = false) => {
|
|
86
|
+
const href = normalizeHref(path);
|
|
87
|
+
const normalized = normalizePath(href);
|
|
88
|
+
if (!templates.has(normalized))
|
|
89
|
+
throw new Error(`No Fuzor route for ${normalized}`);
|
|
90
|
+
await Effect.runPromise(replace ? history.replace(href) : history.push(href));
|
|
91
|
+
await render(normalized);
|
|
92
|
+
};
|
|
93
|
+
const onClick = (event) => {
|
|
94
|
+
if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)
|
|
95
|
+
return;
|
|
96
|
+
const target = event.target;
|
|
97
|
+
if (!(target instanceof Element))
|
|
98
|
+
return;
|
|
99
|
+
const link = target.closest("a[href]");
|
|
100
|
+
if (!link || link.target || link.hasAttribute("download"))
|
|
101
|
+
return;
|
|
102
|
+
const url = new URL(link.href, window.location.href);
|
|
103
|
+
if (url.origin !== window.location.origin || !templates.has(normalizePath(url.pathname)))
|
|
104
|
+
return;
|
|
105
|
+
event.preventDefault();
|
|
106
|
+
void navigate(url.pathname + url.search + url.hash);
|
|
107
|
+
};
|
|
108
|
+
const start = async () => {
|
|
109
|
+
await render(await Effect.runPromise(history.current()));
|
|
110
|
+
const unlisten = history.listen((path) => void render(path));
|
|
111
|
+
document.addEventListener("click", onClick);
|
|
112
|
+
return () => {
|
|
113
|
+
unlisten();
|
|
114
|
+
document.removeEventListener("click", onClick);
|
|
115
|
+
cleanupIslands();
|
|
116
|
+
registry.dispose();
|
|
117
|
+
};
|
|
118
|
+
};
|
|
119
|
+
return { start, navigate, path: () => registry.get(pathAtom), subscribe: (listener) => registry.subscribe(pathAtom, listener) };
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type IslandModule = {
|
|
2
|
+
readonly mount: (host: HTMLElement, props: Record<string, unknown>) => void | (() => void);
|
|
3
|
+
};
|
|
4
|
+
export type IslandRegistry = Record<string, () => Promise<IslandModule>>;
|
|
5
|
+
export declare function mountIslands(root: ParentNode, registry: IslandRegistry): Promise<() => void>;
|
|
6
|
+
//# sourceMappingURL=islands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"islands.d.ts","sourceRoot":"","sources":["../../src/runtime/islands.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;CAC5F,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;AAEzE,wBAAsB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAmClG"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export async function mountIslands(root, registry) {
|
|
2
|
+
const cleanups = [];
|
|
3
|
+
const pending = Array.from(root.querySelectorAll("fuzor-island[src]"));
|
|
4
|
+
await Promise.all(pending.map(async (host) => {
|
|
5
|
+
let disposed = false;
|
|
6
|
+
const name = host.getAttribute("src");
|
|
7
|
+
const load = registry[name];
|
|
8
|
+
if (!load)
|
|
9
|
+
throw new Error(`Unknown Fuzor island: ${name}`);
|
|
10
|
+
const propsText = host.getAttribute("props") ?? "{}";
|
|
11
|
+
const props = JSON.parse(propsText);
|
|
12
|
+
const activate = async () => {
|
|
13
|
+
if (disposed)
|
|
14
|
+
return;
|
|
15
|
+
const module = await load();
|
|
16
|
+
if (disposed)
|
|
17
|
+
return;
|
|
18
|
+
const cleanup = module.mount(host, props);
|
|
19
|
+
if (cleanup)
|
|
20
|
+
cleanups.push(cleanup);
|
|
21
|
+
};
|
|
22
|
+
cleanups.push(() => { disposed = true; });
|
|
23
|
+
if (host.hasAttribute("client:visible") && typeof IntersectionObserver !== "undefined") {
|
|
24
|
+
const observer = new IntersectionObserver((entries) => {
|
|
25
|
+
if (entries.some((entry) => entry.isIntersecting)) {
|
|
26
|
+
observer.disconnect();
|
|
27
|
+
void activate();
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
observer.observe(host);
|
|
31
|
+
cleanups.push(() => observer.disconnect());
|
|
32
|
+
}
|
|
33
|
+
else if (host.hasAttribute("client:idle") && typeof requestIdleCallback !== "undefined") {
|
|
34
|
+
const handle = requestIdleCallback(() => void activate());
|
|
35
|
+
cleanups.push(() => cancelIdleCallback(handle));
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
await activate();
|
|
39
|
+
}
|
|
40
|
+
}));
|
|
41
|
+
return () => cleanups.forEach((cleanup) => cleanup());
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=islands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"islands.js","sourceRoot":"","sources":["../../src/runtime/islands.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAgB,EAAE,QAAwB;IAC3E,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAc,mBAAmB,CAAC,CAAC,CAAC;IACpF,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QAC3C,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAE,CAAC;QACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAA4B,CAAC;QAC/D,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;YAC1B,IAAI,QAAQ;gBAAE,OAAO;YACrB,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;YAC5B,IAAI,QAAQ;gBAAE,OAAO;YACrB,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC1C,IAAI,OAAO;gBAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC,CAAC;QACF,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,IAAI,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,IAAI,OAAO,oBAAoB,KAAK,WAAW,EAAE,CAAC;YACvF,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CAAC,CAAC,OAAO,EAAE,EAAE;gBACpD,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;oBAClD,QAAQ,CAAC,UAAU,EAAE,CAAC;oBACtB,KAAK,QAAQ,EAAE,CAAC;gBAClB,CAAC;YACH,CAAC,CAAC,CAAC;YACH,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAC7C,CAAC;aAAM,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,OAAO,mBAAmB,KAAK,WAAW,EAAE,CAAC;YAC1F,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;YAC1D,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,EAAE,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC,CAAC;IACJ,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type Server } from "node:http";
|
|
2
|
+
/** Node adapter for a compiled Fuzor SSR entry and its Vite client assets. */
|
|
3
|
+
export declare function createNodeSsrServer(options: {
|
|
4
|
+
readonly handler: (request: Request) => Promise<Response>;
|
|
5
|
+
readonly assetsDir: string;
|
|
6
|
+
}): Server;
|
|
7
|
+
//# sourceMappingURL=node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/ssr/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAStD,8EAA8E;AAC9E,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,GAAG,MAAM,CAiCT"}
|
package/dist/ssr/node.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { createServer } from "node:http";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
const types = {
|
|
5
|
+
".js": "text/javascript", ".css": "text/css", ".svg": "image/svg+xml",
|
|
6
|
+
".png": "image/png", ".jpg": "image/jpeg", ".webp": "image/webp", ".ico": "image/x-icon"
|
|
7
|
+
};
|
|
8
|
+
/** Node adapter for a compiled Fuzor SSR entry and its Vite client assets. */
|
|
9
|
+
export function createNodeSsrServer(options) {
|
|
10
|
+
const assetsRoot = path.resolve(options.assetsDir);
|
|
11
|
+
return createServer(async (request, response) => {
|
|
12
|
+
try {
|
|
13
|
+
const url = new URL(request.url ?? "/", "http://fuzor.local");
|
|
14
|
+
if (url.pathname.startsWith("/assets/")) {
|
|
15
|
+
if (request.method !== "GET" && request.method !== "HEAD") {
|
|
16
|
+
response.writeHead(405, { allow: "GET, HEAD" }).end();
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const file = path.resolve(assetsRoot, `.${url.pathname}`);
|
|
20
|
+
if (!file.startsWith(assetsRoot + path.sep)) {
|
|
21
|
+
response.writeHead(403).end();
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
const body = await readFile(file);
|
|
26
|
+
response.writeHead(200, { "content-type": types[path.extname(file)] ?? "application/octet-stream" });
|
|
27
|
+
response.end(request.method === "HEAD" ? undefined : body);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
if (error.code !== "ENOENT")
|
|
31
|
+
throw error;
|
|
32
|
+
response.writeHead(404).end();
|
|
33
|
+
}
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const result = await options.handler(new Request(url, { method: request.method ?? "GET" }));
|
|
37
|
+
response.writeHead(result.status, Object.fromEntries(result.headers));
|
|
38
|
+
response.end(request.method === "HEAD" ? undefined : Buffer.from(await result.arrayBuffer()));
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
response.writeHead(500, { "content-type": "text/plain; charset=utf-8" });
|
|
42
|
+
response.end(`Fuzor SSR error: ${String(error)}`);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/ssr/node.ts"],"names":[],"mappings":"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"}
|