@flyingrobots/bijou 5.0.0 → 7.0.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 +62 -0
- package/dist/core/active-binding-collection.d.ts +49 -0
- package/dist/core/active-binding-collection.d.ts.map +1 -0
- package/dist/core/active-binding-collection.js +264 -0
- package/dist/core/active-binding-collection.js.map +1 -0
- package/dist/core/app-shell-composition.d.ts +44 -0
- package/dist/core/app-shell-composition.d.ts.map +1 -0
- package/dist/core/app-shell-composition.js +123 -0
- package/dist/core/app-shell-composition.js.map +1 -0
- package/dist/core/binding-frame-update.d.ts +18 -0
- package/dist/core/binding-frame-update.d.ts.map +1 -0
- package/dist/core/binding-frame-update.js +133 -0
- package/dist/core/binding-frame-update.js.map +1 -0
- package/dist/core/binding-lifecycle.d.ts +65 -0
- package/dist/core/binding-lifecycle.d.ts.map +1 -0
- package/dist/core/binding-lifecycle.js +357 -0
- package/dist/core/binding-lifecycle.js.map +1 -0
- package/dist/core/binding.d.ts +192 -0
- package/dist/core/binding.d.ts.map +1 -0
- package/dist/core/binding.js +587 -0
- package/dist/core/binding.js.map +1 -0
- package/dist/core/block-metadata.d.ts +113 -0
- package/dist/core/block-metadata.d.ts.map +1 -0
- package/dist/core/block-metadata.js +376 -0
- package/dist/core/block-metadata.js.map +1 -0
- package/dist/core/block-tree-render.d.ts +17 -0
- package/dist/core/block-tree-render.d.ts.map +1 -0
- package/dist/core/block-tree-render.js +186 -0
- package/dist/core/block-tree-render.js.map +1 -0
- package/dist/core/component-metadata.d.ts +63 -0
- package/dist/core/component-metadata.d.ts.map +1 -0
- package/dist/core/component-metadata.js +158 -0
- package/dist/core/component-metadata.js.map +1 -0
- package/dist/core/components/dag-edges.d.ts +9 -3
- package/dist/core/components/dag-edges.d.ts.map +1 -1
- package/dist/core/components/dag-edges.js +41 -10
- package/dist/core/components/dag-edges.js.map +1 -1
- package/dist/core/components/dag-render.d.ts +1 -1
- package/dist/core/components/dag-render.d.ts.map +1 -1
- package/dist/core/components/dag-render.js +193 -72
- package/dist/core/components/dag-render.js.map +1 -1
- package/dist/core/components/dag-source.d.ts +4 -0
- package/dist/core/components/dag-source.d.ts.map +1 -1
- package/dist/core/components/dag-source.js +10 -0
- package/dist/core/components/dag-source.js.map +1 -1
- package/dist/core/components/dag.d.ts +13 -0
- package/dist/core/components/dag.d.ts.map +1 -1
- package/dist/core/components/dag.js.map +1 -1
- package/dist/core/components/index.d.ts +2 -2
- package/dist/core/components/index.d.ts.map +1 -1
- package/dist/core/components/index.js.map +1 -1
- package/dist/core/components/table-v3.d.ts +1 -1
- package/dist/core/components/table-v3.d.ts.map +1 -1
- package/dist/core/components/table-v3.js +136 -21
- package/dist/core/components/table-v3.js.map +1 -1
- package/dist/core/components/table.d.ts +36 -6
- package/dist/core/components/table.d.ts.map +1 -1
- package/dist/core/components/table.js +530 -74
- package/dist/core/components/table.js.map +1 -1
- package/dist/core/fixture-promotion.d.ts +33 -0
- package/dist/core/fixture-promotion.d.ts.map +1 -0
- package/dist/core/fixture-promotion.js +62 -0
- package/dist/core/fixture-promotion.js.map +1 -0
- package/dist/core/layout/envelope.d.ts +174 -0
- package/dist/core/layout/envelope.d.ts.map +1 -0
- package/dist/core/layout/envelope.js +336 -0
- package/dist/core/layout/envelope.js.map +1 -0
- package/dist/core/mode-lowering.d.ts +48 -0
- package/dist/core/mode-lowering.d.ts.map +1 -0
- package/dist/core/mode-lowering.js +176 -0
- package/dist/core/mode-lowering.js.map +1 -0
- package/dist/core/schema-block.d.ts +63 -0
- package/dist/core/schema-block.d.ts.map +1 -0
- package/dist/core/schema-block.js +361 -0
- package/dist/core/schema-block.js.map +1 -0
- package/dist/core/selection.d.ts +127 -0
- package/dist/core/selection.d.ts.map +1 -0
- package/dist/core/selection.js +350 -0
- package/dist/core/selection.js.map +1 -0
- package/dist/core/standard-blocks.d.ts +264 -0
- package/dist/core/standard-blocks.d.ts.map +1 -0
- package/dist/core/standard-blocks.js +2518 -0
- package/dist/core/standard-blocks.js.map +1 -0
- package/dist/core/story-capture.d.ts +48 -0
- package/dist/core/story-capture.d.ts.map +1 -0
- package/dist/core/story-capture.js +64 -0
- package/dist/core/story-capture.js.map +1 -0
- package/dist/core/text/wrap.d.ts.map +1 -1
- package/dist/core/text/wrap.js +37 -20
- package/dist/core/text/wrap.js.map +1 -1
- package/dist/core/theme/doctor.d.ts +37 -0
- package/dist/core/theme/doctor.d.ts.map +1 -0
- package/dist/core/theme/doctor.js +175 -0
- package/dist/core/theme/doctor.js.map +1 -0
- package/dist/core/theme/dtcg.d.ts.map +1 -1
- package/dist/core/theme/dtcg.js +10 -1
- package/dist/core/theme/dtcg.js.map +1 -1
- package/dist/core/theme/index.d.ts +2 -0
- package/dist/core/theme/index.d.ts.map +1 -1
- package/dist/core/theme/index.js +2 -0
- package/dist/core/theme/index.js.map +1 -1
- package/dist/core/theme/presets.d.ts.map +1 -1
- package/dist/core/theme/presets.js +4 -0
- package/dist/core/theme/presets.js.map +1 -1
- package/dist/core/theme/tokens.d.ts +1 -1
- package/dist/core/theme/tokens.d.ts.map +1 -1
- package/dist/index.d.ts +17 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import { sanitizeNonNegativeInt } from '../numeric.js';
|
|
2
|
+
export const RE035_LAYOUT_SCOPE = Object.freeze({
|
|
3
|
+
design: 'RE-035',
|
|
4
|
+
status: 'landed',
|
|
5
|
+
included: Object.freeze([
|
|
6
|
+
'layout-envelope',
|
|
7
|
+
'constraint-negotiation',
|
|
8
|
+
'stack',
|
|
9
|
+
'place',
|
|
10
|
+
'content-measurement-seam',
|
|
11
|
+
'render-assignment-seam',
|
|
12
|
+
]),
|
|
13
|
+
deferred: Object.freeze([
|
|
14
|
+
'RE-036 text measurement and inline flow',
|
|
15
|
+
'RE-037 overflow, viewports, scroll anchoring, and scrollbars',
|
|
16
|
+
'RE-038 box model, chrome regions, hit testing, and focus maps',
|
|
17
|
+
'RE-039 responsive variants, compression, and constraint fallbacks',
|
|
18
|
+
'RE-040 accessible layout semantics',
|
|
19
|
+
'WS-001 workspace tree',
|
|
20
|
+
]),
|
|
21
|
+
});
|
|
22
|
+
export function layoutConstraints(input = {}) {
|
|
23
|
+
const minInline = sanitizeNonNegativeInt(input.minInline, 0);
|
|
24
|
+
const minBlock = sanitizeNonNegativeInt(input.minBlock, 0);
|
|
25
|
+
return Object.freeze({
|
|
26
|
+
minInline,
|
|
27
|
+
maxInline: normalizeBound(input.maxInline, minInline),
|
|
28
|
+
minBlock,
|
|
29
|
+
maxBlock: normalizeBound(input.maxBlock, minBlock),
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
export function layoutPreference(input = {}) {
|
|
33
|
+
const minInline = sanitizeNonNegativeInt(input.minInline, 0);
|
|
34
|
+
const minBlock = sanitizeNonNegativeInt(input.minBlock, 0);
|
|
35
|
+
const maxInline = normalizeBound(input.maxInline, minInline);
|
|
36
|
+
const maxBlock = normalizeBound(input.maxBlock, minBlock);
|
|
37
|
+
return Object.freeze({
|
|
38
|
+
minInline,
|
|
39
|
+
preferredInline: normalizePreferred(input.preferredInline, minInline, maxInline),
|
|
40
|
+
maxInline,
|
|
41
|
+
minBlock,
|
|
42
|
+
preferredBlock: normalizePreferred(input.preferredBlock, minBlock, maxBlock),
|
|
43
|
+
maxBlock,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
export function assignedLayoutRect(input) {
|
|
47
|
+
return Object.freeze({
|
|
48
|
+
inlineStart: sanitizeNonNegativeInt(input.inlineStart, 0),
|
|
49
|
+
blockStart: sanitizeNonNegativeInt(input.blockStart, 0),
|
|
50
|
+
inlineSize: sanitizeNonNegativeInt(input.inlineSize, 0),
|
|
51
|
+
blockSize: sanitizeNonNegativeInt(input.blockSize, 0),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
export function defineLayoutEnvelope(input) {
|
|
55
|
+
const id = normalizeRequiredText(input.id, 'layout envelope: id is required');
|
|
56
|
+
const role = normalizeRequiredText(input.role, 'layout envelope: role is required');
|
|
57
|
+
const direction = normalizeDirection(input.direction);
|
|
58
|
+
const envelope = {
|
|
59
|
+
id,
|
|
60
|
+
role,
|
|
61
|
+
direction,
|
|
62
|
+
constraints: input.constraints,
|
|
63
|
+
preference: input.preference,
|
|
64
|
+
...(input.fit === undefined ? {} : { fit: input.fit }),
|
|
65
|
+
};
|
|
66
|
+
return Object.freeze(envelope);
|
|
67
|
+
}
|
|
68
|
+
export function assignLayoutChild(envelope, assigned, reason) {
|
|
69
|
+
const resolved = {
|
|
70
|
+
...envelope,
|
|
71
|
+
assigned: assignedLayoutRect(assigned),
|
|
72
|
+
reason: normalizeRequiredText(reason, 'layout assignment: reason is required'),
|
|
73
|
+
};
|
|
74
|
+
return Object.freeze(resolved);
|
|
75
|
+
}
|
|
76
|
+
export function isResolvedLayoutEnvelope(envelope) {
|
|
77
|
+
return typeof envelope.assigned === 'object'
|
|
78
|
+
&& envelope.assigned !== null
|
|
79
|
+
&& typeof envelope.reason === 'string'
|
|
80
|
+
&& envelope.reason.length > 0;
|
|
81
|
+
}
|
|
82
|
+
export function renderWithResolvedLayout(envelope, renderer) {
|
|
83
|
+
if (!isResolvedLayoutEnvelope(envelope)) {
|
|
84
|
+
throw new Error(`layout render seam: visible node ${envelope.id} requires an assigned layout envelope`);
|
|
85
|
+
}
|
|
86
|
+
const output = renderer({ envelope, assigned: envelope.assigned });
|
|
87
|
+
return Object.freeze({
|
|
88
|
+
envelope,
|
|
89
|
+
assigned: envelope.assigned,
|
|
90
|
+
output,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
export function contentExtentFromSurface(surface, facts = []) {
|
|
94
|
+
return contentExtent('surface', {
|
|
95
|
+
inlineSize: surface.width,
|
|
96
|
+
blockSize: surface.height,
|
|
97
|
+
facts,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
export function contentExtentFromBuffer(input) {
|
|
101
|
+
return contentExtent('buffer', {
|
|
102
|
+
inlineSize: input.inlineSize ?? input.width ?? 0,
|
|
103
|
+
blockSize: input.blockSize ?? input.height ?? 0,
|
|
104
|
+
baseline: input.baseline,
|
|
105
|
+
facts: input.facts ?? [],
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
export function measureTextContent(input) {
|
|
109
|
+
const measured = input.adapter({
|
|
110
|
+
text: input.text,
|
|
111
|
+
availableInline: sanitizeNonNegativeInt(input.availableInline, 0),
|
|
112
|
+
direction: normalizeDirection(input.direction),
|
|
113
|
+
wrap: input.wrap ?? 'none',
|
|
114
|
+
});
|
|
115
|
+
return contentExtent('text', measured);
|
|
116
|
+
}
|
|
117
|
+
export function resolveStackLayout(input) {
|
|
118
|
+
const children = [...input.children];
|
|
119
|
+
const assigned = assignedLayoutRect(input.rect);
|
|
120
|
+
const axis = input.axis;
|
|
121
|
+
const direction = normalizeDirection(input.direction);
|
|
122
|
+
const gap = sanitizeNonNegativeInt(input.gap, 0);
|
|
123
|
+
const mainSize = axis === 'inline' ? assigned.inlineSize : assigned.blockSize;
|
|
124
|
+
const crossSize = axis === 'inline' ? assigned.blockSize : assigned.inlineSize;
|
|
125
|
+
const totalGap = gap * Math.max(0, children.length - 1);
|
|
126
|
+
const available = Math.max(0, mainSize - totalGap);
|
|
127
|
+
const sizes = resolveStackTrackSizes(children, available);
|
|
128
|
+
const resolvedChildren = [];
|
|
129
|
+
let cursor = axis === 'inline' ? assigned.inlineStart : assigned.blockStart;
|
|
130
|
+
for (let index = 0; index < children.length; index++) {
|
|
131
|
+
const child = children[index];
|
|
132
|
+
const size = sizes[index] ?? 0;
|
|
133
|
+
const rect = axis === 'inline'
|
|
134
|
+
? {
|
|
135
|
+
inlineStart: cursor,
|
|
136
|
+
blockStart: assigned.blockStart,
|
|
137
|
+
inlineSize: size,
|
|
138
|
+
blockSize: crossSize,
|
|
139
|
+
}
|
|
140
|
+
: {
|
|
141
|
+
inlineStart: assigned.inlineStart,
|
|
142
|
+
blockStart: cursor,
|
|
143
|
+
inlineSize: crossSize,
|
|
144
|
+
blockSize: size,
|
|
145
|
+
};
|
|
146
|
+
const reason = child.track.kind === 'fixed'
|
|
147
|
+
? `stack ${axis} fixed track ${size} cells`
|
|
148
|
+
: `stack ${axis} flex track ${trackWeight(child.track)} resolved by largest-remainder-source-order`;
|
|
149
|
+
resolvedChildren.push(assignLayoutChild(child.envelope, rect, reason));
|
|
150
|
+
cursor += size + (index < children.length - 1 ? gap : 0);
|
|
151
|
+
}
|
|
152
|
+
return Object.freeze({
|
|
153
|
+
id: normalizeRequiredText(input.id, 'stack layout: id is required'),
|
|
154
|
+
role: normalizeRequiredText(input.role, 'stack layout: role is required'),
|
|
155
|
+
axis,
|
|
156
|
+
direction,
|
|
157
|
+
assigned,
|
|
158
|
+
roundingPolicy: 'largest-remainder-source-order',
|
|
159
|
+
children: Object.freeze(resolvedChildren),
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
export function placeInRect(input) {
|
|
163
|
+
const parent = assignedLayoutRect(input.parent);
|
|
164
|
+
const direction = normalizeDirection(input.direction ?? input.envelope.direction);
|
|
165
|
+
const inlineAlign = input.inlineAlign;
|
|
166
|
+
const blockAlign = input.blockAlign;
|
|
167
|
+
const inlineSize = inlineAlign === 'stretch'
|
|
168
|
+
? parent.inlineSize
|
|
169
|
+
: Math.min(parent.inlineSize, sanitizeNonNegativeInt(input.size.inlineSize, 0));
|
|
170
|
+
const blockSize = blockAlign === 'stretch'
|
|
171
|
+
? parent.blockSize
|
|
172
|
+
: Math.min(parent.blockSize, sanitizeNonNegativeInt(input.size.blockSize, 0));
|
|
173
|
+
const inlineOffset = resolveInlineOffset(parent.inlineSize, inlineSize, inlineAlign, direction);
|
|
174
|
+
const blockOffset = resolveBlockOffset(parent.blockSize, blockSize, blockAlign);
|
|
175
|
+
return assignLayoutChild(input.envelope, {
|
|
176
|
+
inlineStart: parent.inlineStart + inlineOffset,
|
|
177
|
+
blockStart: parent.blockStart + blockOffset,
|
|
178
|
+
inlineSize,
|
|
179
|
+
blockSize,
|
|
180
|
+
}, `place ${direction} inline ${inlineAlign} block ${blockAlign}`);
|
|
181
|
+
}
|
|
182
|
+
export function layoutExplanationFacts(envelope) {
|
|
183
|
+
return Object.freeze([
|
|
184
|
+
fact('node.id', envelope.id),
|
|
185
|
+
fact('role', envelope.role),
|
|
186
|
+
fact('direction', envelope.direction),
|
|
187
|
+
fact('constraints.inline', formatRange(envelope.constraints.minInline, envelope.constraints.maxInline)),
|
|
188
|
+
fact('constraints.block', formatRange(envelope.constraints.minBlock, envelope.constraints.maxBlock)),
|
|
189
|
+
fact('preference.inline', formatPreference(envelope.preference.minInline, envelope.preference.preferredInline, envelope.preference.maxInline)),
|
|
190
|
+
fact('preference.block', formatPreference(envelope.preference.minBlock, envelope.preference.preferredBlock, envelope.preference.maxBlock)),
|
|
191
|
+
fact('assigned', [
|
|
192
|
+
`inline-start ${envelope.assigned.inlineStart}`,
|
|
193
|
+
`block-start ${envelope.assigned.blockStart}`,
|
|
194
|
+
`inline-size ${envelope.assigned.inlineSize}`,
|
|
195
|
+
`block-size ${envelope.assigned.blockSize}`,
|
|
196
|
+
].join(' ')),
|
|
197
|
+
fact('reason', envelope.reason),
|
|
198
|
+
]);
|
|
199
|
+
}
|
|
200
|
+
export function layoutExplanationText(envelope) {
|
|
201
|
+
const facts = layoutExplanationFacts(envelope);
|
|
202
|
+
return [
|
|
203
|
+
`node ${envelope.id}`,
|
|
204
|
+
...facts
|
|
205
|
+
.filter((item) => item.key !== 'node.id')
|
|
206
|
+
.map((item) => `${item.key} ${item.value}`),
|
|
207
|
+
].join('\n');
|
|
208
|
+
}
|
|
209
|
+
function contentExtent(source, input) {
|
|
210
|
+
const extent = {
|
|
211
|
+
source,
|
|
212
|
+
inlineSize: sanitizeNonNegativeInt(input.inlineSize, 0),
|
|
213
|
+
blockSize: sanitizeNonNegativeInt(input.blockSize, 0),
|
|
214
|
+
...(input.baseline === undefined ? {} : { baseline: sanitizeNonNegativeInt(input.baseline, 0) }),
|
|
215
|
+
facts: freezeFacts(input.facts ?? []),
|
|
216
|
+
};
|
|
217
|
+
return Object.freeze(extent);
|
|
218
|
+
}
|
|
219
|
+
function resolveStackTrackSizes(children, available) {
|
|
220
|
+
const sizes = new Array(children.length).fill(0);
|
|
221
|
+
let fixed = 0;
|
|
222
|
+
let totalFlex = 0;
|
|
223
|
+
for (let index = 0; index < children.length; index++) {
|
|
224
|
+
const track = children[index].track;
|
|
225
|
+
if (track.kind === 'fixed') {
|
|
226
|
+
const size = sanitizeNonNegativeInt(track.size, 0);
|
|
227
|
+
sizes[index] = size;
|
|
228
|
+
fixed += size;
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
totalFlex += trackWeight(track);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
if (fixed > available) {
|
|
235
|
+
let remaining = available;
|
|
236
|
+
for (let index = 0; index < children.length; index++) {
|
|
237
|
+
if (children[index].track.kind !== 'fixed')
|
|
238
|
+
continue;
|
|
239
|
+
const next = Math.min(sizes[index] ?? 0, remaining);
|
|
240
|
+
sizes[index] = next;
|
|
241
|
+
remaining = Math.max(0, remaining - next);
|
|
242
|
+
}
|
|
243
|
+
return sizes;
|
|
244
|
+
}
|
|
245
|
+
const remaining = Math.max(0, available - fixed);
|
|
246
|
+
if (totalFlex <= 0 || remaining <= 0)
|
|
247
|
+
return sizes;
|
|
248
|
+
let assigned = 0;
|
|
249
|
+
const fractionalShares = [];
|
|
250
|
+
for (let index = 0; index < children.length; index++) {
|
|
251
|
+
const track = children[index].track;
|
|
252
|
+
if (track.kind !== 'flex')
|
|
253
|
+
continue;
|
|
254
|
+
const raw = (remaining * trackWeight(track)) / totalFlex;
|
|
255
|
+
const whole = Math.floor(raw);
|
|
256
|
+
sizes[index] = whole;
|
|
257
|
+
assigned += whole;
|
|
258
|
+
fractionalShares.push({ index, remainder: raw - whole });
|
|
259
|
+
}
|
|
260
|
+
let leftover = remaining - assigned;
|
|
261
|
+
fractionalShares.sort((left, right) => right.remainder - left.remainder || left.index - right.index);
|
|
262
|
+
for (const share of fractionalShares) {
|
|
263
|
+
if (leftover <= 0)
|
|
264
|
+
break;
|
|
265
|
+
sizes[share.index] = (sizes[share.index] ?? 0) + 1;
|
|
266
|
+
leftover -= 1;
|
|
267
|
+
}
|
|
268
|
+
return sizes;
|
|
269
|
+
}
|
|
270
|
+
function trackWeight(track) {
|
|
271
|
+
if (track.kind !== 'flex')
|
|
272
|
+
return 0;
|
|
273
|
+
const weight = track.weight ?? 1;
|
|
274
|
+
if (!Number.isFinite(weight) || weight <= 0)
|
|
275
|
+
return 1;
|
|
276
|
+
return Math.max(1, Math.floor(weight));
|
|
277
|
+
}
|
|
278
|
+
function resolveInlineOffset(parentSize, childSize, align, direction) {
|
|
279
|
+
const remaining = Math.max(0, parentSize - childSize);
|
|
280
|
+
if (align === 'stretch')
|
|
281
|
+
return 0;
|
|
282
|
+
if (align === 'center')
|
|
283
|
+
return Math.floor(remaining / 2);
|
|
284
|
+
if (direction === 'rtl') {
|
|
285
|
+
return align === 'start' ? remaining : 0;
|
|
286
|
+
}
|
|
287
|
+
return align === 'start' ? 0 : remaining;
|
|
288
|
+
}
|
|
289
|
+
function resolveBlockOffset(parentSize, childSize, align) {
|
|
290
|
+
const remaining = Math.max(0, parentSize - childSize);
|
|
291
|
+
if (align === 'stretch' || align === 'start')
|
|
292
|
+
return 0;
|
|
293
|
+
if (align === 'center')
|
|
294
|
+
return Math.floor(remaining / 2);
|
|
295
|
+
return remaining;
|
|
296
|
+
}
|
|
297
|
+
function normalizeBound(value, min) {
|
|
298
|
+
if (value === 'unbounded' || value === undefined)
|
|
299
|
+
return 'unbounded';
|
|
300
|
+
return Math.max(min, sanitizeNonNegativeInt(value, min));
|
|
301
|
+
}
|
|
302
|
+
function normalizePreferred(value, min, max) {
|
|
303
|
+
const preferred = sanitizeNonNegativeInt(value, min);
|
|
304
|
+
if (max === 'unbounded')
|
|
305
|
+
return Math.max(min, preferred);
|
|
306
|
+
return Math.max(min, Math.min(max, preferred));
|
|
307
|
+
}
|
|
308
|
+
function normalizeDirection(direction) {
|
|
309
|
+
return direction ?? 'ltr';
|
|
310
|
+
}
|
|
311
|
+
function normalizeRequiredText(value, message) {
|
|
312
|
+
const normalized = value.trim();
|
|
313
|
+
if (normalized.length === 0)
|
|
314
|
+
throw new Error(message);
|
|
315
|
+
return normalized;
|
|
316
|
+
}
|
|
317
|
+
function freezeFacts(facts) {
|
|
318
|
+
return Object.freeze(facts.map((item) => Object.freeze({
|
|
319
|
+
kind: item.kind,
|
|
320
|
+
key: item.key,
|
|
321
|
+
value: item.value,
|
|
322
|
+
})));
|
|
323
|
+
}
|
|
324
|
+
function fact(key, value) {
|
|
325
|
+
return Object.freeze({ kind: 'layout', key, value });
|
|
326
|
+
}
|
|
327
|
+
function formatRange(min, max) {
|
|
328
|
+
return `${min}..${formatBound(max)}`;
|
|
329
|
+
}
|
|
330
|
+
function formatPreference(min, preferred, max) {
|
|
331
|
+
return `min ${min} preferred ${preferred} max ${formatBound(max)}`;
|
|
332
|
+
}
|
|
333
|
+
function formatBound(bound) {
|
|
334
|
+
return bound === 'unbounded' ? 'unbounded' : String(bound);
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=envelope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../../src/core/layout/envelope.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { OutputMode } from './detect/tty.js';
|
|
2
|
+
export type ModeLoweringFactKind = 'entity' | 'edge' | 'count' | 'label' | 'state' | 'custom';
|
|
3
|
+
export type ModeLoweringFactValue = string | number | boolean;
|
|
4
|
+
export interface ModeLoweringFact {
|
|
5
|
+
readonly kind: ModeLoweringFactKind;
|
|
6
|
+
readonly key: string;
|
|
7
|
+
readonly value?: ModeLoweringFactValue;
|
|
8
|
+
readonly label?: string;
|
|
9
|
+
readonly required?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface ModeLoweringModeFacts {
|
|
12
|
+
readonly mode: OutputMode;
|
|
13
|
+
readonly facts: readonly ModeLoweringFact[];
|
|
14
|
+
}
|
|
15
|
+
export type ModeLoweringSeverity = 'warning' | 'error';
|
|
16
|
+
export type ModeLoweringIssueKind = 'missing-required-fact' | 'mismatched-fact-value' | 'duplicate-fact' | 'custom-assertion-failed';
|
|
17
|
+
export interface ModeLoweringIssue {
|
|
18
|
+
readonly kind: ModeLoweringIssueKind;
|
|
19
|
+
readonly severity: ModeLoweringSeverity;
|
|
20
|
+
readonly mode?: OutputMode;
|
|
21
|
+
readonly baselineMode?: OutputMode;
|
|
22
|
+
readonly factKind?: ModeLoweringFactKind;
|
|
23
|
+
readonly key?: string;
|
|
24
|
+
readonly expected?: ModeLoweringFactValue;
|
|
25
|
+
readonly actual?: ModeLoweringFactValue;
|
|
26
|
+
readonly message: string;
|
|
27
|
+
}
|
|
28
|
+
export interface ModeLoweringAssertionResult {
|
|
29
|
+
readonly passed: boolean;
|
|
30
|
+
readonly message: string;
|
|
31
|
+
readonly mode?: OutputMode;
|
|
32
|
+
readonly key?: string;
|
|
33
|
+
readonly severity?: ModeLoweringSeverity;
|
|
34
|
+
}
|
|
35
|
+
export interface ModeLoweringOptions {
|
|
36
|
+
readonly baselineMode?: OutputMode;
|
|
37
|
+
readonly modes: readonly ModeLoweringModeFacts[];
|
|
38
|
+
readonly assertions?: readonly ModeLoweringAssertionResult[];
|
|
39
|
+
}
|
|
40
|
+
export interface ModeLoweringReport {
|
|
41
|
+
readonly baselineMode: OutputMode;
|
|
42
|
+
readonly checkedModes: readonly OutputMode[];
|
|
43
|
+
readonly issues: readonly ModeLoweringIssue[];
|
|
44
|
+
readonly passed: boolean;
|
|
45
|
+
}
|
|
46
|
+
export declare function lintModeLowering(options: ModeLoweringOptions): ModeLoweringReport;
|
|
47
|
+
export declare function modeLoweringReportText(report: ModeLoweringReport): string;
|
|
48
|
+
//# sourceMappingURL=mode-lowering.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mode-lowering.d.ts","sourceRoot":"","sources":["../../src/core/mode-lowering.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,MAAM,oBAAoB,GAC5B,QAAQ,GACR,MAAM,GACN,OAAO,GACP,OAAO,GACP,OAAO,GACP,QAAQ,CAAC;AAEb,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE9D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,qBAAqB,CAAC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;CAC7C;AAED,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,OAAO,CAAC;AAEvD,MAAM,MAAM,qBAAqB,GAC7B,uBAAuB,GACvB,uBAAuB,GACvB,gBAAgB,GAChB,yBAAyB,CAAC;AAE9B,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IACzC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,qBAAqB,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,oBAAoB,CAAC;CAC1C;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACjD,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,2BAA2B,EAAE,CAAC;CAC9D;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,SAAS,UAAU,EAAE,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAQD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,GAAG,kBAAkB,CAgDjF;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAiBzE"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
const DEFAULT_BASELINE_MODE = 'interactive';
|
|
2
|
+
const MODE_ORDER = ['interactive', 'static', 'pipe', 'accessible'];
|
|
3
|
+
const FACT_SEPARATOR = ':';
|
|
4
|
+
const LIST_SEPARATOR = ',';
|
|
5
|
+
const EMPTY_LABEL = '-';
|
|
6
|
+
export function lintModeLowering(options) {
|
|
7
|
+
const modes = [...options.modes].sort(compareModeFacts);
|
|
8
|
+
const modeNames = modes.map((modeFacts) => modeFacts.mode);
|
|
9
|
+
const modeFactsByMode = new Map();
|
|
10
|
+
for (const modeFacts of modes) {
|
|
11
|
+
modeFactsByMode.set(modeFacts.mode, modeFacts);
|
|
12
|
+
}
|
|
13
|
+
const baselineMode = resolveBaselineMode(options.baselineMode, modeFactsByMode, modes);
|
|
14
|
+
const baselineFacts = modeFactsByMode.get(baselineMode)?.facts ?? [];
|
|
15
|
+
const issues = [];
|
|
16
|
+
for (const modeFacts of modes) {
|
|
17
|
+
issues.push(...duplicateFactIssues(modeFacts));
|
|
18
|
+
}
|
|
19
|
+
for (const modeFacts of modes) {
|
|
20
|
+
if (modeFacts.mode === baselineMode) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
issues.push(...compareAgainstBaseline({
|
|
24
|
+
baselineMode,
|
|
25
|
+
baselineFacts,
|
|
26
|
+
modeFacts,
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
for (const assertion of options.assertions ?? []) {
|
|
30
|
+
if (assertion.passed) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
issues.push({
|
|
34
|
+
kind: 'custom-assertion-failed',
|
|
35
|
+
severity: assertion.severity ?? 'error',
|
|
36
|
+
mode: assertion.mode,
|
|
37
|
+
key: assertion.key,
|
|
38
|
+
message: assertion.message,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
baselineMode,
|
|
43
|
+
checkedModes: modeNames,
|
|
44
|
+
issues,
|
|
45
|
+
passed: issues.length === 0,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export function modeLoweringReportText(report) {
|
|
49
|
+
const status = report.passed ? 'passed' : 'failed';
|
|
50
|
+
const checked = report.checkedModes.length === 0
|
|
51
|
+
? EMPTY_LABEL
|
|
52
|
+
: report.checkedModes.join(LIST_SEPARATOR);
|
|
53
|
+
const lines = [`mode lowering: ${status} baseline=${report.baselineMode} checked=${checked}`];
|
|
54
|
+
if (report.issues.length === 0) {
|
|
55
|
+
return lines.join('\n');
|
|
56
|
+
}
|
|
57
|
+
lines.push('issues:');
|
|
58
|
+
for (const issue of report.issues) {
|
|
59
|
+
lines.push(`- ${issue.severity} ${issue.kind}${issueModeText(issue)}${issueFactText(issue)}: ${issue.message}`);
|
|
60
|
+
}
|
|
61
|
+
return lines.join('\n');
|
|
62
|
+
}
|
|
63
|
+
function compareAgainstBaseline(options) {
|
|
64
|
+
const issues = [];
|
|
65
|
+
const factsByIdentity = firstFactsByIdentity(options.modeFacts.facts);
|
|
66
|
+
for (const baselineFact of options.baselineFacts) {
|
|
67
|
+
if (baselineFact.required === false) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const candidate = factsByIdentity.get(factIdentity(baselineFact));
|
|
71
|
+
if (candidate === undefined) {
|
|
72
|
+
issues.push(missingFactIssue(options.baselineMode, options.modeFacts.mode, baselineFact));
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (factValueDiffers(baselineFact, candidate)) {
|
|
76
|
+
issues.push(mismatchedFactIssue(options.baselineMode, options.modeFacts.mode, baselineFact, candidate));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return issues;
|
|
80
|
+
}
|
|
81
|
+
function duplicateFactIssues(modeFacts) {
|
|
82
|
+
const seenIdentities = new Set();
|
|
83
|
+
const duplicateIdentities = new Set();
|
|
84
|
+
const issues = [];
|
|
85
|
+
for (const fact of modeFacts.facts) {
|
|
86
|
+
const identity = factIdentity(fact);
|
|
87
|
+
if (!seenIdentities.has(identity)) {
|
|
88
|
+
seenIdentities.add(identity);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (duplicateIdentities.has(identity)) {
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
duplicateIdentities.add(identity);
|
|
95
|
+
issues.push({
|
|
96
|
+
kind: 'duplicate-fact',
|
|
97
|
+
severity: 'warning',
|
|
98
|
+
mode: modeFacts.mode,
|
|
99
|
+
factKind: fact.kind,
|
|
100
|
+
key: fact.key,
|
|
101
|
+
message: `${modeFacts.mode} has duplicate ${fact.kind} ${fact.key}`,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
return issues;
|
|
105
|
+
}
|
|
106
|
+
function missingFactIssue(baselineMode, mode, fact) {
|
|
107
|
+
return {
|
|
108
|
+
kind: 'missing-required-fact',
|
|
109
|
+
severity: 'error',
|
|
110
|
+
mode,
|
|
111
|
+
baselineMode,
|
|
112
|
+
factKind: fact.kind,
|
|
113
|
+
key: fact.key,
|
|
114
|
+
message: `${mode} is missing required ${fact.kind} ${fact.key} from ${baselineMode}`,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
function mismatchedFactIssue(baselineMode, mode, expected, actual) {
|
|
118
|
+
return {
|
|
119
|
+
kind: 'mismatched-fact-value',
|
|
120
|
+
severity: 'error',
|
|
121
|
+
mode,
|
|
122
|
+
baselineMode,
|
|
123
|
+
factKind: expected.kind,
|
|
124
|
+
key: expected.key,
|
|
125
|
+
expected: expected.value,
|
|
126
|
+
actual: actual.value,
|
|
127
|
+
message: `${mode} ${expected.kind} ${expected.key} differs from ${baselineMode}: expected ${formatFactValue(expected.value)}, got ${formatFactValue(actual.value)}`,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function firstFactsByIdentity(facts) {
|
|
131
|
+
const factsByIdentity = new Map();
|
|
132
|
+
for (const fact of facts) {
|
|
133
|
+
const identity = factIdentity(fact);
|
|
134
|
+
if (!factsByIdentity.has(identity)) {
|
|
135
|
+
factsByIdentity.set(identity, fact);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return factsByIdentity;
|
|
139
|
+
}
|
|
140
|
+
function factIdentity(fact) {
|
|
141
|
+
return `${fact.kind}${FACT_SEPARATOR}${fact.key}`;
|
|
142
|
+
}
|
|
143
|
+
function factValueDiffers(expected, actual) {
|
|
144
|
+
if (expected.value === undefined) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
return expected.value !== actual.value;
|
|
148
|
+
}
|
|
149
|
+
function resolveBaselineMode(requestedMode, modeFactsByMode, modes) {
|
|
150
|
+
if (requestedMode !== undefined) {
|
|
151
|
+
return requestedMode;
|
|
152
|
+
}
|
|
153
|
+
if (modeFactsByMode.has(DEFAULT_BASELINE_MODE)) {
|
|
154
|
+
return DEFAULT_BASELINE_MODE;
|
|
155
|
+
}
|
|
156
|
+
return modes[0]?.mode ?? DEFAULT_BASELINE_MODE;
|
|
157
|
+
}
|
|
158
|
+
function compareModeFacts(a, b) {
|
|
159
|
+
return modeRank(a.mode) - modeRank(b.mode);
|
|
160
|
+
}
|
|
161
|
+
function modeRank(mode) {
|
|
162
|
+
return MODE_ORDER.indexOf(mode);
|
|
163
|
+
}
|
|
164
|
+
function issueModeText(issue) {
|
|
165
|
+
return issue.mode === undefined ? '' : ` mode=${issue.mode}`;
|
|
166
|
+
}
|
|
167
|
+
function issueFactText(issue) {
|
|
168
|
+
if (issue.factKind === undefined || issue.key === undefined) {
|
|
169
|
+
return '';
|
|
170
|
+
}
|
|
171
|
+
return ` fact=${issue.factKind}${FACT_SEPARATOR}${issue.key}`;
|
|
172
|
+
}
|
|
173
|
+
function formatFactValue(value) {
|
|
174
|
+
return value === undefined ? EMPTY_LABEL : String(value);
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=mode-lowering.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mode-lowering.js","sourceRoot":"","sources":["../../src/core/mode-lowering.ts"],"names":[],"mappings":"AAkEA,MAAM,qBAAqB,GAAe,aAAa,CAAC;AACxD,MAAM,UAAU,GAA0B,CAAC,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;AAC1F,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,MAAM,WAAW,GAAG,GAAG,CAAC;AAExB,MAAM,UAAU,gBAAgB,CAAC,OAA4B;IAC3D,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC3D,MAAM,eAAe,GAAG,IAAI,GAAG,EAAqC,CAAC;IACrE,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;QAC9B,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,YAAY,GAAG,mBAAmB,CAAC,OAAO,CAAC,YAAY,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;IACvF,MAAM,aAAa,GAAG,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;IACrE,MAAM,MAAM,GAAwB,EAAE,CAAC;IAEvC,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;QAC9B,IAAI,SAAS,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACpC,SAAS;QACX,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC;YACpC,YAAY;YACZ,aAAa;YACb,SAAS;SACV,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;QACjD,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;YACrB,SAAS;QACX,CAAC;QAED,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,yBAAyB;YAC/B,QAAQ,EAAE,SAAS,CAAC,QAAQ,IAAI,OAAO;YACvC,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,GAAG,EAAE,SAAS,CAAC,GAAG;YAClB,OAAO,EAAE,SAAS,CAAC,OAAO;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,YAAY;QACZ,YAAY,EAAE,SAAS;QACvB,MAAM;QACN,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;KAC5B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAA0B;IAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IACnD,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;QAC9C,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,CAAC,kBAAkB,MAAM,aAAa,MAAM,CAAC,YAAY,YAAY,OAAO,EAAE,CAAC,CAAC;IAE9F,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAClH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAQD,SAAS,sBAAsB,CAAC,OAA+B;IAC7D,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,MAAM,eAAe,GAAG,oBAAoB,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACtE,KAAK,MAAM,YAAY,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QACjD,IAAI,YAAY,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;YACpC,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC;QAClE,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;YAC1F,SAAS;QACX,CAAC;QAED,IAAI,gBAAgB,CAAC,YAAY,EAAE,SAAS,CAAC,EAAE,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC;QAC1G,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,mBAAmB,CAAC,SAAgC;IAC3D,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IACzC,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9C,MAAM,MAAM,GAAwB,EAAE,CAAC;IAEvC,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC7B,SAAS;QACX,CAAC;QAED,IAAI,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtC,SAAS;QACX,CAAC;QAED,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,gBAAgB;YACtB,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,GAAG,SAAS,CAAC,IAAI,kBAAkB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE;SACpE,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CACvB,YAAwB,EACxB,IAAgB,EAChB,IAAsB;IAEtB,OAAO;QACL,IAAI,EAAE,uBAAuB;QAC7B,QAAQ,EAAE,OAAO;QACjB,IAAI;QACJ,YAAY;QACZ,QAAQ,EAAE,IAAI,CAAC,IAAI;QACnB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,OAAO,EAAE,GAAG,IAAI,wBAAwB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,SAAS,YAAY,EAAE;KACrF,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,YAAwB,EACxB,IAAgB,EAChB,QAA0B,EAC1B,MAAwB;IAExB,OAAO;QACL,IAAI,EAAE,uBAAuB;QAC7B,QAAQ,EAAE,OAAO;QACjB,IAAI;QACJ,YAAY;QACZ,QAAQ,EAAE,QAAQ,CAAC,IAAI;QACvB,GAAG,EAAE,QAAQ,CAAC,GAAG;QACjB,QAAQ,EAAE,QAAQ,CAAC,KAAK;QACxB,MAAM,EAAE,MAAM,CAAC,KAAK;QACpB,OAAO,EAAE,GAAG,IAAI,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,GAAG,iBAAiB,YAAY,cAAc,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;KACpK,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAkC;IAC9D,MAAM,eAAe,GAAG,IAAI,GAAG,EAA4B,CAAC;IAC5D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,SAAS,YAAY,CAAC,IAAsB;IAC1C,OAAO,GAAG,IAAI,CAAC,IAAI,GAAG,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,gBAAgB,CAAC,QAA0B,EAAE,MAAwB;IAC5E,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,QAAQ,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC;AACzC,CAAC;AAED,SAAS,mBAAmB,CAC1B,aAAqC,EACrC,eAA+D,EAC/D,KAAuC;IAEvC,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,IAAI,eAAe,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,CAAC;QAC/C,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IAED,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,qBAAqB,CAAC;AACjD,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAwB,EAAE,CAAwB;IAC1E,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,QAAQ,CAAC,IAAgB;IAChC,OAAO,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,aAAa,CAAC,KAAwB;IAC7C,OAAO,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,IAAI,EAAE,CAAC;AAC/D,CAAC;AAED,SAAS,aAAa,CAAC,KAAwB;IAC7C,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC5D,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,SAAS,KAAK,CAAC,QAAQ,GAAG,cAAc,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;AAChE,CAAC;AAED,SAAS,eAAe,CAAC,KAAwC;IAC/D,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { type BlockDefinition, type BlockRenderInput } from './block-metadata.js';
|
|
2
|
+
import type { BindingFact, BindingIssueSeverity, DeepReadonly } from './binding.js';
|
|
3
|
+
declare const BLOCK_SCHEMA_ADAPTER_BRAND: unique symbol;
|
|
4
|
+
declare const SCHEMA_BOUND_BLOCK_BRAND: unique symbol;
|
|
5
|
+
export interface BlockSchemaIssue {
|
|
6
|
+
readonly severity: BindingIssueSeverity;
|
|
7
|
+
readonly code: string;
|
|
8
|
+
readonly message: string;
|
|
9
|
+
readonly path?: string;
|
|
10
|
+
}
|
|
11
|
+
export type BlockSchemaResult<Data> = {
|
|
12
|
+
readonly ok: true;
|
|
13
|
+
readonly data: DeepReadonly<Data>;
|
|
14
|
+
} | {
|
|
15
|
+
readonly ok: false;
|
|
16
|
+
readonly issues: readonly BlockSchemaIssue[];
|
|
17
|
+
};
|
|
18
|
+
export interface BlockSchemaDescription {
|
|
19
|
+
readonly requiredFields?: readonly string[];
|
|
20
|
+
readonly optionalFields?: readonly string[];
|
|
21
|
+
readonly redactedFields?: readonly string[];
|
|
22
|
+
readonly facts?: readonly BindingFact[];
|
|
23
|
+
}
|
|
24
|
+
export interface BlockSchemaAdapterInput<Data> {
|
|
25
|
+
readonly id: string;
|
|
26
|
+
readonly parse: (input: unknown) => BlockSchemaResult<Data>;
|
|
27
|
+
readonly describe?: () => BlockSchemaDescription;
|
|
28
|
+
}
|
|
29
|
+
export interface BlockSchemaAdapter<Data = unknown> {
|
|
30
|
+
readonly [BLOCK_SCHEMA_ADAPTER_BRAND]: true;
|
|
31
|
+
readonly id: string;
|
|
32
|
+
readonly parse: (input: unknown) => BlockSchemaResult<Data>;
|
|
33
|
+
readonly describe?: () => BlockSchemaDescription;
|
|
34
|
+
}
|
|
35
|
+
export type SchemaBlockBindOutput<Config = unknown> = BlockRenderInput<Config> | {
|
|
36
|
+
readonly input: BlockRenderInput<Config>;
|
|
37
|
+
readonly facts?: readonly BindingFact[];
|
|
38
|
+
};
|
|
39
|
+
export interface SchemaBoundBlockDefinitionInput<Data = unknown, Config = unknown, Output = unknown> {
|
|
40
|
+
readonly block: BlockDefinition<Config, Output>;
|
|
41
|
+
readonly schema: BlockSchemaAdapter<Data>;
|
|
42
|
+
readonly bind: (data: DeepReadonly<Data>) => SchemaBlockBindOutput<Config>;
|
|
43
|
+
}
|
|
44
|
+
export interface SchemaBoundBlockDefinition<Data = unknown, Config = unknown, Output = unknown> extends SchemaBoundBlockDefinitionInput<Data, Config, Output> {
|
|
45
|
+
readonly [SCHEMA_BOUND_BLOCK_BRAND]: true;
|
|
46
|
+
}
|
|
47
|
+
export type SchemaBlockBindResult<Config = unknown> = {
|
|
48
|
+
readonly ok: true;
|
|
49
|
+
readonly input: DeepReadonly<BlockRenderInput<Config>>;
|
|
50
|
+
readonly facts: readonly BindingFact[];
|
|
51
|
+
} | {
|
|
52
|
+
readonly ok: false;
|
|
53
|
+
readonly issues: readonly BlockSchemaIssue[];
|
|
54
|
+
readonly facts: readonly BindingFact[];
|
|
55
|
+
};
|
|
56
|
+
export declare function defineBlockSchemaAdapter<Data>(input: BlockSchemaAdapterInput<Data>): BlockSchemaAdapter<Data>;
|
|
57
|
+
export declare function isBlockSchemaAdapter(value: unknown): value is BlockSchemaAdapter;
|
|
58
|
+
export declare function parseBlockSchema<Data>(schema: BlockSchemaAdapter<Data>, input: unknown): BlockSchemaResult<Data>;
|
|
59
|
+
export declare function defineSchemaBlock<Data = unknown, Config = unknown, Output = unknown>(input: SchemaBoundBlockDefinitionInput<Data, Config, Output>): SchemaBoundBlockDefinition<Data, Config, Output>;
|
|
60
|
+
export declare function isSchemaBoundBlockDefinition(value: unknown): value is SchemaBoundBlockDefinition;
|
|
61
|
+
export declare function bindSchemaBlockInput<Data = unknown, Config = unknown, Output = unknown>(block: SchemaBoundBlockDefinition<Data, Config, Output>, input: unknown): SchemaBlockBindResult<Config>;
|
|
62
|
+
export {};
|
|
63
|
+
//# sourceMappingURL=schema-block.d.ts.map
|