@nubbin/core 0.1.0-rc.5 → 0.1.0-rc.7
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/dist/index.d.ts +238 -62
- package/dist/index.js +602 -137
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { StandardSchemaV1 } from '@standard-schema/spec';
|
|
1
|
+
import { StandardSchemaV1, StandardJSONSchemaV1 } from '@standard-schema/spec';
|
|
2
2
|
|
|
3
3
|
type FieldKind = "string" | "number" | "boolean" | "enum" | "array" | "object" | "union" | "unknown";
|
|
4
4
|
interface FieldNode {
|
|
@@ -45,43 +45,9 @@ interface Block<Schema extends StandardSchemaV1 = StandardSchemaV1, Component =
|
|
|
45
45
|
component: Component;
|
|
46
46
|
/** Bumped when the schema changes incompatibly. */
|
|
47
47
|
version: number;
|
|
48
|
-
/** A deprecated block still resolves; the studio hides it from the palette. */
|
|
49
|
-
status?: "active" | "deprecated";
|
|
50
48
|
slots: Record<string, SlotConstraint>;
|
|
51
|
-
/** Same-node prop reshaping only. It cannot touch slots, or split or delete a block. */
|
|
52
|
-
migrate?: Record<number, (props: UnknownProps) => UnknownProps>;
|
|
53
49
|
}
|
|
54
50
|
|
|
55
|
-
/** How a field's value resolves at render. Absent means static — the value freezes into props. */
|
|
56
|
-
type FieldHintData = "request" | {
|
|
57
|
-
revalidate: number;
|
|
58
|
-
};
|
|
59
|
-
/**
|
|
60
|
-
* Studio treatment for one schema path. Open by design: control resolution ranks testers over
|
|
61
|
-
* these hints, so a consumer can carry keys core does not read.
|
|
62
|
-
*/
|
|
63
|
-
interface FieldHint {
|
|
64
|
-
label?: string;
|
|
65
|
-
control?: string;
|
|
66
|
-
data?: FieldHintData;
|
|
67
|
-
}
|
|
68
|
-
interface BlockUi {
|
|
69
|
-
/** Keyed by schema path (`title`, `cta.label`, `items[].icon`). Unresolvable paths fail registration. */
|
|
70
|
-
fields?: Record<string, FieldHint>;
|
|
71
|
-
}
|
|
72
|
-
interface BlockDocs {
|
|
73
|
-
summary?: string;
|
|
74
|
-
usage?: string;
|
|
75
|
-
}
|
|
76
|
-
/** Serializable data only — what the studio and CI read. Components live in the registry. */
|
|
77
|
-
interface CatalogEntry {
|
|
78
|
-
schema: unknown;
|
|
79
|
-
ui?: BlockUi;
|
|
80
|
-
defaults?: UnknownProps;
|
|
81
|
-
docs?: BlockDocs;
|
|
82
|
-
}
|
|
83
|
-
type Catalog = Record<string, CatalogEntry>;
|
|
84
|
-
|
|
85
51
|
interface DocumentMeta {
|
|
86
52
|
title: string;
|
|
87
53
|
description?: string;
|
|
@@ -99,13 +65,57 @@ interface Node {
|
|
|
99
65
|
interface DocumentVersion {
|
|
100
66
|
documentId: string;
|
|
101
67
|
version: number;
|
|
102
|
-
|
|
68
|
+
/**
|
|
69
|
+
* Ordered entry elements — the artifact's tree is these, denormalized, in this order. See
|
|
70
|
+
* [A document has many roots](../../../docs/decisions/a-document-has-many-roots.md).
|
|
71
|
+
*/
|
|
72
|
+
roots: readonly string[];
|
|
103
73
|
elements: Record<string, Node>;
|
|
104
74
|
meta: DocumentMeta;
|
|
105
75
|
createdAt: string;
|
|
106
76
|
createdBy: string;
|
|
107
77
|
}
|
|
108
78
|
|
|
79
|
+
/**
|
|
80
|
+
* Places a node in a parent's slot: a new `DocumentVersion` with the node registered and the
|
|
81
|
+
* slot's order rewritten, copy-on-write, every other node untouched by reference.
|
|
82
|
+
*
|
|
83
|
+
* `node.id` arrives already minted. `core` runs in a browser, a worker and a build step, and a
|
|
84
|
+
* generator inside it would make the same composition produce a different document every time —
|
|
85
|
+
* so the caller mints, and the two things this can still check are the parent it names and the
|
|
86
|
+
* id it brings.
|
|
87
|
+
*
|
|
88
|
+
* Slot legality is not one of them. Whether the block belongs in that slot, and whether the slot
|
|
89
|
+
* is now over its `max`, is `compile`'s judgment — the same division `setNodeProp` follows for a
|
|
90
|
+
* prop's validity, and what lets a document be illegal between two edits that end legal.
|
|
91
|
+
*
|
|
92
|
+
* `index` inserts; its absence appends.
|
|
93
|
+
*/
|
|
94
|
+
declare function addNode(version: DocumentVersion, parentId: string, slot: string, node: Node, index?: number): DocumentVersion;
|
|
95
|
+
|
|
96
|
+
/** How a field's value resolves at render. Absent means static — the value freezes into props. */
|
|
97
|
+
type FieldHintData = {
|
|
98
|
+
revalidate: number;
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* Studio treatment for one schema path. Open by design: a consumer may carry keys core does not
|
|
102
|
+
* read, and core reads exactly one — how the field resolves.
|
|
103
|
+
*/
|
|
104
|
+
interface FieldHint {
|
|
105
|
+
data?: FieldHintData;
|
|
106
|
+
}
|
|
107
|
+
interface BlockUi {
|
|
108
|
+
/** Keyed by schema path (`title`, `cta.label`, `items[].icon`). Unresolvable paths fail registration. */
|
|
109
|
+
fields?: Record<string, FieldHint>;
|
|
110
|
+
}
|
|
111
|
+
/** Serializable data only — what the studio and CI read. Components live in the registry. */
|
|
112
|
+
interface CatalogEntry {
|
|
113
|
+
schema: unknown;
|
|
114
|
+
ui?: BlockUi;
|
|
115
|
+
defaults?: UnknownProps;
|
|
116
|
+
}
|
|
117
|
+
type Catalog = Record<string, CatalogEntry>;
|
|
118
|
+
|
|
109
119
|
/** Field path → how the field resolves at render. */
|
|
110
120
|
type Holes = Record<string, FieldHintData>;
|
|
111
121
|
/** Resolved — no lookups, no dangling references possible. */
|
|
@@ -124,7 +134,6 @@ interface Artifact {
|
|
|
124
134
|
route: string;
|
|
125
135
|
documentId: string;
|
|
126
136
|
documentVersion: number;
|
|
127
|
-
registryFingerprint: string;
|
|
128
137
|
/** What this was compiled against — only the blocks the document uses. */
|
|
129
138
|
blockVersions: Record<string, number>;
|
|
130
139
|
tree: ArtifactNode[];
|
|
@@ -154,21 +163,6 @@ interface ArtifactStore {
|
|
|
154
163
|
unpublish(route: string): Promise<void>;
|
|
155
164
|
}
|
|
156
165
|
|
|
157
|
-
type CompileIssueCode = "unknown-block" | "dangling-child" | "cycle" | "unreachable" | "slot-not-allowed" | "slot-min" | "slot-max" | "invalid-props";
|
|
158
|
-
interface CompileIssue {
|
|
159
|
-
nodeId: string;
|
|
160
|
-
/** Where in the node the problem sits: `block`, `slots.items`, or a dotted prop path. */
|
|
161
|
-
path: string;
|
|
162
|
-
code: CompileIssueCode;
|
|
163
|
-
message: string;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/** Carries every issue found in one pass, so an author fixing six problems sees six. */
|
|
167
|
-
declare class CompileError extends Error {
|
|
168
|
-
readonly issues: readonly CompileIssue[];
|
|
169
|
-
constructor(issues: readonly CompileIssue[]);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
166
|
/** One route pointer and the artifact it names, as an adapter read them. */
|
|
173
167
|
interface LiveRoute {
|
|
174
168
|
pointer: RoutePointer;
|
|
@@ -207,8 +201,6 @@ interface CompatibilityReport {
|
|
|
207
201
|
interface Registry {
|
|
208
202
|
get(name: string): Block | undefined;
|
|
209
203
|
names(): string[];
|
|
210
|
-
/** Hash of every block name and version. Nothing else. */
|
|
211
|
-
fingerprint(): string;
|
|
212
204
|
}
|
|
213
205
|
|
|
214
206
|
/**
|
|
@@ -236,17 +228,96 @@ type RollbackCheck = {
|
|
|
236
228
|
*/
|
|
237
229
|
declare function checkRollback(artifact: Artifact, registry: Registry): RollbackCheck;
|
|
238
230
|
|
|
231
|
+
/**
|
|
232
|
+
* Every reason Nubbin refuses something, as a value a consumer can key off rather than a string
|
|
233
|
+
* they have to match. Each member's value is its own name in kebab-case, so a serialized issue
|
|
234
|
+
* reads the same in a log as it does in code.
|
|
235
|
+
*
|
|
236
|
+
* A const object rather than a TypeScript `enum`: it yields the same two things — a value to
|
|
237
|
+
* branch on and a type to check against — without the runtime object an `enum` emits, and `core`
|
|
238
|
+
* has to run unchanged in a browser, a worker and a build step.
|
|
239
|
+
*
|
|
240
|
+
* Closed on purpose. A new refusal is a new member here, which is what makes the reference page
|
|
241
|
+
* listing them checkable against this file.
|
|
242
|
+
*/
|
|
243
|
+
declare const NubbinIssueCode: {
|
|
244
|
+
readonly BlockVersion: "block-version";
|
|
245
|
+
readonly SlotBounds: "slot-bounds";
|
|
246
|
+
readonly SlotAllowUnknown: "slot-allow-unknown";
|
|
247
|
+
readonly DuplicateBlockName: "duplicate-block-name";
|
|
248
|
+
readonly InvalidDefaults: "invalid-defaults";
|
|
249
|
+
readonly HintPathUnresolvable: "hint-path-unresolvable";
|
|
250
|
+
readonly HintNotAddressable: "hint-not-addressable";
|
|
251
|
+
readonly NotStandardSchema: "not-standard-schema";
|
|
252
|
+
readonly NoJsonSchema: "no-json-schema";
|
|
253
|
+
readonly NoRoots: "no-roots";
|
|
254
|
+
readonly UnknownBlock: "unknown-block";
|
|
255
|
+
readonly DanglingChild: "dangling-child";
|
|
256
|
+
readonly Cycle: "cycle";
|
|
257
|
+
readonly Unreachable: "unreachable";
|
|
258
|
+
readonly SlotNotAllowed: "slot-not-allowed";
|
|
259
|
+
readonly SlotMin: "slot-min";
|
|
260
|
+
readonly SlotMax: "slot-max";
|
|
261
|
+
readonly InvalidProps: "invalid-props";
|
|
262
|
+
readonly UnknownProp: "unknown-prop";
|
|
263
|
+
readonly NoSuchNode: "no-such-node";
|
|
264
|
+
readonly DuplicateNodeId: "duplicate-node-id";
|
|
265
|
+
readonly PathNotAddressable: "path-not-addressable";
|
|
266
|
+
readonly InvalidRoute: "invalid-route";
|
|
267
|
+
readonly BlockNotLoaded: "block-not-loaded";
|
|
268
|
+
readonly NoHoleResolver: "no-hole-resolver";
|
|
269
|
+
readonly NotOneHostElement: "not-one-host-element";
|
|
270
|
+
readonly ArtifactNotStored: "artifact-not-stored";
|
|
271
|
+
};
|
|
272
|
+
/** The value of any member, for a consumer narrowing on `issue.code`. */
|
|
273
|
+
type NubbinIssueCode = (typeof NubbinIssueCode)[keyof typeof NubbinIssueCode];
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* One reason Nubbin refused something. The shape every refusal takes, whether it was thrown or
|
|
277
|
+
* returned, so a consumer writes one handler and serializes one thing.
|
|
278
|
+
*
|
|
279
|
+
* `code` is for branching and `message` is for reading — the prose says what a person needs and
|
|
280
|
+
* the code says what a program can act on, and neither is asked to do the other's job.
|
|
281
|
+
*
|
|
282
|
+
* `at` and `path` are two coordinates rather than one string because an editing surface needs
|
|
283
|
+
* both: `at` names the thing to select — a node, a block, a route — and `path` names where
|
|
284
|
+
* inside it to highlight. Joining them into prose would leave a studio parsing its own error
|
|
285
|
+
* messages to find the field an author has to fix.
|
|
286
|
+
*/
|
|
287
|
+
interface NubbinIssue {
|
|
288
|
+
code: NubbinIssueCode;
|
|
289
|
+
message: string;
|
|
290
|
+
/** What it concerns: a node id, a block name, or a route. */
|
|
291
|
+
at?: string;
|
|
292
|
+
/** Where within that: a dotted prop path, `slots.items`, or `block`. */
|
|
293
|
+
path?: string;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* What `compile` produces: the artifact, and everything it has to say about the document that
|
|
298
|
+
* did not stop it producing one.
|
|
299
|
+
*
|
|
300
|
+
* The two travel together because the split is not severity, it is whether an artifact exists.
|
|
301
|
+
* A document the schema refuses has none, and `compile` throws; a document carrying a key the
|
|
302
|
+
* schema did not declare has a perfectly good one, and what became of that key is the consumer's
|
|
303
|
+
* to log, ship, or ignore.
|
|
304
|
+
*/
|
|
305
|
+
interface CompileResult {
|
|
306
|
+
artifact: Artifact;
|
|
307
|
+
issues: readonly NubbinIssue[];
|
|
308
|
+
}
|
|
309
|
+
|
|
239
310
|
/**
|
|
240
311
|
* Orchestration only. Structure first, and stop there if it failed — prop validation on a
|
|
241
312
|
* document with dangling references produces cascading noise that buries the real cause.
|
|
313
|
+
*
|
|
314
|
+
* The route is judged before any of it, because it is baked into the artifact and into the
|
|
315
|
+
* content address: an unaddressable route would otherwise compile, hash, and store cleanly, and
|
|
316
|
+
* only fail to match a request once it was live.
|
|
242
317
|
*/
|
|
243
|
-
declare function compile(version: DocumentVersion, catalog: Catalog, registry: Registry, route: string):
|
|
318
|
+
declare function compile(version: DocumentVersion, catalog: Catalog, registry: Registry, route: string): CompileResult;
|
|
244
319
|
|
|
245
320
|
/**
|
|
246
|
-
* Sorted by name so registration order cannot change the fingerprint, and built from name and
|
|
247
|
-
* version alone so unrelated edits — a slot constraint, a deprecation — do not invalidate every
|
|
248
|
-
* artifact compiled before them.
|
|
249
|
-
*
|
|
250
321
|
* Slot `allow` lists resolve once the whole array is ingested, so a block may name a sibling
|
|
251
322
|
* registered after it.
|
|
252
323
|
*/
|
|
@@ -255,8 +326,7 @@ declare function createRegistry(blocks: readonly Block[]): Registry;
|
|
|
255
326
|
/**
|
|
256
327
|
* Identity at runtime; its job is to fix the generic parameters at the call site so props are
|
|
257
328
|
* inferred from the schema rather than declared beside it. The checks here are the ones the
|
|
258
|
-
* type system cannot make — a slot that no composition could satisfy
|
|
259
|
-
* a version this block never reaches.
|
|
329
|
+
* type system cannot make — a version below 1, or a slot that no composition could satisfy.
|
|
260
330
|
*/
|
|
261
331
|
declare function defineBlock<Schema extends StandardSchemaV1, Component>(block: Block<Schema, Component>): Block<Schema, Component>;
|
|
262
332
|
|
|
@@ -274,12 +344,118 @@ declare function defineCatalog(entries: Record<string, CatalogEntry>): Catalog;
|
|
|
274
344
|
*/
|
|
275
345
|
declare function formatCompatibilityReport(report: CompatibilityReport): string;
|
|
276
346
|
|
|
347
|
+
/**
|
|
348
|
+
* Moves a node into a slot: a new `DocumentVersion` with the reference taken out of whatever held
|
|
349
|
+
* it — a slot or the roots — and placed in the target, the node itself untouched by reference.
|
|
350
|
+
*
|
|
351
|
+
* `index` names a position in the target slot *as it stands after the node is taken out*, which
|
|
352
|
+
* is the only reading under which "move it to the end" is the slot's length. Its absence appends.
|
|
353
|
+
*
|
|
354
|
+
* It does not refuse a move into the node's own subtree. That makes a cycle and detaches the node
|
|
355
|
+
* from the roots, and `compile` refuses both by name — judging it here would be a second opinion
|
|
356
|
+
* on one question, which is the division every operation in this package follows.
|
|
357
|
+
*/
|
|
358
|
+
declare function moveNode(version: DocumentVersion, nodeId: string, toParentId: string, toSlot: string, index?: number): DocumentVersion;
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Every refusal Nubbin throws, carrying its causes as data rather than only as prose. One class
|
|
362
|
+
* for the whole surface: a consumer writes one `catch`, reads `code` or `issues`, and ships that
|
|
363
|
+
* shape to whatever tooling they keep — the package neither logs nor decides what a refusal
|
|
364
|
+
* means to them.
|
|
365
|
+
*
|
|
366
|
+
* It extends `Error`, so a handler that only ever read `.message` keeps working.
|
|
367
|
+
*/
|
|
368
|
+
declare class NubbinError extends Error {
|
|
369
|
+
/**
|
|
370
|
+
* The first issue's code, so the common case reads as
|
|
371
|
+
* `error.code === NubbinIssueCode.UnknownProp` with no array to index and no string to typo.
|
|
372
|
+
* Every refusal but `compile`'s carries exactly one issue; read `issues` for the rest.
|
|
373
|
+
*/
|
|
374
|
+
readonly code: NubbinIssue["code"];
|
|
375
|
+
readonly issues: readonly NubbinIssue[];
|
|
376
|
+
constructor(issues: readonly NubbinIssue[]);
|
|
377
|
+
}
|
|
378
|
+
|
|
277
379
|
/**
|
|
278
380
|
* matchKind is parsed from the route at publish, never caller-supplied. It lives in core so
|
|
279
381
|
* every adapter derives it from one implementation — a second parser is free to disagree.
|
|
382
|
+
*
|
|
383
|
+
* The route is judged before it is classified: this is the last point before a pointer is
|
|
384
|
+
* written, so an adapter that never called `compile` still cannot publish an unaddressable one.
|
|
280
385
|
*/
|
|
281
386
|
declare function parseMatchKind(route: string): RoutePointer["matchKind"];
|
|
282
387
|
|
|
388
|
+
/**
|
|
389
|
+
* Throws the one-cause refusal that almost every surface raises, so a site says what it refuses
|
|
390
|
+
* and why in one line rather than assembling an issue array around it.
|
|
391
|
+
*
|
|
392
|
+
* `compile` is the exception and builds its own `NubbinError`, because it collects: an author
|
|
393
|
+
* fixing six problems should see six, not the first.
|
|
394
|
+
*
|
|
395
|
+
* Returns `never`, so a caller need not `return` after it for the narrowing to hold.
|
|
396
|
+
*/
|
|
397
|
+
declare function refuse(code: NubbinIssue["code"], message: string, at?: string): never;
|
|
398
|
+
|
|
399
|
+
/**
|
|
400
|
+
* Removes a node and everything beneath it: a new `DocumentVersion` with the subtree gone, the
|
|
401
|
+
* reference to it dropped from whatever held it, and every other node untouched by reference.
|
|
402
|
+
*
|
|
403
|
+
* It cascades because removing a section means removing what was in it. Left behind, the children
|
|
404
|
+
* would be unreachable — which `compile` already refuses — so the alternative is a document that
|
|
405
|
+
* cannot compile until an author deletes each orphan by hand.
|
|
406
|
+
*
|
|
407
|
+
* Whether the slot it emptied is now below its `min` is `compile`'s judgment, as it is for every
|
|
408
|
+
* other operation here.
|
|
409
|
+
*/
|
|
410
|
+
declare function removeNode(version: DocumentVersion, nodeId: string): DocumentVersion;
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* The inline emphasis a span may carry. Semantic, never stylistic, and closed: a construct
|
|
414
|
+
* outside this set is added as a member deliberately, not smuggled in as markup.
|
|
415
|
+
*/
|
|
416
|
+
type RichTextMark = "strong" | "em" | "code";
|
|
417
|
+
/** The block kinds rich text is built from. Closed for the same reason the marks are. */
|
|
418
|
+
type RichTextBlockKind = "paragraph" | "listItem";
|
|
419
|
+
/** A run of text and what is true of it. Inert: nothing here is parsed or evaluated at render. */
|
|
420
|
+
interface RichTextSpan {
|
|
421
|
+
text: string;
|
|
422
|
+
marks?: readonly RichTextMark[];
|
|
423
|
+
href?: string;
|
|
424
|
+
}
|
|
425
|
+
/** One block of a rich-text value: its kind, and the ordered spans it reads as. */
|
|
426
|
+
interface RichTextBlock {
|
|
427
|
+
kind: RichTextBlockKind;
|
|
428
|
+
spans: readonly RichTextSpan[];
|
|
429
|
+
}
|
|
430
|
+
/** An ordered array of blocks — the whole value a `richText()` field holds. */
|
|
431
|
+
type RichText = readonly RichTextBlock[];
|
|
432
|
+
|
|
433
|
+
/**
|
|
434
|
+
* A schema `core` hand-writes rather than one a validator brings. Narrower than
|
|
435
|
+
* `StandardSchemaV1` in the two ways that matter to a consumer hosting it: `validate` is
|
|
436
|
+
* synchronous, which compile requires anyway, and the JSON Schema converter is always there,
|
|
437
|
+
* so the studio can read the field tree without testing for it.
|
|
438
|
+
*/
|
|
439
|
+
interface StandardDataSchema<Value> {
|
|
440
|
+
readonly "~standard": {
|
|
441
|
+
readonly version: 1;
|
|
442
|
+
readonly vendor: string;
|
|
443
|
+
readonly validate: (value: unknown) => StandardSchemaV1.Result<Value>;
|
|
444
|
+
readonly jsonSchema: StandardJSONSchemaV1.Converter;
|
|
445
|
+
};
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
/**
|
|
449
|
+
* The rich-text field type: an ordered array of blocks, each an ordered array of inert spans,
|
|
450
|
+
* over closed mark and kind sets. Nothing in the value is parsed or evaluated at render, so an
|
|
451
|
+
* artifact carrying it is as inert as one carrying a string.
|
|
452
|
+
*
|
|
453
|
+
* A call rather than a bare value, so a field declaration reads the way the rest of a block's
|
|
454
|
+
* schema does and so options can arrive without changing call sites that pass none. A scan for
|
|
455
|
+
* this call finds every rich-text field in a registry.
|
|
456
|
+
*/
|
|
457
|
+
declare function richText(): StandardDataSchema<RichText>;
|
|
458
|
+
|
|
283
459
|
/** Copy-on-write down one dotted path. Paths address object fields only; `[]` has no single target. */
|
|
284
460
|
declare function setAtPath(target: Record<string, unknown>, path: string, value: unknown): Record<string, unknown>;
|
|
285
461
|
|
|
@@ -295,4 +471,4 @@ declare function setAtPath(target: Record<string, unknown>, path: string, value:
|
|
|
295
471
|
*/
|
|
296
472
|
declare function setNodeProp(version: DocumentVersion, nodeId: string, path: string, value: unknown): DocumentVersion;
|
|
297
473
|
|
|
298
|
-
export { type Artifact, type ArtifactNode, type ArtifactStore, type Block, type
|
|
474
|
+
export { type Artifact, type ArtifactNode, type ArtifactStore, type Block, type BlockDrift, type BlockUi, type Catalog, type CatalogEntry, type CompatibilityReport, type CompileResult, type DocumentMeta, type DocumentVersion, type FieldHint, type FieldHintData, type FieldKind, type FieldNode, type Holes, type InferProps, type LiveRoute, type Manifest, type Node, NubbinError, type NubbinIssue, NubbinIssueCode, type Registry, type RichText, type RichTextBlock, type RichTextBlockKind, type RichTextMark, type RichTextSpan, type RollbackCheck, type RouteIncompatibility, type RoutePointer, type SchemaAdapter, type SlotConstraint, type StandardDataSchema, type UnknownProps, addNode, checkCompatibility, checkRollback, compile, createRegistry, defineBlock, defineCatalog, formatCompatibilityReport, moveNode, parseMatchKind, refuse, removeNode, richText, setAtPath, setNodeProp, zodAdapter };
|