@elastic/isomer-sdk 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -2
- package/dist/author/authored_fields.d.ts +61 -11
- package/dist/author/authored_fields.d.ts.map +1 -1
- package/dist/author/authored_fields.js +73 -29
- package/dist/author/authored_fields.js.map +1 -1
- package/dist/author/authoring_input.d.ts +7 -0
- package/dist/author/authoring_input.d.ts.map +1 -0
- package/dist/author/authoring_input.js +60 -0
- package/dist/author/authoring_input.js.map +1 -0
- package/dist/author/authoring_model.d.ts +27 -0
- package/dist/author/authoring_model.d.ts.map +1 -0
- package/dist/author/authoring_model.js +98 -0
- package/dist/author/authoring_model.js.map +1 -0
- package/dist/author/declarations.d.ts +13 -0
- package/dist/author/declarations.d.ts.map +1 -0
- package/dist/author/declarations.js +277 -0
- package/dist/author/declarations.js.map +1 -0
- package/dist/author/index.d.ts +3 -1
- package/dist/author/index.d.ts.map +1 -1
- package/dist/author/index.js +3 -1
- package/dist/author/index.js.map +1 -1
- package/dist/author/jsx_shim.d.ts +6 -5
- package/dist/author/jsx_shim.d.ts.map +1 -1
- package/dist/author/jsx_shim.js +28 -111
- package/dist/author/jsx_shim.js.map +1 -1
- package/dist/author/schema_to_typescript.d.ts +37 -0
- package/dist/author/schema_to_typescript.d.ts.map +1 -0
- package/dist/author/schema_to_typescript.js +286 -0
- package/dist/author/schema_to_typescript.js.map +1 -0
- package/dist/cjs/author/authored_fields.js +77 -33
- package/dist/cjs/author/authored_fields.js.map +1 -1
- package/dist/cjs/author/authoring_input.js +64 -0
- package/dist/cjs/author/authoring_input.js.map +1 -0
- package/dist/cjs/author/authoring_model.js +104 -0
- package/dist/cjs/author/authoring_model.js.map +1 -0
- package/dist/cjs/author/declarations.js +281 -0
- package/dist/cjs/author/declarations.js.map +1 -0
- package/dist/cjs/author/index.js +6 -1
- package/dist/cjs/author/index.js.map +1 -1
- package/dist/cjs/author/jsx_shim.js +31 -114
- package/dist/cjs/author/jsx_shim.js.map +1 -1
- package/dist/cjs/author/schema_to_typescript.js +295 -0
- package/dist/cjs/author/schema_to_typescript.js.map +1 -0
- package/dist/cjs/composition/body_node_base.js +11 -4
- package/dist/cjs/composition/body_node_base.js.map +1 -1
- package/dist/cjs/composition/error.js +1 -0
- package/dist/cjs/composition/error.js.map +1 -1
- package/dist/cjs/composition/index.js +2 -1
- package/dist/cjs/composition/index.js.map +1 -1
- package/dist/cjs/define/frame.js +2 -3
- package/dist/cjs/define/frame.js.map +1 -1
- package/dist/cjs/define/index.js +7 -1
- package/dist/cjs/define/index.js.map +1 -1
- package/dist/cjs/define/primitive_example.js +26 -0
- package/dist/cjs/define/primitive_example.js.map +1 -0
- package/dist/cjs/define/primitive_icon.js +17 -0
- package/dist/cjs/define/primitive_icon.js.map +1 -0
- package/dist/cjs/define/primitive_module.js +14 -3
- package/dist/cjs/define/primitive_module.js.map +1 -1
- package/dist/cjs/define/slack_assets.js.map +1 -1
- package/dist/cjs/entries/index.js +7 -2
- package/dist/cjs/entries/index.js.map +1 -1
- package/dist/cjs/entries/slack.js +1 -2
- package/dist/cjs/entries/slack.js.map +1 -1
- package/dist/cjs/pack/capabilities.js +17 -11
- package/dist/cjs/pack/capabilities.js.map +1 -1
- package/dist/cjs/pack/compose.js +4 -1
- package/dist/cjs/pack/compose.js.map +1 -1
- package/dist/cjs/pack/index.js.map +1 -1
- package/dist/cjs/pack/primitive_pack.js +14 -2
- package/dist/cjs/pack/primitive_pack.js.map +1 -1
- package/dist/cjs/render/anchors.js +1 -1
- package/dist/cjs/render/anchors.js.map +1 -1
- package/dist/cjs/render/html/envelope.js.map +1 -1
- package/dist/cjs/render/layout_check.js.map +1 -1
- package/dist/cjs/render/markdown/builder.js +14 -8
- package/dist/cjs/render/markdown/builder.js.map +1 -1
- package/dist/cjs/render/markdown/format.js +30 -12
- package/dist/cjs/render/markdown/format.js.map +1 -1
- package/dist/cjs/render/primitive_dispatch.js +11 -25
- package/dist/cjs/render/primitive_dispatch.js.map +1 -1
- package/dist/cjs/render/slack/format.js +1 -601
- package/dist/cjs/render/slack/format.js.map +1 -1
- package/dist/cjs/render/slack/index.js +1 -2
- package/dist/cjs/render/slack/index.js.map +1 -1
- package/dist/cjs/render/slack/markdown_content.js +166 -115
- package/dist/cjs/render/slack/markdown_content.js.map +1 -1
- package/dist/cjs/testing/conformance.js +40 -24
- package/dist/cjs/testing/conformance.js.map +1 -1
- package/dist/cjs/testing/icon.js +248 -0
- package/dist/cjs/testing/icon.js.map +1 -0
- package/dist/cjs/testing/index.js +3 -1
- package/dist/cjs/testing/index.js.map +1 -1
- package/dist/cjs/testing/registration.js +5 -3
- package/dist/cjs/testing/registration.js.map +1 -1
- package/dist/cjs/validate/authoring_schema.js +17 -1
- package/dist/cjs/validate/authoring_schema.js.map +1 -1
- package/dist/cjs/validate/index.js +2 -1
- package/dist/cjs/validate/index.js.map +1 -1
- package/dist/cjs/validate/validation.js +2 -45
- package/dist/cjs/validate/validation.js.map +1 -1
- package/dist/composition/body_node_base.d.ts +7 -6
- package/dist/composition/body_node_base.d.ts.map +1 -1
- package/dist/composition/body_node_base.js +10 -3
- package/dist/composition/body_node_base.js.map +1 -1
- package/dist/composition/error.d.ts +1 -0
- package/dist/composition/error.d.ts.map +1 -1
- package/dist/composition/error.js +1 -0
- package/dist/composition/error.js.map +1 -1
- package/dist/composition/index.d.ts +1 -1
- package/dist/composition/index.d.ts.map +1 -1
- package/dist/composition/index.js +1 -1
- package/dist/composition/index.js.map +1 -1
- package/dist/define/frame.d.ts +9 -20
- package/dist/define/frame.d.ts.map +1 -1
- package/dist/define/frame.js +2 -3
- package/dist/define/frame.js.map +1 -1
- package/dist/define/index.d.ts +3 -1
- package/dist/define/index.d.ts.map +1 -1
- package/dist/define/index.js +3 -1
- package/dist/define/index.js.map +1 -1
- package/dist/define/primitive_example.d.ts +30 -0
- package/dist/define/primitive_example.d.ts.map +1 -0
- package/dist/define/primitive_example.js +21 -0
- package/dist/define/primitive_example.js.map +1 -0
- package/dist/define/primitive_icon.d.ts +11 -0
- package/dist/define/primitive_icon.d.ts.map +1 -0
- package/dist/define/primitive_icon.js +14 -0
- package/dist/define/primitive_icon.js.map +1 -0
- package/dist/define/primitive_module.d.ts +38 -24
- package/dist/define/primitive_module.d.ts.map +1 -1
- package/dist/define/primitive_module.js +14 -3
- package/dist/define/primitive_module.js.map +1 -1
- package/dist/define/slack_assets.d.ts +1 -1
- package/dist/define/slack_assets.d.ts.map +1 -1
- package/dist/define/slack_assets.js.map +1 -1
- package/dist/entries/index.d.ts +3 -3
- package/dist/entries/index.d.ts.map +1 -1
- package/dist/entries/index.js +2 -2
- package/dist/entries/index.js.map +1 -1
- package/dist/entries/slack.d.ts +1 -1
- package/dist/entries/slack.d.ts.map +1 -1
- package/dist/entries/slack.js +1 -1
- package/dist/entries/slack.js.map +1 -1
- package/dist/pack/capabilities.d.ts +24 -10
- package/dist/pack/capabilities.d.ts.map +1 -1
- package/dist/pack/capabilities.js +17 -11
- package/dist/pack/capabilities.js.map +1 -1
- package/dist/pack/compose.d.ts +4 -1
- package/dist/pack/compose.d.ts.map +1 -1
- package/dist/pack/compose.js +4 -1
- package/dist/pack/compose.js.map +1 -1
- package/dist/pack/index.d.ts +1 -1
- package/dist/pack/index.d.ts.map +1 -1
- package/dist/pack/index.js +1 -1
- package/dist/pack/index.js.map +1 -1
- package/dist/pack/primitive_pack.d.ts +11 -2
- package/dist/pack/primitive_pack.d.ts.map +1 -1
- package/dist/pack/primitive_pack.js +12 -1
- package/dist/pack/primitive_pack.js.map +1 -1
- package/dist/render/anchors.d.ts +2 -2
- package/dist/render/anchors.d.ts.map +1 -1
- package/dist/render/anchors.js +1 -1
- package/dist/render/anchors.js.map +1 -1
- package/dist/render/html/envelope.d.ts +3 -3
- package/dist/render/html/envelope.js.map +1 -1
- package/dist/render/layout_check.d.ts +1 -1
- package/dist/render/layout_check.d.ts.map +1 -1
- package/dist/render/layout_check.js.map +1 -1
- package/dist/render/markdown/builder.d.ts +2 -4
- package/dist/render/markdown/builder.d.ts.map +1 -1
- package/dist/render/markdown/builder.js +14 -7
- package/dist/render/markdown/builder.js.map +1 -1
- package/dist/render/markdown/format.d.ts +7 -0
- package/dist/render/markdown/format.d.ts.map +1 -1
- package/dist/render/markdown/format.js +27 -11
- package/dist/render/markdown/format.js.map +1 -1
- package/dist/render/primitive_dispatch.d.ts +6 -6
- package/dist/render/primitive_dispatch.d.ts.map +1 -1
- package/dist/render/primitive_dispatch.js +12 -26
- package/dist/render/primitive_dispatch.js.map +1 -1
- package/dist/render/slack/format.d.ts +0 -25
- package/dist/render/slack/format.d.ts.map +1 -1
- package/dist/render/slack/format.js +1 -599
- package/dist/render/slack/format.js.map +1 -1
- package/dist/render/slack/index.d.ts +1 -1
- package/dist/render/slack/index.d.ts.map +1 -1
- package/dist/render/slack/index.js +1 -1
- package/dist/render/slack/index.js.map +1 -1
- package/dist/render/slack/markdown_content.d.ts +10 -4
- package/dist/render/slack/markdown_content.d.ts.map +1 -1
- package/dist/render/slack/markdown_content.js +163 -113
- package/dist/render/slack/markdown_content.js.map +1 -1
- package/dist/testing/conformance.d.ts +19 -14
- package/dist/testing/conformance.d.ts.map +1 -1
- package/dist/testing/conformance.js +40 -24
- package/dist/testing/conformance.js.map +1 -1
- package/dist/testing/icon.d.ts +11 -0
- package/dist/testing/icon.d.ts.map +1 -0
- package/dist/testing/icon.js +244 -0
- package/dist/testing/icon.js.map +1 -0
- package/dist/testing/index.d.ts +2 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +1 -0
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/registration.d.ts +1 -1
- package/dist/testing/registration.d.ts.map +1 -1
- package/dist/testing/registration.js +6 -4
- package/dist/testing/registration.js.map +1 -1
- package/dist/validate/authoring_schema.d.ts +6 -0
- package/dist/validate/authoring_schema.d.ts.map +1 -1
- package/dist/validate/authoring_schema.js +15 -0
- package/dist/validate/authoring_schema.js.map +1 -1
- package/dist/validate/index.d.ts +1 -1
- package/dist/validate/index.d.ts.map +1 -1
- package/dist/validate/index.js +1 -1
- package/dist/validate/index.js.map +1 -1
- package/dist/validate/validation.d.ts +1 -11
- package/dist/validate/validation.d.ts.map +1 -1
- package/dist/validate/validation.js +3 -46
- package/dist/validate/validation.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
|
3
|
+
* or more contributor license agreements. Licensed under the Elastic License
|
|
4
|
+
* 2.0; you may not use this file except in compliance with the Elastic License
|
|
5
|
+
* 2.0.
|
|
6
|
+
*/
|
|
7
|
+
// Hosts insert an icon's `svg` as markup, so every rule here is an allowlist.
|
|
8
|
+
import { iconsByType } from '../pack/primitive_pack.js';
|
|
9
|
+
// HTML's markup whitespace, never `\s`: a parser reads NBSP and other Unicode separators as part of a name or as text.
|
|
10
|
+
const NUMBER = /^[-+0-9.eE,\t\n\f\r ]*$/;
|
|
11
|
+
const PATH_DATA = /^[-+0-9.eE,\t\n\f\r MmLlHhVvCcSsQqTtAaZz]*$/;
|
|
12
|
+
const TRANSFORM = /^(?:[\t\n\f\r ]*(?:matrix|translate|scale|rotate|skewX|skewY)[\t\n\f\r ]*\([-+0-9.eE,\t\n\f\r ]*\)[\t\n\f\r ]*,?)*[\t\n\f\r ]*$/;
|
|
13
|
+
const PAINT = /^(?:none|currentColor|var\(--isomer-icon-(?:accent|bg|fg|muted)(?:[\t\n\f\r ]*,[\t\n\f\r ]*(?:currentColor|#[0-9a-fA-F]{3}|#[0-9a-fA-F]{6}))?\))$/;
|
|
14
|
+
const PAINT_RULE = 'is not none, currentColor, or var(--isomer-icon-*)';
|
|
15
|
+
const NAME = /[A-Za-z][\w:.-]*/y;
|
|
16
|
+
const ATTRIBUTE_NAME = /[^\t\n\f\r "'<>/=]+/y;
|
|
17
|
+
const WHITESPACE = /[\t\n\f\r ]*/y;
|
|
18
|
+
const BLANK = /^[\t\n\f\r ]*$/;
|
|
19
|
+
const NAME_END = /[\t\n\f\r />]/;
|
|
20
|
+
const trimMarkup = (text) => text.replace(/^[\t\n\f\r ]+|[\t\n\f\r ]+$/g, '');
|
|
21
|
+
const isNumber = (value) => NUMBER.test(value);
|
|
22
|
+
const keyword = (...words) => (value) => words.includes(value);
|
|
23
|
+
const ATTRIBUTE_RULES = new Map([
|
|
24
|
+
['clip-rule', keyword('nonzero', 'evenodd')],
|
|
25
|
+
['cx', isNumber],
|
|
26
|
+
['cy', isNumber],
|
|
27
|
+
['d', (value) => PATH_DATA.test(value)],
|
|
28
|
+
['fill', (value) => PAINT.test(value)],
|
|
29
|
+
['fill-opacity', isNumber],
|
|
30
|
+
['fill-rule', keyword('nonzero', 'evenodd')],
|
|
31
|
+
['height', isNumber],
|
|
32
|
+
['opacity', isNumber],
|
|
33
|
+
['points', isNumber],
|
|
34
|
+
['r', isNumber],
|
|
35
|
+
['rx', isNumber],
|
|
36
|
+
['ry', isNumber],
|
|
37
|
+
['stroke', (value) => PAINT.test(value)],
|
|
38
|
+
['stroke-linecap', keyword('butt', 'round', 'square')],
|
|
39
|
+
['stroke-linejoin', keyword('miter', 'round', 'bevel')],
|
|
40
|
+
['stroke-opacity', isNumber],
|
|
41
|
+
['stroke-width', isNumber],
|
|
42
|
+
['transform', (value) => TRANSFORM.test(value)],
|
|
43
|
+
['viewBox', keyword('0 0 16 16')],
|
|
44
|
+
['width', isNumber],
|
|
45
|
+
['x', isNumber],
|
|
46
|
+
['x1', isNumber],
|
|
47
|
+
['x2', isNumber],
|
|
48
|
+
['xmlns', keyword('http://www.w3.org/2000/svg')],
|
|
49
|
+
['y', isNumber],
|
|
50
|
+
['y1', isNumber],
|
|
51
|
+
['y2', isNumber],
|
|
52
|
+
]);
|
|
53
|
+
const PRESENTATION = [
|
|
54
|
+
'clip-rule',
|
|
55
|
+
'fill',
|
|
56
|
+
'fill-opacity',
|
|
57
|
+
'fill-rule',
|
|
58
|
+
'opacity',
|
|
59
|
+
'stroke',
|
|
60
|
+
'stroke-linecap',
|
|
61
|
+
'stroke-linejoin',
|
|
62
|
+
'stroke-opacity',
|
|
63
|
+
'stroke-width',
|
|
64
|
+
'transform',
|
|
65
|
+
];
|
|
66
|
+
const ELEMENT_ATTRIBUTES = new Map([
|
|
67
|
+
['svg', new Set(['viewBox', 'xmlns', ...PRESENTATION])],
|
|
68
|
+
['g', new Set(PRESENTATION)],
|
|
69
|
+
['path', new Set(['d', ...PRESENTATION])],
|
|
70
|
+
['rect', new Set(['x', 'y', 'width', 'height', 'rx', 'ry', ...PRESENTATION])],
|
|
71
|
+
['circle', new Set(['cx', 'cy', 'r', ...PRESENTATION])],
|
|
72
|
+
['ellipse', new Set(['cx', 'cy', 'rx', 'ry', ...PRESENTATION])],
|
|
73
|
+
['line', new Set(['x1', 'y1', 'x2', 'y2', ...PRESENTATION])],
|
|
74
|
+
['polyline', new Set(['points', ...PRESENTATION])],
|
|
75
|
+
['polygon', new Set(['points', ...PRESENTATION])],
|
|
76
|
+
]);
|
|
77
|
+
/** Every way `svg` breaks the icon rules, as one line each; empty when it passes. */
|
|
78
|
+
const iconProblems = (svg) => {
|
|
79
|
+
const problems = [];
|
|
80
|
+
const open = [];
|
|
81
|
+
let roots = 0;
|
|
82
|
+
let index = 0;
|
|
83
|
+
const match = (pattern) => {
|
|
84
|
+
pattern.lastIndex = index;
|
|
85
|
+
const found = pattern.exec(svg)?.[0] ?? '';
|
|
86
|
+
index += found.length;
|
|
87
|
+
return found;
|
|
88
|
+
};
|
|
89
|
+
const checkAttributes = (element, attributes) => {
|
|
90
|
+
const allowed = ELEMENT_ATTRIBUTES.get(element);
|
|
91
|
+
if (!allowed) {
|
|
92
|
+
problems.push(`<${element}> is not an allowed element`);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
for (const [name, value] of attributes) {
|
|
96
|
+
if (!allowed.has(name)) {
|
|
97
|
+
problems.push(`${name} is not an allowed attribute on <${element}>`);
|
|
98
|
+
}
|
|
99
|
+
else if (value.includes('&')) {
|
|
100
|
+
problems.push(`${name}="${value}" contains an entity`);
|
|
101
|
+
}
|
|
102
|
+
else if (!ATTRIBUTE_RULES.get(name)(value)) {
|
|
103
|
+
problems.push(name === 'fill' || name === 'stroke'
|
|
104
|
+
? `${name}="${value}" ${PAINT_RULE}`
|
|
105
|
+
: `${name}="${value}" is not an allowed value`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
while (index < svg.length) {
|
|
110
|
+
if (svg[index] !== '<') {
|
|
111
|
+
const end = svg.indexOf('<', index);
|
|
112
|
+
const text = svg.slice(index, end === -1 ? undefined : end);
|
|
113
|
+
if (!BLANK.test(text)) {
|
|
114
|
+
problems.push(open.length > 0
|
|
115
|
+
? `text content "${trimMarkup(text)}" is not allowed`
|
|
116
|
+
: `unexpected "${trimMarkup(text)}" outside <svg>`);
|
|
117
|
+
return problems;
|
|
118
|
+
}
|
|
119
|
+
index += text.length;
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (svg.startsWith('<!', index) || svg.startsWith('<?', index)) {
|
|
123
|
+
problems.push('comments, declarations, and CDATA are not allowed');
|
|
124
|
+
return problems;
|
|
125
|
+
}
|
|
126
|
+
if (svg.startsWith('</', index)) {
|
|
127
|
+
index += 2;
|
|
128
|
+
const name = match(NAME);
|
|
129
|
+
match(WHITESPACE);
|
|
130
|
+
if (name === '' || svg[index] !== '>') {
|
|
131
|
+
problems.push('malformed closing tag');
|
|
132
|
+
return problems;
|
|
133
|
+
}
|
|
134
|
+
index += 1;
|
|
135
|
+
const expected = open.pop();
|
|
136
|
+
if (expected === undefined) {
|
|
137
|
+
problems.push(`</${name}> closes nothing`);
|
|
138
|
+
return problems;
|
|
139
|
+
}
|
|
140
|
+
if (expected !== name) {
|
|
141
|
+
problems.push(`</${name}> does not close <${expected}>`);
|
|
142
|
+
return problems;
|
|
143
|
+
}
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
index += 1;
|
|
147
|
+
const element = match(NAME);
|
|
148
|
+
if (element === '' || !NAME_END.test(svg[index] ?? '>')) {
|
|
149
|
+
problems.push('malformed opening tag');
|
|
150
|
+
return problems;
|
|
151
|
+
}
|
|
152
|
+
if (open.length === 0) {
|
|
153
|
+
roots += 1;
|
|
154
|
+
if (roots > 1) {
|
|
155
|
+
problems.push('more than one root element');
|
|
156
|
+
return problems;
|
|
157
|
+
}
|
|
158
|
+
if (element !== 'svg') {
|
|
159
|
+
problems.push(`root is <${element}>, not <svg>`);
|
|
160
|
+
return problems;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
const attributes = new Map();
|
|
164
|
+
let selfClosing = false;
|
|
165
|
+
for (;;) {
|
|
166
|
+
match(WHITESPACE);
|
|
167
|
+
if (svg.startsWith('/>', index)) {
|
|
168
|
+
index += 2;
|
|
169
|
+
selfClosing = true;
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
if (svg[index] === '>') {
|
|
173
|
+
index += 1;
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
const name = match(ATTRIBUTE_NAME);
|
|
177
|
+
if (name === '') {
|
|
178
|
+
problems.push(`<${element}> is not terminated`);
|
|
179
|
+
return problems;
|
|
180
|
+
}
|
|
181
|
+
match(WHITESPACE);
|
|
182
|
+
if (svg[index] !== '=') {
|
|
183
|
+
problems.push(`${name} on <${element}> has no value`);
|
|
184
|
+
return problems;
|
|
185
|
+
}
|
|
186
|
+
index += 1;
|
|
187
|
+
match(WHITESPACE);
|
|
188
|
+
const quote = svg[index];
|
|
189
|
+
if (quote !== '"' && quote !== "'") {
|
|
190
|
+
problems.push(`${name} on <${element}> is unquoted`);
|
|
191
|
+
return problems;
|
|
192
|
+
}
|
|
193
|
+
const close = svg.indexOf(quote, index + 1);
|
|
194
|
+
if (close === -1) {
|
|
195
|
+
problems.push(`${name} on <${element}> is unterminated`);
|
|
196
|
+
return problems;
|
|
197
|
+
}
|
|
198
|
+
const value = svg.slice(index + 1, close);
|
|
199
|
+
index = close + 1;
|
|
200
|
+
if (value.includes('<')) {
|
|
201
|
+
problems.push(`${name} on <${element}> contains "<"`);
|
|
202
|
+
return problems;
|
|
203
|
+
}
|
|
204
|
+
if (attributes.has(name)) {
|
|
205
|
+
problems.push(`<${element}> repeats ${name}`);
|
|
206
|
+
return problems;
|
|
207
|
+
}
|
|
208
|
+
attributes.set(name, value);
|
|
209
|
+
}
|
|
210
|
+
checkAttributes(element, attributes);
|
|
211
|
+
if (open.length === 0 && !attributes.has('viewBox')) {
|
|
212
|
+
problems.push('<svg> has no viewBox="0 0 16 16"');
|
|
213
|
+
}
|
|
214
|
+
if (!selfClosing) {
|
|
215
|
+
open.push(element);
|
|
216
|
+
}
|
|
217
|
+
else if (open.length === 0) {
|
|
218
|
+
problems.push('<svg> is empty');
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
if (roots === 0) {
|
|
222
|
+
problems.push('has no <svg> root');
|
|
223
|
+
}
|
|
224
|
+
for (const element of open.reverse()) {
|
|
225
|
+
problems.push(`<${element}> is not closed`);
|
|
226
|
+
}
|
|
227
|
+
return problems;
|
|
228
|
+
};
|
|
229
|
+
/**
|
|
230
|
+
* Fails when any icon in `pack` breaks the rules a host relies on to inline it: a single `<svg viewBox="0 0 16 16">` root, allowlisted shape elements and geometry or paint attributes, and paint limited to `none`, `currentColor`, or `var(--isomer-icon-*)` with an optional `currentColor` or hex fallback.
|
|
231
|
+
*
|
|
232
|
+
* @example
|
|
233
|
+
* ```ts
|
|
234
|
+
* assertPackIconsValid(slidesPack);
|
|
235
|
+
* ```
|
|
236
|
+
*/
|
|
237
|
+
export const assertPackIconsValid = ({ icons, primitives, }) => {
|
|
238
|
+
const byType = icons ?? iconsByType(primitives);
|
|
239
|
+
const problems = Object.keys(byType).flatMap((type) => iconProblems(byType[type].svg).map((problem) => `${type} icon: ${problem}`));
|
|
240
|
+
if (problems.length > 0) {
|
|
241
|
+
throw new Error(`Pack icons break the icon rules:\n${problems.map((line) => `- ${line}`).join('\n')}`);
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
//# sourceMappingURL=icon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon.js","sourceRoot":"","sources":["../../src/testing/icon.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\n// Hosts insert an icon's `svg` as markup, so every rule here is an allowlist.\n\nimport { iconsByType, type PrimitivePack } from '../pack/primitive_pack';\n\n// HTML's markup whitespace, never `\\s`: a parser reads NBSP and other Unicode separators as part of a name or as text.\nconst NUMBER = /^[-+0-9.eE,\\t\\n\\f\\r ]*$/;\nconst PATH_DATA = /^[-+0-9.eE,\\t\\n\\f\\r MmLlHhVvCcSsQqTtAaZz]*$/;\nconst TRANSFORM =\n /^(?:[\\t\\n\\f\\r ]*(?:matrix|translate|scale|rotate|skewX|skewY)[\\t\\n\\f\\r ]*\\([-+0-9.eE,\\t\\n\\f\\r ]*\\)[\\t\\n\\f\\r ]*,?)*[\\t\\n\\f\\r ]*$/;\nconst PAINT =\n /^(?:none|currentColor|var\\(--isomer-icon-(?:accent|bg|fg|muted)(?:[\\t\\n\\f\\r ]*,[\\t\\n\\f\\r ]*(?:currentColor|#[0-9a-fA-F]{3}|#[0-9a-fA-F]{6}))?\\))$/;\nconst PAINT_RULE = 'is not none, currentColor, or var(--isomer-icon-*)';\n\nconst NAME = /[A-Za-z][\\w:.-]*/y;\nconst ATTRIBUTE_NAME = /[^\\t\\n\\f\\r \"'<>/=]+/y;\nconst WHITESPACE = /[\\t\\n\\f\\r ]*/y;\nconst BLANK = /^[\\t\\n\\f\\r ]*$/;\nconst NAME_END = /[\\t\\n\\f\\r />]/;\n\nconst trimMarkup = (text: string): string =>\n text.replace(/^[\\t\\n\\f\\r ]+|[\\t\\n\\f\\r ]+$/g, '');\n\nconst isNumber = (value: string): boolean => NUMBER.test(value);\n\nconst keyword =\n (...words: string[]) =>\n (value: string): boolean =>\n words.includes(value);\n\nconst ATTRIBUTE_RULES: ReadonlyMap<string, (value: string) => boolean> =\n new Map([\n ['clip-rule', keyword('nonzero', 'evenodd')],\n ['cx', isNumber],\n ['cy', isNumber],\n ['d', (value) => PATH_DATA.test(value)],\n ['fill', (value) => PAINT.test(value)],\n ['fill-opacity', isNumber],\n ['fill-rule', keyword('nonzero', 'evenodd')],\n ['height', isNumber],\n ['opacity', isNumber],\n ['points', isNumber],\n ['r', isNumber],\n ['rx', isNumber],\n ['ry', isNumber],\n ['stroke', (value) => PAINT.test(value)],\n ['stroke-linecap', keyword('butt', 'round', 'square')],\n ['stroke-linejoin', keyword('miter', 'round', 'bevel')],\n ['stroke-opacity', isNumber],\n ['stroke-width', isNumber],\n ['transform', (value) => TRANSFORM.test(value)],\n ['viewBox', keyword('0 0 16 16')],\n ['width', isNumber],\n ['x', isNumber],\n ['x1', isNumber],\n ['x2', isNumber],\n ['xmlns', keyword('http://www.w3.org/2000/svg')],\n ['y', isNumber],\n ['y1', isNumber],\n ['y2', isNumber],\n ]);\n\nconst PRESENTATION = [\n 'clip-rule',\n 'fill',\n 'fill-opacity',\n 'fill-rule',\n 'opacity',\n 'stroke',\n 'stroke-linecap',\n 'stroke-linejoin',\n 'stroke-opacity',\n 'stroke-width',\n 'transform',\n];\n\nconst ELEMENT_ATTRIBUTES: ReadonlyMap<string, ReadonlySet<string>> = new Map([\n ['svg', new Set(['viewBox', 'xmlns', ...PRESENTATION])],\n ['g', new Set(PRESENTATION)],\n ['path', new Set(['d', ...PRESENTATION])],\n ['rect', new Set(['x', 'y', 'width', 'height', 'rx', 'ry', ...PRESENTATION])],\n ['circle', new Set(['cx', 'cy', 'r', ...PRESENTATION])],\n ['ellipse', new Set(['cx', 'cy', 'rx', 'ry', ...PRESENTATION])],\n ['line', new Set(['x1', 'y1', 'x2', 'y2', ...PRESENTATION])],\n ['polyline', new Set(['points', ...PRESENTATION])],\n ['polygon', new Set(['points', ...PRESENTATION])],\n]);\n\n/** Every way `svg` breaks the icon rules, as one line each; empty when it passes. */\nconst iconProblems = (svg: string): string[] => {\n const problems: string[] = [];\n const open: string[] = [];\n let roots = 0;\n let index = 0;\n\n const match = (pattern: RegExp): string => {\n pattern.lastIndex = index;\n const found = pattern.exec(svg)?.[0] ?? '';\n index += found.length;\n return found;\n };\n\n const checkAttributes = (\n element: string,\n attributes: ReadonlyMap<string, string>\n ): void => {\n const allowed = ELEMENT_ATTRIBUTES.get(element);\n if (!allowed) {\n problems.push(`<${element}> is not an allowed element`);\n return;\n }\n for (const [name, value] of attributes) {\n if (!allowed.has(name)) {\n problems.push(`${name} is not an allowed attribute on <${element}>`);\n } else if (value.includes('&')) {\n problems.push(`${name}=\"${value}\" contains an entity`);\n } else if (!ATTRIBUTE_RULES.get(name)!(value)) {\n problems.push(\n name === 'fill' || name === 'stroke'\n ? `${name}=\"${value}\" ${PAINT_RULE}`\n : `${name}=\"${value}\" is not an allowed value`\n );\n }\n }\n };\n\n while (index < svg.length) {\n if (svg[index] !== '<') {\n const end = svg.indexOf('<', index);\n const text = svg.slice(index, end === -1 ? undefined : end);\n if (!BLANK.test(text)) {\n problems.push(\n open.length > 0\n ? `text content \"${trimMarkup(text)}\" is not allowed`\n : `unexpected \"${trimMarkup(text)}\" outside <svg>`\n );\n return problems;\n }\n index += text.length;\n continue;\n }\n\n if (svg.startsWith('<!', index) || svg.startsWith('<?', index)) {\n problems.push('comments, declarations, and CDATA are not allowed');\n return problems;\n }\n\n if (svg.startsWith('</', index)) {\n index += 2;\n const name = match(NAME);\n match(WHITESPACE);\n if (name === '' || svg[index] !== '>') {\n problems.push('malformed closing tag');\n return problems;\n }\n index += 1;\n const expected = open.pop();\n if (expected === undefined) {\n problems.push(`</${name}> closes nothing`);\n return problems;\n }\n if (expected !== name) {\n problems.push(`</${name}> does not close <${expected}>`);\n return problems;\n }\n continue;\n }\n\n index += 1;\n const element = match(NAME);\n if (element === '' || !NAME_END.test(svg[index] ?? '>')) {\n problems.push('malformed opening tag');\n return problems;\n }\n if (open.length === 0) {\n roots += 1;\n if (roots > 1) {\n problems.push('more than one root element');\n return problems;\n }\n if (element !== 'svg') {\n problems.push(`root is <${element}>, not <svg>`);\n return problems;\n }\n }\n\n const attributes = new Map<string, string>();\n let selfClosing = false;\n for (;;) {\n match(WHITESPACE);\n if (svg.startsWith('/>', index)) {\n index += 2;\n selfClosing = true;\n break;\n }\n if (svg[index] === '>') {\n index += 1;\n break;\n }\n const name = match(ATTRIBUTE_NAME);\n if (name === '') {\n problems.push(`<${element}> is not terminated`);\n return problems;\n }\n match(WHITESPACE);\n if (svg[index] !== '=') {\n problems.push(`${name} on <${element}> has no value`);\n return problems;\n }\n index += 1;\n match(WHITESPACE);\n const quote = svg[index];\n if (quote !== '\"' && quote !== \"'\") {\n problems.push(`${name} on <${element}> is unquoted`);\n return problems;\n }\n const close = svg.indexOf(quote, index + 1);\n if (close === -1) {\n problems.push(`${name} on <${element}> is unterminated`);\n return problems;\n }\n const value = svg.slice(index + 1, close);\n index = close + 1;\n if (value.includes('<')) {\n problems.push(`${name} on <${element}> contains \"<\"`);\n return problems;\n }\n if (attributes.has(name)) {\n problems.push(`<${element}> repeats ${name}`);\n return problems;\n }\n attributes.set(name, value);\n }\n\n checkAttributes(element, attributes);\n if (open.length === 0 && !attributes.has('viewBox')) {\n problems.push('<svg> has no viewBox=\"0 0 16 16\"');\n }\n if (!selfClosing) {\n open.push(element);\n } else if (open.length === 0) {\n problems.push('<svg> is empty');\n }\n }\n\n if (roots === 0) {\n problems.push('has no <svg> root');\n }\n for (const element of open.reverse()) {\n problems.push(`<${element}> is not closed`);\n }\n return problems;\n};\n\n/**\n * Fails when any icon in `pack` breaks the rules a host relies on to inline it: a single `<svg viewBox=\"0 0 16 16\">` root, allowlisted shape elements and geometry or paint attributes, and paint limited to `none`, `currentColor`, or `var(--isomer-icon-*)` with an optional `currentColor` or hex fallback.\n *\n * @example\n * ```ts\n * assertPackIconsValid(slidesPack);\n * ```\n */\nexport const assertPackIconsValid = ({\n icons,\n primitives,\n}: Pick<PrimitivePack, 'icons' | 'primitives'>): void => {\n const byType = icons ?? iconsByType(primitives);\n const problems = Object.keys(byType).flatMap((type) =>\n iconProblems(byType[type]!.svg).map((problem) => `${type} icon: ${problem}`)\n );\n if (problems.length > 0) {\n throw new Error(\n `Pack icons break the icon rules:\\n${problems.map((line) => `- ${line}`).join('\\n')}`\n );\n }\n};\n"]}
|
package/dist/testing/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export { type PrimitiveConformanceCase, type PrimitiveConformanceExample, type PrimitiveConformanceHarness, type PrimitiveConformanceHtmlOptions, type PrimitiveConformanceSlackResult, type
|
|
1
|
+
export { type PrimitiveConformanceCase, type PrimitiveConformanceExample, type PrimitiveConformanceHarness, type PrimitiveConformanceHtmlOptions, type PrimitiveConformanceSlackResult, type PrimitiveConformanceSnapshotResult, CONFORMANCE_FOREIGN_MARKER, primitiveConformanceRows, runPrimitiveInventoryConformance, } from './conformance.js';
|
|
2
|
+
export { assertPackIconsValid } from './icon.js';
|
|
2
3
|
export { type PackRegistrationOptions, assertPackRegistrationComplete, } from './registration.js';
|
|
3
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EAChC,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,EACpC,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EAChC,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,EACpC,KAAK,kCAAkC,EACvC,0BAA0B,EAC1B,wBAAwB,EACxB,gCAAgC,GACjC,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,KAAK,uBAAuB,EAC5B,8BAA8B,GAC/B,MAAM,gBAAgB,CAAC"}
|
package/dist/testing/index.js
CHANGED
|
@@ -5,5 +5,6 @@
|
|
|
5
5
|
* 2.0.
|
|
6
6
|
*/
|
|
7
7
|
export { CONFORMANCE_FOREIGN_MARKER, primitiveConformanceRows, runPrimitiveInventoryConformance, } from './conformance.js';
|
|
8
|
+
export { assertPackIconsValid } from './icon.js';
|
|
8
9
|
export { assertPackRegistrationComplete, } from './registration.js';
|
|
9
10
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAOL,0BAA0B,EAC1B,wBAAwB,EACxB,gCAAgC,GACjC,MAAM,eAAe,CAAC;AACvB,OAAO,EAEL,8BAA8B,GAC/B,MAAM,gBAAgB,CAAC","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nexport {\n type PrimitiveConformanceCase,\n type PrimitiveConformanceExample,\n type PrimitiveConformanceHarness,\n type PrimitiveConformanceHtmlOptions,\n type PrimitiveConformanceSlackResult,\n type
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAOL,0BAA0B,EAC1B,wBAAwB,EACxB,gCAAgC,GACjC,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAEL,8BAA8B,GAC/B,MAAM,gBAAgB,CAAC","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nexport {\n type PrimitiveConformanceCase,\n type PrimitiveConformanceExample,\n type PrimitiveConformanceHarness,\n type PrimitiveConformanceHtmlOptions,\n type PrimitiveConformanceSlackResult,\n type PrimitiveConformanceSnapshotResult,\n CONFORMANCE_FOREIGN_MARKER,\n primitiveConformanceRows,\n runPrimitiveInventoryConformance,\n} from './conformance';\nexport { assertPackIconsValid } from './icon';\nexport {\n type PackRegistrationOptions,\n assertPackRegistrationComplete,\n} from './registration';\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { AnyPrimitiveDefinition } from '../define/primitive_module.js';
|
|
2
2
|
/** What {@link assertPackRegistrationComplete} needs to compare a pack against its directory. */
|
|
3
3
|
export interface PackRegistrationOptions {
|
|
4
|
-
/** Directory whose subdirectories are one primitive each. A `URL` is resolved with `fileURLToPath`. */
|
|
4
|
+
/** Directory whose subdirectories are one primitive each. A relative path resolves against the working directory; a `URL` is resolved with `fileURLToPath`. */
|
|
5
5
|
primitivesDir: URL | string;
|
|
6
6
|
/** The pack's registry array, as passed to `definePrimitivePack`. */
|
|
7
7
|
registered: readonly AnyPrimitiveDefinition[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registration.d.ts","sourceRoot":"","sources":["../../src/testing/registration.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEzE,iGAAiG;AACjG,MAAM,WAAW,uBAAuB;IACtC
|
|
1
|
+
{"version":3,"file":"registration.d.ts","sourceRoot":"","sources":["../../src/testing/registration.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEzE,iGAAiG;AACjG,MAAM,WAAW,uBAAuB;IACtC,+JAA+J;IAC/J,aAAa,EAAE,GAAG,GAAG,MAAM,CAAC;IAC5B,qEAAqE;IACrE,UAAU,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC9C,iDAAiD;IACjD,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5B;AAiDD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,8BAA8B,GAAU,wCAIlD,uBAAuB,KAAG,OAAO,CAAC,IAAI,CAyDxC,CAAC"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
// Node-only, and reached only through the `./testing` entry: this reads the
|
|
8
8
|
// filesystem, which no rendering path may do.
|
|
9
9
|
import { readdirSync, statSync } from 'node:fs';
|
|
10
|
-
import { join } from 'node:path';
|
|
10
|
+
import { join, resolve } from 'node:path';
|
|
11
11
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
12
12
|
const ENTRY_FILES = ['index.tsx', 'index.ts'];
|
|
13
13
|
/** Duck-typed so a definition from a different copy of the sdk still matches. */
|
|
@@ -38,6 +38,8 @@ const entryFileIn = (dir) => {
|
|
|
38
38
|
}
|
|
39
39
|
return undefined;
|
|
40
40
|
};
|
|
41
|
+
// The CommonJS build compiles `import()` to `require()`, which rejects `file:` URLs.
|
|
42
|
+
const loadEntry = async (entry) => (await import(typeof require === 'function' ? entry : pathToFileURL(entry).href));
|
|
41
43
|
const subdirectoriesOf = (root, ignore) => readdirSync(root, { withFileTypes: true })
|
|
42
44
|
.filter((entry) => entry.isDirectory() && !ignore.includes(entry.name))
|
|
43
45
|
.map((entry) => entry.name)
|
|
@@ -63,9 +65,9 @@ const subdirectoriesOf = (root, ignore) => readdirSync(root, { withFileTypes: tr
|
|
|
63
65
|
* ```
|
|
64
66
|
*/
|
|
65
67
|
export const assertPackRegistrationComplete = async ({ primitivesDir, registered, ignore = [], }) => {
|
|
66
|
-
const root = typeof primitivesDir === 'string'
|
|
68
|
+
const root = resolve(typeof primitivesDir === 'string'
|
|
67
69
|
? primitivesDir
|
|
68
|
-
: fileURLToPath(primitivesDir);
|
|
70
|
+
: fileURLToPath(primitivesDir));
|
|
69
71
|
const registeredTypes = new Set(registered.map(({ type }) => type));
|
|
70
72
|
const problems = [];
|
|
71
73
|
const foundTypes = new Set();
|
|
@@ -75,7 +77,7 @@ export const assertPackRegistrationComplete = async ({ primitivesDir, registered
|
|
|
75
77
|
problems.push(`${folder}/ has no ${ENTRY_FILES.join(' or ')}; add one or pass it in \`ignore\`.`);
|
|
76
78
|
continue;
|
|
77
79
|
}
|
|
78
|
-
const module =
|
|
80
|
+
const module = await loadEntry(entry);
|
|
79
81
|
const exported = Object.entries(module).filter(([, value]) => isPrimitiveDefinition(value));
|
|
80
82
|
if (exported.length === 0) {
|
|
81
83
|
problems.push(`${folder}/ exports no primitive definition; add one or pass it in \`ignore\`.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registration.js","sourceRoot":"","sources":["../../src/testing/registration.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,4EAA4E;AAC5E,8CAA8C;AAE9C,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"registration.js","sourceRoot":"","sources":["../../src/testing/registration.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\n// Node-only, and reached only through the `./testing` entry: this reads the\n// filesystem, which no rendering path may do.\n\nimport { readdirSync, statSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\n\nimport type { AnyPrimitiveDefinition } from '../define/primitive_module';\n\n/** What {@link assertPackRegistrationComplete} needs to compare a pack against its directory. */\nexport interface PackRegistrationOptions {\n /** Directory whose subdirectories are one primitive each. A relative path resolves against the working directory; a `URL` is resolved with `fileURLToPath`. */\n primitivesDir: URL | string;\n /** The pack's registry array, as passed to `definePrimitivePack`. */\n registered: readonly AnyPrimitiveDefinition[];\n /** Subdirectory names that hold no primitive. */\n ignore?: readonly string[];\n}\n\nconst ENTRY_FILES = ['index.tsx', 'index.ts'] as const;\n\n/** Duck-typed so a definition from a different copy of the sdk still matches. */\nconst isPrimitiveDefinition = (\n value: unknown\n): value is AnyPrimitiveDefinition => {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const { type, catalog, schema, renderers } = value as Record<string, unknown>;\n return (\n typeof type === 'string' &&\n typeof catalog === 'object' &&\n catalog !== null &&\n typeof schema === 'object' &&\n schema !== null &&\n typeof renderers === 'object' &&\n renderers !== null\n );\n};\n\nconst entryFileIn = (dir: string): string | undefined => {\n for (const name of ENTRY_FILES) {\n const candidate = join(dir, name);\n try {\n if (statSync(candidate).isFile()) {\n return candidate;\n }\n } catch {\n // Not this name; try the next.\n }\n }\n return undefined;\n};\n\n// The CommonJS build compiles `import()` to `require()`, which rejects `file:` URLs.\nconst loadEntry = async (entry: string): Promise<Record<string, unknown>> =>\n (await import(\n typeof require === 'function' ? entry : pathToFileURL(entry).href\n )) as Record<string, unknown>;\n\nconst subdirectoriesOf = (root: string, ignore: readonly string[]): string[] =>\n readdirSync(root, { withFileTypes: true })\n .filter((entry) => entry.isDirectory() && !ignore.includes(entry.name))\n .map((entry) => entry.name)\n .sort();\n\n/**\n * Fails when the primitives directory and the pack's registry disagree: a\n * subdirectory with no entry file or no exported definition, a defined type\n * nothing registers, or a registered type no directory defines. Each problem\n * line carries its fix.\n *\n * A pack keeps two hand-written lists, the registry array and the body-node\n * union, and nothing in the type system relates either to the directory they\n * describe. A primitive absent from both lists leaves them agreeing with each\n * other, so it compiles and every other test passes while the primitive is\n * unreachable. This is the check that notices.\n *\n * @example\n * ```ts\n * await assertPackRegistrationComplete({\n * primitivesDir: new URL('./primitives/', import.meta.url),\n * registered: slideDeckPrimitives,\n * });\n * ```\n */\nexport const assertPackRegistrationComplete = async ({\n primitivesDir,\n registered,\n ignore = [],\n}: PackRegistrationOptions): Promise<void> => {\n const root = resolve(\n typeof primitivesDir === 'string'\n ? primitivesDir\n : fileURLToPath(primitivesDir)\n );\n const registeredTypes = new Set(registered.map(({ type }) => type));\n const problems: string[] = [];\n const foundTypes = new Set<string>();\n\n for (const folder of subdirectoriesOf(root, ignore)) {\n const entry = entryFileIn(join(root, folder));\n if (!entry) {\n problems.push(\n `${folder}/ has no ${ENTRY_FILES.join(' or ')}; add one or pass it in \\`ignore\\`.`\n );\n continue;\n }\n\n const module = await loadEntry(entry);\n const exported = Object.entries(module).filter(([, value]) =>\n isPrimitiveDefinition(value)\n ) as Array<[string, AnyPrimitiveDefinition]>;\n\n if (exported.length === 0) {\n problems.push(\n `${folder}/ exports no primitive definition; add one or pass it in \\`ignore\\`.`\n );\n continue;\n }\n\n for (const [exportName, definition] of exported) {\n foundTypes.add(definition.type);\n if (registeredTypes.has(definition.type)) {\n continue;\n }\n problems.push(\n `${folder}/ defines \"${definition.type}\" but nothing registers it.\\n` +\n ` Import \\`${exportName}\\` from './${folder}' and add it to the registry array,\\n` +\n ` then add its node type to the pack's body-node union.`\n );\n }\n }\n\n for (const { type } of registered) {\n if (!foundTypes.has(type)) {\n problems.push(\n `\"${type}\" is registered but no directory under ${root} defines it.`\n );\n }\n }\n\n if (problems.length > 0) {\n throw new Error(\n `Pack registration is incomplete:\\n${problems.map((line) => `- ${line}`).join('\\n')}`\n );\n }\n};\n"]}
|
|
@@ -23,5 +23,11 @@ export declare const buildAuthoringJsonSchema: (definitions: readonly AnyPrimiti
|
|
|
23
23
|
export declare const authoringSchemaSubset: (schema: JsonSchema, types: readonly string[]) => {
|
|
24
24
|
$defs: Record<string, unknown>;
|
|
25
25
|
};
|
|
26
|
+
/**
|
|
27
|
+
* The `body` of a schema from {@link buildAuthoringJsonSchema} as a schema of
|
|
28
|
+
* its own, for an editor that validates body nodes rather than a whole
|
|
29
|
+
* composition. Carries the `$defs` the body reaches.
|
|
30
|
+
*/
|
|
31
|
+
export declare const authoringBodySchema: (schema: JsonSchema) => JsonSchema;
|
|
26
32
|
export {};
|
|
27
33
|
//# sourceMappingURL=authoring_schema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authoring_schema.d.ts","sourceRoot":"","sources":["../../src/validate/authoring_schema.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEzE,OAAO,EAEL,KAAK,4BAA4B,EAClC,MAAM,eAAe,CAAC;AAQvB,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAc1C,oDAAoD;AACpD,MAAM,WAAW,0BAA2B,SAAQ,4BAA4B;IAC9E,qFAAqF;IACrF,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,2DAA2D;IAC3D,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AA6RD;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,GACnC,aAAa,SAAS,sBAAsB,EAAE,EAC9C,UAAS,0BAA+B,KACvC,UAUF,CAAC;AAOF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAChC,QAAQ,UAAU,EAClB,OAAO,SAAS,MAAM,EAAE,KACvB;IAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAwBlC,CAAC"}
|
|
1
|
+
{"version":3,"file":"authoring_schema.d.ts","sourceRoot":"","sources":["../../src/validate/authoring_schema.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEzE,OAAO,EAEL,KAAK,4BAA4B,EAClC,MAAM,eAAe,CAAC;AAQvB,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAc1C,oDAAoD;AACpD,MAAM,WAAW,0BAA2B,SAAQ,4BAA4B;IAC9E,qFAAqF;IACrF,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,2DAA2D;IAC3D,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AA6RD;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,GACnC,aAAa,SAAS,sBAAsB,EAAE,EAC9C,UAAS,0BAA+B,KACvC,UAUF,CAAC;AAOF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAChC,QAAQ,UAAU,EAClB,OAAO,SAAS,MAAM,EAAE,KACvB;IAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAwBlC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,UAAU,KAAG,UASxD,CAAC"}
|
|
@@ -288,4 +288,19 @@ export const authoringSchemaSubset = (schema, types) => {
|
|
|
288
288
|
}
|
|
289
289
|
return { $defs: Object.fromEntries(kept) };
|
|
290
290
|
};
|
|
291
|
+
/**
|
|
292
|
+
* The `body` of a schema from {@link buildAuthoringJsonSchema} as a schema of
|
|
293
|
+
* its own, for an editor that validates body nodes rather than a whole
|
|
294
|
+
* composition. Carries the `$defs` the body reaches.
|
|
295
|
+
*/
|
|
296
|
+
export const authoringBodySchema = (schema) => {
|
|
297
|
+
const { properties, $schema } = schema;
|
|
298
|
+
const body = isJsonObject(properties) ? properties.body : undefined;
|
|
299
|
+
return pruneUnreferencedDefs({
|
|
300
|
+
...(typeof $schema === 'string' ? { $schema } : {}),
|
|
301
|
+
title: 'Body',
|
|
302
|
+
...(isJsonObject(body) ? body : { type: 'array' }),
|
|
303
|
+
$defs: defsOf(schema),
|
|
304
|
+
});
|
|
305
|
+
};
|
|
291
306
|
//# sourceMappingURL=authoring_schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authoring_schema.js","sourceRoot":"","sources":["../../src/validate/authoring_schema.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nimport type { ZodType } from 'zod';\n\nimport type { AnyPrimitiveDefinition } from '../define/primitive_module';\n\nimport {\n buildCompositionJsonSchema,\n type CompositionJsonSchemaOptions,\n} from './json_schema';\nimport {\n displayValueSchema,\n namedColorSchema,\n renderThemeSchema,\n structuredValueSchema,\n} from './value_schemas';\n\ntype JsonSchema = Record<string, unknown>;\n\nconst DEF_PREFIX = '#/$defs/';\nconst BODY_NODE_ID = 'bodyNode';\nconst SAFE_INTEGER_MAX = Number.MAX_SAFE_INTEGER;\nconst SCALAR_TYPES = new Set(['string', 'number', 'integer', 'boolean']);\n\nconst DEFAULT_EXTRA_DEFS: readonly { schema: ZodType; id: string }[] = [\n { schema: namedColorSchema, id: 'tone' },\n { schema: displayValueSchema, id: 'displayValue' },\n { schema: structuredValueSchema, id: 'structuredValue' },\n { schema: renderThemeSchema, id: 'renderTheme' },\n];\n\n/** Options for {@link buildAuthoringJsonSchema}. */\nexport interface AuthoringJsonSchemaOptions extends CompositionJsonSchemaOptions {\n /** `$def` id to `description`. Survives `z.toJSONSchema` dropping `.refine` text. */\n describe?: Readonly<Record<string, string>>;\n /** `$defId.property` paths to drop, e.g. `'kpi.delta'`. */\n omitProperties?: readonly string[];\n}\n\nconst isJsonObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst cloneJson = <T>(value: T): T => JSON.parse(JSON.stringify(value)) as T;\n\nconst ownDef = (defs: Record<string, unknown>, id: string): unknown =>\n Object.hasOwn(defs, id) ? defs[id] : undefined;\n\nconst parseDefRef = (ref: unknown): string | undefined => {\n if (typeof ref !== 'string' || !ref.startsWith(DEF_PREFIX)) {\n return undefined;\n }\n return ref.slice(DEF_PREFIX.length);\n};\n\nconst walkJson = (\n node: unknown,\n visit: (value: Record<string, unknown>) => void\n): void => {\n if (Array.isArray(node)) {\n for (const item of node) {\n walkJson(item, visit);\n }\n return;\n }\n if (!isJsonObject(node)) {\n return;\n }\n visit(node);\n for (const value of Object.values(node)) {\n walkJson(value, visit);\n }\n};\n\nconst mapJson = (\n node: unknown,\n visit: (value: Record<string, unknown>) => Record<string, unknown>\n): unknown => {\n if (Array.isArray(node)) {\n return node.map((item) => mapJson(item, visit));\n }\n if (!isJsonObject(node)) {\n return node;\n }\n return Object.fromEntries(\n Object.entries(visit(node)).map(([key, value]) => [\n key,\n mapJson(value, visit),\n ])\n );\n};\n\nconst rewriteDefRefs = (\n schema: JsonSchema,\n rewrite: (id: string) => string | JsonSchema | undefined\n): JsonSchema =>\n mapJson(schema, (node) => {\n const id = parseDefRef(node.$ref);\n if (id === undefined) {\n return node;\n }\n const replacement = rewrite(id);\n if (replacement === undefined) {\n return node;\n }\n if (typeof replacement === 'string') {\n return { ...node, $ref: `${DEF_PREFIX}${replacement}` };\n }\n const rest = { ...node };\n delete rest.$ref;\n return Object.keys(rest).length === 0\n ? cloneJson(replacement)\n : { ...cloneJson(replacement), ...rest };\n }) as JsonSchema;\n\nconst isRefOnlyDef = (def: unknown): def is { $ref: string } =>\n isJsonObject(def) &&\n Object.keys(def).length === 1 &&\n typeof def.$ref === 'string';\n\nconst isBareScalarDef = (def: unknown): def is Record<string, unknown> => {\n if (!isJsonObject(def)) {\n return false;\n }\n const { type } = def;\n if (typeof type !== 'string' || !SCALAR_TYPES.has(type)) {\n return false;\n }\n return !['enum', 'const', '$ref', 'properties'].some((key) =>\n Object.hasOwn(def, key)\n );\n};\n\nconst defsOf = (schema: JsonSchema): Record<string, unknown> =>\n isJsonObject(schema.$defs) ? schema.$defs : {};\n\nconst withDefs = (\n schema: JsonSchema,\n defs: Record<string, unknown>\n): JsonSchema => ({ ...schema, $defs: defs });\n\nconst dropSafeIntegerMaxima = (schema: JsonSchema): void => {\n walkJson(schema, (node) => {\n if (node.maximum === SAFE_INTEGER_MAX) {\n delete node.maximum;\n }\n if (node.minimum === -SAFE_INTEGER_MAX) {\n delete node.minimum;\n }\n });\n};\n\nconst dropNodeIdAndSurfaces = (schema: JsonSchema): void => {\n for (const def of Object.values(defsOf(schema))) {\n if (!isJsonObject(def) || !isJsonObject(def.properties)) {\n continue;\n }\n const typeProp = def.properties.type;\n if (!isJsonObject(typeProp) || typeof typeProp.const !== 'string') {\n continue;\n }\n delete def.properties.id;\n delete def.properties.surfaces;\n if (Array.isArray(def.required)) {\n def.required = def.required.filter(\n (key) => key !== 'id' && key !== 'surfaces'\n );\n }\n }\n};\n\nconst omitListedProperties = (\n schema: JsonSchema,\n paths: readonly string[]\n): void => {\n const defs = defsOf(schema);\n for (const path of paths) {\n const dot = path.indexOf('.');\n if (dot <= 0) {\n continue;\n }\n const defId = path.slice(0, dot);\n const property = path.slice(dot + 1);\n const def = ownDef(defs, defId);\n if (!isJsonObject(def) || !isJsonObject(def.properties)) {\n continue;\n }\n delete def.properties[property];\n if (Array.isArray(def.required)) {\n def.required = def.required.filter((key) => key !== property);\n }\n }\n};\n\nconst applyDescriptions = (\n schema: JsonSchema,\n describe: Readonly<Record<string, string>>\n): void => {\n const defs = defsOf(schema);\n for (const [id, description] of Object.entries(describe)) {\n const def = ownDef(defs, id);\n if (isJsonObject(def)) {\n def.description = description;\n }\n }\n};\n\nconst flattenRefOnlyDefs = (schema: JsonSchema): JsonSchema => {\n const defs = defsOf(schema);\n const aliases = new Map<string, string>();\n for (const [id, def] of Object.entries(defs)) {\n if (id === BODY_NODE_ID || !isRefOnlyDef(def)) {\n continue;\n }\n const target = parseDefRef(def.$ref);\n if (target === undefined || target === id) {\n continue;\n }\n aliases.set(id, target);\n }\n if (aliases.size === 0) {\n return schema;\n }\n const resolve = (id: string): string => {\n const seen = new Set<string>();\n let current = id;\n while (aliases.has(current) && !seen.has(current)) {\n seen.add(current);\n current = aliases.get(current) ?? current;\n }\n return current;\n };\n const rewritten = rewriteDefRefs(schema, (id) =>\n aliases.has(id) ? resolve(id) : undefined\n );\n const nextDefs = { ...defsOf(rewritten) };\n for (const id of aliases.keys()) {\n delete nextDefs[id];\n }\n return withDefs(rewritten, nextDefs);\n};\n\nconst inlineScalarDefs = (schema: JsonSchema): JsonSchema => {\n const defs = defsOf(schema);\n const scalars = new Map<string, Record<string, unknown>>();\n for (const [id, def] of Object.entries(defs)) {\n if (id === BODY_NODE_ID || !isBareScalarDef(def)) {\n continue;\n }\n scalars.set(id, def);\n }\n if (scalars.size === 0) {\n return schema;\n }\n const rewritten = rewriteDefRefs(schema, (id) => scalars.get(id));\n const nextDefs = { ...defsOf(rewritten) };\n for (const id of scalars.keys()) {\n delete nextDefs[id];\n }\n return withDefs(rewritten, nextDefs);\n};\n\nconst pruneUnreferencedDefs = (schema: JsonSchema): JsonSchema => {\n const defs = defsOf(schema);\n if (Object.keys(defs).length === 0) {\n return schema;\n }\n const referenced = new Set<string>();\n const visit = (node: unknown): void => {\n walkJson(node, (value) => {\n const id = parseDefRef(value.$ref);\n if (id === undefined || referenced.has(id)) {\n return;\n }\n referenced.add(id);\n visit(ownDef(defs, id));\n });\n };\n const root: JsonSchema = { ...schema };\n delete root.$defs;\n visit(root);\n referenced.add(BODY_NODE_ID);\n visit(defs[BODY_NODE_ID]);\n return withDefs(\n schema,\n Object.fromEntries(\n Object.entries(defs).filter(([id]) => referenced.has(id))\n )\n );\n};\n\nconst mergeExtraDefs = (\n extras: CompositionJsonSchemaOptions['extraDefs']\n): { schema: ZodType; id: string }[] => {\n const bySchema = new Map<ZodType, { schema: ZodType; id: string }>();\n for (const item of DEFAULT_EXTRA_DEFS) {\n bySchema.set(item.schema, item);\n }\n for (const item of extras ?? []) {\n bySchema.set(item.schema, item);\n }\n const byId = new Map<string, { schema: ZodType; id: string }>();\n for (const item of bySchema.values()) {\n byId.set(item.id, item);\n }\n return [...byId.values()];\n};\n\nconst slimAuthoringSchema = (\n schema: JsonSchema,\n options: AuthoringJsonSchemaOptions\n): JsonSchema => {\n const next = cloneJson(schema);\n dropSafeIntegerMaxima(next);\n dropNodeIdAndSurfaces(next);\n omitListedProperties(next, options.omitProperties ?? []);\n const flattened = flattenRefOnlyDefs(next);\n const inlined = inlineScalarDefs(flattened);\n const pruned = pruneUnreferencedDefs(inlined);\n applyDescriptions(pruned, options.describe ?? {});\n return pruned;\n};\n\n/**\n * Projects a composition to the JSON Schema an agent reads.\n *\n * {@link buildCompositionJsonSchema} stays the validator projection. This walk\n * names shared SDK defs, inlines scalar leaves, and drops host-only fields.\n */\nexport const buildAuthoringJsonSchema = (\n definitions: readonly AnyPrimitiveDefinition[],\n options: AuthoringJsonSchemaOptions = {}\n): JsonSchema => {\n const { describe, omitProperties, extraDefs, ...rest } = options;\n const projected = buildCompositionJsonSchema(definitions, {\n ...rest,\n extraDefs: mergeExtraDefs(extraDefs),\n });\n return slimAuthoringSchema(projected, {\n ...(describe === undefined ? {} : { describe }),\n ...(omitProperties === undefined ? {} : { omitProperties }),\n });\n};\n\nconst BODY_NODE_STUB = {\n description:\n 'Any primitive in the catalog, as its own object with its `type`.',\n};\n\n/**\n * The `$defs` that `types` reach in a schema from {@link buildAuthoringJsonSchema},\n * keyed as `schema` keys them, with the body-node union stubbed so a container\n * does not pull in every primitive.\n */\nexport const authoringSchemaSubset = (\n schema: JsonSchema,\n types: readonly string[]\n): { $defs: Record<string, unknown> } => {\n const defs = defsOf(schema);\n // A `Map`, so an id such as `constructor` is never an inherited key.\n const kept = new Map<string, unknown>();\n const visit = (id: string): void => {\n if (kept.has(id) || !Object.hasOwn(defs, id)) {\n return;\n }\n if (id === BODY_NODE_ID) {\n kept.set(id, BODY_NODE_STUB);\n return;\n }\n kept.set(id, defs[id]);\n walkJson(defs[id], (value) => {\n const ref = parseDefRef(value.$ref);\n if (ref !== undefined) {\n visit(ref);\n }\n });\n };\n for (const type of types) {\n visit(type);\n }\n return { $defs: Object.fromEntries(kept) };\n};\n"]}
|
|
1
|
+
{"version":3,"file":"authoring_schema.js","sourceRoot":"","sources":["../../src/validate/authoring_schema.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nimport type { ZodType } from 'zod';\n\nimport type { AnyPrimitiveDefinition } from '../define/primitive_module';\n\nimport {\n buildCompositionJsonSchema,\n type CompositionJsonSchemaOptions,\n} from './json_schema';\nimport {\n displayValueSchema,\n namedColorSchema,\n renderThemeSchema,\n structuredValueSchema,\n} from './value_schemas';\n\ntype JsonSchema = Record<string, unknown>;\n\nconst DEF_PREFIX = '#/$defs/';\nconst BODY_NODE_ID = 'bodyNode';\nconst SAFE_INTEGER_MAX = Number.MAX_SAFE_INTEGER;\nconst SCALAR_TYPES = new Set(['string', 'number', 'integer', 'boolean']);\n\nconst DEFAULT_EXTRA_DEFS: readonly { schema: ZodType; id: string }[] = [\n { schema: namedColorSchema, id: 'tone' },\n { schema: displayValueSchema, id: 'displayValue' },\n { schema: structuredValueSchema, id: 'structuredValue' },\n { schema: renderThemeSchema, id: 'renderTheme' },\n];\n\n/** Options for {@link buildAuthoringJsonSchema}. */\nexport interface AuthoringJsonSchemaOptions extends CompositionJsonSchemaOptions {\n /** `$def` id to `description`. Survives `z.toJSONSchema` dropping `.refine` text. */\n describe?: Readonly<Record<string, string>>;\n /** `$defId.property` paths to drop, e.g. `'kpi.delta'`. */\n omitProperties?: readonly string[];\n}\n\nconst isJsonObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst cloneJson = <T>(value: T): T => JSON.parse(JSON.stringify(value)) as T;\n\nconst ownDef = (defs: Record<string, unknown>, id: string): unknown =>\n Object.hasOwn(defs, id) ? defs[id] : undefined;\n\nconst parseDefRef = (ref: unknown): string | undefined => {\n if (typeof ref !== 'string' || !ref.startsWith(DEF_PREFIX)) {\n return undefined;\n }\n return ref.slice(DEF_PREFIX.length);\n};\n\nconst walkJson = (\n node: unknown,\n visit: (value: Record<string, unknown>) => void\n): void => {\n if (Array.isArray(node)) {\n for (const item of node) {\n walkJson(item, visit);\n }\n return;\n }\n if (!isJsonObject(node)) {\n return;\n }\n visit(node);\n for (const value of Object.values(node)) {\n walkJson(value, visit);\n }\n};\n\nconst mapJson = (\n node: unknown,\n visit: (value: Record<string, unknown>) => Record<string, unknown>\n): unknown => {\n if (Array.isArray(node)) {\n return node.map((item) => mapJson(item, visit));\n }\n if (!isJsonObject(node)) {\n return node;\n }\n return Object.fromEntries(\n Object.entries(visit(node)).map(([key, value]) => [\n key,\n mapJson(value, visit),\n ])\n );\n};\n\nconst rewriteDefRefs = (\n schema: JsonSchema,\n rewrite: (id: string) => string | JsonSchema | undefined\n): JsonSchema =>\n mapJson(schema, (node) => {\n const id = parseDefRef(node.$ref);\n if (id === undefined) {\n return node;\n }\n const replacement = rewrite(id);\n if (replacement === undefined) {\n return node;\n }\n if (typeof replacement === 'string') {\n return { ...node, $ref: `${DEF_PREFIX}${replacement}` };\n }\n const rest = { ...node };\n delete rest.$ref;\n return Object.keys(rest).length === 0\n ? cloneJson(replacement)\n : { ...cloneJson(replacement), ...rest };\n }) as JsonSchema;\n\nconst isRefOnlyDef = (def: unknown): def is { $ref: string } =>\n isJsonObject(def) &&\n Object.keys(def).length === 1 &&\n typeof def.$ref === 'string';\n\nconst isBareScalarDef = (def: unknown): def is Record<string, unknown> => {\n if (!isJsonObject(def)) {\n return false;\n }\n const { type } = def;\n if (typeof type !== 'string' || !SCALAR_TYPES.has(type)) {\n return false;\n }\n return !['enum', 'const', '$ref', 'properties'].some((key) =>\n Object.hasOwn(def, key)\n );\n};\n\nconst defsOf = (schema: JsonSchema): Record<string, unknown> =>\n isJsonObject(schema.$defs) ? schema.$defs : {};\n\nconst withDefs = (\n schema: JsonSchema,\n defs: Record<string, unknown>\n): JsonSchema => ({ ...schema, $defs: defs });\n\nconst dropSafeIntegerMaxima = (schema: JsonSchema): void => {\n walkJson(schema, (node) => {\n if (node.maximum === SAFE_INTEGER_MAX) {\n delete node.maximum;\n }\n if (node.minimum === -SAFE_INTEGER_MAX) {\n delete node.minimum;\n }\n });\n};\n\nconst dropNodeIdAndSurfaces = (schema: JsonSchema): void => {\n for (const def of Object.values(defsOf(schema))) {\n if (!isJsonObject(def) || !isJsonObject(def.properties)) {\n continue;\n }\n const typeProp = def.properties.type;\n if (!isJsonObject(typeProp) || typeof typeProp.const !== 'string') {\n continue;\n }\n delete def.properties.id;\n delete def.properties.surfaces;\n if (Array.isArray(def.required)) {\n def.required = def.required.filter(\n (key) => key !== 'id' && key !== 'surfaces'\n );\n }\n }\n};\n\nconst omitListedProperties = (\n schema: JsonSchema,\n paths: readonly string[]\n): void => {\n const defs = defsOf(schema);\n for (const path of paths) {\n const dot = path.indexOf('.');\n if (dot <= 0) {\n continue;\n }\n const defId = path.slice(0, dot);\n const property = path.slice(dot + 1);\n const def = ownDef(defs, defId);\n if (!isJsonObject(def) || !isJsonObject(def.properties)) {\n continue;\n }\n delete def.properties[property];\n if (Array.isArray(def.required)) {\n def.required = def.required.filter((key) => key !== property);\n }\n }\n};\n\nconst applyDescriptions = (\n schema: JsonSchema,\n describe: Readonly<Record<string, string>>\n): void => {\n const defs = defsOf(schema);\n for (const [id, description] of Object.entries(describe)) {\n const def = ownDef(defs, id);\n if (isJsonObject(def)) {\n def.description = description;\n }\n }\n};\n\nconst flattenRefOnlyDefs = (schema: JsonSchema): JsonSchema => {\n const defs = defsOf(schema);\n const aliases = new Map<string, string>();\n for (const [id, def] of Object.entries(defs)) {\n if (id === BODY_NODE_ID || !isRefOnlyDef(def)) {\n continue;\n }\n const target = parseDefRef(def.$ref);\n if (target === undefined || target === id) {\n continue;\n }\n aliases.set(id, target);\n }\n if (aliases.size === 0) {\n return schema;\n }\n const resolve = (id: string): string => {\n const seen = new Set<string>();\n let current = id;\n while (aliases.has(current) && !seen.has(current)) {\n seen.add(current);\n current = aliases.get(current) ?? current;\n }\n return current;\n };\n const rewritten = rewriteDefRefs(schema, (id) =>\n aliases.has(id) ? resolve(id) : undefined\n );\n const nextDefs = { ...defsOf(rewritten) };\n for (const id of aliases.keys()) {\n delete nextDefs[id];\n }\n return withDefs(rewritten, nextDefs);\n};\n\nconst inlineScalarDefs = (schema: JsonSchema): JsonSchema => {\n const defs = defsOf(schema);\n const scalars = new Map<string, Record<string, unknown>>();\n for (const [id, def] of Object.entries(defs)) {\n if (id === BODY_NODE_ID || !isBareScalarDef(def)) {\n continue;\n }\n scalars.set(id, def);\n }\n if (scalars.size === 0) {\n return schema;\n }\n const rewritten = rewriteDefRefs(schema, (id) => scalars.get(id));\n const nextDefs = { ...defsOf(rewritten) };\n for (const id of scalars.keys()) {\n delete nextDefs[id];\n }\n return withDefs(rewritten, nextDefs);\n};\n\nconst pruneUnreferencedDefs = (schema: JsonSchema): JsonSchema => {\n const defs = defsOf(schema);\n if (Object.keys(defs).length === 0) {\n return schema;\n }\n const referenced = new Set<string>();\n const visit = (node: unknown): void => {\n walkJson(node, (value) => {\n const id = parseDefRef(value.$ref);\n if (id === undefined || referenced.has(id)) {\n return;\n }\n referenced.add(id);\n visit(ownDef(defs, id));\n });\n };\n const root: JsonSchema = { ...schema };\n delete root.$defs;\n visit(root);\n referenced.add(BODY_NODE_ID);\n visit(defs[BODY_NODE_ID]);\n return withDefs(\n schema,\n Object.fromEntries(\n Object.entries(defs).filter(([id]) => referenced.has(id))\n )\n );\n};\n\nconst mergeExtraDefs = (\n extras: CompositionJsonSchemaOptions['extraDefs']\n): { schema: ZodType; id: string }[] => {\n const bySchema = new Map<ZodType, { schema: ZodType; id: string }>();\n for (const item of DEFAULT_EXTRA_DEFS) {\n bySchema.set(item.schema, item);\n }\n for (const item of extras ?? []) {\n bySchema.set(item.schema, item);\n }\n const byId = new Map<string, { schema: ZodType; id: string }>();\n for (const item of bySchema.values()) {\n byId.set(item.id, item);\n }\n return [...byId.values()];\n};\n\nconst slimAuthoringSchema = (\n schema: JsonSchema,\n options: AuthoringJsonSchemaOptions\n): JsonSchema => {\n const next = cloneJson(schema);\n dropSafeIntegerMaxima(next);\n dropNodeIdAndSurfaces(next);\n omitListedProperties(next, options.omitProperties ?? []);\n const flattened = flattenRefOnlyDefs(next);\n const inlined = inlineScalarDefs(flattened);\n const pruned = pruneUnreferencedDefs(inlined);\n applyDescriptions(pruned, options.describe ?? {});\n return pruned;\n};\n\n/**\n * Projects a composition to the JSON Schema an agent reads.\n *\n * {@link buildCompositionJsonSchema} stays the validator projection. This walk\n * names shared SDK defs, inlines scalar leaves, and drops host-only fields.\n */\nexport const buildAuthoringJsonSchema = (\n definitions: readonly AnyPrimitiveDefinition[],\n options: AuthoringJsonSchemaOptions = {}\n): JsonSchema => {\n const { describe, omitProperties, extraDefs, ...rest } = options;\n const projected = buildCompositionJsonSchema(definitions, {\n ...rest,\n extraDefs: mergeExtraDefs(extraDefs),\n });\n return slimAuthoringSchema(projected, {\n ...(describe === undefined ? {} : { describe }),\n ...(omitProperties === undefined ? {} : { omitProperties }),\n });\n};\n\nconst BODY_NODE_STUB = {\n description:\n 'Any primitive in the catalog, as its own object with its `type`.',\n};\n\n/**\n * The `$defs` that `types` reach in a schema from {@link buildAuthoringJsonSchema},\n * keyed as `schema` keys them, with the body-node union stubbed so a container\n * does not pull in every primitive.\n */\nexport const authoringSchemaSubset = (\n schema: JsonSchema,\n types: readonly string[]\n): { $defs: Record<string, unknown> } => {\n const defs = defsOf(schema);\n // A `Map`, so an id such as `constructor` is never an inherited key.\n const kept = new Map<string, unknown>();\n const visit = (id: string): void => {\n if (kept.has(id) || !Object.hasOwn(defs, id)) {\n return;\n }\n if (id === BODY_NODE_ID) {\n kept.set(id, BODY_NODE_STUB);\n return;\n }\n kept.set(id, defs[id]);\n walkJson(defs[id], (value) => {\n const ref = parseDefRef(value.$ref);\n if (ref !== undefined) {\n visit(ref);\n }\n });\n };\n for (const type of types) {\n visit(type);\n }\n return { $defs: Object.fromEntries(kept) };\n};\n\n/**\n * The `body` of a schema from {@link buildAuthoringJsonSchema} as a schema of\n * its own, for an editor that validates body nodes rather than a whole\n * composition. Carries the `$defs` the body reaches.\n */\nexport const authoringBodySchema = (schema: JsonSchema): JsonSchema => {\n const { properties, $schema } = schema;\n const body = isJsonObject(properties) ? properties.body : undefined;\n return pruneUnreferencedDefs({\n ...(typeof $schema === 'string' ? { $schema } : {}),\n title: 'Body',\n ...(isJsonObject(body) ? body : { type: 'array' }),\n $defs: defsOf(schema),\n });\n};\n"]}
|
package/dist/validate/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { type AuthoringJsonSchemaOptions, authoringSchemaSubset, buildAuthoringJsonSchema, } from './authoring_schema.js';
|
|
1
|
+
export { type AuthoringJsonSchemaOptions, authoringBodySchema, authoringSchemaSubset, buildAuthoringJsonSchema, } from './authoring_schema.js';
|
|
2
2
|
export { type CompositionSchemaOptions, buildBodyNodeSchemaFromDefinitions, buildCompositionSchema, buildCompositionSchemaFromDefinitions, getCompositionSchemaForDefinitions, metaSchema, } from './composition_schema.js';
|
|
3
3
|
export { type InputBudget, type InputBudgetCheck, MAX_INPUT_CHARACTERS, MAX_INPUT_DEPTH, MAX_INPUT_VALUES, checkInputBudget, isInputRefusal, } from './input_budget.js';
|
|
4
4
|
export { type CompositionJsonSchemaOptions, buildCompositionJsonSchema, } from './json_schema.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validate/index.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,KAAK,0BAA0B,EAC/B,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,KAAK,wBAAwB,EAC7B,kCAAkC,EAClC,sBAAsB,EACtB,qCAAqC,EACrC,kCAAkC,EAClC,UAAU,GACX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,KAAK,4BAA4B,EACjC,0BAA0B,GAC3B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,KAAK,SAAS,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EACL,KAAK,gBAAgB,EACrB,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,uBAAuB,EACvB,oBAAoB,EACpB,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,OAAO,CAAC;AACf,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,2BAA2B,EAChC,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,mBAAmB,EACnB,0BAA0B,EAC1B,uBAAuB,EACvB,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validate/index.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,KAAK,0BAA0B,EAC/B,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,KAAK,wBAAwB,EAC7B,kCAAkC,EAClC,sBAAsB,EACtB,qCAAqC,EACrC,kCAAkC,EAClC,UAAU,GACX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,KAAK,4BAA4B,EACjC,0BAA0B,GAC3B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,KAAK,SAAS,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EACL,KAAK,gBAAgB,EACrB,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,uBAAuB,EACvB,oBAAoB,EACpB,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,OAAO,CAAC;AACf,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,2BAA2B,EAChC,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,mBAAmB,EACnB,0BAA0B,EAC1B,uBAAuB,EACvB,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC"}
|
package/dist/validate/index.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* 2.0; you may not use this file except in compliance with the Elastic License
|
|
5
5
|
* 2.0.
|
|
6
6
|
*/
|
|
7
|
-
export { authoringSchemaSubset, buildAuthoringJsonSchema, } from './authoring_schema.js';
|
|
7
|
+
export { authoringBodySchema, authoringSchemaSubset, buildAuthoringJsonSchema, } from './authoring_schema.js';
|
|
8
8
|
export { buildBodyNodeSchemaFromDefinitions, buildCompositionSchema, buildCompositionSchemaFromDefinitions, getCompositionSchemaForDefinitions, metaSchema, } from './composition_schema.js';
|
|
9
9
|
export { MAX_INPUT_CHARACTERS, MAX_INPUT_DEPTH, MAX_INPUT_VALUES, checkInputBudget, isInputRefusal, } from './input_budget.js';
|
|
10
10
|
export { buildCompositionJsonSchema, } from './json_schema.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validate/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAEL,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,kCAAkC,EAClC,sBAAsB,EACtB,qCAAqC,EACrC,kCAAkC,EAClC,UAAU,GACX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAGL,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAEL,0BAA0B,GAC3B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAkB,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EAEL,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,uBAAuB,EACvB,oBAAoB,EACpB,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,OAAO,CAAC;AACf,OAAO,EAQL,mBAAmB,EACnB,0BAA0B,EAC1B,uBAAuB,EACvB,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nexport {\n type AuthoringJsonSchemaOptions,\n authoringSchemaSubset,\n buildAuthoringJsonSchema,\n} from './authoring_schema';\nexport {\n type CompositionSchemaOptions,\n buildBodyNodeSchemaFromDefinitions,\n buildCompositionSchema,\n buildCompositionSchemaFromDefinitions,\n getCompositionSchemaForDefinitions,\n metaSchema,\n} from './composition_schema';\nexport {\n type InputBudget,\n type InputBudgetCheck,\n MAX_INPUT_CHARACTERS,\n MAX_INPUT_DEPTH,\n MAX_INPUT_VALUES,\n checkInputBudget,\n isInputRefusal,\n} from './input_budget';\nexport {\n type CompositionJsonSchemaOptions,\n buildCompositionJsonSchema,\n} from './json_schema';\nexport { type IssueRoot, createNodeIssueFormatter } from './node_issues';\nexport {\n type UrlSchemaOptions,\n ASSET_URL_MESSAGE,\n ASSET_URL_RULE,\n BLOCKED_HREF,\n NAVIGATION_HREF_MESSAGE,\n NAVIGATION_HREF_RULE,\n assetUrl,\n navigationHref,\n sanitizeAssetUrl,\n sanitizeNavigationHref,\n sanitizeParsedAssetUrl,\n sanitizeParsedNavigationHref,\n} from './url';\nexport {\n type CheckedComposition,\n type CheckedValidationResult,\n type CompositionValidatorOptions,\n type ParsedComposition,\n type ValidationErrorMode,\n type ValidationResult,\n type ValidationWarning,\n compositionToRender,\n CompositionValidationError,\n createCompositionParser,\n createCompositionValidator,\n warningsForSurface,\n} from './validation';\nexport {\n displayValueSchema,\n namedColorSchema,\n renderThemeSchema,\n structuredValueSchema,\n} from './value_schemas';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validate/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAEL,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,kCAAkC,EAClC,sBAAsB,EACtB,qCAAqC,EACrC,kCAAkC,EAClC,UAAU,GACX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAGL,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAEL,0BAA0B,GAC3B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAkB,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EAEL,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,uBAAuB,EACvB,oBAAoB,EACpB,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,OAAO,CAAC;AACf,OAAO,EAQL,mBAAmB,EACnB,0BAA0B,EAC1B,uBAAuB,EACvB,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nexport {\n type AuthoringJsonSchemaOptions,\n authoringBodySchema,\n authoringSchemaSubset,\n buildAuthoringJsonSchema,\n} from './authoring_schema';\nexport {\n type CompositionSchemaOptions,\n buildBodyNodeSchemaFromDefinitions,\n buildCompositionSchema,\n buildCompositionSchemaFromDefinitions,\n getCompositionSchemaForDefinitions,\n metaSchema,\n} from './composition_schema';\nexport {\n type InputBudget,\n type InputBudgetCheck,\n MAX_INPUT_CHARACTERS,\n MAX_INPUT_DEPTH,\n MAX_INPUT_VALUES,\n checkInputBudget,\n isInputRefusal,\n} from './input_budget';\nexport {\n type CompositionJsonSchemaOptions,\n buildCompositionJsonSchema,\n} from './json_schema';\nexport { type IssueRoot, createNodeIssueFormatter } from './node_issues';\nexport {\n type UrlSchemaOptions,\n ASSET_URL_MESSAGE,\n ASSET_URL_RULE,\n BLOCKED_HREF,\n NAVIGATION_HREF_MESSAGE,\n NAVIGATION_HREF_RULE,\n assetUrl,\n navigationHref,\n sanitizeAssetUrl,\n sanitizeNavigationHref,\n sanitizeParsedAssetUrl,\n sanitizeParsedNavigationHref,\n} from './url';\nexport {\n type CheckedComposition,\n type CheckedValidationResult,\n type CompositionValidatorOptions,\n type ParsedComposition,\n type ValidationErrorMode,\n type ValidationResult,\n type ValidationWarning,\n compositionToRender,\n CompositionValidationError,\n createCompositionParser,\n createCompositionValidator,\n warningsForSurface,\n} from './validation';\nexport {\n displayValueSchema,\n namedColorSchema,\n renderThemeSchema,\n structuredValueSchema,\n} from './value_schemas';\n"]}
|