@texaryn/core 0.9.0 → 0.11.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.
@@ -4,11 +4,53 @@ import type { UIHints } from '../hints/types.js';
4
4
  import type { Command } from '../commands/types.js';
5
5
  import type { SubmissionState } from '../ir/runtime-state.js';
6
6
  import type { NodeId, MaybePromise, ValidationError, VisibleError } from '../types.js';
7
+ import type { DefaultConflict, DefaultRefusal } from '../initialization/index.js';
8
+ /** Which initialization policy consumes the schema's `default` annotations. */
9
+ export type InitializationPolicy = 'none' | 'schema-defaults';
10
+ /**
11
+ * What one run of ADR-003's initialization pass did, without the data, which
12
+ * the runtime publishes on `data` like any other.
13
+ *
14
+ * A discarded run reports only that it was discarded. Carrying the conflicts
15
+ * and refusals of the run that produced them would say a run found them and
16
+ * then say nothing was written, and the two readings are not the same claim.
17
+ */
18
+ export type InitializationReport = {
19
+ readonly outcome: 'initialized';
20
+ /** Locations left absent because their applicable declarations disagreed. */
21
+ readonly conflicts: readonly DefaultConflict[];
22
+ /** Locations left absent because filling would have meant guessing or destroying. */
23
+ readonly refusals: readonly DefaultRefusal[];
24
+ readonly passes: number;
25
+ } | {
26
+ readonly outcome: 'budget-exhausted';
27
+ readonly passes: number;
28
+ };
7
29
  export interface FormRuntimeOptions {
8
30
  initialData?: unknown;
9
31
  hints?: UIHints;
10
32
  onSubmit?: (data: unknown) => MaybePromise<void>;
11
33
  validationDebounceMs?: number;
34
+ /**
35
+ * ADR-003. `'none'`, the default, materialises nothing: given `{}` the
36
+ * runtime's data stays `{}`.
37
+ *
38
+ * `'schema-defaults'` fills every reachable location the schema declares a
39
+ * default for and the data leaves absent. A location is filled when it
40
+ * becomes reachable, so this runs at construction, on `Reset`, and after any
41
+ * edit that can change what is reachable: activating a `oneOf` branch by
42
+ * setting its discriminator fills that branch's own defaults. It never
43
+ * overwrites, so `false`, `0`, `''` and `null` are values and are left alone.
44
+ *
45
+ * What the run wrote is the baseline at construction and on `Reset`, and is
46
+ * not between them: a location seeded by an edit differs from
47
+ * `state.initialData`, which is what `modified` reports.
48
+ *
49
+ * Omitting `initialData` is not the same as passing `{}`. The first states
50
+ * nothing about the root, so a root-level `default` applies to it; the second
51
+ * is a root the caller supplied, and nothing is written over it.
52
+ */
53
+ initialization?: InitializationPolicy;
12
54
  }
13
55
  export interface NodeState {
14
56
  readonly value: Store<unknown>;
@@ -25,6 +67,26 @@ export interface FormRuntime {
25
67
  readonly data: Store<unknown>;
26
68
  readonly submission: Store<SubmissionState>;
27
69
  readonly visibleErrors: Store<VisibleError[]>;
70
+ /**
71
+ * The last initialization run, or `undefined` where no policy is configured.
72
+ *
73
+ * `dispatch` returns void and is typically called from an event handler, so a
74
+ * run that exhausts its budget reports here rather than throwing into the
75
+ * host's render. What that discards depends on the moment: a `Reset`
76
+ * establishes a baseline, so it is refused whole and nothing lands, while an
77
+ * ordinary edit establishes none, so the edit lands and only the seeding is
78
+ * dropped. `createFormRuntime` throws instead, because a caller can decline a
79
+ * runtime it never received.
80
+ *
81
+ * A new report is published on every data-mutating dispatch under the policy,
82
+ * including one where the pass wrote nothing, because each dispatch is a run
83
+ * and what a run finds changes as the user types. Anything subscribed here
84
+ * therefore updates per edit.
85
+ *
86
+ * It is not the projection's diagnostics channel, which describes a schema
87
+ * rather than one run over data.
88
+ */
89
+ readonly initialization: Store<InitializationReport | undefined>;
28
90
  dispatch(command: Command): void;
29
91
  getNodeState(nodeId: NodeId): NodeState | undefined;
30
92
  destroy(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAEtF,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,YAAY,CAAC,IAAI,CAAC,CAAA;IAChD,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IAC9B,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,CAAA;IACzC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IAC9B,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IAChC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IAChC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IACjC,QAAQ,CAAC,gBAAgB,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC,CAAA;IAC1E,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;CACpC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;IACpC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IAC7B,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,eAAe,CAAC,CAAA;IAC3C,QAAQ,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAA;IAC7C,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;IAChC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;IACnD,OAAO,IAAI,IAAI,CAAA;CAChB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AACtF,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAEjF,+EAA+E;AAC/E,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,iBAAiB,CAAA;AAE7D;;;;;;;GAOG;AACH,MAAM,MAAM,oBAAoB,GAC5B;IACE,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAA;IAC/B,6EAA6E;IAC7E,QAAQ,CAAC,SAAS,EAAE,SAAS,eAAe,EAAE,CAAA;IAC9C,qFAAqF;IACrF,QAAQ,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAA;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB,GACD;IAAE,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAErE,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,YAAY,CAAC,IAAI,CAAC,CAAA;IAChD,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B;;;;;;;;;;;;;;;;;;OAkBG;IACH,cAAc,CAAC,EAAE,oBAAoB,CAAA;CACtC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IAC9B,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,CAAA;IACzC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IAC9B,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IAChC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IAChC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IACjC,QAAQ,CAAC,gBAAgB,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC,CAAA;IAC1E,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;CACpC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;IACpC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IAC7B,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,eAAe,CAAC,CAAA;IAC3C,QAAQ,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAA;IAC7C;;;;;;;;;;;;;;;;;;OAkBG;IACH,QAAQ,CAAC,cAAc,EAAE,KAAK,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAAA;IAChE,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;IAChC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;IACnD,OAAO,IAAI,IAAI,CAAA;CAChB"}
@@ -26,12 +26,23 @@ export interface SchemaProjection {
26
26
  * The boundary worth stating, because it is what keeps this channel worth
27
27
  * reading: these describe schemas, not data.
28
28
  *
29
- * One case is therefore not reported, and only one: a `oneOf` or `anyOf`
30
- * whose branches the current value does not match, where some branch would
31
- * have rendered for a value that did. That same schema projects a shape for
32
- * such a value, whether the value is acceptable is validation's subject, and
33
- * a form's data fails to match for most of the time someone is filling it
34
- * in, so reporting it would mean a diagnostic that flaps on every keystroke.
29
+ * Two cases are therefore not reported here, and only two.
30
+ *
31
+ * A `oneOf` or `anyOf` whose branches the current value does not match, where
32
+ * some branch would have rendered for a value that did. That same schema
33
+ * projects a shape for such a value, whether the value is acceptable is
34
+ * validation's subject, and a form's data fails to match for most of the time
35
+ * someone is filling it in, so reporting it would mean a diagnostic that
36
+ * flaps on every keystroke.
37
+ *
38
+ * A disagreement between `default` declarations that a conditional branch
39
+ * carries, which holds exactly while that branch is selected and so flaps for
40
+ * the same reason. It is reported on `NodeProjection.defaultConflict`, which
41
+ * describes this projection rather than the schema and which also carries the
42
+ * unconditional case, so a consumer acting on a location reads one place.
43
+ * `ambiguous-default` here is the subset that holds whatever the instance is:
44
+ * a contradiction in the schema wherever it is used, which is worth telling
45
+ * whoever wrote it.
35
46
  *
36
47
  * Everything else about a composition is reported, including a branch that
37
48
  * the value does match and that still supplies no shape, and a composition
@@ -142,6 +153,34 @@ export interface NodeProjection {
142
153
  * adapter that does not select provisionally keeps its current behaviour.
143
154
  */
144
155
  provisional?: boolean;
156
+ /**
157
+ * Schema positions whose `default` declarations apply to this node for the
158
+ * instance as it stands, and disagree. Present exactly where
159
+ * `AnnotationSet.default` was omitted for that reason, and absent otherwise.
160
+ *
161
+ * This is the per-instance half of what `ambiguous-default` reports.
162
+ * `SchemaProjection.diagnostics` describes the schema, so it carries only the
163
+ * disagreements that hold whatever the instance is: a location's own
164
+ * declaration against those reached through `allOf` and `$ref`. A declaration
165
+ * carried by `oneOf`, `anyOf`, `if`/`then`/`else` or `dependentSchemas`
166
+ * competes only while its branch applies, so whether it disagrees is a state
167
+ * of the data and belongs here, beside `active` and `provisional`, which flap
168
+ * with the data for the same reason.
169
+ *
170
+ * Every conflict appears here, conditional or not, so a consumer deciding
171
+ * what to do about a location reads one place. The diagnostic stays for the
172
+ * unconditional case because a contradiction that holds for every instance is
173
+ * worth reporting to whoever wrote the schema.
174
+ *
175
+ * **A provisionally selected branch's declarations compete**, though JSON
176
+ * Schema says the branch does not apply. The projection exposes that branch so
177
+ * the user can complete it and a policy may fill from it, so a disagreement
178
+ * has to be visible wherever the fill would happen. Applicability here is
179
+ * therefore exposure, matching `active || provisional`, rather than validity.
180
+ *
181
+ * Order is not a contract; the set is.
182
+ */
183
+ defaultConflict?: readonly string[];
145
184
  annotations: AnnotationSet;
146
185
  /**
147
186
  * Annotations of an array's item template, for arrays only.
@@ -1 +1 @@
1
- {"version":3,"file":"port.d.ts","sourceRoot":"","sources":["../../src/schema/port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9F,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAElE,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,CAAA;IAExC,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAA;IAEvD,UAAU,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAA;CACjF;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,CAAA;IACvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAuCG;IACH,WAAW,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAA;CAC9C;AAED;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,WAAW,CAAA;IACpB,IAAI,EAAE,wBAAwB,CAAA;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC5B;AAED,MAAM,MAAM,wBAAwB;AAClC;;;;GAIG;AACD,4BAA4B;AAC9B;;;;;GAKG;GACD,6BAA6B;AAC/B;;;;;;;;;;;;;GAaG;GACD,mBAAmB,CAAA;AAEvB,MAAM,WAAW,cAAc;IAC7B;;;;;;;;;OASG;IACH,IAAI,EAAE,cAAc,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,gBAAgB,CAAA;IAC7B,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAA;IAC5B,UAAU,CAAC,EAAE,UAAU,EAAE,CAAA;IACzB;;;;OAIG;IACH,MAAM,EAAE,OAAO,CAAA;IACf;;;;;;;;;;;;;OAaG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,WAAW,EAAE,aAAa,CAAA;IAC1B;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,aAAa,CAAA;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,WAAW,CAAA;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,gFAAgF;IAChF,QAAQ,EAAE,OAAO,CAAA;IACjB;;;;;;;;;;OAUG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;IACpB;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB"}
1
+ {"version":3,"file":"port.d.ts","sourceRoot":"","sources":["../../src/schema/port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9F,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAElE,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,CAAA;IAExC,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAA;IAEvD,UAAU,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAA;CACjF;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,CAAA;IACvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkDG;IACH,WAAW,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAA;CAC9C;AAED;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,WAAW,CAAA;IACpB,IAAI,EAAE,wBAAwB,CAAA;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC5B;AAED,MAAM,MAAM,wBAAwB;AAClC;;;;GAIG;AACD,4BAA4B;AAC9B;;;;;GAKG;GACD,6BAA6B;AAC/B;;;;;;;;;;;;;GAaG;GACD,mBAAmB,CAAA;AAEvB,MAAM,WAAW,cAAc;IAC7B;;;;;;;;;OASG;IACH,IAAI,EAAE,cAAc,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,gBAAgB,CAAA;IAC7B,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAA;IAC5B,UAAU,CAAC,EAAE,UAAU,EAAE,CAAA;IACzB;;;;OAIG;IACH,MAAM,EAAE,OAAO,CAAA;IACf;;;;;;;;;;;;;OAaG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,WAAW,EAAE,aAAa,CAAA;IAC1B;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,aAAa,CAAA;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,WAAW,CAAA;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,gFAAgF;IAChF,QAAQ,EAAE,OAAO,CAAA;IACjB;;;;;;;;;;OAUG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;IACpB;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@texaryn/core",
3
- "version": "0.9.0",
3
+ "version": "0.11.0",
4
4
  "description": "Framework-neutral UI IR, compiler, runtime, and renderer registry for schema-driven forms",
5
5
  "keywords": [
6
6
  "json-schema",