@bestagentkits/render 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/CHANGELOG.md +29 -0
- package/LICENSE +21 -0
- package/README.md +166 -0
- package/dist/cli.d.ts +18 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +336 -0
- package/dist/cli.js.map +1 -0
- package/dist/diagnostics.d.ts +45 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +57 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/diagram/adapter.d.ts +71 -0
- package/dist/diagram/adapter.d.ts.map +1 -0
- package/dist/diagram/adapter.js +87 -0
- package/dist/diagram/adapter.js.map +1 -0
- package/dist/errors.d.ts +37 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +42 -0
- package/dist/errors.js.map +1 -0
- package/dist/hash.d.ts +14 -0
- package/dist/hash.d.ts.map +1 -0
- package/dist/hash.js +27 -0
- package/dist/hash.js.map +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/yaml-error.d.ts +14 -0
- package/dist/internal/yaml-error.d.ts.map +1 -0
- package/dist/internal/yaml-error.js +12 -0
- package/dist/internal/yaml-error.js.map +1 -0
- package/dist/ir.d.ts +77 -0
- package/dist/ir.d.ts.map +1 -0
- package/dist/ir.js +20 -0
- package/dist/ir.js.map +1 -0
- package/dist/json.d.ts +23 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +47 -0
- package/dist/json.js.map +1 -0
- package/dist/registry/actions.d.ts +48 -0
- package/dist/registry/actions.d.ts.map +1 -0
- package/dist/registry/actions.js +274 -0
- package/dist/registry/actions.js.map +1 -0
- package/dist/registry/prop-schema.d.ts +108 -0
- package/dist/registry/prop-schema.d.ts.map +1 -0
- package/dist/registry/prop-schema.js +400 -0
- package/dist/registry/prop-schema.js.map +1 -0
- package/dist/registry/registry.d.ts +47 -0
- package/dist/registry/registry.d.ts.map +1 -0
- package/dist/registry/registry.js +201 -0
- package/dist/registry/registry.js.map +1 -0
- package/dist/registry/roster.d.ts +53 -0
- package/dist/registry/roster.d.ts.map +1 -0
- package/dist/registry/roster.js +692 -0
- package/dist/registry/roster.js.map +1 -0
- package/dist/render/blocks.d.ts +41 -0
- package/dist/render/blocks.d.ts.map +1 -0
- package/dist/render/blocks.js +749 -0
- package/dist/render/blocks.js.map +1 -0
- package/dist/render/charts.d.ts +29 -0
- package/dist/render/charts.d.ts.map +1 -0
- package/dist/render/charts.js +235 -0
- package/dist/render/charts.js.map +1 -0
- package/dist/render/document.d.ts +40 -0
- package/dist/render/document.d.ts.map +1 -0
- package/dist/render/document.js +90 -0
- package/dist/render/document.js.map +1 -0
- package/dist/render/escape.d.ts +46 -0
- package/dist/render/escape.d.ts.map +1 -0
- package/dist/render/escape.js +108 -0
- package/dist/render/escape.js.map +1 -0
- package/dist/render/render.d.ts +52 -0
- package/dist/render/render.d.ts.map +1 -0
- package/dist/render/render.js +216 -0
- package/dist/render/render.js.map +1 -0
- package/dist/render/runtime.d.ts +25 -0
- package/dist/render/runtime.d.ts.map +1 -0
- package/dist/render/runtime.js +451 -0
- package/dist/render/runtime.js.map +1 -0
- package/dist/render/styles.d.ts +15 -0
- package/dist/render/styles.d.ts.map +1 -0
- package/dist/render/styles.js +163 -0
- package/dist/render/styles.js.map +1 -0
- package/dist/render/verify.d.ts +25 -0
- package/dist/render/verify.d.ts.map +1 -0
- package/dist/render/verify.js +168 -0
- package/dist/render/verify.js.map +1 -0
- package/dist/spec/bindings.d.ts +19 -0
- package/dist/spec/bindings.d.ts.map +1 -0
- package/dist/spec/bindings.js +51 -0
- package/dist/spec/bindings.js.map +1 -0
- package/dist/spec/bounds.d.ts +43 -0
- package/dist/spec/bounds.d.ts.map +1 -0
- package/dist/spec/bounds.js +144 -0
- package/dist/spec/bounds.js.map +1 -0
- package/dist/spec/forbidden.d.ts +27 -0
- package/dist/spec/forbidden.d.ts.map +1 -0
- package/dist/spec/forbidden.js +91 -0
- package/dist/spec/forbidden.js.map +1 -0
- package/dist/spec/migrate.d.ts +33 -0
- package/dist/spec/migrate.d.ts.map +1 -0
- package/dist/spec/migrate.js +113 -0
- package/dist/spec/migrate.js.map +1 -0
- package/dist/spec/normalize.d.ts +29 -0
- package/dist/spec/normalize.d.ts.map +1 -0
- package/dist/spec/normalize.js +649 -0
- package/dist/spec/normalize.js.map +1 -0
- package/dist/spec/parse.d.ts +22 -0
- package/dist/spec/parse.d.ts.map +1 -0
- package/dist/spec/parse.js +62 -0
- package/dist/spec/parse.js.map +1 -0
- package/dist/spec/providers.d.ts +30 -0
- package/dist/spec/providers.d.ts.map +1 -0
- package/dist/spec/providers.js +64 -0
- package/dist/spec/providers.js.map +1 -0
- package/dist/spec/validate.d.ts +28 -0
- package/dist/spec/validate.d.ts.map +1 -0
- package/dist/spec/validate.js +68 -0
- package/dist/spec/validate.js.map +1 -0
- package/dist/theme/load-theme.d.ts +55 -0
- package/dist/theme/load-theme.d.ts.map +1 -0
- package/dist/theme/load-theme.js +219 -0
- package/dist/theme/load-theme.js.map +1 -0
- package/dist/theme/presets.d.ts +50 -0
- package/dist/theme/presets.d.ts.map +1 -0
- package/dist/theme/presets.js +304 -0
- package/dist/theme/presets.js.map +1 -0
- package/dist/theme/theme-catalog.d.ts +68 -0
- package/dist/theme/theme-catalog.d.ts.map +1 -0
- package/dist/theme/theme-catalog.js +198 -0
- package/dist/theme/theme-catalog.js.map +1 -0
- package/dist/theme/tokens.d.ts +38 -0
- package/dist/theme/tokens.d.ts.map +1 -0
- package/dist/theme/tokens.js +190 -0
- package/dist/theme/tokens.js.map +1 -0
- package/dist/version.d.ts +12 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +12 -0
- package/dist/version.js.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Escaping and serialization.
|
|
3
|
+
*
|
|
4
|
+
* Escaping happens at emission, per context. Nothing here is applied at parse
|
|
5
|
+
* time: a value that is safe as text is not automatically safe as an attribute,
|
|
6
|
+
* in a URL, or inside a `script` element, and the compiler must not pretend
|
|
7
|
+
* otherwise.
|
|
8
|
+
*/
|
|
9
|
+
const TEXT_REPLACEMENTS = [
|
|
10
|
+
[/&/gu, '&'],
|
|
11
|
+
[/</gu, '<'],
|
|
12
|
+
[/>/gu, '>'],
|
|
13
|
+
];
|
|
14
|
+
const ATTRIBUTE_REPLACEMENTS = [
|
|
15
|
+
[/&/gu, '&'],
|
|
16
|
+
[/</gu, '<'],
|
|
17
|
+
[/>/gu, '>'],
|
|
18
|
+
[/"/gu, '"'],
|
|
19
|
+
[/'/gu, '''],
|
|
20
|
+
[/`/gu, '`'],
|
|
21
|
+
[/=/gu, '='],
|
|
22
|
+
[/\r/gu, ' '],
|
|
23
|
+
[/\n/gu, ' '],
|
|
24
|
+
// biome-ignore lint/suspicious/noControlCharactersInRegex: control characters must be matched in order to be stripped from attribute values
|
|
25
|
+
[/[\u0000-\u0008\u000b\u000c\u000e-\u001f]/gu, ''],
|
|
26
|
+
];
|
|
27
|
+
/** Escape text content for an element body. */
|
|
28
|
+
export function escapeText(value) {
|
|
29
|
+
let output = value;
|
|
30
|
+
for (const [pattern, replacement] of TEXT_REPLACEMENTS) {
|
|
31
|
+
output = output.replace(pattern, replacement);
|
|
32
|
+
}
|
|
33
|
+
return output;
|
|
34
|
+
}
|
|
35
|
+
/** Escape a value for a double-quoted attribute. */
|
|
36
|
+
export function escapeAttribute(value) {
|
|
37
|
+
let output = value;
|
|
38
|
+
for (const [pattern, replacement] of ATTRIBUTE_REPLACEMENTS) {
|
|
39
|
+
output = output.replace(pattern, replacement);
|
|
40
|
+
}
|
|
41
|
+
return output;
|
|
42
|
+
}
|
|
43
|
+
/** Characters that are never valid unescaped in an emitted URL reference. */
|
|
44
|
+
// biome-ignore lint/suspicious/noControlCharactersInRegex: control and space characters must be percent-encoded, so they must be matched
|
|
45
|
+
const URL_UNSAFE = /[\u0000-\u0020"<>\\^`{|}\u007f-\u009f]/gu;
|
|
46
|
+
/**
|
|
47
|
+
* Percent-encode a URL for emission.
|
|
48
|
+
*
|
|
49
|
+
* Scheme policy is enforced by the URL policy module before this runs; this
|
|
50
|
+
* function only guarantees that the emitted reference cannot break out of the
|
|
51
|
+
* attribute or introduce a control character.
|
|
52
|
+
*/
|
|
53
|
+
export function escapeUrl(value) {
|
|
54
|
+
return value.replace(URL_UNSAFE, (character) => Array.from(new TextEncoder().encode(character))
|
|
55
|
+
.map((byte) => `%${byte.toString(16).toUpperCase().padStart(2, '0')}`)
|
|
56
|
+
.join(''));
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Serialize embedded data for a `script type="application/json"` element.
|
|
60
|
+
*
|
|
61
|
+
* `<` and `>` are escaped so a value can never close the element, and the two
|
|
62
|
+
* Unicode line separators are escaped because they terminate a JavaScript line
|
|
63
|
+
* even inside a string literal.
|
|
64
|
+
*/
|
|
65
|
+
export function serializeJsonForScript(value) {
|
|
66
|
+
return JSON.stringify(value ?? null)
|
|
67
|
+
.replace(/</gu, '\\u003c')
|
|
68
|
+
.replace(/>/gu, '\\u003e')
|
|
69
|
+
.replace(/&/gu, '\\u0026')
|
|
70
|
+
.replace(/\u2028/gu, '\\u2028')
|
|
71
|
+
.replace(/\u2029/gu, '\\u2029');
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Serialize a JSON payload for a `data-*` attribute (not for a script body).
|
|
75
|
+
* Kept separate from `serializeJsonForScript` so the two contexts cannot be
|
|
76
|
+
* confused.
|
|
77
|
+
*/
|
|
78
|
+
export function serializeJsonForAttribute(value) {
|
|
79
|
+
return escapeAttribute(JSON.stringify(value ?? null));
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Render attributes in a fixed order.
|
|
83
|
+
*
|
|
84
|
+
* Ordering is deterministic regardless of the object's insertion order, so two
|
|
85
|
+
* runs of the compiler cannot differ because of how a renderer happened to
|
|
86
|
+
* build its attribute map.
|
|
87
|
+
*/
|
|
88
|
+
export function renderAttributes(attributes) {
|
|
89
|
+
const names = Object.keys(attributes)
|
|
90
|
+
.filter((name) => {
|
|
91
|
+
const value = attributes[name];
|
|
92
|
+
return value !== undefined && value !== null && value !== false;
|
|
93
|
+
})
|
|
94
|
+
.sort();
|
|
95
|
+
if (names.length === 0)
|
|
96
|
+
return '';
|
|
97
|
+
const parts = [];
|
|
98
|
+
for (const name of names) {
|
|
99
|
+
const value = attributes[name];
|
|
100
|
+
if (value === true) {
|
|
101
|
+
parts.push(` ${name}`);
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
parts.push(` ${name}="${escapeAttribute(String(value))}"`);
|
|
105
|
+
}
|
|
106
|
+
return parts.join('');
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=escape.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escape.js","sourceRoot":"","sources":["../../src/render/escape.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The compile pipeline.
|
|
3
|
+
*
|
|
4
|
+
* `parse -> validate -> normalize -> resolve registry -> resolve theme ->
|
|
5
|
+
* render -> collect used assets and runtime features -> assemble -> verify`
|
|
6
|
+
*
|
|
7
|
+
* Every stage is observable: `compile()` returns the IR, the resolved theme, the
|
|
8
|
+
* collected features, the diagnostics, and a content hash of the emitted bytes.
|
|
9
|
+
* `render()` is the same pipeline reduced to the HTML string.
|
|
10
|
+
*/
|
|
11
|
+
import { type Diagnostic } from '../diagnostics.js';
|
|
12
|
+
import type { DiagramAdapter } from '../diagram/adapter.js';
|
|
13
|
+
import type { IrDocument } from '../ir.js';
|
|
14
|
+
import type { RuntimeFeature } from '../registry/roster.js';
|
|
15
|
+
import { loadTheme, type ResolvedTheme } from '../theme/load-theme.js';
|
|
16
|
+
import { type ThemeCatalog } from '../theme/theme-catalog.js';
|
|
17
|
+
import { needsLiveRegion } from './runtime.js';
|
|
18
|
+
export interface RenderOptions {
|
|
19
|
+
/** Theme preset name or typed theme input; defaults to the spec's theme. */
|
|
20
|
+
theme?: unknown;
|
|
21
|
+
/** Source label used in parse diagnostics. */
|
|
22
|
+
source?: string;
|
|
23
|
+
/** Emit the light/dark toggle. On by default: AgentKit HTML pages require it. */
|
|
24
|
+
themeToggle?: boolean;
|
|
25
|
+
/** Preset catalog. Defaults to built-ins only; pass a discovered catalog to
|
|
26
|
+
* resolve project or user presets. */
|
|
27
|
+
themeCatalog?: ThemeCatalog;
|
|
28
|
+
/**
|
|
29
|
+
* Diagram adapter. AgentKit's Engineer install supplies one backed by the
|
|
30
|
+
* `ak:diagram` typed compiler; without it every diagram-panel emits the
|
|
31
|
+
* structured semantic fallback.
|
|
32
|
+
*/
|
|
33
|
+
diagramAdapter?: DiagramAdapter;
|
|
34
|
+
}
|
|
35
|
+
export interface CompileResult {
|
|
36
|
+
html: string;
|
|
37
|
+
/** Content hash of the emitted bytes; identical input yields an identical hash. */
|
|
38
|
+
hash: string;
|
|
39
|
+
bytes: number;
|
|
40
|
+
ir: IrDocument;
|
|
41
|
+
theme: ResolvedTheme;
|
|
42
|
+
features: RuntimeFeature[];
|
|
43
|
+
warnings: Diagnostic[];
|
|
44
|
+
}
|
|
45
|
+
/** Run the full pipeline and return everything it produced. */
|
|
46
|
+
export declare function compile(spec: unknown, options?: RenderOptions): CompileResult;
|
|
47
|
+
/** Compile a spec to a standalone HTML artifact. */
|
|
48
|
+
export declare function render(spec: unknown, options?: RenderOptions): string;
|
|
49
|
+
/** True when the emitted document needs the interaction runtime. */
|
|
50
|
+
export declare function documentNeedsRuntime(result: CompileResult): boolean;
|
|
51
|
+
export { loadTheme, needsLiveRegion };
|
|
52
|
+
//# sourceMappingURL=render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/render/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,KAAK,UAAU,EAAiB,MAAM,mBAAmB,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,KAAK,EAAE,UAAU,EAAU,MAAM,UAAU,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAgB,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGnF,OAAO,EAAgB,eAAe,EAAE,MAAM,cAAc,CAAC;AAI7D,MAAM,WAAW,aAAa;IAC5B,4EAA4E;IAC5E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;0CACsC;IACtC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B;;;;OAIG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,mFAAmF;IACnF,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,UAAU,CAAC;IACf,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,QAAQ,EAAE,UAAU,EAAE,CAAC;CACxB;AAwGD,+DAA+D;AAC/D,wBAAgB,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,GAAE,aAAkB,GAAG,aAAa,CAiGjF;AAED,oDAAoD;AACpD,wBAAgB,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAEzE;AAED,oEAAoE;AACpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAEnE;AAED,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The compile pipeline.
|
|
3
|
+
*
|
|
4
|
+
* `parse -> validate -> normalize -> resolve registry -> resolve theme ->
|
|
5
|
+
* render -> collect used assets and runtime features -> assemble -> verify`
|
|
6
|
+
*
|
|
7
|
+
* Every stage is observable: `compile()` returns the IR, the resolved theme, the
|
|
8
|
+
* collected features, the diagnostics, and a content hash of the emitted bytes.
|
|
9
|
+
* `render()` is the same pipeline reduced to the HTML string.
|
|
10
|
+
*/
|
|
11
|
+
import { DiagnosticBag } from '../diagnostics.js';
|
|
12
|
+
import { RenderError } from '../errors.js';
|
|
13
|
+
import { stableHash } from '../hash.js';
|
|
14
|
+
import { isPlainObject } from '../json.js';
|
|
15
|
+
import { normalizeSpec } from '../spec/normalize.js';
|
|
16
|
+
import { loadTheme, resolveTheme } from '../theme/load-theme.js';
|
|
17
|
+
import { builtinThemeCatalog } from '../theme/theme-catalog.js';
|
|
18
|
+
import { renderNode } from './blocks.js';
|
|
19
|
+
import { assembleDocument } from './document.js';
|
|
20
|
+
import { buildRuntime, needsLiveRegion } from './runtime.js';
|
|
21
|
+
import { BASE_CSS, FEATURE_CSS } from './styles.js';
|
|
22
|
+
import { verifyDocument, verifyIr } from './verify.js';
|
|
23
|
+
/** Fixed feature order: emitted bytes must not depend on discovery order. */
|
|
24
|
+
const FEATURE_ORDER = [
|
|
25
|
+
'tabs',
|
|
26
|
+
'accordion',
|
|
27
|
+
'carousel',
|
|
28
|
+
'slider',
|
|
29
|
+
'dialog',
|
|
30
|
+
'filter',
|
|
31
|
+
'copy',
|
|
32
|
+
'theme',
|
|
33
|
+
'chart',
|
|
34
|
+
'diagram',
|
|
35
|
+
'media',
|
|
36
|
+
];
|
|
37
|
+
function collectFeatures(ir, includeTheme) {
|
|
38
|
+
const features = new Set();
|
|
39
|
+
for (const node of ir.nodes) {
|
|
40
|
+
for (const feature of node.runtimeFeatures)
|
|
41
|
+
features.add(feature);
|
|
42
|
+
}
|
|
43
|
+
if (includeTheme)
|
|
44
|
+
features.add('theme');
|
|
45
|
+
return features;
|
|
46
|
+
}
|
|
47
|
+
function collectOrigins(ir) {
|
|
48
|
+
const policy = ir.policy.network;
|
|
49
|
+
if (policy === 'deny')
|
|
50
|
+
return [];
|
|
51
|
+
const origins = [];
|
|
52
|
+
const add = (reference, capability) => {
|
|
53
|
+
if (policy.allow.includes(capability) && /^https?:/iu.test(reference)) {
|
|
54
|
+
try {
|
|
55
|
+
origins.push(new URL(reference).origin);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// A reference that is not a URL is handled by the block renderer, not here.
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
for (const node of ir.nodes) {
|
|
63
|
+
const capability = node.type === 'image' || node.type === 'gallery' ? 'images' : 'media';
|
|
64
|
+
const src = node.props.src;
|
|
65
|
+
if (typeof src === 'string')
|
|
66
|
+
add(src, capability);
|
|
67
|
+
const items = node.props.items;
|
|
68
|
+
if (Array.isArray(items)) {
|
|
69
|
+
for (const item of items) {
|
|
70
|
+
if (isPlainObject(item) && typeof item.src === 'string')
|
|
71
|
+
add(item.src, capability);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return origins;
|
|
76
|
+
}
|
|
77
|
+
function buildCss(features, theme) {
|
|
78
|
+
const sheets = [BASE_CSS];
|
|
79
|
+
for (const feature of FEATURE_ORDER) {
|
|
80
|
+
if (!features.has(feature))
|
|
81
|
+
continue;
|
|
82
|
+
const sheet = FEATURE_CSS[feature];
|
|
83
|
+
if (sheet !== undefined)
|
|
84
|
+
sheets.push(sheet);
|
|
85
|
+
}
|
|
86
|
+
sheets.push(theme.css);
|
|
87
|
+
return sheets.join('\n');
|
|
88
|
+
}
|
|
89
|
+
function bodyNeedsRuntime(body) {
|
|
90
|
+
return body.includes('data-ak-on-') || body.includes('data-ak-dialog-open');
|
|
91
|
+
}
|
|
92
|
+
function nodeIndex(ir) {
|
|
93
|
+
return new Map(ir.nodes.map((node) => [node.id, node]));
|
|
94
|
+
}
|
|
95
|
+
function renderBody(ir, theme, features, renderOptions) {
|
|
96
|
+
const byId = nodeIndex(ir);
|
|
97
|
+
const context = {
|
|
98
|
+
ir,
|
|
99
|
+
theme,
|
|
100
|
+
features,
|
|
101
|
+
warnings: renderOptions.warnings,
|
|
102
|
+
...(renderOptions.diagramAdapter === undefined
|
|
103
|
+
? {}
|
|
104
|
+
: { diagramAdapter: renderOptions.diagramAdapter }),
|
|
105
|
+
renderChildren: (node) => node.children
|
|
106
|
+
.map((childId) => byId.get(childId))
|
|
107
|
+
.filter((child) => child !== undefined)
|
|
108
|
+
.map((child) => `<!-- ak:${child.id} -->${renderNode(child, context)}`)
|
|
109
|
+
.join('\n'),
|
|
110
|
+
};
|
|
111
|
+
const root = byId.get(ir.rootId);
|
|
112
|
+
if (root === undefined) {
|
|
113
|
+
throw new RenderError('INTERNAL_ERROR', 'normalized IR has no root node', { path: '$' });
|
|
114
|
+
}
|
|
115
|
+
// The root is rendered as a node, not as its children: the page renderer owns
|
|
116
|
+
// the `<main>` landmark and the h1 fallback.
|
|
117
|
+
return renderNode(root, context);
|
|
118
|
+
}
|
|
119
|
+
/** Run the full pipeline and return everything it produced. */
|
|
120
|
+
export function compile(spec, options = {}) {
|
|
121
|
+
const normalized = normalizeSpec(spec, {
|
|
122
|
+
...(options.source === undefined ? {} : { source: options.source }),
|
|
123
|
+
});
|
|
124
|
+
const errors = normalized.diagnostics.filter((diagnostic) => diagnostic.severity === 'error');
|
|
125
|
+
const firstError = errors[0];
|
|
126
|
+
if (firstError !== undefined) {
|
|
127
|
+
throw new RenderError(firstError.code, firstError.message, {
|
|
128
|
+
path: firstError.path,
|
|
129
|
+
...(firstError.nodeId === undefined ? {} : { nodeId: firstError.nodeId }),
|
|
130
|
+
details: { ...(firstError.details ?? {}), diagnostics: errors },
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
const ir = normalized.ir;
|
|
134
|
+
const themeBag = new DiagnosticBag();
|
|
135
|
+
const resolved = resolveTheme(options.theme ?? ir.theme, themeBag, options.themeCatalog ?? builtinThemeCatalog());
|
|
136
|
+
const themeErrors = themeBag.errors();
|
|
137
|
+
const firstThemeError = themeErrors[0];
|
|
138
|
+
if (resolved === undefined || firstThemeError !== undefined) {
|
|
139
|
+
if (firstThemeError === undefined) {
|
|
140
|
+
throw new RenderError('INTERNAL_ERROR', 'theme resolution failed without a diagnostic');
|
|
141
|
+
}
|
|
142
|
+
throw new RenderError(firstThemeError.code, firstThemeError.message, {
|
|
143
|
+
path: firstThemeError.path,
|
|
144
|
+
details: { ...(firstThemeError.details ?? {}), diagnostics: themeErrors },
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
const includeThemeToggle = options.themeToggle !== false;
|
|
148
|
+
const features = collectFeatures(ir, includeThemeToggle);
|
|
149
|
+
const css = buildCss(features, resolved);
|
|
150
|
+
const irDiagnostics = verifyIr(ir, features);
|
|
151
|
+
if (irDiagnostics.some((diagnostic) => diagnostic.severity === 'error')) {
|
|
152
|
+
throw new RenderError('INTERNAL_ERROR', 'IR verification failed', {
|
|
153
|
+
path: '$',
|
|
154
|
+
details: { diagnostics: irDiagnostics },
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
const renderWarnings = [];
|
|
158
|
+
const body = renderBody(ir, resolved, features, {
|
|
159
|
+
warnings: renderWarnings,
|
|
160
|
+
...(options.diagramAdapter === undefined ? {} : { diagramAdapter: options.diagramAdapter }),
|
|
161
|
+
});
|
|
162
|
+
const runtimeNeeded = features.size > 0 || bodyNeedsRuntime(body);
|
|
163
|
+
const js = runtimeNeeded
|
|
164
|
+
? buildRuntime({ features, state: ir.state, hasBindings: bodyNeedsRuntime(body) })
|
|
165
|
+
: '';
|
|
166
|
+
const assembled = assembleDocument({
|
|
167
|
+
ir,
|
|
168
|
+
compilerVersion: ir.compilerVersion,
|
|
169
|
+
css,
|
|
170
|
+
js,
|
|
171
|
+
body,
|
|
172
|
+
allowedOrigins: collectOrigins(ir),
|
|
173
|
+
themeToggle: includeThemeToggle,
|
|
174
|
+
density: resolved.density,
|
|
175
|
+
});
|
|
176
|
+
const verification = verifyDocument({
|
|
177
|
+
html: assembled.html,
|
|
178
|
+
ir,
|
|
179
|
+
csp: assembled.csp,
|
|
180
|
+
styleNonce: assembled.styleNonce,
|
|
181
|
+
scriptNonce: assembled.scriptNonce,
|
|
182
|
+
features,
|
|
183
|
+
css,
|
|
184
|
+
js,
|
|
185
|
+
});
|
|
186
|
+
const verificationErrors = verification.filter((diagnostic) => diagnostic.severity === 'error');
|
|
187
|
+
if (verificationErrors.length > 0) {
|
|
188
|
+
throw new RenderError('INTERNAL_ERROR', 'emitted document failed verification', {
|
|
189
|
+
path: '$',
|
|
190
|
+
details: { diagnostics: verificationErrors },
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
html: assembled.html,
|
|
195
|
+
hash: stableHash(assembled.html),
|
|
196
|
+
bytes: assembled.html.length,
|
|
197
|
+
ir,
|
|
198
|
+
theme: resolved,
|
|
199
|
+
features: FEATURE_ORDER.filter((feature) => features.has(feature)),
|
|
200
|
+
warnings: [
|
|
201
|
+
...normalized.diagnostics.filter((diagnostic) => diagnostic.severity === 'warning'),
|
|
202
|
+
...themeBag.warnings(),
|
|
203
|
+
...renderWarnings,
|
|
204
|
+
],
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
/** Compile a spec to a standalone HTML artifact. */
|
|
208
|
+
export function render(spec, options = {}) {
|
|
209
|
+
return compile(spec, options).html;
|
|
210
|
+
}
|
|
211
|
+
/** True when the emitted document needs the interaction runtime. */
|
|
212
|
+
export function documentNeedsRuntime(result) {
|
|
213
|
+
return result.html.includes('<script nonce=');
|
|
214
|
+
}
|
|
215
|
+
export { loadTheme, needsLiveRegion };
|
|
216
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/render/render.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The trusted interaction runtime.
|
|
3
|
+
*
|
|
4
|
+
* This is the only JavaScript the compiler emits, and it is a fixed program: a
|
|
5
|
+
* spec can bind actions, but it cannot author a handler, an expression, or a
|
|
6
|
+
* selector. Feature blocks are concatenated in a fixed order and only the
|
|
7
|
+
* features a page uses are included, so a page without a carousel ships no
|
|
8
|
+
* carousel code.
|
|
9
|
+
*
|
|
10
|
+
* Written in a conservative, dependency-free style (no arrow functions, no
|
|
11
|
+
* template literals) so the emitted artifact does not depend on a build step or
|
|
12
|
+
* a modern-browser-only syntax tier.
|
|
13
|
+
*/
|
|
14
|
+
import type { RuntimeFeature } from '../registry/roster.js';
|
|
15
|
+
export interface RuntimeOptions {
|
|
16
|
+
features: ReadonlySet<RuntimeFeature>;
|
|
17
|
+
state: Record<string, unknown>;
|
|
18
|
+
/** True when at least one block declares an action binding. */
|
|
19
|
+
hasBindings: boolean;
|
|
20
|
+
}
|
|
21
|
+
/** Build the emitted runtime for the features a page actually uses. */
|
|
22
|
+
export declare function buildRuntime(options: RuntimeOptions): string;
|
|
23
|
+
/** Features whose presence requires the live region in the document. */
|
|
24
|
+
export declare function needsLiveRegion(features: ReadonlySet<RuntimeFeature>): boolean;
|
|
25
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/render/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAK5D,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,+DAA+D;IAC/D,WAAW,EAAE,OAAO,CAAC;CACtB;AA8YD,uEAAuE;AACvE,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAqC5D;AAED,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,cAAc,CAAC,GAAG,OAAO,CAE9E"}
|