@object-ui/core 17.6.0 → 17.7.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 (134) hide show
  1. package/CHANGELOG.md +6610 -0
  2. package/README.md +101 -14
  3. package/dist/actions/ActionEngine.d.ts +4 -2
  4. package/dist/actions/ActionEngine.js +13 -8
  5. package/dist/actions/ActionRunner.d.ts +288 -27
  6. package/dist/actions/ActionRunner.js +443 -63
  7. package/dist/actions/TransactionManager.d.ts +7 -2
  8. package/dist/actions/actionKeys.d.ts +9 -7
  9. package/dist/actions/actionKeys.js +57 -14
  10. package/dist/actions/actionResponse.js +2 -2
  11. package/dist/actions/index.d.ts +1 -0
  12. package/dist/actions/index.js +1 -0
  13. package/dist/actions/recordDelete.d.ts +118 -0
  14. package/dist/actions/recordDelete.js +112 -0
  15. package/dist/adapters/ValueDataSource.d.ts +6 -1
  16. package/dist/adapters/ValueDataSource.js +1090 -98
  17. package/dist/adapters/batchTransaction.d.ts +1 -1
  18. package/dist/adapters/batchTransaction.js +1 -1
  19. package/dist/builder/schema-builder.d.ts +38 -81
  20. package/dist/builder/schema-builder.js +33 -152
  21. package/dist/data-scope/ViewDataProvider.d.ts +1 -1
  22. package/dist/data-scope/ViewDataProvider.js +21 -1
  23. package/dist/data-scope/element-data-source.d.ts +261 -7
  24. package/dist/data-scope/element-data-source.js +342 -52
  25. package/dist/data-scope/index.d.ts +9 -4
  26. package/dist/data-scope/index.js +9 -4
  27. package/dist/evaluator/ExpressionEvaluator.d.ts +86 -0
  28. package/dist/evaluator/ExpressionEvaluator.js +184 -12
  29. package/dist/evaluator/FormulaFunctions.d.ts +0 -10
  30. package/dist/evaluator/FormulaFunctions.js +166 -27
  31. package/dist/evaluator/declaredPredicate.d.ts +93 -9
  32. package/dist/evaluator/declaredPredicate.js +117 -16
  33. package/dist/evaluator/fieldRules.d.ts +88 -4
  34. package/dist/evaluator/fieldRules.js +203 -31
  35. package/dist/evaluator/index.d.ts +1 -0
  36. package/dist/evaluator/index.js +1 -0
  37. package/dist/evaluator/listConditional.d.ts +103 -34
  38. package/dist/evaluator/listConditional.js +127 -50
  39. package/dist/evaluator/optionRules.d.ts +77 -6
  40. package/dist/evaluator/optionRules.js +87 -10
  41. package/dist/evaluator/predicateInput.d.ts +15 -4
  42. package/dist/evaluator/predicateInput.js +35 -2
  43. package/dist/evaluator/rowPredicateCanon.d.ts +7 -18
  44. package/dist/evaluator/rowPredicateCanon.js +65 -115
  45. package/dist/evaluator/subjectPermissions.d.ts +76 -0
  46. package/dist/evaluator/subjectPermissions.js +44 -0
  47. package/dist/evaluator/unevaluablePredicate.d.ts +57 -0
  48. package/dist/evaluator/unevaluablePredicate.js +70 -0
  49. package/dist/index.d.ts +14 -0
  50. package/dist/index.js +80 -2
  51. package/dist/protocols/index.d.ts +0 -1
  52. package/dist/protocols/index.js +9 -1
  53. package/dist/registry/Registry.d.ts +358 -31
  54. package/dist/registry/Registry.js +263 -11
  55. package/dist/registry/WidgetRegistry.js +7 -3
  56. package/dist/registry/html-tier-intrinsics.d.ts +90 -0
  57. package/dist/registry/html-tier-intrinsics.js +110 -0
  58. package/dist/registry/public-blocks.d.ts +8 -0
  59. package/dist/registry/public-blocks.js +57 -0
  60. package/dist/theme/ThemeEngine.js +1 -1
  61. package/dist/utils/chart-category-key.d.ts +82 -0
  62. package/dist/utils/chart-category-key.js +84 -0
  63. package/dist/utils/chart-measure-key.d.ts +64 -0
  64. package/dist/utils/chart-measure-key.js +65 -0
  65. package/dist/utils/chart-presentation.d.ts +95 -112
  66. package/dist/utils/chart-presentation.js +169 -104
  67. package/dist/utils/chart-series.d.ts +131 -5
  68. package/dist/utils/chart-series.js +98 -16
  69. package/dist/utils/column-sortability.d.ts +157 -0
  70. package/dist/utils/column-sortability.js +217 -0
  71. package/dist/utils/dashboard-filters.d.ts +38 -6
  72. package/dist/utils/dashboard-filters.js +107 -61
  73. package/dist/utils/dataset-format.d.ts +211 -30
  74. package/dist/utils/dataset-format.js +389 -46
  75. package/dist/utils/date-display.d.ts +354 -0
  76. package/dist/utils/date-display.js +463 -0
  77. package/dist/utils/date-macros.js +7 -0
  78. package/dist/utils/drill-down.d.ts +78 -0
  79. package/dist/utils/drill-down.js +93 -0
  80. package/dist/utils/emptiness.d.ts +96 -0
  81. package/dist/utils/emptiness.js +101 -0
  82. package/dist/utils/expand-fields.d.ts +76 -6
  83. package/dist/utils/expand-fields.js +76 -6
  84. package/dist/utils/extract-records.d.ts +65 -5
  85. package/dist/utils/extract-records.js +65 -8
  86. package/dist/utils/filter-converter.d.ts +152 -4
  87. package/dist/utils/filter-converter.js +1092 -22
  88. package/dist/utils/filter-tokens.d.ts +49 -5
  89. package/dist/utils/filter-tokens.js +105 -33
  90. package/dist/utils/grouping-fields.d.ts +61 -0
  91. package/dist/utils/grouping-fields.js +84 -0
  92. package/dist/utils/managedBy.d.ts +3 -3
  93. package/dist/utils/managedBy.js +5 -5
  94. package/dist/utils/native-date-value.d.ts +48 -0
  95. package/dist/utils/native-date-value.js +167 -0
  96. package/dist/utils/non-grid-row-ceiling.d.ts +143 -0
  97. package/dist/utils/non-grid-row-ceiling.js +141 -0
  98. package/dist/utils/normalize-list-view.d.ts +121 -1
  99. package/dist/utils/normalize-list-view.js +186 -6
  100. package/dist/utils/number-display.d.ts +63 -14
  101. package/dist/utils/number-display.js +34 -12
  102. package/dist/utils/object-aggregate-query.d.ts +113 -0
  103. package/dist/utils/object-aggregate-query.js +50 -0
  104. package/dist/utils/parent-scope.d.ts +123 -0
  105. package/dist/utils/parent-scope.js +140 -0
  106. package/dist/utils/predicate-fields.d.ts +45 -12
  107. package/dist/utils/predicate-fields.js +137 -12
  108. package/dist/utils/record-color.d.ts +75 -0
  109. package/dist/utils/record-color.js +65 -0
  110. package/dist/utils/record-source.d.ts +298 -0
  111. package/dist/utils/record-source.js +331 -0
  112. package/dist/utils/record-title.d.ts +148 -8
  113. package/dist/utils/record-title.js +220 -26
  114. package/dist/utils/reference-keys.d.ts +21 -22
  115. package/dist/utils/reference-keys.js +532 -29
  116. package/dist/utils/sort-query.d.ts +115 -15
  117. package/dist/utils/sort-query.js +240 -13
  118. package/dist/utils/text-comparand.d.ts +92 -0
  119. package/dist/utils/text-comparand.js +99 -0
  120. package/dist/utils/without-denied-fields.d.ts +49 -0
  121. package/dist/utils/without-denied-fields.js +52 -0
  122. package/dist/validation/index.d.ts +8 -4
  123. package/dist/validation/index.js +8 -4
  124. package/dist/validation/schema-validator.d.ts +1 -1
  125. package/dist/validation/schema-validator.js +200 -82
  126. package/dist/validation/validators/object-validation-engine.d.ts +1 -1
  127. package/dist/validation/validators/object-validation-engine.js +14 -3
  128. package/package.json +8 -9
  129. package/dist/data-scope/DataScopeManager.d.ts +0 -127
  130. package/dist/data-scope/DataScopeManager.js +0 -229
  131. package/dist/protocols/ResponsiveProtocol.d.ts +0 -73
  132. package/dist/protocols/ResponsiveProtocol.js +0 -158
  133. package/dist/validation/validation-engine.d.ts +0 -88
  134. package/dist/validation/validation-engine.js +0 -434
@@ -0,0 +1,57 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ /**
9
+ * Is this value a gate the author DECLARED but the client cannot EVALUATE?
10
+ * (objectui#11358)
11
+ *
12
+ * A predicate gate (`visible` / `hidden` / `enabled` / `disabled` /
13
+ * `condition`) is in one of three states, and this is the one place the third
14
+ * is told apart from the other two:
15
+ *
16
+ * - **absent** — `null` / `undefined` / `''` / blank predicate text. Nothing
17
+ * was declared; {@link hasDeclaredPredicate} answers "not declared" (and
18
+ * reports a blank one, objectui#8069).
19
+ * - **evaluable** — a boolean, a predicate string, or an envelope whose
20
+ * `source` is a non-blank string.
21
+ * - **declared but not evaluable** — anything else that is present: an
22
+ * envelope with no string `source` (the `ast`-only `{ dialect: 'cel', ast }`
23
+ * an authoring door can admit), a number (`0`, `42`), an object with no
24
+ * `source` (`{}`), an array. This function answers `true` for exactly
25
+ * these.
26
+ *
27
+ * Triage's ruling on objectui#11358 makes the third state "declared and
28
+ * faulting": it is a gate, so it is never "no gate", and it cannot be
29
+ * evaluated, so it takes the path every other faulting predicate takes —
30
+ * reported, and answered with the fail direction its key already has. Before
31
+ * that ruling the normalizer folded it to `undefined`, the same answer as
32
+ * "absent", so every reader showed / enabled / ran it in silence: ADR-0137 D4's
33
+ * "a gate predicate that is blank or faulting is diagnosed, never a silent
34
+ * `true`", broken by a fold.
35
+ *
36
+ * Read by the normalizer ({@link toPredicateInput}, which now keeps the state
37
+ * instead of folding it), the evaluation step
38
+ * (`ExpressionEvaluator.evaluateCondition`, which reports it and answers it as a
39
+ * fault), the canonical predicate helper (`evalFieldPredicate`, which tags its
40
+ * reason) and the dev-mode schema validator (which still refuses it). ⛔ Not
41
+ * re-exported from the package entry: it is the internal definition those four
42
+ * share, not public API.
43
+ *
44
+ * ⚠️ No client-side reading of what an `ast` MEANT: the client evaluates
45
+ * `source` text only, so an `ast` with no `source` is not evaluable here,
46
+ * whatever it says.
47
+ */
48
+ export declare function isUnevaluablePredicate(value: unknown): boolean;
49
+ /**
50
+ * The `reason` reported for a gate that is declared but cannot be evaluated,
51
+ * tagged like an engine reason (`[parse]`, `[type]`, `[blank]`) because it
52
+ * travels the same two channels — `evalFieldPredicate`'s one-time warning and
53
+ * its `onFault` passback — and a caller that routes on the tag must tell it
54
+ * apart from a predicate that faulted with text in it: the fix is to give the
55
+ * gate a `source` (or delete it), never to debug CEL syntax.
56
+ */
57
+ export declare const UNEVALUABLE_PREDICATE_REASON: string;
@@ -0,0 +1,70 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ /**
9
+ * Is this value a gate the author DECLARED but the client cannot EVALUATE?
10
+ * (objectui#11358)
11
+ *
12
+ * A predicate gate (`visible` / `hidden` / `enabled` / `disabled` /
13
+ * `condition`) is in one of three states, and this is the one place the third
14
+ * is told apart from the other two:
15
+ *
16
+ * - **absent** — `null` / `undefined` / `''` / blank predicate text. Nothing
17
+ * was declared; {@link hasDeclaredPredicate} answers "not declared" (and
18
+ * reports a blank one, objectui#8069).
19
+ * - **evaluable** — a boolean, a predicate string, or an envelope whose
20
+ * `source` is a non-blank string.
21
+ * - **declared but not evaluable** — anything else that is present: an
22
+ * envelope with no string `source` (the `ast`-only `{ dialect: 'cel', ast }`
23
+ * an authoring door can admit), a number (`0`, `42`), an object with no
24
+ * `source` (`{}`), an array. This function answers `true` for exactly
25
+ * these.
26
+ *
27
+ * Triage's ruling on objectui#11358 makes the third state "declared and
28
+ * faulting": it is a gate, so it is never "no gate", and it cannot be
29
+ * evaluated, so it takes the path every other faulting predicate takes —
30
+ * reported, and answered with the fail direction its key already has. Before
31
+ * that ruling the normalizer folded it to `undefined`, the same answer as
32
+ * "absent", so every reader showed / enabled / ran it in silence: ADR-0137 D4's
33
+ * "a gate predicate that is blank or faulting is diagnosed, never a silent
34
+ * `true`", broken by a fold.
35
+ *
36
+ * Read by the normalizer ({@link toPredicateInput}, which now keeps the state
37
+ * instead of folding it), the evaluation step
38
+ * (`ExpressionEvaluator.evaluateCondition`, which reports it and answers it as a
39
+ * fault), the canonical predicate helper (`evalFieldPredicate`, which tags its
40
+ * reason) and the dev-mode schema validator (which still refuses it). ⛔ Not
41
+ * re-exported from the package entry: it is the internal definition those four
42
+ * share, not public API.
43
+ *
44
+ * ⚠️ No client-side reading of what an `ast` MEANT: the client evaluates
45
+ * `source` text only, so an `ast` with no `source` is not evaluable here,
46
+ * whatever it says.
47
+ */
48
+ export function isUnevaluablePredicate(value) {
49
+ if (value === null || value === undefined)
50
+ return false;
51
+ if (typeof value === 'boolean' || typeof value === 'string')
52
+ return false;
53
+ if (typeof value === 'object') {
54
+ return typeof value.source !== 'string';
55
+ }
56
+ // A number (`0` included — it is present, not absent), a function, a symbol
57
+ // or a bigint: nothing a predicate is spelled as.
58
+ return true;
59
+ }
60
+ /**
61
+ * The `reason` reported for a gate that is declared but cannot be evaluated,
62
+ * tagged like an engine reason (`[parse]`, `[type]`, `[blank]`) because it
63
+ * travels the same two channels — `evalFieldPredicate`'s one-time warning and
64
+ * its `onFault` passback — and a caller that routes on the tag must tell it
65
+ * apart from a predicate that faulted with text in it: the fix is to give the
66
+ * gate a `source` (or delete it), never to debug CEL syntax.
67
+ */
68
+ export const UNEVALUABLE_PREDICATE_REASON = '[unevaluable] the gate is declared but has no `source` to evaluate (an ' +
69
+ '`ast`-only envelope, a number, an object or an array) — it fails in the ' +
70
+ 'direction its key fails on any fault';
package/dist/index.d.ts CHANGED
@@ -8,6 +8,7 @@
8
8
  export type { SchemaNode, ComponentRendererProps } from './types/index.js';
9
9
  export * from './registry/Registry.js';
10
10
  export * from './registry/public-blocks.js';
11
+ export * from './registry/html-tier-intrinsics.js';
11
12
  export * from './registry/PluginSystem.js';
12
13
  export * from './registry/PluginScopeImpl.js';
13
14
  export * from './registry/WidgetRegistry.js';
@@ -17,9 +18,12 @@ export * from './utils/dom-props.js';
17
18
  export * from './utils/filter-converter.js';
18
19
  export * from './utils/managedBy.js';
19
20
  export * from './utils/extract-records.js';
21
+ export * from './utils/non-grid-row-ceiling.js';
22
+ export * from './utils/emptiness.js';
20
23
  export * from './utils/expand-fields.js';
21
24
  export * from './utils/retired-field-types.js';
22
25
  export * from './utils/unmaterialized-fields.js';
26
+ export * from './utils/column-sortability.js';
23
27
  export * from './utils/column-identity.js';
24
28
  export * from './utils/sort-values.js';
25
29
  export * from './utils/sort-query.js';
@@ -51,14 +55,24 @@ export * from './utils/dashboard-filters.js';
51
55
  export * from './utils/merge-filters.js';
52
56
  export * from './utils/compare-to.js';
53
57
  export * from './utils/chart-series.js';
58
+ export * from './utils/chart-measure-key.js';
59
+ export * from './utils/chart-category-key.js';
60
+ export * from './utils/object-aggregate-query.js';
54
61
  export * from './utils/chart-presentation.js';
55
62
  export * from './utils/number-display.js';
63
+ export * from './utils/date-display.js';
64
+ export * from './utils/native-date-value.js';
56
65
  export * from './utils/dataset-format.js';
57
66
  export * from './utils/dataset-pivot.js';
58
67
  export * from './utils/record-title.js';
68
+ export * from './utils/record-color.js';
59
69
  export * from './utils/export-filename.js';
60
70
  export * from './utils/reference-keys.js';
61
71
  export * from './utils/predicate-record.js';
72
+ export * from './utils/without-denied-fields.js';
73
+ export * from './utils/parent-scope.js';
62
74
  export * from './utils/predicate-fields.js';
75
+ export * from './utils/grouping-fields.js';
63
76
  export * from './utils/normalize-list-view.js';
77
+ export * from './utils/record-source.js';
64
78
  export * from './utils/humanize-label.js';
package/dist/index.js CHANGED
@@ -7,6 +7,7 @@
7
7
  */
8
8
  export * from './registry/Registry.js';
9
9
  export * from './registry/public-blocks.js';
10
+ export * from './registry/html-tier-intrinsics.js';
10
11
  export * from './registry/PluginSystem.js';
11
12
  export * from './registry/PluginScopeImpl.js';
12
13
  export * from './registry/WidgetRegistry.js';
@@ -21,6 +22,17 @@ export * from './utils/dom-props.js';
21
22
  export * from './utils/filter-converter.js';
22
23
  export * from './utils/managedBy.js';
23
24
  export * from './utils/extract-records.js';
25
+ // The non-grid row ceiling (objectui#7210), homed beside the `extractRecords`
26
+ // it wraps by objectui#7508's ruling A′. `@object-ui/react` re-exports three of
27
+ // these names and keeps only the React footnote, `NonGridRowCeilingNote`.
28
+ export * from './utils/non-grid-row-ceiling.js';
29
+ // The emptiness FLOOR (objectui#8496, director seat, decision batch #86): the
30
+ // weakest common claim about "is this value empty" — `null`, `undefined`, the
31
+ // empty string, the empty array — below `plugin-detail`, `plugin-list`,
32
+ // `plugin-kanban` and `@object-ui/fields`, each of which used to spell those
33
+ // four members privately. Surfaces EXTEND it or DECLINE a member out loud; ⛔
34
+ // the floor itself never grows past the four.
35
+ export * from './utils/emptiness.js';
24
36
  export * from './utils/expand-fields.js';
25
37
  // The RETIREMENT gate (objectui#4914, maintainer ruling B). Homed here rather
26
38
  // than in `@object-ui/fields` because `@object-ui/components` is one of its six
@@ -29,6 +41,12 @@ export * from './utils/expand-fields.js';
29
41
  // name, so its published surface is unchanged.
30
42
  export * from './utils/retired-field-types.js';
31
43
  export * from './utils/unmaterialized-fields.js';
44
+ // [#5729] The consumer half of objectstack#10235's ruling: the SERVED
45
+ // per-column sortability projection, and the one spelling of its contract
46
+ // (`entry exists && sortable: true`). Homed beside the storage-fact set above
47
+ // because a consumer that reaches for one must be able to see the other and
48
+ // know which one the platform actually served.
49
+ export * from './utils/column-sortability.js';
32
50
  export * from './utils/column-identity.js';
33
51
  export * from './utils/sort-values.js';
34
52
  export * from './utils/sort-query.js';
@@ -55,14 +73,29 @@ export * from './runtime/capabilities.js';
55
73
  export { composeStacks } from '@objectstack/spec';
56
74
  export * from './utils/drill-down.js';
57
75
  export * from './utils/date-macros.js';
58
- // Session-scoped filter placeholders ({current_user_id} / {current_org_id})
76
+ // Session-scoped filter placeholders ({current_user_id} / {current_org_id}),
77
+ // the record-scoped `{record_id}` (objectui#7297),
59
78
  // plus `resolveFilterPlaceholders`, the single entry point every surface
60
- // should call so no vocabulary is silently skipped (framework #3574).
79
+ // should call so no vocabulary is silently skipped (objectstack-ai/objectstack#3574).
61
80
  export * from './utils/filter-tokens.js';
62
81
  export * from './utils/dashboard-filters.js';
63
82
  export * from './utils/merge-filters.js';
64
83
  export * from './utils/compare-to.js';
65
84
  export * from './utils/chart-series.js';
85
+ // "Which result column carries the measure?" — one answer for the row
86
+ // projection and the series binding alike, delegated to the spec's own
87
+ // derivation so the two cannot drift (objectui#8266).
88
+ export * from './utils/chart-measure-key.js';
89
+ // "Which result column carries the CATEGORY?" — the same move on the other
90
+ // axis, delegated to the contract's own published derivation so a relay cannot
91
+ // floor the x-axis binding on a literal the aggregate contradicts
92
+ // (objectui#8269).
93
+ export * from './utils/chart-category-key.js';
94
+ // "Which CALL does an object-bound aggregate make when its `groupBy` is the
95
+ // structured date-bucketing node?" — the same move on the REQUEST rather than
96
+ // on a result column, so the chart and the metric cannot post two different
97
+ // wires for one authored shape (objectui#8613).
98
+ export * from './utils/object-aggregate-query.js';
66
99
  // The AUTHORED half of a dataset-bound chart (objectui#4229's data/presentation
67
100
  // split), shared by the dashboard widget and the report's embedded chart so the
68
101
  // same spec keys are lowered identically on both (objectui#4877).
@@ -73,12 +106,26 @@ export * from './utils/chart-presentation.js';
73
106
  // `dataset-format` below from reaching it (so the two drifted). `@object-ui/i18n`
74
107
  // re-exports these names unchanged, so both import paths name the same symbol.
75
108
  export * from './utils/number-display.js';
109
+ // The ONE date-display path (objectui#7178) — the same story one type over.
110
+ // It lived in `@object-ui/fields`' React barrel, which `dataset-format`
111
+ // below could not import, so a date-valued measure rendered its raw ISO
112
+ // string. `@object-ui/fields` re-exports these names unchanged.
113
+ export * from './utils/date-display.js';
114
+ // The native date/time control adapters (objectui#3127), moved down from
115
+ // `@object-ui/fields` so `@object-ui/components`' data table can share them
116
+ // instead of keeping private copies (objectui#10625). `@object-ui/fields`
117
+ // re-exports these names unchanged.
118
+ export * from './utils/native-date-value.js';
76
119
  export * from './utils/dataset-format.js';
77
120
  // Pivot lookup-key encoders, shared by every cross-tab renderer so the
78
121
  // dashboard widget and the report renderer key their buckets identically
79
122
  // (objectstack#5473 / objectstack#5665).
80
123
  export * from './utils/dataset-pivot.js';
81
124
  export * from './utils/record-title.js';
125
+ // The one `colorField` ladder every record view shares (objectui#7243) — the
126
+ // gantt, calendar and timeline all resolve an authored option colour here
127
+ // instead of each guessing at the raw stored value.
128
+ export * from './utils/record-color.js';
82
129
  export * from './utils/export-filename.js';
83
130
  export * from './utils/reference-keys.js';
84
131
  // Binds a fetched record into an expression scope the way the SERVER binds it
@@ -86,10 +133,41 @@ export * from './utils/reference-keys.js';
86
133
  // `toPredicateRecord` for why an unnormalized one gives the same predicate
87
134
  // different verdicts on different surfaces.
88
135
  export * from './utils/predicate-record.js';
136
+ // The field-read rule for ONE record (objectui#10594, ruling A): the row as the
137
+ // viewer may read it, which every surface that builds a display value from a
138
+ // whole row calls. It replaced module-private copies in `@object-ui/fields`,
139
+ // `@object-ui/react`, `@object-ui/app-shell` and `@object-ui/plugin-detail`.
140
+ export * from './utils/without-denied-fields.js';
141
+ // The parent-relationship condition a detail-page related list is scoped by.
142
+ // One implementation, imported by BOTH the row query and the tab-badge count
143
+ // probe — objectui#8882 is what two of them cost.
144
+ export * from './utils/parent-scope.js';
89
145
  // The other half of a view's field appetite: the fields its PREDICATES read,
90
146
  // which the column-derived `$select` never asked the server for.
91
147
  export * from './utils/predicate-fields.js';
148
+ // The THIRD source of a view's field appetite: the fields it GROUPS BY. The
149
+ // spec's `grouping` block is a sibling of `columns`, not a subset, so a grid
150
+ // may group by a field it never shows (objectui#7179).
151
+ export * from './utils/grouping-fields.js';
92
152
  export * from './utils/normalize-list-view.js';
153
+ // The ONE record-source ladder, both halves. `resolveRecordSourceConfig`
154
+ // (`ce2aaefe1`) is the PRODUCER — the ruled `data` / `staticData` /
155
+ // `objectName` ladder, hand-copied into five view plugins with no gate holding
156
+ // them together. `resolveRecordSourceObjectName` (`b041b9c0c`) is the READER
157
+ // over its output: six view plugins each spelled "the object this block is
158
+ // bound to — the resolved data config's object when it names one, else
159
+ // `objectName`" locally, and had drifted. Both are deliberately SEPARATE from
160
+ // the `normalizeListViewSchema` gap-fill above: that one answers how
161
+ // `objectName` gets POPULATED when absent (#7477 ruling B), these answer which
162
+ // object a block RESOLVES (the three-rung ladder `77cb489b4` declared). Merging them
163
+ // would override one standing ruling or the other.
164
+ // A THIRD reading ships beside them since objectui#9571:
165
+ // `recordSourceDataArmForType` answers which `data` arm a registered block TYPE
166
+ // declares, for the one consumer that cannot be handed the arm as a parameter —
167
+ // `SchemaRenderer`, which is generic over every type and holds only
168
+ // `schema.type`. Read its docblock before adding a row; it transports the call
169
+ // sites' own literals rather than re-deriving them.
170
+ export * from './utils/record-source.js';
93
171
  // The single home for the VALUE fallback prettifier (a stored value becomes a
94
172
  // display string when nothing resolves it). `@object-ui/fields` and
95
173
  // `@object-ui/plugin-charts` each carried a byte-identical private copy;
@@ -7,5 +7,4 @@
7
7
  */
8
8
  export * from './DndProtocol.js';
9
9
  export * from './KeyboardProtocol.js';
10
- export * from './ResponsiveProtocol.js';
11
10
  export * from './SharingProtocol.js';
@@ -15,5 +15,13 @@ export * from './KeyboardProtocol.js';
15
15
  // which declares its own `NotificationSystemConfig` and is what every surface
16
16
  // reads. Re-typing the bridge would have meant re-declaring a vocabulary the
17
17
  // spec had just retired (AGENTS.md #0.1).
18
- export * from './ResponsiveProtocol.js';
18
+ // `ResponsiveProtocol` removed in the objectstack#11027 uptake (objectui#7580):
19
+ // it bridged `@objectstack/spec/ui`'s `ResponsiveConfig`, which that retirement
20
+ // deleted with no successor, and it had zero importers in this repo (measured on
21
+ // objectui#4773; `docs/audits/2901-spec-enum-renderer-coverage.md` had already
22
+ // recorded it as one of the zero-importer protocols). Re-typing the bridge would
23
+ // have meant re-declaring a vocabulary the spec had just retired, for a reader
24
+ // that does not exist — AGENTS.md #0.1, and the same disposition
25
+ // `NotificationProtocol` got above. The layout vocabulary that DOES have a
26
+ // renderer is re-homed instead, in `@object-ui/types` and `@object-ui/layout`.
19
27
  export * from './SharingProtocol.js';