fuzor 0.0.1 → 0.2.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.
Files changed (98) hide show
  1. package/README.md +112 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +97 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/compiler/index.d.ts +28 -0
  7. package/dist/compiler/index.d.ts.map +1 -0
  8. package/dist/compiler/index.js +160 -0
  9. package/dist/compiler/index.js.map +1 -0
  10. package/dist/compiler/islands.d.ts +17 -0
  11. package/dist/compiler/islands.d.ts.map +1 -0
  12. package/dist/compiler/islands.js +78 -0
  13. package/dist/compiler/islands.js.map +1 -0
  14. package/dist/create.d.ts +21 -0
  15. package/dist/create.d.ts.map +1 -0
  16. package/dist/create.js +111 -0
  17. package/dist/create.js.map +1 -0
  18. package/dist/index.d.ts +8 -8
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +6 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/islands/react.d.ts +8 -0
  23. package/dist/islands/react.d.ts.map +1 -0
  24. package/dist/islands/react.js +19 -0
  25. package/dist/islands/react.js.map +1 -0
  26. package/dist/islands/solid.d.ts +8 -0
  27. package/dist/islands/solid.d.ts.map +1 -0
  28. package/dist/islands/solid.js +15 -0
  29. package/dist/islands/solid.js.map +1 -0
  30. package/dist/islands/vue.d.ts +5 -0
  31. package/dist/islands/vue.d.ts.map +1 -0
  32. package/dist/islands/vue.js +13 -0
  33. package/dist/islands/vue.js.map +1 -0
  34. package/dist/runtime/atom.d.ts +10 -0
  35. package/dist/runtime/atom.d.ts.map +1 -0
  36. package/dist/runtime/atom.js +38 -0
  37. package/dist/runtime/atom.js.map +1 -0
  38. package/dist/runtime/index.d.ts +31 -0
  39. package/dist/runtime/index.d.ts.map +1 -0
  40. package/dist/runtime/index.js +121 -0
  41. package/dist/runtime/index.js.map +1 -0
  42. package/dist/runtime/islands.d.ts +6 -0
  43. package/dist/runtime/islands.d.ts.map +1 -0
  44. package/dist/runtime/islands.js +43 -0
  45. package/dist/runtime/islands.js.map +1 -0
  46. package/dist/ssr/node.d.ts +7 -0
  47. package/dist/ssr/node.d.ts.map +1 -0
  48. package/dist/ssr/node.js +46 -0
  49. package/dist/ssr/node.js.map +1 -0
  50. package/dist/ssr.d.ts +10 -0
  51. package/dist/ssr.d.ts.map +1 -0
  52. package/dist/ssr.js +19 -0
  53. package/dist/ssr.js.map +1 -0
  54. package/dist/vite.d.ts +8 -0
  55. package/dist/vite.d.ts.map +1 -0
  56. package/dist/vite.js +310 -0
  57. package/dist/vite.js.map +1 -0
  58. package/package.json +69 -56
  59. package/templates/basic/README.md +16 -0
  60. package/templates/basic/_gitignore +3 -0
  61. package/templates/basic/components/app-badge.html +1 -0
  62. package/templates/basic/index.html +12 -0
  63. package/templates/basic/islands/counter.ts +13 -0
  64. package/templates/basic/package.json +20 -0
  65. package/templates/basic/pages/about/index.html +5 -0
  66. package/templates/basic/pages/docs/index.md +9 -0
  67. package/templates/basic/pages/index.html +9 -0
  68. package/templates/basic/pages/layout.html +8 -0
  69. package/templates/basic/pnpm-workspace.yaml +5 -0
  70. package/templates/basic/server.mjs +10 -0
  71. package/templates/basic/style.css +1 -0
  72. package/templates/basic/tsconfig.json +13 -0
  73. package/templates/basic/vite.config.ts +4 -0
  74. package/bin/index.js +0 -13
  75. package/dist/core/init.d.ts +0 -7
  76. package/dist/core/router.d.ts +0 -4
  77. package/dist/core/vite-config.d.ts +0 -5
  78. package/dist/init.cjs +0 -237
  79. package/dist/init.js +0 -468
  80. package/dist/lib.cjs +0 -222
  81. package/dist/lib.js +0 -19247
  82. package/dist/render/lit.d.ts +0 -1
  83. package/dist/render/preact.d.ts +0 -1
  84. package/dist/render/react.d.ts +0 -7
  85. package/dist/render/solid.d.ts +0 -1
  86. package/dist/render/svelte.d.ts +0 -6
  87. package/dist/render/vue.d.ts +0 -1
  88. package/dist/utils/create-file-if-not-exists.d.ts +0 -1
  89. package/dist/utils/create-folder-if-not-exist.d.ts +0 -2
  90. package/dist/utils/default-theme-files.d.ts +0 -7
  91. package/dist/utils/file-path-helpers.d.ts +0 -3
  92. package/dist/utils/is-valid-wordpress-slug.d.ts +0 -17
  93. package/dist/utils/read-write-file.d.ts +0 -1
  94. package/dist/utils/remove-file-exists.d.ts +0 -2
  95. package/dist/utils/remove-trailing-slash-url.d.ts +0 -1
  96. package/dist/utils/router-helpers.d.ts +0 -19
  97. package/dist/utils/zip-wp-theme.d.ts +0 -2
  98. 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 { createApphead } from './core/vite-config';
2
- export { UseComponent, renderReactComponent } from './render/react';
3
- // svelte-shim.d.ts
4
- declare module "*.svelte" {
5
- import { SvelteComponent } from "svelte";
6
- const component: typeof SvelteComponent;
7
- export default component;
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,5 @@
1
+ import { type Component } from "vue";
2
+ export declare function vueIsland(Component: Component): {
3
+ mount(host: HTMLElement, props: Record<string, unknown>): () => void;
4
+ };
5
+ //# sourceMappingURL=vue.d.ts.map
@@ -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"}
@@ -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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"}