@objectstack/lint 17.0.0-rc.6 → 17.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.
- package/CHANGELOG.md +7618 -1
- package/dist/index.cjs +1890 -607
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +445 -78
- package/dist/index.d.ts +445 -78
- package/dist/index.js +1851 -582
- package/dist/index.js.map +1 -1
- package/dist/{runtime-B50yywI_.d.cts → runtime-s3X9D9hm.d.cts} +173 -6
- package/dist/{runtime-B50yywI_.d.ts → runtime-s3X9D9hm.d.ts} +173 -6
- package/dist/runtime.cjs +1888 -653
- package/dist/runtime.cjs.map +1 -1
- package/dist/runtime.d.cts +1 -1
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.js +1874 -629
- package/dist/runtime.js.map +1 -1
- package/package.json +5 -5
package/dist/index.d.cts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Manifest } from '@objectstack/sdui-parser';
|
|
2
|
+
import { SearchFieldMeta } from '@objectstack/spec/data';
|
|
2
3
|
import { Options } from 'ajv';
|
|
3
4
|
import { AccessMatrixParsed } from '@objectstack/spec/security';
|
|
4
|
-
export { A as AUTHORING_COMMANDS, a as AUTHORING_RULES, b as AUTHORING_SURFACES, c as AuthoringCommand, d as AuthoringFinding, e as AuthoringRule, f as AuthoringRuleContext, g as AuthoringRuleInputTier, h as AuthoringRuleRun, i as AuthoringRuleTier, j as AuthoringSeverity, k as AuthoringSurface, E as EXPRESSION_INVALID, R as RuntimeGateResult, l as
|
|
5
|
+
export { A as AUTHORING_COMMANDS, a as AUTHORING_RULES, b as AUTHORING_SURFACES, c as AuthoringCommand, d as AuthoringFinding, e as AuthoringRule, f as AuthoringRuleContext, g as AuthoringRuleInputTier, h as AuthoringRuleRun, i as AuthoringRuleTier, j as AuthoringSeverity, k as AuthoringSurface, E as EXPRESSION_INVALID, R as RuntimeGateResult, l as RuntimePackageScope, m as RuntimeStackContext, n as authoringRulesFor, o as buildRuntimeWriteSnapshots, p as narrowObjectsToPackageClosure, r as runAuthoringRules, q as runRuntimeAuthoringRules, s as runtimeAuthoringRulesFor, t as runtimeGatedTypes, u as splitBySeverity, v as stackKeyForType } from './runtime-s3X9D9hm.cjs';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* Build-time dashboard widget binding diagnostics (issues #1719, #1721).
|
|
@@ -68,6 +69,14 @@ export { A as AUTHORING_COMMANDS, a as AUTHORING_RULES, b as AUTHORING_SURFACES,
|
|
|
68
69
|
* single-form cutover removed. The dashboard renderer routes dataset-bound
|
|
69
70
|
* widgets through `DatasetWidget` and never reads these, so they are a
|
|
70
71
|
* silent no-op. Steers the author onto `dataset`+`dimensions`+`values`.
|
|
72
|
+
* - `dashboard-filter-field-unprovisioned` (#8340) — the filter's effective
|
|
73
|
+
* field RESOLVES (it is a registry-injected system column, so
|
|
74
|
+
* `dashboard-filter-field-unknown` above rightly stays silent) but the bound
|
|
75
|
+
* object is ADR-0015 `external`, where the platform registers the anchor and
|
|
76
|
+
* provisions no storage for it. The filter is still ANDed into the query, so
|
|
77
|
+
* the widget renders empty instead of crashing — the silent-degradation half
|
|
78
|
+
* of the same invariant, warned rather than errored because this pass cannot
|
|
79
|
+
* see the remote schema (#8116's severity reasoning).
|
|
71
80
|
*
|
|
72
81
|
* Warnings can be deliberately suppressed per widget via
|
|
73
82
|
* `suppressWarnings: ['<rule-id>']`; errors cannot — they describe a
|
|
@@ -83,6 +92,7 @@ declare const MEASURE_AGGREGATE_INCOHERENT = "measure-aggregate-incoherent";
|
|
|
83
92
|
declare const WIDGET_LEGACY_ANALYTICS_SHAPE = "widget-legacy-analytics-shape";
|
|
84
93
|
declare const WIDGET_LEGACY_ANALYTICS_UNRENDERABLE = "widget-legacy-analytics-unrenderable";
|
|
85
94
|
declare const DASHBOARD_FILTER_FIELD_UNKNOWN = "dashboard-filter-field-unknown";
|
|
95
|
+
declare const DASHBOARD_FILTER_FIELD_UNPROVISIONED = "dashboard-filter-field-unprovisioned";
|
|
86
96
|
type WidgetBindingSeverity = 'error' | 'warning';
|
|
87
97
|
interface WidgetBindingFinding {
|
|
88
98
|
/** `error` = unresolvable binding (broken page); `warning` = advisory. */
|
|
@@ -98,7 +108,7 @@ interface WidgetBindingFinding {
|
|
|
98
108
|
/** How to fix (or deliberately suppress) it. */
|
|
99
109
|
hint: string;
|
|
100
110
|
}
|
|
101
|
-
type AnyRec$
|
|
111
|
+
type AnyRec$G = Record<string, unknown>;
|
|
102
112
|
/**
|
|
103
113
|
* Validate every dashboard widget's dataset binding. Returns the list of
|
|
104
114
|
* findings (empty = clean). Caller decides how to surface them: `error`
|
|
@@ -106,7 +116,7 @@ type AnyRec$F = Record<string, unknown>;
|
|
|
106
116
|
* should fail validate/build; `warning` findings are advisory and must
|
|
107
117
|
* never fail the build on their own.
|
|
108
118
|
*/
|
|
109
|
-
declare function validateWidgetBindings(stack: AnyRec$
|
|
119
|
+
declare function validateWidgetBindings(stack: AnyRec$G): WidgetBindingFinding[];
|
|
110
120
|
|
|
111
121
|
interface ExprIssue {
|
|
112
122
|
where: string;
|
|
@@ -119,12 +129,12 @@ interface ExprIssue {
|
|
|
119
129
|
*/
|
|
120
130
|
severity?: 'error' | 'warning';
|
|
121
131
|
}
|
|
122
|
-
type AnyRec$
|
|
132
|
+
type AnyRec$F = Record<string, unknown>;
|
|
123
133
|
/**
|
|
124
134
|
* Validate every predicate in the stack. Returns the list of issues (empty =
|
|
125
135
|
* clean). Caller decides how to surface / whether to fail the build.
|
|
126
136
|
*/
|
|
127
|
-
declare function validateStackExpressions(stack: AnyRec$
|
|
137
|
+
declare function validateStackExpressions(stack: AnyRec$F): ExprIssue[];
|
|
128
138
|
|
|
129
139
|
/**
|
|
130
140
|
* The corrective sentence, lifted **verbatim** from `unevaluableRuleError` in
|
|
@@ -305,7 +315,7 @@ interface ListViewModeFinding {
|
|
|
305
315
|
hint: string;
|
|
306
316
|
}
|
|
307
317
|
declare const LIST_VIEW_FILTERS_IN_VIEWS_MODE = "list-view-filters-in-views-mode";
|
|
308
|
-
type AnyRec$
|
|
318
|
+
type AnyRec$E = Record<string, unknown>;
|
|
309
319
|
/**
|
|
310
320
|
* Flag ADR-0047 "views" mode violations on an object's built-in named views or a
|
|
311
321
|
* `defineView` default `list` / named `listViews`: `quickFilters`, or a `tabs`
|
|
@@ -315,7 +325,7 @@ type AnyRec$D = Record<string, unknown>;
|
|
|
315
325
|
*
|
|
316
326
|
* Feed the PRE-parse stack (normalizeStackInput output) — see file header.
|
|
317
327
|
*/
|
|
318
|
-
declare function validateListViewMode(stack: AnyRec$
|
|
328
|
+
declare function validateListViewMode(stack: AnyRec$E): ListViewModeFinding[];
|
|
319
329
|
|
|
320
330
|
type FunctionalCompletenessSeverity = 'error' | 'warning';
|
|
321
331
|
interface FunctionalCompletenessFinding {
|
|
@@ -335,6 +345,37 @@ interface FunctionalCompletenessFinding {
|
|
|
335
345
|
*/
|
|
336
346
|
declare function validateFunctionalCompleteness(stack: unknown): FunctionalCompletenessFinding[];
|
|
337
347
|
|
|
348
|
+
/**
|
|
349
|
+
* Stable diagnostic id. Named for the CONTRADICTION rather than for the strip,
|
|
350
|
+
* because at authoring time nothing has been stripped yet — the declaration is
|
|
351
|
+
* simply advertising something the object cannot honour.
|
|
352
|
+
*/
|
|
353
|
+
declare const MANAGED_API_METHOD_UNAFFORDABLE = "object/managed-api-method-unaffordable";
|
|
354
|
+
interface ManagedApiMethodFinding {
|
|
355
|
+
/**
|
|
356
|
+
* Always `error`. The contradiction is decidable from the object's own
|
|
357
|
+
* declaration — no call graph, no runtime state — and shipping it means the
|
|
358
|
+
* metadata claims an API surface the registry will silently take away.
|
|
359
|
+
*/
|
|
360
|
+
severity: 'error';
|
|
361
|
+
rule: typeof MANAGED_API_METHOD_UNAFFORDABLE;
|
|
362
|
+
/** Human-readable location, e.g. `object "sys_environment"`. */
|
|
363
|
+
where: string;
|
|
364
|
+
/** Config path, e.g. `objects[2].enable.apiMethods`. */
|
|
365
|
+
path: string;
|
|
366
|
+
message: string;
|
|
367
|
+
hint: string;
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Walk every object declaration in the stack through the shared
|
|
371
|
+
* managed-affordance predicate.
|
|
372
|
+
*
|
|
373
|
+
* One finding per object, not per verb: an object declaring both `create` and
|
|
374
|
+
* `update` against an all-locked bucket has ONE authoring mistake, and the fix
|
|
375
|
+
* — open the affordances or drop the verbs — is a single edit.
|
|
376
|
+
*/
|
|
377
|
+
declare function validateManagedApiMethods(stack: unknown): ManagedApiMethodFinding[];
|
|
378
|
+
|
|
338
379
|
type FlowTriggerReadinessSeverity = 'error' | 'warning';
|
|
339
380
|
interface FlowTriggerReadinessFinding {
|
|
340
381
|
severity: FlowTriggerReadinessSeverity;
|
|
@@ -399,7 +440,7 @@ declare const FLOW_TIME_RELATIVE_DESCRIPTOR_UNROUTABLE = "flow-time-relative-des
|
|
|
399
440
|
* call sites that each skip it.
|
|
400
441
|
*/
|
|
401
442
|
declare const FLOW_TRIGGER_UNROUTABLE = "flow-trigger-unroutable";
|
|
402
|
-
type AnyRec$
|
|
443
|
+
type AnyRec$D = Record<string, unknown>;
|
|
403
444
|
/**
|
|
404
445
|
* Validate auto-launched flow trigger wiring against the stack definition.
|
|
405
446
|
*
|
|
@@ -408,7 +449,7 @@ type AnyRec$C = Record<string, unknown>;
|
|
|
408
449
|
* owns the `timeRelative` descriptor's contract, which is the point: the rule
|
|
409
450
|
* ASKS that schema rather than restating it.
|
|
410
451
|
*/
|
|
411
|
-
declare function validateFlowTriggerReadiness(stack: AnyRec$
|
|
452
|
+
declare function validateFlowTriggerReadiness(stack: AnyRec$D): FlowTriggerReadinessFinding[];
|
|
412
453
|
|
|
413
454
|
type FlowTemplatePathSeverity = 'error' | 'warning';
|
|
414
455
|
interface FlowTemplatePathFinding {
|
|
@@ -423,12 +464,13 @@ interface FlowTemplatePathFinding {
|
|
|
423
464
|
}
|
|
424
465
|
declare const FLOW_TEMPLATE_UNKNOWN_FIELD = "flow-template-unknown-field";
|
|
425
466
|
declare const FLOW_TEMPLATE_LOOKUP_TRAVERSAL = "flow-template-lookup-traversal";
|
|
426
|
-
|
|
467
|
+
declare const FLOW_TEMPLATE_FIELD_UNPROVISIONED = "flow-template-field-unprovisioned";
|
|
468
|
+
type AnyRec$C = Record<string, unknown>;
|
|
427
469
|
/**
|
|
428
470
|
* Validate `{record.<path>}` template references across every record-change
|
|
429
471
|
* flow. Pure and dependency-free; safe on pre- or post-parse stacks.
|
|
430
472
|
*/
|
|
431
|
-
declare function validateFlowTemplatePaths(stack: AnyRec$
|
|
473
|
+
declare function validateFlowTemplatePaths(stack: AnyRec$C): FlowTemplatePathFinding[];
|
|
432
474
|
|
|
433
475
|
type ReadonlyFlowWriteSeverity = 'error' | 'warning';
|
|
434
476
|
interface ReadonlyFlowWriteFinding {
|
|
@@ -443,12 +485,12 @@ interface ReadonlyFlowWriteFinding {
|
|
|
443
485
|
}
|
|
444
486
|
declare const FLOW_UPDATE_READONLY_FIELD = "flow-update-readonly-field";
|
|
445
487
|
declare const FLOW_UPDATE_READONLY_WHEN_FIELD = "flow-update-readonly-when-field";
|
|
446
|
-
type AnyRec$
|
|
488
|
+
type AnyRec$B = Record<string, unknown>;
|
|
447
489
|
/**
|
|
448
490
|
* Validate flow `update_record` writes against target-object readonly
|
|
449
491
|
* declarations. Pure and dependency-free; safe on pre- or post-parse stacks.
|
|
450
492
|
*/
|
|
451
|
-
declare function validateReadonlyFlowWrites(stack: AnyRec$
|
|
493
|
+
declare function validateReadonlyFlowWrites(stack: AnyRec$B): ReadonlyFlowWriteFinding[];
|
|
452
494
|
|
|
453
495
|
type ViewContainerSeverity = 'error' | 'warning';
|
|
454
496
|
interface ViewContainerFinding {
|
|
@@ -485,14 +527,14 @@ declare const STYLE_CLASSNAME_TAILWIND = "style-classname-tailwind";
|
|
|
485
527
|
declare const STYLE_RESPONSIVE_NO_BASE = "style-responsive-no-base";
|
|
486
528
|
declare const STYLE_UNKNOWN_CSS_PROPERTY = "style-unknown-css-property";
|
|
487
529
|
declare const STYLE_UNKNOWN_TOKEN = "style-unknown-token";
|
|
488
|
-
type AnyRec$
|
|
530
|
+
type AnyRec$A = Record<string, unknown>;
|
|
489
531
|
/**
|
|
490
532
|
* Validate every page's component tree for SDUI styling correctness (ADR-0065).
|
|
491
533
|
* Returns findings (empty = clean). `error` findings describe styles that are
|
|
492
534
|
* silently dropped and should fail validate/build; `warning` findings are
|
|
493
535
|
* advisory (typos, drift, footguns).
|
|
494
536
|
*/
|
|
495
|
-
declare function validateResponsiveStyles(stack: AnyRec$
|
|
537
|
+
declare function validateResponsiveStyles(stack: AnyRec$A): StyleFinding[];
|
|
496
538
|
|
|
497
539
|
type JsxPageSeverity = 'error' | 'warning';
|
|
498
540
|
interface JsxPageFinding {
|
|
@@ -505,8 +547,8 @@ interface JsxPageFinding {
|
|
|
505
547
|
message: string;
|
|
506
548
|
hint: string;
|
|
507
549
|
}
|
|
508
|
-
type AnyRec$
|
|
509
|
-
declare function validateJsxPages(stack: AnyRec$
|
|
550
|
+
type AnyRec$z = Record<string, unknown>;
|
|
551
|
+
declare function validateJsxPages(stack: AnyRec$z, opts?: {
|
|
510
552
|
manifest?: Manifest;
|
|
511
553
|
}): JsxPageFinding[];
|
|
512
554
|
|
|
@@ -519,8 +561,8 @@ interface ReactPageFinding {
|
|
|
519
561
|
message: string;
|
|
520
562
|
hint: string;
|
|
521
563
|
}
|
|
522
|
-
type AnyRec$
|
|
523
|
-
declare function validateReactPages(stack: AnyRec$
|
|
564
|
+
type AnyRec$y = Record<string, unknown>;
|
|
565
|
+
declare function validateReactPages(stack: AnyRec$y): ReactPageFinding[];
|
|
524
566
|
|
|
525
567
|
type ReactPropSeverity = 'error' | 'warning';
|
|
526
568
|
interface ReactPropFinding {
|
|
@@ -531,13 +573,14 @@ interface ReactPropFinding {
|
|
|
531
573
|
message: string;
|
|
532
574
|
hint: string;
|
|
533
575
|
}
|
|
534
|
-
type AnyRec$
|
|
576
|
+
type AnyRec$x = Record<string, unknown>;
|
|
535
577
|
declare const REACT_CHART_FIELD_UNKNOWN = "react-chart-field-unknown";
|
|
578
|
+
declare const REACT_CHART_FIELD_UNPROVISIONED = "react-chart-field-unprovisioned";
|
|
536
579
|
declare const REACT_CHART_AGGREGATE_INVALID = "react-chart-aggregate-invalid";
|
|
537
580
|
declare const REACT_CHART_AXIS_UNKNOWN = "react-chart-axis-unknown";
|
|
538
581
|
declare const REACT_CHART_DRILLDOWN_INVALID = "react-chart-drilldown-invalid";
|
|
539
582
|
declare const REACT_BLOCK_NEEDS_RECORD_CONTEXT = "react-block-needs-record-context";
|
|
540
|
-
declare function validateReactPageProps(stack: AnyRec$
|
|
583
|
+
declare function validateReactPageProps(stack: AnyRec$x): ReactPropFinding[];
|
|
541
584
|
|
|
542
585
|
type SourceStyleSeverity = 'error' | 'warning';
|
|
543
586
|
interface SourceStyleFinding {
|
|
@@ -549,8 +592,8 @@ interface SourceStyleFinding {
|
|
|
549
592
|
hint: string;
|
|
550
593
|
}
|
|
551
594
|
declare const PAGE_SOURCE_CLASSNAME = "page-source-className-tailwind";
|
|
552
|
-
type AnyRec$
|
|
553
|
-
declare function validatePageSourceStyling(stack: AnyRec$
|
|
595
|
+
type AnyRec$w = Record<string, unknown>;
|
|
596
|
+
declare function validatePageSourceStyling(stack: AnyRec$w): SourceStyleFinding[];
|
|
554
597
|
|
|
555
598
|
/**
|
|
556
599
|
* Build-time record-title diagnostics (ADR-0079).
|
|
@@ -594,19 +637,20 @@ interface RecordTitleFinding {
|
|
|
594
637
|
/** How to fix it. */
|
|
595
638
|
hint: string;
|
|
596
639
|
}
|
|
597
|
-
type AnyRec$
|
|
640
|
+
type AnyRec$v = Record<string, unknown>;
|
|
598
641
|
/**
|
|
599
642
|
* Validate every object's record-title declaration. Returns the list of
|
|
600
643
|
* findings (empty = clean). Both rules are advisory (`warning`): the caller
|
|
601
644
|
* must never fail the build on them alone — auto-provision + the `Record #<id>`
|
|
602
645
|
* floor guarantee a resolvable title at runtime.
|
|
603
646
|
*/
|
|
604
|
-
declare function validateRecordTitle(stack: AnyRec$
|
|
647
|
+
declare function validateRecordTitle(stack: AnyRec$v): RecordTitleFinding[];
|
|
605
648
|
|
|
606
649
|
declare const FIELD_GROUP_UNDECLARED = "field-group-undeclared";
|
|
607
650
|
declare const FIELD_GROUP_EMPTY = "field-group-empty";
|
|
608
651
|
declare const FIELD_GROUP_SHADOWED = "field-group-shadowed";
|
|
609
652
|
declare const SEMANTIC_ROLE_FIELD_UNKNOWN = "semantic-role-field-unknown";
|
|
653
|
+
declare const SEMANTIC_ROLE_FIELD_UNPROVISIONED = "semantic-role-field-unprovisioned";
|
|
610
654
|
type SemanticRoleSeverity = 'error' | 'warning';
|
|
611
655
|
interface SemanticRoleFinding {
|
|
612
656
|
/** Always `warning` today — all three rules are advisory (see module note). */
|
|
@@ -622,13 +666,13 @@ interface SemanticRoleFinding {
|
|
|
622
666
|
/** How to fix it. */
|
|
623
667
|
hint: string;
|
|
624
668
|
}
|
|
625
|
-
type AnyRec$
|
|
669
|
+
type AnyRec$u = Record<string, unknown>;
|
|
626
670
|
/**
|
|
627
671
|
* Validate every object's semantic-role pointers. Returns the list of
|
|
628
672
|
* findings (empty = clean). Advisory only — the caller must never fail the
|
|
629
673
|
* build on these alone.
|
|
630
674
|
*/
|
|
631
|
-
declare function validateSemanticRoles(stack: AnyRec$
|
|
675
|
+
declare function validateSemanticRoles(stack: AnyRec$u): SemanticRoleFinding[];
|
|
632
676
|
|
|
633
677
|
declare const FORM_FIELD_UNKNOWN = "form-field-unknown";
|
|
634
678
|
declare const FORM_COLSPAN_ABSOLUTE = "absolute-colspan-discouraged";
|
|
@@ -647,12 +691,12 @@ interface FormLayoutFinding {
|
|
|
647
691
|
/** How to fix it. */
|
|
648
692
|
hint: string;
|
|
649
693
|
}
|
|
650
|
-
type AnyRec$
|
|
694
|
+
type AnyRec$t = Record<string, unknown>;
|
|
651
695
|
/**
|
|
652
696
|
* Validate authored form-view layout. Returns findings (empty = clean).
|
|
653
697
|
* Advisory only — the caller must never fail the build on these alone.
|
|
654
698
|
*/
|
|
655
|
-
declare function validateFormLayout(stack: AnyRec$
|
|
699
|
+
declare function validateFormLayout(stack: AnyRec$t): FormLayoutFinding[];
|
|
656
700
|
|
|
657
701
|
declare const VISIBILITY_ROOT_MISLAYERED = "visibility-root-mislayered";
|
|
658
702
|
declare const VISIBILITY_BARE_IDENTIFIER = "visibility-bare-identifier";
|
|
@@ -669,12 +713,24 @@ type VisibilitySeverity = 'error' | 'warning';
|
|
|
669
713
|
/**
|
|
670
714
|
* Which binding environment the linted surface belongs to (ADR-0089 §Context):
|
|
671
715
|
* - `runtime` — `*.view.ts` / `*.page.ts`; binds `record` + `current_user` (+ `page`).
|
|
672
|
-
* - `metadata` —
|
|
716
|
+
* - `metadata` — metadata-editing forms (a `*.form.ts` module, or a form view
|
|
717
|
+
* declaring `data: { provider: 'schema', schemaId }`); binds `data` (the row
|
|
718
|
+
* under edit).
|
|
673
719
|
*/
|
|
674
720
|
type VisibilityLayer = 'runtime' | 'metadata';
|
|
675
721
|
/** Options for {@link validateVisibilityPredicates}. */
|
|
676
722
|
interface VisibilityOptions {
|
|
677
|
-
/**
|
|
723
|
+
/**
|
|
724
|
+
* Binding layer for the sites whose layer the metadata does not state.
|
|
725
|
+
* Defaults to `'runtime'`.
|
|
726
|
+
*
|
|
727
|
+
* A form view that declares `data: { provider: 'schema', schemaId }` DOES
|
|
728
|
+
* state it — the metadata-admin evaluator renders that surface and binds the
|
|
729
|
+
* row under edit as `data` — so such a site is judged at `'metadata'`
|
|
730
|
+
* regardless of this option (#7815; see the module note §Which layer a site is
|
|
731
|
+
* on). Pass `'metadata'` to cover the forms that do not carry that data source
|
|
732
|
+
* either, which is what a file-aware caller linting a `*.form.ts` does.
|
|
733
|
+
*/
|
|
678
734
|
layer?: VisibilityLayer;
|
|
679
735
|
}
|
|
680
736
|
interface VisibilityFinding {
|
|
@@ -696,7 +752,7 @@ interface VisibilityFinding {
|
|
|
696
752
|
/** How to fix it. */
|
|
697
753
|
hint: string;
|
|
698
754
|
}
|
|
699
|
-
type AnyRec$
|
|
755
|
+
type AnyRec$s = Record<string, unknown>;
|
|
700
756
|
/**
|
|
701
757
|
* Validate conditional-visibility predicates across authored views and pages.
|
|
702
758
|
*
|
|
@@ -712,17 +768,30 @@ type AnyRec$r = Record<string, unknown>;
|
|
|
712
768
|
* `visibility-predicate-over-budget` (#7217) and `visibility-bare-identifier`
|
|
713
769
|
* (#6128) are `error` and the caller is expected to fail the build on them.
|
|
714
770
|
*
|
|
715
|
-
* The binding-root check is layer-directional (ADR-0089 D3)
|
|
716
|
-
* `
|
|
717
|
-
*
|
|
718
|
-
*
|
|
719
|
-
*
|
|
771
|
+
* The binding-root check is layer-directional (ADR-0089 D3). A form view that
|
|
772
|
+
* declares `data: { provider: 'schema', schemaId }` is judged at `metadata` on
|
|
773
|
+
* its own say-so (#7815); for every other site pass `opts.layer = 'metadata'`
|
|
774
|
+
* when linting a `*.form.ts` metadata-editing form (so a `record.`-rooted
|
|
775
|
+
* predicate is flagged), or leave it at the `'runtime'` default for `*.view.ts` /
|
|
776
|
+
* `*.page.ts` surfaces (so a `data.`-rooted predicate is flagged). The syntax and
|
|
777
|
+
* bare-identifier checks are layer-agnostic — but the ROOT their hints prescribe
|
|
778
|
+
* is not, which is the second half of what #7815 fixes.
|
|
720
779
|
*/
|
|
721
|
-
declare function validateVisibilityPredicates(stack: AnyRec$
|
|
780
|
+
declare function validateVisibilityPredicates(stack: AnyRec$s, opts?: VisibilityOptions): VisibilityFinding[];
|
|
722
781
|
|
|
723
782
|
declare const PREDICATE_PATH_UNRESOLVED = "predicate-path-unresolved";
|
|
724
783
|
declare const PREDICATE_PATH_UNROOTED = "predicate-path-unrooted";
|
|
725
|
-
/**
|
|
784
|
+
/**
|
|
785
|
+
* A `==` / `!=` RIGHT-hand side that is path-shaped — an unquoted identifier
|
|
786
|
+
* chain (#7659). See the module note's §The right-hand side for the two
|
|
787
|
+
* severities this one id carries and why they are not the same defect.
|
|
788
|
+
*/
|
|
789
|
+
declare const PREDICATE_RHS_PATH_SHAPED = "predicate-rhs-path-shaped";
|
|
790
|
+
/**
|
|
791
|
+
* The two path-RESOLUTION rules always GATE; {@link PREDICATE_RHS_PATH_SHAPED}
|
|
792
|
+
* gates on a dotted chain and is advisory on a bare word — see the module note
|
|
793
|
+
* for why the same shape earns two answers.
|
|
794
|
+
*/
|
|
726
795
|
type PredicatePathSeverity = 'error' | 'warning';
|
|
727
796
|
interface PredicatePathFinding {
|
|
728
797
|
severity: PredicatePathSeverity;
|
|
@@ -751,7 +820,7 @@ interface PredicatePathOptions {
|
|
|
751
820
|
*/
|
|
752
821
|
resolveSchema?: (schemaId: string) => unknown;
|
|
753
822
|
}
|
|
754
|
-
type AnyRec$
|
|
823
|
+
type AnyRec$r = Record<string, unknown>;
|
|
755
824
|
/**
|
|
756
825
|
* Refuse a metadata-form predicate that names a path the target schema does not
|
|
757
826
|
* declare (#7010).
|
|
@@ -765,15 +834,22 @@ type AnyRec$q = Record<string, unknown>;
|
|
|
765
834
|
* resolves, is skipped: see the module note for why the `record.*` layer is out
|
|
766
835
|
* of scope rather than merely unimplemented.
|
|
767
836
|
*
|
|
768
|
-
* Both rules emit `error` and the caller is expected to fail the
|
|
769
|
-
* The corpus measurement behind that severity is on the PR for
|
|
770
|
-
* shipped `METADATA_FORM_REGISTRY` (17 forms, 46 predicates) the
|
|
771
|
-
* for both, and 16 for `predicate-path-unrooted` once #6254's
|
|
772
|
-
* `object.form.ts` is restored.
|
|
837
|
+
* Both path-resolution rules emit `error` and the caller is expected to fail the
|
|
838
|
+
* build on them. The corpus measurement behind that severity is on the PR for
|
|
839
|
+
* #7010: over the shipped `METADATA_FORM_REGISTRY` (17 forms, 46 predicates) the
|
|
840
|
+
* count is **0** for both, and 16 for `predicate-path-unrooted` once #6254's
|
|
841
|
+
* pre-fix `object.form.ts` is restored.
|
|
842
|
+
*
|
|
843
|
+
* The third rule, `predicate-rhs-path-shaped` (#7659), asks a different question
|
|
844
|
+
* about the same predicates — whether a `==` / `!=` RIGHT-hand side is
|
|
845
|
+
* path-shaped, which the renderer parses as a literal — and carries two
|
|
846
|
+
* severities: `error` on a dotted chain, `warning` on a bare word. Its corpus
|
|
847
|
+
* count over the same shipped forms is **0** at both severities. See the module
|
|
848
|
+
* note.
|
|
773
849
|
*
|
|
774
850
|
* Returns findings (empty = clean).
|
|
775
851
|
*/
|
|
776
|
-
declare function validatePredicatePathRefs(stack: AnyRec$
|
|
852
|
+
declare function validatePredicatePathRefs(stack: AnyRec$r, opts?: PredicatePathOptions): PredicatePathFinding[];
|
|
777
853
|
|
|
778
854
|
declare const CAPABILITY_REFERENCE_UNKNOWN = "capability-reference-unknown";
|
|
779
855
|
type CapabilityRefSeverity = 'error' | 'warning';
|
|
@@ -791,12 +867,12 @@ interface CapabilityRefFinding {
|
|
|
791
867
|
/** How to fix it. */
|
|
792
868
|
hint: string;
|
|
793
869
|
}
|
|
794
|
-
type AnyRec$
|
|
870
|
+
type AnyRec$q = Record<string, unknown>;
|
|
795
871
|
/**
|
|
796
872
|
* Validate every capability reference in a stack. Returns findings (empty =
|
|
797
873
|
* clean). Advisory only — callers must not fail the build on these alone.
|
|
798
874
|
*/
|
|
799
|
-
declare function validateCapabilityReferences(stack: AnyRec$
|
|
875
|
+
declare function validateCapabilityReferences(stack: AnyRec$q): CapabilityRefFinding[];
|
|
800
876
|
|
|
801
877
|
declare const APPROVAL_APPROVER_NOT_MEMBERSHIP_TIER = "approval-approver-not-membership-tier";
|
|
802
878
|
declare const APPROVAL_APPROVER_TYPE_DEPRECATED = "approval-approver-type-deprecated";
|
|
@@ -822,12 +898,12 @@ interface ApprovalApproverFinding {
|
|
|
822
898
|
/** How to fix it. */
|
|
823
899
|
hint: string;
|
|
824
900
|
}
|
|
825
|
-
type AnyRec$
|
|
901
|
+
type AnyRec$p = Record<string, unknown>;
|
|
826
902
|
/**
|
|
827
903
|
* Validate the approvers of every Approval node in the stack's flows.
|
|
828
904
|
* Returns findings (empty = clean).
|
|
829
905
|
*/
|
|
830
|
-
declare function validateApprovalApprovers(stack: AnyRec$
|
|
906
|
+
declare function validateApprovalApprovers(stack: AnyRec$p): ApprovalApproverFinding[];
|
|
831
907
|
|
|
832
908
|
type SeedReplaySafetySeverity = 'error' | 'warning';
|
|
833
909
|
interface SeedReplaySafetyFinding {
|
|
@@ -841,7 +917,7 @@ interface SeedReplaySafetyFinding {
|
|
|
841
917
|
hint: string;
|
|
842
918
|
}
|
|
843
919
|
declare const SEED_INSERT_MODE_DUPLICATES_ON_REPLAY = "seed-insert-mode-duplicates-on-replay";
|
|
844
|
-
type AnyRec$
|
|
920
|
+
type AnyRec$o = Record<string, unknown>;
|
|
845
921
|
/**
|
|
846
922
|
* Flag every seed dataset declared with `mode: 'insert'` — the one non-idempotent
|
|
847
923
|
* mode, which duplicates its rows on every replay boot (framework#3434). Returns
|
|
@@ -851,7 +927,7 @@ type AnyRec$n = Record<string, unknown>;
|
|
|
851
927
|
* Reads `stack.data` (the `SeedSchema[]` fixtures). Safe on any shape — a stack
|
|
852
928
|
* with no `data` array yields no findings.
|
|
853
929
|
*/
|
|
854
|
-
declare function validateSeedReplaySafety(stack: AnyRec$
|
|
930
|
+
declare function validateSeedReplaySafety(stack: AnyRec$o): SeedReplaySafetyFinding[];
|
|
855
931
|
|
|
856
932
|
type SeedStateMachineSeverity = 'warning';
|
|
857
933
|
interface SeedStateMachineFinding {
|
|
@@ -865,7 +941,7 @@ interface SeedStateMachineFinding {
|
|
|
865
941
|
hint: string;
|
|
866
942
|
}
|
|
867
943
|
declare const SEED_VALUE_OUTSIDE_STATE_MACHINE = "seed-value-outside-state-machine";
|
|
868
|
-
type AnyRec$
|
|
944
|
+
type AnyRec$n = Record<string, unknown>;
|
|
869
945
|
/**
|
|
870
946
|
* Flag every seed record whose `state_machine`-governed field carries a value
|
|
871
947
|
* the machine does not declare (framework#3433 follow-up). Returns the findings
|
|
@@ -878,7 +954,7 @@ type AnyRec$m = Record<string, unknown>;
|
|
|
878
954
|
* unresolved `cel` Expression envelope, a number) is skipped: it cannot be
|
|
879
955
|
* statically compared to the declared-state set.
|
|
880
956
|
*/
|
|
881
|
-
declare function validateSeedStateMachine(stack: AnyRec$
|
|
957
|
+
declare function validateSeedStateMachine(stack: AnyRec$n): SeedStateMachineFinding[];
|
|
882
958
|
|
|
883
959
|
declare const SECURITY_OWD_UNSET = "security-owd-unset";
|
|
884
960
|
declare const SECURITY_OWD_ALIAS = "security-owd-alias";
|
|
@@ -892,6 +968,7 @@ declare const SECURITY_MASTER_DETAIL_UNGRANTED = "security-master-detail-ungrant
|
|
|
892
968
|
declare const SECURITY_FLS_UNQUALIFIED_KEY = "security-fls-unqualified-key";
|
|
893
969
|
declare const SECURITY_GRANT_EXPIRED_AT_AUTHORING = "security-grant-expired-at-authoring";
|
|
894
970
|
declare const SECURITY_DELEGATION_MISSING_REASON = "security-delegation-missing-reason";
|
|
971
|
+
declare const SECURITY_CBP_NO_RELATION = "security-controlled-by-parent-no-relation";
|
|
895
972
|
type SecuritySeverity = 'error' | 'warning' | 'info';
|
|
896
973
|
interface SecurityFinding {
|
|
897
974
|
severity: SecuritySeverity;
|
|
@@ -906,7 +983,7 @@ interface SecurityFinding {
|
|
|
906
983
|
/** How to fix it. */
|
|
907
984
|
hint: string;
|
|
908
985
|
}
|
|
909
|
-
type AnyRec$
|
|
986
|
+
type AnyRec$m = Record<string, unknown>;
|
|
910
987
|
/**
|
|
911
988
|
* Validate the security posture of a stack. Returns findings (empty = clean).
|
|
912
989
|
* `error` findings gate the build in `os compile`; `info` is advisory.
|
|
@@ -914,9 +991,38 @@ type AnyRec$l = Record<string, unknown>;
|
|
|
914
991
|
* `opts.nowMs` injects the clock for the ADR-0091 authoring-time expiry rule
|
|
915
992
|
* (tests); production callers omit it.
|
|
916
993
|
*/
|
|
917
|
-
declare function validateSecurityPosture(stack: AnyRec$
|
|
994
|
+
declare function validateSecurityPosture(stack: AnyRec$m, opts?: {
|
|
918
995
|
nowMs?: number;
|
|
919
996
|
}): SecurityFinding[];
|
|
997
|
+
/**
|
|
998
|
+
* [ADR-0090 D3] The `security-role-word` vocabulary freeze, as its own rule.
|
|
999
|
+
*
|
|
1000
|
+
* Scope: security-relevant identifiers/labels across SIX collections — objects
|
|
1001
|
+
* (names, field names, action names), permission sets, positions, apps, books.
|
|
1002
|
+
* Pages/views/components are NOT scanned — `role` there is HTML/ARIA
|
|
1003
|
+
* semantics, not permission vocabulary. The sole platform exception
|
|
1004
|
+
* (better-auth `sys_member.role`) is a system object, which app stacks never
|
|
1005
|
+
* author. Books entered the security-relevant set when `book.audience` became
|
|
1006
|
+
* a permission-model reference (ADR-0046 §6.7 / ADR-0090).
|
|
1007
|
+
*
|
|
1008
|
+
* ## Why this is a separate function from {@link validateSecurityPosture}
|
|
1009
|
+
*
|
|
1010
|
+
* [#8310] Not taste — a surface boundary. When the rest of the D7 block
|
|
1011
|
+
* crossed onto the runtime publish surface (`runtimeTypes: ['seed',
|
|
1012
|
+
* 'permission', 'book']` — `object` measured dirty and is escalated, see the
|
|
1013
|
+
* registry comment), this rule could not go with it: the per-write snapshot
|
|
1014
|
+
* (`runtime-gate.ts`) neither carries nor maps `positions` / `apps`, both of
|
|
1015
|
+
* which are `allowRuntimeCreate: true` — so wiring it through the shared
|
|
1016
|
+
* entry would have enforced ONE rule id for a strict subset of its six
|
|
1017
|
+
* collections. That is the #7220 failure shape (a door that refuses a
|
|
1018
|
+
* permission set named `role_manager` while a position named `sales_role`
|
|
1019
|
+
* walks through), and
|
|
1020
|
+
* the registry refuses to build it in either direction. The rule therefore
|
|
1021
|
+
* stays behind WHOLE, on its own CLI-only registry entry, until the snapshot
|
|
1022
|
+
* carries `positions`/`apps` and both types are gated — at which point it
|
|
1023
|
+
* crosses whole, in one edit, as its own entry.
|
|
1024
|
+
*/
|
|
1025
|
+
declare function validateSecurityRoleWord(stack: AnyRec$m): SecurityFinding[];
|
|
920
1026
|
|
|
921
1027
|
/**
|
|
922
1028
|
* [ADR-0105 D6] The two organization-axis red lines, enforced at authoring time.
|
|
@@ -1029,6 +1135,10 @@ declare function validateOrgAxisRedLines(stack: unknown): OrgAxisFinding[];
|
|
|
1029
1135
|
declare const SHARING_RULE_UNLOWERABLE_CONDITION = "sharing-rule-unlowerable-condition";
|
|
1030
1136
|
/** A `condition` reading `current_user.*` — unresolvable when grants are materialized. */
|
|
1031
1137
|
declare const SHARING_RULE_RUNTIME_VARIABLE_CONDITION = "sharing-rule-runtime-variable-condition";
|
|
1138
|
+
/** The anchor object's OWD is already the widest — sharing has nothing to widen. */
|
|
1139
|
+
declare const SHARING_RULE_OBJECT_NOT_SHAREABLE = "sharing-rule-object-not-shareable";
|
|
1140
|
+
/** The anchor object is a master-detail DETAIL — its shares belong to its master. */
|
|
1141
|
+
declare const SHARING_RULE_OBJECT_CONTROLLED_BY_PARENT = "sharing-rule-object-controlled-by-parent";
|
|
1032
1142
|
type SharingRuleEnforceabilitySeverity = 'error' | 'warning';
|
|
1033
1143
|
interface SharingRuleEnforceabilityFinding {
|
|
1034
1144
|
severity: SharingRuleEnforceabilitySeverity;
|
|
@@ -1044,8 +1154,9 @@ interface SharingRuleEnforceabilityFinding {
|
|
|
1044
1154
|
hint: string;
|
|
1045
1155
|
}
|
|
1046
1156
|
/**
|
|
1047
|
-
* Gate stack-declared sharing rules on the
|
|
1048
|
-
*
|
|
1157
|
+
* Gate stack-declared sharing rules on the two things their runtime consumers
|
|
1158
|
+
* do with them: lower the `condition` to a `criteria_json` filter, and write a
|
|
1159
|
+
* `sys_record_share` row on the `object` the rule is anchored to.
|
|
1049
1160
|
*
|
|
1050
1161
|
* Pure `(stack) => Finding[]`; tolerates the normalized and the parsed tier.
|
|
1051
1162
|
*/
|
|
@@ -1118,19 +1229,27 @@ declare function validateRlsPredicateEnforceability(stack: unknown): RlsPredicat
|
|
|
1118
1229
|
* in `@objectstack/spec` 17.0.0, so authoring one is a `tsc` error and a parse
|
|
1119
1230
|
* error carrying the prescription. There is no widget target left to resolve.
|
|
1120
1231
|
*
|
|
1121
|
-
* Resolution mirrors the objectui runtime dispatch (`DashboardRenderer`
|
|
1122
|
-
*
|
|
1123
|
-
* runtime:
|
|
1232
|
+
* Resolution mirrors the objectui runtime dispatch (`DashboardRenderer`
|
|
1233
|
+
* hands the target to the SHARED `useActionModal` since objectui#4782) so the
|
|
1234
|
+
* lint flags exactly what would fail to resolve at runtime:
|
|
1124
1235
|
*
|
|
1125
1236
|
* actionType 'script' → `actionUrl` must name a DEFINED action (`stack.actions`
|
|
1126
1237
|
* or any `object.actions`, by `name`). A script target that names no
|
|
1127
1238
|
* defined action fails open at runtime ("action not found"). → ERROR.
|
|
1128
1239
|
*
|
|
1129
|
-
* actionType 'modal' → `actionUrl`
|
|
1130
|
-
*
|
|
1131
|
-
*
|
|
1132
|
-
*
|
|
1133
|
-
*
|
|
1240
|
+
* actionType 'modal' → `actionUrl` names a declared PAGE (`stack.pages`), and
|
|
1241
|
+
* only a page — maintainer ruling objectstack#6739-A (2026-08-09). This
|
|
1242
|
+
* rule used to accept a defined action name, a bare object name, and the
|
|
1243
|
+
* `<verb>_<object>` convention (create_/new_/add_/edit_/update_ + object),
|
|
1244
|
+
* on the claim that it mirrored `DashboardView`'s own modal handler. That
|
|
1245
|
+
* handler — the convention's last live copy — was deleted by objectui#4782
|
|
1246
|
+
* (after objectui#4764 retired the object fallback in `useActionModal`):
|
|
1247
|
+
* the runtime resolves a string modal target against page metadata and
|
|
1248
|
+
* REFUSES everything else, so each retired limb here blessed a button that
|
|
1249
|
+
* dispatches to a named refusal at runtime. The ruling explicitly declined
|
|
1250
|
+
* the middle shape (keep the prefix, reject bare object names): a target
|
|
1251
|
+
* names the page `create_opportunity`, or it names nothing. Opening an
|
|
1252
|
+
* object's form is `actionType: 'form'`. Otherwise → ERROR.
|
|
1134
1253
|
*
|
|
1135
1254
|
* actionType 'url' → a relative in-app path. WARN when a recognizable
|
|
1136
1255
|
* `<collection>/<name>` segment (objects/reports/dashboards/pages/views)
|
|
@@ -1169,13 +1288,13 @@ interface DashboardActionRefFinding {
|
|
|
1169
1288
|
/** How to fix it. */
|
|
1170
1289
|
hint: string;
|
|
1171
1290
|
}
|
|
1172
|
-
type AnyRec$
|
|
1291
|
+
type AnyRec$l = Record<string, unknown>;
|
|
1173
1292
|
/**
|
|
1174
1293
|
* Validate every dashboard header action reference in a stack. Returns
|
|
1175
1294
|
* findings (empty = clean). `script`/`modal` dead targets are errors; `url`
|
|
1176
1295
|
* unresolved routes are warnings.
|
|
1177
1296
|
*/
|
|
1178
|
-
declare function validateDashboardActionRefs(stack: AnyRec$
|
|
1297
|
+
declare function validateDashboardActionRefs(stack: AnyRec$l): DashboardActionRefFinding[];
|
|
1179
1298
|
|
|
1180
1299
|
/**
|
|
1181
1300
|
* Build-time filter-placeholder diagnostics (issue #3574).
|
|
@@ -1259,6 +1378,85 @@ interface FilterTokenFinding {
|
|
|
1259
1378
|
*/
|
|
1260
1379
|
declare function validateFilterTokens(stack: Record<string, unknown> | undefined | null): FilterTokenFinding[];
|
|
1261
1380
|
|
|
1381
|
+
/**
|
|
1382
|
+
* Build-time refusal of a bare dashboard date-range PRESET name in an ordering
|
|
1383
|
+
* comparand (#8793 — the ruled C half of #8690).
|
|
1384
|
+
*
|
|
1385
|
+
* `last_7_days` / `last_30_days` / `last_90_days` and their ten calendar
|
|
1386
|
+
* siblings are REAL declared names (`DATE_RANGE_PRESETS`,
|
|
1387
|
+
* `@objectstack/spec/data`) — but only for the dashboard date-filter positions,
|
|
1388
|
+
* where the console lowers them to `{date-macro}` bounds before any query is
|
|
1389
|
+
* sent. Authored as a bare filter comparand, nothing resolves them. Measured
|
|
1390
|
+
* end to end on #8690 (51 rows seeded / 38 in-window):
|
|
1391
|
+
*
|
|
1392
|
+
* ```
|
|
1393
|
+
* $gte "last_30_days" HTTP 200 count=0 <- silent zero (the defect)
|
|
1394
|
+
* $gte "{30_days_ago}" HTTP 200 count=38 <- the spelling that works
|
|
1395
|
+
* ```
|
|
1396
|
+
*
|
|
1397
|
+
* The engine now refuses the bare name on a declared temporal field at QUERY
|
|
1398
|
+
* time (`INVALID_FILTER` / 400, PR #8808 — the B half). This rule is the
|
|
1399
|
+
* AUTHORING-time half the ruling shipped alongside it: the error reaches the
|
|
1400
|
+
* author — an AI author in particular, whose correction loop only sees what
|
|
1401
|
+
* can fail the build or the publish — instead of the first viewer of an empty
|
|
1402
|
+
* chart. The same refusal exists in the schema door
|
|
1403
|
+
* (`data/filter.zod.ts`, Mongo-shape carriers only); this rule additionally
|
|
1404
|
+
* reaches the shapes no `FilterConditionSchema` parse touches — view filter
|
|
1405
|
+
* rules (`{ field, operator, value }`) and filter-array triples
|
|
1406
|
+
* (`['created_at', '>=', …]`) — and reports with the located `where` / `path`
|
|
1407
|
+
* the CLI commands render.
|
|
1408
|
+
*
|
|
1409
|
+
* ## The boundary — ordering positions only, in all three shapes
|
|
1410
|
+
*
|
|
1411
|
+
* This rule is field-agnostic, so the judgement rides on POSITION, exactly as
|
|
1412
|
+
* the schema door's #8793 note lays out at length:
|
|
1413
|
+
*
|
|
1414
|
+
* - **Judged:** `$gt` / `$gte` / `$lt` / `$lte` comparands and `$between`
|
|
1415
|
+
* endpoints (Mongo shape); `>` / `>=` / `<` / `<=` / `between` triples and
|
|
1416
|
+
* every alias `canonicalAstOperator` folds onto them (`gt`, `after`, …);
|
|
1417
|
+
* `greater_than` / `less_than` / `greater_than_or_equal` /
|
|
1418
|
+
* `less_than_or_equal` / `before` / `after` / `between` view filter rules
|
|
1419
|
+
* and every alias `normalizeFilterOperator` folds onto them. An ORDERED
|
|
1420
|
+
* comparison against a declared preset name has no legitimate reading.
|
|
1421
|
+
* - **Not judged:** equality and membership (`=`, `equals`, `$eq`, `$ne`,
|
|
1422
|
+
* `$in`, `$nin`, …). A select/picklist column legitimately stores values
|
|
1423
|
+
* that collide with preset names (`GlobalFilterSchema`'s own pins protect
|
|
1424
|
+
* `type: 'select', defaultValue: 'this_quarter'`), and on a declared
|
|
1425
|
+
* temporal field the engine door still refuses these at query time with the
|
|
1426
|
+
* field's type in hand.
|
|
1427
|
+
* - **Only the 13 declared names.** A near-miss (`last_60_days`) is not this
|
|
1428
|
+
* rule's business — on a temporal field the engine's field-typed door
|
|
1429
|
+
* catches it; judging undeclared strings here would be a guessed superset.
|
|
1430
|
+
*
|
|
1431
|
+
* Both vocabularies' `{placeholder}` spellings never collide with a preset
|
|
1432
|
+
* name (a preset carries no braces), so this rule and `validate-filter-tokens`
|
|
1433
|
+
* cannot double-report one value.
|
|
1434
|
+
*/
|
|
1435
|
+
declare const FILTER_PRESET_COMPARAND = "filter-preset-comparand";
|
|
1436
|
+
type PresetComparandSeverity = 'error' | 'warning';
|
|
1437
|
+
interface PresetComparandFinding {
|
|
1438
|
+
/** Always `error` — the runtime refuses the query, or silently returns zero rows. */
|
|
1439
|
+
severity: PresetComparandSeverity;
|
|
1440
|
+
/** Diagnostic rule id. */
|
|
1441
|
+
rule: string;
|
|
1442
|
+
/** Human-readable location, e.g. `dashboard "sales" · widget "my_deals"`. */
|
|
1443
|
+
where: string;
|
|
1444
|
+
/** Config path, e.g. `dashboards[0].widgets[2].filter.created_at.$gte`. */
|
|
1445
|
+
path: string;
|
|
1446
|
+
/** What is wrong. */
|
|
1447
|
+
message: string;
|
|
1448
|
+
/** How to fix it. */
|
|
1449
|
+
hint: string;
|
|
1450
|
+
}
|
|
1451
|
+
/**
|
|
1452
|
+
* Validate every authored filter across a stack for bare preset comparands.
|
|
1453
|
+
*
|
|
1454
|
+
* Pure `(stack) => Finding[]`; no I/O. Needs no resolution context — the
|
|
1455
|
+
* judgement is on the filter literal alone — which is what qualifies it for
|
|
1456
|
+
* the runtime publish gate's per-write snapshot.
|
|
1457
|
+
*/
|
|
1458
|
+
declare function validatePresetComparands(stack: Record<string, unknown> | undefined | null): PresetComparandFinding[];
|
|
1459
|
+
|
|
1262
1460
|
/** A literal `$and: []` / `$or: []` / `$not: {}` — a combinator with no operands. */
|
|
1263
1461
|
declare const FILTER_EMPTY_COMBINATOR = "filter-empty-combinator";
|
|
1264
1462
|
/** A literal `{}` where a filter node is authored — the whole filter, or a branch. */
|
|
@@ -1305,12 +1503,12 @@ interface ObjectRefFinding {
|
|
|
1305
1503
|
/** How to fix it. */
|
|
1306
1504
|
hint: string;
|
|
1307
1505
|
}
|
|
1308
|
-
type AnyRec$
|
|
1506
|
+
type AnyRec$k = Record<string, unknown>;
|
|
1309
1507
|
/**
|
|
1310
1508
|
* Validate every object-name reference on the surfaces listed in the module
|
|
1311
1509
|
* header. Returns findings (empty = clean).
|
|
1312
1510
|
*/
|
|
1313
|
-
declare function validateObjectReferences(stack: AnyRec$
|
|
1511
|
+
declare function validateObjectReferences(stack: AnyRec$k): ObjectRefFinding[];
|
|
1314
1512
|
|
|
1315
1513
|
type ReferenceIntegritySeverity = 'error' | 'warning';
|
|
1316
1514
|
/**
|
|
@@ -1414,6 +1612,11 @@ type NavTargetRefFinding = ReferenceIntegrityFinding;
|
|
|
1414
1612
|
declare const NAV_TARGET_UNRESOLVED = "nav-target-unresolved";
|
|
1415
1613
|
declare function validateNavTargetRefs(stack: unknown): NavTargetRefFinding[];
|
|
1416
1614
|
|
|
1615
|
+
type NavObjectServabilityFinding = ReferenceIntegrityFinding;
|
|
1616
|
+
/** Emitted when a nav entry targets an object whose `enable` block cannot serve a list. */
|
|
1617
|
+
declare const NAV_OBJECT_UNSERVABLE = "nav-object-unservable";
|
|
1618
|
+
declare function validateNavObjectServability(stack: unknown): NavObjectServabilityFinding[];
|
|
1619
|
+
|
|
1417
1620
|
/**
|
|
1418
1621
|
* [ADR-0061 — searchable set] `searchableFields` entries must name a field the
|
|
1419
1622
|
* object actually has — and, on a list view, one the runtime will agree to scan.
|
|
@@ -1511,6 +1714,21 @@ declare function validateNavTargetRefs(stack: unknown): NavTargetRefFinding[];
|
|
|
1511
1714
|
* the runtime would refuse — `created_by` in a view's narrowing — is a
|
|
1512
1715
|
* missed finding, not a wrong one.)
|
|
1513
1716
|
*
|
|
1717
|
+
* Skip 3 answers EXISTENCE, and since #8404 it no longer ends the matter. On an
|
|
1718
|
+
* ADR-0015 `external` object the platform registers its injected anchors and
|
|
1719
|
+
* provisions no storage behind them (#7865 / #8116), so `owner_id` there is
|
|
1720
|
+
* addressable and empty on every record. Existence rightly stays silent —
|
|
1721
|
+
* PROVENANCE is a second question, asked only of the names skip 3 already
|
|
1722
|
+
* decided not to flag, and answered by the per-object index
|
|
1723
|
+
* ({@link indexUnprovisionedAnchors}) rather than the object-independent union.
|
|
1724
|
+
* A declared anchor survives into the resolved allow-list and the view's
|
|
1725
|
+
* `$searchFields` narrowing, so it reads as search coverage and scans a column
|
|
1726
|
+
* that can never match — #4830's own failure mode reached by a different route.
|
|
1727
|
+
* WARNING, never gating, for #4330's cost asymmetry: the remote schema is not
|
|
1728
|
+
* visible to this pass, so the finding describes a degradation, not a refusal
|
|
1729
|
+
* (the same call `warnUnprovisionedAnchors` makes in `validate-expressions.ts`
|
|
1730
|
+
* and the four filter/binding rules #8340 wired).
|
|
1731
|
+
*
|
|
1514
1732
|
* Dotted paths are NOT skipped here, unlike every sibling rule. Elsewhere
|
|
1515
1733
|
* `owner_id.name` is left alone because the query engine resolves the traversal;
|
|
1516
1734
|
* search does not — `resolveSearchFields` matches the field map by exact string,
|
|
@@ -1520,6 +1738,7 @@ declare function validateNavTargetRefs(stack: unknown): NavTargetRefFinding[];
|
|
|
1520
1738
|
|
|
1521
1739
|
declare const SEARCHABLE_FIELD_UNKNOWN = "searchable-field-unknown";
|
|
1522
1740
|
declare const SEARCHABLE_FIELD_UNSEARCHABLE = "searchable-field-unsearchable";
|
|
1741
|
+
declare const SEARCHABLE_FIELD_UNPROVISIONED = "searchable-field-unprovisioned";
|
|
1523
1742
|
type SearchableFieldSeverity = 'error' | 'warning';
|
|
1524
1743
|
interface SearchableFieldFinding {
|
|
1525
1744
|
/** Always `error` — a stale entry narrows, widens or refuses the search (see module note). */
|
|
@@ -1548,7 +1767,24 @@ interface SearchableFieldFinding {
|
|
|
1548
1767
|
* runtime would refuse are flagged (#4830).
|
|
1549
1768
|
*/
|
|
1550
1769
|
type SearchableFieldRole = 'canonical' | 'narrowing';
|
|
1551
|
-
type AnyRec$
|
|
1770
|
+
type AnyRec$j = Record<string, unknown>;
|
|
1771
|
+
/**
|
|
1772
|
+
* The slice of an object the search checks resolve against: the authored
|
|
1773
|
+
* field map (existence + the `type`/`hidden` meta search resolution reads),
|
|
1774
|
+
* plus the object's own declarations the runtime's resolution consumes.
|
|
1775
|
+
* `null` when the object declares no readable field map (external /
|
|
1776
|
+
* introspected — nothing to judge against).
|
|
1777
|
+
*/
|
|
1778
|
+
interface ObjectSearchTarget {
|
|
1779
|
+
/** Authored field names, for the existence check. */
|
|
1780
|
+
names: Set<string>;
|
|
1781
|
+
/** name → the metadata slice `resolveSearchFieldResolution` reads. */
|
|
1782
|
+
fields: Record<string, SearchFieldMeta>;
|
|
1783
|
+
/** The object's own `searchableFields`, when declared as an array. */
|
|
1784
|
+
searchableFields?: string[];
|
|
1785
|
+
/** `nameField` / `displayNameField` — ordering only, passed for parity. */
|
|
1786
|
+
displayField?: string;
|
|
1787
|
+
}
|
|
1552
1788
|
/**
|
|
1553
1789
|
* Validate every `searchableFields` declaration in the stack — the object's own
|
|
1554
1790
|
* (the canonical set, ADR-0061) and the list views that narrow it. Returns
|
|
@@ -1559,7 +1795,49 @@ type AnyRec$i = Record<string, unknown>;
|
|
|
1559
1795
|
* `validate-react-page-props` — the gate that already parses that source —
|
|
1560
1796
|
* runs the same `checkSearchableFieldList` core on it (#4329).
|
|
1561
1797
|
*/
|
|
1562
|
-
declare function validateSearchableFields(stack: AnyRec$
|
|
1798
|
+
declare function validateSearchableFields(stack: AnyRec$j): SearchableFieldFinding[];
|
|
1799
|
+
|
|
1800
|
+
declare const SORT_FIELD_UNKNOWN = "sort-field-unknown";
|
|
1801
|
+
declare const SORT_FIELD_UNSORTABLE = "sort-field-unsortable";
|
|
1802
|
+
type SortableFieldSeverity = 'error' | 'warning';
|
|
1803
|
+
interface SortableFieldFinding {
|
|
1804
|
+
/** Always `error` — both verdicts are a `400 INVALID_SORT` at request time. */
|
|
1805
|
+
severity: SortableFieldSeverity;
|
|
1806
|
+
/** Diagnostic rule id. */
|
|
1807
|
+
rule: string;
|
|
1808
|
+
/** Human-readable location, e.g. `object "crm_opportunity" › listViews.pipeline`. */
|
|
1809
|
+
where: string;
|
|
1810
|
+
/** Config path, e.g. `objects[0].listViews.pipeline.sort[1]`. */
|
|
1811
|
+
path: string;
|
|
1812
|
+
/** What is wrong. */
|
|
1813
|
+
message: string;
|
|
1814
|
+
/** How to fix it. */
|
|
1815
|
+
hint: string;
|
|
1816
|
+
}
|
|
1817
|
+
type AnyRec$i = Record<string, unknown>;
|
|
1818
|
+
/**
|
|
1819
|
+
* Check ONE authored `sort` declaration against the object it is bound to —
|
|
1820
|
+
* the shared core behind every list-view surface that declares an ordering.
|
|
1821
|
+
*
|
|
1822
|
+
* `fieldsByObject` is {@link indexObjectSearchTargets}' index, reused rather
|
|
1823
|
+
* than rebuilt: the SEARCH and SORT doors must agree about which fields an
|
|
1824
|
+
* object has and what type each one is, and two hand-written readers of the
|
|
1825
|
+
* same field map is the drift `system-fields.ts` and `view-walk.ts` were both
|
|
1826
|
+
* created to end. `subject` names the declaration for the message; the parsed
|
|
1827
|
+
* key's position is appended to `path` so the author can go straight to it.
|
|
1828
|
+
*/
|
|
1829
|
+
declare function checkSortDeclaration(declared: unknown, objectName: string | undefined, fieldsByObject: ReadonlyMap<string, ObjectSearchTarget | null>, where: string, path: string, subject: string): SortableFieldFinding[];
|
|
1830
|
+
/**
|
|
1831
|
+
* Validate every list-view `sort` declaration in the stack — the object's
|
|
1832
|
+
* built-in named list views and the `defineView` aggregates that declare one.
|
|
1833
|
+
* Returns findings (empty = clean).
|
|
1834
|
+
*
|
|
1835
|
+
* The surfaces walked here are exactly `validateSearchableFields`', for the
|
|
1836
|
+
* same reason: these are the declarations that lower into an engine `orderBy`
|
|
1837
|
+
* over the bound object's own columns. See the module note for the four
|
|
1838
|
+
* sort-carrying surfaces that were checked and deliberately left out.
|
|
1839
|
+
*/
|
|
1840
|
+
declare function validateSortableFields(stack: AnyRec$i): SortableFieldFinding[];
|
|
1563
1841
|
|
|
1564
1842
|
declare const ACTION_NAME_UNDEFINED = "action-name-undefined";
|
|
1565
1843
|
type ActionNameRefSeverity = 'error' | 'warning';
|
|
@@ -1758,6 +2036,17 @@ declare function walkPageComponents(page: AnyRec$f, pagePath: string): WalkedCom
|
|
|
1758
2036
|
* drift #4330 had just finished removing from the system-field lists.
|
|
1759
2037
|
*/
|
|
1760
2038
|
declare const PAGE_FIELD_UNKNOWN = "page-field-unknown";
|
|
2039
|
+
/**
|
|
2040
|
+
* [#8340] The reference RESOLVES to a registry-injected system column — so
|
|
2041
|
+
* {@link PAGE_FIELD_UNKNOWN} is right to stay silent — but the bound object is
|
|
2042
|
+
* ADR-0015 `external`, where the platform registers the anchor and provisions
|
|
2043
|
+
* no storage behind it. Always `warning`, on both consequences and including
|
|
2044
|
+
* the `queried` one that gates for a genuinely missing column: the existence
|
|
2045
|
+
* question has a closed oracle here and the provenance question does not (this
|
|
2046
|
+
* pass cannot see the remote schema, only that the platform stores nothing) —
|
|
2047
|
+
* #8116's severity reasoning, unchanged.
|
|
2048
|
+
*/
|
|
2049
|
+
declare const PAGE_FIELD_UNPROVISIONED = "page-field-unprovisioned";
|
|
1761
2050
|
type PageFieldSeverity = 'error' | 'warning';
|
|
1762
2051
|
interface PageFieldFinding {
|
|
1763
2052
|
/**
|
|
@@ -2183,6 +2472,18 @@ interface HookBodyWriteFinding {
|
|
|
2183
2472
|
hint: string;
|
|
2184
2473
|
}
|
|
2185
2474
|
declare const HOOK_BODY_WRITE_UNKNOWN_FIELD = "hook-body-write-unknown-field";
|
|
2475
|
+
/**
|
|
2476
|
+
* [#8663] The write-axis twin of `flow-template-field-unprovisioned` (#8340):
|
|
2477
|
+
* the body writes a field {@link IMPLICIT_FIELDS} exempts, but on THIS target
|
|
2478
|
+
* the platform registered that anchor without provisioning storage for it.
|
|
2479
|
+
*
|
|
2480
|
+
* A separate id at `warning` severity rather than a reclassification of
|
|
2481
|
+
* {@link HOOK_BODY_WRITE_UNKNOWN_FIELD}, matching #8340's precedent exactly:
|
|
2482
|
+
* the existence verdict is unchanged (the name IS addressable), and what is
|
|
2483
|
+
* added is a second, independently suppressible finding on the path where the
|
|
2484
|
+
* existence check stays silent.
|
|
2485
|
+
*/
|
|
2486
|
+
declare const HOOK_BODY_WRITE_UNPROVISIONED_ANCHOR = "hook-body-write-unprovisioned-anchor";
|
|
2186
2487
|
/** One syntactic write shape the extractor recognizes. */
|
|
2187
2488
|
interface HookBodyWritePattern {
|
|
2188
2489
|
/** Stable pattern id, carried on every extracted write. */
|
|
@@ -2281,6 +2582,12 @@ interface ActionBodyWriteFinding {
|
|
|
2281
2582
|
}
|
|
2282
2583
|
declare const ACTION_BODY_WRITE_UNKNOWN_FIELD = "action-body-write-unknown-field";
|
|
2283
2584
|
declare const ACTION_RECORD_WRITE_DISCARDED = "action-record-write-discarded";
|
|
2585
|
+
/**
|
|
2586
|
+
* [#8663] The action-surface twin of `hook-body-write-unprovisioned-anchor`.
|
|
2587
|
+
* Same question, same wording, same `warning` severity — this rule and the hook
|
|
2588
|
+
* rule share {@link IMPLICIT_FIELDS}, so they shared its blind spot too.
|
|
2589
|
+
*/
|
|
2590
|
+
declare const ACTION_BODY_WRITE_UNPROVISIONED_ANCHOR = "action-body-write-unprovisioned-anchor";
|
|
2284
2591
|
/** @deprecated alias — the exclusion shape is shared with the hook rule. */
|
|
2285
2592
|
type ActionBodyWriteExclusion = BodyWritePatternExclusion;
|
|
2286
2593
|
/**
|
|
@@ -2314,9 +2621,17 @@ type AnyRec$6 = Record<string, unknown>;
|
|
|
2314
2621
|
*/
|
|
2315
2622
|
declare function validateActionBodyWrites(stack: AnyRec$6): ActionBodyWriteFinding[];
|
|
2316
2623
|
|
|
2317
|
-
|
|
2624
|
+
/**
|
|
2625
|
+
* `error` for the existence verdict — a literal key against a literal object is
|
|
2626
|
+
* a certainty (see the module note). [#8663] `warning` for the provenance one:
|
|
2627
|
+
* the same widening `validateFlowTemplatePaths` carries, for the same reason.
|
|
2628
|
+
* The two questions have different certainties, so they cannot share a
|
|
2629
|
+
* severity; the suite that runs this rule is severity-agnostic by contract and
|
|
2630
|
+
* carries each finding's own value through.
|
|
2631
|
+
*/
|
|
2632
|
+
type FlowNodeWriteSeverity = 'error' | 'warning';
|
|
2318
2633
|
interface FlowNodeWriteFinding {
|
|
2319
|
-
/**
|
|
2634
|
+
/** Per-finding — see {@link FlowNodeWriteSeverity}, which says why it is not a constant. */
|
|
2320
2635
|
severity: FlowNodeWriteSeverity;
|
|
2321
2636
|
rule: string;
|
|
2322
2637
|
/** Human-readable location, e.g. `flow "close_deal" › node "Mark won"`. */
|
|
@@ -2327,6 +2642,20 @@ interface FlowNodeWriteFinding {
|
|
|
2327
2642
|
hint: string;
|
|
2328
2643
|
}
|
|
2329
2644
|
declare const FLOW_NODE_WRITE_UNKNOWN_FIELD = "flow-node-write-unknown-field";
|
|
2645
|
+
/**
|
|
2646
|
+
* [#8663] The flow-node twin of `hook-body-write-unprovisioned-anchor`. This
|
|
2647
|
+
* rule reached the same blind spot from the same direction: it imports
|
|
2648
|
+
* {@link IMPLICIT_FIELDS} from the hook rule, so it inherited the set's
|
|
2649
|
+
* object-independence along with its contents.
|
|
2650
|
+
*
|
|
2651
|
+
* ⚠️ `warning`, NOT this rule's usual `error`. The existence verdict gates
|
|
2652
|
+
* because a literal key against a literal object is a certainty; the provenance
|
|
2653
|
+
* verdict is a claim about a REMOTE schema this repo cannot see, so it advises.
|
|
2654
|
+
* Reclassifying it upward would convert a silent case straight into a build
|
|
2655
|
+
* break — the shape ADR-0072 D1 forbids, at the one severity where it cannot be
|
|
2656
|
+
* ignored.
|
|
2657
|
+
*/
|
|
2658
|
+
declare const FLOW_NODE_WRITE_UNPROVISIONED_ANCHOR = "flow-node-write-unprovisioned-anchor";
|
|
2330
2659
|
/** Flow node types whose `config.fields` keys this rule resolves. */
|
|
2331
2660
|
declare const FLOW_WRITE_NODE_TYPES: readonly string[];
|
|
2332
2661
|
/** A `fields`-bearing node type this rule does NOT cover yet, and why. */
|
|
@@ -2525,6 +2854,42 @@ interface LintIssue {
|
|
|
2525
2854
|
path: string;
|
|
2526
2855
|
fix?: string;
|
|
2527
2856
|
}
|
|
2857
|
+
/**
|
|
2858
|
+
* A {@link LintIssue} that also states the HUMAN-READABLE location, for rules
|
|
2859
|
+
* that are adapted into `AuthoringFinding` (`packages/lint/src/authoring-rules.ts`).
|
|
2860
|
+
*
|
|
2861
|
+
* `AuthoringFinding` declares two location slots with different jobs — `where`
|
|
2862
|
+
* ("human-readable location", e.g. `object "leave_request"`) and `path` ("config
|
|
2863
|
+
* path", e.g. `objects[3].sharingModel`) — and every CLI command renders the
|
|
2864
|
+
* first as the line's prefix: `os validate` prints
|
|
2865
|
+
* `• ${where}: ${message}` and then `rule: ${rule} at ${path}`.
|
|
2866
|
+
*
|
|
2867
|
+
* `LintIssue` carries only the positional `path`, so the three ADR-0120
|
|
2868
|
+
* uniqueness rules' registry adapters had nothing else to map and set
|
|
2869
|
+
* `where: f.path`. Measured on `origin/main`: an author saw
|
|
2870
|
+
* `• objects[44].indexes[1]: "sys_account" declares index … at objects[44].indexes[1]`
|
|
2871
|
+
* — the same positional string twice, and an index into the MERGED object array
|
|
2872
|
+
* that appears in no file the author wrote (44 objects from
|
|
2873
|
+
* `@objectstack/platform-objects` plus one from `@objectstack/metadata-core`).
|
|
2874
|
+
* No information was lost — the object's name is in the message — but the
|
|
2875
|
+
* location slot said nothing the `at` clause did not already say, and every
|
|
2876
|
+
* other rule in the table spells it `object "sys_account"`.
|
|
2877
|
+
*
|
|
2878
|
+
* Stating `where` at the PRODUCER rather than reconstructing it in the adapter
|
|
2879
|
+
* is deliberate: only the rule still holds the object it walked. Making it
|
|
2880
|
+
* REQUIRED here (rather than adding `where?` to `LintIssue` and writing
|
|
2881
|
+
* `f.where ?? f.path` at the adapter) is the same discipline — a consumer-side
|
|
2882
|
+
* fallback would let the next rule ship the positional spelling again, silently.
|
|
2883
|
+
*
|
|
2884
|
+
* `path` is unchanged and stays positional: it is the slot that is SUPPOSED to
|
|
2885
|
+
* be a config path, `os validate` prints it after `at`, and the runtime gate's
|
|
2886
|
+
* `fingerprint` reads `where` and `path` together (making `where` more specific
|
|
2887
|
+
* cannot merge two findings that were distinct).
|
|
2888
|
+
*/
|
|
2889
|
+
interface LocatedLintIssue extends LintIssue {
|
|
2890
|
+
/** Human-readable location, e.g. `object "sys_account" · index 'uniq_org_email'`. */
|
|
2891
|
+
where: string;
|
|
2892
|
+
}
|
|
2528
2893
|
declare const UNIQUE_DOUBLE_DECLARATION = "unique/double-declaration";
|
|
2529
2894
|
declare const UNIQUE_UNSCOPED_DECLARED_INDEX = "unique/unscoped-declared-index";
|
|
2530
2895
|
declare const UNIQUE_LEGACY_ORGANIZATION_COMPOSITE = "unique/legacy-organization-composite";
|
|
@@ -2545,10 +2910,12 @@ declare const UNIQUE_LEGACY_ORGANIZATION_COMPOSITE = "unique/legacy-organization
|
|
|
2545
2910
|
* 17.x: warning. Protocol 18 rejects the spelling at validate/publish (#5082).
|
|
2546
2911
|
* Advisory — never fails a build in 17.x.
|
|
2547
2912
|
*
|
|
2913
|
+
* Concrete harm: #8323 measured the cross-tenant 409-vs-201 oracle end to end.
|
|
2914
|
+
*
|
|
2548
2915
|
* Wiring: own AUTHORING_RULES entry (validate/build), and `lintDataModel`
|
|
2549
2916
|
* calls it for `os lint` — each command reports each finding exactly once.
|
|
2550
2917
|
*/
|
|
2551
|
-
declare function lintUnscopedDeclaredIndexes(objects: any[]):
|
|
2918
|
+
declare function lintUnscopedDeclaredIndexes(objects: any[]): LocatedLintIssue[];
|
|
2552
2919
|
/**
|
|
2553
2920
|
* R10 (ADR-0120 D5b) — the same single column carries BOTH a field-level
|
|
2554
2921
|
* `unique` and a declared single-column unique index (#3991), judged in the
|
|
@@ -2578,7 +2945,7 @@ declare function lintUnscopedDeclaredIndexes(objects: any[]): LintIssue[];
|
|
|
2578
2945
|
* Advisory. The resulting stack is well-defined — the cost is an intent that
|
|
2579
2946
|
* never takes effect, not a broken artifact — so this never fails a build.
|
|
2580
2947
|
*/
|
|
2581
|
-
declare function lintUniqueDeclarations(objects: any[]):
|
|
2948
|
+
declare function lintUniqueDeclarations(objects: any[]): LocatedLintIssue[];
|
|
2582
2949
|
/**
|
|
2583
2950
|
* R12 (ADR-0120 D5c) — a declared unique index whose column list CONTAINS the
|
|
2584
2951
|
* organization column: the hand-written per-organization composite (S6),
|
|
@@ -2605,7 +2972,7 @@ declare function lintUniqueDeclarations(objects: any[]): LintIssue[];
|
|
|
2605
2972
|
* unique declared on the organization column ALONE, which is not a composite and
|
|
2606
2973
|
* has no per-organization reading to recover.
|
|
2607
2974
|
*/
|
|
2608
|
-
declare function lintLegacyOrganizationComposites(objects: any[]):
|
|
2975
|
+
declare function lintLegacyOrganizationComposites(objects: any[]): LocatedLintIssue[];
|
|
2609
2976
|
/**
|
|
2610
2977
|
* Lint the relationship / data-modeling conventions across the full object set.
|
|
2611
2978
|
* Pure and deterministic — safe to call from both the `lint` command and the
|
|
@@ -2613,4 +2980,4 @@ declare function lintLegacyOrganizationComposites(objects: any[]): LintIssue[];
|
|
|
2613
2980
|
*/
|
|
2614
2981
|
declare function lintDataModel(objects: any[]): LintIssue[];
|
|
2615
2982
|
|
|
2616
|
-
export { ACTION_BODY_WRITE_EXCLUSIONS, ACTION_BODY_WRITE_PATTERNS, ACTION_BODY_WRITE_PATTERN_IDS, ACTION_BODY_WRITE_UNKNOWN_FIELD, ACTION_NAME_UNDEFINED, ACTION_NO_PLACEMENT, ACTION_RECORD_WRITE_DISCARDED, ACTION_RECORD_WRITE_PATTERNS, ACTION_RECORD_WRITE_PATTERN_IDS, AGENT_AUTHORING_WITHDRAWN, AI_SKILL_SURFACE_MISMATCH, AI_SKILL_TOOL_UNRESOLVED, APPROVAL_APPROVERS_MAY_RESOLVE_EMPTY, APPROVAL_APPROVER_CROSS_ORG_UNSUPPORTED, APPROVAL_APPROVER_NOT_MEMBERSHIP_TIER, APPROVAL_APPROVER_TYPE_DEPRECATED, APPROVAL_APPROVER_TYPE_UNKNOWN, APPROVAL_APPROVER_TYPE_UNSUPPORTED, APPROVAL_DECISION_OUTPUTS_RESERVED, APPROVAL_ESCALATION_REASSIGN_NO_TARGET, APPROVAL_EXPRESSION_INVALID, APPROVAL_EXPRESSION_NO_EMPTY_POLICY, AUTONUMBER_LITERAL_TOKEN, AUTONUMBER_OPTIONAL_FIELD, AUTONUMBER_SELF_REFERENCE, AUTONUMBER_UNKNOWN_FIELD, type ActionBodyWriteExclusion, type ActionBodyWriteFinding, type ActionBodyWriteSeverity, type ActionLocationsFinding, type ActionLocationsSeverity, type ActionNameRefFinding, type ActionNameRefSeverity, type AiAgentAuthoringFinding, type AiAgentAuthoringSeverity, type AiSurfaceAffinityFinding, type AiSurfaceAffinitySeverity, type AiToolRefFinding, type AiToolRefSeverity, type ApprovalApproverFinding, type ApprovalApproverSeverity, type AutonumberLintFinding, type BodyWritePatternExclusion, CAPABILITY_REFERENCE_UNKNOWN, CHART_AXIS_NOT_SELECTED, CHART_CONFIG_MISSING, CHART_DATASET_UNKNOWN, CHART_DIMENSION_UNKNOWN, CHART_FIELD_UNKNOWN, CHART_MEASURE_UNKNOWN, COMPONENT_PROPS_INVALID, COMPONENT_PROPS_UNKNOWN_KEY, type CapabilityRefFinding, type CapabilityRefSeverity, type ChartBindingFinding, type ChartBindingSeverity, type ComponentPropsFinding, type ComponentPropsSeverity, DASHBOARD_ACTION_ROUTE_UNRESOLVED, DASHBOARD_ACTION_TARGET_UNDEFINED, DASHBOARD_FILTER_FIELD_UNKNOWN, DEFAULT_AGENT_OUTSIDE_ROSTER, type DashboardActionRefFinding, type DashboardActionRefSeverity, type EmptyCombinatorFinding, type EmptyCombinatorSeverity, type ExprIssue, type ExtractedHookBodyWrite, type ExtractedHookBodyWriteSet, FIELD_GROUP_EMPTY, FIELD_GROUP_SHADOWED, FIELD_GROUP_UNDECLARED, FILTER_EMPTY_COMBINATOR, FILTER_EMPTY_NODE, FILTER_TOKEN_UNKNOWN, FLOW_APPROVAL_REVISE_DEAD_END, FLOW_APPROVAL_REVISE_DISABLED, FLOW_APPROVAL_REVISE_TARGET_NOT_SERVICE_OWNED, FLOW_APPROVAL_REVISE_UNMARKED_BACKEDGE, FLOW_BARE_DOLLAR_REF, FLOW_BRANCH_LABEL_UNMATCHED, FLOW_DATE_EQUALITY_FILTER, FLOW_DECISION_UNCONDITIONAL_BRANCH, FLOW_DEFAULT_EDGE_WITH_CONDITION, FLOW_DOUBLE_BRACE_INTERP, FLOW_DRAFT_STATUS_AMBIGUOUS, FLOW_ERROR_LABEL_NOT_FAULT, FLOW_INERT_NODE_CONDITION, FLOW_MULTIPLE_DEFAULT_EDGES, FLOW_MULTI_WRITE_UNFILTERED, FLOW_NODE_WRITE_UNKNOWN_FIELD, FLOW_PHANTOM_AGGREGATION, FLOW_RUNAS_UNSCOPED, FLOW_TEMPLATE_LOOKUP_TRAVERSAL, FLOW_TEMPLATE_UNKNOWN_FIELD, FLOW_TIME_RELATIVE_ANTIPATTERN, FLOW_TIME_RELATIVE_DESCRIPTOR_INVALID, FLOW_TIME_RELATIVE_DESCRIPTOR_UNROUTABLE, FLOW_TRIGGER_UNKNOWN_EVENT, FLOW_TRIGGER_UNKNOWN_OBJECT, FLOW_TRIGGER_UNROUTABLE, FLOW_UPDATE_READONLY_FIELD, FLOW_UPDATE_READONLY_WHEN_FIELD, FLOW_WRITE_NODE_TYPES, FLOW_WRITE_NODE_TYPES_DEFERRED, FORM_COLSPAN_ABSOLUTE, FORM_FIELD_UNKNOWN, type FilterTokenFinding, type FilterTokenSeverity, type FlowLintFinding, type FlowNodeWriteFinding, type FlowNodeWriteSeverity, type FlowTemplatePathFinding, type FlowTemplatePathSeverity, type FlowTriggerReadinessFinding, type FlowTriggerReadinessSeverity, type FlowWriteNodeDeferral, type FormLayoutFinding, type FormLayoutSeverity, type FunctionalCompletenessFinding, type FunctionalCompletenessSeverity, HOOK_BODY_WRITE_EXCLUSIONS, HOOK_BODY_WRITE_PATTERNS, HOOK_BODY_WRITE_PATTERN_IDS, HOOK_BODY_WRITE_UNKNOWN_FIELD, type HookBodyWriteFinding, type HookBodyWritePattern, type HookBodyWriteSeverity, type JsxPageFinding, type JsxPageSeverity, LIST_VIEW_FILTERS_IN_VIEWS_MODE, LIVENESS_DEAD_PROPERTY, LIVENESS_EXPERIMENTAL_PROPERTY, type LintIssue, type ListViewModeFinding, type ListViewModeSeverity, type LivenessLintFinding, MAX_SCHEMA_WALK_DEPTH, MEASURE_AGGREGATE_INCOHERENT, NAV_OBJECT_UNGRANTED, NAV_TARGET_UNRESOLVED, NULL_GUARD_HINT, type NavAccessFinding, type NavAccessSeverity, type NavTargetRefFinding, type NavTargetRefSeverity, type NullGuardFinding, type NullGuardOptions, OBJECT_REFERENCE_UNKNOWN, OBJECT_REFERENCE_UNREGISTERED_PLATFORM, OPEN_VOCABULARY_PROBES, ORG_AXIS_CROSS_ORG_BU_GRANT, ORG_AXIS_PERMISSION_INHERITANCE, type ObjectRefFinding, type ObjectRefSeverity, type OrgAxisFinding, type OrgAxisSeverity, PAGE_FIELD_UNKNOWN, PAGE_SOURCE_CLASSNAME, PREDICATE_PATH_UNRESOLVED, PREDICATE_PATH_UNROOTED, PRE_SEAL_PHASES, type PageFieldFinding, type PageFieldSeverity, type PredicatePathFinding, type PredicatePathOptions, type PredicatePathSeverity, REACT_BLOCK_NEEDS_RECORD_CONTEXT, REACT_CHART_AGGREGATE_INVALID, REACT_CHART_AXIS_UNKNOWN, REACT_CHART_DRILLDOWN_INVALID, REACT_CHART_FIELD_UNKNOWN, REFERENCE_INTEGRITY_RULES, RLS_PREDICATE_OVER_BUDGET, RLS_PREDICATE_UNENFORCEABLE, RLS_PREDICATE_UNPARSEABLE, RUNTIME_AJV_OPTIONS, type ReactPageFinding, type ReactPageSeverity, type ReactPropFinding, type ReactPropSeverity, type ReadonlyFlowWriteFinding, type ReadonlyFlowWriteSeverity, type RecordTitleFinding, type RecordTitleSeverity, type ReferenceIntegrityFinding, type ReferenceIntegrityRule, type ReferenceIntegritySeverity, type RlsPredicateFinding, type RlsPredicateSeverity, type RuleCompilabilityFinding, type RuleCompilabilitySeverity, type RuleSchemaFormatFinding, type RuleSchemaFormatSeverity, SEAL_MARKERS, SEARCHABLE_FIELD_UNKNOWN, SEARCHABLE_FIELD_UNSEARCHABLE, SECURITY_ANCHOR_HIGH_PRIVILEGE, SECURITY_BOOK_AUDIENCE_UNKNOWN_SET, SECURITY_DELEGATION_MISSING_REASON, SECURITY_EXTERNAL_WIDER, SECURITY_FLS_UNQUALIFIED_KEY, SECURITY_GRANT_EXPIRED_AT_AUTHORING, SECURITY_MASTER_DETAIL_UNGRANTED, SECURITY_OWD_ALIAS, SECURITY_OWD_UNSET, SECURITY_PRIVATE_NO_READSCOPE, SECURITY_ROLE_WORD, SECURITY_WILDCARD_VAMA, SEED_INSERT_MODE_DUPLICATES_ON_REPLAY, SEED_VALUE_OUTSIDE_STATE_MACHINE, SEMANTIC_ROLE_FIELD_UNKNOWN, SHARING_RULE_RUNTIME_VARIABLE_CONDITION, SHARING_RULE_UNLOWERABLE_CONDITION, STARTUP_OPEN_VOCABULARY_VERDICT, STARTUP_VERDICT_ASSERTIVE_WORDING, STARTUP_VERDICT_HINT, STYLE_CLASSNAME_TAILWIND, STYLE_NODE_MISSING_ID, STYLE_RESPONSIVE_NO_BASE, STYLE_UNKNOWN_CSS_PROPERTY, STYLE_UNKNOWN_TOKEN, type SearchableFieldFinding, type SearchableFieldRole, type SearchableFieldSeverity, type SecurityFinding, type SecuritySeverity, type SeedReplaySafetyFinding, type SeedReplaySafetySeverity, type SeedStateMachineFinding, type SeedStateMachineSeverity, type SemanticRoleFinding, type SemanticRoleSeverity, type Severity, type SharingRuleEnforceabilityFinding, type SharingRuleEnforceabilitySeverity, type SourceStyleFinding, type SourceStyleSeverity, type StartupRegistryVerdictFinding, type StartupRegistryVerdictOptions, type StartupRegistryVerdictSeverity, type StyleFinding, type StyleSeverity, TABLE_COUNT_ONLY, TITLE_FORMAT_RETIRED, TITLE_UNRESOLVABLE, TRANSLATION_OPTION_KEY_UNKNOWN, TRANSLATION_SECTION_NAME_MISSING, TRANSLATION_TARGET_UNKNOWN, type TranslatableSectionFinding, type TranslatableSectionSeverity, type TranslationRefFinding, type TranslationRefSeverity, UNIQUE_DOUBLE_DECLARATION, UNIQUE_LEGACY_ORGANIZATION_COMPOSITE, UNIQUE_UNSCOPED_DECLARED_INDEX, VALIDATION_RULE_REGEX_UNCOMPILABLE, VALIDATION_RULE_SCHEMA_UNCOMPILABLE, VALIDATION_RULE_SCHEMA_UNKNOWN_FORMAT, VIEW_CONTAINER_SHAPE, VIEW_KEY_COLLISION, VIEW_REF_FORM_TARGET_KIND, VIEW_REF_FORM_TARGET_MISSING, VISIBILITY_BARE_IDENTIFIER, VISIBILITY_PREDICATE_OVER_BUDGET, VISIBILITY_PREDICATE_SYNTAX, VISIBILITY_ROOT_MISLAYERED, type ViewContainerFinding, type ViewContainerSeverity, type ViewRefFinding, type VisibilityFinding, type VisibilityLayer, type VisibilityOptions, type VisibilitySeverity, WIDGET_DATASET_UNKNOWN, WIDGET_DIMENSION_UNKNOWN, WIDGET_LEGACY_ANALYTICS_SHAPE, WIDGET_LEGACY_ANALYTICS_UNRENDERABLE, WIDGET_MEASURE_UNKNOWN, type WalkedComponent, type WalkedValidationRule, type WidgetBindingFinding, type WidgetBindingSeverity, buildAccessMatrix, diffAccessMatrix, extractHookBodyWriteSet, extractHookBodyWrites, findStartupRegistryVerdicts, findUnguardedNullableOperands, isSourceAuthoredPage, lintAutonumberFormats, lintDataModel, lintFlowPatterns, lintLegacyOrganizationComposites, lintLivenessProperties, lintUniqueDeclarations, lintUnscopedDeclaredIndexes, lintViewRefs, nearestRegisteredFormat, nullGuardMessage, validateActionBodyWrites, validateActionLocations, validateActionNameRefs, validateAiAgentAuthoring, validateAiSurfaceAffinity, validateAiToolReferences, validateApprovalApprovers, validateCapabilityReferences, validateChartBindings, validateComponentProps, validateDashboardActionRefs, validateEmptyCombinators, validateFilterTokens, validateFlowNodeWrites, validateFlowTemplatePaths, validateFlowTriggerReadiness, validateFormLayout, validateFunctionalCompleteness, validateHookBodyWrites, validateJsxPages, validateListViewMode, validateNavAccess, validateNavTargetRefs, validateObjectReferences, validateOrgAxisRedLines, validatePageFieldBindings, validatePageSourceStyling, validatePredicatePathRefs, validateReactPageProps, validateReactPages, validateReadonlyFlowWrites, validateRecordTitle, validateReferenceIntegrity, validateResponsiveStyles, validateRlsPredicateEnforceability, validateRuleCompilability, validateRuleSchemaFormats, validateSearchableFields, validateSecurityPosture, validateSeedReplaySafety, validateSeedStateMachine, validateSemanticRoles, validateSharingRuleEnforceability, validateStackExpressions, validateTranslatableSections, validateTranslationReferences, validateViewContainers, validateVisibilityPredicates, validateWidgetBindings, walkPageComponents };
|
|
2983
|
+
export { ACTION_BODY_WRITE_EXCLUSIONS, ACTION_BODY_WRITE_PATTERNS, ACTION_BODY_WRITE_PATTERN_IDS, ACTION_BODY_WRITE_UNKNOWN_FIELD, ACTION_BODY_WRITE_UNPROVISIONED_ANCHOR, ACTION_NAME_UNDEFINED, ACTION_NO_PLACEMENT, ACTION_RECORD_WRITE_DISCARDED, ACTION_RECORD_WRITE_PATTERNS, ACTION_RECORD_WRITE_PATTERN_IDS, AGENT_AUTHORING_WITHDRAWN, AI_SKILL_SURFACE_MISMATCH, AI_SKILL_TOOL_UNRESOLVED, APPROVAL_APPROVERS_MAY_RESOLVE_EMPTY, APPROVAL_APPROVER_CROSS_ORG_UNSUPPORTED, APPROVAL_APPROVER_NOT_MEMBERSHIP_TIER, APPROVAL_APPROVER_TYPE_DEPRECATED, APPROVAL_APPROVER_TYPE_UNKNOWN, APPROVAL_APPROVER_TYPE_UNSUPPORTED, APPROVAL_DECISION_OUTPUTS_RESERVED, APPROVAL_ESCALATION_REASSIGN_NO_TARGET, APPROVAL_EXPRESSION_INVALID, APPROVAL_EXPRESSION_NO_EMPTY_POLICY, AUTONUMBER_LITERAL_TOKEN, AUTONUMBER_OPTIONAL_FIELD, AUTONUMBER_SELF_REFERENCE, AUTONUMBER_UNKNOWN_FIELD, type ActionBodyWriteExclusion, type ActionBodyWriteFinding, type ActionBodyWriteSeverity, type ActionLocationsFinding, type ActionLocationsSeverity, type ActionNameRefFinding, type ActionNameRefSeverity, type AiAgentAuthoringFinding, type AiAgentAuthoringSeverity, type AiSurfaceAffinityFinding, type AiSurfaceAffinitySeverity, type AiToolRefFinding, type AiToolRefSeverity, type ApprovalApproverFinding, type ApprovalApproverSeverity, type AutonumberLintFinding, type BodyWritePatternExclusion, CAPABILITY_REFERENCE_UNKNOWN, CHART_AXIS_NOT_SELECTED, CHART_CONFIG_MISSING, CHART_DATASET_UNKNOWN, CHART_DIMENSION_UNKNOWN, CHART_FIELD_UNKNOWN, CHART_MEASURE_UNKNOWN, COMPONENT_PROPS_INVALID, COMPONENT_PROPS_UNKNOWN_KEY, type CapabilityRefFinding, type CapabilityRefSeverity, type ChartBindingFinding, type ChartBindingSeverity, type ComponentPropsFinding, type ComponentPropsSeverity, DASHBOARD_ACTION_ROUTE_UNRESOLVED, DASHBOARD_ACTION_TARGET_UNDEFINED, DASHBOARD_FILTER_FIELD_UNKNOWN, DASHBOARD_FILTER_FIELD_UNPROVISIONED, DEFAULT_AGENT_OUTSIDE_ROSTER, type DashboardActionRefFinding, type DashboardActionRefSeverity, type EmptyCombinatorFinding, type EmptyCombinatorSeverity, type ExprIssue, type ExtractedHookBodyWrite, type ExtractedHookBodyWriteSet, FIELD_GROUP_EMPTY, FIELD_GROUP_SHADOWED, FIELD_GROUP_UNDECLARED, FILTER_EMPTY_COMBINATOR, FILTER_EMPTY_NODE, FILTER_PRESET_COMPARAND, FILTER_TOKEN_UNKNOWN, FLOW_APPROVAL_REVISE_DEAD_END, FLOW_APPROVAL_REVISE_DISABLED, FLOW_APPROVAL_REVISE_TARGET_NOT_SERVICE_OWNED, FLOW_APPROVAL_REVISE_UNMARKED_BACKEDGE, FLOW_BARE_DOLLAR_REF, FLOW_BRANCH_LABEL_UNMATCHED, FLOW_DATE_EQUALITY_FILTER, FLOW_DECISION_UNCONDITIONAL_BRANCH, FLOW_DEFAULT_EDGE_WITH_CONDITION, FLOW_DOUBLE_BRACE_INTERP, FLOW_DRAFT_STATUS_AMBIGUOUS, FLOW_ERROR_LABEL_NOT_FAULT, FLOW_INERT_NODE_CONDITION, FLOW_MULTIPLE_DEFAULT_EDGES, FLOW_MULTI_WRITE_UNFILTERED, FLOW_NODE_WRITE_UNKNOWN_FIELD, FLOW_NODE_WRITE_UNPROVISIONED_ANCHOR, FLOW_PHANTOM_AGGREGATION, FLOW_RUNAS_UNSCOPED, FLOW_TEMPLATE_FIELD_UNPROVISIONED, FLOW_TEMPLATE_LOOKUP_TRAVERSAL, FLOW_TEMPLATE_UNKNOWN_FIELD, FLOW_TIME_RELATIVE_ANTIPATTERN, FLOW_TIME_RELATIVE_DESCRIPTOR_INVALID, FLOW_TIME_RELATIVE_DESCRIPTOR_UNROUTABLE, FLOW_TRIGGER_UNKNOWN_EVENT, FLOW_TRIGGER_UNKNOWN_OBJECT, FLOW_TRIGGER_UNROUTABLE, FLOW_UPDATE_READONLY_FIELD, FLOW_UPDATE_READONLY_WHEN_FIELD, FLOW_WRITE_NODE_TYPES, FLOW_WRITE_NODE_TYPES_DEFERRED, FORM_COLSPAN_ABSOLUTE, FORM_FIELD_UNKNOWN, type FilterTokenFinding, type FilterTokenSeverity, type FlowLintFinding, type FlowNodeWriteFinding, type FlowNodeWriteSeverity, type FlowTemplatePathFinding, type FlowTemplatePathSeverity, type FlowTriggerReadinessFinding, type FlowTriggerReadinessSeverity, type FlowWriteNodeDeferral, type FormLayoutFinding, type FormLayoutSeverity, type FunctionalCompletenessFinding, type FunctionalCompletenessSeverity, HOOK_BODY_WRITE_EXCLUSIONS, HOOK_BODY_WRITE_PATTERNS, HOOK_BODY_WRITE_PATTERN_IDS, HOOK_BODY_WRITE_UNKNOWN_FIELD, HOOK_BODY_WRITE_UNPROVISIONED_ANCHOR, type HookBodyWriteFinding, type HookBodyWritePattern, type HookBodyWriteSeverity, type JsxPageFinding, type JsxPageSeverity, LIST_VIEW_FILTERS_IN_VIEWS_MODE, LIVENESS_DEAD_PROPERTY, LIVENESS_EXPERIMENTAL_PROPERTY, type LintIssue, type ListViewModeFinding, type ListViewModeSeverity, type LivenessLintFinding, type LocatedLintIssue, MANAGED_API_METHOD_UNAFFORDABLE, MAX_SCHEMA_WALK_DEPTH, MEASURE_AGGREGATE_INCOHERENT, type ManagedApiMethodFinding, NAV_OBJECT_UNGRANTED, NAV_OBJECT_UNSERVABLE, NAV_TARGET_UNRESOLVED, NULL_GUARD_HINT, type NavAccessFinding, type NavAccessSeverity, type NavObjectServabilityFinding, type NavTargetRefFinding, type NavTargetRefSeverity, type NullGuardFinding, type NullGuardOptions, OBJECT_REFERENCE_UNKNOWN, OBJECT_REFERENCE_UNREGISTERED_PLATFORM, OPEN_VOCABULARY_PROBES, ORG_AXIS_CROSS_ORG_BU_GRANT, ORG_AXIS_PERMISSION_INHERITANCE, type ObjectRefFinding, type ObjectRefSeverity, type OrgAxisFinding, type OrgAxisSeverity, PAGE_FIELD_UNKNOWN, PAGE_FIELD_UNPROVISIONED, PAGE_SOURCE_CLASSNAME, PREDICATE_PATH_UNRESOLVED, PREDICATE_PATH_UNROOTED, PREDICATE_RHS_PATH_SHAPED, PRE_SEAL_PHASES, type PageFieldFinding, type PageFieldSeverity, type PredicatePathFinding, type PredicatePathOptions, type PredicatePathSeverity, type PresetComparandFinding, type PresetComparandSeverity, REACT_BLOCK_NEEDS_RECORD_CONTEXT, REACT_CHART_AGGREGATE_INVALID, REACT_CHART_AXIS_UNKNOWN, REACT_CHART_DRILLDOWN_INVALID, REACT_CHART_FIELD_UNKNOWN, REACT_CHART_FIELD_UNPROVISIONED, REFERENCE_INTEGRITY_RULES, RLS_PREDICATE_OVER_BUDGET, RLS_PREDICATE_UNENFORCEABLE, RLS_PREDICATE_UNPARSEABLE, RUNTIME_AJV_OPTIONS, type ReactPageFinding, type ReactPageSeverity, type ReactPropFinding, type ReactPropSeverity, type ReadonlyFlowWriteFinding, type ReadonlyFlowWriteSeverity, type RecordTitleFinding, type RecordTitleSeverity, type ReferenceIntegrityFinding, type ReferenceIntegrityRule, type ReferenceIntegritySeverity, type RlsPredicateFinding, type RlsPredicateSeverity, type RuleCompilabilityFinding, type RuleCompilabilitySeverity, type RuleSchemaFormatFinding, type RuleSchemaFormatSeverity, SEAL_MARKERS, SEARCHABLE_FIELD_UNKNOWN, SEARCHABLE_FIELD_UNPROVISIONED, SEARCHABLE_FIELD_UNSEARCHABLE, SECURITY_ANCHOR_HIGH_PRIVILEGE, SECURITY_BOOK_AUDIENCE_UNKNOWN_SET, SECURITY_CBP_NO_RELATION, SECURITY_DELEGATION_MISSING_REASON, SECURITY_EXTERNAL_WIDER, SECURITY_FLS_UNQUALIFIED_KEY, SECURITY_GRANT_EXPIRED_AT_AUTHORING, SECURITY_MASTER_DETAIL_UNGRANTED, SECURITY_OWD_ALIAS, SECURITY_OWD_UNSET, SECURITY_PRIVATE_NO_READSCOPE, SECURITY_ROLE_WORD, SECURITY_WILDCARD_VAMA, SEED_INSERT_MODE_DUPLICATES_ON_REPLAY, SEED_VALUE_OUTSIDE_STATE_MACHINE, SEMANTIC_ROLE_FIELD_UNKNOWN, SEMANTIC_ROLE_FIELD_UNPROVISIONED, SHARING_RULE_OBJECT_CONTROLLED_BY_PARENT, SHARING_RULE_OBJECT_NOT_SHAREABLE, SHARING_RULE_RUNTIME_VARIABLE_CONDITION, SHARING_RULE_UNLOWERABLE_CONDITION, SORT_FIELD_UNKNOWN, SORT_FIELD_UNSORTABLE, STARTUP_OPEN_VOCABULARY_VERDICT, STARTUP_VERDICT_ASSERTIVE_WORDING, STARTUP_VERDICT_HINT, STYLE_CLASSNAME_TAILWIND, STYLE_NODE_MISSING_ID, STYLE_RESPONSIVE_NO_BASE, STYLE_UNKNOWN_CSS_PROPERTY, STYLE_UNKNOWN_TOKEN, type SearchableFieldFinding, type SearchableFieldRole, type SearchableFieldSeverity, type SecurityFinding, type SecuritySeverity, type SeedReplaySafetyFinding, type SeedReplaySafetySeverity, type SeedStateMachineFinding, type SeedStateMachineSeverity, type SemanticRoleFinding, type SemanticRoleSeverity, type Severity, type SharingRuleEnforceabilityFinding, type SharingRuleEnforceabilitySeverity, type SortableFieldFinding, type SortableFieldSeverity, type SourceStyleFinding, type SourceStyleSeverity, type StartupRegistryVerdictFinding, type StartupRegistryVerdictOptions, type StartupRegistryVerdictSeverity, type StyleFinding, type StyleSeverity, TABLE_COUNT_ONLY, TITLE_FORMAT_RETIRED, TITLE_UNRESOLVABLE, TRANSLATION_OPTION_KEY_UNKNOWN, TRANSLATION_SECTION_NAME_MISSING, TRANSLATION_TARGET_UNKNOWN, type TranslatableSectionFinding, type TranslatableSectionSeverity, type TranslationRefFinding, type TranslationRefSeverity, UNIQUE_DOUBLE_DECLARATION, UNIQUE_LEGACY_ORGANIZATION_COMPOSITE, UNIQUE_UNSCOPED_DECLARED_INDEX, VALIDATION_RULE_REGEX_UNCOMPILABLE, VALIDATION_RULE_SCHEMA_UNCOMPILABLE, VALIDATION_RULE_SCHEMA_UNKNOWN_FORMAT, VIEW_CONTAINER_SHAPE, VIEW_KEY_COLLISION, VIEW_REF_FORM_TARGET_KIND, VIEW_REF_FORM_TARGET_MISSING, VISIBILITY_BARE_IDENTIFIER, VISIBILITY_PREDICATE_OVER_BUDGET, VISIBILITY_PREDICATE_SYNTAX, VISIBILITY_ROOT_MISLAYERED, type ViewContainerFinding, type ViewContainerSeverity, type ViewRefFinding, type VisibilityFinding, type VisibilityLayer, type VisibilityOptions, type VisibilitySeverity, WIDGET_DATASET_UNKNOWN, WIDGET_DIMENSION_UNKNOWN, WIDGET_LEGACY_ANALYTICS_SHAPE, WIDGET_LEGACY_ANALYTICS_UNRENDERABLE, WIDGET_MEASURE_UNKNOWN, type WalkedComponent, type WalkedValidationRule, type WidgetBindingFinding, type WidgetBindingSeverity, buildAccessMatrix, checkSortDeclaration, diffAccessMatrix, extractHookBodyWriteSet, extractHookBodyWrites, findStartupRegistryVerdicts, findUnguardedNullableOperands, isSourceAuthoredPage, lintAutonumberFormats, lintDataModel, lintFlowPatterns, lintLegacyOrganizationComposites, lintLivenessProperties, lintUniqueDeclarations, lintUnscopedDeclaredIndexes, lintViewRefs, nearestRegisteredFormat, nullGuardMessage, validateActionBodyWrites, validateActionLocations, validateActionNameRefs, validateAiAgentAuthoring, validateAiSurfaceAffinity, validateAiToolReferences, validateApprovalApprovers, validateCapabilityReferences, validateChartBindings, validateComponentProps, validateDashboardActionRefs, validateEmptyCombinators, validateFilterTokens, validateFlowNodeWrites, validateFlowTemplatePaths, validateFlowTriggerReadiness, validateFormLayout, validateFunctionalCompleteness, validateHookBodyWrites, validateJsxPages, validateListViewMode, validateManagedApiMethods, validateNavAccess, validateNavObjectServability, validateNavTargetRefs, validateObjectReferences, validateOrgAxisRedLines, validatePageFieldBindings, validatePageSourceStyling, validatePredicatePathRefs, validatePresetComparands, validateReactPageProps, validateReactPages, validateReadonlyFlowWrites, validateRecordTitle, validateReferenceIntegrity, validateResponsiveStyles, validateRlsPredicateEnforceability, validateRuleCompilability, validateRuleSchemaFormats, validateSearchableFields, validateSecurityPosture, validateSecurityRoleWord, validateSeedReplaySafety, validateSeedStateMachine, validateSemanticRoles, validateSharingRuleEnforceability, validateSortableFields, validateStackExpressions, validateTranslatableSections, validateTranslationReferences, validateViewContainers, validateVisibilityPredicates, validateWidgetBindings, walkPageComponents };
|