vinojs 0.1.2 → 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 (60) hide show
  1. package/README.md +23 -18
  2. package/dist/client.d.mts +74 -8
  3. package/dist/client.d.mts.map +1 -1
  4. package/dist/client.mjs +194 -53
  5. package/dist/client.mjs.map +1 -1
  6. package/dist/component-wrap.mjs +1 -1
  7. package/dist/config-CXHX9qZs.mjs +17 -0
  8. package/dist/config-CXHX9qZs.mjs.map +1 -0
  9. package/dist/{constants-BVT2bJEd.mjs → constants-DyXAsId-.mjs} +2 -3
  10. package/dist/constants-DyXAsId-.mjs.map +1 -0
  11. package/dist/definePage-DC6gJKwW.mjs +468 -0
  12. package/dist/definePage-DC6gJKwW.mjs.map +1 -0
  13. package/dist/{defineServerFn-H-bz7xBX.mjs → defineServerFn-DH6B99bH.mjs} +2 -17
  14. package/dist/defineServerFn-DH6B99bH.mjs.map +1 -0
  15. package/dist/factory-0LjmIY5F.mjs +123 -0
  16. package/dist/factory-0LjmIY5F.mjs.map +1 -0
  17. package/dist/factory.d.mts +38 -2
  18. package/dist/factory.d.mts.map +1 -0
  19. package/dist/factory.mjs +4 -153
  20. package/dist/hydration.d.mts +3 -0
  21. package/dist/hydration.mjs +2 -0
  22. package/dist/jsx-dev-runtime.client.d.mts +2 -0
  23. package/dist/jsx-dev-runtime.client.mjs +2 -0
  24. package/dist/jsx-dev-runtime.d.mts +2 -0
  25. package/dist/jsx-dev-runtime.mjs +2 -0
  26. package/dist/jsx-runtime-5OIvn_Qa.mjs +335 -0
  27. package/dist/jsx-runtime-5OIvn_Qa.mjs.map +1 -0
  28. package/dist/jsx-runtime-BLN--agM.d.mts +20 -0
  29. package/dist/jsx-runtime-BLN--agM.d.mts.map +1 -0
  30. package/dist/jsx-runtime.client.d.mts +2 -0
  31. package/dist/jsx-runtime.client.mjs +2 -0
  32. package/dist/jsx-runtime.d.mts +2 -0
  33. package/dist/jsx-runtime.mjs +2 -0
  34. package/dist/mount.d.mts +17 -0
  35. package/dist/mount.d.mts.map +1 -0
  36. package/dist/mount.mjs +107 -0
  37. package/dist/mount.mjs.map +1 -0
  38. package/dist/render-Cif1RZMC.d.mts +169 -0
  39. package/dist/render-Cif1RZMC.d.mts.map +1 -0
  40. package/dist/{types-CQITdkpF.d.mts → types-jfsZLl9U.d.mts} +10 -8
  41. package/dist/types-jfsZLl9U.d.mts.map +1 -0
  42. package/dist/vino.d.mts +1 -37
  43. package/dist/vino.d.mts.map +1 -1
  44. package/dist/vino.mjs +2 -201
  45. package/dist/vite.d.mts +1 -1
  46. package/dist/vite.d.mts.map +1 -1
  47. package/dist/vite.mjs +175 -40
  48. package/dist/vite.mjs.map +1 -1
  49. package/package.json +29 -5
  50. package/dist/compile-glNMkyyx.mjs +0 -111
  51. package/dist/compile-glNMkyyx.mjs.map +0 -1
  52. package/dist/constants-BVT2bJEd.mjs.map +0 -1
  53. package/dist/definePage--9Pz7rHs.mjs +0 -73
  54. package/dist/definePage--9Pz7rHs.mjs.map +0 -1
  55. package/dist/defineServerFn-H-bz7xBX.mjs.map +0 -1
  56. package/dist/factory-CVT0-OZw.d.mts +0 -187
  57. package/dist/factory-CVT0-OZw.d.mts.map +0 -1
  58. package/dist/factory.mjs.map +0 -1
  59. package/dist/types-CQITdkpF.d.mts.map +0 -1
  60. package/dist/vino.mjs.map +0 -1
@@ -0,0 +1,335 @@
1
+ //#region src/client/runtime/signal.ts
2
+ const SIGNAL = Symbol.for("vino.signal");
3
+ let activeObserver = null;
4
+ let activeRoot = null;
5
+ function isAccessor(value) {
6
+ return typeof value === "function" && value[SIGNAL] === true;
7
+ }
8
+ function isSignalAccessor(value) {
9
+ return isAccessor(value);
10
+ }
11
+ function createSignal(initial) {
12
+ const state = {
13
+ value: initial,
14
+ observers: /* @__PURE__ */ new Set()
15
+ };
16
+ const get = (() => {
17
+ if (activeObserver) {
18
+ state.observers.add(activeObserver);
19
+ activeObserver.deps.add(state);
20
+ }
21
+ return state.value;
22
+ });
23
+ Object.defineProperty(get, SIGNAL, { value: true });
24
+ Object.defineProperty(get, "isEscaped", { value: true });
25
+ get.toString = () => String(state.value);
26
+ get.valueOf = () => state.value;
27
+ const set = (value) => {
28
+ const next = typeof value === "function" ? value(state.value) : value;
29
+ if (Object.is(next, state.value)) return state.value;
30
+ state.value = next;
31
+ const observers = [...state.observers];
32
+ for (const observer of observers) observer.run();
33
+ return state.value;
34
+ };
35
+ return [get, set];
36
+ }
37
+ function createEffect(fn) {
38
+ const observer = {
39
+ run: () => {},
40
+ deps: /* @__PURE__ */ new Set(),
41
+ cleanups: []
42
+ };
43
+ observer.run = () => {
44
+ for (const dep of observer.deps) dep.observers.delete(observer);
45
+ observer.deps.clear();
46
+ for (const cleanup of observer.cleanups.splice(0)) cleanup();
47
+ const prev = activeObserver;
48
+ activeObserver = observer;
49
+ try {
50
+ const cleanup = fn();
51
+ if (typeof cleanup === "function") observer.cleanups.push(cleanup);
52
+ } finally {
53
+ activeObserver = prev;
54
+ }
55
+ };
56
+ activeRoot?.observers.push(observer);
57
+ observer.run();
58
+ }
59
+ function onCleanup(fn) {
60
+ if (activeObserver) {
61
+ activeObserver.cleanups.push(fn);
62
+ return;
63
+ }
64
+ if (activeRoot) activeRoot.cleanups.push(fn);
65
+ }
66
+ function createRoot(fn) {
67
+ const root = {
68
+ parent: activeRoot,
69
+ observers: [],
70
+ cleanups: []
71
+ };
72
+ const dispose = () => {
73
+ for (const observer of root.observers) {
74
+ for (const dep of observer.deps) dep.observers.delete(observer);
75
+ observer.deps.clear();
76
+ for (const cleanup of observer.cleanups.splice(0)) cleanup();
77
+ }
78
+ root.observers.length = 0;
79
+ for (const cleanup of root.cleanups.splice(0)) cleanup();
80
+ };
81
+ const prev = activeRoot;
82
+ activeRoot = root;
83
+ try {
84
+ return fn(dispose);
85
+ } finally {
86
+ activeRoot = prev;
87
+ }
88
+ }
89
+ function untrack(fn) {
90
+ const prev = activeObserver;
91
+ activeObserver = null;
92
+ try {
93
+ return fn();
94
+ } finally {
95
+ activeObserver = prev;
96
+ }
97
+ }
98
+ //#endregion
99
+ //#region src/client/runtime/dom.ts
100
+ const eventAliasMap = {
101
+ DoubleClick: "dblclick",
102
+ Change: "input"
103
+ };
104
+ const eventCache = /* @__PURE__ */ new Map();
105
+ function getEventSpec(key) {
106
+ if (!key.startsWith("on")) return void 0;
107
+ const cached = eventCache.get(key);
108
+ if (cached !== void 0 || eventCache.has(key)) return cached;
109
+ const match = key.match(/^on([A-Z][a-zA-Z]+?)(Capture)?$/);
110
+ if (!match) {
111
+ eventCache.set(key, void 0);
112
+ return;
113
+ }
114
+ const [, name, capture] = match;
115
+ const spec = [eventAliasMap[name] ?? name.toLowerCase(), Boolean(capture)];
116
+ eventCache.set(key, spec);
117
+ return spec;
118
+ }
119
+ function setAttr(el, key, value) {
120
+ if (key === "className") key = "class";
121
+ if (key === "htmlFor") key = "for";
122
+ if (value == null || value === false) {
123
+ el.removeAttribute(key);
124
+ return;
125
+ }
126
+ if (value === true) {
127
+ el.setAttribute(key, "");
128
+ return;
129
+ }
130
+ if (key === "value" && (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement)) {
131
+ el.value = String(value);
132
+ return;
133
+ }
134
+ if (key === "checked" && el instanceof HTMLInputElement) {
135
+ el.checked = Boolean(value);
136
+ return;
137
+ }
138
+ if (key === "style" && typeof value === "object") {
139
+ const style = el.style;
140
+ style.cssText = "";
141
+ for (const [prop, v] of Object.entries(value)) if (v != null) style.setProperty(prop, String(v));
142
+ return;
143
+ }
144
+ el.setAttribute(key, String(value));
145
+ }
146
+ function setText(node, value) {
147
+ const next = value == null || value === false ? "" : String(value);
148
+ if (node.data !== next) node.data = next;
149
+ }
150
+ function flattenChildren(children) {
151
+ if (children == null || children === false || children === true) return [];
152
+ if (Array.isArray(children)) {
153
+ const out = [];
154
+ for (const child of children) out.push(...flattenChildren(child));
155
+ return out;
156
+ }
157
+ return [children];
158
+ }
159
+ function appendNode(parent, child) {
160
+ parent.appendChild(typeof child === "string" ? document.createTextNode(child) : child);
161
+ }
162
+ //#endregion
163
+ //#region src/client/runtime/jsx-runtime.ts
164
+ let hydrateStack = [];
165
+ function isHydrating() {
166
+ return hydrateStack.length > 0;
167
+ }
168
+ function pushHydrateCursor(parent) {
169
+ hydrateStack.push({
170
+ parent,
171
+ nodes: Array.from(parent.childNodes),
172
+ index: 0
173
+ });
174
+ }
175
+ function popHydrateCursor() {
176
+ hydrateStack.pop();
177
+ }
178
+ function takeNextNode() {
179
+ const cursor = hydrateStack[hydrateStack.length - 1];
180
+ if (!cursor) return null;
181
+ while (cursor.index < cursor.nodes.length) {
182
+ const node = cursor.nodes[cursor.index++];
183
+ if (node.nodeType === 3 && !node.textContent?.trim()) continue;
184
+ return node;
185
+ }
186
+ return null;
187
+ }
188
+ function resolveDynamic(value) {
189
+ if (isSignalAccessor(value)) return value();
190
+ if (typeof value === "function" && value.length === 0) try {
191
+ return value();
192
+ } catch {
193
+ return value;
194
+ }
195
+ return value;
196
+ }
197
+ function isDynamic(value) {
198
+ return isSignalAccessor(value) || typeof value === "function" && value.length === 0;
199
+ }
200
+ function isDomNode(value) {
201
+ return typeof value === "object" && value !== null && "nodeType" in value && typeof value.nodeType === "number";
202
+ }
203
+ function normalizeNodes(value) {
204
+ if (value == null || value === false || value === true) return [];
205
+ if (typeof value === "string" || typeof value === "number") return [document.createTextNode(String(value))];
206
+ if (isDomNode(value)) return [value];
207
+ if (Array.isArray(value)) return value.flatMap(normalizeNodes);
208
+ return [document.createTextNode(String(value))];
209
+ }
210
+ function claimOrCreateElement(tag) {
211
+ if (isHydrating()) {
212
+ const node = takeNextNode();
213
+ if (node && node.nodeType === 1 && node.tagName.toLowerCase() === tag.toLowerCase()) return node;
214
+ }
215
+ return document.createElement(tag);
216
+ }
217
+ /**
218
+ * Claim an SSR text node, or create one. When SSR merged adjacent text
219
+ * (`"Count: 3"`) but the client has a static prefix (`"Count: "`), split so
220
+ * the remainder stays available for the next claim (e.g. a signal).
221
+ */
222
+ function claimOrCreateText(initial = "") {
223
+ if (isHydrating()) {
224
+ const cursor = hydrateStack[hydrateStack.length - 1];
225
+ const node = takeNextNode();
226
+ if (node && node.nodeType === 3) {
227
+ const text = node;
228
+ if (initial !== "" && text.data !== initial && text.data.startsWith(initial)) {
229
+ const rest = text.splitText(initial.length);
230
+ cursor?.nodes.splice(cursor.index, 0, rest);
231
+ }
232
+ return text;
233
+ }
234
+ }
235
+ return document.createTextNode(initial);
236
+ }
237
+ /** Append `child` when it is not already under `parent` (create-mode or hydrate miss). */
238
+ function attach(parent, child) {
239
+ if (child.parentNode !== parent) parent.appendChild(child);
240
+ }
241
+ function mountChildren(parent, children) {
242
+ const hydrating = isHydrating();
243
+ if (hydrating) pushHydrateCursor(parent);
244
+ try {
245
+ for (const child of flattenChildren(children)) {
246
+ if (child == null || child === false || child === true) continue;
247
+ if (isDomNode(child)) {
248
+ attach(parent, child);
249
+ continue;
250
+ }
251
+ if (isDynamic(child)) {
252
+ const text = claimOrCreateText("");
253
+ attach(parent, text);
254
+ createEffect(() => {
255
+ setText(text, resolveDynamic(child));
256
+ });
257
+ continue;
258
+ }
259
+ if (typeof child === "string" || typeof child === "number") {
260
+ const text = claimOrCreateText(String(child));
261
+ if (text.parentNode !== parent) parent.appendChild(text);
262
+ else setText(text, child);
263
+ continue;
264
+ }
265
+ const text = claimOrCreateText(String(child));
266
+ if (text.parentNode !== parent) appendNode(parent, text);
267
+ else setText(text, child);
268
+ }
269
+ } finally {
270
+ if (hydrating) popHydrateCursor();
271
+ }
272
+ }
273
+ function applyProps(el, props) {
274
+ for (const [key, value] of Object.entries(props)) {
275
+ if (key === "children" || key === "key") continue;
276
+ if (key === "ref") {
277
+ if (typeof value === "function") {
278
+ value(el);
279
+ onCleanup(() => value(null));
280
+ } else if (value && typeof value === "object" && "current" in value) {
281
+ value.current = el;
282
+ onCleanup(() => {
283
+ value.current = null;
284
+ });
285
+ }
286
+ continue;
287
+ }
288
+ const event = getEventSpec(key);
289
+ if (event) {
290
+ if (typeof value === "function") {
291
+ const [name, capture] = event;
292
+ el.addEventListener(name, value, capture);
293
+ onCleanup(() => el.removeEventListener(name, value, capture));
294
+ }
295
+ continue;
296
+ }
297
+ if (isDynamic(value)) {
298
+ createEffect(() => {
299
+ setAttr(el, key, resolveDynamic(value));
300
+ });
301
+ continue;
302
+ }
303
+ setAttr(el, key, value);
304
+ }
305
+ }
306
+ function jsx(type, props, _key) {
307
+ const safeProps = props ?? {};
308
+ if (typeof type === "function") {
309
+ const nodes = normalizeNodes(type(safeProps));
310
+ if (nodes.length === 0) return null;
311
+ if (nodes.length === 1) return nodes[0];
312
+ const frag = document.createDocumentFragment();
313
+ for (const node of nodes) frag.appendChild(node);
314
+ return frag;
315
+ }
316
+ if (type === "") {
317
+ const frag = document.createDocumentFragment();
318
+ mountChildren(frag, safeProps.children);
319
+ return frag;
320
+ }
321
+ const el = claimOrCreateElement(type);
322
+ applyProps(el, safeProps);
323
+ mountChildren(el, safeProps.children);
324
+ return el;
325
+ }
326
+ const jsxs = jsx;
327
+ function Fragment(props) {
328
+ const frag = document.createDocumentFragment();
329
+ mountChildren(frag, props.children);
330
+ return frag;
331
+ }
332
+ //#endregion
333
+ export { pushHydrateCursor as a, createSignal as c, untrack as d, popHydrateCursor as i, isSignalAccessor as l, jsx as n, createEffect as o, jsxs as r, createRoot as s, Fragment as t, onCleanup as u };
334
+
335
+ //# sourceMappingURL=jsx-runtime-5OIvn_Qa.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx-runtime-5OIvn_Qa.mjs","names":[],"sources":["../src/client/runtime/signal.ts","../src/client/runtime/dom.ts","../src/client/runtime/jsx-runtime.ts"],"sourcesContent":["export type Accessor<T> = {\n (): T;\n readonly [SIGNAL]: true;\n};\n\nexport type Setter<T> = (value: T | ((prev: T) => T)) => T;\n\nexport type Signal<T> = [get: Accessor<T>, set: Setter<T>];\n\nexport const SIGNAL = Symbol.for(\"vino.signal\");\n\ntype Observer = {\n run: () => void;\n deps: Set<SignalState<unknown>>;\n cleanups: Array<() => void>;\n};\n\ntype SignalState<T> = {\n value: T;\n observers: Set<Observer>;\n};\n\ntype Root = {\n parent: Root | null;\n observers: Observer[];\n cleanups: Array<() => void>;\n};\n\nlet activeObserver: Observer | null = null;\nlet activeRoot: Root | null = null;\n\nfunction isAccessor(value: unknown): value is Accessor<unknown> {\n return typeof value === \"function\" && (value as Accessor<unknown>)[SIGNAL] === true;\n}\n\nexport function isSignalAccessor(value: unknown): value is Accessor<unknown> {\n return isAccessor(value);\n}\n\nexport function createSignal<T>(initial: T): Signal<T> {\n const state: SignalState<T> = {\n value: initial,\n observers: new Set(),\n };\n\n const get = (() => {\n if (activeObserver) {\n state.observers.add(activeObserver);\n activeObserver.deps.add(state as SignalState<unknown>);\n }\n return state.value;\n }) as Accessor<T>;\n\n Object.defineProperty(get, SIGNAL, { value: true });\n // Let hono/jsx SSR stringify the current value when a signal is used as a child.\n Object.defineProperty(get, \"isEscaped\", { value: true });\n get.toString = () => String(state.value);\n get.valueOf = () => state.value as never;\n\n const set: Setter<T> = (value) => {\n const next =\n typeof value === \"function\" ? (value as (prev: T) => T)(state.value) : value;\n if (Object.is(next, state.value)) return state.value;\n state.value = next;\n const observers = [...state.observers];\n for (const observer of observers) observer.run();\n return state.value;\n };\n\n return [get, set];\n}\n\nexport function createEffect(fn: () => void | (() => void)): void {\n const observer: Observer = {\n run: () => {},\n deps: new Set(),\n cleanups: [],\n };\n\n observer.run = () => {\n for (const dep of observer.deps) dep.observers.delete(observer);\n observer.deps.clear();\n for (const cleanup of observer.cleanups.splice(0)) cleanup();\n\n const prev = activeObserver;\n activeObserver = observer;\n try {\n const cleanup = fn();\n if (typeof cleanup === \"function\") observer.cleanups.push(cleanup);\n } finally {\n activeObserver = prev;\n }\n };\n\n activeRoot?.observers.push(observer);\n observer.run();\n}\n\nexport function onCleanup(fn: () => void): void {\n if (activeObserver) {\n activeObserver.cleanups.push(fn);\n return;\n }\n if (activeRoot) {\n activeRoot.cleanups.push(fn);\n }\n}\n\nexport function createRoot<T>(fn: (dispose: () => void) => T): T {\n const root: Root = {\n parent: activeRoot,\n observers: [],\n cleanups: [],\n };\n\n const dispose = () => {\n for (const observer of root.observers) {\n for (const dep of observer.deps) dep.observers.delete(observer);\n observer.deps.clear();\n for (const cleanup of observer.cleanups.splice(0)) cleanup();\n }\n root.observers.length = 0;\n for (const cleanup of root.cleanups.splice(0)) cleanup();\n };\n\n const prev = activeRoot;\n activeRoot = root;\n try {\n return fn(dispose);\n } finally {\n activeRoot = prev;\n }\n}\n\nexport function untrack<T>(fn: () => T): T {\n const prev = activeObserver;\n activeObserver = null;\n try {\n return fn();\n } finally {\n activeObserver = prev;\n }\n}\n","const eventAliasMap: Record<string, string> = {\n DoubleClick: \"dblclick\",\n Change: \"input\",\n};\n\nconst eventCache = new Map<string, [string, boolean] | undefined>();\n\nexport function getEventSpec(key: string): [string, boolean] | undefined {\n if (!key.startsWith(\"on\")) return undefined;\n const cached = eventCache.get(key);\n if (cached !== undefined || eventCache.has(key)) return cached;\n\n const match = key.match(/^on([A-Z][a-zA-Z]+?)(Capture)?$/);\n if (!match) {\n eventCache.set(key, undefined);\n return undefined;\n }\n const [, name, capture] = match;\n const aliased = eventAliasMap[name] ?? name.toLowerCase();\n const spec: [string, boolean] = [aliased, Boolean(capture)];\n eventCache.set(key, spec);\n return spec;\n}\n\nexport function setAttr(el: Element, key: string, value: unknown): void {\n if (key === \"className\") key = \"class\";\n if (key === \"htmlFor\") key = \"for\";\n\n if (value == null || value === false) {\n el.removeAttribute(key);\n return;\n }\n if (value === true) {\n el.setAttribute(key, \"\");\n return;\n }\n if (key === \"value\" && (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement)) {\n el.value = String(value);\n return;\n }\n if (key === \"checked\" && el instanceof HTMLInputElement) {\n el.checked = Boolean(value);\n return;\n }\n if (key === \"style\" && typeof value === \"object\") {\n const style = (el as HTMLElement).style;\n style.cssText = \"\";\n for (const [prop, v] of Object.entries(value as Record<string, string>)) {\n if (v != null) style.setProperty(prop, String(v));\n }\n return;\n }\n el.setAttribute(key, String(value));\n}\n\nexport function setText(node: Text, value: unknown): void {\n const next = value == null || value === false ? \"\" : String(value);\n if (node.data !== next) node.data = next;\n}\n\nexport function flattenChildren(children: unknown): unknown[] {\n if (children == null || children === false || children === true) return [];\n if (Array.isArray(children)) {\n const out: unknown[] = [];\n for (const child of children) out.push(...flattenChildren(child));\n return out;\n }\n return [children];\n}\n\nexport function appendNode(parent: Node, child: Node | string): void {\n parent.appendChild(typeof child === \"string\" ? document.createTextNode(child) : child);\n}\n","import { appendNode, flattenChildren, getEventSpec, setAttr, setText } from \"./dom.ts\";\nimport { createEffect, isSignalAccessor, onCleanup } from \"./signal.ts\";\n\nexport type Props = Record<string, unknown> & { children?: unknown };\n\ntype Component = (props: Props) => Node | Node[] | null | undefined | string | number | boolean;\n\n/** Cursor stack for claiming SSR nodes while hydrating. */\ntype HydrateCursor = {\n parent: Node;\n nodes: ChildNode[];\n index: number;\n};\n\nlet hydrateStack: HydrateCursor[] = [];\n\nexport function isHydrating(): boolean {\n return hydrateStack.length > 0;\n}\n\nexport function pushHydrateCursor(parent: Node): void {\n hydrateStack.push({\n parent,\n nodes: Array.from(parent.childNodes),\n index: 0,\n });\n}\n\nexport function popHydrateCursor(): void {\n hydrateStack.pop();\n}\n\nfunction takeNextNode(): ChildNode | null {\n const cursor = hydrateStack[hydrateStack.length - 1];\n if (!cursor) return null;\n while (cursor.index < cursor.nodes.length) {\n const node = cursor.nodes[cursor.index++]!;\n if (node.nodeType === 3 && !node.textContent?.trim()) continue;\n return node;\n }\n return null;\n}\n\nfunction resolveDynamic(value: unknown): unknown {\n if (isSignalAccessor(value)) return value();\n if (typeof value === \"function\" && value.length === 0) {\n try {\n return (value as () => unknown)();\n } catch {\n return value;\n }\n }\n return value;\n}\n\nfunction isDynamic(value: unknown): boolean {\n return isSignalAccessor(value) || (typeof value === \"function\" && value.length === 0);\n}\n\nfunction isDomNode(value: unknown): value is Node {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"nodeType\" in value &&\n typeof (value as Node).nodeType === \"number\"\n );\n}\n\nfunction normalizeNodes(value: unknown): Node[] {\n if (value == null || value === false || value === true) return [];\n if (typeof value === \"string\" || typeof value === \"number\") {\n return [document.createTextNode(String(value))];\n }\n if (isDomNode(value)) return [value];\n if (Array.isArray(value)) return value.flatMap(normalizeNodes);\n return [document.createTextNode(String(value))];\n}\n\nfunction claimOrCreateElement(tag: string): Element {\n if (isHydrating()) {\n const node = takeNextNode();\n if (node && node.nodeType === 1 && (node as Element).tagName.toLowerCase() === tag.toLowerCase()) {\n return node as Element;\n }\n }\n return document.createElement(tag);\n}\n\n/**\n * Claim an SSR text node, or create one. When SSR merged adjacent text\n * (`\"Count: 3\"`) but the client has a static prefix (`\"Count: \"`), split so\n * the remainder stays available for the next claim (e.g. a signal).\n */\nfunction claimOrCreateText(initial = \"\"): Text {\n if (isHydrating()) {\n const cursor = hydrateStack[hydrateStack.length - 1];\n const node = takeNextNode();\n if (node && node.nodeType === 3) {\n const text = node as Text;\n if (initial !== \"\" && text.data !== initial && text.data.startsWith(initial)) {\n const rest = text.splitText(initial.length);\n cursor?.nodes.splice(cursor.index, 0, rest);\n }\n return text;\n }\n }\n return document.createTextNode(initial);\n}\n\n/** Append `child` when it is not already under `parent` (create-mode or hydrate miss). */\nfunction attach(parent: Node, child: Node): void {\n if (child.parentNode !== parent) parent.appendChild(child);\n}\n\nfunction mountChildren(parent: Element | DocumentFragment, children: unknown): void {\n const hydrating = isHydrating();\n if (hydrating) pushHydrateCursor(parent);\n\n try {\n for (const child of flattenChildren(children)) {\n if (child == null || child === false || child === true) continue;\n\n if (isDomNode(child)) {\n attach(parent, child);\n continue;\n }\n\n if (isDynamic(child)) {\n const text = claimOrCreateText(\"\");\n attach(parent, text);\n createEffect(() => {\n setText(text, resolveDynamic(child));\n });\n continue;\n }\n\n if (typeof child === \"string\" || typeof child === \"number\") {\n const text = claimOrCreateText(String(child));\n if (text.parentNode !== parent) parent.appendChild(text);\n else setText(text, child);\n continue;\n }\n\n const text = claimOrCreateText(String(child));\n if (text.parentNode !== parent) appendNode(parent, text);\n else setText(text, child);\n }\n } finally {\n if (hydrating) popHydrateCursor();\n }\n}\n\nfunction applyProps(el: Element, props: Props): void {\n for (const [key, value] of Object.entries(props)) {\n if (key === \"children\" || key === \"key\") continue;\n\n if (key === \"ref\") {\n if (typeof value === \"function\") {\n value(el);\n onCleanup(() => value(null));\n } else if (value && typeof value === \"object\" && \"current\" in value) {\n (value as { current: Element | null }).current = el;\n onCleanup(() => {\n (value as { current: Element | null }).current = null;\n });\n }\n continue;\n }\n\n const event = getEventSpec(key);\n if (event) {\n if (typeof value === \"function\") {\n const [name, capture] = event;\n el.addEventListener(name, value as EventListener, capture);\n onCleanup(() => el.removeEventListener(name, value as EventListener, capture));\n }\n continue;\n }\n\n if (isDynamic(value)) {\n createEffect(() => {\n setAttr(el, key, resolveDynamic(value));\n });\n continue;\n }\n\n setAttr(el, key, value);\n }\n}\n\nexport function jsx(\n type: string | Component,\n props: Props | null,\n _key?: string | number,\n): Node | DocumentFragment | null {\n const safeProps = props ?? {};\n\n if (typeof type === \"function\") {\n const result = type(safeProps);\n const nodes = normalizeNodes(result);\n if (nodes.length === 0) return null;\n if (nodes.length === 1) return nodes[0]!;\n const frag = document.createDocumentFragment();\n for (const node of nodes) frag.appendChild(node);\n return frag;\n }\n\n if (type === \"\") {\n const frag = document.createDocumentFragment();\n mountChildren(frag, safeProps.children);\n return frag;\n }\n\n const el = claimOrCreateElement(type);\n applyProps(el, safeProps);\n mountChildren(el, safeProps.children);\n return el;\n}\n\nexport const jsxs = jsx;\n\nexport function Fragment(props: Props): DocumentFragment {\n const frag = document.createDocumentFragment();\n mountChildren(frag, props.children);\n return frag;\n}\n\nexport namespace JSX {\n export type Element = Node | DocumentFragment | null;\n export interface IntrinsicElements {\n [elemName: string]: Props;\n }\n export interface ElementChildrenAttribute {\n children: unknown;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ //#region src/client/runtime/jsx-runtime.d.ts
2
+ type Props = Record<string, unknown> & {
3
+ children?: unknown;
4
+ };
5
+ type Component = (props: Props) => Node | Node[] | null | undefined | string | number | boolean;
6
+ declare function jsx(type: string | Component, props: Props | null, _key?: string | number): Node | DocumentFragment | null;
7
+ declare const jsxs: typeof jsx;
8
+ declare function Fragment(props: Props): DocumentFragment;
9
+ declare namespace JSX {
10
+ type Element = Node | DocumentFragment | null;
11
+ interface IntrinsicElements {
12
+ [elemName: string]: Props;
13
+ }
14
+ interface ElementChildrenAttribute {
15
+ children: unknown;
16
+ }
17
+ }
18
+ //#endregion
19
+ export { jsxs as a, jsx as i, JSX as n, Props as r, Fragment as t };
20
+ //# sourceMappingURL=jsx-runtime-BLN--agM.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx-runtime-BLN--agM.d.mts","names":[],"sources":["../src/client/runtime/jsx-runtime.ts"],"mappings":";KAGY,QAAQ;EAA4B;;KAE3C,aAAa,OAAO,UAAU,OAAO;iBAyL1B,IACd,eAAe,WACf,OAAO,cACP,yBACC,OAAO;cAyBG,aAAI;iBAED,SAAS,OAAO,QAAQ;kBAMvB;OACH,UAAU,OAAO;YACZ;KACd,mBAAmB;;YAEL;IACf"}
@@ -0,0 +1,2 @@
1
+ import { a as jsxs, i as jsx, n as JSX, r as Props, t as Fragment } from "./jsx-runtime-BLN--agM.mjs";
2
+ export { Fragment, type JSX, type Props, jsx, jsxs };
@@ -0,0 +1,2 @@
1
+ import { n as jsx, r as jsxs, t as Fragment } from "./jsx-runtime-5OIvn_Qa.mjs";
2
+ export { Fragment, jsx, jsxs };
@@ -0,0 +1,2 @@
1
+ import { Fragment, JSX, jsx, jsxAttr, jsxEscape, jsxTemplate, jsxs } from "hono/jsx/jsx-runtime";
2
+ export { Fragment, type JSX, jsx, jsxAttr, jsxEscape, jsxTemplate, jsxs };
@@ -0,0 +1,2 @@
1
+ import { Fragment, jsx, jsxAttr, jsxEscape, jsxTemplate, jsxs } from "hono/jsx/jsx-runtime";
2
+ export { Fragment, jsx, jsxAttr, jsxEscape, jsxTemplate, jsxs };
@@ -0,0 +1,17 @@
1
+ import { c as VinoManifest, i as ManifestPage, t as CreateVinoOptions } from "./types-jfsZLl9U.mjs";
2
+ import { Env, Hono, Schema } from "hono";
3
+ import { BlankSchema } from "hono/types";
4
+ //#region src/mount/createVino.d.ts
5
+ /**
6
+ * Mount filesystem pages from the Vite-generated manifest onto a existing Hono app.
7
+ */
8
+ declare function mountVino<E extends Env, S extends Schema, BasePath extends string>(app: Hono<E, S, BasePath>, options?: CreateVinoOptions): Hono<E, S, BasePath>;
9
+ /**
10
+ * Create a new Vino app. Returns a Hono app with the Vino pages mounted.
11
+ * @param options - The options for the Vino app.
12
+ * @returns A Hono app with the Vino pages mounted.
13
+ */
14
+ declare function createVino<E extends Env = Env, S extends Schema = BlankSchema, BasePath extends string = "/">(options?: CreateVinoOptions): Hono<E, S, BasePath>;
15
+ //#endregion
16
+ export { type CreateVinoOptions, type ManifestPage, type VinoManifest, createVino, mountVino };
17
+ //# sourceMappingURL=mount.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mount.d.mts","names":[],"sources":["../src/mount/createVino.ts"],"mappings":";;;;;;;iBA+GgB,UAAU,UAAU,KAAK,UAAU,QAAQ,yBAAyB,KAAK,KAAK,GAAG,GAAG,WAAW,UAAS,oBAAyB,KAAK,GAAG,GAAG;;;;;;iBAc5I,WAAW,UAAU,MAAM,KAAK,UAAU,SAAS,aAAa,+BAA+B,UAAS,oBAAyB,KAAK,GAAG,GAAG"}
package/dist/mount.mjs ADDED
@@ -0,0 +1,107 @@
1
+ import "./constants-DyXAsId-.mjs";
2
+ import { T as renderPageHtml, d as readPageDefinition, f as resolvePageRender, i as bindPageRun, s as dispatchHandlers, w as isHonoApp } from "./definePage-DC6gJKwW.mjs";
3
+ import { n as loadMergedData, t as loadMergedConfig } from "./config-CXHX9qZs.mjs";
4
+ import { a as readBoundInitApp, i as initAppMiddleware, n as applyInitApp, o as readPageModuleInitApp } from "./factory-0LjmIY5F.mjs";
5
+ import { jsxDEV } from "hono/jsx/jsx-dev-runtime";
6
+ import { Hono } from "hono";
7
+ import { manifest } from "virtual:vino/manifest";
8
+ import { clientScriptSrc, isDev } from "virtual:vino/assets";
9
+ //#region src/mount/createVino.ts
10
+ function requestParams(c) {
11
+ try {
12
+ return c.req.param();
13
+ } catch {
14
+ return {};
15
+ }
16
+ }
17
+ function pageFromModule(pageMod, data, params) {
18
+ const Page = resolvePageRender(pageMod.default);
19
+ if (Page) return jsxDEV(Page, {
20
+ data,
21
+ params
22
+ });
23
+ return pageMod.default;
24
+ }
25
+ function resolveRenderMode(c) {
26
+ if (c.req.header("X-Vino-Nav")) return "content";
27
+ return "full";
28
+ }
29
+ async function handlePage(c, page) {
30
+ const pageMod = await page.loadPage();
31
+ const def = readPageDefinition(pageMod.default);
32
+ if (def) {
33
+ bindPageRun(c, () => handlePageBody(c, page, pageMod));
34
+ const init = readBoundInitApp(def) ? void 0 : readPageModuleInitApp(pageMod.default);
35
+ const handlers = init ? [initAppMiddleware(init), ...def] : def;
36
+ return dispatchHandlers(handlers, c);
37
+ }
38
+ return applyInitApp(readPageModuleInitApp(pageMod.default), c, () => handlePageBody(c, page, pageMod));
39
+ }
40
+ async function handlePageBody(c, page, pageMod) {
41
+ if (isHonoApp(pageMod.default)) return pageMod.default.fetch(c.req.raw, c.env, c.executionCtx);
42
+ const method = c.req.method;
43
+ const named = pageMod[method];
44
+ const hasPage = Boolean(resolvePageRender(pageMod.default));
45
+ const mode = resolveRenderMode(c);
46
+ if (typeof named === "function" && (method !== "GET" || !hasPage)) {
47
+ const result = await named(c);
48
+ if (result instanceof Response) return result;
49
+ if (method === "GET" || method === "HEAD") {
50
+ const config = loadMergedConfig(page, pageMod);
51
+ const params = requestParams(c);
52
+ const data = await loadMergedData(page, c, pageMod);
53
+ const { html } = await renderPageHtml({
54
+ c,
55
+ page,
56
+ pageMod,
57
+ pageNode: result,
58
+ data,
59
+ params,
60
+ config,
61
+ isDev,
62
+ clientScriptSrc,
63
+ mode
64
+ });
65
+ return c.html(html);
66
+ }
67
+ return c.json(result);
68
+ }
69
+ if (method !== "GET" && method !== "HEAD") return c.text("Method Not Allowed", 405);
70
+ const config = loadMergedConfig(page, pageMod);
71
+ const params = requestParams(c);
72
+ const data = await loadMergedData(page, c, pageMod);
73
+ const pageNode = pageFromModule(pageMod, data, params);
74
+ const { html } = await renderPageHtml({
75
+ c,
76
+ page,
77
+ pageMod,
78
+ pageNode,
79
+ data,
80
+ params,
81
+ config,
82
+ isDev,
83
+ clientScriptSrc,
84
+ mode
85
+ });
86
+ return c.html(html);
87
+ }
88
+ /**
89
+ * Mount filesystem pages from the Vite-generated manifest onto a existing Hono app.
90
+ */
91
+ function mountVino(app, options = {}) {
92
+ const manifest$1 = options.manifest ?? manifest;
93
+ for (const page of manifest$1.pages) app.get(page.pattern, (c) => handlePage(c, page));
94
+ return app;
95
+ }
96
+ /**
97
+ * Create a new Vino app. Returns a Hono app with the Vino pages mounted.
98
+ * @param options - The options for the Vino app.
99
+ * @returns A Hono app with the Vino pages mounted.
100
+ */
101
+ function createVino(options = {}) {
102
+ return mountVino(new Hono(), options);
103
+ }
104
+ //#endregion
105
+ export { createVino, mountVino };
106
+
107
+ //# sourceMappingURL=mount.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mount.mjs","names":["jsx","assetsIsDev","manifest","virtualManifest"],"sources":["../src/mount/createVino.ts"],"sourcesContent":["import { Hono } from \"hono\";\nimport type { Context, Env, Schema } from \"hono\";\nimport type { BlankSchema } from \"hono/types\";\nimport { jsxDEV as jsx } from \"hono/jsx/jsx-dev-runtime\";\nimport { manifest as virtualManifest } from \"virtual:vino/manifest\";\nimport { isDev as assetsIsDev, clientScriptSrc } from \"virtual:vino/assets\";\nimport { NAV_HEADER } from \"../vino/constants.ts\";\nimport { loadMergedConfig, loadMergedData } from \"../vino/config.ts\";\nimport {\n bindPageRun,\n dispatchHandlers,\n readPageDefinition,\n resolvePageRender,\n} from \"../factory/definePage.ts\";\nimport { applyInitApp, initAppMiddleware, readBoundInitApp, readPageModuleInitApp } from \"../factory/factory.ts\";\nimport { isHonoApp, renderPageHtml } from \"../hydration/render.ts\";\nimport type { CreateVinoOptions, ManifestPage, PageModule, RenderMode } from \"../hydration/types.ts\";\n\ntype AppContext = Context;\n\nfunction requestParams(c: AppContext): Record<string, string> {\n try {\n return c.req.param();\n } catch {\n return {};\n }\n}\n\nfunction pageFromModule(pageMod: PageModule, data: unknown, params: Record<string, string>) {\n const Page = resolvePageRender(pageMod.default);\n if (Page) return jsx(Page, { data, params });\n return pageMod.default as never;\n}\n\nfunction resolveRenderMode(c: AppContext): RenderMode {\n if (c.req.header(NAV_HEADER)) return \"content\";\n return \"full\";\n}\n\nasync function handlePage(c: AppContext, page: ManifestPage): Promise<Response> {\n const pageMod = await page.loadPage();\n const def = readPageDefinition(pageMod.default);\n if (def) {\n bindPageRun(c, () => handlePageBody(c, page, pageMod));\n const init = readBoundInitApp(def) ? undefined : readPageModuleInitApp(pageMod.default);\n const handlers = init ? [initAppMiddleware(init), ...def] : def;\n return dispatchHandlers(handlers, c);\n }\n return applyInitApp(readPageModuleInitApp(pageMod.default), c, () => handlePageBody(c, page, pageMod));\n}\n\nasync function handlePageBody(c: AppContext, page: ManifestPage, pageMod: PageModule): Promise<Response> {\n if (isHonoApp(pageMod.default)) {\n return pageMod.default.fetch(c.req.raw, c.env, c.executionCtx);\n }\n\n const method = c.req.method;\n const named = pageMod[method] as (ctx: AppContext) => unknown;\n const hasPage = Boolean(resolvePageRender(pageMod.default));\n const mode = resolveRenderMode(c);\n\n if (typeof named === \"function\" && (method !== \"GET\" || !hasPage)) {\n const result = await named(c);\n if (result instanceof Response) return result;\n if (method === \"GET\" || method === \"HEAD\") {\n const config = loadMergedConfig(page, pageMod);\n const params = requestParams(c);\n const data = await loadMergedData(page, c, pageMod);\n const { html } = await renderPageHtml({\n c,\n page,\n pageMod,\n pageNode: result as never,\n data,\n params,\n config,\n isDev: assetsIsDev,\n clientScriptSrc,\n mode,\n });\n return c.html(html);\n }\n return c.json(result as never);\n }\n\n if (method !== \"GET\" && method !== \"HEAD\") {\n return c.text(\"Method Not Allowed\", 405);\n }\n\n const config = loadMergedConfig(page, pageMod);\n const params = requestParams(c);\n const data = await loadMergedData(page, c, pageMod);\n const pageNode = pageFromModule(pageMod, data, params);\n const { html } = await renderPageHtml({\n c,\n page,\n pageMod,\n pageNode: pageNode,\n data,\n params,\n config,\n isDev: assetsIsDev,\n clientScriptSrc,\n mode,\n });\n return c.html(html);\n}\n\n/**\n * Mount filesystem pages from the Vite-generated manifest onto a existing Hono app.\n */\nexport function mountVino<E extends Env, S extends Schema, BasePath extends string>(app: Hono<E, S, BasePath>, options: CreateVinoOptions = {}): Hono<E, S, BasePath> {\n const manifest = options.manifest ?? virtualManifest;\n for (const page of manifest.pages) {\n app.get(page.pattern, (c) => handlePage(c as AppContext, page));\n }\n\n return app;\n}\n\n/**\n * Create a new Vino app. Returns a Hono app with the Vino pages mounted.\n * @param options - The options for the Vino app.\n * @returns A Hono app with the Vino pages mounted.\n */\nexport function createVino<E extends Env = Env, S extends Schema = BlankSchema, BasePath extends string = \"/\">(options: CreateVinoOptions = {}): Hono<E, S, BasePath> {\n const app = new Hono<E, S, BasePath>();\n return mountVino(app, options);\n}\n"],"mappings":";;;;;;;;;AAoBA,SAAS,cAAc,GAAuC;CAC5D,IAAI;EACF,OAAO,EAAE,IAAI,MAAM;CACrB,QAAQ;EACN,OAAO,CAAC;CACV;AACF;AAEA,SAAS,eAAe,SAAqB,MAAe,QAAgC;CAC1F,MAAM,OAAO,kBAAkB,QAAQ,OAAO;CAC9C,IAAI,MAAM,OAAOA,OAAI,MAAM;EAAE;EAAM;CAAO,CAAC;CAC3C,OAAO,QAAQ;AACjB;AAEA,SAAS,kBAAkB,GAA2B;CACpD,IAAI,EAAE,IAAI,OAAA,YAAiB,GAAG,OAAO;CACrC,OAAO;AACT;AAEA,eAAe,WAAW,GAAe,MAAuC;CAC9E,MAAM,UAAU,MAAM,KAAK,SAAS;CACpC,MAAM,MAAM,mBAAmB,QAAQ,OAAO;CAC9C,IAAI,KAAK;EACP,YAAY,SAAS,eAAe,GAAG,MAAM,OAAO,CAAC;EACrD,MAAM,OAAO,iBAAiB,GAAG,IAAI,KAAA,IAAY,sBAAsB,QAAQ,OAAO;EACtF,MAAM,WAAW,OAAO,CAAC,kBAAkB,IAAI,GAAG,GAAG,GAAG,IAAI;EAC5D,OAAO,iBAAiB,UAAU,CAAC;CACrC;CACA,OAAO,aAAa,sBAAsB,QAAQ,OAAO,GAAG,SAAS,eAAe,GAAG,MAAM,OAAO,CAAC;AACvG;AAEA,eAAe,eAAe,GAAe,MAAoB,SAAwC;CACvG,IAAI,UAAU,QAAQ,OAAO,GAC3B,OAAO,QAAQ,QAAQ,MAAM,EAAE,IAAI,KAAK,EAAE,KAAK,EAAE,YAAY;CAG/D,MAAM,SAAS,EAAE,IAAI;CACrB,MAAM,QAAQ,QAAQ;CACtB,MAAM,UAAU,QAAQ,kBAAkB,QAAQ,OAAO,CAAC;CAC1D,MAAM,OAAO,kBAAkB,CAAC;CAEhC,IAAI,OAAO,UAAU,eAAe,WAAW,SAAS,CAAC,UAAU;EACjE,MAAM,SAAS,MAAM,MAAM,CAAC;EAC5B,IAAI,kBAAkB,UAAU,OAAO;EACvC,IAAI,WAAW,SAAS,WAAW,QAAQ;GACzC,MAAM,SAAS,iBAAiB,MAAM,OAAO;GAC7C,MAAM,SAAS,cAAc,CAAC;GAC9B,MAAM,OAAO,MAAM,eAAe,MAAM,GAAG,OAAO;GAClD,MAAM,EAAE,SAAS,MAAM,eAAe;IACpC;IACA;IACA;IACA,UAAU;IACV;IACA;IACA;IACOC;IACP;IACA;GACF,CAAC;GACD,OAAO,EAAE,KAAK,IAAI;EACpB;EACA,OAAO,EAAE,KAAK,MAAe;CAC/B;CAEA,IAAI,WAAW,SAAS,WAAW,QACjC,OAAO,EAAE,KAAK,sBAAsB,GAAG;CAGzC,MAAM,SAAS,iBAAiB,MAAM,OAAO;CAC7C,MAAM,SAAS,cAAc,CAAC;CAC9B,MAAM,OAAO,MAAM,eAAe,MAAM,GAAG,OAAO;CAClD,MAAM,WAAW,eAAe,SAAS,MAAM,MAAM;CACrD,MAAM,EAAE,SAAS,MAAM,eAAe;EACpC;EACA;EACA;EACU;EACV;EACA;EACA;EACOA;EACP;EACA;CACF,CAAC;CACD,OAAO,EAAE,KAAK,IAAI;AACpB;;;;AAKA,SAAgB,UAAoE,KAA2B,UAA6B,CAAC,GAAyB;CACpK,MAAMC,aAAW,QAAQ,YAAYC;CACrC,KAAK,MAAM,QAAQD,WAAS,OAC1B,IAAI,IAAI,KAAK,UAAU,MAAM,WAAW,GAAiB,IAAI,CAAC;CAGhE,OAAO;AACT;;;;;;AAOA,SAAgB,WAA+F,UAA6B,CAAC,GAAyB;CAEpK,OAAO,UAAU,IADD,KACG,GAAG,OAAO;AAC/B"}