@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.
- package/LICENSE +21 -0
- package/README.md +15 -0
- package/dist/assets.d.ts +2 -0
- package/dist/assets.d.ts.map +1 -0
- package/dist/assets.js +4 -0
- package/dist/assets.js.map +1 -0
- package/dist/cache.d.ts +15 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +19 -0
- package/dist/cache.js.map +1 -0
- package/dist/compile.d.ts +43 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +170 -0
- package/dist/compile.js.map +1 -0
- package/dist/crawl.d.ts +12 -0
- package/dist/crawl.d.ts.map +1 -0
- package/dist/crawl.js +52 -0
- package/dist/crawl.js.map +1 -0
- package/dist/escape.d.ts +4 -0
- package/dist/escape.d.ts.map +1 -0
- package/dist/escape.js +7 -0
- package/dist/escape.js.map +1 -0
- package/dist/forms.d.ts +26 -0
- package/dist/forms.d.ts.map +1 -0
- package/dist/forms.js +107 -0
- package/dist/forms.js.map +1 -0
- package/dist/generate.d.ts +9 -0
- package/dist/generate.d.ts.map +1 -0
- package/dist/generate.js +395 -0
- package/dist/generate.js.map +1 -0
- package/dist/handler.d.ts +41 -0
- package/dist/handler.d.ts.map +1 -0
- package/dist/handler.js +567 -0
- package/dist/handler.js.map +1 -0
- package/dist/images.d.ts +4 -0
- package/dist/images.d.ts.map +1 -0
- package/dist/images.js +54 -0
- package/dist/images.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/lower.d.ts +13 -0
- package/dist/lower.d.ts.map +1 -0
- package/dist/lower.js +149 -0
- package/dist/lower.js.map +1 -0
- package/dist/pwa.d.ts +5 -0
- package/dist/pwa.d.ts.map +1 -0
- package/dist/pwa.js +66 -0
- package/dist/pwa.js.map +1 -0
- package/dist/render.d.ts +58 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +593 -0
- package/dist/render.js.map +1 -0
- package/dist/rendered.d.ts +64 -0
- package/dist/rendered.d.ts.map +1 -0
- package/dist/rendered.js +131 -0
- package/dist/rendered.js.map +1 -0
- package/dist/routing.d.ts +11 -0
- package/dist/routing.d.ts.map +1 -0
- package/dist/routing.js +30 -0
- package/dist/routing.js.map +1 -0
- package/dist/search.d.ts +3 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +40 -0
- package/dist/search.js.map +1 -0
- package/dist/security.d.ts +5 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +32 -0
- package/dist/security.js.map +1 -0
- package/dist/session.d.ts +12 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +35 -0
- package/dist/session.js.map +1 -0
- package/dist/shape.d.ts +8 -0
- package/dist/shape.d.ts.map +1 -0
- package/dist/shape.js +127 -0
- package/dist/shape.js.map +1 -0
- package/dist/static.d.ts +17 -0
- package/dist/static.d.ts.map +1 -0
- package/dist/static.js +33 -0
- package/dist/static.js.map +1 -0
- 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
|
package/dist/assets.d.ts
ADDED
|
@@ -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 @@
|
|
|
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"}
|
package/dist/cache.d.ts
ADDED
|
@@ -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"}
|
package/dist/compile.js
ADDED
|
@@ -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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"}
|
package/dist/crawl.d.ts
ADDED
|
@@ -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":"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"}
|
package/dist/escape.d.ts
ADDED
|
@@ -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 = { '&': '&', '<': '<', '>': '>', '"': '"' };
|
|
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"}
|
package/dist/forms.d.ts
ADDED
|
@@ -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"}
|