@pajecawav/yamf 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/LICENSE +21 -0
  2. package/dist/client/index.d.ts +1 -0
  3. package/dist/client/index.js +1 -0
  4. package/dist/components/Head.d.ts +8 -0
  5. package/dist/components/Head.d.ts.map +1 -0
  6. package/dist/components/Head.js +9 -0
  7. package/dist/components/Head.js.map +1 -0
  8. package/dist/context/ssr.d.ts +13 -0
  9. package/dist/context/ssr.d.ts.map +1 -0
  10. package/dist/context/ssr.js +10 -0
  11. package/dist/context/ssr.js.map +1 -0
  12. package/dist/hooks/useEvent.d.ts +8 -0
  13. package/dist/hooks/useEvent.d.ts.map +1 -0
  14. package/dist/hooks/useEvent.js +11 -0
  15. package/dist/hooks/useEvent.js.map +1 -0
  16. package/dist/hooks/useHead.d.ts +13 -0
  17. package/dist/hooks/useHead.d.ts.map +1 -0
  18. package/dist/hooks/useHead.js +15 -0
  19. package/dist/hooks/useHead.js.map +1 -0
  20. package/dist/index.d.ts +8 -0
  21. package/dist/index.js +6 -0
  22. package/dist/island/client.js +59 -0
  23. package/dist/island/client.js.map +1 -0
  24. package/dist/island/types.d.ts +8 -0
  25. package/dist/island/types.d.ts.map +1 -0
  26. package/dist/page.d.ts +24 -0
  27. package/dist/page.d.ts.map +1 -0
  28. package/dist/page.js +51 -0
  29. package/dist/page.js.map +1 -0
  30. package/dist/server/entry.d.mts +14 -0
  31. package/dist/server/entry.d.mts.map +1 -0
  32. package/dist/server/entry.mjs +38 -0
  33. package/dist/server/entry.mjs.map +1 -0
  34. package/dist/server/index.d.mts +3 -0
  35. package/dist/server/index.mjs +3 -0
  36. package/dist/server/island/server.d.mts +23 -0
  37. package/dist/server/island/server.d.mts.map +1 -0
  38. package/dist/server/island/server.mjs +22 -0
  39. package/dist/server/island/server.mjs.map +1 -0
  40. package/dist/server/island/types.d.mts +5 -0
  41. package/dist/server/island/types.d.mts.map +1 -0
  42. package/dist/server/shared/assets.d.mts +14 -0
  43. package/dist/server/shared/assets.d.mts.map +1 -0
  44. package/dist/shared/assets.d.ts +17 -0
  45. package/dist/shared/assets.d.ts.map +1 -0
  46. package/dist/vite/index.d.mts +11 -0
  47. package/dist/vite/index.d.mts.map +1 -0
  48. package/dist/vite/index.mjs +54 -0
  49. package/dist/vite/index.mjs.map +1 -0
  50. package/dist/vite/islands.mjs +85 -0
  51. package/dist/vite/islands.mjs.map +1 -0
  52. package/dist/vite/shared/utils.mjs +10 -0
  53. package/dist/vite/shared/utils.mjs.map +1 -0
  54. package/dist/vite/virtual-assets.mjs +25 -0
  55. package/dist/vite/virtual-assets.mjs.map +1 -0
  56. package/dist/vite/virtual-pages.mjs +35 -0
  57. package/dist/vite/virtual-pages.mjs.map +1 -0
  58. package/dist/vite/virtual-template.mjs +45 -0
  59. package/dist/vite/virtual-template.mjs.map +1 -0
  60. package/package.json +84 -0
  61. package/src/client/index.ts +1 -0
  62. package/src/components/Head.tsx +8 -0
  63. package/src/context/ssr.ts +17 -0
  64. package/src/hooks/useEvent.tsx +13 -0
  65. package/src/hooks/useHead.tsx +27 -0
  66. package/src/index.ts +12 -0
  67. package/src/island/client.tsx +92 -0
  68. package/src/island/server.tsx +51 -0
  69. package/src/island/types.ts +5 -0
  70. package/src/page.tsx +92 -0
  71. package/src/server/entry.tsx +80 -0
  72. package/src/server/index.ts +4 -0
  73. package/src/shared/assets.ts +10 -0
  74. package/src/shared/utils.ts +5 -0
  75. package/src/virtual.d.ts +14 -0
  76. package/src/vite/index.ts +83 -0
  77. package/src/vite/islands.ts +229 -0
  78. package/src/vite/virtual-assets.ts +30 -0
  79. package/src/vite/virtual-pages.ts +40 -0
  80. package/src/vite/virtual-template.ts +62 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 pajecawav
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1 @@
1
+ import "../island/client.js";
@@ -0,0 +1,8 @@
1
+ import { ResolvableHead } from "unhead/types";
2
+
3
+ //#region src/components/Head.d.ts
4
+ type HeadProps = ResolvableHead;
5
+ declare const Head: (props: HeadProps) => void;
6
+ //#endregion
7
+ export { Head, HeadProps };
8
+ //# sourceMappingURL=Head.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Head.d.ts","names":[],"sources":["../../src/components/Head.tsx"],"mappings":";;;KAGY,SAAA,GAAY,cAAA;AAAA,cAEX,IAAA,GAAQ,KAAA,EAAO,SAAA"}
@@ -0,0 +1,9 @@
1
+ import { useHead } from "../hooks/useHead.js";
2
+ //#region src/components/Head.tsx
3
+ const Head = (props) => {
4
+ useHead(props);
5
+ };
6
+ //#endregion
7
+ export { Head };
8
+
9
+ //# sourceMappingURL=Head.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Head.js","names":[],"sources":["../../src/components/Head.tsx"],"sourcesContent":["import { useHead } from \"#/hooks/useHead\";\nimport type { ResolvableHead } from \"unhead/types\";\n\nexport type HeadProps = ResolvableHead;\n\nexport const Head = (props: HeadProps): void => {\n\tuseHead(props);\n};\n"],"mappings":";;AAKA,MAAa,QAAQ,UAA2B;AAC/C,SAAQ,MAAM"}
@@ -0,0 +1,13 @@
1
+ import { EventHandlerRequest } from "nitro/h3";
2
+ import { ServerUnhead } from "unhead/server";
3
+ import { H3Event as H3Event$1 } from "nitro";
4
+
5
+ //#region src/context/ssr.d.ts
6
+ interface SSRContextValue {
7
+ head: ServerUnhead;
8
+ event: H3Event$1<EventHandlerRequest>;
9
+ }
10
+ declare const useSSRContext: () => SSRContextValue | null;
11
+ //#endregion
12
+ export { useSSRContext };
13
+ //# sourceMappingURL=ssr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssr.d.ts","names":[],"sources":["../../src/context/ssr.ts"],"mappings":";;;;;UAKU,eAAA;EACT,IAAA,EAAM,YAAA;EACN,KAAA,EAAO,SAAA,CAAQ,mBAAA;AAAA;AAAA,cAOH,aAAA,QAAoB,eAAA"}
@@ -0,0 +1,10 @@
1
+ import { createContext, useContext } from "hono/jsx";
2
+ //#region src/context/ssr.ts
3
+ const SSRContext = createContext(null);
4
+ const useSSRContext = () => {
5
+ return useContext(SSRContext);
6
+ };
7
+ //#endregion
8
+ export { SSRContext, useSSRContext };
9
+
10
+ //# sourceMappingURL=ssr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssr.js","names":[],"sources":["../../src/context/ssr.ts"],"sourcesContent":["import { type Context, createContext, useContext } from \"hono/jsx\";\nimport type { H3Event } from \"nitro\";\nimport type { EventHandlerRequest } from \"nitro/h3\";\nimport type { ServerUnhead } from \"unhead/server\";\n\ninterface SSRContextValue {\n\thead: ServerUnhead;\n\tevent: H3Event<EventHandlerRequest>;\n}\n\nexport const SSRContext: Context<SSRContextValue | null> = createContext<SSRContextValue | null>(\n\tnull,\n);\n\nexport const useSSRContext = (): SSRContextValue | null => {\n\treturn useContext(SSRContext);\n};\n"],"mappings":";;AAUA,MAAa,aAA8C,cAC1D,KACA;AAED,MAAa,sBAA8C;AAC1D,QAAO,WAAW,WAAW"}
@@ -0,0 +1,8 @@
1
+ import { EventHandlerRequest } from "nitro/h3";
2
+ import { H3Event as H3Event$1 } from "nitro";
3
+
4
+ //#region src/hooks/useEvent.d.ts
5
+ declare const useEvent: () => H3Event$1<EventHandlerRequest>;
6
+ //#endregion
7
+ export { useEvent };
8
+ //# sourceMappingURL=useEvent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEvent.d.ts","names":[],"sources":["../../src/hooks/useEvent.tsx"],"mappings":";;;;cAIa,QAAA,QAAe,SAAA,CAAQ,mBAAA"}
@@ -0,0 +1,11 @@
1
+ import { useSSRContext } from "../context/ssr.js";
2
+ //#region src/hooks/useEvent.tsx
3
+ const useEvent = () => {
4
+ const ctx = useSSRContext();
5
+ if (!ctx) throw new Error("SSR context not found");
6
+ return ctx.event;
7
+ };
8
+ //#endregion
9
+ export { useEvent };
10
+
11
+ //# sourceMappingURL=useEvent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEvent.js","names":[],"sources":["../../src/hooks/useEvent.tsx"],"sourcesContent":["import { useSSRContext } from \"#/context/ssr\";\nimport type { H3Event } from \"nitro\";\nimport type { EventHandlerRequest } from \"nitro/h3\";\n\nexport const useEvent = (): H3Event<EventHandlerRequest> => {\n\tconst ctx = useSSRContext();\n\n\tif (!ctx) {\n\t\tthrow new Error(\"SSR context not found\");\n\t}\n\n\treturn ctx.event;\n};\n"],"mappings":";;AAIA,MAAa,iBAA+C;CAC3D,MAAM,MAAM,eAAe;AAE3B,KAAI,CAAC,IACJ,OAAM,IAAI,MAAM,wBAAwB;AAGzC,QAAO,IAAI"}
@@ -0,0 +1,13 @@
1
+ import { ClientUnhead } from "unhead/client";
2
+ import { ResolvableHead } from "unhead/types";
3
+
4
+ //#region src/hooks/useHead.d.ts
5
+ declare global {
6
+ interface Window {
7
+ __UNHEAD__?: ClientUnhead;
8
+ }
9
+ }
10
+ declare const useHead: (input?: ResolvableHead) => void;
11
+ //#endregion
12
+ export { useHead };
13
+ //# sourceMappingURL=useHead.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useHead.d.ts","names":[],"sources":["../../src/hooks/useHead.tsx"],"mappings":";;;;;YAOW,MAAA;IACT,UAAA,GAAa,YAAA;EAAA;AAAA;AAAA,cAQF,OAAA,GAAW,KAAA,GAAQ,cAAA"}
@@ -0,0 +1,15 @@
1
+ import { useSSRContext } from "../context/ssr.js";
2
+ import { useHead } from "unhead";
3
+ import { createHead } from "unhead/client";
4
+ //#region src/hooks/useHead.tsx
5
+ if (!import.meta.env.SSR) window.__UNHEAD__ = createHead();
6
+ const useHead$1 = (input) => {
7
+ if (import.meta.env.SSR) {
8
+ const ctx = useSSRContext();
9
+ if (ctx?.head) useHead(ctx.head, input);
10
+ } else if (window.__UNHEAD__) useHead(window.__UNHEAD__, input);
11
+ };
12
+ //#endregion
13
+ export { useHead$1 as useHead };
14
+
15
+ //# sourceMappingURL=useHead.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useHead.js","names":["useHead"],"sources":["../../src/hooks/useHead.tsx"],"sourcesContent":["import { useSSRContext } from \"#/context/ssr\";\nimport { useHead as _useHead } from \"unhead\";\nimport type { ClientUnhead } from \"unhead/client\";\nimport { createHead } from \"unhead/client\";\nimport type { ResolvableHead } from \"unhead/types\";\n\ndeclare global {\n\tinterface Window {\n\t\t__UNHEAD__?: ClientUnhead;\n\t}\n}\n\nif (!import.meta.env.SSR) {\n\twindow.__UNHEAD__ = createHead();\n}\n\nexport const useHead = (input?: ResolvableHead): void => {\n\tif (import.meta.env.SSR) {\n\t\tconst ctx = useSSRContext();\n\n\t\tif (ctx?.head) {\n\t\t\t_useHead(ctx.head, input);\n\t\t}\n\t} else if (window.__UNHEAD__) {\n\t\t_useHead(window.__UNHEAD__, input);\n\t}\n};\n"],"mappings":";;;;AAYA,IAAI,CAAC,OAAO,KAAK,IAAI,IACpB,QAAO,aAAa,YAAY;AAGjC,MAAaA,aAAW,UAAiC;AACxD,KAAI,OAAO,KAAK,IAAI,KAAK;EACxB,MAAM,MAAM,eAAe;AAE3B,MAAI,KAAK,KACR,SAAS,IAAI,MAAM,MAAM;YAEhB,OAAO,WACjB,SAAS,OAAO,YAAY,MAAM"}
@@ -0,0 +1,8 @@
1
+ import { ImportAssetsResult, ImportAssetsResultRaw } from "./shared/assets.js";
2
+ import { PageHandler, definePage } from "./page.js";
3
+ import { useSSRContext } from "./context/ssr.js";
4
+ import { useEvent } from "./hooks/useEvent.js";
5
+ import { useHead } from "./hooks/useHead.js";
6
+ import { IslandClientDirective, IslandProps } from "./island/types.js";
7
+ import { Head, HeadProps } from "./components/Head.js";
8
+ export { Head, type HeadProps, type ImportAssetsResult, type ImportAssetsResultRaw, type IslandClientDirective, type IslandProps, type PageHandler, definePage, useEvent, useHead, useSSRContext };
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ import { useSSRContext } from "./context/ssr.js";
2
+ import { definePage } from "./page.js";
3
+ import { useEvent } from "./hooks/useEvent.js";
4
+ import { useHead } from "./hooks/useHead.js";
5
+ import { Head } from "./components/Head.js";
6
+ export { Head, definePage, useEvent, useHead, useSSRContext };
@@ -0,0 +1,59 @@
1
+ import { jsx } from "hono/jsx/jsx-runtime";
2
+ import { parse } from "devalue";
3
+ import { hydrateRoot } from "hono/jsx/dom/client";
4
+ import { withLeadingSlash } from "ufo";
5
+ //#region src/island/client.tsx
6
+ const listeners = /* @__PURE__ */ new WeakMap();
7
+ const observer = new IntersectionObserver((entries) => {
8
+ for (const entry of entries) if (entry.isIntersecting) {
9
+ listeners.get(entry.target)?.();
10
+ unobserve(entry.target);
11
+ }
12
+ });
13
+ const observe = (target, cb) => {
14
+ observer.observe(target);
15
+ listeners.set(target, cb);
16
+ };
17
+ const unobserve = (target) => {
18
+ observer.unobserve(target);
19
+ listeners.delete(target);
20
+ };
21
+ customElements.define("yamf-island", class extends HTMLElement {
22
+ connectedCallback() {
23
+ const islandProps = parse(this.getAttribute("island-props") ?? "{}");
24
+ const islandSrc = this.getAttribute("island-src");
25
+ const islandEntry = this.getAttribute("island-entry");
26
+ const islandClient = this.getAttribute("island-client") ?? "load";
27
+ if (!islandSrc) throw new Error("Missing island-src attribute");
28
+ if (!islandEntry) throw new Error("Missing island-entry attribute");
29
+ const hydrateIsland = (mod) => {
30
+ const Comp = mod[islandEntry];
31
+ if (!Comp) throw new Error(`Missing island entry ${islandEntry} in ${islandSrc}`);
32
+ hydrateRoot(this, /* @__PURE__ */ jsx(Comp, { ...islandProps }));
33
+ };
34
+ const initIsland = () => {
35
+ const src = withLeadingSlash(islandSrc);
36
+ __island_raw_import__(src).then(hydrateIsland);
37
+ };
38
+ switch (islandClient) {
39
+ case "load":
40
+ initIsland();
41
+ break;
42
+ case "idle":
43
+ requestIdleCallback(initIsland);
44
+ break;
45
+ case "visible":
46
+ if (this.firstElementChild) observe(this.firstElementChild, initIsland);
47
+ else initIsland();
48
+ break;
49
+ case "skip": break;
50
+ default: throw new Error(`Invalid island-client value: ${islandClient}`);
51
+ }
52
+ }
53
+ disconnectedCallback() {
54
+ unobserve(this);
55
+ }
56
+ });
57
+ //#endregion
58
+
59
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","names":[],"sources":["../../src/island/client.tsx"],"sourcesContent":["import { parse } from \"devalue\";\nimport type { FC } from \"hono/jsx\";\nimport { hydrateRoot } from \"hono/jsx/dom/client\";\nimport { withLeadingSlash } from \"ufo\";\nimport type { IslandClientDirective } from \"./types\";\n\ndeclare let __island_raw_import__: <T>(file: string) => Promise<T>;\n\nconst listeners = new WeakMap<Element, VoidFunction>();\n\nconst observer = new IntersectionObserver(entries => {\n\tfor (const entry of entries) {\n\t\tif (entry.isIntersecting) {\n\t\t\tlisteners.get(entry.target)?.();\n\t\t\tunobserve(entry.target);\n\t\t}\n\t}\n});\n\nconst observe = (target: Element, cb: VoidFunction) => {\n\tobserver.observe(target);\n\tlisteners.set(target, cb);\n};\n\nconst unobserve = (target: Element) => {\n\tobserver.unobserve(target);\n\tlisteners.delete(target);\n};\n\ncustomElements.define(\n\t\"yamf-island\",\n\tclass extends HTMLElement {\n\t\tpublic connectedCallback() {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\tconst islandProps = parse(this.getAttribute(\"island-props\") ?? \"{}\");\n\t\t\tconst islandSrc = this.getAttribute(\"island-src\");\n\t\t\tconst islandEntry = this.getAttribute(\"island-entry\");\n\t\t\tconst islandClient = (this.getAttribute(\"island-client\") ??\n\t\t\t\t\"load\") as IslandClientDirective;\n\n\t\t\tif (!islandSrc) {\n\t\t\t\tthrow new Error(\"Missing island-src attribute\");\n\t\t\t}\n\n\t\t\tif (!islandEntry) {\n\t\t\t\tthrow new Error(\"Missing island-entry attribute\");\n\t\t\t}\n\n\t\t\tconst hydrateIsland = (mod: Record<string, FC>) => {\n\t\t\t\tconst Comp = mod[islandEntry];\n\n\t\t\t\tif (!Comp) {\n\t\t\t\t\tthrow new Error(`Missing island entry ${islandEntry} in ${islandSrc}`);\n\t\t\t\t}\n\n\t\t\t\thydrateRoot(this, <Comp {...islandProps} />);\n\t\t\t};\n\n\t\t\tconst initIsland = () => {\n\t\t\t\tconst src = withLeadingSlash(islandSrc);\n\t\t\t\tvoid __island_raw_import__<Record<string, FC>>(src).then(hydrateIsland);\n\t\t\t};\n\n\t\t\tswitch (islandClient) {\n\t\t\t\tcase \"load\":\n\t\t\t\t\tinitIsland();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"idle\":\n\t\t\t\t\trequestIdleCallback(initIsland);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"visible\":\n\t\t\t\t\t// yamf-island has `display: contents` which breaks IntersectionObserver\n\t\t\t\t\t// so we have to observe the first child instead if it exists\n\t\t\t\t\tif (this.firstElementChild) {\n\t\t\t\t\t\tobserve(this.firstElementChild, initIsland);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tinitIsland();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"skip\":\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n\t\t\t\t\tthrow new Error(`Invalid island-client value: ${islandClient}`);\n\t\t\t}\n\t\t}\n\n\t\tpublic disconnectedCallback() {\n\t\t\tunobserve(this);\n\t\t}\n\t},\n);\n"],"mappings":";;;;;AAQA,MAAM,4BAAY,IAAI,SAAgC;AAEtD,MAAM,WAAW,IAAI,sBAAqB,YAAW;AACpD,MAAK,MAAM,SAAS,QACnB,KAAI,MAAM,gBAAgB;AACzB,YAAU,IAAI,MAAM,OAAO,IAAI;AAC/B,YAAU,MAAM,OAAO;;EAGxB;AAEF,MAAM,WAAW,QAAiB,OAAqB;AACtD,UAAS,QAAQ,OAAO;AACxB,WAAU,IAAI,QAAQ,GAAG;;AAG1B,MAAM,aAAa,WAAoB;AACtC,UAAS,UAAU,OAAO;AAC1B,WAAU,OAAO,OAAO;;AAGzB,eAAe,OACd,eACA,cAAc,YAAY;CACzB,oBAA2B;EAE1B,MAAM,cAAc,MAAM,KAAK,aAAa,eAAe,IAAI,KAAK;EACpE,MAAM,YAAY,KAAK,aAAa,aAAa;EACjD,MAAM,cAAc,KAAK,aAAa,eAAe;EACrD,MAAM,eAAgB,KAAK,aAAa,gBAAgB,IACvD;AAED,MAAI,CAAC,UACJ,OAAM,IAAI,MAAM,+BAA+B;AAGhD,MAAI,CAAC,YACJ,OAAM,IAAI,MAAM,iCAAiC;EAGlD,MAAM,iBAAiB,QAA4B;GAClD,MAAM,OAAO,IAAI;AAEjB,OAAI,CAAC,KACJ,OAAM,IAAI,MAAM,wBAAwB,YAAY,MAAM,YAAY;AAGvE,eAAY,MAAM,oBAAC,MAAD,EAAM,GAAI,aAAe,CAAA,CAAC;;EAG7C,MAAM,mBAAmB;GACxB,MAAM,MAAM,iBAAiB,UAAU;AAClC,yBAA0C,IAAI,CAAC,KAAK,cAAc;;AAGxE,UAAQ,cAAR;GACC,KAAK;AACJ,gBAAY;AACZ;GACD,KAAK;AACJ,wBAAoB,WAAW;AAC/B;GACD,KAAK;AAGJ,QAAI,KAAK,kBACR,SAAQ,KAAK,mBAAmB,WAAW;QAE3C,aAAY;AAEb;GACD,KAAK,OACJ;GACD,QAEC,OAAM,IAAI,MAAM,gCAAgC,eAAe;;;CAIlE,uBAA8B;AAC7B,YAAU,KAAK;;EAGjB"}
@@ -0,0 +1,8 @@
1
+ //#region src/island/types.d.ts
2
+ type IslandClientDirective = "load" | "idle" | "visible" | "skip";
3
+ interface IslandProps {
4
+ "yamf-client"?: IslandClientDirective;
5
+ }
6
+ //#endregion
7
+ export { IslandClientDirective, IslandProps };
8
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../src/island/types.ts"],"mappings":";KAAY,qBAAA;AAAA,UAEK,WAAA;EAChB,aAAA,GAAgB,qBAAA;AAAA"}
package/dist/page.d.ts ADDED
@@ -0,0 +1,24 @@
1
+ import { ImportAssetsResult } from "./shared/assets.js";
2
+ import { Child, FC, PropsWithChildren } from "hono/jsx";
3
+ import { EventHandlerRequest, EventHandlerResponse, H3Event, HTTPResponse } from "nitro/h3";
4
+ import { Unhead } from "unhead/server";
5
+ import { ResolvableHead } from "unhead/types";
6
+
7
+ //#region src/page.d.ts
8
+ type PageHandler = (event: H3Event<EventHandlerRequest>, params: {
9
+ serverAssets?: ImportAssetsResult;
10
+ head?: ResolvableHead;
11
+ Layout?: FC<PropsWithChildren>;
12
+ }) => EventHandlerResponse;
13
+ type PageRenderer = (event: H3Event<EventHandlerRequest>, params: {
14
+ head: Unhead;
15
+ }) => HTTPResponse | Promise<HTTPResponse> | Child | Promise<Child>;
16
+ interface DefinePageOptions {
17
+ render: PageRenderer;
18
+ stream?: boolean;
19
+ Layout?: FC<PropsWithChildren>;
20
+ }
21
+ declare const definePage: (options: DefinePageOptions) => PageHandler;
22
+ //#endregion
23
+ export { PageHandler, definePage };
24
+ //# sourceMappingURL=page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.d.ts","names":[],"sources":["../src/page.tsx"],"mappings":";;;;;;;KAeY,WAAA,IACX,KAAA,EAAO,OAAA,CAAQ,mBAAA,GACf,MAAA;EACC,YAAA,GAAe,kBAAA;EACf,IAAA,GAAO,cAAA;EACP,MAAA,GAAS,EAAA,CAAG,iBAAA;AAAA,MAET,oBAAA;AAAA,KAEO,YAAA,IACX,KAAA,EAAO,OAAA,CAAQ,mBAAA,GACf,MAAA;EAAU,IAAA,EAAM,MAAA;AAAA,MACZ,YAAA,GAAe,OAAA,CAAQ,YAAA,IAAgB,KAAA,GAAQ,OAAA,CAAQ,KAAA;AAAA,UAElD,iBAAA;EACT,MAAA,EAAQ,YAAA;EACR,MAAA;EACA,MAAA,GAAS,EAAA,CAAG,iBAAA;AAAA;AAAA,cAGA,UAAA,GAAc,OAAA,EAAS,iBAAA,KAAoB,WAAA"}
package/dist/page.js ADDED
@@ -0,0 +1,51 @@
1
+ import { SSRContext } from "./context/ssr.js";
2
+ import { Fragment } from "hono/jsx";
3
+ import { renderToReadableStream } from "hono/jsx/streaming";
4
+ import { Hono } from "hono/tiny";
5
+ import { HTTPResponse, withServerTiming } from "nitro/h3";
6
+ import { transformHtmlTemplate } from "unhead/server";
7
+ import { createStreamableHead, wrapStream } from "unhead/stream/server";
8
+ import { clientAssets } from "virtual:yamf:assets";
9
+ import { template } from "virtual:yamf:template";
10
+ import { jsx } from "hono/jsx/jsx-runtime";
11
+ //#region src/page.tsx
12
+ const definePage = (options) => {
13
+ return async (event, { serverAssets, head: headInit, Layout = options.Layout ?? Fragment }) => {
14
+ const assets = serverAssets ? clientAssets.merge(serverAssets) : clientAssets;
15
+ const { head } = createStreamableHead({ init: [headInit] });
16
+ head.push({
17
+ link: [...assets.js.map((attrs) => ({
18
+ rel: "modulepreload",
19
+ ...attrs
20
+ })), ...assets.css.map((attrs) => ({
21
+ rel: "stylesheet",
22
+ ...attrs
23
+ }))],
24
+ script: [{
25
+ type: "module",
26
+ src: assets.entry
27
+ }]
28
+ });
29
+ const content = await options.render(event, { head });
30
+ if (content instanceof HTTPResponse) return content;
31
+ const App = async () => /* @__PURE__ */ jsx(SSRContext, {
32
+ value: {
33
+ head,
34
+ event
35
+ },
36
+ children: /* @__PURE__ */ jsx(Layout, { children: content })
37
+ });
38
+ const responseInit = { headers: { "Content-Type": "text/html; charset=utf-8" } };
39
+ if (!options.stream) return new Hono().get("/", async (c) => withServerTiming(event, "#render", async () => {
40
+ let html = await (await c.html(/* @__PURE__ */ jsx(App, {}))).text();
41
+ html = transformHtmlTemplate(head, template.replace("<!--ssr-outlet-->", html ?? ""));
42
+ return new Response(html, responseInit);
43
+ })).request("/");
44
+ const stream = wrapStream(head, renderToReadableStream(/* @__PURE__ */ jsx(App, {})), template);
45
+ return new Response(stream, responseInit);
46
+ };
47
+ };
48
+ //#endregion
49
+ export { definePage };
50
+
51
+ //# sourceMappingURL=page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.js","names":[],"sources":["../src/page.tsx"],"sourcesContent":["import type { Child, FC, PropsWithChildren } from \"hono/jsx\";\nimport { Fragment } from \"hono/jsx\";\nimport { renderToReadableStream } from \"hono/jsx/streaming\";\nimport { Hono } from \"hono/tiny\";\nimport type { EventHandlerRequest, EventHandlerResponse, H3Event } from \"nitro/h3\";\nimport { HTTPResponse, withServerTiming } from \"nitro/h3\";\nimport type { Unhead } from \"unhead/server\";\nimport { transformHtmlTemplate } from \"unhead/server\";\nimport { createStreamableHead, wrapStream } from \"unhead/stream/server\";\nimport type { ResolvableHead, ResolvableLink } from \"unhead/types\";\nimport { clientAssets } from \"virtual:yamf:assets\";\nimport { template } from \"virtual:yamf:template\";\nimport { SSRContext } from \"./context/ssr\";\nimport type { ImportAssetsResult } from \"./shared/assets\";\n\nexport type PageHandler = (\n\tevent: H3Event<EventHandlerRequest>,\n\tparams: {\n\t\tserverAssets?: ImportAssetsResult;\n\t\thead?: ResolvableHead;\n\t\tLayout?: FC<PropsWithChildren>;\n\t},\n) => EventHandlerResponse;\n\nexport type PageRenderer = (\n\tevent: H3Event<EventHandlerRequest>,\n\tparams: { head: Unhead },\n) => HTTPResponse | Promise<HTTPResponse> | Child | Promise<Child>;\n\ninterface DefinePageOptions {\n\trender: PageRenderer;\n\tstream?: boolean;\n\tLayout?: FC<PropsWithChildren>;\n}\n\nexport const definePage = (options: DefinePageOptions): PageHandler => {\n\treturn async (event, { serverAssets, head: headInit, Layout = options.Layout ?? Fragment }) => {\n\t\tconst assets = serverAssets ? clientAssets.merge(serverAssets) : clientAssets;\n\n\t\tconst { head } = createStreamableHead({ init: [headInit] });\n\n\t\thead.push({\n\t\t\tlink: [\n\t\t\t\t...assets.js.map((attrs): ResolvableLink => ({ rel: \"modulepreload\", ...attrs })),\n\t\t\t\t...assets.css.map((attrs): ResolvableLink => ({ rel: \"stylesheet\", ...attrs })),\n\t\t\t],\n\t\t\tscript: [{ type: \"module\", src: assets.entry }],\n\t\t});\n\n\t\tconst content = await options.render(event, { head });\n\n\t\tif (content instanceof HTTPResponse) {\n\t\t\treturn content;\n\t\t}\n\n\t\tconst App = async () => (\n\t\t\t<SSRContext value={{ head, event }}>\n\t\t\t\t<Layout>{content}</Layout>\n\t\t\t</SSRContext>\n\t\t);\n\n\t\tconst responseInit = {\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"text/html; charset=utf-8\",\n\t\t\t},\n\t\t};\n\n\t\tif (!options.stream) {\n\t\t\t// TODO: figure out how expensive this is\n\t\t\treturn new Hono()\n\t\t\t\t.get(\"/\", async c =>\n\t\t\t\t\twithServerTiming(event, \"#render\", async () => {\n\t\t\t\t\t\tconst response = await c.html(<App />);\n\n\t\t\t\t\t\tlet html = await response.text();\n\n\t\t\t\t\t\thtml = transformHtmlTemplate(\n\t\t\t\t\t\t\thead,\n\t\t\t\t\t\t\ttemplate.replace(\"<!--ssr-outlet-->\", html ?? \"\"),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn new Response(html, responseInit);\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t.request(\"/\");\n\t\t}\n\n\t\tconst stream = wrapStream(head, renderToReadableStream(<App />), template);\n\n\t\treturn new Response(stream, responseInit);\n\t};\n};\n"],"mappings":";;;;;;;;;;;AAmCA,MAAa,cAAc,YAA4C;AACtE,QAAO,OAAO,OAAO,EAAE,cAAc,MAAM,UAAU,SAAS,QAAQ,UAAU,eAAe;EAC9F,MAAM,SAAS,eAAe,aAAa,MAAM,aAAa,GAAG;EAEjE,MAAM,EAAE,SAAS,qBAAqB,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;AAE3D,OAAK,KAAK;GACT,MAAM,CACL,GAAG,OAAO,GAAG,KAAK,WAA2B;IAAE,KAAK;IAAiB,GAAG;IAAO,EAAE,EACjF,GAAG,OAAO,IAAI,KAAK,WAA2B;IAAE,KAAK;IAAc,GAAG;IAAO,EAAE,CAC/E;GACD,QAAQ,CAAC;IAAE,MAAM;IAAU,KAAK,OAAO;IAAO,CAAC;GAC/C,CAAC;EAEF,MAAM,UAAU,MAAM,QAAQ,OAAO,OAAO,EAAE,MAAM,CAAC;AAErD,MAAI,mBAAmB,aACtB,QAAO;EAGR,MAAM,MAAM,YACX,oBAAC,YAAD;GAAY,OAAO;IAAE;IAAM;IAAO;aACjC,oBAAC,QAAD,EAAA,UAAS,SAAiB,CAAA;GACd,CAAA;EAGd,MAAM,eAAe,EACpB,SAAS,EACR,gBAAgB,4BAChB,EACD;AAED,MAAI,CAAC,QAAQ,OAEZ,QAAO,IAAI,MAAM,CACf,IAAI,KAAK,OAAM,MACf,iBAAiB,OAAO,WAAW,YAAY;GAG9C,IAAI,OAAO,OAFM,MAAM,EAAE,KAAK,oBAAC,KAAD,EAAO,CAAA,CAAC,EAEZ,MAAM;AAEhC,UAAO,sBACN,MACA,SAAS,QAAQ,qBAAqB,QAAQ,GAAG,CACjD;AAED,UAAO,IAAI,SAAS,MAAM,aAAa;IACtC,CACF,CACA,QAAQ,IAAI;EAGf,MAAM,SAAS,WAAW,MAAM,uBAAuB,oBAAC,KAAD,EAAO,CAAA,CAAC,EAAE,SAAS;AAE1E,SAAO,IAAI,SAAS,QAAQ,aAAa"}
@@ -0,0 +1,14 @@
1
+ import { EventHandlerRequest, EventHandlerWithFetch, H3Event } from "nitro/h3";
2
+ import { FC, PropsWithChildren } from "hono/jsx";
3
+ import { ResolvableHead } from "unhead/types";
4
+
5
+ //#region src/server/entry.d.ts
6
+ type ServerEntry = EventHandlerWithFetch<EventHandlerRequest, Promise<unknown>>;
7
+ interface DefineServerEntryOptions {
8
+ head?: ResolvableHead | ((event: H3Event<EventHandlerRequest>) => ResolvableHead);
9
+ Layout?: FC<PropsWithChildren>;
10
+ }
11
+ declare const defineServerEntry: (options?: DefineServerEntryOptions) => ServerEntry;
12
+ //#endregion
13
+ export { DefineServerEntryOptions, ServerEntry, defineServerEntry };
14
+ //# sourceMappingURL=entry.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry.d.mts","names":[],"sources":["../../src/server/entry.tsx"],"mappings":";;;;;KA8CY,WAAA,GAAc,qBAAA,CAAsB,mBAAA,EAAqB,OAAA;AAAA,UAEpD,wBAAA;EAChB,IAAA,GAAO,cAAA,KAAmB,KAAA,EAAO,OAAA,CAAQ,mBAAA,MAAyB,cAAA;EAClE,MAAA,GAAS,EAAA,CAAG,iBAAA;AAAA;AAAA,cAGA,iBAAA,GAAqB,OAAA,GAAU,wBAAA,KAA2B,WAAA"}
@@ -0,0 +1,38 @@
1
+ import { HTTPError, defineHandler, writeEarlyHints } from "nitro/h3";
2
+ import path from "node:path";
3
+ import { addRoute, createRouter, findRoute } from "rou3";
4
+ import { withLeadingSlash, withoutTrailingSlash } from "ufo";
5
+ import { clientAssets } from "virtual:yamf:assets";
6
+ import { assets, pages } from "virtual:yamf:pages";
7
+ //#region src/server/entry.tsx
8
+ const router = createRouter();
9
+ for (const [relativePath, handler] of Object.entries(pages).toSorted((a, b) => a[0].localeCompare(b[0]))) {
10
+ const ext = path.extname(relativePath);
11
+ let route = path.relative("/src/pages", relativePath);
12
+ if (ext.length) route = route.slice(0, -ext.length);
13
+ route = route.replace(/\.[A-Za-z]+$/, "").replace(/\(([^(/\\]+)\)[/\\]/g, "").replace(/\[\.{3}]/g, "**").replace(/\[\.{3}([^\]]+)]/g, (_, p) => "**:" + p.replace(/[^\w-]/g, "_")).replace(/\[([^/\]]+)]/g, (_, p) => ":" + p.replace(/[^\w-]/g, "_")).replace(/(\/|^)index$/, "") || "/";
14
+ route = withLeadingSlash(withoutTrailingSlash(route));
15
+ addRoute(router, "GET", route, {
16
+ handler,
17
+ serverAssets: assets[relativePath]
18
+ });
19
+ }
20
+ const defineServerEntry = (options) => {
21
+ return defineHandler(async (event) => {
22
+ const route = findRoute(router, "GET", event.url.pathname);
23
+ if (!route) throw new HTTPError("Not found", { status: 404 });
24
+ const { handler, serverAssets } = route.data;
25
+ event.context.params = route.params;
26
+ const assets = serverAssets ? serverAssets.merge(clientAssets) : clientAssets;
27
+ await writeEarlyHints(event, { link: [...assets.js.map((script) => `<${script.href}>; rel=modulepreload`), ...assets.css.map((style) => `<${style.href}>; rel=preload; as=style`)] });
28
+ return (await handler())(event, {
29
+ serverAssets,
30
+ head: typeof options?.head === "function" ? options.head(event) : options?.head,
31
+ Layout: options?.Layout
32
+ });
33
+ });
34
+ };
35
+ //#endregion
36
+ export { defineServerEntry };
37
+
38
+ //# sourceMappingURL=entry.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry.mjs","names":["serverAssets"],"sources":["../../src/server/entry.tsx"],"sourcesContent":["import type { PageHandler } from \"#/page\";\nimport type { FC, PropsWithChildren } from \"hono/jsx\";\nimport type { EventHandlerRequest, EventHandlerWithFetch, H3Event } from \"nitro/h3\";\nimport { defineHandler, HTTPError, writeEarlyHints } from \"nitro/h3\";\nimport path from \"node:path\";\nimport { addRoute, createRouter, findRoute } from \"rou3\";\nimport { withLeadingSlash, withoutTrailingSlash } from \"ufo\";\nimport type { ResolvableHead } from \"unhead/types\";\nimport { clientAssets } from \"virtual:yamf:assets\";\nimport { pages, assets as serverAssets } from \"virtual:yamf:pages\";\n\ninterface Route {\n\thandler: () => Promise<PageHandler>;\n\tserverAssets?: ImportAssetsResult;\n}\n\nconst router = createRouter<Route>();\n\nfor (const [relativePath, handler] of Object.entries(pages).toSorted((a, b) =>\n\ta[0].localeCompare(b[0]),\n)) {\n\tconst ext = path.extname(relativePath);\n\n\tlet route = path.relative(\"/src/pages\", relativePath);\n\n\tif (ext.length) {\n\t\troute = route.slice(0, -ext.length);\n\t}\n\n\troute =\n\t\troute\n\t\t\t.replace(/\\.[A-Za-z]+$/, \"\")\n\t\t\t.replace(/\\(([^(/\\\\]+)\\)[/\\\\]/g, \"\")\n\t\t\t.replace(/\\[\\.{3}]/g, \"**\")\n\t\t\t.replace(/\\[\\.{3}([^\\]]+)]/g, (_, p: string) => \"**:\" + p.replace(/[^\\w-]/g, \"_\"))\n\t\t\t.replace(/\\[([^/\\]]+)]/g, (_, p: string) => \":\" + p.replace(/[^\\w-]/g, \"_\"))\n\t\t\t.replace(/(\\/|^)index$/, \"\") || \"/\";\n\n\troute = withLeadingSlash(withoutTrailingSlash(route));\n\n\taddRoute(router, \"GET\", route, {\n\t\thandler,\n\t\tserverAssets: serverAssets[relativePath],\n\t});\n}\n\nexport type ServerEntry = EventHandlerWithFetch<EventHandlerRequest, Promise<unknown>>;\n\nexport interface DefineServerEntryOptions {\n\thead?: ResolvableHead | ((event: H3Event<EventHandlerRequest>) => ResolvableHead);\n\tLayout?: FC<PropsWithChildren>;\n}\n\nexport const defineServerEntry = (options?: DefineServerEntryOptions): ServerEntry => {\n\treturn defineHandler(async event => {\n\t\tconst route = findRoute(router, \"GET\", event.url.pathname);\n\n\t\tif (!route) {\n\t\t\tthrow new HTTPError(\"Not found\", { status: 404 });\n\t\t}\n\n\t\tconst { handler, serverAssets } = route.data;\n\t\tevent.context.params = route.params;\n\n\t\tconst assets = serverAssets ? serverAssets.merge(clientAssets) : clientAssets;\n\n\t\tawait writeEarlyHints(event, {\n\t\t\tlink: [\n\t\t\t\t...assets.js.map(script => `<${script.href}>; rel=modulepreload`),\n\t\t\t\t...assets.css.map(style => `<${style.href}>; rel=preload; as=style`),\n\t\t\t],\n\t\t});\n\n\t\treturn (await handler())(event, {\n\t\t\tserverAssets,\n\t\t\thead: typeof options?.head === \"function\" ? options.head(event) : options?.head,\n\t\t\tLayout: options?.Layout,\n\t\t});\n\t});\n};\n"],"mappings":";;;;;;;AAgBA,MAAM,SAAS,cAAqB;AAEpC,KAAK,MAAM,CAAC,cAAc,YAAY,OAAO,QAAQ,MAAM,CAAC,UAAU,GAAG,MACxE,EAAE,GAAG,cAAc,EAAE,GAAG,CACxB,EAAE;CACF,MAAM,MAAM,KAAK,QAAQ,aAAa;CAEtC,IAAI,QAAQ,KAAK,SAAS,cAAc,aAAa;AAErD,KAAI,IAAI,OACP,SAAQ,MAAM,MAAM,GAAG,CAAC,IAAI,OAAO;AAGpC,SACC,MACE,QAAQ,gBAAgB,GAAG,CAC3B,QAAQ,wBAAwB,GAAG,CACnC,QAAQ,aAAa,KAAK,CAC1B,QAAQ,sBAAsB,GAAG,MAAc,QAAQ,EAAE,QAAQ,WAAW,IAAI,CAAC,CACjF,QAAQ,kBAAkB,GAAG,MAAc,MAAM,EAAE,QAAQ,WAAW,IAAI,CAAC,CAC3E,QAAQ,gBAAgB,GAAG,IAAI;AAElC,SAAQ,iBAAiB,qBAAqB,MAAM,CAAC;AAErD,UAAS,QAAQ,OAAO,OAAO;EAC9B;EACA,cAAcA,OAAa;EAC3B,CAAC;;AAUH,MAAa,qBAAqB,YAAoD;AACrF,QAAO,cAAc,OAAM,UAAS;EACnC,MAAM,QAAQ,UAAU,QAAQ,OAAO,MAAM,IAAI,SAAS;AAE1D,MAAI,CAAC,MACJ,OAAM,IAAI,UAAU,aAAa,EAAE,QAAQ,KAAK,CAAC;EAGlD,MAAM,EAAE,SAAS,iBAAiB,MAAM;AACxC,QAAM,QAAQ,SAAS,MAAM;EAE7B,MAAM,SAAS,eAAe,aAAa,MAAM,aAAa,GAAG;AAEjE,QAAM,gBAAgB,OAAO,EAC5B,MAAM,CACL,GAAG,OAAO,GAAG,KAAI,WAAU,IAAI,OAAO,KAAK,sBAAsB,EACjE,GAAG,OAAO,IAAI,KAAI,UAAS,IAAI,MAAM,KAAK,0BAA0B,CACpE,EACD,CAAC;AAEF,UAAQ,MAAM,SAAS,EAAE,OAAO;GAC/B;GACA,MAAM,OAAO,SAAS,SAAS,aAAa,QAAQ,KAAK,MAAM,GAAG,SAAS;GAC3E,QAAQ,SAAS;GACjB,CAAC;GACD"}
@@ -0,0 +1,3 @@
1
+ import { createIsland } from "./island/server.mjs";
2
+ import { DefineServerEntryOptions, ServerEntry, defineServerEntry } from "./entry.mjs";
3
+ export { type DefineServerEntryOptions, type ServerEntry, createIsland, defineServerEntry };
@@ -0,0 +1,3 @@
1
+ import { createIsland } from "./island/server.mjs";
2
+ import { defineServerEntry } from "./entry.mjs";
3
+ export { createIsland, defineServerEntry };
@@ -0,0 +1,23 @@
1
+ import { ImportAssetsResultRaw } from "../shared/assets.mjs";
2
+ import { IslandClientDirective } from "./types.mjs";
3
+ import { Child, FC } from "hono/jsx";
4
+
5
+ //#region src/island/server.d.ts
6
+ declare module "hono/jsx" {
7
+ namespace JSX {
8
+ interface IntrinsicElements {
9
+ "yamf-island": {
10
+ "island-props"?: string;
11
+ "island-src": string;
12
+ "island-entry": string;
13
+ "island-client": IslandClientDirective;
14
+ children: Child;
15
+ style?: JSX.CSSProperties;
16
+ };
17
+ }
18
+ }
19
+ }
20
+ declare const createIsland: (Component: FC, exportName: string, assets: ImportAssetsResultRaw) => FC;
21
+ //#endregion
22
+ export { createIsland };
23
+ //# sourceMappingURL=server.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.mts","names":[],"sources":["../../../src/island/server.tsx"],"mappings":";;;;;;YAOW,GAAA;IAAA,UACC,iBAAA;MACT,aAAA;QACC,cAAA;QACA,YAAA;QACA,cAAA;QACA,eAAA,EAAiB,qBAAA;QACjB,QAAA,EAAU,KAAA;QACV,KAAA,GAAQ,GAAA,CAAI,aAAA;MAAA;IAAA;EAAA;AAAA;AAAA,cAMH,YAAA,GACZ,SAAA,EAAW,EAAA,EACX,UAAA,UACA,MAAA,EAAQ,qBAAA,KACN,EAAA"}
@@ -0,0 +1,22 @@
1
+ import { stringify } from "devalue";
2
+ import { jsx } from "hono/jsx/jsx-runtime";
3
+ //#region src/island/server.tsx
4
+ const createIsland = (Component, exportName, assets) => {
5
+ const ComponentWrapper = (props) => {
6
+ if (!assets.entry) throw new Error(`Missing island entry for island ${Component.name}`);
7
+ return /* @__PURE__ */ jsx("yamf-island", {
8
+ "island-props": stringify(props),
9
+ "island-src": assets.entry,
10
+ "island-entry": exportName,
11
+ "island-client": props["yamf-client"],
12
+ style: { display: "contents" },
13
+ children: /* @__PURE__ */ jsx(Component, { ...props })
14
+ });
15
+ };
16
+ Object.defineProperty(ComponentWrapper, "name", { value: Component.name });
17
+ return ComponentWrapper;
18
+ };
19
+ //#endregion
20
+ export { createIsland };
21
+
22
+ //# sourceMappingURL=server.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.mjs","names":[],"sources":["../../../src/island/server.tsx"],"sourcesContent":["import type { ImportAssetsResultRaw } from \"#/shared/assets\";\nimport { stringify } from \"devalue\";\nimport type { Child, FC } from \"hono/jsx\";\nimport type { IslandClientDirective } from \"./types\";\n\ndeclare module \"hono/jsx\" {\n\t// eslint-disable-next-line @typescript-eslint/no-namespace\n\tnamespace JSX {\n\t\tinterface IntrinsicElements {\n\t\t\t\"yamf-island\": {\n\t\t\t\t\"island-props\"?: string;\n\t\t\t\t\"island-src\": string;\n\t\t\t\t\"island-entry\": string;\n\t\t\t\t\"island-client\": IslandClientDirective;\n\t\t\t\tchildren: Child;\n\t\t\t\tstyle?: JSX.CSSProperties;\n\t\t\t};\n\t\t}\n\t}\n}\n\nexport const createIsland = (\n\tComponent: FC,\n\texportName: string,\n\tassets: ImportAssetsResultRaw,\n): FC => {\n\tconst ComponentWrapper: FC & { name: string } = props => {\n\t\tif (!assets.entry) {\n\t\t\tthrow new Error(`Missing island entry for island ${Component.name}`);\n\t\t}\n\n\t\treturn (\n\t\t\t<yamf-island\n\t\t\t\tisland-props={stringify(props)}\n\t\t\t\tisland-src={assets.entry}\n\t\t\t\tisland-entry={exportName}\n\t\t\t\tisland-client={props[\"yamf-client\"] as IslandClientDirective}\n\t\t\t\t// TODO: export CSS?\n\t\t\t\tstyle={{ display: \"contents\" }}\n\t\t\t>\n\t\t\t\t<Component {...props} />\n\t\t\t</yamf-island>\n\t\t);\n\t};\n\n\tObject.defineProperty(ComponentWrapper, \"name\", {\n\t\tvalue: Component.name,\n\t});\n\n\treturn ComponentWrapper;\n};\n"],"mappings":";;;AAqBA,MAAa,gBACZ,WACA,YACA,WACQ;CACR,MAAM,oBAA0C,UAAS;AACxD,MAAI,CAAC,OAAO,MACX,OAAM,IAAI,MAAM,mCAAmC,UAAU,OAAO;AAGrE,SACC,oBAAC,eAAD;GACC,gBAAc,UAAU,MAAM;GAC9B,cAAY,OAAO;GACnB,gBAAc;GACd,iBAAe,MAAM;GAErB,OAAO,EAAE,SAAS,YAAY;aAE9B,oBAAC,WAAD,EAAW,GAAI,OAAS,CAAA;GACX,CAAA;;AAIhB,QAAO,eAAe,kBAAkB,QAAQ,EAC/C,OAAO,UAAU,MACjB,CAAC;AAEF,QAAO"}
@@ -0,0 +1,5 @@
1
+ //#region src/island/types.d.ts
2
+ type IslandClientDirective = "load" | "idle" | "visible" | "skip";
3
+ //#endregion
4
+ export { IslandClientDirective };
5
+ //# sourceMappingURL=types.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/island/types.ts"],"mappings":";KAAY,qBAAA"}
@@ -0,0 +1,14 @@
1
+ //#region src/shared/assets.d.ts
2
+ type ImportAssetsResultRaw = {
3
+ entry?: string;
4
+ js: {
5
+ href: string;
6
+ }[];
7
+ css: {
8
+ href: string;
9
+ "data-vite-dev-id"?: string;
10
+ }[];
11
+ };
12
+ //#endregion
13
+ export { ImportAssetsResultRaw };
14
+ //# sourceMappingURL=assets.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.d.mts","names":[],"sources":["../../../src/shared/assets.ts"],"mappings":";KAKY,qBAAA;EACX,KAAA;EACA,EAAA;IAAM,IAAA;EAAA;EACN,GAAA;IAAO,IAAA;IAAc,kBAAA;EAAA;AAAA"}
@@ -0,0 +1,17 @@
1
+ //#region src/shared/assets.d.ts
2
+ type ImportAssetsResult = ImportAssetsResultRaw & {
3
+ merge(...args: ImportAssetsResultRaw[]): ImportAssetsResult;
4
+ };
5
+ type ImportAssetsResultRaw = {
6
+ entry?: string;
7
+ js: {
8
+ href: string;
9
+ }[];
10
+ css: {
11
+ href: string;
12
+ "data-vite-dev-id"?: string;
13
+ }[];
14
+ };
15
+ //#endregion
16
+ export { ImportAssetsResult, ImportAssetsResultRaw };
17
+ //# sourceMappingURL=assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.d.ts","names":[],"sources":["../../src/shared/assets.ts"],"mappings":";KACY,kBAAA,GAAqB,qBAAA;EAChC,KAAA,IAAS,IAAA,EAAM,qBAAA,KAA0B,kBAAA;AAAA;AAAA,KAG9B,qBAAA;EACX,KAAA;EACA,EAAA;IAAM,IAAA;EAAA;EACN,GAAA;IAAO,IAAA;IAAc,kBAAA;EAAA;AAAA"}
@@ -0,0 +1,11 @@
1
+ import { NitroPluginConfig } from "nitro/vite";
2
+ import { PluginOption } from "vite";
3
+
4
+ //#region src/vite/index.d.ts
5
+ interface YamfOptions {
6
+ nitro?: NitroPluginConfig;
7
+ }
8
+ declare const yamf: (options?: YamfOptions) => PluginOption[];
9
+ //#endregion
10
+ export { YamfOptions, yamf as default };
11
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/vite/index.ts"],"mappings":";;;;UASiB,WAAA;EAChB,KAAA,GAAQ,iBAAA;AAAA;AAAA,cAGH,IAAA,GAAQ,OAAA,GAAU,WAAA,KAAc,YAAA"}
@@ -0,0 +1,54 @@
1
+ import { islands } from "./islands.mjs";
2
+ import { virtualAssets } from "./virtual-assets.mjs";
3
+ import { virtualPages } from "./virtual-pages.mjs";
4
+ import { virtualTemplate } from "./virtual-template.mjs";
5
+ import { nitro } from "nitro/vite";
6
+ import { existsSync } from "node:fs";
7
+ //#region src/vite/index.ts
8
+ const yamf = (options) => {
9
+ const plugins = [];
10
+ plugins.push({
11
+ name: "yamf:config",
12
+ config() {
13
+ return {
14
+ optimizeDeps: { include: [
15
+ "hono",
16
+ "hono/jsx/dom/client",
17
+ "hono/jsx/jsx-runtime",
18
+ "devalue",
19
+ "ufo"
20
+ ] },
21
+ environments: {
22
+ ...existsSync("./src/server.tsx") ? { ssr: { build: {
23
+ cssCodeSplit: false,
24
+ rollupOptions: { input: "./src/server.tsx" }
25
+ } } } : {},
26
+ client: { build: { rolldownOptions: { input: "./src/client/index.ts" } } }
27
+ }
28
+ };
29
+ }
30
+ });
31
+ plugins.push(islands());
32
+ plugins.push(virtualAssets());
33
+ plugins.push(virtualPages());
34
+ plugins.push(virtualTemplate());
35
+ plugins.push(nitro({
36
+ serverDir: "./src",
37
+ renderer: false,
38
+ ...options?.nitro,
39
+ compressPublicAssets: {
40
+ gzip: true,
41
+ brotli: true
42
+ },
43
+ publicAssets: [{
44
+ baseURL: "assets",
45
+ dir: "./public/assets",
46
+ maxAge: 365 * 24 * 60 * 60
47
+ }]
48
+ }));
49
+ return plugins;
50
+ };
51
+ //#endregion
52
+ export { yamf as default };
53
+
54
+ //# sourceMappingURL=index.mjs.map