Skip to content

Commit 24c554d

Browse files
feat(spec)!: record:line_items gets its ComponentPropsMap row, its columns are the inline grid column contract, and the showcase Tasks grid binds by name (#21142) (#21244)
Fixes #21142 Clause-②: yes Seam: renderer `@object-ui/plugin-form` `LineItemsPanel` → `@object-ui/fields` `GridField` (binds `column.name`) ← producer: objectstack showcase `record:line_items` `columns[].field` The showcase project page's Tasks grid keyed all five of its columns `field`. The line-items grid binds a column by `name`, so every cell rendered empty. Nothing refused it: `record:line_items` had no `ComponentPropsMap` row, so the component-props gate skipped its props bag as unregistered. This PR fixes the producer and adds the row (the claim's call, per triage `5929028089`). From here on a `field`-keyed column is refused at authoring, with the rename to `name`. ## What changed - **`examples/app-showcase/src/ui/pages/project-detail.page.ts`**: the five columns are keyed `name` (`title`, `status`, `priority`, `estimate_hours`, `due_date`). Nothing else on the page moved. - **`packages/spec/src/ui/component.zod.ts`**: new row `ComponentPropsMap['record:line_items']` = `RecordLineItemsProps`, a strict shape of the fifteen keys objectui's `LineItemsPanel` reads (measured below): - `relationshipField` is required, and so is `columns` (at least one). Nothing on this panel derives either one. - `childObject` is optional, because the component-level `dataSource` binding can supply it. - `filter`, `sort` and `limit` take the declarations every sibling door takes: the ViewFilterRule array, the SortItem array and a positive integer. - The keys it shares with an `object-master-detail-form` detail entry take that entry's types and alias table. - The four entry keys this block does not read (`addLabel`, `sortField`, `formFields`, `inlineMode`) are refused with a `guidance` reason. - New types `RecordLineItemsProps` and `RecordLineItemsPropsParsed`. - **`columns` IS `InlineGridColumnSchema`**, by reference and not a copy (Zone 2 #4: same shape, see below). The retired `field` spelling is refused by name with the prescription naming `name`. One carrier difference is stated in the `describe()`: this panel does not hydrate a column from the child field. For the same reason, `defineStack`'s identity-only check (`collectHydratedInlineColumnErrors`) is deliberately NOT extended to this block, and a control pin holds that. - **`packages/spec/src/ui/component-type-vocabulary.ts`**: `record:line_items` leaves `STRING_ARM_REGISTERED_TYPES`, which is now empty. The export stays, and its docblock records why it is empty. The type stays KNOWN through its row. - **ADR-0087**: new D3 semantic entry `ui-record-line-items-props-closed`, plus a step-18 rationale fragment (order 57). `gen:migration-registry` regenerated the registry. No D2 conversion: page-component `properties` is not parsed on the save or load path, and the census found one producer, respelled here. - **Pins flipped / added**: - `validate-component-props.test.ts`: `record:line_items` leaves the unregistered-skip `it.each`. A new suite asserts the `field`-keyed columns fire `component-props-unknown-key` at `...properties.columns.N.field`, with `component-props-invalid` at `...columns.N.name`. The `name`-keyed control is silent. - `component-type-vocabulary.test.ts`: known through the row, not on the ledger, not an enum member. - `inline-grid-column-carriers.test.ts`: a fourth-carrier section covering identity of the column element, the `field` refusal (code `unrecognized_keys` at path `['columns', 0]`), the currency `scale` refusal, the bogus key, `relationshipField` and `columns` required, `.min(1)`, the alias and guidance refusals, and full-read-set and showcase controls. A last control shows that `defineStack` does not judge an identity-only line-items column, while the same column under `object-master-detail-form` is judged. - New showcase test `examples/app-showcase/test/project-detail-line-items.test.ts`: the five columns are keyed `name`, each names a `showcase_task` field, the block parses against `RecordLineItemsProps` with its keys intact, and no `field`-keyed line-items column exists anywhere in the showcase. - **Prose made false by the change**: `validate-component-props.ts` header (the skip list and its "earlier editions" history), `validate-component-types.test.ts` comment, and the `validate-page-field-bindings.test.ts` test title ("skips a component type its descriptor table does not carry"). Those are comments and a title only; no lint behaviour changed. - **Generated**: - `dropped-refinements.baseline.json`: new site `ui/RecordLineItemsProps` at `columns.element` and `filter.element`, plus its two counts. - Also regenerated: `api-surface/ui.json`, `export-origins/ui.json`, `declaration-map/ui.json`, `authorable-surface/ui.json`, `json-schema.manifest/ui.json`, `content/docs/references/ui/component.mdx` and `index.mdx`, and `docs/audits/...strictness-ledger.counts/ui.md`. - **Changeset** `.changeset/21142-line-items-columns-name.md`: `@objectstack/spec` minor, BREAKING, `Clause-②: yes (narrowing)`, ADR-0087 `registered ui-record-line-items-props-closed`. What reads it is the component-props gate (advisory findings on `objectstack validate` / `build` / `lint`). The stored-page save and load path does not parse `properties`. ## Measurements **Premise**: holds. At `origin/main` `1ecb871beb`, `project-detail.page.ts:76` authors `amountField: 'estimate_hours'` and `:79`–`:104` author five `columns` keyed `field:`. `record:line_items` was the only entry of `STRING_ARM_REGISTERED_TYPES` (`component-type-vocabulary.ts:68`), and its row-lessness was pinned in `validate-component-props.test.ts:495`. **Read set at the `.objectui-sha` pin `31971ff1e28f`** (objectui `packages/plugin-form/src/LineItemsPanel.tsx`; `SchemaRenderer` hoists `properties` onto `schema`). A count of `schema.KEY` reads gives exactly fifteen keys: - `childObject` `:319`, `:327`, `:498`, `:516`, `:638`, `:673`, `:702`, `:778` - `relationshipField` `:515`, `:674` - `columns` `:702` - `parentObject` `:221` - `parentId` and `recordId` `:228` - `amountField` `:669`, `:703` - `totalField` `:667`, `:669`, `:703` - `title` `:722` - `readonly` `:706`, `:707`, `:723`, `:810` - `minRows` `:704` - `maxRows` `:705` - `filter` `:366` - `sort` `:368`, `:377` - `limit` `:341`, `:437` The wrapper adds no key. `ElementDataSourceGate.tsx` reads the node-level `dataSource` plus the same `filter` / `sort` / `limit` (`:421`, `:434`, `:445`). The mapping `RECORD_LINE_ITEMS_DATA_SOURCE` (`plugin-form/src/index.tsx:556`) writes the binding's `object` onto `childObject`. `requiredPermissions` and `aria`, which other record rows declare, have no read here, so they are not declared. **objectui `main` (`d59f11c0d3dc`, pin is an ancestor: `merge-base --is-ancestor` exit 0)**: - Same fifteen keys; the per-key read counts are identical. - One semantic difference. At the pin the grid's footer total appears only when `totalField` is set (`total_field: schema.totalField ? schema.amountField || 'amount' : undefined`). On `main` (objectui `55a12a8e1`, round 8) it appears whenever `amountField` is named. So the showcase's `amountField` with no `totalField` draws a footer only once the console pin moves past that commit. - `GridField` on `main` declares `GridColumn = InlineGridColumn`, which is the spec's type by reference (objectui `75dcc81c3`). - `0a3e5409f` (grid `sort_field`) changes `GridField` and `MasterDetailForm`, not anything this block reads or hands the grid. - No key is read at the pin but retired on `main`. **Column shape (Zone 2 #4)**: at the pin, `GridField.tsx`'s `GridColumn` interface declares exactly the twenty keys `InlineGridColumnSchema` declares (`name`, `label`, `type`, `options`, `width`, `required`, `prefix`, `step`, `reference`, `displayField`, `idField`, `multiple`, `accept`, `defaultHidden`, `computed`, `expr`, `scale`, `autofill`, `readonlyWhen`, `requiredWhen`). Same shape, so the row references the schema by identity. The one difference belongs to the carrier: `LineItemsPanel` hands `columns` straight to `applyColumnPermissions` and then the grid (`:702`), with no `hydrateColumns` step. An identity-only `{ name }` column therefore draws as a text cell headed by its name, and the `describe()` says so. **Census (Zone 2 #5)** at `1ecb871beb`, matcher `type: 'record:line_items'`: - `examples/`: 1 producer, the showcase page, 5 `field`-keyed columns, respelled here. - `content/docs/`: 0 blocks. One prose tag-list mention in `ui/react-pages.mdx:38`. - `packages/` non-test: 0. - Lit control: the same matcher shape finds 8 other `record:*` blocks in `examples/` (3 `record:details`, 2 `record:highlights`, 1 each `record:path`, `record:quick_actions`, `record:alert`). - Test fixtures naming the type: the three lint test files above. Each was re-judged: one flipped, one comment moved, and one title made honest. The field-bindings fixture is not a props-gate input. **Served showcase page end to end: NOT MEASURED.** Neither checkout has a console build (`packages/console/dist` is absent in both). `pnpm dev` runs `check:console-sha` first, and producing that build needs a full objectui build at the pin, which this dispatch holds read-only. What is measured instead: - The page's block parses against the row with its five `name` keys intact (showcase test). - The objectstack conversion registry carries no `record:line_items` rewrite (`git grep` in `packages/spec/src/conversions`: 0 hits), so no load-time conversion on this side intervenes. ## Tests (at HEAD `c2b91013`) All through `scripts/pm/os-verify-lock.sh`, exit codes read from its `VERDICT` line. The tree is the merged one: `origin/main` `62b90d74` merged through `os-regen-merge.sh`, plus the regeneration commit. | command | result | |:--|:--| | `pnpm --filter @objectstack/spec exec vitest run --project local --maxWorkers=2` | 596 files, 17466 passed, 1 todo | | `pnpm --filter @objectstack/spec run typecheck` (tsc + scripts + test layer) | exit 0 | | `pnpm --filter @objectstack/lint exec vitest run --maxWorkers=2` | 119 files, 5503 passed | | `pnpm --filter @objectstack/lint run typecheck` | exit 0 | | `pnpm --filter @objectstack/sdui-parser exec vitest run --maxWorkers=2` | 13 files, 217 passed | | `pnpm --filter @objectstack/metadata-protocol exec vitest run --maxWorkers=2` | 200 files passed, 3 skipped; 2973 passed, 19 skipped | | `pnpm --filter @objectstack/example-showcase exec vitest run --maxWorkers=2` | 30 files, 391 passed | | `pnpm --filter @objectstack/example-showcase run typecheck` | exit 0 | | `pnpm --filter @objectstack/spec check:generated` | all 15 artifacts up to date | - Dependency closures were rebuilt first (`pnpm --workspace-concurrency=2 --filter` with the `PKG^...` closure of lint, metadata-protocol, sdui-parser and the showcase, plus `@objectstack/spec build`). - `protocol.meta-types-degenerate-derivation.test.ts` (the served-schema count pins) is green unchanged. The new row moves no count: `page` still serves 24 top-level properties, because `properties` is an open record. - **Pre-merge** (`2479fb67` / `742c6970`): the same suites were green. Six transient failures — module-not-found on `@objectstack/spec/*` and `@objectstack/platform-objects/*` — came from a concurrent dist rebuild by the gate run. They were re-run on stable dists: green (4 files / 30 tests, and 30 files / 391 tests). - **eslint, narrowed (measured)**: `eslint --no-inline-config --format json` over the 12 changed `.ts` files reports 12 results, 0 errors, 0 warnings, and none ignored, so all 12 are in the config's population. `eslint.config.mjs` never enables type-aware linting (its `:327-329`), so this diff cannot move the verdict on any file it did not touch. The repo-wide `pnpm lint` is CI's. ## Reverse verification (ablation) The map row `'record:line_items': RecordLineItemsProps,` was deleted through `scripts/ablation-replace.mjs` (anchor 1 → 0, blob `35459aca2181` → `d052475a42e4`), committed state first. Then `pnpm --filter @objectstack/spec build`. `ablation-dist-preflight.mjs --absent` reported the marker absent from all 230 built files, and the tree carried only the source mutation. - Spec (src): `component-type-vocabulary.test.ts` + `inline-grid-column-carriers.test.ts` → **8 failed** / 55 passed. These are the vocabulary pin and seven of the eight new carrier tests. The eighth, the `defineStack` control, reads no row and stays green as intended. - Lint (spec `dist`): `validate-component-props.test.ts` → **1 failed** / 49 passed. "reports a `field`-keyed column" saw zero findings, which is the pre-fix silence. Its `name`-keyed control stays green (vacuously under the ablation). - Showcase: 4/4 green, as expected, because that test parses with `RecordLineItemsProps` directly rather than through the map. - Restore: `git checkout HEAD`, blob back to `35459aca2181` == HEAD, `git diff HEAD` empty, whole-tree `git status --porcelain` clean. Rebuilt spec, preflight "marker present in 14 built files" and "working tree clean against HEAD". Lint suite back to 50/50. ## Gates - Derived with `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands` (no paths) at `c2b91013`: **113 commands**, the same list as the pre-merge derivation. - All 113 ran at `c2b91013`, sequentially, each exit code captured before any pipe: **113 × exit 0**. This includes `check:adr-0087-registration` (`registered ui-record-line-items-props-closed (new here)`), `check:changeset-no-major`, `check:nul-bytes`, `check:issue-citations`, `check:doc-authoring`, `check:spec-parsed-alias`, `check:migration-registry`, `check:dual-build-cjs-loads`, and `check:type-check-debt` (re-measure, 336s). - `dispatch-gates --ran` reconciliation: 113 derived, 113 run, 0 NOT-MEASURED, 0 UNRUN. - The pre-merge run (`ffcd210a`), taken alongside a closure build, did not measure seven gates. Five answered PREREQUISITE NOT MET (exit 3). `check:dts-closure` named a package whose declarations were mid-rebuild. `check:type-check-debt` hit a 420s cap. All seven are in the 113 × exit 0 above. - **NOT MEASURED here (CI's)**: the CI jobs that dispatch-gates names as outside the list (Test Core shards, Dogfood, Temporal Conformance, Build Core, the four type-check lanes), and the repo-wide `pnpm lint`. ## Acceptance notes - **`amountField` footer differs between the pin and objectui `main`** (above). This is not a defect here: the console pin bump carries it in. - **Two spellings of one concept, both read**: `parentId` wins over `recordId` (`LineItemsPanel.tsx:228`). Both are declared as measured, on the `object-master-detail-form` `initialValues` / `initialData` precedent, and the `describe()` names the precedence. Retiring one is a separate enforce-or-remove question; not filed (no reach measured). - **The objectui mirror is objectui's**: objectui#10872 waits on this row. Two items there are now stale: objectui `packages/types/src/zod/public-blocks.zod.ts:167`, which says "the spec carries no row", and the registry `inputs` for this block, which declare 5 of the 15 keys. - **`field-no-consumers`** (`validate-field-consumers.ts`) walks child collections by the keys `subforms` / `details`, so it does not credit a `record:line_items` block's column names to the child object. Reach was not measured: the showcase task fields are consumed elsewhere. Noted only. --- _Generated by [Claude Code](https://claude.ai/code/session_01UtnxvdiN376GF3sgXwAw4d)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent ee42f00 commit 24c554d

22 files changed

Lines changed: 797 additions & 61 deletions

File tree

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
---
2+
'@objectstack/spec': minor
3+
---
4+
5+
feat(spec)!: a `record:line_items` page block's props are a strict shape, and its columns are the inline grid column contract (#21142)
6+
7+
Clause-②: yes (narrowing)
8+
9+
<!-- adr-0087: registered ui-record-line-items-props-closed -->
10+
11+
**BREAKING** — an accept-set narrowing on a published authoring surface: a new `ComponentPropsMap` row judges a props bag nothing judged before. Shipped as `minor` under the repo's launch-window convention for accept-set narrowings. What reads the row: the component-props gate on `objectstack validate`, `objectstack build` and `objectstack lint`, which reports a failing key or column as an advisory `component-props-unknown-key` / `component-props-invalid` finding. A stored page still saves and loads, because a page component's `properties` is not parsed on the metadata save or load path.
12+
13+
**`@objectstack/spec`**
14+
15+
- **`ComponentPropsMap['record:line_items']`** — new row, `RecordLineItemsProps`. `record:line_items` was the one entry on the string-arm registration ledger (`STRING_ARM_REGISTERED_TYPES`, now empty), so the props gate skipped it as unregistered and any key rode through. The row declares the fifteen keys the console's `LineItemsPanel` reads: `childObject`, `relationshipField` (required), `columns` (required, at least one), `parentObject`, `parentId`, `recordId`, `amountField`, `totalField`, `title`, `readonly`, `minRows`, `maxRows`, `filter` (the ViewFilterRule array), `sort` (the SortItem array) and `limit` (a positive integer). `childObject` may come from the component-level `dataSource` binding instead. An unknown key is named. A near-miss gets its rename (`foreignKey` → `relationshipField`, `filters` → `filter`, …). The four keys of an `object-master-detail-form` detail entry that this block does not read (`addLabel`, `sortField`, `formFields`, `inlineMode`) are refused with the reason.
16+
- **`columns`** references `InlineGridColumnSchema`, the strict, name-keyed column a relationship field's `inlineColumns` takes. The retired `field` spelling (and `fieldName`, `key`) is refused with the prescription naming `name`, and a column without `name` is refused. This block draws a column exactly as declared: it does not hydrate `label`, `type` or `options` from the child object's field, so `defineStack`'s identity-only column check does not reach it.
17+
- **New types `RecordLineItemsProps` and `RecordLineItemsPropsParsed`.** They differ because a column's `readonlyWhen` / `requiredWhen` bare-string predicate normalizes to an Expression envelope at parse.
18+
19+
## FROM → TO
20+
21+
| you wrote | write instead |
22+
|:--|:--|
23+
| `columns: [{ field: 'title', label: 'Title' }]` | `columns: [{ name: 'title', label: 'Title' }]` |
24+
| `{ childObject: 'invoice_line', columns: [...] }` with no `relationshipField` | `{ childObject: 'invoice_line', relationshipField: 'invoice', columns: [...] }` |
25+
| `columns: []`, or no `columns` | at least one `{ name, label?, type?, … }` column |
26+
| `addLabel`, `sortField`, `formFields` or `inlineMode` on the block | the block without that key |
27+
| any other key the shape does not declare | the block without that key |
28+
29+
The one-line fix: key every column `name`, give the block its `relationshipField` and at least one column, and remove any key the shape does not declare.
30+
31+
## Who is affected, measured
32+
33+
On `origin/main` `1ecb871beb`: one authored `record:line_items` block in the examples, the showcase project detail page. All five of its columns were keyed `field`, so its Tasks grid rendered empty cells; they are keyed `name` in this change. No documentation example authors the block. Deployed metadata was not measured.

‎content/docs/references/index.mdx‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
title: Protocol reference — every schema by module
33
navTitle: Protocol Reference
4-
description: Every schema published by @objectstack/spec — 1521 schemas across 14 protocol modules
4+
description: Every schema published by @objectstack/spec — 1522 schemas across 14 protocol modules
55
---
66

77
{/* ⚠️ AUTO-GENERATED — DO NOT EDIT. Run build-docs.ts to regenerate. Hand-written docs live in the module folders under content/docs/. */}
@@ -33,8 +33,8 @@ counts are sums of the rows they head. Regenerate with
3333
| [Shared Protocol](/docs/references/shared) | 10 | 31 | Primitives used across every protocol — identifiers, HTTP, expressions, error maps, enums. |
3434
| [Studio Protocol](/docs/references/studio) | 3 | 35 | Studio designer metadata — the authoring surfaces for the protocols above. |
3535
| [System Protocol](/docs/references/system) | 34 | 275 | The runtime environment — logging, jobs, cache, metrics, notifications, i18n and compliance. |
36-
| [UI Protocol](/docs/references/ui) | 16 | 165 | Apps, pages, views, dashboards, reports, actions and themes — the ObjectUI layer. |
37-
| **Total** | **197** | **1521** | 14 protocol modules |
36+
| [UI Protocol](/docs/references/ui) | 16 | 166 | Apps, pages, views, dashboards, reports, actions and themes — the ObjectUI layer. |
37+
| **Total** | **197** | **1522** | 14 protocol modules |
3838

3939
---
4040

@@ -364,7 +364,7 @@ The runtime environment — logging, jobs, cache, metrics, notifications, i18n a
364364

365365
## UI Protocol
366366

367-
**Source:** `packages/spec/src/ui/` · **Import:** `@objectstack/spec/ui` · **16 pages, 165 schemas**
367+
**Source:** `packages/spec/src/ui/` · **Import:** `@objectstack/spec/ui` · **16 pages, 166 schemas**
368368

369369
Apps, pages, views, dashboards, reports, actions and themes — the ObjectUI layer.
370370

@@ -375,7 +375,7 @@ Apps, pages, views, dashboards, reports, actions and themes — the ObjectUI lay
375375
| [`app.zod.ts`](/docs/references/ui/app) | `ActionNavItem`, `App`, `AppBranding`, `AppContextSelector`, `ComponentNavItem`, `DashboardNavItem`, `DocNavItem`, `GroupNavItem`, `NavigationArea`, `NavigationContribution`, `NavigationItem`, `ObjectNavItem`, `PageNavItem`, `ReportNavItem`, `UrlNavItem` |
376376
| [`bulk-action.zod.ts`](/docs/references/ui/bulk-action) | `BulkActionDef`, `BulkActionExecution`, `BulkActionOperation`, `BulkActionParam` |
377377
| [`chart.zod.ts`](/docs/references/ui/chart) | `ChartAggregate`, `ChartAggregateFunction`, `ChartAnnotation`, `ChartAxis`, `ChartConfig`, `ChartDrillDown`, `ChartGroupBy`, `ChartInteraction`, `ChartSeries`, `ChartType` |
378-
| [`component.zod.ts`](/docs/references/ui/component) | `AIChatWindowProps`, `ActionButtonProps`, `ActionGroupProps`, `ActionIconProps`, `ActionMenuProps`, `ElementButtonProps`, `ElementDefinitionListProps`, `ElementFilterProps`, `ElementFormProps`, `ElementImageProps`, `ElementMetadataViewerProps`, `ElementNumberProps`, `ElementRecordPickerProps`, `ElementRepeaterProps`, `ElementTextInputProps`, `ElementTextProps`, `ObjectCalendarProps`, `ObjectFormProps`, `ObjectGanttProps`, `ObjectGridProps`, `ObjectKanbanProps`, `ObjectMapProps`, `ObjectMasterDetailFormProps`, `ObjectMetricProps`, `ObjectTimelineProps`, `ObjectTreeProps`, `PageAccordionProps`, `PageCardProps`, `PageContainerProps`, `PageHeaderProps`, `PageTabsProps`, `RecordActivityProps`, `RecordAlertAction`, `RecordAlertProps`, `RecordChatterProps`, `RecordDetailsProps`, `RecordHighlightsField`, `RecordHighlightsProps`, `RecordHistoryProps`, `RecordPathProps`, `RecordQuickActionsProps`, `RecordReferenceRailProps`, `RecordRelatedListProps`, `ReferenceRailEntry` |
378+
| [`component.zod.ts`](/docs/references/ui/component) | `AIChatWindowProps`, `ActionButtonProps`, `ActionGroupProps`, `ActionIconProps`, `ActionMenuProps`, `ElementButtonProps`, `ElementDefinitionListProps`, `ElementFilterProps`, `ElementFormProps`, `ElementImageProps`, `ElementMetadataViewerProps`, `ElementNumberProps`, `ElementRecordPickerProps`, `ElementRepeaterProps`, `ElementTextInputProps`, `ElementTextProps`, `ObjectCalendarProps`, `ObjectFormProps`, `ObjectGanttProps`, `ObjectGridProps`, `ObjectKanbanProps`, `ObjectMapProps`, `ObjectMasterDetailFormProps`, `ObjectMetricProps`, `ObjectTimelineProps`, `ObjectTreeProps`, `PageAccordionProps`, `PageCardProps`, `PageContainerProps`, `PageHeaderProps`, `PageTabsProps`, `RecordActivityProps`, `RecordAlertAction`, `RecordAlertProps`, `RecordChatterProps`, `RecordDetailsProps`, `RecordHighlightsField`, `RecordHighlightsProps`, `RecordHistoryProps`, `RecordLineItemsProps`, `RecordPathProps`, `RecordQuickActionsProps`, `RecordReferenceRailProps`, `RecordRelatedListProps`, `ReferenceRailEntry` |
379379
| [`dashboard.zod.ts`](/docs/references/ui/dashboard) | `Dashboard`, `DashboardHeader`, `DashboardHeaderAction`, `DashboardWidget`, `DashboardWidgetChartConfig`, `DashboardWidgetOptions`, `GlobalFilter`, `GlobalFilterOptionsFrom`, `WidgetActionType`, `WidgetColorVariant` |
380380
| [`dataset.zod.ts`](/docs/references/ui/dataset) | `Dataset`, `DatasetDimension`, `DatasetMeasure`, `DerivedMeasureOp` |
381381
| [`expression-bindable-text-keys.zod.ts`](/docs/references/ui/expression-bindable-text-keys) | `ExpressionBindableTextKey` |

0 commit comments

Comments
 (0)