@hozu/runtime-server 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 (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +15 -0
  3. package/dist/assets.d.ts +2 -0
  4. package/dist/assets.d.ts.map +1 -0
  5. package/dist/assets.js +4 -0
  6. package/dist/assets.js.map +1 -0
  7. package/dist/cache.d.ts +15 -0
  8. package/dist/cache.d.ts.map +1 -0
  9. package/dist/cache.js +19 -0
  10. package/dist/cache.js.map +1 -0
  11. package/dist/compile.d.ts +43 -0
  12. package/dist/compile.d.ts.map +1 -0
  13. package/dist/compile.js +170 -0
  14. package/dist/compile.js.map +1 -0
  15. package/dist/crawl.d.ts +12 -0
  16. package/dist/crawl.d.ts.map +1 -0
  17. package/dist/crawl.js +52 -0
  18. package/dist/crawl.js.map +1 -0
  19. package/dist/escape.d.ts +4 -0
  20. package/dist/escape.d.ts.map +1 -0
  21. package/dist/escape.js +7 -0
  22. package/dist/escape.js.map +1 -0
  23. package/dist/forms.d.ts +26 -0
  24. package/dist/forms.d.ts.map +1 -0
  25. package/dist/forms.js +107 -0
  26. package/dist/forms.js.map +1 -0
  27. package/dist/generate.d.ts +9 -0
  28. package/dist/generate.d.ts.map +1 -0
  29. package/dist/generate.js +395 -0
  30. package/dist/generate.js.map +1 -0
  31. package/dist/handler.d.ts +41 -0
  32. package/dist/handler.d.ts.map +1 -0
  33. package/dist/handler.js +567 -0
  34. package/dist/handler.js.map +1 -0
  35. package/dist/images.d.ts +4 -0
  36. package/dist/images.d.ts.map +1 -0
  37. package/dist/images.js +54 -0
  38. package/dist/images.js.map +1 -0
  39. package/dist/index.d.ts +22 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +13 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/lower.d.ts +13 -0
  44. package/dist/lower.d.ts.map +1 -0
  45. package/dist/lower.js +149 -0
  46. package/dist/lower.js.map +1 -0
  47. package/dist/pwa.d.ts +5 -0
  48. package/dist/pwa.d.ts.map +1 -0
  49. package/dist/pwa.js +66 -0
  50. package/dist/pwa.js.map +1 -0
  51. package/dist/render.d.ts +58 -0
  52. package/dist/render.d.ts.map +1 -0
  53. package/dist/render.js +593 -0
  54. package/dist/render.js.map +1 -0
  55. package/dist/rendered.d.ts +64 -0
  56. package/dist/rendered.d.ts.map +1 -0
  57. package/dist/rendered.js +131 -0
  58. package/dist/rendered.js.map +1 -0
  59. package/dist/routing.d.ts +11 -0
  60. package/dist/routing.d.ts.map +1 -0
  61. package/dist/routing.js +30 -0
  62. package/dist/routing.js.map +1 -0
  63. package/dist/search.d.ts +3 -0
  64. package/dist/search.d.ts.map +1 -0
  65. package/dist/search.js +40 -0
  66. package/dist/search.js.map +1 -0
  67. package/dist/security.d.ts +5 -0
  68. package/dist/security.d.ts.map +1 -0
  69. package/dist/security.js +32 -0
  70. package/dist/security.js.map +1 -0
  71. package/dist/session.d.ts +12 -0
  72. package/dist/session.d.ts.map +1 -0
  73. package/dist/session.js +35 -0
  74. package/dist/session.js.map +1 -0
  75. package/dist/shape.d.ts +8 -0
  76. package/dist/shape.d.ts.map +1 -0
  77. package/dist/shape.js +127 -0
  78. package/dist/shape.js.map +1 -0
  79. package/dist/static.d.ts +17 -0
  80. package/dist/static.d.ts.map +1 -0
  81. package/dist/static.js +33 -0
  82. package/dist/static.js.map +1 -0
  83. package/package.json +49 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 olevatorr
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.
package/README.md ADDED
@@ -0,0 +1,15 @@
1
+ # @hozu/runtime-server
2
+
3
+ Hozu server runtime: generated render functions, in-order streaming SSR and a web-standard handler.
4
+
5
+ Part of [Hozu](https://github.com/olevatorr/Hozu#readme), an AI-first web framework. Most apps start from
6
+ `npm create hozu@latest`, which installs the right packages and sets up Claude Code or `AGENTS.md` agents.
7
+
8
+ ```sh
9
+ npm install @hozu/runtime-server
10
+ ```
11
+
12
+ Requires Node 22.18 or newer. Documentation: the [README](https://github.com/olevatorr/Hozu#readme) and the
13
+ agent skill that `create-hozu` writes into each app.
14
+
15
+ MIT © olevatorr
@@ -0,0 +1,2 @@
1
+ export declare const clientBundle: () => Record<string, string>;
2
+ //# sourceMappingURL=assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../src/assets.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,YAAY,QAAO,MAAM,CAAC,MAAM,EAAE,MAAM,CAAW,CAAA"}
package/dist/assets.js ADDED
@@ -0,0 +1,4 @@
1
+ import { files } from '@hozu/runtime-client/files';
2
+ const bundle = Object.fromEntries(Object.entries(files).map(([name, code]) => [`/_hozu/${name}`, code]));
3
+ export const clientBundle = () => bundle;
4
+ //# sourceMappingURL=assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.js","sourceRoot":"","sources":["../src/assets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAElD,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;AAExG,MAAM,CAAC,MAAM,YAAY,GAAG,GAA2B,EAAE,CAAC,MAAM,CAAA"}
@@ -0,0 +1,15 @@
1
+ export interface CachedPage {
2
+ html: string;
3
+ status: number;
4
+ redirect: string | null;
5
+ at: number;
6
+ ttl: number;
7
+ tags: string[];
8
+ }
9
+ export interface PageCache {
10
+ get(key: string): Promise<CachedPage | undefined>;
11
+ set(key: string, page: CachedPage): Promise<void>;
12
+ deleteTags(tags: string[]): Promise<number>;
13
+ }
14
+ export declare function memoryCache(): PageCache;
15
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,EAAE,CAAA;CACf;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAA;IACjD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CAC5C;AAED,wBAAgB,WAAW,IAAI,SAAS,CAiBvC"}
package/dist/cache.js ADDED
@@ -0,0 +1,19 @@
1
+ export function memoryCache() {
2
+ const pages = new Map();
3
+ return {
4
+ get: async (key) => pages.get(key),
5
+ set: async (key, page) => {
6
+ pages.set(key, page);
7
+ },
8
+ deleteTags: async (tags) => {
9
+ let count = 0;
10
+ for (const [key, page] of pages)
11
+ if (tags.some((t) => page.tags.includes(t))) {
12
+ pages.delete(key);
13
+ count++;
14
+ }
15
+ return count;
16
+ },
17
+ };
18
+ }
19
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,WAAW;IACzB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAA;IAC3C,OAAO;QACL,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;QAClC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YACvB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QACtB,CAAC;QACD,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACzB,IAAI,KAAK,GAAG,CAAC,CAAA;YACb,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,KAAK;gBAC7B,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC5C,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;oBACjB,KAAK,EAAE,CAAA;gBACT,CAAC;YACH,OAAO,KAAK,CAAA;QACd,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { type FeatureIR, type Json, type ValueExpr, type ViewNode, type WidgetIR } from '@tenon/core/ir';
2
+ import { type Fns, type Getter } from '@tenon/machine';
3
+ import { text } from '@tenon/runtime-client';
4
+ export interface Scope {
5
+ feature: FeatureIR;
6
+ context: Json;
7
+ state: string | null;
8
+ bindings: Json[];
9
+ params: Json;
10
+ search: Json;
11
+ routes: Record<string, string>;
12
+ url: string;
13
+ locale: string;
14
+ alternate: Record<string, string>;
15
+ env: Json;
16
+ }
17
+ export interface Runtime {
18
+ open(n: ViewNode, scope: Scope): string;
19
+ embed(view: string): {
20
+ root: ViewNode;
21
+ scope: Scope;
22
+ } | null;
23
+ widget(ref: string): void;
24
+ }
25
+ export interface Compile {
26
+ islands: Set<string>;
27
+ fns: Fns;
28
+ widgets: Record<string, WidgetIR>;
29
+ }
30
+ export type Frag = string | ((scope: Scope, r: Runtime) => string);
31
+ export declare const SEP = "<!---->";
32
+ export declare const OPEN = "<!--[-->";
33
+ export declare const CLOSE = "<!--]-->";
34
+ export { text };
35
+ export declare const expr: (v: ValueExpr, fns: Fns) => Getter;
36
+ type El = Pick<Extract<ViewNode, {
37
+ kind: 'el';
38
+ }>, 'class' | 'toggle' | 'vars'>;
39
+ export declare function classAndStyle(n: El, value: (v: ValueExpr) => Json): string;
40
+ export declare const run: (f: Frag, s: Scope, r: Runtime) => string;
41
+ export declare const separated: (list: ViewNode[], i: number) => boolean;
42
+ export declare function compileNode(n: ViewNode, island: boolean, c: Compile, sep?: boolean): Frag;
43
+ //# sourceMappingURL=compile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EAGd,KAAK,IAAI,EACT,KAAK,SAAS,EACd,KAAK,QAAQ,EAEb,KAAK,QAAQ,EACd,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAA8B,KAAK,GAAG,EAAE,KAAK,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAClF,OAAO,EAAkC,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAG5E,MAAM,WAAW,KAAK;IACpB,OAAO,EAAE,SAAS,CAAA;IAClB,OAAO,EAAE,IAAI,CAAA;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,QAAQ,EAAE,IAAI,EAAE,CAAA;IAChB,MAAM,EAAE,IAAI,CAAA;IACZ,MAAM,EAAE,IAAI,CAAA;IACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,GAAG,EAAE,IAAI,CAAA;CACV;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAAA;IACvC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,GAAG,IAAI,CAAA;IAC5D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACpB,GAAG,EAAE,GAAG,CAAA;IACR,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;CAClC;AAED,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC,CAAA;AAIlE,eAAO,MAAM,GAAG,YAAY,CAAA;AAC5B,eAAO,MAAM,IAAI,aAAa,CAAA;AAC9B,eAAO,MAAM,KAAK,aAAa,CAAA;AAE/B,OAAO,EAAE,IAAI,EAAE,CAAA;AAEf,eAAO,MAAM,IAAI,MAAO,SAAS,OAAO,GAAG,KAAG,MAA8B,CAAA;AAO5E,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAA;AAK9E,wBAAgB,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,GAAG,MAAM,CAO1E;AAkCD,eAAO,MAAM,GAAG,MAAO,IAAI,KAAK,KAAK,KAAK,OAAO,WAA0C,CAAA;AAE3F,eAAO,MAAM,SAAS,SAAU,QAAQ,EAAE,KAAK,MAAM,YAAiC,CAAA;AAEtF,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,UAAQ,GAAG,IAAI,CAqGvF"}
@@ -0,0 +1,170 @@
1
+ import { FORM_FIELD, formRunnable, voidTags, } from '@tenon/core/ir';
2
+ import { compileGuard, compileValue } from '@tenon/machine';
3
+ import { attrText, classText, styleText, text } from '@tenon/runtime-client';
4
+ import { escapeHtml } from './escape.js';
5
+ const voids = new Set(voidTags);
6
+ export const SEP = '<!---->';
7
+ export const OPEN = '<!--[-->';
8
+ export const CLOSE = '<!--]-->';
9
+ export { text };
10
+ export const expr = (v, fns) => compileValue(v, fns);
11
+ const attr = (name, x) => {
12
+ const s = attrText(name, x);
13
+ return s === null ? '' : s === '' ? ` ${name}` : ` ${name}="${escapeHtml(s)}"`;
14
+ };
15
+ const classAttr = (c) => (c ? ` class="${escapeHtml(c)}"` : '');
16
+ const styleAttr = (s) => (s ? ` style="${escapeHtml(s)}"` : '');
17
+ export function classAndStyle(n, value) {
18
+ const active = [];
19
+ for (const c in n.toggle)
20
+ if (value(n.toggle[c]) === true)
21
+ active.push(c);
22
+ return (classAttr(classText(n.class, active)) +
23
+ styleAttr(styleText(Object.entries(n.vars).map(([k, v]) => [k, value(v)]))));
24
+ }
25
+ function classAndStyleFrag(n, fns) {
26
+ const toggles = Object.entries(n.toggle).map(([c, v]) => [c, expr(v, fns)]);
27
+ const vars = Object.entries(n.vars).map(([k, v]) => [k, expr(v, fns)]);
28
+ const base = n.class;
29
+ const cls = toggles.length
30
+ ? (s) => {
31
+ const active = [];
32
+ for (const [c, get] of toggles)
33
+ if (get(s) === true)
34
+ active.push(c);
35
+ return classAttr(classText(base, active));
36
+ }
37
+ : classAttr(base ?? '');
38
+ const style = vars.length ? (s) => styleAttr(styleText(vars.map(([k, get]) => [k, get(s)]))) : '';
39
+ return seq([cls, style]);
40
+ }
41
+ function seq(parts) {
42
+ const merged = [];
43
+ for (const p of parts) {
44
+ const last = merged.at(-1);
45
+ if (typeof p === 'string' && typeof last === 'string')
46
+ merged[merged.length - 1] = last + p;
47
+ else if (p !== '')
48
+ merged.push(p);
49
+ }
50
+ if (merged.length === 0)
51
+ return '';
52
+ if (merged.length === 1)
53
+ return merged[0];
54
+ const list = merged;
55
+ return (s, r) => {
56
+ let out = '';
57
+ for (const p of list)
58
+ out += typeof p === 'string' ? p : p(s, r);
59
+ return out;
60
+ };
61
+ }
62
+ export const run = (f, s, r) => (typeof f === 'string' ? f : f(s, r));
63
+ export const separated = (list, i) => list[i + 1]?.kind === 'text';
64
+ export function compileNode(n, island, c, sep = false) {
65
+ const { fns } = c;
66
+ const children = (list) => list.map((x, i) => compileNode(x, island, c, separated(list, i)));
67
+ if (!island && c.islands.has(n.id)) {
68
+ const inner = compileNode(n, true, c, sep);
69
+ return (s, r) => r.open(n, s) + run(inner, s, r);
70
+ }
71
+ const wrap = (body) => (island ? seq([OPEN, body, CLOSE]) : body);
72
+ switch (n.kind) {
73
+ case 'text': {
74
+ const tail = island && sep ? SEP : '';
75
+ if ('literal' in n.value)
76
+ return escapeHtml(text(n.value.literal)) + tail;
77
+ const get = expr(n.value, fns);
78
+ return (s) => escapeHtml(text(get(s))) + tail;
79
+ }
80
+ case 'el': {
81
+ const parts = [`<${n.tag}`, classAndStyleFrag(n, fns)];
82
+ let content = null;
83
+ for (const [name, v] of Object.entries(n.attrs)) {
84
+ if (n.tag === 'textarea' && name === 'value') {
85
+ const get = expr(v, fns);
86
+ content = 'literal' in v ? escapeHtml(text(v.literal)) : (s) => escapeHtml(text(get(s)));
87
+ continue;
88
+ }
89
+ if ('literal' in v) {
90
+ parts.push(attr(name, v.literal));
91
+ continue;
92
+ }
93
+ const get = expr(v, fns);
94
+ parts.push((s) => attr(name, get(s)));
95
+ }
96
+ const submit = n.tag === 'form' ? n.on.submit : undefined;
97
+ if (submit && !('method' in n.attrs) && formRunnable(submit.payload)) {
98
+ const id = encodeURIComponent(n.id);
99
+ parts.push(' method="post"', (s) => attr('action', `${s.url}${s.url.includes('?') ? '&' : '?'}${FORM_FIELD}=${id}`));
100
+ }
101
+ parts.push('>');
102
+ if (voids.has(n.tag))
103
+ return seq(parts);
104
+ if (content !== null)
105
+ parts.push(content);
106
+ else
107
+ parts.push(...children(n.children));
108
+ parts.push(`</${n.tag}>`);
109
+ return seq(parts);
110
+ }
111
+ case 'when': {
112
+ const body = seq(children(n.children));
113
+ const states = n.states;
114
+ return wrap((s, r) => (s.state !== null && states.includes(s.state) ? run(body, s, r) : ''));
115
+ }
116
+ case 'each': {
117
+ const item = compileNode(n.item, island, c, true);
118
+ const source = expr(n.source, fns);
119
+ return wrap((s, r) => {
120
+ const items = source(s);
121
+ let out = '';
122
+ if (Array.isArray(items))
123
+ for (const x of items)
124
+ out += run(item, { ...s, bindings: [...s.bindings, x] }, r);
125
+ return out;
126
+ });
127
+ }
128
+ case 'embed': {
129
+ const view = n.view;
130
+ const cache = new WeakMap();
131
+ return wrap((_, r) => {
132
+ const e = r.embed(view);
133
+ if (!e)
134
+ return '';
135
+ let f = cache.get(e.root);
136
+ if (f === undefined) {
137
+ f = compileNode(e.root, island, c);
138
+ cache.set(e.root, f);
139
+ }
140
+ return run(f, e.scope, r);
141
+ });
142
+ }
143
+ case 'if': {
144
+ const test = compileGuard(n.test, fns);
145
+ const yes = seq(children(n.ifTrue));
146
+ const no = seq(children(n.ifFalse));
147
+ return wrap((s, r) => run(test(s) ? yes : no, s, r));
148
+ }
149
+ case 'html': {
150
+ const get = expr(n.value, fns);
151
+ return wrap((s) => text(get(s)));
152
+ }
153
+ case 'global':
154
+ return '<!--g-->';
155
+ case 'widget': {
156
+ const tag = c.widgets[n.widget]?.tag ?? 'div';
157
+ const ref = n.widget;
158
+ const use = (_, r) => {
159
+ r.widget(ref);
160
+ return '';
161
+ };
162
+ const own = island && c.islands.has(n.id);
163
+ const kids = n.children.map((x, i) => compileNode(x, !own && island, c, separated(n.children, i)));
164
+ return seq([use, `<${tag}`, classAndStyleFrag(n, fns), '>', ...kids, `</${tag}>`]);
165
+ }
166
+ default:
167
+ return '';
168
+ }
169
+ }
170
+ //# sourceMappingURL=compile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.js","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type BuildResult, type Json } from '@hozu/core/ir';
2
+ import type { DataRuntime } from '@hozu/data';
3
+ export interface PageEntry {
4
+ route: string;
5
+ params: Json;
6
+ path: string;
7
+ locale: string | null;
8
+ }
9
+ export declare function pageEntries(build: BuildResult, data: DataRuntime): Promise<PageEntry[]>;
10
+ export declare function sitemapXml(build: BuildResult, entries: PageEntry[]): string;
11
+ export declare function robotsTxt(build: BuildResult): string;
12
+ //# sourceMappingURL=crawl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crawl.d.ts","sourceRoot":"","sources":["../src/crawl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,IAAI,EAA0C,MAAM,eAAe,CAAA;AACnG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAK7C,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,IAAI,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAKD,wBAAsB,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAqB7F;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,CAM3E;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAcpD"}
package/dist/crawl.js ADDED
@@ -0,0 +1,52 @@
1
+ import { publicPath, routeTable } from '@hozu/core/ir';
2
+ import { compileValue } from '@hozu/machine';
3
+ import { escapeHtml } from './escape.js';
4
+ import { pathOf } from './render.js';
5
+ const evaluate = (v, item, fns) => compileValue(v, fns)({ bindings: [item] });
6
+ export async function pageEntries(build, data) {
7
+ const { ir } = build;
8
+ const fns = build.bindings.fns;
9
+ const out = [];
10
+ const locales = ir.site?.locales ?? [null];
11
+ for (const [route, page] of Object.entries(ir.pages).sort(([a], [b]) => a.localeCompare(b))) {
12
+ const r = ir.routes[route];
13
+ if (!r)
14
+ continue;
15
+ const params = [];
16
+ if (!r.params)
17
+ params.push(null);
18
+ else if (page.entries) {
19
+ const result = await data.run(page.entries.query, evaluate(page.entries.input, null, fns));
20
+ if (result.ok && Array.isArray(result.value))
21
+ for (const item of result.value)
22
+ params.push(evaluate(page.entries.params, item, fns));
23
+ }
24
+ for (const locale of locales) {
25
+ const pattern = routeTable(ir, locale)[route] ?? r.path;
26
+ for (const p of params)
27
+ out.push({ route, params: p, path: pathOf(pattern, p), locale });
28
+ }
29
+ }
30
+ return out;
31
+ }
32
+ export function sitemapXml(build, entries) {
33
+ const site = build.ir.site;
34
+ const urls = entries
35
+ .filter((e) => !build.ir.pages[e.route]?.head.noindex)
36
+ .map((e) => `<url><loc>${escapeHtml(`${site?.url ?? ''}${e.path}`)}</loc></url>`);
37
+ return `<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">${urls.join('')}</urlset>\n`;
38
+ }
39
+ export function robotsTxt(build) {
40
+ const { ir } = build;
41
+ const hidden = Object.entries(ir.pages)
42
+ .filter(([route, p]) => p.head.noindex && ir.routes[route] && !ir.routes[route].params)
43
+ .flatMap(([route]) => (ir.site?.locales ?? [null]).map((l) => `Disallow: ${publicPath(ir, ir.routes[route].path, l)}`));
44
+ return [
45
+ 'User-agent: *',
46
+ 'Allow: /',
47
+ ...hidden,
48
+ ...(ir.site ? [`Sitemap: ${ir.site.url}${ir.http.basePath}/sitemap.xml`] : []),
49
+ '',
50
+ ].join('\n');
51
+ }
52
+ //# sourceMappingURL=crawl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crawl.js","sourceRoot":"","sources":["../src/crawl.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,UAAU,EAAE,UAAU,EAAkB,MAAM,eAAe,CAAA;AAEnG,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AASpC,MAAM,QAAQ,GAAG,CAAC,CAAY,EAAE,IAAU,EAAE,GAAsC,EAAQ,EAAE,CAC1F,YAAY,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAE5C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAkB,EAAE,IAAiB;IACrE,MAAM,EAAE,EAAE,EAAE,GAAG,KAAK,CAAA;IACpB,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAwC,CAAA;IACnE,MAAM,GAAG,GAAgB,EAAE,CAAA;IAC3B,MAAM,OAAO,GAAG,EAAE,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,CAAA;IAC1C,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5F,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC1B,IAAI,CAAC,CAAC;YAAE,SAAQ;QAChB,MAAM,MAAM,GAAW,EAAE,CAAA;QACzB,IAAI,CAAC,CAAC,CAAC,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;aAC3B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;YAC1F,IAAI,MAAM,CAAC,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC1C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK;oBAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;QAC1F,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAA;YACvD,KAAK,MAAM,CAAC,IAAI,MAAM;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;QAC1F,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAkB,EAAE,OAAoB;IACjE,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,IAAI,CAAA;IAC1B,MAAM,IAAI,GAAG,OAAO;SACjB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC;SACrD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,UAAU,CAAC,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,cAAc,CAAC,CAAA;IACnF,OAAO,uGAAuG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAA;AAC1I,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAkB;IAC1C,MAAM,EAAE,EAAE,EAAE,GAAG,KAAK,CAAA;IACpB,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC;SACpC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAE,CAAC,MAAM,CAAC;SACvF,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CACnB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAClG,CAAA;IACH,OAAO;QACL,eAAe;QACf,UAAU;QACV,GAAG,MAAM;QACT,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const escapeHtml: (value: string) => string;
2
+ export declare const scriptSafe: (json: string) => string;
3
+ export declare const scriptJson: (value: unknown) => string;
4
+ //# sourceMappingURL=escape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escape.d.ts","sourceRoot":"","sources":["../src/escape.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,UAAU,UAAW,MAAM,KAAG,MAC4B,CAAA;AAEvE,eAAO,MAAM,UAAU,SAAU,MAAM,KAAG,MACiB,CAAA;AAE3D,eAAO,MAAM,UAAU,UAAW,OAAO,KAAG,MAA2C,CAAA"}
package/dist/escape.js ADDED
@@ -0,0 +1,7 @@
1
+ const map = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;' };
2
+ const special = /[&<>"]/;
3
+ const specials = /[&<>"]/g;
4
+ export const escapeHtml = (value) => special.test(value) ? value.replace(specials, (c) => map[c]) : value;
5
+ export const scriptSafe = (json) => json.includes('<') ? json.replace(/</g, '\\u003c') : json;
6
+ export const scriptJson = (value) => scriptSafe(JSON.stringify(value));
7
+ //# sourceMappingURL=escape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escape.js","sourceRoot":"","sources":["../src/escape.ts"],"names":[],"mappings":"AAAA,MAAM,GAAG,GAA2B,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAA;AAC7F,MAAM,OAAO,GAAG,QAAQ,CAAA;AACxB,MAAM,QAAQ,GAAG,SAAS,CAAA;AAE1B,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAU,EAAE,CAClD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;AAEvE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAU,EAAE,CACjD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AAE3D,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAc,EAAU,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA"}
@@ -0,0 +1,26 @@
1
+ import { type BuildResult, type ElementNode, type Json } from '@hozu/core/ir';
2
+ import type { DataRuntime } from '@hozu/data';
3
+ import { type Snapshot } from '@hozu/machine';
4
+ export declare function formNode(build: BuildResult, id: string): ElementNode | null;
5
+ export interface FormOutcome {
6
+ navigate: string | null;
7
+ snapshots: Record<string, Snapshot>;
8
+ unchanged: boolean;
9
+ unexpected: boolean;
10
+ invalidated: string[];
11
+ session: {
12
+ value: unknown;
13
+ } | null;
14
+ }
15
+ export declare function runForm(options: {
16
+ build: BuildResult;
17
+ data: DataRuntime;
18
+ routes: Record<string, string>;
19
+ form: ElementNode;
20
+ fields: Record<string, string>;
21
+ params: Json;
22
+ search: Json;
23
+ session: unknown;
24
+ }): Promise<FormOutcome | null>;
25
+ export declare function formFields(request: Request): Promise<Record<string, string>>;
26
+ //# sourceMappingURL=forms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../src/forms.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,WAAW,EAGhB,KAAK,IAAI,EAEV,MAAM,eAAe,CAAA;AACtB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,EAKL,KAAK,QAAQ,EAGd,MAAM,eAAe,CAAA;AA4BtB,wBAAgB,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAO3E;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACnC,SAAS,EAAE,OAAO,CAAA;IAClB,UAAU,EAAE,OAAO,CAAA;IACnB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,OAAO,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAA;CACnC;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE;IACrC,KAAK,EAAE,WAAW,CAAA;IAClB,IAAI,EAAE,WAAW,CAAA;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,IAAI,EAAE,WAAW,CAAA;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,MAAM,EAAE,IAAI,CAAA;IACZ,MAAM,EAAE,IAAI,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;CACjB,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAkE9B;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAQlF"}
package/dist/forms.js ADDED
@@ -0,0 +1,107 @@
1
+ import { FORM_FIELD, formRunnable, } from '@hozu/core/ir';
2
+ import { compileMachine, compileValue, equal, init, transition, } from '@hozu/machine';
3
+ const children = (n) => {
4
+ switch (n.kind) {
5
+ case 'el':
6
+ case 'widget':
7
+ case 'when':
8
+ return n.children;
9
+ case 'if':
10
+ return [...n.ifTrue, ...n.ifFalse];
11
+ case 'each':
12
+ return [n.item];
13
+ case 'query':
14
+ return [n.ready, ...(n.pending ? [n.pending] : []), ...Object.values(n.failed)];
15
+ default:
16
+ return [];
17
+ }
18
+ };
19
+ function find(root, id) {
20
+ if (root.id === id)
21
+ return root;
22
+ for (const c of children(root)) {
23
+ const hit = find(c, id);
24
+ if (hit)
25
+ return hit;
26
+ }
27
+ return null;
28
+ }
29
+ export function formNode(build, id) {
30
+ const feature = build.ir.features[id.slice(0, id.indexOf('.'))];
31
+ for (const view of Object.values(feature?.views ?? {})) {
32
+ const n = find(view.root, id);
33
+ if (n?.kind === 'el' && n.tag === 'form' && n.on.submit && formRunnable(n.on.submit.payload))
34
+ return n;
35
+ }
36
+ return null;
37
+ }
38
+ export async function runForm(options) {
39
+ const { build, data, routes, form, fields, params, search } = options;
40
+ const send = form.on.submit;
41
+ const feature = build.ir.features[send.event.slice(0, send.event.indexOf('.'))];
42
+ if (!feature?.machine)
43
+ return null;
44
+ const fns = build.bindings.fns;
45
+ const machine = compileMachine(feature, fns, routes);
46
+ const start = init(machine).snapshot;
47
+ const payload = compileValue(send.payload, fns)({
48
+ context: start.context,
49
+ params,
50
+ search,
51
+ routes,
52
+ dom: (field) => (field === 'form' ? fields : null),
53
+ });
54
+ const outcome = {
55
+ navigate: null,
56
+ snapshots: {},
57
+ unchanged: false,
58
+ unexpected: false,
59
+ invalidated: [],
60
+ session: null,
61
+ };
62
+ let session = options.session;
63
+ let step = transition(machine, start, { type: 'event', event: send.event, payload });
64
+ for (let guard = 0; guard < 16; guard++) {
65
+ let next = null;
66
+ for (const e of step.effects) {
67
+ if (e.type === 'navigate')
68
+ outcome.navigate = e.url;
69
+ if (e.type !== 'invoke')
70
+ continue;
71
+ const result = (await data.run(e.effect, e.input, session));
72
+ outcome.invalidated.push(...(result.invalidated ?? []));
73
+ if ('session' in result) {
74
+ session = result.session;
75
+ outcome.session = { value: result.session };
76
+ }
77
+ if (!result.ok && result.error === 'Unexpected')
78
+ outcome.unexpected = true;
79
+ next = transition(machine, step.snapshot, result.ok
80
+ ? { type: 'done', entry: e.entry, result: result.value ?? null }
81
+ : {
82
+ type: 'failed',
83
+ entry: e.entry,
84
+ error: result.error ?? 'Unexpected',
85
+ data: result.data ?? null,
86
+ });
87
+ }
88
+ if (!next)
89
+ break;
90
+ step = next;
91
+ }
92
+ outcome.snapshots[feature.id] = step.snapshot;
93
+ outcome.unchanged = step.snapshot.state === start.state && equal(step.snapshot.context, start.context);
94
+ return outcome;
95
+ }
96
+ export async function formFields(request) {
97
+ const out = {};
98
+ const type = request.headers.get('content-type') ?? '';
99
+ const entries = type.startsWith('multipart/form-data')
100
+ ? (await request.formData())
101
+ : new URLSearchParams(await request.text());
102
+ for (const [k, v] of entries)
103
+ if (k !== FORM_FIELD && !(k in out))
104
+ out[k] = typeof v === 'string' ? v : '';
105
+ return out;
106
+ }
107
+ //# sourceMappingURL=forms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forms.js","sourceRoot":"","sources":["../src/forms.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type BuildResult, type ViewNode } from '@hozu/core/ir';
2
+ import { type Variants } from './images.ts';
3
+ export declare const SEP = "<!---->";
4
+ export declare const OPEN = "<!--[-->";
5
+ export declare const CLOSE = "<!--]-->";
6
+ export declare const renderKey: (route: string, node: string, island: boolean, sep: boolean) => string;
7
+ export declare const separated: (list: ViewNode[], i: number) => boolean;
8
+ export declare function generateRender(build: BuildResult, images?: Variants | null): string;
9
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,WAAW,EAOhB,KAAK,QAAQ,EAGd,MAAM,eAAe,CAAA;AAGtB,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAA;AAGvD,eAAO,MAAM,GAAG,YAAY,CAAA;AAC5B,eAAO,MAAM,IAAI,aAAa,CAAA;AAC9B,eAAO,MAAM,KAAK,aAAa,CAAA;AAK/B,eAAO,MAAM,SAAS,UAAW,MAAM,QAAQ,MAAM,UAAU,OAAO,OAAO,OAAO,WAChC,CAAA;AAOpD,eAAO,MAAM,SAAS,SAAU,QAAQ,EAAE,KAAK,MAAM,YAAiC,CAAA;AA4VtF,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,GAAE,QAAQ,GAAG,IAAW,GAAG,MAAM,CAgDzF"}