@hozu/runtime-client 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +15 -0
  3. package/dist/browser/chunk-7HUHKEFT.js +1 -0
  4. package/dist/browser/chunk-DRLGN2D4.js +1 -0
  5. package/dist/browser/chunk-FZY6ENWQ.js +1 -0
  6. package/dist/browser/chunk-HGZ7KQUC.js +1 -0
  7. package/dist/browser/chunk-Z7ZFHZVV.js +1 -0
  8. package/dist/browser/client.js +1 -0
  9. package/dist/browser/navigate.js +1 -0
  10. package/dist/browser-dev/client.js +1604 -0
  11. package/dist/browser.d.ts +2 -0
  12. package/dist/browser.d.ts.map +1 -0
  13. package/dist/browser.js +3 -0
  14. package/dist/browser.js.map +1 -0
  15. package/dist/dev.d.ts +6 -0
  16. package/dist/dev.d.ts.map +1 -0
  17. package/dist/dev.js +42 -0
  18. package/dist/dev.js.map +1 -0
  19. package/dist/dom.d.ts +11 -0
  20. package/dist/dom.d.ts.map +1 -0
  21. package/dist/dom.js +70 -0
  22. package/dist/dom.js.map +1 -0
  23. package/dist/files.js +1 -0
  24. package/dist/hydrate.d.ts +56 -0
  25. package/dist/hydrate.d.ts.map +1 -0
  26. package/dist/hydrate.js +163 -0
  27. package/dist/hydrate.js.map +1 -0
  28. package/dist/index.d.ts +7 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +5 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/live.d.ts +2 -0
  33. package/dist/live.d.ts.map +1 -0
  34. package/dist/live.js +7 -0
  35. package/dist/live.js.map +1 -0
  36. package/dist/motion.d.ts +5 -0
  37. package/dist/motion.d.ts.map +1 -0
  38. package/dist/motion.js +78 -0
  39. package/dist/motion.js.map +1 -0
  40. package/dist/mount.d.ts +65 -0
  41. package/dist/mount.d.ts.map +1 -0
  42. package/dist/mount.js +550 -0
  43. package/dist/mount.js.map +1 -0
  44. package/dist/navigate.d.ts +18 -0
  45. package/dist/navigate.d.ts.map +1 -0
  46. package/dist/navigate.js +197 -0
  47. package/dist/navigate.js.map +1 -0
  48. package/dist/uploads.d.ts +2 -0
  49. package/dist/uploads.d.ts.map +1 -0
  50. package/dist/uploads.js +21 -0
  51. package/dist/uploads.js.map +1 -0
  52. package/dist/visible.d.ts +2 -0
  53. package/dist/visible.d.ts.map +1 -0
  54. package/dist/visible.js +26 -0
  55. package/dist/visible.js.map +1 -0
  56. package/dist/widget.d.ts +16 -0
  57. package/dist/widget.d.ts.map +1 -0
  58. package/dist/widget.js +53 -0
  59. package/dist/widget.js.map +1 -0
  60. package/files.d.ts +1 -0
  61. package/package.json +53 -0
@@ -0,0 +1,18 @@
1
+ import type { PagePayload, Session } from './hydrate.ts';
2
+ export interface State {
3
+ views: Map<string, Set<string>>;
4
+ soft: Record<string, string[]>;
5
+ routes: Record<string, string>;
6
+ }
7
+ export declare function routeOf(routes: Record<string, string>, pathname: string): string | null;
8
+ export declare function islandsIn(root: Node): {
9
+ marker: Comment;
10
+ view: string | null;
11
+ }[];
12
+ export declare function track(state: State, session: Session, payload: PagePayload, found: {
13
+ view: string | null;
14
+ }[]): void;
15
+ export declare function ranges(body: Node): Map<string, Node[]>;
16
+ export declare function swap(session: Session, state: State, next: Document, kept: string[]): Promise<boolean>;
17
+ export declare function soft(session: Session): void;
18
+ //# sourceMappingURL=navigate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigate.d.ts","sourceRoot":"","sources":["../src/navigate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAExD,MAAM,WAAW,KAAK;IACpB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;IAC/B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B;AA+BD,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWvF;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAAE,CAWhF;AAED,wBAAgB,KAAK,CACnB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAAE,QAWjC;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAatD;AAED,wBAAsB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CA4C3G;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,OAAO,QA8DpC"}
@@ -0,0 +1,197 @@
1
+ const HEAD = 'title,meta[name=description],meta[name=robots],link[rel=canonical],meta[property],script[type="application/ld+json"]';
2
+ const groups = { '?': '(?:/[^/]+)?', '+': '(?:/[^/]+)+', '*': '(?:/[^/]+)*' };
3
+ const patternOf = (path) => {
4
+ let keys = 0;
5
+ const source = path
6
+ .split(/(\/:[A-Za-z]\w*[?*+]?)/)
7
+ .map((part, i) => {
8
+ if (i % 2 === 0)
9
+ return part.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
10
+ const mod = part.at(-1);
11
+ keys += mod === '+' || mod === '*' ? 1.01 : 1;
12
+ return groups[mod] ?? '/[^/]+';
13
+ })
14
+ .join('');
15
+ return { pattern: new RegExp(`^${source.replace(/\/$/, '')}/?$`), keys };
16
+ };
17
+ export function routeOf(routes, pathname) {
18
+ let best = null;
19
+ let fewest = Infinity;
20
+ for (const [id, path] of Object.entries(routes)) {
21
+ const { pattern, keys } = patternOf(path);
22
+ if (keys < fewest && pattern.test(pathname)) {
23
+ best = id;
24
+ fewest = keys;
25
+ }
26
+ }
27
+ return best;
28
+ }
29
+ export function islandsIn(root) {
30
+ const found = [];
31
+ const walker = (root.ownerDocument ?? root).createTreeWalker(root, 128);
32
+ let view = null;
33
+ while (walker.nextNode()) {
34
+ const c = walker.currentNode;
35
+ if (c.data === 'i')
36
+ found.push({ marker: c, view });
37
+ else if (c.data.startsWith('v:'))
38
+ view = c.data.slice(2);
39
+ else if (c.data === '/v')
40
+ view = null;
41
+ }
42
+ return found;
43
+ }
44
+ export function track(state, session, payload, found) {
45
+ session.islands(payload).forEach((island, i) => {
46
+ const view = found[i]?.view;
47
+ if (!view)
48
+ return;
49
+ const owners = state.views.get(view) ?? new Set();
50
+ owners.add(island.feature);
51
+ state.views.set(view, owners);
52
+ });
53
+ state.soft = payload.soft ?? {};
54
+ Object.assign(state.routes, payload.routes);
55
+ }
56
+ export function ranges(body) {
57
+ const out = new Map();
58
+ let current = null;
59
+ for (const n of [...body.childNodes]) {
60
+ if (n.nodeType === 8 && n.data.startsWith('v:')) {
61
+ current = [n];
62
+ out.set(n.data.slice(2), current);
63
+ }
64
+ else if (current) {
65
+ current.push(n);
66
+ if (n.nodeType === 8 && n.data === '/v')
67
+ current = null;
68
+ }
69
+ }
70
+ return out;
71
+ }
72
+ export async function swap(session, state, next, kept) {
73
+ const { doc, apps } = session;
74
+ const { views } = state;
75
+ const script = next.getElementById('hozu-payload');
76
+ const fresh = ranges(next.body);
77
+ const live = ranges(doc.body);
78
+ if (!script?.textContent || kept.some((v) => !fresh.has(v) || !live.has(v)))
79
+ return false;
80
+ const payload = JSON.parse(script.textContent);
81
+ const keep = new Set(kept);
82
+ const found = islandsIn(next.body);
83
+ const needed = new Set();
84
+ for (const v of keep)
85
+ for (const f of views.get(v) ?? [])
86
+ needed.add(f);
87
+ session.islands(payload).forEach((island, i) => {
88
+ const view = found[i]?.view;
89
+ if (view === undefined || view === null || !keep.has(view))
90
+ needed.add(island.feature);
91
+ });
92
+ for (const [id, app] of apps)
93
+ if (!needed.has(id)) {
94
+ app.destroy();
95
+ apps.delete(id);
96
+ }
97
+ for (const v of [...views.keys()])
98
+ if (!keep.has(v))
99
+ views.delete(v);
100
+ const anchor = doc.getElementById('hozu-payload');
101
+ let cursor = 0;
102
+ const order = [...live.keys()].filter((v) => keep.has(v));
103
+ for (const [ref, nodes] of fresh) {
104
+ if (keep.has(ref)) {
105
+ cursor++;
106
+ continue;
107
+ }
108
+ const before = order[cursor] ? live.get(order[cursor])[0] : anchor;
109
+ for (const n of nodes)
110
+ doc.body.insertBefore(n, before);
111
+ }
112
+ for (const [ref, nodes] of live)
113
+ if (!keep.has(ref))
114
+ for (const n of nodes)
115
+ n.remove();
116
+ if (anchor)
117
+ anchor.textContent = script.textContent;
118
+ for (const el of doc.head.querySelectorAll(HEAD))
119
+ el.remove();
120
+ for (const el of next.head.querySelectorAll(HEAD))
121
+ doc.head.append(el);
122
+ doc.documentElement.lang = next.documentElement.lang;
123
+ await session.mount(payload, found.map((f) => (f.view !== null && keep.has(f.view) ? undefined : f.marker)));
124
+ track(state, session, payload, found);
125
+ return true;
126
+ }
127
+ export function soft(session) {
128
+ const { doc } = session;
129
+ const win = doc.defaultView;
130
+ const script = doc.getElementById('hozu-payload');
131
+ if (!win?.navigation || !script?.textContent)
132
+ return;
133
+ const state = { views: new Map(), soft: {}, routes: {} };
134
+ track(state, session, JSON.parse(script.textContent), islandsIn(doc.body));
135
+ let announcer = null;
136
+ let bypass = false;
137
+ const announce = (title) => {
138
+ if (!announcer) {
139
+ announcer = doc.createElement('div');
140
+ announcer.setAttribute('aria-live', 'polite');
141
+ announcer.style.cssText =
142
+ 'position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap';
143
+ doc.body.append(announcer);
144
+ }
145
+ announcer.textContent = title;
146
+ };
147
+ win.navigation.addEventListener('navigate', (event) => {
148
+ const e = event;
149
+ if (bypass || !e.canIntercept || e.hashChange || e.downloadRequest !== null || e.formData)
150
+ return;
151
+ if (e.navigationType === 'reload')
152
+ return;
153
+ const url = new URL(e.destination.url);
154
+ if (url.origin !== win.location.origin)
155
+ return;
156
+ const target = routeOf(state.routes, url.pathname);
157
+ const kept = target ? state.soft[target] : undefined;
158
+ if (!kept)
159
+ return;
160
+ const hard = () => {
161
+ bypass = true;
162
+ win.location.replace(url.href);
163
+ };
164
+ e.intercept({
165
+ handler: async () => {
166
+ const root = doc.documentElement;
167
+ root.setAttribute('data-hozu-navigating', '');
168
+ try {
169
+ const response = await win.fetch(url.href, { headers: { accept: 'text/html' } });
170
+ const type = response.headers.get('content-type') ?? '';
171
+ if (response.status !== 200 || response.redirected || !type.includes('text/html'))
172
+ return hard();
173
+ const next = new win.DOMParser().parseFromString(await response.text(), 'text/html');
174
+ let ok = true;
175
+ const run = async () => {
176
+ ok = await swap(session, state, next, kept);
177
+ };
178
+ const transition = doc.startViewTransition;
179
+ if (transition)
180
+ await transition.call(doc, run).updateCallbackDone;
181
+ else
182
+ await run();
183
+ if (!ok)
184
+ return hard();
185
+ announce(doc.title);
186
+ }
187
+ catch {
188
+ hard();
189
+ }
190
+ finally {
191
+ root.removeAttribute('data-hozu-navigating');
192
+ }
193
+ },
194
+ });
195
+ });
196
+ }
197
+ //# sourceMappingURL=navigate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigate.js","sourceRoot":"","sources":["../src/navigate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function encode(json: string, input: unknown, uploads: Map<string, File>): string | FormData;
2
+ //# sourceMappingURL=uploads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploads.d.ts","sourceRoot":"","sources":["../src/uploads.ts"],"names":[],"mappings":"AAQA,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,MAAM,GAAG,QAAQ,CAOlG"}
@@ -0,0 +1,21 @@
1
+ const tokensIn = (value, uploads, out = []) => {
2
+ if (typeof value === 'string') {
3
+ if (uploads.has(value))
4
+ out.push(value);
5
+ }
6
+ else if (value && typeof value === 'object')
7
+ for (const v of Object.values(value))
8
+ tokensIn(v, uploads, out);
9
+ return out;
10
+ };
11
+ export function encode(json, input, uploads) {
12
+ const tokens = tokensIn(input, uploads);
13
+ if (!tokens.length)
14
+ return json;
15
+ const form = new FormData();
16
+ form.append('request', json);
17
+ for (const token of tokens)
18
+ form.append(token, uploads.get(token));
19
+ return form;
20
+ }
21
+ //# sourceMappingURL=uploads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploads.js","sourceRoot":"","sources":["../src/uploads.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAE,OAA0B,EAAE,GAAG,GAAa,EAAE,EAAY,EAAE;IAC5F,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACzC,CAAC;SAAM,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAC3C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,CAAA;IACjE,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED,MAAM,UAAU,MAAM,CAAC,IAAY,EAAE,KAAc,EAAE,OAA0B;IAC7E,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACvC,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IAC/B,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAA;IAC3B,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IAC5B,KAAK,MAAM,KAAK,IAAI,MAAM;QAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,CAAA;IACnE,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function watch(doc: Document): void;
2
+ //# sourceMappingURL=visible.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visible.d.ts","sourceRoot":"","sources":["../src/visible.ts"],"names":[],"mappings":"AAEA,wBAAgB,KAAK,CAAC,GAAG,EAAE,QAAQ,QAelC"}
@@ -0,0 +1,26 @@
1
+ const watched = new WeakSet();
2
+ export function watch(doc) {
3
+ const win = doc.defaultView;
4
+ if (!win?.IntersectionObserver || watched.has(doc))
5
+ return;
6
+ watched.add(doc);
7
+ const seen = new IntersectionObserver((entries) => {
8
+ for (const e of entries)
9
+ if (e.isIntersecting)
10
+ e.target.dispatchEvent(new win.Event('visible'));
11
+ });
12
+ const scan = (root) => {
13
+ if (root instanceof win.Element && root.hasAttribute('data-hozu-visible'))
14
+ seen.observe(root);
15
+ for (const el of root.querySelectorAll('[data-hozu-visible]'))
16
+ seen.observe(el);
17
+ };
18
+ scan(doc);
19
+ new win.MutationObserver((records) => {
20
+ for (const r of records)
21
+ for (const n of r.addedNodes)
22
+ if (n.nodeType === 1)
23
+ scan(n);
24
+ }).observe(doc.body, { childList: true, subtree: true });
25
+ }
26
+ //# sourceMappingURL=visible.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visible.js","sourceRoot":"","sources":["../src/visible.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG,IAAI,OAAO,EAAY,CAAA;AAEvC,MAAM,UAAU,KAAK,CAAC,GAAa;IACjC,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,CAAA;IAC3B,IAAI,CAAC,GAAG,EAAE,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAM;IAC1D,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAChB,MAAM,IAAI,GAAG,IAAI,oBAAoB,CAAC,CAAC,OAAO,EAAE,EAAE;QAChD,KAAK,MAAM,CAAC,IAAI,OAAO;YAAE,IAAI,CAAC,CAAC,cAAc;gBAAE,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAA;IACjG,CAAC,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,CAAC,IAAwB,EAAE,EAAE;QACxC,IAAI,IAAI,YAAY,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC;YAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC7F,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,gBAAgB,CAAC,qBAAqB,CAAC;YAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACjF,CAAC,CAAA;IACD,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,EAAE;QACnC,KAAK,MAAM,CAAC,IAAI,OAAO;YAAE,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU;gBAAE,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC;oBAAE,IAAI,CAAC,CAAY,CAAC,CAAA;IACjG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;AAC1D,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { Json } from '@hozu/core/ir';
2
+ import type { WidgetRef, WidgetSetup } from './mount.ts';
3
+ export interface WidgetHost {
4
+ el: HTMLElement;
5
+ ref: WidgetRef;
6
+ name: string;
7
+ doc: Document;
8
+ props(): Json;
9
+ emit(name: string, detail: unknown): void;
10
+ load(url: string): Promise<WidgetSetup>;
11
+ watch(update: () => void): void;
12
+ own(stop: () => void): void;
13
+ same(a: Json, b: Json): boolean;
14
+ }
15
+ export declare function mountWidget(h: WidgetHost): void;
16
+ //# sourceMappingURL=widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widget.d.ts","sourceRoot":"","sources":["../src/widget.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAExD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,WAAW,CAAA;IACf,GAAG,EAAE,SAAS,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,QAAQ,CAAA;IACb,KAAK,IAAI,IAAI,CAAA;IACb,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAA;IACzC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;IACvC,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;IAC/B,GAAG,CAAC,IAAI,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;IAC3B,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,OAAO,CAAA;CAChC;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,UAAU,QA4CxC"}
package/dist/widget.js ADDED
@@ -0,0 +1,53 @@
1
+ export function mountWidget(h) {
2
+ const controller = new AbortController();
3
+ let props = h.props();
4
+ let instance;
5
+ const fail = (error) => {
6
+ instance = undefined;
7
+ h.doc.defaultView?.console.error(`Widget ${h.name} failed`, error);
8
+ };
9
+ const start = () => void h.load(h.ref.url).then((setup) => {
10
+ if (controller.signal.aborted)
11
+ return;
12
+ try {
13
+ instance = setup({ el: h.el, props, emit: h.emit, signal: controller.signal }) ?? undefined;
14
+ }
15
+ catch (error) {
16
+ fail(error);
17
+ }
18
+ }, fail);
19
+ const win = h.doc.defaultView;
20
+ if (h.ref.load === 'eager' || !win)
21
+ start();
22
+ else if (h.ref.load === 'idle')
23
+ (win.requestIdleCallback ?? win.setTimeout)(start);
24
+ else if (!win.IntersectionObserver)
25
+ start();
26
+ else {
27
+ const io = new win.IntersectionObserver((entries) => {
28
+ if (!entries.some((e) => e.isIntersecting))
29
+ return;
30
+ io.disconnect();
31
+ start();
32
+ });
33
+ io.observe(h.el);
34
+ controller.signal.addEventListener('abort', () => io.disconnect());
35
+ }
36
+ h.watch(() => {
37
+ const next = h.props();
38
+ if (h.same(next, props))
39
+ return;
40
+ props = next;
41
+ try {
42
+ instance?.update?.(next);
43
+ }
44
+ catch (error) {
45
+ fail(error);
46
+ }
47
+ });
48
+ h.own(() => {
49
+ controller.abort();
50
+ instance?.destroy?.();
51
+ });
52
+ }
53
+ //# sourceMappingURL=widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widget.js","sourceRoot":"","sources":["../src/widget.ts"],"names":[],"mappings":"AAgBA,MAAM,UAAU,WAAW,CAAC,CAAa;IACvC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,IAAI,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,CAAA;IACrB,IAAI,QAAiC,CAAA;IACrC,MAAM,IAAI,GAAG,CAAC,KAAc,EAAE,EAAE;QAC9B,QAAQ,GAAG,SAAS,CAAA;QACpB,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,SAAS,EAAE,KAAK,CAAC,CAAA;IACpE,CAAC,CAAA;IACD,MAAM,KAAK,GAAG,GAAG,EAAE,CACjB,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QACpC,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;YAAE,OAAM;QACrC,IAAI,CAAC;YACH,QAAQ,GAAG,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,CAAA;QAC7F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,CAAA;QACb,CAAC;IACH,CAAC,EAAE,IAAI,CAAC,CAAA;IACV,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,WAAkD,CAAA;IACpE,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,GAAG;QAAE,KAAK,EAAE,CAAA;SACtC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM;QAAE,CAAC,GAAG,CAAC,mBAAmB,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAA;SAC7E,IAAI,CAAC,GAAG,CAAC,oBAAoB;QAAE,KAAK,EAAE,CAAA;SACtC,CAAC;QACJ,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,oBAAoB,CAAC,CAAC,OAAO,EAAE,EAAE;YAClD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC;gBAAE,OAAM;YAClD,EAAE,CAAC,UAAU,EAAE,CAAA;YACf,KAAK,EAAE,CAAA;QACT,CAAC,CAAC,CAAA;QACF,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAChB,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,CAAA;IACpE,CAAC;IACD,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;QACX,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,CAAA;QACtB,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC;YAAE,OAAM;QAC/B,KAAK,GAAG,IAAI,CAAA;QACZ,IAAI,CAAC;YACH,QAAQ,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,CAAA;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,CAAA;QACb,CAAC;IACH,CAAC,CAAC,CAAA;IACF,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE;QACT,UAAU,CAAC,KAAK,EAAE,CAAA;QAClB,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAA;IACvB,CAAC,CAAC,CAAA;AACJ,CAAC"}
package/files.d.ts ADDED
@@ -0,0 +1 @@
1
+ export declare const files: Record<string, string>
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@hozu/runtime-client",
3
+ "version": "0.1.0",
4
+ "description": "Hozu client runtime: fine-grained DOM islands, no virtual DOM, about 7.5 KB gzipped",
5
+ "keywords": [
6
+ "hozu",
7
+ "framework",
8
+ "ai",
9
+ "agents",
10
+ "ssr",
11
+ "islands",
12
+ "typescript"
13
+ ],
14
+ "homepage": "https://github.com/olevatorr/Hozu/tree/main/packages/runtime-client#readme",
15
+ "bugs": {
16
+ "url": "https://github.com/olevatorr/Hozu/issues"
17
+ },
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/olevatorr/Hozu.git",
21
+ "directory": "packages/runtime-client"
22
+ },
23
+ "license": "MIT",
24
+ "author": "olevatorr",
25
+ "type": "module",
26
+ "exports": {
27
+ ".": {
28
+ "types": "./dist/index.d.ts",
29
+ "default": "./dist/index.js"
30
+ },
31
+ "./browser/*": "./dist/browser/*",
32
+ "./files": {
33
+ "types": "./files.d.ts",
34
+ "default": "./dist/files.js"
35
+ },
36
+ "./browser-dev/*": "./dist/browser-dev/*"
37
+ },
38
+ "files": [
39
+ "dist",
40
+ "files.d.ts"
41
+ ],
42
+ "engines": {
43
+ "node": ">=22.18"
44
+ },
45
+ "publishConfig": {
46
+ "access": "public"
47
+ },
48
+ "dependencies": {
49
+ "@hozu/core": "0.1.0",
50
+ "@hozu/machine": "0.1.0"
51
+ },
52
+ "sideEffects": false
53
+ }