@objectstack/lint@16.1.0
Minor Changes
-
fa006fb: Validate dashboard filter field-existence at build time (extend ADR-0021, #3365).
validateWidgetBindingsnow checks that every dashboard-level filter (dateRange- each
globalFilters[]) resolves to a real field on each bound widget's dataset
object. Since #2501 wired these filters into every widget's analytics query, a
filter field absent on a widget's object — e.g. adateRangebound to
close_dateinherited by an account/contact widget over a different object —
emitted invalid SQL (no such column: close_date) and crashed the widget at
render time. That build-decidable invariant previously escapedos validate/
os buildand failed only when a user opened the dashboard.
It now fails the build (new rule
dashboard-filter-field-unknown) with a message
naming the dashboard, widget, filter, field, and object, unless the widget opts
out viafilterBindings: { <name>: false }or re-targets to an existing field —
mirroring the field-existence invariant ADR-0032 enforces for CEL references.
Effective-field resolution matches the runtime (filterBindingsre-target /
opt-out, legacytargetWidgetsallow-list, filter default). Registry-injected
system fields (e.g.created_at, thedateRangedefault) and objects outside
the validated stack never false-positive. - each
-
db160dd: Flag dead action/route references in dashboard header & widget actions (ADR-0049 for references, #3367).
os validate/os buildnow run a newvalidateDashboardActionRefsgate over every dashboardheader.actions[]and widgetactionUrl:actionType: 'script' | 'modal'— error unlessactionUrlresolves to a defined action (stack.actionsor an object'sactions).modalalso resolves via the runtime<verb>_<object>convention (create_/new_/add_/edit_/update_+ a real object) and bare object names. A dangling target ships a button that renders and silently does nothing on click — a false affordance, exactly the "declared ≠ enforced" gap ADR-0049 closes, applied to references.actionType: 'url'— warning when a relative in-app path names aobjects/reports/dashboards/pages/viewsroute whose target does not exist in the stack. External URLs, interpolated (${…}) targets, and opaque routes are skipped to keep false positives near zero.
Patch Changes
- Updated dependencies [9e45b63]
- @objectstack/spec@16.1.0
- @objectstack/formula@16.1.0
- @objectstack/sdui-parser@16.1.0