@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,248 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
|
4
|
+
* or more contributor license agreements. Licensed under the Elastic License
|
|
5
|
+
* 2.0; you may not use this file except in compliance with the Elastic License
|
|
6
|
+
* 2.0.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.assertPackIconsValid = void 0;
|
|
10
|
+
// Hosts insert an icon's `svg` as markup, so every rule here is an allowlist.
|
|
11
|
+
const primitive_pack_1 = require("../pack/primitive_pack");
|
|
12
|
+
// HTML's markup whitespace, never `\s`: a parser reads NBSP and other Unicode separators as part of a name or as text.
|
|
13
|
+
const NUMBER = /^[-+0-9.eE,\t\n\f\r ]*$/;
|
|
14
|
+
const PATH_DATA = /^[-+0-9.eE,\t\n\f\r MmLlHhVvCcSsQqTtAaZz]*$/;
|
|
15
|
+
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 ]*$/;
|
|
16
|
+
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}))?\))$/;
|
|
17
|
+
const PAINT_RULE = 'is not none, currentColor, or var(--isomer-icon-*)';
|
|
18
|
+
const NAME = /[A-Za-z][\w:.-]*/y;
|
|
19
|
+
const ATTRIBUTE_NAME = /[^\t\n\f\r "'<>/=]+/y;
|
|
20
|
+
const WHITESPACE = /[\t\n\f\r ]*/y;
|
|
21
|
+
const BLANK = /^[\t\n\f\r ]*$/;
|
|
22
|
+
const NAME_END = /[\t\n\f\r />]/;
|
|
23
|
+
const trimMarkup = (text) => text.replace(/^[\t\n\f\r ]+|[\t\n\f\r ]+$/g, '');
|
|
24
|
+
const isNumber = (value) => NUMBER.test(value);
|
|
25
|
+
const keyword = (...words) => (value) => words.includes(value);
|
|
26
|
+
const ATTRIBUTE_RULES = new Map([
|
|
27
|
+
['clip-rule', keyword('nonzero', 'evenodd')],
|
|
28
|
+
['cx', isNumber],
|
|
29
|
+
['cy', isNumber],
|
|
30
|
+
['d', (value) => PATH_DATA.test(value)],
|
|
31
|
+
['fill', (value) => PAINT.test(value)],
|
|
32
|
+
['fill-opacity', isNumber],
|
|
33
|
+
['fill-rule', keyword('nonzero', 'evenodd')],
|
|
34
|
+
['height', isNumber],
|
|
35
|
+
['opacity', isNumber],
|
|
36
|
+
['points', isNumber],
|
|
37
|
+
['r', isNumber],
|
|
38
|
+
['rx', isNumber],
|
|
39
|
+
['ry', isNumber],
|
|
40
|
+
['stroke', (value) => PAINT.test(value)],
|
|
41
|
+
['stroke-linecap', keyword('butt', 'round', 'square')],
|
|
42
|
+
['stroke-linejoin', keyword('miter', 'round', 'bevel')],
|
|
43
|
+
['stroke-opacity', isNumber],
|
|
44
|
+
['stroke-width', isNumber],
|
|
45
|
+
['transform', (value) => TRANSFORM.test(value)],
|
|
46
|
+
['viewBox', keyword('0 0 16 16')],
|
|
47
|
+
['width', isNumber],
|
|
48
|
+
['x', isNumber],
|
|
49
|
+
['x1', isNumber],
|
|
50
|
+
['x2', isNumber],
|
|
51
|
+
['xmlns', keyword('http://www.w3.org/2000/svg')],
|
|
52
|
+
['y', isNumber],
|
|
53
|
+
['y1', isNumber],
|
|
54
|
+
['y2', isNumber],
|
|
55
|
+
]);
|
|
56
|
+
const PRESENTATION = [
|
|
57
|
+
'clip-rule',
|
|
58
|
+
'fill',
|
|
59
|
+
'fill-opacity',
|
|
60
|
+
'fill-rule',
|
|
61
|
+
'opacity',
|
|
62
|
+
'stroke',
|
|
63
|
+
'stroke-linecap',
|
|
64
|
+
'stroke-linejoin',
|
|
65
|
+
'stroke-opacity',
|
|
66
|
+
'stroke-width',
|
|
67
|
+
'transform',
|
|
68
|
+
];
|
|
69
|
+
const ELEMENT_ATTRIBUTES = new Map([
|
|
70
|
+
['svg', new Set(['viewBox', 'xmlns', ...PRESENTATION])],
|
|
71
|
+
['g', new Set(PRESENTATION)],
|
|
72
|
+
['path', new Set(['d', ...PRESENTATION])],
|
|
73
|
+
['rect', new Set(['x', 'y', 'width', 'height', 'rx', 'ry', ...PRESENTATION])],
|
|
74
|
+
['circle', new Set(['cx', 'cy', 'r', ...PRESENTATION])],
|
|
75
|
+
['ellipse', new Set(['cx', 'cy', 'rx', 'ry', ...PRESENTATION])],
|
|
76
|
+
['line', new Set(['x1', 'y1', 'x2', 'y2', ...PRESENTATION])],
|
|
77
|
+
['polyline', new Set(['points', ...PRESENTATION])],
|
|
78
|
+
['polygon', new Set(['points', ...PRESENTATION])],
|
|
79
|
+
]);
|
|
80
|
+
/** Every way `svg` breaks the icon rules, as one line each; empty when it passes. */
|
|
81
|
+
const iconProblems = (svg) => {
|
|
82
|
+
const problems = [];
|
|
83
|
+
const open = [];
|
|
84
|
+
let roots = 0;
|
|
85
|
+
let index = 0;
|
|
86
|
+
const match = (pattern) => {
|
|
87
|
+
pattern.lastIndex = index;
|
|
88
|
+
const found = pattern.exec(svg)?.[0] ?? '';
|
|
89
|
+
index += found.length;
|
|
90
|
+
return found;
|
|
91
|
+
};
|
|
92
|
+
const checkAttributes = (element, attributes) => {
|
|
93
|
+
const allowed = ELEMENT_ATTRIBUTES.get(element);
|
|
94
|
+
if (!allowed) {
|
|
95
|
+
problems.push(`<${element}> is not an allowed element`);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
for (const [name, value] of attributes) {
|
|
99
|
+
if (!allowed.has(name)) {
|
|
100
|
+
problems.push(`${name} is not an allowed attribute on <${element}>`);
|
|
101
|
+
}
|
|
102
|
+
else if (value.includes('&')) {
|
|
103
|
+
problems.push(`${name}="${value}" contains an entity`);
|
|
104
|
+
}
|
|
105
|
+
else if (!ATTRIBUTE_RULES.get(name)(value)) {
|
|
106
|
+
problems.push(name === 'fill' || name === 'stroke'
|
|
107
|
+
? `${name}="${value}" ${PAINT_RULE}`
|
|
108
|
+
: `${name}="${value}" is not an allowed value`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
while (index < svg.length) {
|
|
113
|
+
if (svg[index] !== '<') {
|
|
114
|
+
const end = svg.indexOf('<', index);
|
|
115
|
+
const text = svg.slice(index, end === -1 ? undefined : end);
|
|
116
|
+
if (!BLANK.test(text)) {
|
|
117
|
+
problems.push(open.length > 0
|
|
118
|
+
? `text content "${trimMarkup(text)}" is not allowed`
|
|
119
|
+
: `unexpected "${trimMarkup(text)}" outside <svg>`);
|
|
120
|
+
return problems;
|
|
121
|
+
}
|
|
122
|
+
index += text.length;
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (svg.startsWith('<!', index) || svg.startsWith('<?', index)) {
|
|
126
|
+
problems.push('comments, declarations, and CDATA are not allowed');
|
|
127
|
+
return problems;
|
|
128
|
+
}
|
|
129
|
+
if (svg.startsWith('</', index)) {
|
|
130
|
+
index += 2;
|
|
131
|
+
const name = match(NAME);
|
|
132
|
+
match(WHITESPACE);
|
|
133
|
+
if (name === '' || svg[index] !== '>') {
|
|
134
|
+
problems.push('malformed closing tag');
|
|
135
|
+
return problems;
|
|
136
|
+
}
|
|
137
|
+
index += 1;
|
|
138
|
+
const expected = open.pop();
|
|
139
|
+
if (expected === undefined) {
|
|
140
|
+
problems.push(`</${name}> closes nothing`);
|
|
141
|
+
return problems;
|
|
142
|
+
}
|
|
143
|
+
if (expected !== name) {
|
|
144
|
+
problems.push(`</${name}> does not close <${expected}>`);
|
|
145
|
+
return problems;
|
|
146
|
+
}
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
index += 1;
|
|
150
|
+
const element = match(NAME);
|
|
151
|
+
if (element === '' || !NAME_END.test(svg[index] ?? '>')) {
|
|
152
|
+
problems.push('malformed opening tag');
|
|
153
|
+
return problems;
|
|
154
|
+
}
|
|
155
|
+
if (open.length === 0) {
|
|
156
|
+
roots += 1;
|
|
157
|
+
if (roots > 1) {
|
|
158
|
+
problems.push('more than one root element');
|
|
159
|
+
return problems;
|
|
160
|
+
}
|
|
161
|
+
if (element !== 'svg') {
|
|
162
|
+
problems.push(`root is <${element}>, not <svg>`);
|
|
163
|
+
return problems;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
const attributes = new Map();
|
|
167
|
+
let selfClosing = false;
|
|
168
|
+
for (;;) {
|
|
169
|
+
match(WHITESPACE);
|
|
170
|
+
if (svg.startsWith('/>', index)) {
|
|
171
|
+
index += 2;
|
|
172
|
+
selfClosing = true;
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
if (svg[index] === '>') {
|
|
176
|
+
index += 1;
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
const name = match(ATTRIBUTE_NAME);
|
|
180
|
+
if (name === '') {
|
|
181
|
+
problems.push(`<${element}> is not terminated`);
|
|
182
|
+
return problems;
|
|
183
|
+
}
|
|
184
|
+
match(WHITESPACE);
|
|
185
|
+
if (svg[index] !== '=') {
|
|
186
|
+
problems.push(`${name} on <${element}> has no value`);
|
|
187
|
+
return problems;
|
|
188
|
+
}
|
|
189
|
+
index += 1;
|
|
190
|
+
match(WHITESPACE);
|
|
191
|
+
const quote = svg[index];
|
|
192
|
+
if (quote !== '"' && quote !== "'") {
|
|
193
|
+
problems.push(`${name} on <${element}> is unquoted`);
|
|
194
|
+
return problems;
|
|
195
|
+
}
|
|
196
|
+
const close = svg.indexOf(quote, index + 1);
|
|
197
|
+
if (close === -1) {
|
|
198
|
+
problems.push(`${name} on <${element}> is unterminated`);
|
|
199
|
+
return problems;
|
|
200
|
+
}
|
|
201
|
+
const value = svg.slice(index + 1, close);
|
|
202
|
+
index = close + 1;
|
|
203
|
+
if (value.includes('<')) {
|
|
204
|
+
problems.push(`${name} on <${element}> contains "<"`);
|
|
205
|
+
return problems;
|
|
206
|
+
}
|
|
207
|
+
if (attributes.has(name)) {
|
|
208
|
+
problems.push(`<${element}> repeats ${name}`);
|
|
209
|
+
return problems;
|
|
210
|
+
}
|
|
211
|
+
attributes.set(name, value);
|
|
212
|
+
}
|
|
213
|
+
checkAttributes(element, attributes);
|
|
214
|
+
if (open.length === 0 && !attributes.has('viewBox')) {
|
|
215
|
+
problems.push('<svg> has no viewBox="0 0 16 16"');
|
|
216
|
+
}
|
|
217
|
+
if (!selfClosing) {
|
|
218
|
+
open.push(element);
|
|
219
|
+
}
|
|
220
|
+
else if (open.length === 0) {
|
|
221
|
+
problems.push('<svg> is empty');
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (roots === 0) {
|
|
225
|
+
problems.push('has no <svg> root');
|
|
226
|
+
}
|
|
227
|
+
for (const element of open.reverse()) {
|
|
228
|
+
problems.push(`<${element}> is not closed`);
|
|
229
|
+
}
|
|
230
|
+
return problems;
|
|
231
|
+
};
|
|
232
|
+
/**
|
|
233
|
+
* 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.
|
|
234
|
+
*
|
|
235
|
+
* @example
|
|
236
|
+
* ```ts
|
|
237
|
+
* assertPackIconsValid(slidesPack);
|
|
238
|
+
* ```
|
|
239
|
+
*/
|
|
240
|
+
const assertPackIconsValid = ({ icons, primitives, }) => {
|
|
241
|
+
const byType = icons ?? (0, primitive_pack_1.iconsByType)(primitives);
|
|
242
|
+
const problems = Object.keys(byType).flatMap((type) => iconProblems(byType[type].svg).map((problem) => `${type} icon: ${problem}`));
|
|
243
|
+
if (problems.length > 0) {
|
|
244
|
+
throw new Error(`Pack icons break the icon rules:\n${problems.map((line) => `- ${line}`).join('\n')}`);
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
exports.assertPackIconsValid = assertPackIconsValid;
|
|
248
|
+
//# 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"]}
|
|
@@ -6,11 +6,13 @@
|
|
|
6
6
|
* 2.0.
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.assertPackRegistrationComplete = exports.runPrimitiveInventoryConformance = exports.primitiveConformanceRows = exports.CONFORMANCE_FOREIGN_MARKER = void 0;
|
|
9
|
+
exports.assertPackRegistrationComplete = exports.assertPackIconsValid = exports.runPrimitiveInventoryConformance = exports.primitiveConformanceRows = exports.CONFORMANCE_FOREIGN_MARKER = void 0;
|
|
10
10
|
var conformance_1 = require("./conformance");
|
|
11
11
|
Object.defineProperty(exports, "CONFORMANCE_FOREIGN_MARKER", { enumerable: true, get: function () { return conformance_1.CONFORMANCE_FOREIGN_MARKER; } });
|
|
12
12
|
Object.defineProperty(exports, "primitiveConformanceRows", { enumerable: true, get: function () { return conformance_1.primitiveConformanceRows; } });
|
|
13
13
|
Object.defineProperty(exports, "runPrimitiveInventoryConformance", { enumerable: true, get: function () { return conformance_1.runPrimitiveInventoryConformance; } });
|
|
14
|
+
var icon_1 = require("./icon");
|
|
15
|
+
Object.defineProperty(exports, "assertPackIconsValid", { enumerable: true, get: function () { return icon_1.assertPackIconsValid; } });
|
|
14
16
|
var registration_1 = require("./registration");
|
|
15
17
|
Object.defineProperty(exports, "assertPackRegistrationComplete", { enumerable: true, get: function () { return registration_1.assertPackRegistrationComplete; } });
|
|
16
18
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,6CAUuB;AAHrB,yHAAA,0BAA0B,OAAA;AAC1B,uHAAA,wBAAwB,OAAA;AACxB,+HAAA,gCAAgC,OAAA;AAElC,+CAGwB;AADtB,8HAAA,8BAA8B,OAAA","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,6CAUuB;AAHrB,yHAAA,0BAA0B,OAAA;AAC1B,uHAAA,wBAAwB,OAAA;AACxB,+HAAA,gCAAgC,OAAA;AAElC,+BAA8C;AAArC,4GAAA,oBAAoB,OAAA;AAC7B,+CAGwB;AADtB,8HAAA,8BAA8B,OAAA","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"]}
|
|
@@ -74,6 +74,8 @@ const entryFileIn = (dir) => {
|
|
|
74
74
|
}
|
|
75
75
|
return undefined;
|
|
76
76
|
};
|
|
77
|
+
// The CommonJS build compiles `import()` to `require()`, which rejects `file:` URLs.
|
|
78
|
+
const loadEntry = async (entry) => (await Promise.resolve(`${typeof require === 'function' ? entry : (0, node_url_1.pathToFileURL)(entry).href}`).then(s => __importStar(require(s))));
|
|
77
79
|
const subdirectoriesOf = (root, ignore) => (0, node_fs_1.readdirSync)(root, { withFileTypes: true })
|
|
78
80
|
.filter((entry) => entry.isDirectory() && !ignore.includes(entry.name))
|
|
79
81
|
.map((entry) => entry.name)
|
|
@@ -99,9 +101,9 @@ const subdirectoriesOf = (root, ignore) => (0, node_fs_1.readdirSync)(root, { wi
|
|
|
99
101
|
* ```
|
|
100
102
|
*/
|
|
101
103
|
const assertPackRegistrationComplete = async ({ primitivesDir, registered, ignore = [], }) => {
|
|
102
|
-
const root = typeof primitivesDir === 'string'
|
|
104
|
+
const root = (0, node_path_1.resolve)(typeof primitivesDir === 'string'
|
|
103
105
|
? primitivesDir
|
|
104
|
-
: (0, node_url_1.fileURLToPath)(primitivesDir);
|
|
106
|
+
: (0, node_url_1.fileURLToPath)(primitivesDir));
|
|
105
107
|
const registeredTypes = new Set(registered.map(({ type }) => type));
|
|
106
108
|
const problems = [];
|
|
107
109
|
const foundTypes = new Set();
|
|
@@ -111,7 +113,7 @@ const assertPackRegistrationComplete = async ({ primitivesDir, registered, ignor
|
|
|
111
113
|
problems.push(`${folder}/ has no ${ENTRY_FILES.join(' or ')}; add one or pass it in \`ignore\`.`);
|
|
112
114
|
continue;
|
|
113
115
|
}
|
|
114
|
-
const module =
|
|
116
|
+
const module = await loadEntry(entry);
|
|
115
117
|
const exported = Object.entries(module).filter(([, value]) => isPrimitiveDefinition(value));
|
|
116
118
|
if (exported.length === 0) {
|
|
117
119
|
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,qCAAgD;AAChD,
|
|
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"]}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* 2.0.
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.authoringSchemaSubset = exports.buildAuthoringJsonSchema = void 0;
|
|
9
|
+
exports.authoringBodySchema = exports.authoringSchemaSubset = exports.buildAuthoringJsonSchema = void 0;
|
|
10
10
|
const json_schema_1 = require("./json_schema");
|
|
11
11
|
const value_schemas_1 = require("./value_schemas");
|
|
12
12
|
const DEF_PREFIX = '#/$defs/';
|
|
@@ -293,4 +293,20 @@ const authoringSchemaSubset = (schema, types) => {
|
|
|
293
293
|
return { $defs: Object.fromEntries(kept) };
|
|
294
294
|
};
|
|
295
295
|
exports.authoringSchemaSubset = authoringSchemaSubset;
|
|
296
|
+
/**
|
|
297
|
+
* The `body` of a schema from {@link buildAuthoringJsonSchema} as a schema of
|
|
298
|
+
* its own, for an editor that validates body nodes rather than a whole
|
|
299
|
+
* composition. Carries the `$defs` the body reaches.
|
|
300
|
+
*/
|
|
301
|
+
const authoringBodySchema = (schema) => {
|
|
302
|
+
const { properties, $schema } = schema;
|
|
303
|
+
const body = isJsonObject(properties) ? properties.body : undefined;
|
|
304
|
+
return pruneUnreferencedDefs({
|
|
305
|
+
...(typeof $schema === 'string' ? { $schema } : {}),
|
|
306
|
+
title: 'Body',
|
|
307
|
+
...(isJsonObject(body) ? body : { type: 'array' }),
|
|
308
|
+
$defs: defsOf(schema),
|
|
309
|
+
});
|
|
310
|
+
};
|
|
311
|
+
exports.authoringBodySchema = authoringBodySchema;
|
|
296
312
|
//# 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"]}
|
|
@@ -6,8 +6,9 @@
|
|
|
6
6
|
* 2.0.
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.structuredValueSchema = exports.renderThemeSchema = exports.namedColorSchema = exports.displayValueSchema = exports.warningsForSurface = exports.createCompositionValidator = exports.createCompositionParser = exports.CompositionValidationError = exports.compositionToRender = exports.sanitizeParsedNavigationHref = exports.sanitizeParsedAssetUrl = exports.sanitizeNavigationHref = exports.sanitizeAssetUrl = exports.navigationHref = exports.assetUrl = exports.NAVIGATION_HREF_RULE = exports.NAVIGATION_HREF_MESSAGE = exports.BLOCKED_HREF = exports.ASSET_URL_RULE = exports.ASSET_URL_MESSAGE = exports.createNodeIssueFormatter = exports.buildCompositionJsonSchema = exports.isInputRefusal = exports.checkInputBudget = exports.MAX_INPUT_VALUES = exports.MAX_INPUT_DEPTH = exports.MAX_INPUT_CHARACTERS = exports.metaSchema = exports.getCompositionSchemaForDefinitions = exports.buildCompositionSchemaFromDefinitions = exports.buildCompositionSchema = exports.buildBodyNodeSchemaFromDefinitions = exports.buildAuthoringJsonSchema = exports.authoringSchemaSubset = void 0;
|
|
9
|
+
exports.structuredValueSchema = exports.renderThemeSchema = exports.namedColorSchema = exports.displayValueSchema = exports.warningsForSurface = exports.createCompositionValidator = exports.createCompositionParser = exports.CompositionValidationError = exports.compositionToRender = exports.sanitizeParsedNavigationHref = exports.sanitizeParsedAssetUrl = exports.sanitizeNavigationHref = exports.sanitizeAssetUrl = exports.navigationHref = exports.assetUrl = exports.NAVIGATION_HREF_RULE = exports.NAVIGATION_HREF_MESSAGE = exports.BLOCKED_HREF = exports.ASSET_URL_RULE = exports.ASSET_URL_MESSAGE = exports.createNodeIssueFormatter = exports.buildCompositionJsonSchema = exports.isInputRefusal = exports.checkInputBudget = exports.MAX_INPUT_VALUES = exports.MAX_INPUT_DEPTH = exports.MAX_INPUT_CHARACTERS = exports.metaSchema = exports.getCompositionSchemaForDefinitions = exports.buildCompositionSchemaFromDefinitions = exports.buildCompositionSchema = exports.buildBodyNodeSchemaFromDefinitions = exports.buildAuthoringJsonSchema = exports.authoringSchemaSubset = exports.authoringBodySchema = void 0;
|
|
10
10
|
var authoring_schema_1 = require("./authoring_schema");
|
|
11
|
+
Object.defineProperty(exports, "authoringBodySchema", { enumerable: true, get: function () { return authoring_schema_1.authoringBodySchema; } });
|
|
11
12
|
Object.defineProperty(exports, "authoringSchemaSubset", { enumerable: true, get: function () { return authoring_schema_1.authoringSchemaSubset; } });
|
|
12
13
|
Object.defineProperty(exports, "buildAuthoringJsonSchema", { enumerable: true, get: function () { return authoring_schema_1.buildAuthoringJsonSchema; } });
|
|
13
14
|
var composition_schema_1 = require("./composition_schema");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/validate/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/validate/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,uDAK4B;AAH1B,uHAAA,mBAAmB,OAAA;AACnB,yHAAA,qBAAqB,OAAA;AACrB,4HAAA,wBAAwB,OAAA;AAE1B,2DAO8B;AAL5B,wIAAA,kCAAkC,OAAA;AAClC,4HAAA,sBAAsB,OAAA;AACtB,2IAAA,qCAAqC,OAAA;AACrC,wIAAA,kCAAkC,OAAA;AAClC,gHAAA,UAAU,OAAA;AAEZ,+CAQwB;AALtB,oHAAA,oBAAoB,OAAA;AACpB,+GAAA,eAAe,OAAA;AACf,gHAAA,gBAAgB,OAAA;AAChB,gHAAA,gBAAgB,OAAA;AAChB,8GAAA,cAAc,OAAA;AAEhB,6CAGuB;AADrB,yHAAA,0BAA0B,OAAA;AAE5B,6CAAyE;AAAhD,uHAAA,wBAAwB,OAAA;AACjD,6BAae;AAXb,wGAAA,iBAAiB,OAAA;AACjB,qGAAA,cAAc,OAAA;AACd,mGAAA,YAAY,OAAA;AACZ,8GAAA,uBAAuB,OAAA;AACvB,2GAAA,oBAAoB,OAAA;AACpB,+FAAA,QAAQ,OAAA;AACR,qGAAA,cAAc,OAAA;AACd,uGAAA,gBAAgB,OAAA;AAChB,6GAAA,sBAAsB,OAAA;AACtB,6GAAA,sBAAsB,OAAA;AACtB,mHAAA,4BAA4B,OAAA;AAE9B,2CAasB;AALpB,iHAAA,mBAAmB,OAAA;AACnB,wHAAA,0BAA0B,OAAA;AAC1B,qHAAA,uBAAuB,OAAA;AACvB,wHAAA,0BAA0B,OAAA;AAC1B,gHAAA,kBAAkB,OAAA;AAEpB,iDAKyB;AAJvB,mHAAA,kBAAkB,OAAA;AAClB,iHAAA,gBAAgB,OAAA;AAChB,kHAAA,iBAAiB,OAAA;AACjB,sHAAA,qBAAqB,OAAA","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"]}
|