@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
package/dist/author/jsx_shim.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import { Children, Fragment, isValidElement, } from 'react';
|
|
8
8
|
import { IsomerError } from '../composition/error.js';
|
|
9
9
|
import { readAuthoredSpec, } from './authored_fields.js';
|
|
10
|
+
import { capitalize, createAuthoringModel, } from './authoring_model.js';
|
|
10
11
|
import { authorType, defineAuthorComponent } from './jsx.js';
|
|
11
12
|
/**
|
|
12
13
|
* Builds a pack's {@link JsxShim} from its primitive list.
|
|
@@ -18,15 +19,8 @@ import { authorType, defineAuthorComponent } from './jsx.js';
|
|
|
18
19
|
*/
|
|
19
20
|
export const buildJsxShim = (primitives = []) => {
|
|
20
21
|
const primitiveTypes = new Set(primitives.map((primitive) => primitive.type));
|
|
21
|
-
const childSlotsByType =
|
|
22
|
-
|
|
23
|
-
inferChildSlots('children' in primitive ? primitive.children : undefined),
|
|
24
|
-
]));
|
|
25
|
-
const { authoredByType, childComponents } = collectAuthored(primitives);
|
|
26
|
-
assertUniqueComponentNames([
|
|
27
|
-
...primitives.map(({ type }) => type),
|
|
28
|
-
...childComponents.keys(),
|
|
29
|
-
]);
|
|
22
|
+
const { authoredByType, children, childSlotsByType } = createAuthoringModel(primitives);
|
|
23
|
+
const childComponents = new Map([...children.keys()].map((type) => [type, defineAuthorComponent(type)]));
|
|
30
24
|
const view = defineAuthorComponent('view');
|
|
31
25
|
const env = {
|
|
32
26
|
authoredByType,
|
|
@@ -46,46 +40,6 @@ export const buildJsxShim = (primitives = []) => {
|
|
|
46
40
|
])),
|
|
47
41
|
};
|
|
48
42
|
};
|
|
49
|
-
const collectAuthored = (primitives) => {
|
|
50
|
-
const authoredByType = new Map();
|
|
51
|
-
const signatures = new Map();
|
|
52
|
-
const childComponents = new Map();
|
|
53
|
-
for (const primitive of primitives) {
|
|
54
|
-
const schema = primitive.schema;
|
|
55
|
-
if (!isZodType(schema)) {
|
|
56
|
-
continue;
|
|
57
|
-
}
|
|
58
|
-
const spec = readAuthoredSpec(schema);
|
|
59
|
-
if (spec.children.length === 0 && spec.text.length === 0) {
|
|
60
|
-
continue;
|
|
61
|
-
}
|
|
62
|
-
authoredByType.set(primitive.type, spec);
|
|
63
|
-
for (const field of spec.children) {
|
|
64
|
-
const prior = signatures.get(field.childType);
|
|
65
|
-
if (prior !== undefined && prior !== field.signature) {
|
|
66
|
-
throw new IsomerError('DUPLICATE_AUTHORED_CHILD', `Child type "${field.childType}" is branded with two different item shapes.`);
|
|
67
|
-
}
|
|
68
|
-
signatures.set(field.childType, field.signature);
|
|
69
|
-
if (!childComponents.has(field.childType)) {
|
|
70
|
-
childComponents.set(field.childType, defineAuthorComponent(field.childType));
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
return { authoredByType, childComponents };
|
|
75
|
-
};
|
|
76
|
-
/** Throws when two types, or a type and the root `Composition`, capitalize to one component name. */
|
|
77
|
-
const assertUniqueComponentNames = (types) => {
|
|
78
|
-
const typeByName = new Map([['Composition', 'view']]);
|
|
79
|
-
for (const type of types) {
|
|
80
|
-
const name = capitalize(type);
|
|
81
|
-
const earlier = typeByName.get(name);
|
|
82
|
-
if (earlier !== undefined && earlier !== type) {
|
|
83
|
-
throw new IsomerError('DUPLICATE_PRIMITIVE_TYPE', `buildJsxShim: "${earlier}" and "${type}" both become the component ${name}`);
|
|
84
|
-
}
|
|
85
|
-
typeByName.set(name, type);
|
|
86
|
-
}
|
|
87
|
-
};
|
|
88
|
-
const isZodType = (schema) => typeof schema === 'object' && schema !== null && '_zod' in schema;
|
|
89
43
|
const toAuthorComposition = (element, env) => {
|
|
90
44
|
requireAuthorElement(element, 'view');
|
|
91
45
|
const props = element.props;
|
|
@@ -151,7 +105,7 @@ const fillAuthoredFields = (converted, authored, rawChildren, env) => {
|
|
|
151
105
|
if (converted[field.field] !== undefined || rawChildren === undefined) {
|
|
152
106
|
continue;
|
|
153
107
|
}
|
|
154
|
-
converted[field.field] =
|
|
108
|
+
converted[field.field] = valueFromBrand(flattenChildren(rawChildren), field, env);
|
|
155
109
|
}
|
|
156
110
|
for (const field of authored.text) {
|
|
157
111
|
if (converted[field.field] !== undefined) {
|
|
@@ -170,7 +124,7 @@ const fillAuthoredFields = (converted, authored, rawChildren, env) => {
|
|
|
170
124
|
};
|
|
171
125
|
const valueFromChildField = (value, field, env) => {
|
|
172
126
|
if (isJsxNodes(value)) {
|
|
173
|
-
return
|
|
127
|
+
return valueFromBrand(flattenChildren(value), field, env);
|
|
174
128
|
}
|
|
175
129
|
return value;
|
|
176
130
|
};
|
|
@@ -184,7 +138,17 @@ const isJsxNodes = (value) => {
|
|
|
184
138
|
return (Array.isArray(value) &&
|
|
185
139
|
value.some((item) => isAuthorElement(item) || isValidElement(item)));
|
|
186
140
|
};
|
|
187
|
-
|
|
141
|
+
/** The field's array of items, or its one item; throws on a second element for a single-item field. */
|
|
142
|
+
const valueFromBrand = (elements, field, env) => {
|
|
143
|
+
const items = elements.map((child) => itemFromElement(child, field, env));
|
|
144
|
+
if (field.array) {
|
|
145
|
+
return items;
|
|
146
|
+
}
|
|
147
|
+
if (items.length > 1) {
|
|
148
|
+
throw new IsomerError('UNEXPECTED_CHILDREN', `"${field.field}" takes one <${capitalize(field.childType)}>, not ${items.length}.`);
|
|
149
|
+
}
|
|
150
|
+
return items[0];
|
|
151
|
+
};
|
|
188
152
|
const itemFromElement = (child, field, env) => {
|
|
189
153
|
const element = requireAuthorElement(child, field.childType);
|
|
190
154
|
if (field.toItem) {
|
|
@@ -193,33 +157,31 @@ const itemFromElement = (child, field, env) => {
|
|
|
193
157
|
});
|
|
194
158
|
}
|
|
195
159
|
const props = withoutChildren(element);
|
|
196
|
-
const
|
|
160
|
+
const nested = flattenChildren(element.props.children);
|
|
161
|
+
const elements = nested.filter(isAuthorElement);
|
|
162
|
+
const text = nested.filter((child) => !isAuthorElement(child));
|
|
197
163
|
if (field.textField !== undefined &&
|
|
198
164
|
props[field.textField] === undefined &&
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
props[field.textField] = textFromChildren(nestedChildren);
|
|
165
|
+
text.length > 0) {
|
|
166
|
+
props[field.textField] = textFromChildren(text);
|
|
202
167
|
}
|
|
203
|
-
fillNestedBrands(field.itemSchema, props,
|
|
168
|
+
fillNestedBrands(field.itemSchema, props, elements, env);
|
|
204
169
|
return props;
|
|
205
170
|
};
|
|
206
|
-
const fillNestedBrands = (itemSchema, props,
|
|
207
|
-
if (
|
|
171
|
+
const fillNestedBrands = (itemSchema, props, elements, env) => {
|
|
172
|
+
if (elements.length === 0) {
|
|
208
173
|
return;
|
|
209
174
|
}
|
|
210
|
-
const
|
|
211
|
-
for (const field of spec.children) {
|
|
175
|
+
for (const field of readAuthoredSpec(itemSchema).children) {
|
|
212
176
|
if (props[field.field] !== undefined) {
|
|
213
177
|
continue;
|
|
214
178
|
}
|
|
215
|
-
const matching =
|
|
216
|
-
if (matching.length
|
|
217
|
-
|
|
179
|
+
const matching = elements.filter((child) => getAuthorType(child) === field.childType);
|
|
180
|
+
if (matching.length > 0) {
|
|
181
|
+
props[field.field] = valueFromBrand(matching, field, env);
|
|
218
182
|
}
|
|
219
|
-
props[field.field] = matching.map((child) => itemFromElement(child, field, env));
|
|
220
183
|
}
|
|
221
184
|
};
|
|
222
|
-
const hasAuthorElement = (children) => flattenChildren(children).some((child) => isAuthorElement(child));
|
|
223
185
|
const convertPropValue = (value, field, slots, parseChild) => {
|
|
224
186
|
const asArray = slots.some((slot) => slot.field === field && slot.array);
|
|
225
187
|
const fromJsx = nodesFromJsx(value, parseChild);
|
|
@@ -250,51 +212,6 @@ const isAuthorElement = (value) => {
|
|
|
250
212
|
const component = value.type;
|
|
251
213
|
return typeof component[authorType] === 'string';
|
|
252
214
|
};
|
|
253
|
-
/**
|
|
254
|
-
* Reads {@link PrimitiveDefinition.children} against a probe node so JSX can
|
|
255
|
-
* fill the same fields a tree walk would visit. Paths like `body[0]` are array
|
|
256
|
-
* slots; a bare `header` is a single nested node.
|
|
257
|
-
*/
|
|
258
|
-
const inferChildSlots = (children) => {
|
|
259
|
-
if (typeof children !== 'function') {
|
|
260
|
-
return [];
|
|
261
|
-
}
|
|
262
|
-
const probeNode = { type: '__probe__' };
|
|
263
|
-
const node = new Proxy({}, {
|
|
264
|
-
get(_target, prop) {
|
|
265
|
-
if (prop === 'type') {
|
|
266
|
-
return probeNode.type;
|
|
267
|
-
}
|
|
268
|
-
return [probeNode];
|
|
269
|
-
},
|
|
270
|
-
});
|
|
271
|
-
try {
|
|
272
|
-
const refs = children(node);
|
|
273
|
-
if (!Array.isArray(refs)) {
|
|
274
|
-
return [];
|
|
275
|
-
}
|
|
276
|
-
const byField = new Map();
|
|
277
|
-
for (const ref of refs) {
|
|
278
|
-
if (!isChildRef(ref)) {
|
|
279
|
-
continue;
|
|
280
|
-
}
|
|
281
|
-
const field = /^[A-Za-z_]\w*/.exec(ref.path)?.[0];
|
|
282
|
-
if (!field) {
|
|
283
|
-
continue;
|
|
284
|
-
}
|
|
285
|
-
byField.set(field, byField.get(field) === true || /\[\d+\]/.test(ref.path));
|
|
286
|
-
}
|
|
287
|
-
return [...byField.entries()].map(([field, array]) => ({ array, field }));
|
|
288
|
-
}
|
|
289
|
-
catch {
|
|
290
|
-
return [];
|
|
291
|
-
}
|
|
292
|
-
};
|
|
293
|
-
const isChildRef = (value) => typeof value === 'object' &&
|
|
294
|
-
value !== null &&
|
|
295
|
-
'path' in value &&
|
|
296
|
-
typeof value.path === 'string';
|
|
297
|
-
const capitalize = (value) => `${value.slice(0, 1).toUpperCase()}${value.slice(1)}`;
|
|
298
215
|
/** React children as a flat array, with fragments inlined. */
|
|
299
216
|
export const flattenChildren = (children) => Children.toArray(children).flatMap((child) => {
|
|
300
217
|
if (isValidElement(child) && child.type === Fragment) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx_shim.js","sourceRoot":"","sources":["../../src/author/jsx_shim.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 {\n Children,\n Fragment,\n isValidElement,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport type { z, ZodObject, ZodType } from 'zod';\n\nimport type { Composition } from '../composition/composition';\nimport { IsomerError } from '../composition/error';\nimport type { PrimitiveNode } from '../define/primitive_module';\n\nimport {\n type AuthoredChildBrand,\n type AuthoredChildField,\n type AuthoredSpec,\n type AuthoredTextBrand,\n readAuthoredSpec,\n} from './authored_fields';\nimport { type AuthorComponent, authorType, defineAuthorComponent } from './jsx';\n\n/** A {@link Composition} whose `body` is the pack's own authoring node type. */\nexport type AuthorComposition<TNode extends PrimitiveNode = PrimitiveNode> =\n Omit<Composition<TNode>, 'body'> & {\n body: TNode[];\n };\n\n/**\n * Props of the shim's root element: the composition fields minus `type`, with\n * `body` given either as an array or as JSX children.\n */\nexport interface CompositionAuthorProps<\n TNode extends PrimitiveNode = PrimitiveNode,\n> extends Omit<AuthorComposition<TNode>, 'type' | 'body'> {\n /** Wins outright when present: `children` are then ignored, not merged. */\n body?: TNode[];\n /** Parsed into `body` only when `body` is absent. Each child must be an authoring element of a registered primitive type. */\n children?: ReactNode;\n}\n\n/** Literal `type` strings; wide `string` is dropped so a string index cannot collide with `component`. */\ntype LiteralType<T extends string> = string extends T ? never : T;\n\n/** No keys. Intersects away, unlike `Record<string, never>`. */\ntype NoKeys = Record<never, never>;\n\ntype ShapeOf<T> = T extends { shape: infer Shape } ? Shape : NoKeys;\n\n/** A primitive's schema type, or `never` when it declares none. */\ntype SchemaOf<P> = P extends { schema: infer S }\n ? S extends ZodObject\n ? S\n : never\n : never;\n\n/** A bare `ZodObject` has a string index; a real shape does not. */\ntype LooseSchema<TSchema> = string extends keyof ShapeOf<TSchema>\n ? true\n : false;\n\n// The schema a brand is read from: `F`, or one an optional, nullable, default,\n// or readonly wrapper holds.\ntype Branded<F> = F extends\n AuthoredChildBrand<string, unknown> | AuthoredTextBrand\n ? F\n : F extends {\n _zod: {\n def: {\n type: 'optional' | 'nullable' | 'default' | 'readonly';\n innerType: infer Inner;\n };\n };\n }\n ? Branded<Inner>\n : F;\n\ntype AuthoredNames<TSchema> = {\n [K in keyof ShapeOf<TSchema>]: Branded<ShapeOf<TSchema>[K]> extends\n AuthoredChildBrand<string, unknown> | AuthoredTextBrand\n ? K\n : never;\n}[keyof ShapeOf<TSchema>];\n\ntype AuthorPropsForSchema<TSchema extends ZodObject> =\n LooseSchema<TSchema> extends true\n ? Record<string, unknown> & { children?: ReactNode }\n : Omit<z.infer<TSchema>, 'type' | AuthoredNames<TSchema>> &\n Partial<\n Pick<\n z.infer<TSchema>,\n Extract<AuthoredNames<TSchema>, keyof z.infer<TSchema>>\n >\n > & { children?: ReactNode };\n\ntype AuthorPropsFor<P> = [SchemaOf<P>] extends [never]\n ? Record<string, unknown> & { children?: ReactNode }\n : AuthorPropsForSchema<SchemaOf<P>>;\n\ntype ChildEntry<F> = 0 extends 1 & F\n ? NoKeys\n : F extends AuthoredChildBrand<infer Name, infer Props>\n ? [Name] extends [string]\n ? {\n [K in Capitalize<Name>]: AuthorComponent<\n Props & { children?: ReactNode },\n Name\n >;\n }\n : NoKeys\n : NoKeys;\n\ntype UnionToIntersection<T> = (\n T extends unknown ? (value: T) => void : never\n) extends (value: infer R) => void\n ? R\n : never;\n\ntype ChildComponentsOf<TSchema> =\n LooseSchema<TSchema> extends true\n ? NoKeys\n : UnionToIntersection<\n {\n [K in keyof ShapeOf<TSchema>]: ChildEntry<\n Branded<ShapeOf<TSchema>[K]>\n >;\n }[keyof ShapeOf<TSchema>]\n >;\n\ntype ChildMapOfTuple<TPrimitives> = TPrimitives extends readonly [\n infer Head,\n ...infer Tail,\n]\n ? ChildComponentsOf<SchemaOf<Head>> &\n ChildMapOfTuple<Tail extends readonly { type: string }[] ? Tail : []>\n : NoKeys;\n\ntype ChildComponentMap<TPrimitives extends readonly { type: string }[]> =\n ChildMapOfTuple<TPrimitives>;\n\n/**\n * PascalCase authoring components keyed from a pack's primitive `type` list.\n * `slideFrame` becomes `SlideFrame`. Props come from the primitive's schema.\n */\nexport type PrimitiveComponentMap<\n TPrimitives extends readonly { type: string }[],\n> = {\n [\n P in TPrimitives[number] as Capitalize<LiteralType<P['type'] & string>>\n ]: AuthorComponent<AuthorPropsFor<P>, P['type'] & string>;\n};\n\n/**\n * A pack's JSX authoring front: the root `Composition` element, one\n * PascalCase component per primitive and per branded child, and the conversion\n * back to plain data.\n */\nexport type JsxShim<\n TNode extends PrimitiveNode = PrimitiveNode,\n TPrimitives extends readonly { type: string }[] = readonly { type: string }[],\n> = {\n Composition: AuthorComponent<CompositionAuthorProps<TNode>, 'view'>;\n /** Throws when the root is not the `Composition` element, or when a child is not a registered primitive. */\n toComposition: (\n element: ReactElement<CompositionAuthorProps<TNode>>\n ) => AuthorComposition<TNode>;\n} & PrimitiveComponentMap<TPrimitives> &\n ChildComponentMap<TPrimitives>;\n\n/**\n * Builds a pack's {@link JsxShim} from its primitive list.\n *\n * Branded schema fields ({@link fromChildren}, {@link fromTextChildren}) fill\n * from JSX children, and each child type becomes a component. A primitive with\n * no brand still fills its one child slot, array or single node, from\n * {@link PrimitiveDefinition.children}.\n */\nexport const buildJsxShim = <\n const TPrimitives extends readonly { type: string }[] = readonly {\n type: string;\n }[],\n TNode extends PrimitiveNode = PrimitiveNode,\n>(\n primitives: TPrimitives = [] as unknown as TPrimitives\n): JsxShim<TNode, TPrimitives> => {\n const primitiveTypes = new Set(primitives.map((primitive) => primitive.type));\n const childSlotsByType = new Map(\n primitives.map((primitive) => [\n primitive.type,\n inferChildSlots('children' in primitive ? primitive.children : undefined),\n ])\n );\n const { authoredByType, childComponents } = collectAuthored(primitives);\n assertUniqueComponentNames([\n ...primitives.map(({ type }) => type),\n ...childComponents.keys(),\n ]);\n const view = defineAuthorComponent<CompositionAuthorProps<TNode>, 'view'>(\n 'view'\n );\n const env: ParseEnv = {\n authoredByType,\n childSlotsByType,\n primitiveTypes,\n };\n\n return {\n Composition: view,\n toComposition: (element) => toAuthorComposition<TNode>(element, env),\n ...Object.fromEntries(\n primitives.map((primitive) => [\n capitalize(primitive.type),\n defineAuthorComponent(primitive.type),\n ])\n ),\n ...Object.fromEntries(\n [...childComponents].map(([type, component]) => [\n capitalize(type),\n component,\n ])\n ),\n } as JsxShim<TNode, TPrimitives>;\n};\n\ninterface ChildSlot {\n array: boolean;\n field: string;\n}\n\ninterface ParseEnv {\n authoredByType: ReadonlyMap<string, AuthoredSpec>;\n childSlotsByType: ReadonlyMap<string, readonly ChildSlot[]>;\n primitiveTypes: ReadonlySet<string>;\n}\n\nconst collectAuthored = (\n primitives: readonly { type: string; schema?: unknown }[]\n): {\n authoredByType: Map<string, AuthoredSpec>;\n childComponents: Map<string, AuthorComponent<unknown, string>>;\n} => {\n const authoredByType = new Map<string, AuthoredSpec>();\n const signatures = new Map<string, string>();\n const childComponents = new Map<string, AuthorComponent<unknown, string>>();\n for (const primitive of primitives) {\n const schema = primitive.schema;\n if (!isZodType(schema)) {\n continue;\n }\n const spec = readAuthoredSpec(schema);\n if (spec.children.length === 0 && spec.text.length === 0) {\n continue;\n }\n authoredByType.set(primitive.type, spec);\n for (const field of spec.children) {\n const prior = signatures.get(field.childType);\n if (prior !== undefined && prior !== field.signature) {\n throw new IsomerError(\n 'DUPLICATE_AUTHORED_CHILD',\n `Child type \"${field.childType}\" is branded with two different item shapes.`\n );\n }\n signatures.set(field.childType, field.signature);\n if (!childComponents.has(field.childType)) {\n childComponents.set(\n field.childType,\n defineAuthorComponent(field.childType)\n );\n }\n }\n }\n return { authoredByType, childComponents };\n};\n\n/** Throws when two types, or a type and the root `Composition`, capitalize to one component name. */\nconst assertUniqueComponentNames = (types: readonly string[]): void => {\n const typeByName = new Map([['Composition', 'view']]);\n for (const type of types) {\n const name = capitalize(type);\n const earlier = typeByName.get(name);\n if (earlier !== undefined && earlier !== type) {\n throw new IsomerError(\n 'DUPLICATE_PRIMITIVE_TYPE',\n `buildJsxShim: \"${earlier}\" and \"${type}\" both become the component ${name}`\n );\n }\n typeByName.set(name, type);\n }\n};\n\nconst isZodType = (schema: unknown): schema is ZodType =>\n typeof schema === 'object' && schema !== null && '_zod' in schema;\n\nconst toAuthorComposition = <TNode extends PrimitiveNode>(\n element: ReactElement<CompositionAuthorProps<TNode>>,\n env: ParseEnv\n): AuthorComposition<TNode> => {\n requireAuthorElement<CompositionAuthorProps<TNode>>(element, 'view');\n const props = element.props;\n const resolvedBody =\n props.body ??\n flattenChildren(props.children).map((child) =>\n bodyNodeFromElement<TNode>(child, env)\n );\n const spec: AuthorComposition<TNode> = {\n type: 'view',\n body: resolvedBody,\n };\n\n if (props.version !== undefined) {\n spec.version = props.version;\n }\n if (props.title !== undefined) {\n spec.title = props.title;\n }\n if (props.subtitle !== undefined) {\n spec.subtitle = props.subtitle;\n }\n if (props.theme !== undefined) {\n spec.theme = props.theme;\n }\n if (props.meta !== undefined) {\n spec.meta = props.meta;\n }\n\n return spec;\n};\n\nconst bodyNodeFromElement = <TNode extends PrimitiveNode>(\n node: ReactNode,\n env: ParseEnv\n): TNode => {\n const element = requireAuthorElement<{ children?: ReactNode }>(node);\n const type = getAuthorType(element);\n if (!env.primitiveTypes.has(type)) {\n throw new IsomerError(\n 'INVALID_BODY_NODE',\n `\"${type}\" cannot be used as a composition body node.`\n );\n }\n\n const parseChild = (child: ReactNode): TNode =>\n bodyNodeFromElement<TNode>(child, env);\n const slots = env.childSlotsByType.get(type) ?? [];\n const authored = env.authoredByType.get(type);\n const converted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(\n withoutChildren<Record<string, unknown>>(element)\n )) {\n const childField = authored?.children.find((field) => field.field === key);\n converted[key] = childField\n ? valueFromChildField(value, childField, env)\n : convertPropValue(value, key, slots, parseChild);\n }\n\n const rawChildren = element.props.children;\n if (authored && (authored.children.length > 0 || authored.text.length > 0)) {\n fillAuthoredFields(converted, authored, rawChildren, env);\n } else {\n const unique = slots.length === 1 ? slots[0] : undefined;\n if (\n unique &&\n converted[unique.field] === undefined &&\n rawChildren !== undefined\n ) {\n const nested = flattenChildren(rawChildren).map(parseChild);\n converted[unique.field] = unique.array ? nested : nested[0];\n } else if (slots.length === 0 && flattenChildren(rawChildren).length > 0) {\n throw new IsomerError(\n 'UNEXPECTED_CHILDREN',\n `<${capitalize(type)}> takes no JSX children; set its fields through props.`\n );\n }\n }\n\n return omitUndefined({ ...converted, type }) as TNode;\n};\n\nconst fillAuthoredFields = (\n converted: Record<string, unknown>,\n authored: AuthoredSpec,\n rawChildren: ReactNode,\n env: ParseEnv\n): void => {\n for (const field of authored.children) {\n if (converted[field.field] !== undefined || rawChildren === undefined) {\n continue;\n }\n converted[field.field] = itemsFromBrand(rawChildren, field, env);\n }\n for (const field of authored.text) {\n if (converted[field.field] !== undefined) {\n continue;\n }\n if (rawChildren === undefined) {\n if (!field.optional) {\n throw new IsomerError(\n 'MISSING_AUTHORED_TEXT',\n `Expected text children for \"${field.field}\".`\n );\n }\n continue;\n }\n converted[field.field] = textFromChildren(rawChildren, {\n collapseWhitespace: field.collapseWhitespace,\n });\n }\n};\n\nconst valueFromChildField = (\n value: unknown,\n field: AuthoredChildField,\n env: ParseEnv\n): unknown => {\n if (isJsxNodes(value)) {\n return itemsFromBrand(value, field, env);\n }\n return value;\n};\n\nconst isJsxNodes = (value: unknown): value is ReactNode => {\n if (isAuthorElement(value)) {\n return true;\n }\n if (isValidElement(value) && value.type === Fragment) {\n return true;\n }\n return (\n Array.isArray(value) &&\n value.some((item: unknown) => isAuthorElement(item) || isValidElement(item))\n );\n};\n\nconst itemsFromBrand = (\n children: ReactNode,\n field: AuthoredChildField,\n env: ParseEnv\n): unknown[] =>\n flattenChildren(children).map((child) => itemFromElement(child, field, env));\n\nconst itemFromElement = (\n child: ReactNode,\n field: AuthoredChildField,\n env: ParseEnv\n): unknown => {\n const element = requireAuthorElement<Record<string, unknown>>(\n child,\n field.childType\n );\n if (field.toItem) {\n return field.toItem(element.props, {\n parseChildren: (nested) =>\n flattenChildren(nested).map((node) => bodyNodeFromElement(node, env)),\n });\n }\n const props = withoutChildren<Record<string, unknown>>(element);\n const nestedChildren = element.props.children;\n if (\n field.textField !== undefined &&\n props[field.textField] === undefined &&\n nestedChildren !== undefined &&\n !hasAuthorElement(nestedChildren)\n ) {\n props[field.textField] = textFromChildren(nestedChildren);\n }\n fillNestedBrands(field.itemSchema, props, nestedChildren, env);\n return props;\n};\n\nconst fillNestedBrands = (\n itemSchema: ZodType,\n props: Record<string, unknown>,\n children: ReactNode,\n env: ParseEnv\n): void => {\n if (children === undefined) {\n return;\n }\n const spec = readAuthoredSpec(itemSchema);\n for (const field of spec.children) {\n if (props[field.field] !== undefined) {\n continue;\n }\n const matching = flattenChildren(children).filter(\n (child) =>\n isAuthorElement(child) && getAuthorType(child) === field.childType\n );\n if (matching.length === 0) {\n continue;\n }\n props[field.field] = matching.map((child) =>\n itemFromElement(child, field, env)\n );\n }\n};\n\nconst hasAuthorElement = (children: ReactNode): boolean =>\n flattenChildren(children).some((child) => isAuthorElement(child));\n\nconst convertPropValue = <TNode extends PrimitiveNode>(\n value: unknown,\n field: string,\n slots: readonly ChildSlot[],\n parseChild: (child: ReactNode) => TNode\n): unknown => {\n const asArray = slots.some((slot) => slot.field === field && slot.array);\n const fromJsx = nodesFromJsx(value, parseChild);\n if (fromJsx) {\n return asArray ? fromJsx : fromJsx[0];\n }\n if (Array.isArray(value)) {\n return value.flatMap((item: unknown) => {\n const nodes = nodesFromJsx(item, parseChild);\n return nodes ?? [item];\n });\n }\n return value;\n};\n\nconst nodesFromJsx = <TNode extends PrimitiveNode>(\n value: unknown,\n parseChild: (child: ReactNode) => TNode\n): TNode[] | undefined => {\n if (isAuthorElement(value)) {\n return [parseChild(value)];\n }\n if (isValidElement(value) && value.type === Fragment) {\n return flattenChildren(value).map(parseChild);\n }\n return undefined;\n};\n\nconst isAuthorElement = (value: unknown): value is ReactElement => {\n if (!isValidElement(value)) {\n return false;\n }\n const component = value.type as Partial<AuthorComponent<unknown, string>>;\n return typeof component[authorType] === 'string';\n};\n\n/**\n * Reads {@link PrimitiveDefinition.children} against a probe node so JSX can\n * fill the same fields a tree walk would visit. Paths like `body[0]` are array\n * slots; a bare `header` is a single nested node.\n */\nconst inferChildSlots = (children: unknown): readonly ChildSlot[] => {\n if (typeof children !== 'function') {\n return [];\n }\n const probeNode: PrimitiveNode = { type: '__probe__' };\n const node = new Proxy(\n {},\n {\n get(_target, prop) {\n if (prop === 'type') {\n return probeNode.type;\n }\n return [probeNode];\n },\n }\n );\n try {\n const refs = (children as (value: unknown) => unknown)(node);\n if (!Array.isArray(refs)) {\n return [];\n }\n const byField = new Map<string, boolean>();\n for (const ref of refs) {\n if (!isChildRef(ref)) {\n continue;\n }\n const field = /^[A-Za-z_]\\w*/.exec(ref.path)?.[0];\n if (!field) {\n continue;\n }\n byField.set(\n field,\n byField.get(field) === true || /\\[\\d+\\]/.test(ref.path)\n );\n }\n return [...byField.entries()].map(([field, array]) => ({ array, field }));\n } catch {\n return [];\n }\n};\n\nconst isChildRef = (value: unknown): value is { path: string } =>\n typeof value === 'object' &&\n value !== null &&\n 'path' in value &&\n typeof value.path === 'string';\n\nconst capitalize = (value: string): string =>\n `${value.slice(0, 1).toUpperCase()}${value.slice(1)}`;\n\n/** React children as a flat array, with fragments inlined. */\nexport const flattenChildren = (children: ReactNode): ReactNode[] =>\n Children.toArray(children).flatMap((child) => {\n if (isValidElement(child) && child.type === Fragment) {\n const props = child.props as { children?: ReactNode };\n return flattenChildren(props.children);\n }\n return child;\n });\n\n/**\n * Children joined into one string. Throws on an element child, so a prop typed as text stays text. Collapses whitespace unless `{ collapseWhitespace: false }`.\n */\nexport const textFromChildren = (\n children: ReactNode,\n options?: { collapseWhitespace?: boolean }\n): string => {\n const text = flattenChildren(children)\n .map((child) => {\n if (typeof child === 'string' || typeof child === 'number') {\n return String(child);\n }\n throw new IsomerError(\n 'EXPECTED_TEXT_CHILDREN',\n 'Expected text children.'\n );\n })\n .join('');\n if (options?.collapseWhitespace === false) {\n return text.trim();\n }\n return text.replace(/\\s+/g, ' ').trim();\n};\n\n/** An element's props without `children` and without `undefined` entries. */\nconst withoutChildren = <TProps>(element: ReactElement<unknown>): TProps => {\n const props = { ...(element.props as TProps & { children?: ReactNode }) };\n delete props.children;\n return omitUndefined(props);\n};\n\n/** Narrows `element` to an authoring element, asserting `type` when given. */\nconst requireAuthorElement = <TProps>(\n element: ReactNode,\n type?: string\n): ReactElement<TProps & { children?: ReactNode }> => {\n assertValidElement(element);\n const actual = getAuthorType(element);\n if (type !== undefined && actual !== type) {\n throw new IsomerError(\n 'AUTHOR_TYPE_MISMATCH',\n `Expected <${type}> but received <${actual}>.`\n );\n }\n return element as ReactElement<TProps & { children?: ReactNode }>;\n};\n\n/** The primitive type {@link authorType} brands onto `element`'s component. */\nconst getAuthorType = (element: ReactElement<unknown>): string => {\n const component = element.type as Partial<AuthorComponent<unknown, string>>;\n const type = component[authorType];\n if (!type) {\n throw new IsomerError(\n 'EXPECTED_AUTHOR_COMPONENT',\n 'Expected an Isomer authoring component.'\n );\n }\n return type;\n};\n\nconst assertValidElement: (\n element: ReactNode\n) => asserts element is ReactElement<unknown> = (element) => {\n if (!isValidElement(element)) {\n throw new IsomerError(\n 'EXPECTED_JSX_ELEMENT',\n 'Expected an Isomer JSX element.'\n );\n }\n};\n\nconst omitUndefined = <T extends object>(value: T): T =>\n Object.fromEntries(\n Object.entries(value).filter((entry) => entry[1] !== undefined)\n ) as T;\n"]}
|
|
1
|
+
{"version":3,"file":"jsx_shim.js","sourceRoot":"","sources":["../../src/author/jsx_shim.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 {\n Children,\n Fragment,\n isValidElement,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport type { z, ZodObject, ZodType } from 'zod';\n\nimport type { Composition } from '../composition/composition';\nimport { IsomerError } from '../composition/error';\nimport type { PrimitiveNode } from '../define/primitive_module';\n\nimport {\n type AuthoredChildBrand,\n type AuthoredChildField,\n type AuthoredSpec,\n type AuthoredTextBrand,\n type AuthoredToItemBrand,\n type ItemSchema,\n readAuthoredSpec,\n} from './authored_fields';\nimport {\n capitalize,\n type ChildSlot,\n createAuthoringModel,\n} from './authoring_model';\nimport { type AuthorComponent, authorType, defineAuthorComponent } from './jsx';\n\n/** A {@link Composition} whose `body` is the pack's own authoring node type. */\nexport type AuthorComposition<TNode extends PrimitiveNode = PrimitiveNode> =\n Omit<Composition<TNode>, 'body'> & {\n body: TNode[];\n };\n\n/**\n * Props of the shim's root element: the composition fields minus `type`, with\n * `body` given either as an array or as JSX children.\n */\nexport interface CompositionAuthorProps<\n TNode extends PrimitiveNode = PrimitiveNode,\n> extends Omit<AuthorComposition<TNode>, 'type' | 'body'> {\n /** Wins outright when present: `children` are then ignored, not merged. */\n body?: TNode[];\n /** Parsed into `body` only when `body` is absent. Each child must be an authoring element of a registered primitive type. */\n children?: ReactNode;\n}\n\n/** Literal `type` strings; wide `string` is dropped so a string index cannot collide with `component`. */\ntype LiteralType<T extends string> = string extends T ? never : T;\n\n/** No keys. Intersects away, unlike `Record<string, never>`. */\ntype NoKeys = Record<never, never>;\n\ntype ShapeOf<T> = T extends { shape: infer Shape } ? Shape : NoKeys;\n\n/** A primitive's schema type, or `never` when it declares none. */\ntype SchemaOf<P> = P extends { schema: infer S }\n ? S extends ZodObject\n ? S\n : never\n : never;\n\n/** A bare `ZodObject` has a string index; a real shape does not. */\ntype LooseSchema<TSchema> = string extends keyof ShapeOf<TSchema>\n ? true\n : false;\n\n// The schema a brand is read from: `F`, or one an optional, nullable, default,\n// or readonly wrapper holds.\ntype Branded<F> = F extends\n AuthoredChildBrand<string, unknown> | AuthoredTextBrand\n ? F\n : F extends {\n _zod: {\n def: {\n type: 'optional' | 'nullable' | 'default' | 'readonly';\n innerType: infer Inner;\n };\n };\n }\n ? Branded<Inner>\n : F;\n\ntype AuthoredNames<TSchema> = {\n [K in keyof ShapeOf<TSchema>]: Branded<ShapeOf<TSchema>[K]> extends\n AuthoredChildBrand<string, unknown> | AuthoredTextBrand\n ? K\n : never;\n}[keyof ShapeOf<TSchema>];\n\ntype AuthorPropsForSchema<TSchema extends ZodObject> =\n LooseSchema<TSchema> extends true\n ? Record<string, unknown> & { children?: ReactNode }\n : Omit<z.infer<TSchema>, 'type' | AuthoredNames<TSchema>> &\n Partial<\n Pick<\n z.infer<TSchema>,\n Extract<AuthoredNames<TSchema>, keyof z.infer<TSchema>>\n >\n > & { children?: ReactNode };\n\ntype AuthorPropsFor<P> = [SchemaOf<P>] extends [never]\n ? Record<string, unknown> & { children?: ReactNode }\n : AuthorPropsForSchema<SchemaOf<P>>;\n\ntype ChildEntry<F, TDepth extends unknown[]> = 0 extends 1 & F\n ? NoKeys\n : F extends AuthoredChildBrand<infer Name, infer Props>\n ? [Name] extends [string]\n ? {\n [K in Capitalize<Name>]: AuthorComponent<\n Props & { children?: ReactNode },\n Name\n >;\n } & (F extends AuthoredToItemBrand\n ? NoKeys\n : ChildComponentsOf<ItemSchema<F>, [...TDepth, unknown]>)\n : NoKeys\n : NoKeys;\n\ntype UnionToIntersection<T> = (\n T extends unknown ? (value: T) => void : never\n) extends (value: infer R) => void\n ? R\n : never;\n\n/** Child components branded on `TSchema`, then on each child's item schema, five levels deep. */\ntype ChildComponentsOf<\n TSchema,\n TDepth extends unknown[] = [],\n> = TDepth['length'] extends 5\n ? NoKeys\n : LooseSchema<TSchema> extends true\n ? NoKeys\n : UnionToIntersection<\n {\n [K in keyof ShapeOf<TSchema>]: ChildEntry<\n Branded<ShapeOf<TSchema>[K]>,\n TDepth\n >;\n }[keyof ShapeOf<TSchema>]\n >;\n\ntype ChildMapOfTuple<TPrimitives> = TPrimitives extends readonly [\n infer Head,\n ...infer Tail,\n]\n ? ChildComponentsOf<SchemaOf<Head>> &\n ChildMapOfTuple<Tail extends readonly { type: string }[] ? Tail : []>\n : NoKeys;\n\ntype ChildComponentMap<TPrimitives extends readonly { type: string }[]> =\n ChildMapOfTuple<TPrimitives>;\n\n/**\n * PascalCase authoring components keyed from a pack's primitive `type` list.\n * `slideFrame` becomes `SlideFrame`. Props come from the primitive's schema.\n */\nexport type PrimitiveComponentMap<\n TPrimitives extends readonly { type: string }[],\n> = {\n [\n P in TPrimitives[number] as Capitalize<LiteralType<P['type'] & string>>\n ]: AuthorComponent<AuthorPropsFor<P>, P['type'] & string>;\n};\n\n/**\n * A pack's JSX authoring front: the root `Composition` element, one\n * PascalCase component per primitive and per branded child, and the conversion\n * back to plain data.\n */\nexport type JsxShim<\n TNode extends PrimitiveNode = PrimitiveNode,\n TPrimitives extends readonly { type: string }[] = readonly { type: string }[],\n> = {\n Composition: AuthorComponent<CompositionAuthorProps<TNode>, 'view'>;\n /** Throws when the root is not the `Composition` element, or when a child is not a registered primitive. */\n toComposition: (\n element: ReactElement<CompositionAuthorProps<TNode>>\n ) => AuthorComposition<TNode>;\n} & PrimitiveComponentMap<TPrimitives> &\n ChildComponentMap<TPrimitives>;\n\n/**\n * Builds a pack's {@link JsxShim} from its primitive list.\n *\n * Branded schema fields ({@link fromChildren}, {@link fromTextChildren}) fill\n * from JSX children, and each child type becomes a component. A primitive with\n * no brand still fills its one child slot, array or single node, from\n * {@link PrimitiveDefinition.children}.\n */\nexport const buildJsxShim = <\n const TPrimitives extends readonly { type: string }[] = readonly {\n type: string;\n }[],\n TNode extends PrimitiveNode = PrimitiveNode,\n>(\n primitives: TPrimitives = [] as unknown as TPrimitives\n): JsxShim<TNode, TPrimitives> => {\n const primitiveTypes = new Set(primitives.map((primitive) => primitive.type));\n const { authoredByType, children, childSlotsByType } =\n createAuthoringModel(primitives);\n const childComponents = new Map(\n [...children.keys()].map((type) => [type, defineAuthorComponent(type)])\n );\n const view = defineAuthorComponent<CompositionAuthorProps<TNode>, 'view'>(\n 'view'\n );\n const env: ParseEnv = {\n authoredByType,\n childSlotsByType,\n primitiveTypes,\n };\n\n return {\n Composition: view,\n toComposition: (element) => toAuthorComposition<TNode>(element, env),\n ...Object.fromEntries(\n primitives.map((primitive) => [\n capitalize(primitive.type),\n defineAuthorComponent(primitive.type),\n ])\n ),\n ...Object.fromEntries(\n [...childComponents].map(([type, component]) => [\n capitalize(type),\n component,\n ])\n ),\n } as JsxShim<TNode, TPrimitives>;\n};\n\ninterface ParseEnv {\n authoredByType: ReadonlyMap<string, AuthoredSpec>;\n childSlotsByType: ReadonlyMap<string, readonly ChildSlot[]>;\n primitiveTypes: ReadonlySet<string>;\n}\n\nconst toAuthorComposition = <TNode extends PrimitiveNode>(\n element: ReactElement<CompositionAuthorProps<TNode>>,\n env: ParseEnv\n): AuthorComposition<TNode> => {\n requireAuthorElement<CompositionAuthorProps<TNode>>(element, 'view');\n const props = element.props;\n const resolvedBody =\n props.body ??\n flattenChildren(props.children).map((child) =>\n bodyNodeFromElement<TNode>(child, env)\n );\n const spec: AuthorComposition<TNode> = {\n type: 'view',\n body: resolvedBody,\n };\n\n if (props.version !== undefined) {\n spec.version = props.version;\n }\n if (props.title !== undefined) {\n spec.title = props.title;\n }\n if (props.subtitle !== undefined) {\n spec.subtitle = props.subtitle;\n }\n if (props.theme !== undefined) {\n spec.theme = props.theme;\n }\n if (props.meta !== undefined) {\n spec.meta = props.meta;\n }\n\n return spec;\n};\n\nconst bodyNodeFromElement = <TNode extends PrimitiveNode>(\n node: ReactNode,\n env: ParseEnv\n): TNode => {\n const element = requireAuthorElement<{ children?: ReactNode }>(node);\n const type = getAuthorType(element);\n if (!env.primitiveTypes.has(type)) {\n throw new IsomerError(\n 'INVALID_BODY_NODE',\n `\"${type}\" cannot be used as a composition body node.`\n );\n }\n\n const parseChild = (child: ReactNode): TNode =>\n bodyNodeFromElement<TNode>(child, env);\n const slots = env.childSlotsByType.get(type) ?? [];\n const authored = env.authoredByType.get(type);\n const converted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(\n withoutChildren<Record<string, unknown>>(element)\n )) {\n const childField = authored?.children.find((field) => field.field === key);\n converted[key] = childField\n ? valueFromChildField(value, childField, env)\n : convertPropValue(value, key, slots, parseChild);\n }\n\n const rawChildren = element.props.children;\n if (authored && (authored.children.length > 0 || authored.text.length > 0)) {\n fillAuthoredFields(converted, authored, rawChildren, env);\n } else {\n const unique = slots.length === 1 ? slots[0] : undefined;\n if (\n unique &&\n converted[unique.field] === undefined &&\n rawChildren !== undefined\n ) {\n const nested = flattenChildren(rawChildren).map(parseChild);\n converted[unique.field] = unique.array ? nested : nested[0];\n } else if (slots.length === 0 && flattenChildren(rawChildren).length > 0) {\n throw new IsomerError(\n 'UNEXPECTED_CHILDREN',\n `<${capitalize(type)}> takes no JSX children; set its fields through props.`\n );\n }\n }\n\n return omitUndefined({ ...converted, type }) as TNode;\n};\n\nconst fillAuthoredFields = (\n converted: Record<string, unknown>,\n authored: AuthoredSpec,\n rawChildren: ReactNode,\n env: ParseEnv\n): void => {\n for (const field of authored.children) {\n if (converted[field.field] !== undefined || rawChildren === undefined) {\n continue;\n }\n converted[field.field] = valueFromBrand(\n flattenChildren(rawChildren),\n field,\n env\n );\n }\n for (const field of authored.text) {\n if (converted[field.field] !== undefined) {\n continue;\n }\n if (rawChildren === undefined) {\n if (!field.optional) {\n throw new IsomerError(\n 'MISSING_AUTHORED_TEXT',\n `Expected text children for \"${field.field}\".`\n );\n }\n continue;\n }\n converted[field.field] = textFromChildren(rawChildren, {\n collapseWhitespace: field.collapseWhitespace,\n });\n }\n};\n\nconst valueFromChildField = (\n value: unknown,\n field: AuthoredChildField,\n env: ParseEnv\n): unknown => {\n if (isJsxNodes(value)) {\n return valueFromBrand(flattenChildren(value), field, env);\n }\n return value;\n};\n\nconst isJsxNodes = (value: unknown): value is ReactNode => {\n if (isAuthorElement(value)) {\n return true;\n }\n if (isValidElement(value) && value.type === Fragment) {\n return true;\n }\n return (\n Array.isArray(value) &&\n value.some((item: unknown) => isAuthorElement(item) || isValidElement(item))\n );\n};\n\n/** The field's array of items, or its one item; throws on a second element for a single-item field. */\nconst valueFromBrand = (\n elements: readonly ReactNode[],\n field: AuthoredChildField,\n env: ParseEnv\n): unknown => {\n const items = elements.map((child) => itemFromElement(child, field, env));\n if (field.array) {\n return items;\n }\n if (items.length > 1) {\n throw new IsomerError(\n 'UNEXPECTED_CHILDREN',\n `\"${field.field}\" takes one <${capitalize(field.childType)}>, not ${items.length}.`\n );\n }\n return items[0];\n};\n\nconst itemFromElement = (\n child: ReactNode,\n field: AuthoredChildField,\n env: ParseEnv\n): unknown => {\n const element = requireAuthorElement<Record<string, unknown>>(\n child,\n field.childType\n );\n if (field.toItem) {\n return field.toItem(element.props, {\n parseChildren: (nested) =>\n flattenChildren(nested).map((node) => bodyNodeFromElement(node, env)),\n });\n }\n const props = withoutChildren<Record<string, unknown>>(element);\n const nested = flattenChildren(element.props.children);\n const elements = nested.filter(isAuthorElement);\n const text = nested.filter((child) => !isAuthorElement(child));\n if (\n field.textField !== undefined &&\n props[field.textField] === undefined &&\n text.length > 0\n ) {\n props[field.textField] = textFromChildren(text);\n }\n fillNestedBrands(field.itemSchema, props, elements, env);\n return props;\n};\n\nconst fillNestedBrands = (\n itemSchema: ZodType,\n props: Record<string, unknown>,\n elements: readonly ReactElement[],\n env: ParseEnv\n): void => {\n if (elements.length === 0) {\n return;\n }\n for (const field of readAuthoredSpec(itemSchema).children) {\n if (props[field.field] !== undefined) {\n continue;\n }\n const matching = elements.filter(\n (child) => getAuthorType(child) === field.childType\n );\n if (matching.length > 0) {\n props[field.field] = valueFromBrand(matching, field, env);\n }\n }\n};\n\nconst convertPropValue = <TNode extends PrimitiveNode>(\n value: unknown,\n field: string,\n slots: readonly ChildSlot[],\n parseChild: (child: ReactNode) => TNode\n): unknown => {\n const asArray = slots.some((slot) => slot.field === field && slot.array);\n const fromJsx = nodesFromJsx(value, parseChild);\n if (fromJsx) {\n return asArray ? fromJsx : fromJsx[0];\n }\n if (Array.isArray(value)) {\n return value.flatMap((item: unknown) => {\n const nodes = nodesFromJsx(item, parseChild);\n return nodes ?? [item];\n });\n }\n return value;\n};\n\nconst nodesFromJsx = <TNode extends PrimitiveNode>(\n value: unknown,\n parseChild: (child: ReactNode) => TNode\n): TNode[] | undefined => {\n if (isAuthorElement(value)) {\n return [parseChild(value)];\n }\n if (isValidElement(value) && value.type === Fragment) {\n return flattenChildren(value).map(parseChild);\n }\n return undefined;\n};\n\nconst isAuthorElement = (value: unknown): value is ReactElement => {\n if (!isValidElement(value)) {\n return false;\n }\n const component = value.type as Partial<AuthorComponent<unknown, string>>;\n return typeof component[authorType] === 'string';\n};\n\n/** React children as a flat array, with fragments inlined. */\nexport const flattenChildren = (children: ReactNode): ReactNode[] =>\n Children.toArray(children).flatMap((child) => {\n if (isValidElement(child) && child.type === Fragment) {\n const props = child.props as { children?: ReactNode };\n return flattenChildren(props.children);\n }\n return child;\n });\n\n/**\n * Children joined into one string. Throws on an element child, so a prop typed as text stays text. Collapses whitespace unless `{ collapseWhitespace: false }`.\n */\nexport const textFromChildren = (\n children: ReactNode,\n options?: { collapseWhitespace?: boolean }\n): string => {\n const text = flattenChildren(children)\n .map((child) => {\n if (typeof child === 'string' || typeof child === 'number') {\n return String(child);\n }\n throw new IsomerError(\n 'EXPECTED_TEXT_CHILDREN',\n 'Expected text children.'\n );\n })\n .join('');\n if (options?.collapseWhitespace === false) {\n return text.trim();\n }\n return text.replace(/\\s+/g, ' ').trim();\n};\n\n/** An element's props without `children` and without `undefined` entries. */\nconst withoutChildren = <TProps>(element: ReactElement<unknown>): TProps => {\n const props = { ...(element.props as TProps & { children?: ReactNode }) };\n delete props.children;\n return omitUndefined(props);\n};\n\n/** Narrows `element` to an authoring element, asserting `type` when given. */\nconst requireAuthorElement = <TProps>(\n element: ReactNode,\n type?: string\n): ReactElement<TProps & { children?: ReactNode }> => {\n assertValidElement(element);\n const actual = getAuthorType(element);\n if (type !== undefined && actual !== type) {\n throw new IsomerError(\n 'AUTHOR_TYPE_MISMATCH',\n `Expected <${type}> but received <${actual}>.`\n );\n }\n return element as ReactElement<TProps & { children?: ReactNode }>;\n};\n\n/** The primitive type {@link authorType} brands onto `element`'s component. */\nconst getAuthorType = (element: ReactElement<unknown>): string => {\n const component = element.type as Partial<AuthorComponent<unknown, string>>;\n const type = component[authorType];\n if (!type) {\n throw new IsomerError(\n 'EXPECTED_AUTHOR_COMPONENT',\n 'Expected an Isomer authoring component.'\n );\n }\n return type;\n};\n\nconst assertValidElement: (\n element: ReactNode\n) => asserts element is ReactElement<unknown> = (element) => {\n if (!isValidElement(element)) {\n throw new IsomerError(\n 'EXPECTED_JSX_ELEMENT',\n 'Expected an Isomer JSX element.'\n );\n }\n};\n\nconst omitUndefined = <T extends object>(value: T): T =>\n Object.fromEntries(\n Object.entries(value).filter((entry) => entry[1] !== undefined)\n ) as T;\n"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export type JsonObject = Record<string, unknown>;
|
|
2
|
+
export declare const DEF_PREFIX = "#/$defs/";
|
|
3
|
+
/** Ids `z.toJSONSchema` gives a def no one named. */
|
|
4
|
+
export declare const ANONYMOUS_DEF: RegExp;
|
|
5
|
+
export declare const IDENTIFIER: RegExp;
|
|
6
|
+
export declare const isJsonObject: (value: unknown) => value is JsonObject;
|
|
7
|
+
export declare const parseDefRef: (ref: unknown) => string | undefined;
|
|
8
|
+
export declare const ownDef: (defs: JsonObject, id: string) => unknown;
|
|
9
|
+
/** `slideStats` becomes `SlideStats`; anything but letters and digits splits words. */
|
|
10
|
+
export declare const pascalCase: (value: string) => string;
|
|
11
|
+
/** A JSDoc block for `lines`, or `''` when there are none. */
|
|
12
|
+
export declare const jsDoc: (lines: readonly string[], pad: string) => string;
|
|
13
|
+
/** What {@link TypePrinter.members} prints and how. */
|
|
14
|
+
export interface MemberOptions {
|
|
15
|
+
/** Properties left out. */
|
|
16
|
+
omit?: ReadonlySet<string>;
|
|
17
|
+
/** Properties printed optional whether or not the schema requires them. */
|
|
18
|
+
optional?: ReadonlySet<string>;
|
|
19
|
+
}
|
|
20
|
+
export interface TypePrinterOptions {
|
|
21
|
+
defs: JsonObject;
|
|
22
|
+
/** TypeScript names for defs printed by reference; every other def is inlined. */
|
|
23
|
+
names: ReadonlyMap<string, string>;
|
|
24
|
+
/** A fresh, unused name, for a def inlining cannot express. */
|
|
25
|
+
claim: (base: string) => string;
|
|
26
|
+
}
|
|
27
|
+
export interface TypePrinter {
|
|
28
|
+
/** `schema` as a TypeScript type, written at `depth` levels of indent. */
|
|
29
|
+
print: (schema: unknown, depth?: number) => string;
|
|
30
|
+
/** The `key?: Type;` members of an object schema, with their JSDoc, at `depth + 1`. */
|
|
31
|
+
members: (schema: JsonObject, depth: number, options?: MemberOptions) => string;
|
|
32
|
+
/** Type aliases for the anonymous defs that refer to themselves. Call last. */
|
|
33
|
+
promoted: () => string[];
|
|
34
|
+
}
|
|
35
|
+
/** A TypeScript printer over the subset of JSON Schema `z.toJSONSchema` emits. */
|
|
36
|
+
export declare const createTypePrinter: ({ defs, names, claim, }: TypePrinterOptions) => TypePrinter;
|
|
37
|
+
//# sourceMappingURL=schema_to_typescript.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema_to_typescript.d.ts","sourceRoot":"","sources":["../../src/author/schema_to_typescript.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjD,eAAO,MAAM,UAAU,aAAa,CAAC;AAErC,qDAAqD;AACrD,eAAO,MAAM,aAAa,QAAkB,CAAC;AAmB7C,eAAO,MAAM,UAAU,QAAuB,CAAC;AAE/C,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,UACe,CAAC;AAEvE,eAAO,MAAM,WAAW,GAAI,KAAK,OAAO,KAAG,MAAM,GAAG,SAGrC,CAAC;AAEhB,eAAO,MAAM,MAAM,GAAI,MAAM,UAAU,EAAE,IAAI,MAAM,KAAG,OACN,CAAC;AAEjD,uFAAuF;AACvF,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,MAU1C,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,KAAK,GAAI,OAAO,SAAS,MAAM,EAAE,EAAE,KAAK,MAAM,KAAG,MAoB7D,CAAC;AAyDF,uDAAuD;AACvD,MAAM,WAAW,aAAa;IAC5B,2BAA2B;IAC3B,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,UAAU,CAAC;IACjB,kFAAkF;IAClF,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,+DAA+D;IAC/D,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,0EAA0E;IAC1E,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACnD,uFAAuF;IACvF,OAAO,EAAE,CACP,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,aAAa,KACpB,MAAM,CAAC;IACZ,+EAA+E;IAC/E,QAAQ,EAAE,MAAM,MAAM,EAAE,CAAC;CAC1B;AAED,kFAAkF;AAClF,eAAO,MAAM,iBAAiB,GAAI,yBAI/B,kBAAkB,KAAG,WA0PvB,CAAC"}
|