@objectstack/lint 17.0.0 → 17.2.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 +851 -0
- package/dist/index.cjs +1126 -320
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +520 -72
- package/dist/index.d.ts +520 -72
- package/dist/index.js +1096 -305
- package/dist/index.js.map +1 -1
- package/dist/{runtime-H-nDodRy.d.cts → runtime-cV-l_vtC.d.cts} +109 -3
- package/dist/{runtime-H-nDodRy.d.ts → runtime-cV-l_vtC.d.ts} +109 -3
- package/dist/runtime.cjs +1188 -433
- 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 +1161 -402
- package/dist/runtime.js.map +1 -1
- package/package.json +7 -6
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { Manifest } from '@objectstack/sdui-parser';
|
|
2
|
+
import ts from 'typescript';
|
|
3
|
+
import { SearchFieldMeta } from '@objectstack/spec/data';
|
|
2
4
|
import { Options } from 'ajv';
|
|
3
5
|
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
|
|
6
|
+
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-cV-l_vtC.js';
|
|
5
7
|
|
|
6
8
|
/**
|
|
7
9
|
* Build-time dashboard widget binding diagnostics (issues #1719, #1721).
|
|
@@ -107,7 +109,7 @@ interface WidgetBindingFinding {
|
|
|
107
109
|
/** How to fix (or deliberately suppress) it. */
|
|
108
110
|
hint: string;
|
|
109
111
|
}
|
|
110
|
-
type AnyRec$
|
|
112
|
+
type AnyRec$G = Record<string, unknown>;
|
|
111
113
|
/**
|
|
112
114
|
* Validate every dashboard widget's dataset binding. Returns the list of
|
|
113
115
|
* findings (empty = clean). Caller decides how to surface them: `error`
|
|
@@ -115,7 +117,7 @@ type AnyRec$F = Record<string, unknown>;
|
|
|
115
117
|
* should fail validate/build; `warning` findings are advisory and must
|
|
116
118
|
* never fail the build on their own.
|
|
117
119
|
*/
|
|
118
|
-
declare function validateWidgetBindings(stack: AnyRec$
|
|
120
|
+
declare function validateWidgetBindings(stack: AnyRec$G): WidgetBindingFinding[];
|
|
119
121
|
|
|
120
122
|
interface ExprIssue {
|
|
121
123
|
where: string;
|
|
@@ -128,12 +130,12 @@ interface ExprIssue {
|
|
|
128
130
|
*/
|
|
129
131
|
severity?: 'error' | 'warning';
|
|
130
132
|
}
|
|
131
|
-
type AnyRec$
|
|
133
|
+
type AnyRec$F = Record<string, unknown>;
|
|
132
134
|
/**
|
|
133
135
|
* Validate every predicate in the stack. Returns the list of issues (empty =
|
|
134
136
|
* clean). Caller decides how to surface / whether to fail the build.
|
|
135
137
|
*/
|
|
136
|
-
declare function validateStackExpressions(stack: AnyRec$
|
|
138
|
+
declare function validateStackExpressions(stack: AnyRec$F): ExprIssue[];
|
|
137
139
|
|
|
138
140
|
/**
|
|
139
141
|
* The corrective sentence, lifted **verbatim** from `unevaluableRuleError` in
|
|
@@ -224,6 +226,16 @@ declare const STARTUP_OPEN_VOCABULARY_VERDICT = "startup-open-vocabulary-verdict
|
|
|
224
226
|
* {@link STARTUP_OPEN_VOCABULARY_VERDICT} already fired.
|
|
225
227
|
*/
|
|
226
228
|
declare const STARTUP_VERDICT_ASSERTIVE_WORDING = "startup-verdict-assertive-wording";
|
|
229
|
+
/**
|
|
230
|
+
* The source could not be parsed, so this rule's verdict about it covers only
|
|
231
|
+
* what error recovery left standing (#10653).
|
|
232
|
+
*
|
|
233
|
+
* This rule's own subject matter, turned on the rule: a terminal conclusion
|
|
234
|
+
* drawn about a world that had not finished forming. "No findings" about a
|
|
235
|
+
* source the parser could not read is exactly that, and it is what this module
|
|
236
|
+
* used to return — silently, with a `catch` above it that never ran.
|
|
237
|
+
*/
|
|
238
|
+
declare const STARTUP_SOURCE_UNPARSEABLE = "startup-source-unparseable";
|
|
227
239
|
/**
|
|
228
240
|
* Accessors that read a capability vocabulary a plugin can still extend.
|
|
229
241
|
*
|
|
@@ -297,8 +309,10 @@ interface StartupRegistryVerdictOptions {
|
|
|
297
309
|
* Find startup open-vocabulary verdicts in one TypeScript/JavaScript source.
|
|
298
310
|
*
|
|
299
311
|
* Pure: parses, never executes, never type-checks, touches no filesystem. An
|
|
300
|
-
* unparseable source
|
|
301
|
-
* source someone else owns,
|
|
312
|
+
* unparseable source is REPORTED ({@link STARTUP_SOURCE_UNPARSEABLE}) rather
|
|
313
|
+
* than thrown on — this advises on source someone else owns, so refusing to
|
|
314
|
+
* parse is not a verdict about them, but going silent about it was a verdict
|
|
315
|
+
* too, and the wrong one (#10653).
|
|
302
316
|
*/
|
|
303
317
|
declare function findStartupRegistryVerdicts(source: string, options?: StartupRegistryVerdictOptions): StartupRegistryVerdictFinding[];
|
|
304
318
|
|
|
@@ -314,7 +328,7 @@ interface ListViewModeFinding {
|
|
|
314
328
|
hint: string;
|
|
315
329
|
}
|
|
316
330
|
declare const LIST_VIEW_FILTERS_IN_VIEWS_MODE = "list-view-filters-in-views-mode";
|
|
317
|
-
type AnyRec$
|
|
331
|
+
type AnyRec$E = Record<string, unknown>;
|
|
318
332
|
/**
|
|
319
333
|
* Flag ADR-0047 "views" mode violations on an object's built-in named views or a
|
|
320
334
|
* `defineView` default `list` / named `listViews`: `quickFilters`, or a `tabs`
|
|
@@ -324,7 +338,7 @@ type AnyRec$D = Record<string, unknown>;
|
|
|
324
338
|
*
|
|
325
339
|
* Feed the PRE-parse stack (normalizeStackInput output) — see file header.
|
|
326
340
|
*/
|
|
327
|
-
declare function validateListViewMode(stack: AnyRec$
|
|
341
|
+
declare function validateListViewMode(stack: AnyRec$E): ListViewModeFinding[];
|
|
328
342
|
|
|
329
343
|
type FunctionalCompletenessSeverity = 'error' | 'warning';
|
|
330
344
|
interface FunctionalCompletenessFinding {
|
|
@@ -439,7 +453,7 @@ declare const FLOW_TIME_RELATIVE_DESCRIPTOR_UNROUTABLE = "flow-time-relative-des
|
|
|
439
453
|
* call sites that each skip it.
|
|
440
454
|
*/
|
|
441
455
|
declare const FLOW_TRIGGER_UNROUTABLE = "flow-trigger-unroutable";
|
|
442
|
-
type AnyRec$
|
|
456
|
+
type AnyRec$D = Record<string, unknown>;
|
|
443
457
|
/**
|
|
444
458
|
* Validate auto-launched flow trigger wiring against the stack definition.
|
|
445
459
|
*
|
|
@@ -448,7 +462,7 @@ type AnyRec$C = Record<string, unknown>;
|
|
|
448
462
|
* owns the `timeRelative` descriptor's contract, which is the point: the rule
|
|
449
463
|
* ASKS that schema rather than restating it.
|
|
450
464
|
*/
|
|
451
|
-
declare function validateFlowTriggerReadiness(stack: AnyRec$
|
|
465
|
+
declare function validateFlowTriggerReadiness(stack: AnyRec$D): FlowTriggerReadinessFinding[];
|
|
452
466
|
|
|
453
467
|
type FlowTemplatePathSeverity = 'error' | 'warning';
|
|
454
468
|
interface FlowTemplatePathFinding {
|
|
@@ -464,12 +478,12 @@ interface FlowTemplatePathFinding {
|
|
|
464
478
|
declare const FLOW_TEMPLATE_UNKNOWN_FIELD = "flow-template-unknown-field";
|
|
465
479
|
declare const FLOW_TEMPLATE_LOOKUP_TRAVERSAL = "flow-template-lookup-traversal";
|
|
466
480
|
declare const FLOW_TEMPLATE_FIELD_UNPROVISIONED = "flow-template-field-unprovisioned";
|
|
467
|
-
type AnyRec$
|
|
481
|
+
type AnyRec$C = Record<string, unknown>;
|
|
468
482
|
/**
|
|
469
483
|
* Validate `{record.<path>}` template references across every record-change
|
|
470
484
|
* flow. Pure and dependency-free; safe on pre- or post-parse stacks.
|
|
471
485
|
*/
|
|
472
|
-
declare function validateFlowTemplatePaths(stack: AnyRec$
|
|
486
|
+
declare function validateFlowTemplatePaths(stack: AnyRec$C): FlowTemplatePathFinding[];
|
|
473
487
|
|
|
474
488
|
type ReadonlyFlowWriteSeverity = 'error' | 'warning';
|
|
475
489
|
interface ReadonlyFlowWriteFinding {
|
|
@@ -484,12 +498,12 @@ interface ReadonlyFlowWriteFinding {
|
|
|
484
498
|
}
|
|
485
499
|
declare const FLOW_UPDATE_READONLY_FIELD = "flow-update-readonly-field";
|
|
486
500
|
declare const FLOW_UPDATE_READONLY_WHEN_FIELD = "flow-update-readonly-when-field";
|
|
487
|
-
type AnyRec$
|
|
501
|
+
type AnyRec$B = Record<string, unknown>;
|
|
488
502
|
/**
|
|
489
503
|
* Validate flow `update_record` writes against target-object readonly
|
|
490
504
|
* declarations. Pure and dependency-free; safe on pre- or post-parse stacks.
|
|
491
505
|
*/
|
|
492
|
-
declare function validateReadonlyFlowWrites(stack: AnyRec$
|
|
506
|
+
declare function validateReadonlyFlowWrites(stack: AnyRec$B): ReadonlyFlowWriteFinding[];
|
|
493
507
|
|
|
494
508
|
type ViewContainerSeverity = 'error' | 'warning';
|
|
495
509
|
interface ViewContainerFinding {
|
|
@@ -526,14 +540,14 @@ declare const STYLE_CLASSNAME_TAILWIND = "style-classname-tailwind";
|
|
|
526
540
|
declare const STYLE_RESPONSIVE_NO_BASE = "style-responsive-no-base";
|
|
527
541
|
declare const STYLE_UNKNOWN_CSS_PROPERTY = "style-unknown-css-property";
|
|
528
542
|
declare const STYLE_UNKNOWN_TOKEN = "style-unknown-token";
|
|
529
|
-
type AnyRec$
|
|
543
|
+
type AnyRec$A = Record<string, unknown>;
|
|
530
544
|
/**
|
|
531
545
|
* Validate every page's component tree for SDUI styling correctness (ADR-0065).
|
|
532
546
|
* Returns findings (empty = clean). `error` findings describe styles that are
|
|
533
547
|
* silently dropped and should fail validate/build; `warning` findings are
|
|
534
548
|
* advisory (typos, drift, footguns).
|
|
535
549
|
*/
|
|
536
|
-
declare function validateResponsiveStyles(stack: AnyRec$
|
|
550
|
+
declare function validateResponsiveStyles(stack: AnyRec$A): StyleFinding[];
|
|
537
551
|
|
|
538
552
|
type JsxPageSeverity = 'error' | 'warning';
|
|
539
553
|
interface JsxPageFinding {
|
|
@@ -546,8 +560,8 @@ interface JsxPageFinding {
|
|
|
546
560
|
message: string;
|
|
547
561
|
hint: string;
|
|
548
562
|
}
|
|
549
|
-
type AnyRec$
|
|
550
|
-
declare function validateJsxPages(stack: AnyRec$
|
|
563
|
+
type AnyRec$z = Record<string, unknown>;
|
|
564
|
+
declare function validateJsxPages(stack: AnyRec$z, opts?: {
|
|
551
565
|
manifest?: Manifest;
|
|
552
566
|
}): JsxPageFinding[];
|
|
553
567
|
|
|
@@ -560,8 +574,8 @@ interface ReactPageFinding {
|
|
|
560
574
|
message: string;
|
|
561
575
|
hint: string;
|
|
562
576
|
}
|
|
563
|
-
type AnyRec$
|
|
564
|
-
declare function validateReactPages(stack: AnyRec$
|
|
577
|
+
type AnyRec$y = Record<string, unknown>;
|
|
578
|
+
declare function validateReactPages(stack: AnyRec$y): ReactPageFinding[];
|
|
565
579
|
|
|
566
580
|
type ReactPropSeverity = 'error' | 'warning';
|
|
567
581
|
interface ReactPropFinding {
|
|
@@ -572,14 +586,83 @@ interface ReactPropFinding {
|
|
|
572
586
|
message: string;
|
|
573
587
|
hint: string;
|
|
574
588
|
}
|
|
575
|
-
type AnyRec$
|
|
589
|
+
type AnyRec$x = Record<string, unknown>;
|
|
590
|
+
/**
|
|
591
|
+
* The source could not be parsed, so the prop checks below read a partially
|
|
592
|
+
* recovered tree (#10653).
|
|
593
|
+
*
|
|
594
|
+
* Severity is `warning`, not `error`, and the reason is measured rather than
|
|
595
|
+
* cautious. The syntax VERDICT on a react page belongs to `validate-react-
|
|
596
|
+
* pages.ts`, which transpiles the same source through **Sucrase** — the parser
|
|
597
|
+
* family that actually compiles a react page — and errors when it refuses. This
|
|
598
|
+
* rule speaks for a different parser, and the two acceptance sets are not the
|
|
599
|
+
* same set: measured on 2026-08-21 (TypeScript 6.0.3 / sucrase 3.35.x), a react
|
|
600
|
+
* source containing `0755`, `'\012'`, `0b2` or `1__0` parses CLEAN through
|
|
601
|
+
* Sucrase while TypeScript reports a parse diagnostic, and `with (o) {}` goes
|
|
602
|
+
* the other way. Erroring here would newly fail builds the platform's own
|
|
603
|
+
* transpiler accepts; going silent is the defect this rule closes. A warning
|
|
604
|
+
* says the true thing: these checks did not get to run.
|
|
605
|
+
*/
|
|
606
|
+
declare const REACT_PAGE_SOURCE_UNPARSEABLE = "react-page-source-unparseable";
|
|
576
607
|
declare const REACT_CHART_FIELD_UNKNOWN = "react-chart-field-unknown";
|
|
577
608
|
declare const REACT_CHART_FIELD_UNPROVISIONED = "react-chart-field-unprovisioned";
|
|
578
609
|
declare const REACT_CHART_AGGREGATE_INVALID = "react-chart-aggregate-invalid";
|
|
579
610
|
declare const REACT_CHART_AXIS_UNKNOWN = "react-chart-axis-unknown";
|
|
580
611
|
declare const REACT_CHART_DRILLDOWN_INVALID = "react-chart-drilldown-invalid";
|
|
581
612
|
declare const REACT_BLOCK_NEEDS_RECORD_CONTEXT = "react-block-needs-record-context";
|
|
582
|
-
declare function validateReactPageProps(stack: AnyRec$
|
|
613
|
+
declare function validateReactPageProps(stack: AnyRec$x): ReactPropFinding[];
|
|
614
|
+
|
|
615
|
+
/** What a caller needs to tell an author WHICH source went unread, and where. */
|
|
616
|
+
interface SourceParseFailure {
|
|
617
|
+
/** The first parse diagnostic, in the compiler's own wording, flattened to one line. */
|
|
618
|
+
message: string;
|
|
619
|
+
/** 1-based line, in the AUTHORED source's coordinates (see `synthesizedLinesBefore`). */
|
|
620
|
+
line: number;
|
|
621
|
+
/** 1-based column. */
|
|
622
|
+
column: number;
|
|
623
|
+
/** How many parse diagnostics in total — `message` is the first of `count`. */
|
|
624
|
+
count: number;
|
|
625
|
+
}
|
|
626
|
+
/** A parse plus the verdict on whether it succeeded. `failure` absent ⇒ it parsed. */
|
|
627
|
+
interface CheckedParse {
|
|
628
|
+
/**
|
|
629
|
+
* The tree, ALWAYS returned — including when `failure` is set. Error recovery
|
|
630
|
+
* produces a partial tree, and a caller that already reports findings from it
|
|
631
|
+
* keeps doing so: the fix here is the missing SIGNAL, not the removal of
|
|
632
|
+
* whatever the recovered tree could still be read for.
|
|
633
|
+
*/
|
|
634
|
+
sourceFile: ts.SourceFile;
|
|
635
|
+
/** Set when the parser reported at least one syntax diagnostic. */
|
|
636
|
+
failure?: SourceParseFailure;
|
|
637
|
+
}
|
|
638
|
+
interface CheckedParseOptions {
|
|
639
|
+
target: ts.ScriptTarget;
|
|
640
|
+
setParentNodes: boolean;
|
|
641
|
+
scriptKind: ts.ScriptKind;
|
|
642
|
+
/**
|
|
643
|
+
* Lines the CALLER synthesised ahead of the authored source, subtracted from
|
|
644
|
+
* the reported position so it lands in the author's coordinates.
|
|
645
|
+
*
|
|
646
|
+
* `validate-hook-body-writes.ts` parses an L2 hook body wrapped in
|
|
647
|
+
* `async function __body(ctx) {\n…\n}` — the shape the runtime compiles it
|
|
648
|
+
* into — so its diagnostics are one line low. The reported line is clamped to
|
|
649
|
+
* at least 1, so a diagnostic that lands on a synthesised line is attributed
|
|
650
|
+
* to the nearest AUTHORED line and never to a line the author did not write.
|
|
651
|
+
*/
|
|
652
|
+
synthesizedLinesBefore?: number;
|
|
653
|
+
}
|
|
654
|
+
/**
|
|
655
|
+
* The one wording every caller's message embeds, so three findings about the
|
|
656
|
+
* same defect do not describe it three ways.
|
|
657
|
+
*/
|
|
658
|
+
declare function describeParseFailure(failure: SourceParseFailure): string;
|
|
659
|
+
/**
|
|
660
|
+
* The hint every caller's finding carries. It says what the finding IS — a
|
|
661
|
+
* statement about what the checker could read, not a second syntax verdict —
|
|
662
|
+
* because a source that does not parse is not scored, and an author who reads
|
|
663
|
+
* "no problems found" about it would be reading a green line that lied.
|
|
664
|
+
*/
|
|
665
|
+
declare const PARSE_FAILURE_HINT: string;
|
|
583
666
|
|
|
584
667
|
type SourceStyleSeverity = 'error' | 'warning';
|
|
585
668
|
interface SourceStyleFinding {
|
|
@@ -591,8 +674,8 @@ interface SourceStyleFinding {
|
|
|
591
674
|
hint: string;
|
|
592
675
|
}
|
|
593
676
|
declare const PAGE_SOURCE_CLASSNAME = "page-source-className-tailwind";
|
|
594
|
-
type AnyRec$
|
|
595
|
-
declare function validatePageSourceStyling(stack: AnyRec$
|
|
677
|
+
type AnyRec$w = Record<string, unknown>;
|
|
678
|
+
declare function validatePageSourceStyling(stack: AnyRec$w): SourceStyleFinding[];
|
|
596
679
|
|
|
597
680
|
/**
|
|
598
681
|
* Build-time record-title diagnostics (ADR-0079).
|
|
@@ -636,14 +719,14 @@ interface RecordTitleFinding {
|
|
|
636
719
|
/** How to fix it. */
|
|
637
720
|
hint: string;
|
|
638
721
|
}
|
|
639
|
-
type AnyRec$
|
|
722
|
+
type AnyRec$v = Record<string, unknown>;
|
|
640
723
|
/**
|
|
641
724
|
* Validate every object's record-title declaration. Returns the list of
|
|
642
725
|
* findings (empty = clean). Both rules are advisory (`warning`): the caller
|
|
643
726
|
* must never fail the build on them alone — auto-provision + the `Record #<id>`
|
|
644
727
|
* floor guarantee a resolvable title at runtime.
|
|
645
728
|
*/
|
|
646
|
-
declare function validateRecordTitle(stack: AnyRec$
|
|
729
|
+
declare function validateRecordTitle(stack: AnyRec$v): RecordTitleFinding[];
|
|
647
730
|
|
|
648
731
|
declare const FIELD_GROUP_UNDECLARED = "field-group-undeclared";
|
|
649
732
|
declare const FIELD_GROUP_EMPTY = "field-group-empty";
|
|
@@ -665,13 +748,13 @@ interface SemanticRoleFinding {
|
|
|
665
748
|
/** How to fix it. */
|
|
666
749
|
hint: string;
|
|
667
750
|
}
|
|
668
|
-
type AnyRec$
|
|
751
|
+
type AnyRec$u = Record<string, unknown>;
|
|
669
752
|
/**
|
|
670
753
|
* Validate every object's semantic-role pointers. Returns the list of
|
|
671
754
|
* findings (empty = clean). Advisory only — the caller must never fail the
|
|
672
755
|
* build on these alone.
|
|
673
756
|
*/
|
|
674
|
-
declare function validateSemanticRoles(stack: AnyRec$
|
|
757
|
+
declare function validateSemanticRoles(stack: AnyRec$u): SemanticRoleFinding[];
|
|
675
758
|
|
|
676
759
|
declare const FORM_FIELD_UNKNOWN = "form-field-unknown";
|
|
677
760
|
declare const FORM_COLSPAN_ABSOLUTE = "absolute-colspan-discouraged";
|
|
@@ -690,12 +773,12 @@ interface FormLayoutFinding {
|
|
|
690
773
|
/** How to fix it. */
|
|
691
774
|
hint: string;
|
|
692
775
|
}
|
|
693
|
-
type AnyRec$
|
|
776
|
+
type AnyRec$t = Record<string, unknown>;
|
|
694
777
|
/**
|
|
695
778
|
* Validate authored form-view layout. Returns findings (empty = clean).
|
|
696
779
|
* Advisory only — the caller must never fail the build on these alone.
|
|
697
780
|
*/
|
|
698
|
-
declare function validateFormLayout(stack: AnyRec$
|
|
781
|
+
declare function validateFormLayout(stack: AnyRec$t): FormLayoutFinding[];
|
|
699
782
|
|
|
700
783
|
declare const VISIBILITY_ROOT_MISLAYERED = "visibility-root-mislayered";
|
|
701
784
|
declare const VISIBILITY_BARE_IDENTIFIER = "visibility-bare-identifier";
|
|
@@ -751,7 +834,7 @@ interface VisibilityFinding {
|
|
|
751
834
|
/** How to fix it. */
|
|
752
835
|
hint: string;
|
|
753
836
|
}
|
|
754
|
-
type AnyRec$
|
|
837
|
+
type AnyRec$s = Record<string, unknown>;
|
|
755
838
|
/**
|
|
756
839
|
* Validate conditional-visibility predicates across authored views and pages.
|
|
757
840
|
*
|
|
@@ -776,7 +859,7 @@ type AnyRec$r = Record<string, unknown>;
|
|
|
776
859
|
* bare-identifier checks are layer-agnostic — but the ROOT their hints prescribe
|
|
777
860
|
* is not, which is the second half of what #7815 fixes.
|
|
778
861
|
*/
|
|
779
|
-
declare function validateVisibilityPredicates(stack: AnyRec$
|
|
862
|
+
declare function validateVisibilityPredicates(stack: AnyRec$s, opts?: VisibilityOptions): VisibilityFinding[];
|
|
780
863
|
|
|
781
864
|
declare const PREDICATE_PATH_UNRESOLVED = "predicate-path-unresolved";
|
|
782
865
|
declare const PREDICATE_PATH_UNROOTED = "predicate-path-unrooted";
|
|
@@ -819,7 +902,7 @@ interface PredicatePathOptions {
|
|
|
819
902
|
*/
|
|
820
903
|
resolveSchema?: (schemaId: string) => unknown;
|
|
821
904
|
}
|
|
822
|
-
type AnyRec$
|
|
905
|
+
type AnyRec$r = Record<string, unknown>;
|
|
823
906
|
/**
|
|
824
907
|
* Refuse a metadata-form predicate that names a path the target schema does not
|
|
825
908
|
* declare (#7010).
|
|
@@ -848,7 +931,7 @@ type AnyRec$q = Record<string, unknown>;
|
|
|
848
931
|
*
|
|
849
932
|
* Returns findings (empty = clean).
|
|
850
933
|
*/
|
|
851
|
-
declare function validatePredicatePathRefs(stack: AnyRec$
|
|
934
|
+
declare function validatePredicatePathRefs(stack: AnyRec$r, opts?: PredicatePathOptions): PredicatePathFinding[];
|
|
852
935
|
|
|
853
936
|
declare const CAPABILITY_REFERENCE_UNKNOWN = "capability-reference-unknown";
|
|
854
937
|
type CapabilityRefSeverity = 'error' | 'warning';
|
|
@@ -866,12 +949,12 @@ interface CapabilityRefFinding {
|
|
|
866
949
|
/** How to fix it. */
|
|
867
950
|
hint: string;
|
|
868
951
|
}
|
|
869
|
-
type AnyRec$
|
|
952
|
+
type AnyRec$q = Record<string, unknown>;
|
|
870
953
|
/**
|
|
871
954
|
* Validate every capability reference in a stack. Returns findings (empty =
|
|
872
955
|
* clean). Advisory only — callers must not fail the build on these alone.
|
|
873
956
|
*/
|
|
874
|
-
declare function validateCapabilityReferences(stack: AnyRec$
|
|
957
|
+
declare function validateCapabilityReferences(stack: AnyRec$q): CapabilityRefFinding[];
|
|
875
958
|
|
|
876
959
|
declare const APPROVAL_APPROVER_NOT_MEMBERSHIP_TIER = "approval-approver-not-membership-tier";
|
|
877
960
|
declare const APPROVAL_APPROVER_TYPE_DEPRECATED = "approval-approver-type-deprecated";
|
|
@@ -897,12 +980,12 @@ interface ApprovalApproverFinding {
|
|
|
897
980
|
/** How to fix it. */
|
|
898
981
|
hint: string;
|
|
899
982
|
}
|
|
900
|
-
type AnyRec$
|
|
983
|
+
type AnyRec$p = Record<string, unknown>;
|
|
901
984
|
/**
|
|
902
985
|
* Validate the approvers of every Approval node in the stack's flows.
|
|
903
986
|
* Returns findings (empty = clean).
|
|
904
987
|
*/
|
|
905
|
-
declare function validateApprovalApprovers(stack: AnyRec$
|
|
988
|
+
declare function validateApprovalApprovers(stack: AnyRec$p): ApprovalApproverFinding[];
|
|
906
989
|
|
|
907
990
|
type SeedReplaySafetySeverity = 'error' | 'warning';
|
|
908
991
|
interface SeedReplaySafetyFinding {
|
|
@@ -916,7 +999,7 @@ interface SeedReplaySafetyFinding {
|
|
|
916
999
|
hint: string;
|
|
917
1000
|
}
|
|
918
1001
|
declare const SEED_INSERT_MODE_DUPLICATES_ON_REPLAY = "seed-insert-mode-duplicates-on-replay";
|
|
919
|
-
type AnyRec$
|
|
1002
|
+
type AnyRec$o = Record<string, unknown>;
|
|
920
1003
|
/**
|
|
921
1004
|
* Flag every seed dataset declared with `mode: 'insert'` — the one non-idempotent
|
|
922
1005
|
* mode, which duplicates its rows on every replay boot (framework#3434). Returns
|
|
@@ -926,7 +1009,7 @@ type AnyRec$n = Record<string, unknown>;
|
|
|
926
1009
|
* Reads `stack.data` (the `SeedSchema[]` fixtures). Safe on any shape — a stack
|
|
927
1010
|
* with no `data` array yields no findings.
|
|
928
1011
|
*/
|
|
929
|
-
declare function validateSeedReplaySafety(stack: AnyRec$
|
|
1012
|
+
declare function validateSeedReplaySafety(stack: AnyRec$o): SeedReplaySafetyFinding[];
|
|
930
1013
|
|
|
931
1014
|
type SeedStateMachineSeverity = 'warning';
|
|
932
1015
|
interface SeedStateMachineFinding {
|
|
@@ -940,7 +1023,7 @@ interface SeedStateMachineFinding {
|
|
|
940
1023
|
hint: string;
|
|
941
1024
|
}
|
|
942
1025
|
declare const SEED_VALUE_OUTSIDE_STATE_MACHINE = "seed-value-outside-state-machine";
|
|
943
|
-
type AnyRec$
|
|
1026
|
+
type AnyRec$n = Record<string, unknown>;
|
|
944
1027
|
/**
|
|
945
1028
|
* Flag every seed record whose `state_machine`-governed field carries a value
|
|
946
1029
|
* the machine does not declare (framework#3433 follow-up). Returns the findings
|
|
@@ -953,7 +1036,7 @@ type AnyRec$m = Record<string, unknown>;
|
|
|
953
1036
|
* unresolved `cel` Expression envelope, a number) is skipped: it cannot be
|
|
954
1037
|
* statically compared to the declared-state set.
|
|
955
1038
|
*/
|
|
956
|
-
declare function validateSeedStateMachine(stack: AnyRec$
|
|
1039
|
+
declare function validateSeedStateMachine(stack: AnyRec$n): SeedStateMachineFinding[];
|
|
957
1040
|
|
|
958
1041
|
declare const SECURITY_OWD_UNSET = "security-owd-unset";
|
|
959
1042
|
declare const SECURITY_OWD_ALIAS = "security-owd-alias";
|
|
@@ -982,7 +1065,7 @@ interface SecurityFinding {
|
|
|
982
1065
|
/** How to fix it. */
|
|
983
1066
|
hint: string;
|
|
984
1067
|
}
|
|
985
|
-
type AnyRec$
|
|
1068
|
+
type AnyRec$m = Record<string, unknown>;
|
|
986
1069
|
/**
|
|
987
1070
|
* Validate the security posture of a stack. Returns findings (empty = clean).
|
|
988
1071
|
* `error` findings gate the build in `os compile`; `info` is advisory.
|
|
@@ -990,7 +1073,7 @@ type AnyRec$l = Record<string, unknown>;
|
|
|
990
1073
|
* `opts.nowMs` injects the clock for the ADR-0091 authoring-time expiry rule
|
|
991
1074
|
* (tests); production callers omit it.
|
|
992
1075
|
*/
|
|
993
|
-
declare function validateSecurityPosture(stack: AnyRec$
|
|
1076
|
+
declare function validateSecurityPosture(stack: AnyRec$m, opts?: {
|
|
994
1077
|
nowMs?: number;
|
|
995
1078
|
}): SecurityFinding[];
|
|
996
1079
|
/**
|
|
@@ -1021,7 +1104,7 @@ declare function validateSecurityPosture(stack: AnyRec$l, opts?: {
|
|
|
1021
1104
|
* carries `positions`/`apps` and both types are gated — at which point it
|
|
1022
1105
|
* crosses whole, in one edit, as its own entry.
|
|
1023
1106
|
*/
|
|
1024
|
-
declare function validateSecurityRoleWord(stack: AnyRec$
|
|
1107
|
+
declare function validateSecurityRoleWord(stack: AnyRec$m): SecurityFinding[];
|
|
1025
1108
|
|
|
1026
1109
|
/**
|
|
1027
1110
|
* [ADR-0105 D6] The two organization-axis red lines, enforced at authoring time.
|
|
@@ -1134,6 +1217,10 @@ declare function validateOrgAxisRedLines(stack: unknown): OrgAxisFinding[];
|
|
|
1134
1217
|
declare const SHARING_RULE_UNLOWERABLE_CONDITION = "sharing-rule-unlowerable-condition";
|
|
1135
1218
|
/** A `condition` reading `current_user.*` — unresolvable when grants are materialized. */
|
|
1136
1219
|
declare const SHARING_RULE_RUNTIME_VARIABLE_CONDITION = "sharing-rule-runtime-variable-condition";
|
|
1220
|
+
/** The anchor object's OWD is already the widest — sharing has nothing to widen. */
|
|
1221
|
+
declare const SHARING_RULE_OBJECT_NOT_SHAREABLE = "sharing-rule-object-not-shareable";
|
|
1222
|
+
/** The anchor object is a master-detail DETAIL — its shares belong to its master. */
|
|
1223
|
+
declare const SHARING_RULE_OBJECT_CONTROLLED_BY_PARENT = "sharing-rule-object-controlled-by-parent";
|
|
1137
1224
|
type SharingRuleEnforceabilitySeverity = 'error' | 'warning';
|
|
1138
1225
|
interface SharingRuleEnforceabilityFinding {
|
|
1139
1226
|
severity: SharingRuleEnforceabilitySeverity;
|
|
@@ -1149,8 +1236,9 @@ interface SharingRuleEnforceabilityFinding {
|
|
|
1149
1236
|
hint: string;
|
|
1150
1237
|
}
|
|
1151
1238
|
/**
|
|
1152
|
-
* Gate stack-declared sharing rules on the
|
|
1153
|
-
*
|
|
1239
|
+
* Gate stack-declared sharing rules on the two things their runtime consumers
|
|
1240
|
+
* do with them: lower the `condition` to a `criteria_json` filter, and write a
|
|
1241
|
+
* `sys_record_share` row on the `object` the rule is anchored to.
|
|
1154
1242
|
*
|
|
1155
1243
|
* Pure `(stack) => Finding[]`; tolerates the normalized and the parsed tier.
|
|
1156
1244
|
*/
|
|
@@ -1223,19 +1311,27 @@ declare function validateRlsPredicateEnforceability(stack: unknown): RlsPredicat
|
|
|
1223
1311
|
* in `@objectstack/spec` 17.0.0, so authoring one is a `tsc` error and a parse
|
|
1224
1312
|
* error carrying the prescription. There is no widget target left to resolve.
|
|
1225
1313
|
*
|
|
1226
|
-
* Resolution mirrors the objectui runtime dispatch (`DashboardRenderer`
|
|
1227
|
-
*
|
|
1228
|
-
* runtime:
|
|
1314
|
+
* Resolution mirrors the objectui runtime dispatch (`DashboardRenderer`
|
|
1315
|
+
* hands the target to the SHARED `useActionModal` since objectui#4782) so the
|
|
1316
|
+
* lint flags exactly what would fail to resolve at runtime:
|
|
1229
1317
|
*
|
|
1230
1318
|
* actionType 'script' → `actionUrl` must name a DEFINED action (`stack.actions`
|
|
1231
1319
|
* or any `object.actions`, by `name`). A script target that names no
|
|
1232
1320
|
* defined action fails open at runtime ("action not found"). → ERROR.
|
|
1233
1321
|
*
|
|
1234
|
-
* actionType 'modal' → `actionUrl`
|
|
1235
|
-
*
|
|
1236
|
-
*
|
|
1237
|
-
*
|
|
1238
|
-
*
|
|
1322
|
+
* actionType 'modal' → `actionUrl` names a declared PAGE (`stack.pages`), and
|
|
1323
|
+
* only a page — maintainer ruling objectstack#6739-A (2026-08-09). This
|
|
1324
|
+
* rule used to accept a defined action name, a bare object name, and the
|
|
1325
|
+
* `<verb>_<object>` convention (create_/new_/add_/edit_/update_ + object),
|
|
1326
|
+
* on the claim that it mirrored `DashboardView`'s own modal handler. That
|
|
1327
|
+
* handler — the convention's last live copy — was deleted by objectui#4782
|
|
1328
|
+
* (after objectui#4764 retired the object fallback in `useActionModal`):
|
|
1329
|
+
* the runtime resolves a string modal target against page metadata and
|
|
1330
|
+
* REFUSES everything else, so each retired limb here blessed a button that
|
|
1331
|
+
* dispatches to a named refusal at runtime. The ruling explicitly declined
|
|
1332
|
+
* the middle shape (keep the prefix, reject bare object names): a target
|
|
1333
|
+
* names the page `create_opportunity`, or it names nothing. Opening an
|
|
1334
|
+
* object's form is `actionType: 'form'`. Otherwise → ERROR.
|
|
1239
1335
|
*
|
|
1240
1336
|
* actionType 'url' → a relative in-app path. WARN when a recognizable
|
|
1241
1337
|
* `<collection>/<name>` segment (objects/reports/dashboards/pages/views)
|
|
@@ -1274,13 +1370,13 @@ interface DashboardActionRefFinding {
|
|
|
1274
1370
|
/** How to fix it. */
|
|
1275
1371
|
hint: string;
|
|
1276
1372
|
}
|
|
1277
|
-
type AnyRec$
|
|
1373
|
+
type AnyRec$l = Record<string, unknown>;
|
|
1278
1374
|
/**
|
|
1279
1375
|
* Validate every dashboard header action reference in a stack. Returns
|
|
1280
1376
|
* findings (empty = clean). `script`/`modal` dead targets are errors; `url`
|
|
1281
1377
|
* unresolved routes are warnings.
|
|
1282
1378
|
*/
|
|
1283
|
-
declare function validateDashboardActionRefs(stack: AnyRec$
|
|
1379
|
+
declare function validateDashboardActionRefs(stack: AnyRec$l): DashboardActionRefFinding[];
|
|
1284
1380
|
|
|
1285
1381
|
/**
|
|
1286
1382
|
* Build-time filter-placeholder diagnostics (issue #3574).
|
|
@@ -1364,6 +1460,85 @@ interface FilterTokenFinding {
|
|
|
1364
1460
|
*/
|
|
1365
1461
|
declare function validateFilterTokens(stack: Record<string, unknown> | undefined | null): FilterTokenFinding[];
|
|
1366
1462
|
|
|
1463
|
+
/**
|
|
1464
|
+
* Build-time refusal of a bare dashboard date-range PRESET name in an ordering
|
|
1465
|
+
* comparand (#8793 — the ruled C half of #8690).
|
|
1466
|
+
*
|
|
1467
|
+
* `last_7_days` / `last_30_days` / `last_90_days` and their ten calendar
|
|
1468
|
+
* siblings are REAL declared names (`DATE_RANGE_PRESETS`,
|
|
1469
|
+
* `@objectstack/spec/data`) — but only for the dashboard date-filter positions,
|
|
1470
|
+
* where the console lowers them to `{date-macro}` bounds before any query is
|
|
1471
|
+
* sent. Authored as a bare filter comparand, nothing resolves them. Measured
|
|
1472
|
+
* end to end on #8690 (51 rows seeded / 38 in-window):
|
|
1473
|
+
*
|
|
1474
|
+
* ```
|
|
1475
|
+
* $gte "last_30_days" HTTP 200 count=0 <- silent zero (the defect)
|
|
1476
|
+
* $gte "{30_days_ago}" HTTP 200 count=38 <- the spelling that works
|
|
1477
|
+
* ```
|
|
1478
|
+
*
|
|
1479
|
+
* The engine now refuses the bare name on a declared temporal field at QUERY
|
|
1480
|
+
* time (`INVALID_FILTER` / 400, PR #8808 — the B half). This rule is the
|
|
1481
|
+
* AUTHORING-time half the ruling shipped alongside it: the error reaches the
|
|
1482
|
+
* author — an AI author in particular, whose correction loop only sees what
|
|
1483
|
+
* can fail the build or the publish — instead of the first viewer of an empty
|
|
1484
|
+
* chart. The same refusal exists in the schema door
|
|
1485
|
+
* (`data/filter.zod.ts`, Mongo-shape carriers only); this rule additionally
|
|
1486
|
+
* reaches the shapes no `FilterConditionSchema` parse touches — view filter
|
|
1487
|
+
* rules (`{ field, operator, value }`) and filter-array triples
|
|
1488
|
+
* (`['created_at', '>=', …]`) — and reports with the located `where` / `path`
|
|
1489
|
+
* the CLI commands render.
|
|
1490
|
+
*
|
|
1491
|
+
* ## The boundary — ordering positions only, in all three shapes
|
|
1492
|
+
*
|
|
1493
|
+
* This rule is field-agnostic, so the judgement rides on POSITION, exactly as
|
|
1494
|
+
* the schema door's #8793 note lays out at length:
|
|
1495
|
+
*
|
|
1496
|
+
* - **Judged:** `$gt` / `$gte` / `$lt` / `$lte` comparands and `$between`
|
|
1497
|
+
* endpoints (Mongo shape); `>` / `>=` / `<` / `<=` / `between` triples and
|
|
1498
|
+
* every alias `canonicalAstOperator` folds onto them (`gt`, `after`, …);
|
|
1499
|
+
* `greater_than` / `less_than` / `greater_than_or_equal` /
|
|
1500
|
+
* `less_than_or_equal` / `before` / `after` / `between` view filter rules
|
|
1501
|
+
* and every alias `normalizeFilterOperator` folds onto them. An ORDERED
|
|
1502
|
+
* comparison against a declared preset name has no legitimate reading.
|
|
1503
|
+
* - **Not judged:** equality and membership (`=`, `equals`, `$eq`, `$ne`,
|
|
1504
|
+
* `$in`, `$nin`, …). A select/picklist column legitimately stores values
|
|
1505
|
+
* that collide with preset names (`GlobalFilterSchema`'s own pins protect
|
|
1506
|
+
* `type: 'select', defaultValue: 'this_quarter'`), and on a declared
|
|
1507
|
+
* temporal field the engine door still refuses these at query time with the
|
|
1508
|
+
* field's type in hand.
|
|
1509
|
+
* - **Only the 13 declared names.** A near-miss (`last_60_days`) is not this
|
|
1510
|
+
* rule's business — on a temporal field the engine's field-typed door
|
|
1511
|
+
* catches it; judging undeclared strings here would be a guessed superset.
|
|
1512
|
+
*
|
|
1513
|
+
* Both vocabularies' `{placeholder}` spellings never collide with a preset
|
|
1514
|
+
* name (a preset carries no braces), so this rule and `validate-filter-tokens`
|
|
1515
|
+
* cannot double-report one value.
|
|
1516
|
+
*/
|
|
1517
|
+
declare const FILTER_PRESET_COMPARAND = "filter-preset-comparand";
|
|
1518
|
+
type PresetComparandSeverity = 'error' | 'warning';
|
|
1519
|
+
interface PresetComparandFinding {
|
|
1520
|
+
/** Always `error` — the runtime refuses the query, or silently returns zero rows. */
|
|
1521
|
+
severity: PresetComparandSeverity;
|
|
1522
|
+
/** Diagnostic rule id. */
|
|
1523
|
+
rule: string;
|
|
1524
|
+
/** Human-readable location, e.g. `dashboard "sales" · widget "my_deals"`. */
|
|
1525
|
+
where: string;
|
|
1526
|
+
/** Config path, e.g. `dashboards[0].widgets[2].filter.created_at.$gte`. */
|
|
1527
|
+
path: string;
|
|
1528
|
+
/** What is wrong. */
|
|
1529
|
+
message: string;
|
|
1530
|
+
/** How to fix it. */
|
|
1531
|
+
hint: string;
|
|
1532
|
+
}
|
|
1533
|
+
/**
|
|
1534
|
+
* Validate every authored filter across a stack for bare preset comparands.
|
|
1535
|
+
*
|
|
1536
|
+
* Pure `(stack) => Finding[]`; no I/O. Needs no resolution context — the
|
|
1537
|
+
* judgement is on the filter literal alone — which is what qualifies it for
|
|
1538
|
+
* the runtime publish gate's per-write snapshot.
|
|
1539
|
+
*/
|
|
1540
|
+
declare function validatePresetComparands(stack: Record<string, unknown> | undefined | null): PresetComparandFinding[];
|
|
1541
|
+
|
|
1367
1542
|
/** A literal `$and: []` / `$or: []` / `$not: {}` — a combinator with no operands. */
|
|
1368
1543
|
declare const FILTER_EMPTY_COMBINATOR = "filter-empty-combinator";
|
|
1369
1544
|
/** A literal `{}` where a filter node is authored — the whole filter, or a branch. */
|
|
@@ -1410,12 +1585,12 @@ interface ObjectRefFinding {
|
|
|
1410
1585
|
/** How to fix it. */
|
|
1411
1586
|
hint: string;
|
|
1412
1587
|
}
|
|
1413
|
-
type AnyRec$
|
|
1588
|
+
type AnyRec$k = Record<string, unknown>;
|
|
1414
1589
|
/**
|
|
1415
1590
|
* Validate every object-name reference on the surfaces listed in the module
|
|
1416
1591
|
* header. Returns findings (empty = clean).
|
|
1417
1592
|
*/
|
|
1418
|
-
declare function validateObjectReferences(stack: AnyRec$
|
|
1593
|
+
declare function validateObjectReferences(stack: AnyRec$k): ObjectRefFinding[];
|
|
1419
1594
|
|
|
1420
1595
|
type ReferenceIntegritySeverity = 'error' | 'warning';
|
|
1421
1596
|
/**
|
|
@@ -1439,21 +1614,75 @@ interface ReferenceIntegrityFinding {
|
|
|
1439
1614
|
/** One member of the suite. `name` is the exported function's name — the id a wiring test can assert on. */
|
|
1440
1615
|
interface ReferenceIntegrityRule {
|
|
1441
1616
|
name: string;
|
|
1617
|
+
/**
|
|
1618
|
+
* [#9313] The runtime-publish per-write snapshot types this member judges.
|
|
1619
|
+
*
|
|
1620
|
+
* The suite is ONE entry in `AUTHORING_RULES`, and that entry's
|
|
1621
|
+
* `runtimeTypes` says which WRITES dispatch the suite at the runtime publish
|
|
1622
|
+
* gate. This field is the finer axis the entry cannot express: which MEMBERS
|
|
1623
|
+
* are safe to judge that per-write snapshot. The two axes differ because the
|
|
1624
|
+
* snapshot is partial by design (`RuntimeStackContext` carries objects /
|
|
1625
|
+
* permissions / books / datasets and nothing else): a member that resolves
|
|
1626
|
+
* against a collection the snapshot does not carry would not go quiet — it
|
|
1627
|
+
* would report every reference into that collection as dead. Measured on the
|
|
1628
|
+
* `view` widening: `validateActionNameRefs` resolves the action names in
|
|
1629
|
+
* `views[].list` / `views[].listViews.*` against `stack.actions`, which no
|
|
1630
|
+
* per-write snapshot carries, so crossing it with the suite would refuse a
|
|
1631
|
+
* legitimate CONTAINER view write for every stack-level action it names —
|
|
1632
|
+
* a false 422 on the only door a Studio tenant has (on a FLATTENED overlay
|
|
1633
|
+
* it has no rung, so the same crossing would be a silent no-op instead;
|
|
1634
|
+
* measured both ways, `runtime-gate.view-writes.test.ts`).
|
|
1635
|
+
*
|
|
1636
|
+
* ABSENT = `['flow']`, the surface the whole suite has run on since #4463 P1.
|
|
1637
|
+
* The default is deliberately the frozen historical surface, never "all":
|
|
1638
|
+
* widening a member onto another type is an explicit declaration here plus
|
|
1639
|
+
* its own false-positive measurement (#4716's budget), exactly the
|
|
1640
|
+
* discipline `runtimeTypes` gives registry entries. CLI commands ignore this
|
|
1641
|
+
* field entirely — all members always run there (see
|
|
1642
|
+
* {@link validateReferenceIntegrity}).
|
|
1643
|
+
*/
|
|
1644
|
+
runtimeTypes?: readonly string[];
|
|
1442
1645
|
run: (stack: Record<string, unknown>) => ReferenceIntegrityFinding[];
|
|
1443
1646
|
}
|
|
1444
1647
|
/**
|
|
1445
1648
|
* Every reference-integrity rule, in the order their findings are reported.
|
|
1446
1649
|
*
|
|
1447
1650
|
* ADDING A RULE: append it here and it runs on `validate`, `lint` and
|
|
1448
|
-
* `compile` at once. Do not re-wire the commands.
|
|
1651
|
+
* `compile` at once. Do not re-wire the commands. It joins the runtime
|
|
1652
|
+
* publish gate on the DEFAULT member surface (`flow` snapshots only, #9313) —
|
|
1653
|
+
* widening it to another write type is a `runtimeTypes` declaration on the
|
|
1654
|
+
* member plus that type's own false-positive measurement, never automatic.
|
|
1449
1655
|
*/
|
|
1450
1656
|
declare const REFERENCE_INTEGRITY_RULES: readonly ReferenceIntegrityRule[];
|
|
1657
|
+
/**
|
|
1658
|
+
* Options for {@link validateReferenceIntegrity}.
|
|
1659
|
+
*
|
|
1660
|
+
* Declared as the suite's own type rather than importing
|
|
1661
|
+
* `AuthoringRuleContext` from `authoring-rules.ts` — the suite predates the
|
|
1662
|
+
* registry and the registry imports the suite, so the dependency must keep
|
|
1663
|
+
* pointing that way. The registry's context is assignable to this shape by
|
|
1664
|
+
* construction (`runtimeWriteType` spells the same key on both).
|
|
1665
|
+
*/
|
|
1666
|
+
interface ReferenceIntegrityRunOptions {
|
|
1667
|
+
/**
|
|
1668
|
+
* [#9313] The singular metadata type of the per-write snapshot being judged,
|
|
1669
|
+
* when the caller is the runtime publish gate. Set by `runtime-gate.ts` for
|
|
1670
|
+
* every gated write; ABSENT on the three CLI commands and every whole-stack
|
|
1671
|
+
* caller, which run all members unconditionally.
|
|
1672
|
+
*/
|
|
1673
|
+
runtimeWriteType?: string;
|
|
1674
|
+
}
|
|
1451
1675
|
/**
|
|
1452
1676
|
* Run every reference-integrity rule over a stack. Returns the concatenated
|
|
1453
1677
|
* findings (empty = clean). Pure: no I/O, safe on both the schema-parsed stack
|
|
1454
1678
|
* and the raw/normalized config the `lint` path carries.
|
|
1679
|
+
*
|
|
1680
|
+
* [#9313] When `options.runtimeWriteType` is set — the runtime publish gate
|
|
1681
|
+
* judging one write's snapshot — only the members declaring that type run
|
|
1682
|
+
* (see {@link ReferenceIntegrityRule.runtimeTypes}). Whole-stack callers pass
|
|
1683
|
+
* no options and keep the full suite, byte-identically.
|
|
1455
1684
|
*/
|
|
1456
|
-
declare function validateReferenceIntegrity(stack: Record<string, unknown
|
|
1685
|
+
declare function validateReferenceIntegrity(stack: Record<string, unknown>, options?: ReferenceIntegrityRunOptions): ReferenceIntegrityFinding[];
|
|
1457
1686
|
|
|
1458
1687
|
/**
|
|
1459
1688
|
* [ADR-0072 — reference resolvability] App-navigation targets that are not
|
|
@@ -1621,6 +1850,21 @@ declare function validateNavObjectServability(stack: unknown): NavObjectServabil
|
|
|
1621
1850
|
* the runtime would refuse — `created_by` in a view's narrowing — is a
|
|
1622
1851
|
* missed finding, not a wrong one.)
|
|
1623
1852
|
*
|
|
1853
|
+
* Skip 3 answers EXISTENCE, and since #8404 it no longer ends the matter. On an
|
|
1854
|
+
* ADR-0015 `external` object the platform registers its injected anchors and
|
|
1855
|
+
* provisions no storage behind them (#7865 / #8116), so `owner_id` there is
|
|
1856
|
+
* addressable and empty on every record. Existence rightly stays silent —
|
|
1857
|
+
* PROVENANCE is a second question, asked only of the names skip 3 already
|
|
1858
|
+
* decided not to flag, and answered by the per-object index
|
|
1859
|
+
* ({@link indexUnprovisionedAnchors}) rather than the object-independent union.
|
|
1860
|
+
* A declared anchor survives into the resolved allow-list and the view's
|
|
1861
|
+
* `$searchFields` narrowing, so it reads as search coverage and scans a column
|
|
1862
|
+
* that can never match — #4830's own failure mode reached by a different route.
|
|
1863
|
+
* WARNING, never gating, for #4330's cost asymmetry: the remote schema is not
|
|
1864
|
+
* visible to this pass, so the finding describes a degradation, not a refusal
|
|
1865
|
+
* (the same call `warnUnprovisionedAnchors` makes in `validate-expressions.ts`
|
|
1866
|
+
* and the four filter/binding rules #8340 wired).
|
|
1867
|
+
*
|
|
1624
1868
|
* Dotted paths are NOT skipped here, unlike every sibling rule. Elsewhere
|
|
1625
1869
|
* `owner_id.name` is left alone because the query engine resolves the traversal;
|
|
1626
1870
|
* search does not — `resolveSearchFields` matches the field map by exact string,
|
|
@@ -1630,6 +1874,7 @@ declare function validateNavObjectServability(stack: unknown): NavObjectServabil
|
|
|
1630
1874
|
|
|
1631
1875
|
declare const SEARCHABLE_FIELD_UNKNOWN = "searchable-field-unknown";
|
|
1632
1876
|
declare const SEARCHABLE_FIELD_UNSEARCHABLE = "searchable-field-unsearchable";
|
|
1877
|
+
declare const SEARCHABLE_FIELD_UNPROVISIONED = "searchable-field-unprovisioned";
|
|
1633
1878
|
type SearchableFieldSeverity = 'error' | 'warning';
|
|
1634
1879
|
interface SearchableFieldFinding {
|
|
1635
1880
|
/** Always `error` — a stale entry narrows, widens or refuses the search (see module note). */
|
|
@@ -1658,18 +1903,87 @@ interface SearchableFieldFinding {
|
|
|
1658
1903
|
* runtime would refuse are flagged (#4830).
|
|
1659
1904
|
*/
|
|
1660
1905
|
type SearchableFieldRole = 'canonical' | 'narrowing';
|
|
1661
|
-
type AnyRec$
|
|
1906
|
+
type AnyRec$j = Record<string, unknown>;
|
|
1907
|
+
/**
|
|
1908
|
+
* The slice of an object the search checks resolve against: the authored
|
|
1909
|
+
* field map (existence + the `type`/`hidden` meta search resolution reads),
|
|
1910
|
+
* plus the object's own declarations the runtime's resolution consumes.
|
|
1911
|
+
* `null` when the object declares no readable field map (external /
|
|
1912
|
+
* introspected — nothing to judge against).
|
|
1913
|
+
*/
|
|
1914
|
+
interface ObjectSearchTarget {
|
|
1915
|
+
/** Authored field names, for the existence check. */
|
|
1916
|
+
names: Set<string>;
|
|
1917
|
+
/** name → the metadata slice `resolveSearchFieldResolution` reads. */
|
|
1918
|
+
fields: Record<string, SearchFieldMeta>;
|
|
1919
|
+
/** The object's own `searchableFields`, when declared as an array. */
|
|
1920
|
+
searchableFields?: string[];
|
|
1921
|
+
/** `nameField` / `displayNameField` — ordering only, passed for parity. */
|
|
1922
|
+
displayField?: string;
|
|
1923
|
+
}
|
|
1662
1924
|
/**
|
|
1663
1925
|
* Validate every `searchableFields` declaration in the stack — the object's own
|
|
1664
|
-
* (the canonical set, ADR-0061) and the list views that narrow it
|
|
1665
|
-
*
|
|
1926
|
+
* (the canonical set, ADR-0061) and the list views that narrow it, including
|
|
1927
|
+
* the two standalone `views[]` shapes the `PUT /api/v1/meta/view` door
|
|
1928
|
+
* carries and the runtime publish gate snapshots: the flattened list overlay
|
|
1929
|
+
* (#9313, top-level set) and the ViewItem record (#10001,
|
|
1930
|
+
* `config.searchableFields` one level down). Returns findings (empty = clean).
|
|
1666
1931
|
*
|
|
1667
1932
|
* The react page surface (`<ListView searchableFields={…}>`) is deliberately
|
|
1668
1933
|
* NOT walked here: its declaration lives inside JSX source, and
|
|
1669
1934
|
* `validate-react-page-props` — the gate that already parses that source —
|
|
1670
1935
|
* runs the same `checkSearchableFieldList` core on it (#4329).
|
|
1671
1936
|
*/
|
|
1672
|
-
declare function validateSearchableFields(stack: AnyRec$
|
|
1937
|
+
declare function validateSearchableFields(stack: AnyRec$j): SearchableFieldFinding[];
|
|
1938
|
+
|
|
1939
|
+
declare const SORT_FIELD_UNKNOWN = "sort-field-unknown";
|
|
1940
|
+
declare const SORT_FIELD_UNSORTABLE = "sort-field-unsortable";
|
|
1941
|
+
/** [#10474] The provenance verdict — a WARNING, unlike the two above. */
|
|
1942
|
+
declare const SORT_FIELD_UNPROVISIONED = "sort-field-unprovisioned";
|
|
1943
|
+
type SortableFieldSeverity = 'error' | 'warning';
|
|
1944
|
+
interface SortableFieldFinding {
|
|
1945
|
+
/**
|
|
1946
|
+
* `error` for the two verdicts the runtime REFUSES (`400 INVALID_SORT` at
|
|
1947
|
+
* request time); `warning` for the #10474 provenance verdict, which no
|
|
1948
|
+
* runtime door refuses and which this pass cannot prove against a remote
|
|
1949
|
+
* schema it cannot see.
|
|
1950
|
+
*/
|
|
1951
|
+
severity: SortableFieldSeverity;
|
|
1952
|
+
/** Diagnostic rule id. */
|
|
1953
|
+
rule: string;
|
|
1954
|
+
/** Human-readable location, e.g. `object "crm_opportunity" › listViews.pipeline`. */
|
|
1955
|
+
where: string;
|
|
1956
|
+
/** Config path, e.g. `objects[0].listViews.pipeline.sort[1]`. */
|
|
1957
|
+
path: string;
|
|
1958
|
+
/** What is wrong. */
|
|
1959
|
+
message: string;
|
|
1960
|
+
/** How to fix it. */
|
|
1961
|
+
hint: string;
|
|
1962
|
+
}
|
|
1963
|
+
type AnyRec$i = Record<string, unknown>;
|
|
1964
|
+
/**
|
|
1965
|
+
* Check ONE authored `sort` declaration against the object it is bound to —
|
|
1966
|
+
* the shared core behind every list-view surface that declares an ordering.
|
|
1967
|
+
*
|
|
1968
|
+
* `fieldsByObject` is {@link indexObjectSearchTargets}' index, reused rather
|
|
1969
|
+
* than rebuilt: the SEARCH and SORT doors must agree about which fields an
|
|
1970
|
+
* object has and what type each one is, and two hand-written readers of the
|
|
1971
|
+
* same field map is the drift `system-fields.ts` and `view-walk.ts` were both
|
|
1972
|
+
* created to end. `subject` names the declaration for the message; the parsed
|
|
1973
|
+
* key's position is appended to `path` so the author can go straight to it.
|
|
1974
|
+
*/
|
|
1975
|
+
declare function checkSortDeclaration(declared: unknown, objectName: string | undefined, fieldsByObject: ReadonlyMap<string, ObjectSearchTarget | null>, where: string, path: string, subject: string, unprovisionedAnchors?: ReadonlyMap<string, ReadonlySet<string>>): SortableFieldFinding[];
|
|
1976
|
+
/**
|
|
1977
|
+
* Validate every list-view `sort` declaration in the stack — the object's
|
|
1978
|
+
* built-in named list views and the `defineView` aggregates that declare one.
|
|
1979
|
+
* Returns findings (empty = clean).
|
|
1980
|
+
*
|
|
1981
|
+
* The surfaces walked here are exactly `validateSearchableFields`', for the
|
|
1982
|
+
* same reason: these are the declarations that lower into an engine `orderBy`
|
|
1983
|
+
* over the bound object's own columns. See the module note for the four
|
|
1984
|
+
* sort-carrying surfaces that were checked and deliberately left out.
|
|
1985
|
+
*/
|
|
1986
|
+
declare function validateSortableFields(stack: AnyRec$i): SortableFieldFinding[];
|
|
1673
1987
|
|
|
1674
1988
|
declare const ACTION_NAME_UNDEFINED = "action-name-undefined";
|
|
1675
1989
|
type ActionNameRefSeverity = 'error' | 'warning';
|
|
@@ -2304,6 +2618,30 @@ interface HookBodyWriteFinding {
|
|
|
2304
2618
|
hint: string;
|
|
2305
2619
|
}
|
|
2306
2620
|
declare const HOOK_BODY_WRITE_UNKNOWN_FIELD = "hook-body-write-unknown-field";
|
|
2621
|
+
/**
|
|
2622
|
+
* [#10653] The body did not parse, so its write set is whatever error recovery
|
|
2623
|
+
* left readable.
|
|
2624
|
+
*
|
|
2625
|
+
* Reported rather than skipped for the reason this rule exists at all: a
|
|
2626
|
+
* mistake must be visible where it is MADE. An unparseable body reached the
|
|
2627
|
+
* extractor, produced fewer matches, and came back as a hook with nothing to
|
|
2628
|
+
* report — the same silence the undeclared write itself has at run time, this
|
|
2629
|
+
* time wearing the checker's badge. `warning` because the whole rule is
|
|
2630
|
+
* advisory and never gates (the severity type admits nothing else).
|
|
2631
|
+
*/
|
|
2632
|
+
declare const HOOK_BODY_SOURCE_UNPARSEABLE = "hook-body-source-unparseable";
|
|
2633
|
+
/**
|
|
2634
|
+
* [#8663] The write-axis twin of `flow-template-field-unprovisioned` (#8340):
|
|
2635
|
+
* the body writes a field {@link IMPLICIT_FIELDS} exempts, but on THIS target
|
|
2636
|
+
* the platform registered that anchor without provisioning storage for it.
|
|
2637
|
+
*
|
|
2638
|
+
* A separate id at `warning` severity rather than a reclassification of
|
|
2639
|
+
* {@link HOOK_BODY_WRITE_UNKNOWN_FIELD}, matching #8340's precedent exactly:
|
|
2640
|
+
* the existence verdict is unchanged (the name IS addressable), and what is
|
|
2641
|
+
* added is a second, independently suppressible finding on the path where the
|
|
2642
|
+
* existence check stays silent.
|
|
2643
|
+
*/
|
|
2644
|
+
declare const HOOK_BODY_WRITE_UNPROVISIONED_ANCHOR = "hook-body-write-unprovisioned-anchor";
|
|
2307
2645
|
/** One syntactic write shape the extractor recognizes. */
|
|
2308
2646
|
interface HookBodyWritePattern {
|
|
2309
2647
|
/** Stable pattern id, carried on every extracted write. */
|
|
@@ -2369,6 +2707,31 @@ interface ExtractedHookBodyWriteSet {
|
|
|
2369
2707
|
* escape too, which is the safe direction: it suppresses findings.)
|
|
2370
2708
|
*/
|
|
2371
2709
|
ctxRecordEscapes: boolean;
|
|
2710
|
+
/**
|
|
2711
|
+
* [#10653] Set when the body did not parse, so `writes` is whatever error
|
|
2712
|
+
* recovery left readable rather than the body's actual write set.
|
|
2713
|
+
*
|
|
2714
|
+
* Absent means one of two things, and they are not the same: the body parsed,
|
|
2715
|
+
* or the cheap pre-filter above rejected it before any parse. The filter is a
|
|
2716
|
+
* raw-text scan for `ctx` / `Object`, and a body containing neither cannot
|
|
2717
|
+
* match any pattern however it parses — so a skipped parse claims nothing and
|
|
2718
|
+
* hides nothing.
|
|
2719
|
+
*
|
|
2720
|
+
* ## Whose fault an unparseable body is — asked, not assumed
|
|
2721
|
+
*
|
|
2722
|
+
* The body is parsed inside a synthesised wrapper (`async function __body(ctx)
|
|
2723
|
+
* { … }`) because that is the shape the runtime compiles it into
|
|
2724
|
+
* (`new AsyncFunction('ctx', source)`). So a parse failure here could in
|
|
2725
|
+
* principle be the WRAPPER's fault rather than the author's, and blaming the
|
|
2726
|
+
* author for the checker's own bug is the failure this whole change is about.
|
|
2727
|
+
* It cannot be: the wrapper is a constant, and `validate-hook-body-writes.
|
|
2728
|
+
* test.ts` pins that it parses clean around an empty body and around every
|
|
2729
|
+
* example in the pattern ledger. Any diagnostic therefore comes from the
|
|
2730
|
+
* body — and its position is reported in the BODY's own coordinates (the
|
|
2731
|
+
* wrapper's line is subtracted, and the result is clamped so it can never
|
|
2732
|
+
* point at a line the author did not write).
|
|
2733
|
+
*/
|
|
2734
|
+
parseFailure?: SourceParseFailure;
|
|
2372
2735
|
}
|
|
2373
2736
|
/**
|
|
2374
2737
|
* Extract every literal field write the pattern ledger declares from an L2
|
|
@@ -2402,6 +2765,23 @@ interface ActionBodyWriteFinding {
|
|
|
2402
2765
|
}
|
|
2403
2766
|
declare const ACTION_BODY_WRITE_UNKNOWN_FIELD = "action-body-write-unknown-field";
|
|
2404
2767
|
declare const ACTION_RECORD_WRITE_DISCARDED = "action-record-write-discarded";
|
|
2768
|
+
/**
|
|
2769
|
+
* [#10653] The action-surface twin of `hook-body-source-unparseable`. Same
|
|
2770
|
+
* extractor, same synthesised wrapper, same parse — so the body that came back
|
|
2771
|
+
* silently unread on the hook surface came back silently unread here too.
|
|
2772
|
+
*
|
|
2773
|
+
* Wiring only the hook rule would have left the blind half standing at the call
|
|
2774
|
+
* site next door, which this rule's own division of labour forbids: an action
|
|
2775
|
+
* body runs through the same `HookBodySchema` and the same sandbox, so it gets
|
|
2776
|
+
* the same treatment.
|
|
2777
|
+
*/
|
|
2778
|
+
declare const ACTION_BODY_SOURCE_UNPARSEABLE = "action-body-source-unparseable";
|
|
2779
|
+
/**
|
|
2780
|
+
* [#8663] The action-surface twin of `hook-body-write-unprovisioned-anchor`.
|
|
2781
|
+
* Same question, same wording, same `warning` severity — this rule and the hook
|
|
2782
|
+
* rule share {@link IMPLICIT_FIELDS}, so they shared its blind spot too.
|
|
2783
|
+
*/
|
|
2784
|
+
declare const ACTION_BODY_WRITE_UNPROVISIONED_ANCHOR = "action-body-write-unprovisioned-anchor";
|
|
2405
2785
|
/** @deprecated alias — the exclusion shape is shared with the hook rule. */
|
|
2406
2786
|
type ActionBodyWriteExclusion = BodyWritePatternExclusion;
|
|
2407
2787
|
/**
|
|
@@ -2435,9 +2815,17 @@ type AnyRec$6 = Record<string, unknown>;
|
|
|
2435
2815
|
*/
|
|
2436
2816
|
declare function validateActionBodyWrites(stack: AnyRec$6): ActionBodyWriteFinding[];
|
|
2437
2817
|
|
|
2438
|
-
|
|
2818
|
+
/**
|
|
2819
|
+
* `error` for the existence verdict — a literal key against a literal object is
|
|
2820
|
+
* a certainty (see the module note). [#8663] `warning` for the provenance one:
|
|
2821
|
+
* the same widening `validateFlowTemplatePaths` carries, for the same reason.
|
|
2822
|
+
* The two questions have different certainties, so they cannot share a
|
|
2823
|
+
* severity; the suite that runs this rule is severity-agnostic by contract and
|
|
2824
|
+
* carries each finding's own value through.
|
|
2825
|
+
*/
|
|
2826
|
+
type FlowNodeWriteSeverity = 'error' | 'warning';
|
|
2439
2827
|
interface FlowNodeWriteFinding {
|
|
2440
|
-
/**
|
|
2828
|
+
/** Per-finding — see {@link FlowNodeWriteSeverity}, which says why it is not a constant. */
|
|
2441
2829
|
severity: FlowNodeWriteSeverity;
|
|
2442
2830
|
rule: string;
|
|
2443
2831
|
/** Human-readable location, e.g. `flow "close_deal" › node "Mark won"`. */
|
|
@@ -2448,6 +2836,20 @@ interface FlowNodeWriteFinding {
|
|
|
2448
2836
|
hint: string;
|
|
2449
2837
|
}
|
|
2450
2838
|
declare const FLOW_NODE_WRITE_UNKNOWN_FIELD = "flow-node-write-unknown-field";
|
|
2839
|
+
/**
|
|
2840
|
+
* [#8663] The flow-node twin of `hook-body-write-unprovisioned-anchor`. This
|
|
2841
|
+
* rule reached the same blind spot from the same direction: it imports
|
|
2842
|
+
* {@link IMPLICIT_FIELDS} from the hook rule, so it inherited the set's
|
|
2843
|
+
* object-independence along with its contents.
|
|
2844
|
+
*
|
|
2845
|
+
* ⚠️ `warning`, NOT this rule's usual `error`. The existence verdict gates
|
|
2846
|
+
* because a literal key against a literal object is a certainty; the provenance
|
|
2847
|
+
* verdict is a claim about a REMOTE schema this repo cannot see, so it advises.
|
|
2848
|
+
* Reclassifying it upward would convert a silent case straight into a build
|
|
2849
|
+
* break — the shape ADR-0072 D1 forbids, at the one severity where it cannot be
|
|
2850
|
+
* ignored.
|
|
2851
|
+
*/
|
|
2852
|
+
declare const FLOW_NODE_WRITE_UNPROVISIONED_ANCHOR = "flow-node-write-unprovisioned-anchor";
|
|
2451
2853
|
/** Flow node types whose `config.fields` keys this rule resolves. */
|
|
2452
2854
|
declare const FLOW_WRITE_NODE_TYPES: readonly string[];
|
|
2453
2855
|
/** A `fields`-bearing node type this rule does NOT cover yet, and why. */
|
|
@@ -2646,6 +3048,52 @@ interface LintIssue {
|
|
|
2646
3048
|
path: string;
|
|
2647
3049
|
fix?: string;
|
|
2648
3050
|
}
|
|
3051
|
+
/**
|
|
3052
|
+
* A {@link LintIssue} that also states the HUMAN-READABLE location, for rules
|
|
3053
|
+
* that are adapted into `AuthoringFinding` (`packages/lint/src/authoring-rules.ts`).
|
|
3054
|
+
*
|
|
3055
|
+
* `AuthoringFinding` declares two location slots with different jobs — `where`
|
|
3056
|
+
* ("human-readable location", e.g. `object "leave_request"`) and `path` ("config
|
|
3057
|
+
* path", e.g. `objects[3].sharingModel`) — and every CLI command renders the
|
|
3058
|
+
* first as the line's prefix: `os validate` prints
|
|
3059
|
+
* `• ${where}: ${message}` and then `rule: ${rule} at ${path}`.
|
|
3060
|
+
*
|
|
3061
|
+
* `LintIssue` carries only the positional `path`, so the three ADR-0120
|
|
3062
|
+
* uniqueness rules' registry adapters had nothing else to map and set
|
|
3063
|
+
* `where: f.path`. Measured on `origin/main`: an author saw
|
|
3064
|
+
* `• objects[44].indexes[1]: "sys_account" declares index … at objects[44].indexes[1]`
|
|
3065
|
+
* — the same positional string twice, and an index into the MERGED object array
|
|
3066
|
+
* that appears in no file the author wrote (44 objects from
|
|
3067
|
+
* `@objectstack/platform-objects` plus one from `@objectstack/metadata-core`).
|
|
3068
|
+
* No information was lost — the object's name is in the message — but the
|
|
3069
|
+
* location slot said nothing the `at` clause did not already say, and every
|
|
3070
|
+
* other rule in the table spells it `object "sys_account"`.
|
|
3071
|
+
*
|
|
3072
|
+
* Stating `where` at the PRODUCER rather than reconstructing it in the adapter
|
|
3073
|
+
* is deliberate: only the rule still holds the object it walked. Making it
|
|
3074
|
+
* REQUIRED here (rather than adding `where?` to `LintIssue` and writing
|
|
3075
|
+
* `f.where ?? f.path` at the adapter) is the same discipline — a consumer-side
|
|
3076
|
+
* fallback would let the next rule ship the positional spelling again, silently.
|
|
3077
|
+
*
|
|
3078
|
+
* `path` is unchanged and stays positional AT THE RULE LEVEL: it is the slot
|
|
3079
|
+
* that is SUPPOSED to be a config path, `os validate` prints it after `at`
|
|
3080
|
+
* (where the index resolves against the author's own config file), and the
|
|
3081
|
+
* runtime gate's `fingerprint` reads `where` and `path` together (making
|
|
3082
|
+
* `where` more specific cannot merge two findings that were distinct).
|
|
3083
|
+
*
|
|
3084
|
+
* [#10064] On the runtime gate's WIRE surface (`RuntimeAuthoringIssue.path`,
|
|
3085
|
+
* the 422 `issues[]` / 2xx `advisories`), the top-level collection index of a
|
|
3086
|
+
* collection-resident finding is rewritten to the entry's NAME
|
|
3087
|
+
* (`objects[417].sharingModel` → `objects.acme_invoice.sharingModel`) after
|
|
3088
|
+
* the differential — a runtime caller has no array to resolve `417` against;
|
|
3089
|
+
* that index numbers the gate's private per-write snapshot. The rewrite lives
|
|
3090
|
+
* in `runtime-gate.ts` (`nameKeyFindingPath`); rules keep emitting positional
|
|
3091
|
+
* paths and need no awareness of it.
|
|
3092
|
+
*/
|
|
3093
|
+
interface LocatedLintIssue extends LintIssue {
|
|
3094
|
+
/** Human-readable location, e.g. `object "sys_account" · index 'uniq_org_email'`. */
|
|
3095
|
+
where: string;
|
|
3096
|
+
}
|
|
2649
3097
|
declare const UNIQUE_DOUBLE_DECLARATION = "unique/double-declaration";
|
|
2650
3098
|
declare const UNIQUE_UNSCOPED_DECLARED_INDEX = "unique/unscoped-declared-index";
|
|
2651
3099
|
declare const UNIQUE_LEGACY_ORGANIZATION_COMPOSITE = "unique/legacy-organization-composite";
|
|
@@ -2671,7 +3119,7 @@ declare const UNIQUE_LEGACY_ORGANIZATION_COMPOSITE = "unique/legacy-organization
|
|
|
2671
3119
|
* Wiring: own AUTHORING_RULES entry (validate/build), and `lintDataModel`
|
|
2672
3120
|
* calls it for `os lint` — each command reports each finding exactly once.
|
|
2673
3121
|
*/
|
|
2674
|
-
declare function lintUnscopedDeclaredIndexes(objects: any[]):
|
|
3122
|
+
declare function lintUnscopedDeclaredIndexes(objects: any[]): LocatedLintIssue[];
|
|
2675
3123
|
/**
|
|
2676
3124
|
* R10 (ADR-0120 D5b) — the same single column carries BOTH a field-level
|
|
2677
3125
|
* `unique` and a declared single-column unique index (#3991), judged in the
|
|
@@ -2701,7 +3149,7 @@ declare function lintUnscopedDeclaredIndexes(objects: any[]): LintIssue[];
|
|
|
2701
3149
|
* Advisory. The resulting stack is well-defined — the cost is an intent that
|
|
2702
3150
|
* never takes effect, not a broken artifact — so this never fails a build.
|
|
2703
3151
|
*/
|
|
2704
|
-
declare function lintUniqueDeclarations(objects: any[]):
|
|
3152
|
+
declare function lintUniqueDeclarations(objects: any[]): LocatedLintIssue[];
|
|
2705
3153
|
/**
|
|
2706
3154
|
* R12 (ADR-0120 D5c) — a declared unique index whose column list CONTAINS the
|
|
2707
3155
|
* organization column: the hand-written per-organization composite (S6),
|
|
@@ -2728,7 +3176,7 @@ declare function lintUniqueDeclarations(objects: any[]): LintIssue[];
|
|
|
2728
3176
|
* unique declared on the organization column ALONE, which is not a composite and
|
|
2729
3177
|
* has no per-organization reading to recover.
|
|
2730
3178
|
*/
|
|
2731
|
-
declare function lintLegacyOrganizationComposites(objects: any[]):
|
|
3179
|
+
declare function lintLegacyOrganizationComposites(objects: any[]): LocatedLintIssue[];
|
|
2732
3180
|
/**
|
|
2733
3181
|
* Lint the relationship / data-modeling conventions across the full object set.
|
|
2734
3182
|
* Pure and deterministic — safe to call from both the `lint` command and the
|
|
@@ -2736,4 +3184,4 @@ declare function lintLegacyOrganizationComposites(objects: any[]): LintIssue[];
|
|
|
2736
3184
|
*/
|
|
2737
3185
|
declare function lintDataModel(objects: any[]): LintIssue[];
|
|
2738
3186
|
|
|
2739
|
-
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, 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_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_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, 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, 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, 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_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_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, validateManagedApiMethods, validateNavAccess, validateNavObjectServability, validateNavTargetRefs, validateObjectReferences, validateOrgAxisRedLines, validatePageFieldBindings, validatePageSourceStyling, validatePredicatePathRefs, validateReactPageProps, validateReactPages, validateReadonlyFlowWrites, validateRecordTitle, validateReferenceIntegrity, validateResponsiveStyles, validateRlsPredicateEnforceability, validateRuleCompilability, validateRuleSchemaFormats, validateSearchableFields, validateSecurityPosture, validateSecurityRoleWord, validateSeedReplaySafety, validateSeedStateMachine, validateSemanticRoles, validateSharingRuleEnforceability, validateStackExpressions, validateTranslatableSections, validateTranslationReferences, validateViewContainers, validateVisibilityPredicates, validateWidgetBindings, walkPageComponents };
|
|
3187
|
+
export { ACTION_BODY_SOURCE_UNPARSEABLE, 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 CheckedParse, type CheckedParseOptions, 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_SOURCE_UNPARSEABLE, 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, PARSE_FAILURE_HINT, 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, REACT_PAGE_SOURCE_UNPARSEABLE, 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_UNPROVISIONED, SORT_FIELD_UNSORTABLE, STARTUP_OPEN_VOCABULARY_VERDICT, STARTUP_SOURCE_UNPARSEABLE, 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 SourceParseFailure, 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, describeParseFailure, 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 };
|