@flyingrobots/bijou 5.0.0 → 7.1.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.
Files changed (127) hide show
  1. package/README.md +64 -0
  2. package/dist/core/active-binding-collection.d.ts +49 -0
  3. package/dist/core/active-binding-collection.d.ts.map +1 -0
  4. package/dist/core/active-binding-collection.js +264 -0
  5. package/dist/core/active-binding-collection.js.map +1 -0
  6. package/dist/core/app-shell-composition.d.ts +44 -0
  7. package/dist/core/app-shell-composition.d.ts.map +1 -0
  8. package/dist/core/app-shell-composition.js +123 -0
  9. package/dist/core/app-shell-composition.js.map +1 -0
  10. package/dist/core/binding-frame-update.d.ts +18 -0
  11. package/dist/core/binding-frame-update.d.ts.map +1 -0
  12. package/dist/core/binding-frame-update.js +133 -0
  13. package/dist/core/binding-frame-update.js.map +1 -0
  14. package/dist/core/binding-lifecycle.d.ts +65 -0
  15. package/dist/core/binding-lifecycle.d.ts.map +1 -0
  16. package/dist/core/binding-lifecycle.js +357 -0
  17. package/dist/core/binding-lifecycle.js.map +1 -0
  18. package/dist/core/binding.d.ts +192 -0
  19. package/dist/core/binding.d.ts.map +1 -0
  20. package/dist/core/binding.js +587 -0
  21. package/dist/core/binding.js.map +1 -0
  22. package/dist/core/block-metadata.d.ts +113 -0
  23. package/dist/core/block-metadata.d.ts.map +1 -0
  24. package/dist/core/block-metadata.js +376 -0
  25. package/dist/core/block-metadata.js.map +1 -0
  26. package/dist/core/block-tree-render.d.ts +17 -0
  27. package/dist/core/block-tree-render.d.ts.map +1 -0
  28. package/dist/core/block-tree-render.js +186 -0
  29. package/dist/core/block-tree-render.js.map +1 -0
  30. package/dist/core/component-metadata.d.ts +63 -0
  31. package/dist/core/component-metadata.d.ts.map +1 -0
  32. package/dist/core/component-metadata.js +158 -0
  33. package/dist/core/component-metadata.js.map +1 -0
  34. package/dist/core/components/dag-edges.d.ts +9 -3
  35. package/dist/core/components/dag-edges.d.ts.map +1 -1
  36. package/dist/core/components/dag-edges.js +41 -10
  37. package/dist/core/components/dag-edges.js.map +1 -1
  38. package/dist/core/components/dag-render.d.ts +1 -1
  39. package/dist/core/components/dag-render.d.ts.map +1 -1
  40. package/dist/core/components/dag-render.js +193 -72
  41. package/dist/core/components/dag-render.js.map +1 -1
  42. package/dist/core/components/dag-source.d.ts +4 -0
  43. package/dist/core/components/dag-source.d.ts.map +1 -1
  44. package/dist/core/components/dag-source.js +10 -0
  45. package/dist/core/components/dag-source.js.map +1 -1
  46. package/dist/core/components/dag.d.ts +13 -0
  47. package/dist/core/components/dag.d.ts.map +1 -1
  48. package/dist/core/components/dag.js.map +1 -1
  49. package/dist/core/components/index.d.ts +2 -2
  50. package/dist/core/components/index.d.ts.map +1 -1
  51. package/dist/core/components/index.js.map +1 -1
  52. package/dist/core/components/table-v3.d.ts +1 -1
  53. package/dist/core/components/table-v3.d.ts.map +1 -1
  54. package/dist/core/components/table-v3.js +136 -21
  55. package/dist/core/components/table-v3.js.map +1 -1
  56. package/dist/core/components/table.d.ts +36 -6
  57. package/dist/core/components/table.d.ts.map +1 -1
  58. package/dist/core/components/table.js +530 -74
  59. package/dist/core/components/table.js.map +1 -1
  60. package/dist/core/fixture-promotion.d.ts +33 -0
  61. package/dist/core/fixture-promotion.d.ts.map +1 -0
  62. package/dist/core/fixture-promotion.js +62 -0
  63. package/dist/core/fixture-promotion.js.map +1 -0
  64. package/dist/core/graphql-bijou-block.d.ts +94 -0
  65. package/dist/core/graphql-bijou-block.d.ts.map +1 -0
  66. package/dist/core/graphql-bijou-block.js +570 -0
  67. package/dist/core/graphql-bijou-block.js.map +1 -0
  68. package/dist/core/layout/envelope.d.ts +174 -0
  69. package/dist/core/layout/envelope.d.ts.map +1 -0
  70. package/dist/core/layout/envelope.js +336 -0
  71. package/dist/core/layout/envelope.js.map +1 -0
  72. package/dist/core/mode-lowering.d.ts +48 -0
  73. package/dist/core/mode-lowering.d.ts.map +1 -0
  74. package/dist/core/mode-lowering.js +176 -0
  75. package/dist/core/mode-lowering.js.map +1 -0
  76. package/dist/core/render/differ.d.ts.map +1 -1
  77. package/dist/core/render/differ.js +10 -1
  78. package/dist/core/render/differ.js.map +1 -1
  79. package/dist/core/schema-block.d.ts +63 -0
  80. package/dist/core/schema-block.d.ts.map +1 -0
  81. package/dist/core/schema-block.js +361 -0
  82. package/dist/core/schema-block.js.map +1 -0
  83. package/dist/core/selection.d.ts +127 -0
  84. package/dist/core/selection.d.ts.map +1 -0
  85. package/dist/core/selection.js +350 -0
  86. package/dist/core/selection.js.map +1 -0
  87. package/dist/core/standard-blocks.d.ts +264 -0
  88. package/dist/core/standard-blocks.d.ts.map +1 -0
  89. package/dist/core/standard-blocks.js +2518 -0
  90. package/dist/core/standard-blocks.js.map +1 -0
  91. package/dist/core/story-capture.d.ts +48 -0
  92. package/dist/core/story-capture.d.ts.map +1 -0
  93. package/dist/core/story-capture.js +64 -0
  94. package/dist/core/story-capture.js.map +1 -0
  95. package/dist/core/text/wrap.d.ts.map +1 -1
  96. package/dist/core/text/wrap.js +37 -20
  97. package/dist/core/text/wrap.js.map +1 -1
  98. package/dist/core/theme/builder.d.ts +91 -0
  99. package/dist/core/theme/builder.d.ts.map +1 -0
  100. package/dist/core/theme/builder.js +238 -0
  101. package/dist/core/theme/builder.js.map +1 -0
  102. package/dist/core/theme/doctor.d.ts +52 -0
  103. package/dist/core/theme/doctor.d.ts.map +1 -0
  104. package/dist/core/theme/doctor.js +224 -0
  105. package/dist/core/theme/doctor.js.map +1 -0
  106. package/dist/core/theme/dtcg.d.ts.map +1 -1
  107. package/dist/core/theme/dtcg.js +10 -1
  108. package/dist/core/theme/dtcg.js.map +1 -1
  109. package/dist/core/theme/index.d.ts +5 -1
  110. package/dist/core/theme/index.d.ts.map +1 -1
  111. package/dist/core/theme/index.js +4 -1
  112. package/dist/core/theme/index.js.map +1 -1
  113. package/dist/core/theme/presets.d.ts +17 -1
  114. package/dist/core/theme/presets.d.ts.map +1 -1
  115. package/dist/core/theme/presets.js +139 -1
  116. package/dist/core/theme/presets.js.map +1 -1
  117. package/dist/core/theme/tokens.d.ts +1 -1
  118. package/dist/core/theme/tokens.d.ts.map +1 -1
  119. package/dist/core/ui-scene-ir.d.ts +195 -0
  120. package/dist/core/ui-scene-ir.d.ts.map +1 -0
  121. package/dist/core/ui-scene-ir.js +571 -0
  122. package/dist/core/ui-scene-ir.js.map +1 -0
  123. package/dist/index.d.ts +19 -2
  124. package/dist/index.d.ts.map +1 -1
  125. package/dist/index.js +21 -2
  126. package/dist/index.js.map +1 -1
  127. package/package.json +2 -2
package/README.md CHANGED
@@ -76,6 +76,70 @@ fake duplication rather than a real second API.
76
76
  - **`breadcrumb()`**: Path context.
77
77
  - **`stepper()`**: Ordered stages in a linear process.
78
78
 
79
+ ### Theme Authoring
80
+ - **`extendTheme()`**: Build a custom theme from a known-good preset.
81
+ - **`defineThemeSafePairs()`**: Declare reusable foreground/background
82
+ contrast matrices for `doctorTheme()` and inspector surfaces.
83
+ - **`doctorTheme()`**: Structured checks for invalid colors, weak contrast,
84
+ and suspicious token reuse.
85
+ - **`themeContrastRatio()`**: Deterministic foreground/background contrast
86
+ calculation for token-pair tests.
87
+
88
+ ### Mode-Aware Authoring
89
+ - **`renderByMode()`**: Dispatch a component to the current output contract.
90
+ - **`lintModeLowering()`**: Compare explicit semantic facts across output modes.
91
+ - **`modeLoweringReportText()`**: Render a compact lowering report for tests,
92
+ docs, and review comments.
93
+ - **`defineComponentMetadata()`**: Declare validated package, family, mode,
94
+ arg, variant, invariant, example, and source facts for tooling.
95
+ - **`componentMetadataSummary()`**: Render compact metadata for docs, MCP
96
+ payloads, and agent-facing reports.
97
+ - **`defineBlock()`**: Declare a validated reusable block with package, family,
98
+ scale, mode, slot, variant, config, component, story, semantic facts, optional
99
+ view data contracts, and command intents.
100
+ - **`standardBlocks` / standard block exports**: Import the first-party
101
+ standard block definitions for AppShell, ReaderSurface, InspectorPanel,
102
+ inline status, in-flow status, transient overlay feedback, activity stream,
103
+ shortcut cues, and progress. These expose contracts, stories, data
104
+ requirements, command intents, and schema-bound posture, with deterministic
105
+ first-proof render output across all output modes. Production AppShell
106
+ behavior remains a later runtime slice.
107
+ - **`defineBlockPackage()`**: Declare exported blocks, docs, tags, version, and
108
+ Bijou peer compatibility for ordinary NPM block packages.
109
+ - **`defineBlockSchemaAdapter()` / `defineSchemaBlock()`**: Validate unknown
110
+ boundary data before producing immutable block render input and binding facts,
111
+ without fetching, subscribing, dispatching, or rendering AppShell.
112
+ - **`blockMetadataSummary()`**: Render compact block metadata for docs, MCP
113
+ payloads, and agent-facing reports.
114
+ - **`defineAppShellComposition()`**: Compose runtime-backed blocks into logical
115
+ AppShell slots with an explicit provider scope, without rendering or
116
+ subscribing.
117
+ - **`blockRenderNode()` / `renderBlockTree()`**: Explicitly render nested block
118
+ declarations into parent slots when a preview or host intentionally wants a
119
+ block tree, while ordinary `block.render()` remains a local single-block
120
+ render contract.
121
+ - **`defineDataRequirement()` / `defineDataProvider()` / `providerScope()`**:
122
+ Declare data requirements and explicit local provider availability without
123
+ hidden global registration.
124
+ - **`defineViewData()`**: Group named data requirements for a view or block
125
+ without binding them to providers.
126
+ - **`resolveProviderRequirement()`**: Resolve a requirement against an explicit
127
+ local provider scope as frozen metadata, without subscribing or fetching.
128
+ - **`bindingFrameFromSnapshots()`**: Assemble read-only render frames from
129
+ resolved provider metadata and already-created immutable snapshots.
130
+ - **`bindingSnapshot()` / `bindingFrame()`**: Model provider-delivered plain
131
+ data as copied, versioned immutable snapshots and read-only render frames.
132
+ - **`commandIntent()`**: Declare user intent outputs as inspectable metadata,
133
+ without business-logic callbacks or provider mutation handles.
134
+ - **`captureStoryMatrix()`**: Capture every profile/variant pair from a story
135
+ renderer.
136
+ - **`storyCaptureMatrixText()`**: Render a deterministic multi-mode story
137
+ matrix for docs and tests.
138
+ - **`createFixturePromotionRecord()`**: Preserve provenance when a fixture,
139
+ docs page, story, example, or MCP payload is promoted into another surface.
140
+ - **`fixturePromotionText()`**: Render that promotion record for review and
141
+ agent output.
142
+
79
143
  ## Documentation
80
144
 
81
145
  - **[GUIDE.md](./GUIDE.md)**: Productive-fast path.
@@ -0,0 +1,49 @@
1
+ import { type DataRequirement, type ProviderId, type ViewDataContract } from './binding.js';
2
+ import { type BindingLifecycleOwner, type BindingLifecycleRecord } from './binding-lifecycle.js';
3
+ declare const ACTIVE_BINDING_ENTRY_BRAND: unique symbol;
4
+ declare const ACTIVE_BINDING_COLLECTION_BRAND: unique symbol;
5
+ export interface ActiveBindingEntryInput {
6
+ readonly owner: BindingLifecycleOwner;
7
+ readonly requirement: DataRequirement;
8
+ readonly providerId?: string;
9
+ }
10
+ export interface ActiveBindingEntry {
11
+ readonly [ACTIVE_BINDING_ENTRY_BRAND]: true;
12
+ readonly owner: BindingLifecycleOwner;
13
+ readonly requirement: DataRequirement;
14
+ readonly providerId?: ProviderId;
15
+ }
16
+ export interface ActiveBindingProviderAssignment {
17
+ readonly requirementId: string;
18
+ readonly providerId: string;
19
+ }
20
+ export interface ActiveBindingContractInput {
21
+ readonly owner: BindingLifecycleOwner;
22
+ readonly contract: ViewDataContract;
23
+ readonly providerIds?: readonly ActiveBindingProviderAssignment[];
24
+ }
25
+ export interface CollectActiveBindingsInput {
26
+ readonly entries?: readonly ActiveBindingEntry[];
27
+ readonly contracts?: readonly ActiveBindingContractInput[];
28
+ }
29
+ export declare class ActiveBindingCollection {
30
+ #private;
31
+ readonly [ACTIVE_BINDING_COLLECTION_BRAND]: true;
32
+ constructor(entries: readonly ActiveBindingEntry[]);
33
+ entries(): readonly ActiveBindingEntry[];
34
+ requirements(): readonly DataRequirement[];
35
+ owners(): readonly BindingLifecycleOwner[];
36
+ lifecycleRecords(): readonly BindingLifecycleRecord[];
37
+ get(ownerId: string, requirementId: string): ActiveBindingEntry | undefined;
38
+ has(ownerId: string, requirementId: string): boolean;
39
+ byOwner(ownerId: string): readonly ActiveBindingEntry[];
40
+ byRequirement(requirementId: string): readonly ActiveBindingEntry[];
41
+ with(entry: ActiveBindingEntry): ActiveBindingCollection;
42
+ }
43
+ export declare function activeBindingEntry(input: ActiveBindingEntryInput): ActiveBindingEntry;
44
+ export declare function isActiveBindingEntry(value: unknown): value is ActiveBindingEntry;
45
+ export declare function activeBindingCollection(entries: readonly ActiveBindingEntry[]): ActiveBindingCollection;
46
+ export declare function isActiveBindingCollection(value: unknown): value is ActiveBindingCollection;
47
+ export declare function collectActiveBindings(input: CollectActiveBindingsInput): ActiveBindingCollection;
48
+ export {};
49
+ //# sourceMappingURL=active-binding-collection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"active-binding-collection.d.ts","sourceRoot":"","sources":["../../src/core/active-binding-collection.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,UAAU,EAEf,KAAK,gBAAgB,EACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC5B,MAAM,wBAAwB,CAAC;AAEhC,QAAA,MAAM,0BAA0B,EAAE,OAAO,MAAqC,CAAC;AAC/E,QAAA,MAAM,+BAA+B,EAAE,OAAO,MAA0C,CAAC;AAEzF,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;IACtC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,CAAC,0BAA0B,CAAC,EAAE,IAAI,CAAC;IAC5C,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;IACtC,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;CAClC;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,+BAA+B,EAAE,CAAC;CACnE;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACjD,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,0BAA0B,EAAE,CAAC;CAC5D;AAED,qBAAa,uBAAuB;;IAClC,QAAQ,CAAC,CAAC,+BAA+B,CAAC,EAAG,IAAI,CAAC;gBAItC,OAAO,EAAE,SAAS,kBAAkB,EAAE;IA6ClD,OAAO,IAAI,SAAS,kBAAkB,EAAE;IAIxC,YAAY,IAAI,SAAS,eAAe,EAAE;IAW1C,MAAM,IAAI,SAAS,qBAAqB,EAAE;IAW1C,gBAAgB,IAAI,SAAS,sBAAsB,EAAE;IAWrD,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAe3E,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO;IAIpD,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,kBAAkB,EAAE;IAYvD,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,kBAAkB,EAAE;IAYnE,IAAI,CAAC,KAAK,EAAE,kBAAkB,GAAG,uBAAuB;CAGzD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,kBAAkB,CAwBrF;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAOhF;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,SAAS,kBAAkB,EAAE,GACrC,uBAAuB,CAEzB;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,uBAAuB,CAO1F;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,0BAA0B,GAChC,uBAAuB,CAiBzB"}
@@ -0,0 +1,264 @@
1
+ import { isDataRequirement, isViewDataContract, } from './binding.js';
2
+ import { bindingLifecycleRecord, isBindingLifecycleOwner, } from './binding-lifecycle.js';
3
+ const ACTIVE_BINDING_ENTRY_BRAND = Symbol('ActiveBindingEntry');
4
+ const ACTIVE_BINDING_COLLECTION_BRAND = Symbol('ActiveBindingCollection');
5
+ export class ActiveBindingCollection {
6
+ [ACTIVE_BINDING_COLLECTION_BRAND];
7
+ #entries;
8
+ #entriesByKey;
9
+ constructor(entries) {
10
+ if (!Array.isArray(entries)) {
11
+ throw new Error('active binding collection: entries must be an array');
12
+ }
13
+ Object.defineProperty(this, ACTIVE_BINDING_COLLECTION_BRAND, { value: true });
14
+ const entriesByKey = new Map();
15
+ const entryIndexesByKey = new Map();
16
+ const normalizedEntries = [];
17
+ entries.forEach((entry, index) => {
18
+ if (!isActiveBindingEntry(entry)) {
19
+ throw new Error(`active binding collection: entry at index ${index} was not created by activeBindingEntry()`);
20
+ }
21
+ const key = activeBindingKey(entry.owner.id, entry.requirement.id);
22
+ const existingEntry = entriesByKey.get(key);
23
+ if (existingEntry !== undefined) {
24
+ const mergedEntry = mergeDuplicateEntry(existingEntry, entry);
25
+ const existingIndex = entryIndexesByKey.get(key);
26
+ if (existingIndex === undefined) {
27
+ throw new Error(`active binding collection: missing index for owner ${entry.owner.id} `
28
+ + `requirement ${entry.requirement.id}`);
29
+ }
30
+ entriesByKey.set(key, mergedEntry);
31
+ normalizedEntries[existingIndex] = mergedEntry;
32
+ return;
33
+ }
34
+ entriesByKey.set(key, entry);
35
+ entryIndexesByKey.set(key, normalizedEntries.length);
36
+ normalizedEntries.push(entry);
37
+ });
38
+ this.#entries = Object.freeze(normalizedEntries);
39
+ this.#entriesByKey = entriesByKey;
40
+ Object.freeze(this);
41
+ }
42
+ entries() {
43
+ return Object.freeze([...this.#entries]);
44
+ }
45
+ requirements() {
46
+ const requirementsById = new Map();
47
+ this.#entries.forEach((entry) => {
48
+ if (!requirementsById.has(entry.requirement.id)) {
49
+ requirementsById.set(entry.requirement.id, entry.requirement);
50
+ }
51
+ });
52
+ return Object.freeze([...requirementsById.values()]);
53
+ }
54
+ owners() {
55
+ const ownersById = new Map();
56
+ this.#entries.forEach((entry) => {
57
+ if (!ownersById.has(entry.owner.id)) {
58
+ ownersById.set(entry.owner.id, entry.owner);
59
+ }
60
+ });
61
+ return Object.freeze([...ownersById.values()]);
62
+ }
63
+ lifecycleRecords() {
64
+ return Object.freeze(this.#entries.map((entry) => bindingLifecycleRecord({
65
+ owner: entry.owner,
66
+ requirementId: entry.requirement.id,
67
+ providerId: entry.providerId,
68
+ facts: entry.requirement.facts,
69
+ })));
70
+ }
71
+ get(ownerId, requirementId) {
72
+ return this.#entriesByKey.get(activeBindingKey(normalizeRequiredText({
73
+ scope: 'active binding collection',
74
+ field: 'ownerId',
75
+ value: ownerId,
76
+ }), normalizeRequiredText({
77
+ scope: 'active binding collection',
78
+ field: 'requirementId',
79
+ value: requirementId,
80
+ })));
81
+ }
82
+ has(ownerId, requirementId) {
83
+ return this.get(ownerId, requirementId) !== undefined;
84
+ }
85
+ byOwner(ownerId) {
86
+ const normalizedOwnerId = normalizeRequiredText({
87
+ scope: 'active binding collection',
88
+ field: 'ownerId',
89
+ value: ownerId,
90
+ });
91
+ return Object.freeze(this.#entries.filter((entry) => entry.owner.id === normalizedOwnerId));
92
+ }
93
+ byRequirement(requirementId) {
94
+ const normalizedRequirementId = normalizeRequiredText({
95
+ scope: 'active binding collection',
96
+ field: 'requirementId',
97
+ value: requirementId,
98
+ });
99
+ return Object.freeze(this.#entries.filter((entry) => entry.requirement.id === normalizedRequirementId));
100
+ }
101
+ with(entry) {
102
+ return new ActiveBindingCollection([...this.#entries, entry]);
103
+ }
104
+ }
105
+ export function activeBindingEntry(input) {
106
+ if (!isBindingLifecycleOwner(input.owner)) {
107
+ throw new Error('active binding entry: owner was not created by defineBindingLifecycleOwner()');
108
+ }
109
+ if (!isDataRequirement(input.requirement)) {
110
+ throw new Error('active binding entry: requirement was not created by defineDataRequirement()');
111
+ }
112
+ const entry = {
113
+ owner: input.owner,
114
+ requirement: input.requirement,
115
+ providerId: optionalRequiredText({
116
+ scope: 'active binding entry',
117
+ field: 'providerId',
118
+ value: input.providerId,
119
+ }),
120
+ };
121
+ Object.defineProperty(entry, ACTIVE_BINDING_ENTRY_BRAND, { value: true });
122
+ return Object.freeze(entry);
123
+ }
124
+ export function isActiveBindingEntry(value) {
125
+ return Boolean(value
126
+ && typeof value === 'object'
127
+ && Object.prototype.hasOwnProperty.call(value, ACTIVE_BINDING_ENTRY_BRAND)
128
+ && value[ACTIVE_BINDING_ENTRY_BRAND] === true);
129
+ }
130
+ export function activeBindingCollection(entries) {
131
+ return new ActiveBindingCollection(entries);
132
+ }
133
+ export function isActiveBindingCollection(value) {
134
+ return Boolean(value
135
+ && typeof value === 'object'
136
+ && Object.prototype.hasOwnProperty.call(value, ACTIVE_BINDING_COLLECTION_BRAND)
137
+ && value[ACTIVE_BINDING_COLLECTION_BRAND] === true);
138
+ }
139
+ export function collectActiveBindings(input) {
140
+ if (input === undefined || input === null || typeof input !== 'object' || Array.isArray(input)) {
141
+ throw new Error('active binding collection: input must be an object');
142
+ }
143
+ if (input.entries !== undefined && !Array.isArray(input.entries)) {
144
+ throw new Error('active binding collection: entries must be an array');
145
+ }
146
+ if (input.contracts !== undefined && !Array.isArray(input.contracts)) {
147
+ throw new Error('active binding collection: contracts must be an array');
148
+ }
149
+ const entries = [...(input.entries ?? [])];
150
+ (input.contracts ?? []).forEach((source, index) => {
151
+ entries.push(...activeBindingEntriesFromContract(source, index));
152
+ });
153
+ return new ActiveBindingCollection(entries);
154
+ }
155
+ function activeBindingEntriesFromContract(source, index) {
156
+ if (!isObjectRecord(source)) {
157
+ throw new Error(`active binding collection: contract ${index} must be an object`);
158
+ }
159
+ if (!isBindingLifecycleOwner(source.owner)) {
160
+ throw new Error(`active binding collection: contract ${index} owner was not created by defineBindingLifecycleOwner()`);
161
+ }
162
+ if (!isViewDataContract(source.contract)) {
163
+ throw new Error(`active binding collection: contract ${index} was not created by defineViewData()`);
164
+ }
165
+ const providerIds = providerAssignmentsByRequirementId(source.providerIds);
166
+ const requirementIds = new Set(source.contract.requirementIds());
167
+ providerIds.forEach((_, requirementId) => {
168
+ if (!requirementIds.has(requirementId)) {
169
+ throw new Error(`active binding collection: provider assignment ${requirementId} `
170
+ + `does not match contract ${index}`);
171
+ }
172
+ });
173
+ const requirements = source.contract.requirements().map((requirement, requirementIndex) => {
174
+ if (!isDataRequirement(requirement)) {
175
+ throw new Error(`active binding collection: contract ${index} requirement ${requirementIndex} `
176
+ + 'was not created by defineDataRequirement()');
177
+ }
178
+ return requirement;
179
+ });
180
+ return Object.freeze(requirements.map((requirement) => activeBindingEntry({
181
+ owner: source.owner,
182
+ requirement,
183
+ providerId: providerIds.get(requirement.id),
184
+ })));
185
+ }
186
+ function providerAssignmentsByRequirementId(assignments) {
187
+ if (assignments === undefined) {
188
+ return new Map();
189
+ }
190
+ if (!Array.isArray(assignments)) {
191
+ throw new Error('active binding collection: providerIds must be an array');
192
+ }
193
+ if (assignments.length === 0) {
194
+ return new Map();
195
+ }
196
+ const providerIds = new Map();
197
+ assignments.forEach((assignment, index) => {
198
+ if (!isObjectRecord(assignment)) {
199
+ throw new Error(`active binding collection: provider assignment ${index} must be an object`);
200
+ }
201
+ if (typeof assignment['requirementId'] !== 'string') {
202
+ throw new Error(`active binding collection: provider assignment ${index} `
203
+ + 'requirementId must be a string');
204
+ }
205
+ if (typeof assignment['providerId'] !== 'string') {
206
+ throw new Error(`active binding collection: provider assignment ${index} providerId must be a string`);
207
+ }
208
+ const requirementId = normalizeRequiredText({
209
+ scope: 'active binding collection',
210
+ field: 'requirementId',
211
+ value: assignment['requirementId'],
212
+ });
213
+ if (providerIds.has(requirementId)) {
214
+ throw new Error(`active binding collection: duplicate provider assignment ${requirementId}`);
215
+ }
216
+ providerIds.set(requirementId, normalizeRequiredText({
217
+ scope: 'active binding collection',
218
+ field: 'providerId',
219
+ value: assignment['providerId'],
220
+ }));
221
+ });
222
+ return providerIds;
223
+ }
224
+ function activeBindingKey(ownerId, requirementId) {
225
+ return `${ownerId}\u0000${requirementId}`;
226
+ }
227
+ function isObjectRecord(value) {
228
+ return Boolean(value && typeof value === 'object' && !Array.isArray(value));
229
+ }
230
+ function mergeDuplicateEntry(existingEntry, incomingEntry) {
231
+ if (existingEntry.providerId !== undefined
232
+ && incomingEntry.providerId !== undefined
233
+ && existingEntry.providerId !== incomingEntry.providerId) {
234
+ throw new Error(`active binding collection: conflicting providers for owner ${incomingEntry.owner.id} `
235
+ + `requirement ${incomingEntry.requirement.id}`);
236
+ }
237
+ const providerId = existingEntry.providerId ?? incomingEntry.providerId;
238
+ if (providerId === existingEntry.providerId) {
239
+ return existingEntry;
240
+ }
241
+ return activeBindingEntry({
242
+ owner: existingEntry.owner,
243
+ requirement: existingEntry.requirement,
244
+ providerId,
245
+ });
246
+ }
247
+ function normalizeRequiredText(options) {
248
+ const normalized = options.value.trim();
249
+ if (normalized === '') {
250
+ throw new Error(`${options.scope}: ${options.field} is required`);
251
+ }
252
+ return normalized;
253
+ }
254
+ function optionalRequiredText(options) {
255
+ if (options.value === undefined) {
256
+ return undefined;
257
+ }
258
+ return normalizeRequiredText({
259
+ scope: options.scope,
260
+ field: options.field,
261
+ value: options.value,
262
+ });
263
+ }
264
+ //# sourceMappingURL=active-binding-collection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"active-binding-collection.js","sourceRoot":"","sources":["../../src/core/active-binding-collection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { type BindingFact, type CommandIntent, type ProviderScope, type ViewDataContract } from './binding.js';
2
+ import { type BlockDefinition } from './block-metadata.js';
3
+ declare const APP_SHELL_COMPOSITION_BRAND: unique symbol;
4
+ export type AppShellSlotId = 'navigation' | 'content' | 'inspector' | 'status' | 'overlays';
5
+ export type AppShellSlotContent = BlockDefinition | readonly AppShellSlotContent[];
6
+ export interface AppShellSlots {
7
+ readonly navigation?: AppShellSlotContent;
8
+ readonly content: AppShellSlotContent;
9
+ readonly inspector?: AppShellSlotContent;
10
+ readonly status?: AppShellSlotContent;
11
+ readonly overlays?: AppShellSlotContent;
12
+ }
13
+ export interface AppShellCompositionInput {
14
+ readonly id?: string;
15
+ readonly label?: string;
16
+ readonly description?: string;
17
+ readonly providers?: ProviderScope;
18
+ readonly slots: AppShellSlots;
19
+ readonly facts?: readonly BindingFact[];
20
+ }
21
+ export interface AppShellSlot {
22
+ readonly id: AppShellSlotId;
23
+ readonly blocks: readonly BlockDefinition[];
24
+ }
25
+ export declare class AppShellComposition {
26
+ #private;
27
+ readonly [APP_SHELL_COMPOSITION_BRAND] = true;
28
+ readonly id?: string;
29
+ readonly label?: string;
30
+ readonly description?: string;
31
+ readonly facts: readonly BindingFact[];
32
+ constructor(input: AppShellCompositionInput);
33
+ slotIds(): readonly AppShellSlotId[];
34
+ slots(): readonly AppShellSlot[];
35
+ slot(slotId: AppShellSlotId): readonly BlockDefinition[];
36
+ blocks(): readonly BlockDefinition[];
37
+ dataContracts(): readonly ViewDataContract[];
38
+ commandIntents(): readonly CommandIntent[];
39
+ providerScope(): ProviderScope | undefined;
40
+ }
41
+ export declare function defineAppShellComposition(input: AppShellCompositionInput): AppShellComposition;
42
+ export declare function isAppShellComposition(value: unknown): value is AppShellComposition;
43
+ export {};
44
+ //# sourceMappingURL=app-shell-composition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-shell-composition.d.ts","sourceRoot":"","sources":["../../src/core/app-shell-composition.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,qBAAqB,CAAC;AAE7B,QAAA,MAAM,2BAA2B,EAAE,OAAO,MAAsC,CAAC;AAEjF,MAAM,MAAM,cAAc,GACtB,YAAY,GACZ,SAAS,GACT,WAAW,GACX,QAAQ,GACR,UAAU,CAAC;AAEf,MAAM,MAAM,mBAAmB,GAC3B,eAAe,GACf,SAAS,mBAAmB,EAAE,CAAC;AAEnC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,mBAAmB,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE,mBAAmB,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,mBAAmB,CAAC;CACzC;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;CAC7C;AAYD,qBAAa,mBAAmB;;IAC9B,QAAQ,CAAC,CAAC,2BAA2B,CAAC,QAAQ;IAG9C,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;gBAE3B,KAAK,EAAE,wBAAwB;IAuB3C,OAAO,IAAI,SAAS,cAAc,EAAE;IAIpC,KAAK,IAAI,SAAS,YAAY,EAAE;IAIhC,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,eAAe,EAAE;IAIxD,MAAM,IAAI,SAAS,eAAe,EAAE;IAMpC,aAAa,IAAI,SAAS,gBAAgB,EAAE;IAM5C,cAAc,IAAI,SAAS,aAAa,EAAE;IAM1C,aAAa,IAAI,aAAa,GAAG,SAAS;CAG3C;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,wBAAwB,GAC9B,mBAAmB,CAErB;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAMlF"}
@@ -0,0 +1,123 @@
1
+ import { isProviderScope, } from './binding.js';
2
+ import { isBlockDefinition, } from './block-metadata.js';
3
+ const APP_SHELL_COMPOSITION_BRAND = Symbol('AppShellComposition');
4
+ const APP_SHELL_SLOT_IDS = [
5
+ 'navigation',
6
+ 'content',
7
+ 'inspector',
8
+ 'status',
9
+ 'overlays',
10
+ ];
11
+ const EMPTY_FACTS = Object.freeze([]);
12
+ const EMPTY_BLOCKS = Object.freeze([]);
13
+ export class AppShellComposition {
14
+ [APP_SHELL_COMPOSITION_BRAND] = true;
15
+ #slotsById;
16
+ #providers;
17
+ id;
18
+ label;
19
+ description;
20
+ facts;
21
+ constructor(input) {
22
+ if (input === undefined || input === null || typeof input !== 'object' || Array.isArray(input)) {
23
+ throw new Error('app shell composition: input must be an object');
24
+ }
25
+ if (input.providers !== undefined && !isProviderScope(input.providers)) {
26
+ throw new Error('app shell composition: providers must be created by providerScope()');
27
+ }
28
+ const slotsById = normalizeSlots(input.slots);
29
+ if (!slotsById.has('content')) {
30
+ throw new Error('app shell composition: content slot is required');
31
+ }
32
+ this.#slotsById = slotsById;
33
+ this.#providers = input.providers;
34
+ this.id = optionalTrimmedText(input.id);
35
+ this.label = optionalTrimmedText(input.label);
36
+ this.description = optionalTrimmedText(input.description);
37
+ this.facts = freezeFacts(input.facts);
38
+ Object.freeze(this);
39
+ }
40
+ slotIds() {
41
+ return Object.freeze([...this.#slotsById.keys()]);
42
+ }
43
+ slots() {
44
+ return Object.freeze([...this.#slotsById.values()]);
45
+ }
46
+ slot(slotId) {
47
+ return this.#slotsById.get(normalizeSlotId(slotId))?.blocks ?? EMPTY_BLOCKS;
48
+ }
49
+ blocks() {
50
+ return Object.freeze([...this.#slotsById.values()].flatMap((slot) => slot.blocks));
51
+ }
52
+ dataContracts() {
53
+ return Object.freeze(this.blocks().flatMap((block) => (block.data === undefined ? [] : [block.data])));
54
+ }
55
+ commandIntents() {
56
+ return Object.freeze(this.blocks().flatMap((block) => block.commands ?? []));
57
+ }
58
+ providerScope() {
59
+ return this.#providers;
60
+ }
61
+ }
62
+ export function defineAppShellComposition(input) {
63
+ return new AppShellComposition(input);
64
+ }
65
+ export function isAppShellComposition(value) {
66
+ return Boolean(value
67
+ && typeof value === 'object'
68
+ && value[APP_SHELL_COMPOSITION_BRAND] === true);
69
+ }
70
+ function normalizeSlots(slots) {
71
+ if (slots === undefined || slots === null || typeof slots !== 'object' || Array.isArray(slots)) {
72
+ throw new Error('app shell composition: slots must be an object');
73
+ }
74
+ const slotsById = new Map();
75
+ for (const [rawSlotId, content] of Object.entries(slots)) {
76
+ if (content === undefined) {
77
+ continue;
78
+ }
79
+ const slotId = normalizeSlotId(rawSlotId);
80
+ if (slotsById.has(slotId)) {
81
+ throw new Error(`app shell composition: duplicate slot ${slotId}`);
82
+ }
83
+ const blocks = normalizeSlotContent(content, `slots.${slotId}`);
84
+ if (blocks.length === 0) {
85
+ throw new Error(`app shell composition: slot ${slotId} must include at least one block`);
86
+ }
87
+ slotsById.set(slotId, Object.freeze({
88
+ id: slotId,
89
+ blocks,
90
+ }));
91
+ }
92
+ return slotsById;
93
+ }
94
+ function normalizeSlotContent(content, path) {
95
+ if (Array.isArray(content)) {
96
+ return Object.freeze(content.flatMap((item, index) => normalizeSlotContent(item, `${path}[${index}]`)));
97
+ }
98
+ if (!isBlockDefinition(content)) {
99
+ throw new Error(`${path}: slot content must be created by defineBlock()`);
100
+ }
101
+ return Object.freeze([content]);
102
+ }
103
+ function normalizeSlotId(slotId) {
104
+ const normalized = slotId.trim();
105
+ if (!APP_SHELL_SLOT_IDS.includes(normalized)) {
106
+ throw new Error(`app shell composition: unsupported slot ${normalized}`);
107
+ }
108
+ return normalized;
109
+ }
110
+ function optionalTrimmedText(value) {
111
+ if (value === undefined) {
112
+ return undefined;
113
+ }
114
+ const normalized = value.trim();
115
+ return normalized === '' ? undefined : normalized;
116
+ }
117
+ function freezeFacts(facts) {
118
+ if (facts === undefined || facts.length === 0) {
119
+ return EMPTY_FACTS;
120
+ }
121
+ return Object.freeze(facts.map((fact) => Object.freeze({ ...fact })));
122
+ }
123
+ //# sourceMappingURL=app-shell-composition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-shell-composition.js","sourceRoot":"","sources":["../../src/core/app-shell-composition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type ActiveBindingCollection } from './active-binding-collection.js';
2
+ import { type BindingFact, type BindingFrame, type BindingIssue, type BindingSnapshot, type ProviderResolution, type ProviderScope } from './binding.js';
3
+ import { type BindingLifecycleRecord } from './binding-lifecycle.js';
4
+ export interface BindingFrameUpdateFromSnapshotsInput {
5
+ readonly collection: ActiveBindingCollection;
6
+ readonly scope: ProviderScope;
7
+ readonly snapshots: readonly BindingSnapshot[];
8
+ readonly records?: readonly BindingLifecycleRecord[];
9
+ }
10
+ export interface BindingFrameUpdate {
11
+ readonly frame: BindingFrame;
12
+ readonly records: readonly BindingLifecycleRecord[];
13
+ readonly resolutions: readonly ProviderResolution[];
14
+ readonly issues: readonly BindingIssue[];
15
+ readonly facts: readonly BindingFact[];
16
+ }
17
+ export declare function bindingFrameUpdateFromSnapshots(input: BindingFrameUpdateFromSnapshotsInput): BindingFrameUpdate;
18
+ //# sourceMappingURL=binding-frame-update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binding-frame-update.d.ts","sourceRoot":"","sources":["../../src/core/binding-frame-update.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAKL,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAEnB,MAAM,cAAc,CAAC;AACtB,OAAO,EAIL,KAAK,sBAAsB,EAC5B,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,oCAAoC;IACnD,QAAQ,CAAC,UAAU,EAAE,uBAAuB,CAAC;IAC7C,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,SAAS,eAAe,EAAE,CAAC;IAC/C,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAC;CACtD;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACpD,QAAQ,CAAC,WAAW,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACpD,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;CACxC;AAED,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,oCAAoC,GAC1C,kBAAkB,CA0DpB"}