@objectstack/lint 17.0.0-rc.5 → 17.0.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 +8409 -0
- package/dist/index.cjs +2526 -681
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +453 -129
- package/dist/index.d.ts +453 -129
- package/dist/index.js +2492 -661
- package/dist/index.js.map +1 -1
- package/dist/{runtime-Cs64ShwN.d.cts → runtime-H-nDodRy.d.cts} +135 -10
- package/dist/{runtime-Cs64ShwN.d.ts → runtime-H-nDodRy.d.ts} +135 -10
- package/dist/runtime.cjs +2091 -647
- 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 +2050 -589
- package/dist/runtime.js.map +1 -1
- package/package.json +6 -5
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Manifest } from '@objectstack/sdui-parser';
|
|
2
2
|
import { Options } from 'ajv';
|
|
3
|
-
import {
|
|
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 RuntimeStackContext, m as authoringRulesFor, r as runAuthoringRules,
|
|
3
|
+
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 RuntimeStackContext, m as authoringRulesFor, n as buildRuntimeWriteSnapshots, r as runAuthoringRules, o as runRuntimeAuthoringRules, p as runtimeAuthoringRulesFor, q as runtimeGatedTypes, s as splitBySeverity, t as stackKeyForType } from './runtime-H-nDodRy.js';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Build-time dashboard widget binding diagnostics (issues #1719, #1721).
|
|
@@ -68,6 +68,14 @@ export { A as AUTHORING_COMMANDS, a as AUTHORING_RULES, b as AUTHORING_SURFACES,
|
|
|
68
68
|
* single-form cutover removed. The dashboard renderer routes dataset-bound
|
|
69
69
|
* widgets through `DatasetWidget` and never reads these, so they are a
|
|
70
70
|
* silent no-op. Steers the author onto `dataset`+`dimensions`+`values`.
|
|
71
|
+
* - `dashboard-filter-field-unprovisioned` (#8340) — the filter's effective
|
|
72
|
+
* field RESOLVES (it is a registry-injected system column, so
|
|
73
|
+
* `dashboard-filter-field-unknown` above rightly stays silent) but the bound
|
|
74
|
+
* object is ADR-0015 `external`, where the platform registers the anchor and
|
|
75
|
+
* provisions no storage for it. The filter is still ANDed into the query, so
|
|
76
|
+
* the widget renders empty instead of crashing — the silent-degradation half
|
|
77
|
+
* of the same invariant, warned rather than errored because this pass cannot
|
|
78
|
+
* see the remote schema (#8116's severity reasoning).
|
|
71
79
|
*
|
|
72
80
|
* Warnings can be deliberately suppressed per widget via
|
|
73
81
|
* `suppressWarnings: ['<rule-id>']`; errors cannot — they describe a
|
|
@@ -83,6 +91,7 @@ declare const MEASURE_AGGREGATE_INCOHERENT = "measure-aggregate-incoherent";
|
|
|
83
91
|
declare const WIDGET_LEGACY_ANALYTICS_SHAPE = "widget-legacy-analytics-shape";
|
|
84
92
|
declare const WIDGET_LEGACY_ANALYTICS_UNRENDERABLE = "widget-legacy-analytics-unrenderable";
|
|
85
93
|
declare const DASHBOARD_FILTER_FIELD_UNKNOWN = "dashboard-filter-field-unknown";
|
|
94
|
+
declare const DASHBOARD_FILTER_FIELD_UNPROVISIONED = "dashboard-filter-field-unprovisioned";
|
|
86
95
|
type WidgetBindingSeverity = 'error' | 'warning';
|
|
87
96
|
interface WidgetBindingFinding {
|
|
88
97
|
/** `error` = unresolvable binding (broken page); `warning` = advisory. */
|
|
@@ -98,7 +107,7 @@ interface WidgetBindingFinding {
|
|
|
98
107
|
/** How to fix (or deliberately suppress) it. */
|
|
99
108
|
hint: string;
|
|
100
109
|
}
|
|
101
|
-
type AnyRec$
|
|
110
|
+
type AnyRec$F = Record<string, unknown>;
|
|
102
111
|
/**
|
|
103
112
|
* Validate every dashboard widget's dataset binding. Returns the list of
|
|
104
113
|
* findings (empty = clean). Caller decides how to surface them: `error`
|
|
@@ -106,7 +115,7 @@ type AnyRec$E = Record<string, unknown>;
|
|
|
106
115
|
* should fail validate/build; `warning` findings are advisory and must
|
|
107
116
|
* never fail the build on their own.
|
|
108
117
|
*/
|
|
109
|
-
declare function validateWidgetBindings(stack: AnyRec$
|
|
118
|
+
declare function validateWidgetBindings(stack: AnyRec$F): WidgetBindingFinding[];
|
|
110
119
|
|
|
111
120
|
interface ExprIssue {
|
|
112
121
|
where: string;
|
|
@@ -119,12 +128,12 @@ interface ExprIssue {
|
|
|
119
128
|
*/
|
|
120
129
|
severity?: 'error' | 'warning';
|
|
121
130
|
}
|
|
122
|
-
type AnyRec$
|
|
131
|
+
type AnyRec$E = Record<string, unknown>;
|
|
123
132
|
/**
|
|
124
133
|
* Validate every predicate in the stack. Returns the list of issues (empty =
|
|
125
134
|
* clean). Caller decides how to surface / whether to fail the build.
|
|
126
135
|
*/
|
|
127
|
-
declare function validateStackExpressions(stack: AnyRec$
|
|
136
|
+
declare function validateStackExpressions(stack: AnyRec$E): ExprIssue[];
|
|
128
137
|
|
|
129
138
|
/**
|
|
130
139
|
* The corrective sentence, lifted **verbatim** from `unevaluableRuleError` in
|
|
@@ -204,6 +213,95 @@ type NullGuardOutcome =
|
|
|
204
213
|
*/
|
|
205
214
|
declare function nullGuardMessage(subject: string, objectName: string | undefined, finding: NullGuardFinding, outcome?: NullGuardOutcome): string;
|
|
206
215
|
|
|
216
|
+
/**
|
|
217
|
+
* A verdict about an open capability vocabulary, recorded during a phase in
|
|
218
|
+
* which a plugin can still contribute to it.
|
|
219
|
+
*/
|
|
220
|
+
declare const STARTUP_OPEN_VOCABULARY_VERDICT = "startup-open-vocabulary-verdict";
|
|
221
|
+
/**
|
|
222
|
+
* The diagnostic at such a site asserts a terminal outcome about a world that
|
|
223
|
+
* has not finished forming. Emitted only where
|
|
224
|
+
* {@link STARTUP_OPEN_VOCABULARY_VERDICT} already fired.
|
|
225
|
+
*/
|
|
226
|
+
declare const STARTUP_VERDICT_ASSERTIVE_WORDING = "startup-verdict-assertive-wording";
|
|
227
|
+
/**
|
|
228
|
+
* Accessors that read a capability vocabulary a plugin can still extend.
|
|
229
|
+
*
|
|
230
|
+
* Each entry names WHY the answer is not final; the note travels into the
|
|
231
|
+
* finding so the author reads the consequence rather than a rule id.
|
|
232
|
+
*
|
|
233
|
+
* Matched on the accessor NAME rather than on a `this.<registry>` property,
|
|
234
|
+
* which is what lets a consumer in another package be seen at all — the CI
|
|
235
|
+
* gate's Rule B is keyed on the two property names the owning class uses, so a
|
|
236
|
+
* caller that reaches the same vocabulary through its public accessor is
|
|
237
|
+
* invisible to it. Keyed lookups that ask about ONE item and dispatch on the
|
|
238
|
+
* answer (`registry.get(type)`, `registry.has(type)`) are deliberately absent:
|
|
239
|
+
* that is how the runtime legitimately resolves work, and reading it as a
|
|
240
|
+
* startup verdict is exactly the false-positive class that gets a rule switched
|
|
241
|
+
* off.
|
|
242
|
+
*/
|
|
243
|
+
declare const OPEN_VOCABULARY_PROBES: ReadonlyMap<string, string>;
|
|
244
|
+
/**
|
|
245
|
+
* Lifecycle phases that run BEFORE the vocabulary can be considered closed, with
|
|
246
|
+
* the reason each one is still open.
|
|
247
|
+
*
|
|
248
|
+
* `start` is the phase this rule exists for. The CI gate stops at `init`, on the
|
|
249
|
+
* sound reasoning that every plugin's `init()` has completed by then — true of
|
|
250
|
+
* the SERVICE registry, and false of an open capability vocabulary: ADR-0018
|
|
251
|
+
* executors are registered from `start()` too, and sibling plugins' `start()`
|
|
252
|
+
* have not all run. That is literally where #4771 sat.
|
|
253
|
+
*/
|
|
254
|
+
declare const PRE_SEAL_PHASES: ReadonlyMap<string, string>;
|
|
255
|
+
/**
|
|
256
|
+
* Identifier fragments whose presence in the scope means the code ASKED whether
|
|
257
|
+
* the vocabulary is closed before judging it — the third sanctioned cure.
|
|
258
|
+
* Matched as a case-insensitive substring of an identifier so
|
|
259
|
+
* `nodeTypeVocabularySealed`, `sealNodeTypeVocabulary` and a host's own
|
|
260
|
+
* `vocabularySeal` all count.
|
|
261
|
+
*/
|
|
262
|
+
declare const SEAL_MARKERS: readonly string[];
|
|
263
|
+
type StartupRegistryVerdictSeverity = 'warning';
|
|
264
|
+
interface StartupRegistryVerdictFinding {
|
|
265
|
+
/** Always `warning` — this rule advises, it never gates (see module note). */
|
|
266
|
+
severity: StartupRegistryVerdictSeverity;
|
|
267
|
+
/** Diagnostic rule id. */
|
|
268
|
+
rule: string;
|
|
269
|
+
/** Human-readable location, e.g. `AutomationServicePlugin.start()`. */
|
|
270
|
+
where: string;
|
|
271
|
+
/** Source path, e.g. `plugin.ts:412`. */
|
|
272
|
+
path: string;
|
|
273
|
+
/** What is wrong. */
|
|
274
|
+
message: string;
|
|
275
|
+
/** How to fix it. */
|
|
276
|
+
hint: string;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* The prescription every finding carries. It names the three cures in the order
|
|
280
|
+
* AGENTS.md ranks them, and each by the change that actually shipped, so the
|
|
281
|
+
* reader can go and read one.
|
|
282
|
+
*
|
|
283
|
+
* It states no verdict of its own about whether the site is broken at runtime —
|
|
284
|
+
* asserting a terminal outcome about a world that has not finished forming is
|
|
285
|
+
* the mistake this rule exists to remove, and a hint that did it would be the
|
|
286
|
+
* defect wearing the rule's own badge.
|
|
287
|
+
*/
|
|
288
|
+
declare const STARTUP_VERDICT_HINT: string;
|
|
289
|
+
interface StartupRegistryVerdictOptions {
|
|
290
|
+
/**
|
|
291
|
+
* Label for the source under check — a path, a package name, whatever the
|
|
292
|
+
* caller can point at. Prefixes every finding's `path`.
|
|
293
|
+
*/
|
|
294
|
+
file?: string;
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Find startup open-vocabulary verdicts in one TypeScript/JavaScript source.
|
|
298
|
+
*
|
|
299
|
+
* Pure: parses, never executes, never type-checks, touches no filesystem. An
|
|
300
|
+
* unparseable source yields no findings rather than throwing — this advises on
|
|
301
|
+
* source someone else owns, and refusing to parse is not a verdict about them.
|
|
302
|
+
*/
|
|
303
|
+
declare function findStartupRegistryVerdicts(source: string, options?: StartupRegistryVerdictOptions): StartupRegistryVerdictFinding[];
|
|
304
|
+
|
|
207
305
|
type ListViewModeSeverity = 'error' | 'warning';
|
|
208
306
|
interface ListViewModeFinding {
|
|
209
307
|
severity: ListViewModeSeverity;
|
|
@@ -216,7 +314,7 @@ interface ListViewModeFinding {
|
|
|
216
314
|
hint: string;
|
|
217
315
|
}
|
|
218
316
|
declare const LIST_VIEW_FILTERS_IN_VIEWS_MODE = "list-view-filters-in-views-mode";
|
|
219
|
-
type AnyRec$
|
|
317
|
+
type AnyRec$D = Record<string, unknown>;
|
|
220
318
|
/**
|
|
221
319
|
* Flag ADR-0047 "views" mode violations on an object's built-in named views or a
|
|
222
320
|
* `defineView` default `list` / named `listViews`: `quickFilters`, or a `tabs`
|
|
@@ -226,7 +324,7 @@ type AnyRec$C = Record<string, unknown>;
|
|
|
226
324
|
*
|
|
227
325
|
* Feed the PRE-parse stack (normalizeStackInput output) — see file header.
|
|
228
326
|
*/
|
|
229
|
-
declare function validateListViewMode(stack: AnyRec$
|
|
327
|
+
declare function validateListViewMode(stack: AnyRec$D): ListViewModeFinding[];
|
|
230
328
|
|
|
231
329
|
type FunctionalCompletenessSeverity = 'error' | 'warning';
|
|
232
330
|
interface FunctionalCompletenessFinding {
|
|
@@ -246,6 +344,37 @@ interface FunctionalCompletenessFinding {
|
|
|
246
344
|
*/
|
|
247
345
|
declare function validateFunctionalCompleteness(stack: unknown): FunctionalCompletenessFinding[];
|
|
248
346
|
|
|
347
|
+
/**
|
|
348
|
+
* Stable diagnostic id. Named for the CONTRADICTION rather than for the strip,
|
|
349
|
+
* because at authoring time nothing has been stripped yet — the declaration is
|
|
350
|
+
* simply advertising something the object cannot honour.
|
|
351
|
+
*/
|
|
352
|
+
declare const MANAGED_API_METHOD_UNAFFORDABLE = "object/managed-api-method-unaffordable";
|
|
353
|
+
interface ManagedApiMethodFinding {
|
|
354
|
+
/**
|
|
355
|
+
* Always `error`. The contradiction is decidable from the object's own
|
|
356
|
+
* declaration — no call graph, no runtime state — and shipping it means the
|
|
357
|
+
* metadata claims an API surface the registry will silently take away.
|
|
358
|
+
*/
|
|
359
|
+
severity: 'error';
|
|
360
|
+
rule: typeof MANAGED_API_METHOD_UNAFFORDABLE;
|
|
361
|
+
/** Human-readable location, e.g. `object "sys_environment"`. */
|
|
362
|
+
where: string;
|
|
363
|
+
/** Config path, e.g. `objects[2].enable.apiMethods`. */
|
|
364
|
+
path: string;
|
|
365
|
+
message: string;
|
|
366
|
+
hint: string;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Walk every object declaration in the stack through the shared
|
|
370
|
+
* managed-affordance predicate.
|
|
371
|
+
*
|
|
372
|
+
* One finding per object, not per verb: an object declaring both `create` and
|
|
373
|
+
* `update` against an all-locked bucket has ONE authoring mistake, and the fix
|
|
374
|
+
* — open the affordances or drop the verbs — is a single edit.
|
|
375
|
+
*/
|
|
376
|
+
declare function validateManagedApiMethods(stack: unknown): ManagedApiMethodFinding[];
|
|
377
|
+
|
|
249
378
|
type FlowTriggerReadinessSeverity = 'error' | 'warning';
|
|
250
379
|
interface FlowTriggerReadinessFinding {
|
|
251
380
|
severity: FlowTriggerReadinessSeverity;
|
|
@@ -287,7 +416,30 @@ declare const FLOW_TIME_RELATIVE_DESCRIPTOR_INVALID = "flow-time-relative-descri
|
|
|
287
416
|
* there is no runtime channel at all for it to be moved earlier from.
|
|
288
417
|
*/
|
|
289
418
|
declare const FLOW_TIME_RELATIVE_DESCRIPTOR_UNROUTABLE = "flow-time-relative-descriptor-unroutable";
|
|
290
|
-
|
|
419
|
+
/**
|
|
420
|
+
* #6637 — a `type: 'record_change'` flow whose start-node `triggerType` the
|
|
421
|
+
* engine routes to NO trigger at all, so the flow is silently demoted to a
|
|
422
|
+
* manual one. Widened by #7215 to also cover the token being ABSENT
|
|
423
|
+
* entirely — the omission shape is exactly as dead at runtime as the
|
|
424
|
+
* contradiction shape this id originally caught, so one id and one severity
|
|
425
|
+
* cover both (see 1f for the history of why the widening waited).
|
|
426
|
+
*
|
|
427
|
+
* A separate id from `flow-trigger-unknown-event`, on the same distinction that
|
|
428
|
+
* separates the two `timeRelative` ids: whether the engine ROUTES the value.
|
|
429
|
+
* The two partition the declared-but-dead tokens and can never both fire on one
|
|
430
|
+
* value, because being `record-`-prefixed is exactly what routes a token:
|
|
431
|
+
*
|
|
432
|
+
* - `record-`-prefixed but off-grammar (`record-after-updated`) — the engine
|
|
433
|
+
* ROUTES it to the record-change trigger, which maps it to zero hook events
|
|
434
|
+
* and says so in a bind-time warn. That is `…-UNKNOWN-EVENT`, and this rule
|
|
435
|
+
* file moves that warn earlier.
|
|
436
|
+
* - anything else (`onCreate`, `on_update`, `''`, `['onCreate']`, or the key
|
|
437
|
+
* absent entirely) — the engine routes it NOWHERE. That is this id, and
|
|
438
|
+
* there is no runtime channel to move earlier from: see 1f for the three
|
|
439
|
+
* call sites that each skip it.
|
|
440
|
+
*/
|
|
441
|
+
declare const FLOW_TRIGGER_UNROUTABLE = "flow-trigger-unroutable";
|
|
442
|
+
type AnyRec$C = Record<string, unknown>;
|
|
291
443
|
/**
|
|
292
444
|
* Validate auto-launched flow trigger wiring against the stack definition.
|
|
293
445
|
*
|
|
@@ -296,7 +448,7 @@ type AnyRec$B = Record<string, unknown>;
|
|
|
296
448
|
* owns the `timeRelative` descriptor's contract, which is the point: the rule
|
|
297
449
|
* ASKS that schema rather than restating it.
|
|
298
450
|
*/
|
|
299
|
-
declare function validateFlowTriggerReadiness(stack: AnyRec$
|
|
451
|
+
declare function validateFlowTriggerReadiness(stack: AnyRec$C): FlowTriggerReadinessFinding[];
|
|
300
452
|
|
|
301
453
|
type FlowTemplatePathSeverity = 'error' | 'warning';
|
|
302
454
|
interface FlowTemplatePathFinding {
|
|
@@ -311,12 +463,13 @@ interface FlowTemplatePathFinding {
|
|
|
311
463
|
}
|
|
312
464
|
declare const FLOW_TEMPLATE_UNKNOWN_FIELD = "flow-template-unknown-field";
|
|
313
465
|
declare const FLOW_TEMPLATE_LOOKUP_TRAVERSAL = "flow-template-lookup-traversal";
|
|
314
|
-
|
|
466
|
+
declare const FLOW_TEMPLATE_FIELD_UNPROVISIONED = "flow-template-field-unprovisioned";
|
|
467
|
+
type AnyRec$B = Record<string, unknown>;
|
|
315
468
|
/**
|
|
316
469
|
* Validate `{record.<path>}` template references across every record-change
|
|
317
470
|
* flow. Pure and dependency-free; safe on pre- or post-parse stacks.
|
|
318
471
|
*/
|
|
319
|
-
declare function validateFlowTemplatePaths(stack: AnyRec$
|
|
472
|
+
declare function validateFlowTemplatePaths(stack: AnyRec$B): FlowTemplatePathFinding[];
|
|
320
473
|
|
|
321
474
|
type ReadonlyFlowWriteSeverity = 'error' | 'warning';
|
|
322
475
|
interface ReadonlyFlowWriteFinding {
|
|
@@ -331,12 +484,12 @@ interface ReadonlyFlowWriteFinding {
|
|
|
331
484
|
}
|
|
332
485
|
declare const FLOW_UPDATE_READONLY_FIELD = "flow-update-readonly-field";
|
|
333
486
|
declare const FLOW_UPDATE_READONLY_WHEN_FIELD = "flow-update-readonly-when-field";
|
|
334
|
-
type AnyRec$
|
|
487
|
+
type AnyRec$A = Record<string, unknown>;
|
|
335
488
|
/**
|
|
336
489
|
* Validate flow `update_record` writes against target-object readonly
|
|
337
490
|
* declarations. Pure and dependency-free; safe on pre- or post-parse stacks.
|
|
338
491
|
*/
|
|
339
|
-
declare function validateReadonlyFlowWrites(stack: AnyRec$
|
|
492
|
+
declare function validateReadonlyFlowWrites(stack: AnyRec$A): ReadonlyFlowWriteFinding[];
|
|
340
493
|
|
|
341
494
|
type ViewContainerSeverity = 'error' | 'warning';
|
|
342
495
|
interface ViewContainerFinding {
|
|
@@ -373,14 +526,14 @@ declare const STYLE_CLASSNAME_TAILWIND = "style-classname-tailwind";
|
|
|
373
526
|
declare const STYLE_RESPONSIVE_NO_BASE = "style-responsive-no-base";
|
|
374
527
|
declare const STYLE_UNKNOWN_CSS_PROPERTY = "style-unknown-css-property";
|
|
375
528
|
declare const STYLE_UNKNOWN_TOKEN = "style-unknown-token";
|
|
376
|
-
type AnyRec$
|
|
529
|
+
type AnyRec$z = Record<string, unknown>;
|
|
377
530
|
/**
|
|
378
531
|
* Validate every page's component tree for SDUI styling correctness (ADR-0065).
|
|
379
532
|
* Returns findings (empty = clean). `error` findings describe styles that are
|
|
380
533
|
* silently dropped and should fail validate/build; `warning` findings are
|
|
381
534
|
* advisory (typos, drift, footguns).
|
|
382
535
|
*/
|
|
383
|
-
declare function validateResponsiveStyles(stack: AnyRec$
|
|
536
|
+
declare function validateResponsiveStyles(stack: AnyRec$z): StyleFinding[];
|
|
384
537
|
|
|
385
538
|
type JsxPageSeverity = 'error' | 'warning';
|
|
386
539
|
interface JsxPageFinding {
|
|
@@ -393,8 +546,8 @@ interface JsxPageFinding {
|
|
|
393
546
|
message: string;
|
|
394
547
|
hint: string;
|
|
395
548
|
}
|
|
396
|
-
type AnyRec$
|
|
397
|
-
declare function validateJsxPages(stack: AnyRec$
|
|
549
|
+
type AnyRec$y = Record<string, unknown>;
|
|
550
|
+
declare function validateJsxPages(stack: AnyRec$y, opts?: {
|
|
398
551
|
manifest?: Manifest;
|
|
399
552
|
}): JsxPageFinding[];
|
|
400
553
|
|
|
@@ -407,8 +560,8 @@ interface ReactPageFinding {
|
|
|
407
560
|
message: string;
|
|
408
561
|
hint: string;
|
|
409
562
|
}
|
|
410
|
-
type AnyRec$
|
|
411
|
-
declare function validateReactPages(stack: AnyRec$
|
|
563
|
+
type AnyRec$x = Record<string, unknown>;
|
|
564
|
+
declare function validateReactPages(stack: AnyRec$x): ReactPageFinding[];
|
|
412
565
|
|
|
413
566
|
type ReactPropSeverity = 'error' | 'warning';
|
|
414
567
|
interface ReactPropFinding {
|
|
@@ -419,13 +572,14 @@ interface ReactPropFinding {
|
|
|
419
572
|
message: string;
|
|
420
573
|
hint: string;
|
|
421
574
|
}
|
|
422
|
-
type AnyRec$
|
|
575
|
+
type AnyRec$w = Record<string, unknown>;
|
|
423
576
|
declare const REACT_CHART_FIELD_UNKNOWN = "react-chart-field-unknown";
|
|
577
|
+
declare const REACT_CHART_FIELD_UNPROVISIONED = "react-chart-field-unprovisioned";
|
|
424
578
|
declare const REACT_CHART_AGGREGATE_INVALID = "react-chart-aggregate-invalid";
|
|
425
579
|
declare const REACT_CHART_AXIS_UNKNOWN = "react-chart-axis-unknown";
|
|
426
580
|
declare const REACT_CHART_DRILLDOWN_INVALID = "react-chart-drilldown-invalid";
|
|
427
581
|
declare const REACT_BLOCK_NEEDS_RECORD_CONTEXT = "react-block-needs-record-context";
|
|
428
|
-
declare function validateReactPageProps(stack: AnyRec$
|
|
582
|
+
declare function validateReactPageProps(stack: AnyRec$w): ReactPropFinding[];
|
|
429
583
|
|
|
430
584
|
type SourceStyleSeverity = 'error' | 'warning';
|
|
431
585
|
interface SourceStyleFinding {
|
|
@@ -437,8 +591,8 @@ interface SourceStyleFinding {
|
|
|
437
591
|
hint: string;
|
|
438
592
|
}
|
|
439
593
|
declare const PAGE_SOURCE_CLASSNAME = "page-source-className-tailwind";
|
|
440
|
-
type AnyRec$
|
|
441
|
-
declare function validatePageSourceStyling(stack: AnyRec$
|
|
594
|
+
type AnyRec$v = Record<string, unknown>;
|
|
595
|
+
declare function validatePageSourceStyling(stack: AnyRec$v): SourceStyleFinding[];
|
|
442
596
|
|
|
443
597
|
/**
|
|
444
598
|
* Build-time record-title diagnostics (ADR-0079).
|
|
@@ -482,19 +636,20 @@ interface RecordTitleFinding {
|
|
|
482
636
|
/** How to fix it. */
|
|
483
637
|
hint: string;
|
|
484
638
|
}
|
|
485
|
-
type AnyRec$
|
|
639
|
+
type AnyRec$u = Record<string, unknown>;
|
|
486
640
|
/**
|
|
487
641
|
* Validate every object's record-title declaration. Returns the list of
|
|
488
642
|
* findings (empty = clean). Both rules are advisory (`warning`): the caller
|
|
489
643
|
* must never fail the build on them alone — auto-provision + the `Record #<id>`
|
|
490
644
|
* floor guarantee a resolvable title at runtime.
|
|
491
645
|
*/
|
|
492
|
-
declare function validateRecordTitle(stack: AnyRec$
|
|
646
|
+
declare function validateRecordTitle(stack: AnyRec$u): RecordTitleFinding[];
|
|
493
647
|
|
|
494
648
|
declare const FIELD_GROUP_UNDECLARED = "field-group-undeclared";
|
|
495
649
|
declare const FIELD_GROUP_EMPTY = "field-group-empty";
|
|
496
650
|
declare const FIELD_GROUP_SHADOWED = "field-group-shadowed";
|
|
497
651
|
declare const SEMANTIC_ROLE_FIELD_UNKNOWN = "semantic-role-field-unknown";
|
|
652
|
+
declare const SEMANTIC_ROLE_FIELD_UNPROVISIONED = "semantic-role-field-unprovisioned";
|
|
498
653
|
type SemanticRoleSeverity = 'error' | 'warning';
|
|
499
654
|
interface SemanticRoleFinding {
|
|
500
655
|
/** Always `warning` today — all three rules are advisory (see module note). */
|
|
@@ -510,38 +665,14 @@ interface SemanticRoleFinding {
|
|
|
510
665
|
/** How to fix it. */
|
|
511
666
|
hint: string;
|
|
512
667
|
}
|
|
513
|
-
type AnyRec$
|
|
668
|
+
type AnyRec$t = Record<string, unknown>;
|
|
514
669
|
/**
|
|
515
670
|
* Validate every object's semantic-role pointers. Returns the list of
|
|
516
671
|
* findings (empty = clean). Advisory only — the caller must never fail the
|
|
517
672
|
* build on these alone.
|
|
518
673
|
*/
|
|
519
|
-
declare function validateSemanticRoles(stack: AnyRec$
|
|
674
|
+
declare function validateSemanticRoles(stack: AnyRec$t): SemanticRoleFinding[];
|
|
520
675
|
|
|
521
|
-
/**
|
|
522
|
-
* Build-time form-layout diagnostics (#2578).
|
|
523
|
-
*
|
|
524
|
-
* Authored form views carry field references and column-layout hints that are
|
|
525
|
-
* Zod-valid but can be silently wrong at render time — the "parsed, unmarked,
|
|
526
|
-
* silently inert" shape ADR-0078 prohibits. This lint catches the two that
|
|
527
|
-
* matter for multi-column, AI-authored forms, uniformly for `os build` /
|
|
528
|
-
* `os validate`, MCP authoring and hand authors (ADR-0019).
|
|
529
|
-
*
|
|
530
|
-
* Both rules are warnings, not errors — nothing is fully broken (an unknown
|
|
531
|
-
* field name is skipped; an over-wide colSpan is clamped) — but each is almost
|
|
532
|
-
* certainly an authoring mistake worth surfacing at author time:
|
|
533
|
-
*
|
|
534
|
-
* - `form-field-unknown` — a section references a field that is not on the
|
|
535
|
-
* form's bound object, so the field silently does not render.
|
|
536
|
-
* - `absolute-colspan-discouraged` — a field uses the absolute `colSpan`. Under
|
|
537
|
-
* a per-surface DERIVED column count (mobile 1 / modal 2 / page 3-4) a fixed
|
|
538
|
-
* span only lines up at the one width the author imagined; the renderer
|
|
539
|
-
* clamps it. The robust primitive is the relative `span: 'full'`.
|
|
540
|
-
*
|
|
541
|
-
* Scope: top-level form `views` (a `sections` array). Forms embedded inside
|
|
542
|
-
* page component trees are a follow-up — the walker deliberately stays shallow
|
|
543
|
-
* so it never guesses at an arbitrary component's object binding.
|
|
544
|
-
*/
|
|
545
676
|
declare const FORM_FIELD_UNKNOWN = "form-field-unknown";
|
|
546
677
|
declare const FORM_COLSPAN_ABSOLUTE = "absolute-colspan-discouraged";
|
|
547
678
|
type FormLayoutSeverity = 'error' | 'warning';
|
|
@@ -550,72 +681,66 @@ interface FormLayoutFinding {
|
|
|
550
681
|
severity: FormLayoutSeverity;
|
|
551
682
|
/** Diagnostic rule id, e.g. `form-field-unknown`. */
|
|
552
683
|
rule: string;
|
|
553
|
-
/** Human-readable location, e.g. `view "contract_form"`. */
|
|
684
|
+
/** Human-readable location, e.g. `view "contract_form" · formViews.create`. */
|
|
554
685
|
where: string;
|
|
555
|
-
/** Config path, e.g. `views[2].sections[0].fields[3]`. */
|
|
686
|
+
/** Config path, e.g. `views[2].formViews.create.sections[0].fields[3]`. */
|
|
556
687
|
path: string;
|
|
557
688
|
/** What is wrong. */
|
|
558
689
|
message: string;
|
|
559
690
|
/** How to fix it. */
|
|
560
691
|
hint: string;
|
|
561
692
|
}
|
|
562
|
-
type AnyRec$
|
|
693
|
+
type AnyRec$s = Record<string, unknown>;
|
|
563
694
|
/**
|
|
564
695
|
* Validate authored form-view layout. Returns findings (empty = clean).
|
|
565
696
|
* Advisory only — the caller must never fail the build on these alone.
|
|
566
697
|
*/
|
|
567
|
-
declare function validateFormLayout(stack: AnyRec$
|
|
568
|
-
|
|
569
|
-
/**
|
|
570
|
-
* Build-time conditional-visibility diagnostics (ADR-0089 D3b).
|
|
571
|
-
*
|
|
572
|
-
* ADR-0089 unifies the conditional-visibility predicate under the single
|
|
573
|
-
* canonical key **`visibleWhen`** across data fields, view form sections/fields,
|
|
574
|
-
* and page components. The deprecated spellings — `visibleOn` (view form) and
|
|
575
|
-
* `visibility` (page component) — stay accepted and are folded into `visibleWhen`
|
|
576
|
-
* at the schema boundary (a zod `.transform()`). Because that fold happens during
|
|
577
|
-
* `parse()`, the aliases are gone from the *parsed* stack — so this rule runs on
|
|
578
|
-
* the **pre-parse** (normalized) stack, exactly like `validate-list-view-mode`,
|
|
579
|
-
* to see what the author actually wrote.
|
|
580
|
-
*
|
|
581
|
-
* Two advisory rules (both `warning` — nothing is broken, the alias still works
|
|
582
|
-
* and a mis-rooted predicate just never matches):
|
|
583
|
-
*
|
|
584
|
-
* - `visibility-alias-deprecated` — a `visibleOn` / `visibility` key in authored
|
|
585
|
-
* source. Autofix intent: rename the key to `visibleWhen` (same value).
|
|
586
|
-
* - `visibility-root-mislayered` — a visibility predicate whose binding root does
|
|
587
|
-
* not match its layer (ADR-0089 D3, §Context). The check is **bidirectional**:
|
|
588
|
-
* - **runtime** view/page surfaces (`*.view.ts` / `*.page.ts`) bind
|
|
589
|
-
* `record` + `current_user` (pages also expose `page.<var>`), so a `data.`-rooted
|
|
590
|
-
* predicate here is a wrong-layer paste that silently never matches; and
|
|
591
|
-
* - **metadata-editing** forms (`*.form.ts` — the row under edit) bind `data`, so
|
|
592
|
-
* a `record.`-rooted predicate there is the same bug in the other direction.
|
|
593
|
-
* The layer is supplied by the caller (`opts.layer`, default `'runtime'`): the
|
|
594
|
-
* app-lint path (`os validate` / `compile`) always lints runtime surfaces, while a
|
|
595
|
-
* file-aware caller linting a `*.form.ts` passes `layer: 'metadata'`.
|
|
596
|
-
*
|
|
597
|
-
* Scope: `views` (form `sections` / legacy `groups`, and their `fields`) and
|
|
598
|
-
* `pages` (`regions[].components[]`). Data-field `visibleWhen` is already covered
|
|
599
|
-
* by `validate-expressions` and is not re-checked here.
|
|
600
|
-
*/
|
|
601
|
-
declare const VISIBILITY_ALIAS_DEPRECATED = "visibility-alias-deprecated";
|
|
698
|
+
declare function validateFormLayout(stack: AnyRec$s): FormLayoutFinding[];
|
|
699
|
+
|
|
602
700
|
declare const VISIBILITY_ROOT_MISLAYERED = "visibility-root-mislayered";
|
|
701
|
+
declare const VISIBILITY_BARE_IDENTIFIER = "visibility-bare-identifier";
|
|
702
|
+
declare const VISIBILITY_PREDICATE_SYNTAX = "visibility-predicate-syntax";
|
|
703
|
+
/**
|
|
704
|
+
* Valid CEL that overruns a `DEFAULT_LIMITS` parse bound (`maxAstNodes` 256,
|
|
705
|
+
* `maxDepth` 32, `maxListElements` 64, …) — #7217. A separate id from
|
|
706
|
+
* {@link VISIBILITY_PREDICATE_SYNTAX} for the reason `rls-predicate-over-budget`
|
|
707
|
+
* is a separate id from `rls-predicate-unparseable` (#6778 / PR #6831): the
|
|
708
|
+
* consequence is identical, the FIX is not, and `--json` consumers key on the id.
|
|
709
|
+
*/
|
|
710
|
+
declare const VISIBILITY_PREDICATE_OVER_BUDGET = "visibility-predicate-over-budget";
|
|
603
711
|
type VisibilitySeverity = 'error' | 'warning';
|
|
604
712
|
/**
|
|
605
713
|
* Which binding environment the linted surface belongs to (ADR-0089 §Context):
|
|
606
714
|
* - `runtime` — `*.view.ts` / `*.page.ts`; binds `record` + `current_user` (+ `page`).
|
|
607
|
-
* - `metadata` —
|
|
715
|
+
* - `metadata` — metadata-editing forms (a `*.form.ts` module, or a form view
|
|
716
|
+
* declaring `data: { provider: 'schema', schemaId }`); binds `data` (the row
|
|
717
|
+
* under edit).
|
|
608
718
|
*/
|
|
609
719
|
type VisibilityLayer = 'runtime' | 'metadata';
|
|
610
720
|
/** Options for {@link validateVisibilityPredicates}. */
|
|
611
721
|
interface VisibilityOptions {
|
|
612
|
-
/**
|
|
722
|
+
/**
|
|
723
|
+
* Binding layer for the sites whose layer the metadata does not state.
|
|
724
|
+
* Defaults to `'runtime'`.
|
|
725
|
+
*
|
|
726
|
+
* A form view that declares `data: { provider: 'schema', schemaId }` DOES
|
|
727
|
+
* state it — the metadata-admin evaluator renders that surface and binds the
|
|
728
|
+
* row under edit as `data` — so such a site is judged at `'metadata'`
|
|
729
|
+
* regardless of this option (#7815; see the module note §Which layer a site is
|
|
730
|
+
* on). Pass `'metadata'` to cover the forms that do not carry that data source
|
|
731
|
+
* either, which is what a file-aware caller linting a `*.form.ts` does.
|
|
732
|
+
*/
|
|
613
733
|
layer?: VisibilityLayer;
|
|
614
734
|
}
|
|
615
735
|
interface VisibilityFinding {
|
|
616
|
-
/**
|
|
736
|
+
/**
|
|
737
|
+
* `warning` for the ADR-0089 D3b advisory (`visibility-root-mislayered`);
|
|
738
|
+
* `error` for the three rules that gate — `visibility-predicate-syntax`,
|
|
739
|
+
* `visibility-predicate-over-budget` and `visibility-bare-identifier` (see
|
|
740
|
+
* module note).
|
|
741
|
+
*/
|
|
617
742
|
severity: VisibilitySeverity;
|
|
618
|
-
/** Diagnostic rule id, e.g. `visibility-
|
|
743
|
+
/** Diagnostic rule id, e.g. `visibility-root-mislayered`. */
|
|
619
744
|
rule: string;
|
|
620
745
|
/** Human-readable location, e.g. `view "contact_form"`. */
|
|
621
746
|
where: string;
|
|
@@ -626,22 +751,104 @@ interface VisibilityFinding {
|
|
|
626
751
|
/** How to fix it. */
|
|
627
752
|
hint: string;
|
|
628
753
|
}
|
|
754
|
+
type AnyRec$r = Record<string, unknown>;
|
|
755
|
+
/**
|
|
756
|
+
* Validate conditional-visibility predicates across authored views and pages.
|
|
757
|
+
*
|
|
758
|
+
* Every rule here judges the predicate's **VALUE**, which survives both the
|
|
759
|
+
* ADR-0087 D2 alias fold and the Zod parse intact — so the registered
|
|
760
|
+
* `normalized` tier sees exactly what a `parsed` one would. (It is registered
|
|
761
|
+
* `normalized` for the tier's surviving reason, not the retired one: a
|
|
762
|
+
* normalized-tier finding still reaches the author when an unrelated schema
|
|
763
|
+
* error elsewhere would have stopped the parse. See `AuthoringRuleInputTier`.)
|
|
764
|
+
*
|
|
765
|
+
* Returns findings (empty = clean). `visibility-root-mislayered` is advisory
|
|
766
|
+
* (`warning`); `visibility-predicate-syntax` (#6253),
|
|
767
|
+
* `visibility-predicate-over-budget` (#7217) and `visibility-bare-identifier`
|
|
768
|
+
* (#6128) are `error` and the caller is expected to fail the build on them.
|
|
769
|
+
*
|
|
770
|
+
* The binding-root check is layer-directional (ADR-0089 D3). A form view that
|
|
771
|
+
* declares `data: { provider: 'schema', schemaId }` is judged at `metadata` on
|
|
772
|
+
* its own say-so (#7815); for every other site pass `opts.layer = 'metadata'`
|
|
773
|
+
* when linting a `*.form.ts` metadata-editing form (so a `record.`-rooted
|
|
774
|
+
* predicate is flagged), or leave it at the `'runtime'` default for `*.view.ts` /
|
|
775
|
+
* `*.page.ts` surfaces (so a `data.`-rooted predicate is flagged). The syntax and
|
|
776
|
+
* bare-identifier checks are layer-agnostic — but the ROOT their hints prescribe
|
|
777
|
+
* is not, which is the second half of what #7815 fixes.
|
|
778
|
+
*/
|
|
779
|
+
declare function validateVisibilityPredicates(stack: AnyRec$r, opts?: VisibilityOptions): VisibilityFinding[];
|
|
780
|
+
|
|
781
|
+
declare const PREDICATE_PATH_UNRESOLVED = "predicate-path-unresolved";
|
|
782
|
+
declare const PREDICATE_PATH_UNROOTED = "predicate-path-unrooted";
|
|
783
|
+
/**
|
|
784
|
+
* A `==` / `!=` RIGHT-hand side that is path-shaped — an unquoted identifier
|
|
785
|
+
* chain (#7659). See the module note's §The right-hand side for the two
|
|
786
|
+
* severities this one id carries and why they are not the same defect.
|
|
787
|
+
*/
|
|
788
|
+
declare const PREDICATE_RHS_PATH_SHAPED = "predicate-rhs-path-shaped";
|
|
789
|
+
/**
|
|
790
|
+
* The two path-RESOLUTION rules always GATE; {@link PREDICATE_RHS_PATH_SHAPED}
|
|
791
|
+
* gates on a dotted chain and is advisory on a bare word — see the module note
|
|
792
|
+
* for why the same shape earns two answers.
|
|
793
|
+
*/
|
|
794
|
+
type PredicatePathSeverity = 'error' | 'warning';
|
|
795
|
+
interface PredicatePathFinding {
|
|
796
|
+
severity: PredicatePathSeverity;
|
|
797
|
+
/** Diagnostic rule id — `predicate-path-unresolved` / `predicate-path-unrooted`. */
|
|
798
|
+
rule: string;
|
|
799
|
+
/** Human-readable location, e.g. `view "object" · schema form "object"`. */
|
|
800
|
+
where: string;
|
|
801
|
+
/** Config path, e.g. `views[0].sections[1].fields[0].fields[21].visibleWhen`. */
|
|
802
|
+
path: string;
|
|
803
|
+
/** What is wrong — always names the unresolvable path. */
|
|
804
|
+
message: string;
|
|
805
|
+
/** How to fix it. */
|
|
806
|
+
hint: string;
|
|
807
|
+
}
|
|
808
|
+
/** Options for {@link validatePredicatePathRefs}. */
|
|
809
|
+
interface PredicatePathOptions {
|
|
810
|
+
/**
|
|
811
|
+
* Schema oracle: `schemaId` → the Zod schema of the row under edit. Defaults
|
|
812
|
+
* to the canonical `getMetadataTypeSchema` registry
|
|
813
|
+
* (`packages/spec/src/kernel/metadata-type-schemas.ts`), which is the same
|
|
814
|
+
* entry `saveMetaItem` validates against — so this rule can never disagree
|
|
815
|
+
* with the parse that judges the saved row. Injectable so a test can pin the
|
|
816
|
+
* traversal against a small schema, and so a future caller holding a richer
|
|
817
|
+
* registry (runtime `/meta/types`, a package-declared type) can supply it
|
|
818
|
+
* without this file growing a second lookup path.
|
|
819
|
+
*/
|
|
820
|
+
resolveSchema?: (schemaId: string) => unknown;
|
|
821
|
+
}
|
|
629
822
|
type AnyRec$q = Record<string, unknown>;
|
|
630
823
|
/**
|
|
631
|
-
*
|
|
824
|
+
* Refuse a metadata-form predicate that names a path the target schema does not
|
|
825
|
+
* declare (#7010).
|
|
826
|
+
*
|
|
827
|
+
* Walks `views[]` through the shared {@link formViewSites} ladder — the entry
|
|
828
|
+
* itself (the bare `defineForm` shape every `*.form.ts` uses), the container's
|
|
829
|
+
* default `form`, and each `formViews.<key>` — and judges only the sites whose
|
|
830
|
+
* data source is `{ provider: 'schema', schemaId }`, resolving `schemaId`
|
|
831
|
+
* through `opts.resolveSchema` (the canonical metadata-type registry by
|
|
832
|
+
* default). A site bound to an ObjectQL object, or naming a `schemaId` no schema
|
|
833
|
+
* resolves, is skipped: see the module note for why the `record.*` layer is out
|
|
834
|
+
* of scope rather than merely unimplemented.
|
|
835
|
+
*
|
|
836
|
+
* Both path-resolution rules emit `error` and the caller is expected to fail the
|
|
837
|
+
* build on them. The corpus measurement behind that severity is on the PR for
|
|
838
|
+
* #7010: over the shipped `METADATA_FORM_REGISTRY` (17 forms, 46 predicates) the
|
|
839
|
+
* count is **0** for both, and 16 for `predicate-path-unrooted` once #6254's
|
|
840
|
+
* pre-fix `object.form.ts` is restored.
|
|
841
|
+
*
|
|
842
|
+
* The third rule, `predicate-rhs-path-shaped` (#7659), asks a different question
|
|
843
|
+
* about the same predicates — whether a `==` / `!=` RIGHT-hand side is
|
|
844
|
+
* path-shaped, which the renderer parses as a literal — and carries two
|
|
845
|
+
* severities: `error` on a dotted chain, `warning` on a bare word. Its corpus
|
|
846
|
+
* count over the same shipped forms is **0** at both severities. See the module
|
|
847
|
+
* note.
|
|
632
848
|
*
|
|
633
|
-
*
|
|
634
|
-
* `visibleOn` / `visibility` aliases before the schema folds them into
|
|
635
|
-
* `visibleWhen`. Returns findings (empty = clean); all advisory (`warning`) —
|
|
636
|
-
* the caller must never fail the build on these alone.
|
|
637
|
-
*
|
|
638
|
-
* The binding-root check is layer-directional (ADR-0089 D3): pass
|
|
639
|
-
* `opts.layer = 'metadata'` when linting a `*.form.ts` metadata-editing form (so a
|
|
640
|
-
* `record.`-rooted predicate is flagged), or leave it at the `'runtime'` default for
|
|
641
|
-
* `*.view.ts` / `*.page.ts` surfaces (so a `data.`-rooted predicate is flagged). The
|
|
642
|
-
* alias-deprecated check is layer-agnostic.
|
|
849
|
+
* Returns findings (empty = clean).
|
|
643
850
|
*/
|
|
644
|
-
declare function
|
|
851
|
+
declare function validatePredicatePathRefs(stack: AnyRec$q, opts?: PredicatePathOptions): PredicatePathFinding[];
|
|
645
852
|
|
|
646
853
|
declare const CAPABILITY_REFERENCE_UNKNOWN = "capability-reference-unknown";
|
|
647
854
|
type CapabilityRefSeverity = 'error' | 'warning';
|
|
@@ -760,6 +967,7 @@ declare const SECURITY_MASTER_DETAIL_UNGRANTED = "security-master-detail-ungrant
|
|
|
760
967
|
declare const SECURITY_FLS_UNQUALIFIED_KEY = "security-fls-unqualified-key";
|
|
761
968
|
declare const SECURITY_GRANT_EXPIRED_AT_AUTHORING = "security-grant-expired-at-authoring";
|
|
762
969
|
declare const SECURITY_DELEGATION_MISSING_REASON = "security-delegation-missing-reason";
|
|
970
|
+
declare const SECURITY_CBP_NO_RELATION = "security-controlled-by-parent-no-relation";
|
|
763
971
|
type SecuritySeverity = 'error' | 'warning' | 'info';
|
|
764
972
|
interface SecurityFinding {
|
|
765
973
|
severity: SecuritySeverity;
|
|
@@ -785,6 +993,35 @@ type AnyRec$l = Record<string, unknown>;
|
|
|
785
993
|
declare function validateSecurityPosture(stack: AnyRec$l, opts?: {
|
|
786
994
|
nowMs?: number;
|
|
787
995
|
}): SecurityFinding[];
|
|
996
|
+
/**
|
|
997
|
+
* [ADR-0090 D3] The `security-role-word` vocabulary freeze, as its own rule.
|
|
998
|
+
*
|
|
999
|
+
* Scope: security-relevant identifiers/labels across SIX collections — objects
|
|
1000
|
+
* (names, field names, action names), permission sets, positions, apps, books.
|
|
1001
|
+
* Pages/views/components are NOT scanned — `role` there is HTML/ARIA
|
|
1002
|
+
* semantics, not permission vocabulary. The sole platform exception
|
|
1003
|
+
* (better-auth `sys_member.role`) is a system object, which app stacks never
|
|
1004
|
+
* author. Books entered the security-relevant set when `book.audience` became
|
|
1005
|
+
* a permission-model reference (ADR-0046 §6.7 / ADR-0090).
|
|
1006
|
+
*
|
|
1007
|
+
* ## Why this is a separate function from {@link validateSecurityPosture}
|
|
1008
|
+
*
|
|
1009
|
+
* [#8310] Not taste — a surface boundary. When the rest of the D7 block
|
|
1010
|
+
* crossed onto the runtime publish surface (`runtimeTypes: ['seed',
|
|
1011
|
+
* 'permission', 'book']` — `object` measured dirty and is escalated, see the
|
|
1012
|
+
* registry comment), this rule could not go with it: the per-write snapshot
|
|
1013
|
+
* (`runtime-gate.ts`) neither carries nor maps `positions` / `apps`, both of
|
|
1014
|
+
* which are `allowRuntimeCreate: true` — so wiring it through the shared
|
|
1015
|
+
* entry would have enforced ONE rule id for a strict subset of its six
|
|
1016
|
+
* collections. That is the #7220 failure shape (a door that refuses a
|
|
1017
|
+
* permission set named `role_manager` while a position named `sales_role`
|
|
1018
|
+
* walks through), and
|
|
1019
|
+
* the registry refuses to build it in either direction. The rule therefore
|
|
1020
|
+
* stays behind WHOLE, on its own CLI-only registry entry, until the snapshot
|
|
1021
|
+
* carries `positions`/`apps` and both types are gated — at which point it
|
|
1022
|
+
* crosses whole, in one edit, as its own entry.
|
|
1023
|
+
*/
|
|
1024
|
+
declare function validateSecurityRoleWord(stack: AnyRec$l): SecurityFinding[];
|
|
788
1025
|
|
|
789
1026
|
/**
|
|
790
1027
|
* [ADR-0105 D6] The two organization-axis red lines, enforced at authoring time.
|
|
@@ -923,6 +1160,8 @@ declare function validateSharingRuleEnforceability(stack: unknown): SharingRuleE
|
|
|
923
1160
|
declare const RLS_PREDICATE_UNENFORCEABLE = "rls-predicate-unenforceable";
|
|
924
1161
|
/** A predicate that does not parse as CEL even after the legacy SQL bridge. */
|
|
925
1162
|
declare const RLS_PREDICATE_UNPARSEABLE = "rls-predicate-unparseable";
|
|
1163
|
+
/** Valid CEL that overruns a platform parse bound (`maxAstNodes`, `maxDepth`, …). */
|
|
1164
|
+
declare const RLS_PREDICATE_OVER_BUDGET = "rls-predicate-over-budget";
|
|
926
1165
|
type RlsPredicateSeverity = 'error' | 'warning';
|
|
927
1166
|
interface RlsPredicateFinding {
|
|
928
1167
|
severity: RlsPredicateSeverity;
|
|
@@ -1086,13 +1325,16 @@ declare function validateDashboardActionRefs(stack: AnyRec$k): DashboardActionRe
|
|
|
1086
1325
|
*
|
|
1087
1326
|
* ## Scope — filter subtrees only
|
|
1088
1327
|
*
|
|
1089
|
-
*
|
|
1090
|
-
*
|
|
1091
|
-
*
|
|
1092
|
-
* `
|
|
1093
|
-
*
|
|
1094
|
-
*
|
|
1095
|
-
*
|
|
1328
|
+
* Finding those subtrees is `filter-walk.ts`'s job since #5330 gave the same
|
|
1329
|
+
* traversal a second consumer; this file owns only the judgement on the strings
|
|
1330
|
+
* inside them. The shared walk descends into `filter` / `filters` /
|
|
1331
|
+
* `runtimeFilter` and deliberately does NOT check navigation `recordId` /
|
|
1332
|
+
* `params`, which resolve an additional vocabulary — `AppContextSelector` ids
|
|
1333
|
+
* such as `{active_package}` — that is meaningless in a filter because filters
|
|
1334
|
+
* are not evaluated with the sidebar's selector state. Restricting the walk
|
|
1335
|
+
* keeps that legitimate usage out of the rule and holds false positives at
|
|
1336
|
+
* zero. The seven surfaces below stay THIS rule's declaration, not the walk's:
|
|
1337
|
+
* a shared surface list would let another rule's widening land here silently.
|
|
1096
1338
|
*
|
|
1097
1339
|
* Only whole-string placeholders are considered (`'{token}'` / `'${token}'`,
|
|
1098
1340
|
* anchored). A value that merely contains braces is left alone.
|
|
@@ -1122,6 +1364,35 @@ interface FilterTokenFinding {
|
|
|
1122
1364
|
*/
|
|
1123
1365
|
declare function validateFilterTokens(stack: Record<string, unknown> | undefined | null): FilterTokenFinding[];
|
|
1124
1366
|
|
|
1367
|
+
/** A literal `$and: []` / `$or: []` / `$not: {}` — a combinator with no operands. */
|
|
1368
|
+
declare const FILTER_EMPTY_COMBINATOR = "filter-empty-combinator";
|
|
1369
|
+
/** A literal `{}` where a filter node is authored — the whole filter, or a branch. */
|
|
1370
|
+
declare const FILTER_EMPTY_NODE = "filter-empty-node";
|
|
1371
|
+
type EmptyCombinatorSeverity = 'error' | 'warning';
|
|
1372
|
+
interface EmptyCombinatorFinding {
|
|
1373
|
+
/** Always `error` — see the severity note in this module's header. */
|
|
1374
|
+
severity: EmptyCombinatorSeverity;
|
|
1375
|
+
/** Diagnostic rule id (`filter-empty-combinator` / `filter-empty-node`). */
|
|
1376
|
+
rule: string;
|
|
1377
|
+
/** Human-readable location, e.g. `dashboard "sales" · widget "my_deals"`. */
|
|
1378
|
+
where: string;
|
|
1379
|
+
/** Config path, e.g. `dashboards[0].widgets[2].filter.$or`. */
|
|
1380
|
+
path: string;
|
|
1381
|
+
/** What is wrong. */
|
|
1382
|
+
message: string;
|
|
1383
|
+
/** How to fix it. */
|
|
1384
|
+
hint: string;
|
|
1385
|
+
}
|
|
1386
|
+
/**
|
|
1387
|
+
* Reject literal empty combinators across an authored stack.
|
|
1388
|
+
*
|
|
1389
|
+
* Pure `(stack) => Finding[]`; no I/O. Tolerates both authoring tiers — a
|
|
1390
|
+
* filter subtree survives the Zod parse unchanged, and no filter key in the
|
|
1391
|
+
* spec carries a `.default({})`, so a `{}` seen here was authored, never filled
|
|
1392
|
+
* in by a schema.
|
|
1393
|
+
*/
|
|
1394
|
+
declare function validateEmptyCombinators(stack: Record<string, unknown> | undefined | null): EmptyCombinatorFinding[];
|
|
1395
|
+
|
|
1125
1396
|
declare const OBJECT_REFERENCE_UNKNOWN = "object-reference-unknown";
|
|
1126
1397
|
declare const OBJECT_REFERENCE_UNREGISTERED_PLATFORM = "object-reference-unregistered-platform";
|
|
1127
1398
|
type ObjectRefSeverity = 'error' | 'warning';
|
|
@@ -1248,6 +1519,11 @@ type NavTargetRefFinding = ReferenceIntegrityFinding;
|
|
|
1248
1519
|
declare const NAV_TARGET_UNRESOLVED = "nav-target-unresolved";
|
|
1249
1520
|
declare function validateNavTargetRefs(stack: unknown): NavTargetRefFinding[];
|
|
1250
1521
|
|
|
1522
|
+
type NavObjectServabilityFinding = ReferenceIntegrityFinding;
|
|
1523
|
+
/** Emitted when a nav entry targets an object whose `enable` block cannot serve a list. */
|
|
1524
|
+
declare const NAV_OBJECT_UNSERVABLE = "nav-object-unservable";
|
|
1525
|
+
declare function validateNavObjectServability(stack: unknown): NavObjectServabilityFinding[];
|
|
1526
|
+
|
|
1251
1527
|
/**
|
|
1252
1528
|
* [ADR-0061 — searchable set] `searchableFields` entries must name a field the
|
|
1253
1529
|
* object actually has — and, on a list view, one the runtime will agree to scan.
|
|
@@ -1308,12 +1584,25 @@ declare function validateNavTargetRefs(stack: unknown): NavTargetRefFinding[];
|
|
|
1308
1584
|
* linter, gate and engine cannot drift apart (the same one-source move
|
|
1309
1585
|
* #4254 made between gate and engine).
|
|
1310
1586
|
*
|
|
1311
|
-
*
|
|
1312
|
-
*
|
|
1313
|
-
*
|
|
1314
|
-
*
|
|
1315
|
-
*
|
|
1316
|
-
*
|
|
1587
|
+
* 3. VIRTUALITY, on EVERY surface — the object's own set included
|
|
1588
|
+
* (`searchable-field-unsearchable`, #6674): a `formula` entry names a real
|
|
1589
|
+
* field, so check 1 passes it, and the runtime's declared branch admitted
|
|
1590
|
+
* it verbatim — but the value is computed on read with no stored column, so
|
|
1591
|
+
* the scan looks at nothing. Measured 0 rows on driver-memory and 0 rows
|
|
1592
|
+
* WITH NO ERROR on driver-sql. Since #6674 the spec resolution drops such
|
|
1593
|
+
* an entry and both enforcement faces refuse it by name.
|
|
1594
|
+
*
|
|
1595
|
+
* The OBJECT's own `searchableFields` stays existence-only OTHERWISE, and the
|
|
1596
|
+
* dividing line is STORAGE, not search quality: the runtime's declared branch
|
|
1597
|
+
* filters by existence and scannability, never by type taste, so a json or
|
|
1598
|
+
* lookup column declared THERE is a choice the engine executes (a `$contains`
|
|
1599
|
+
* over the stored JSON text / the stored foreign key) — narrow, rarely useful,
|
|
1600
|
+
* but a scan that CAN match, so it is neither a 400 nor a finding. Flagging
|
|
1601
|
+
* those would reject metadata the runtime accepts — the false finding that
|
|
1602
|
+
* makes authors stop trusting the linter (ADR-0072 D1). A virtual entry is the
|
|
1603
|
+
* opposite case: no column exists on any driver, so admitting it is the
|
|
1604
|
+
* fail-open #4254 closed one axis over, surviving on the known-but-virtual
|
|
1605
|
+
* axis.
|
|
1317
1606
|
*
|
|
1318
1607
|
* Three skips keep false positives near zero (ADR-0072 D1):
|
|
1319
1608
|
*
|
|
@@ -1360,8 +1649,9 @@ interface SearchableFieldFinding {
|
|
|
1360
1649
|
* Which runtime judgment applies to the declaration being checked:
|
|
1361
1650
|
*
|
|
1362
1651
|
* - `'canonical'` — the object's own `searchableFields`. The runtime honors
|
|
1363
|
-
* any entry that exists (existence-
|
|
1364
|
-
* existence
|
|
1652
|
+
* any entry that exists and has a stored column to scan (existence- and
|
|
1653
|
+
* scannability-filtered, never type-filtered), so existence and virtuality
|
|
1654
|
+
* are checked and nothing else (#6674).
|
|
1365
1655
|
* - `'narrowing'` — a list view's `searchableFields` (metadata or react
|
|
1366
1656
|
* surface). Clients echo it as the `$searchFields` override, which the
|
|
1367
1657
|
* #4254 ingress gate intersects with the object's allowed set — entries the
|
|
@@ -1556,11 +1846,14 @@ declare function walkPageComponents(page: AnyRec$f, pagePath: string): WalkedCom
|
|
|
1556
1846
|
* authored in the wild. The table below names the field-bearing props
|
|
1557
1847
|
* explicitly; an unknown component type is SKIPPED silently, never flagged.
|
|
1558
1848
|
*
|
|
1559
|
-
* The table also
|
|
1560
|
-
* pages authored anyway (
|
|
1561
|
-
* `record
|
|
1562
|
-
*
|
|
1563
|
-
*
|
|
1849
|
+
* The table once also covered shapes the props schemas did not describe but
|
|
1850
|
+
* real pages authored anyway (`record:details` `sections[].fields[]` /
|
|
1851
|
+
* `hideFields[]`, the record picker's `labelField`). #5611 and #5775 settled
|
|
1852
|
+
* those the other way — the delivered shape got declared — so today every prop
|
|
1853
|
+
* this table names is a live (non-retired) key on its `ComponentPropsMap`
|
|
1854
|
+
* schema, and `component-field-specs-liveness.test.ts` pins that: a future
|
|
1855
|
+
* retirement that forgets this table turns that test red instead of leaving a
|
|
1856
|
+
* tombstoned key listed here as if it were still-valid spelling (#6629).
|
|
1564
1857
|
*
|
|
1565
1858
|
* ── Shared with the react page surface ──────────────────────────────────
|
|
1566
1859
|
*
|
|
@@ -1575,6 +1868,17 @@ declare function walkPageComponents(page: AnyRec$f, pagePath: string): WalkedCom
|
|
|
1575
1868
|
* drift #4330 had just finished removing from the system-field lists.
|
|
1576
1869
|
*/
|
|
1577
1870
|
declare const PAGE_FIELD_UNKNOWN = "page-field-unknown";
|
|
1871
|
+
/**
|
|
1872
|
+
* [#8340] The reference RESOLVES to a registry-injected system column — so
|
|
1873
|
+
* {@link PAGE_FIELD_UNKNOWN} is right to stay silent — but the bound object is
|
|
1874
|
+
* ADR-0015 `external`, where the platform registers the anchor and provisions
|
|
1875
|
+
* no storage behind it. Always `warning`, on both consequences and including
|
|
1876
|
+
* the `queried` one that gates for a genuinely missing column: the existence
|
|
1877
|
+
* question has a closed oracle here and the provenance question does not (this
|
|
1878
|
+
* pass cannot see the remote schema, only that the platform stores nothing) —
|
|
1879
|
+
* #8116's severity reasoning, unchanged.
|
|
1880
|
+
*/
|
|
1881
|
+
declare const PAGE_FIELD_UNPROVISIONED = "page-field-unprovisioned";
|
|
1578
1882
|
type PageFieldSeverity = 'error' | 'warning';
|
|
1579
1883
|
interface PageFieldFinding {
|
|
1580
1884
|
/**
|
|
@@ -1945,8 +2249,26 @@ declare function validateAiToolReferences(stack: AnyRec$9): AiToolRefFinding[];
|
|
|
1945
2249
|
* that names the runtime consequence is honest for both readers; the runtime
|
|
1946
2250
|
* is what actually gates. Deliberately NOT a Zod refine — an existing stack
|
|
1947
2251
|
* must keep parsing (ADR-0078 non-goal #1).
|
|
2252
|
+
*
|
|
2253
|
+
* ## The value half (issue #6041)
|
|
2254
|
+
*
|
|
2255
|
+
* The rule above catches a stack that *declares* a withdrawn agent record.
|
|
2256
|
+
* It never looked at `app.defaultAgent` — a plain
|
|
2257
|
+
* `SnakeCaseIdentifierSchema` string, so any snake_case value parses, builds,
|
|
2258
|
+
* and passes `os:check` even when it names nothing the runtime will ever
|
|
2259
|
+
* resolve. #5985 measured the blind spot directly: replaying the bad example
|
|
2260
|
+
* `defaultAgent: 'sales_copilot'` left `check:skill-examples` at 208 green,
|
|
2261
|
+
* EXIT=0. `app.defaultAgent` silently falls back to the platform default at
|
|
2262
|
+
* runtime (ADR-0063 §1) instead of crashing, which is why this limb is
|
|
2263
|
+
* **warning**, not error, same as the rule above — the maintainer ruling on
|
|
2264
|
+
* #6041 (2026-08-07, reaffirmed 2026-08-09) is option A: add the value check
|
|
2265
|
+
* at warning tier, reusing `PLATFORM_AGENT_NAMES` rather than narrowing the
|
|
2266
|
+
* schema to an enum (a breaking authoring change ADR-0063 already walked
|
|
2267
|
+
* back once).
|
|
1948
2268
|
*/
|
|
1949
2269
|
declare const AGENT_AUTHORING_WITHDRAWN = "agent-authoring-withdrawn";
|
|
2270
|
+
/** `app.defaultAgent` names something outside the platform agent roster. */
|
|
2271
|
+
declare const DEFAULT_AGENT_OUTSIDE_ROSTER = "default-agent-outside-roster";
|
|
1950
2272
|
type AiAgentAuthoringSeverity = 'error' | 'warning';
|
|
1951
2273
|
interface AiAgentAuthoringFinding {
|
|
1952
2274
|
/** Always `warning` — the runtime is the gate; this is the authoring-time signal. */
|
|
@@ -2176,12 +2498,12 @@ declare function validateFlowNodeWrites(stack: AnyRec$5): FlowNodeWriteFinding[]
|
|
|
2176
2498
|
|
|
2177
2499
|
type AnyRec$4 = Record<string, unknown>;
|
|
2178
2500
|
/** Build the sorted access matrix for a normalized stack. */
|
|
2179
|
-
declare function buildAccessMatrix(stack: AnyRec$4):
|
|
2501
|
+
declare function buildAccessMatrix(stack: AnyRec$4): AccessMatrixParsed;
|
|
2180
2502
|
/**
|
|
2181
2503
|
* Semantic diff between two matrices — human-review lines, empty = identical.
|
|
2182
2504
|
* Ordered: removals, additions, then per-entry bit/scope changes.
|
|
2183
2505
|
*/
|
|
2184
|
-
declare function diffAccessMatrix(before:
|
|
2506
|
+
declare function diffAccessMatrix(before: AccessMatrixParsed, after: AccessMatrixParsed): string[];
|
|
2185
2507
|
|
|
2186
2508
|
interface FlowLintFinding {
|
|
2187
2509
|
where: string;
|
|
@@ -2344,6 +2666,8 @@ declare const UNIQUE_LEGACY_ORGANIZATION_COMPOSITE = "unique/legacy-organization
|
|
|
2344
2666
|
* 17.x: warning. Protocol 18 rejects the spelling at validate/publish (#5082).
|
|
2345
2667
|
* Advisory — never fails a build in 17.x.
|
|
2346
2668
|
*
|
|
2669
|
+
* Concrete harm: #8323 measured the cross-tenant 409-vs-201 oracle end to end.
|
|
2670
|
+
*
|
|
2347
2671
|
* Wiring: own AUTHORING_RULES entry (validate/build), and `lintDataModel`
|
|
2348
2672
|
* calls it for `os lint` — each command reports each finding exactly once.
|
|
2349
2673
|
*/
|
|
@@ -2412,4 +2736,4 @@ declare function lintLegacyOrganizationComposites(objects: any[]): LintIssue[];
|
|
|
2412
2736
|
*/
|
|
2413
2737
|
declare function lintDataModel(objects: any[]): LintIssue[];
|
|
2414
2738
|
|
|
2415
|
-
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, type DashboardActionRefFinding, type DashboardActionRefSeverity, type ExprIssue, type ExtractedHookBodyWrite, type ExtractedHookBodyWriteSet, FIELD_GROUP_EMPTY, FIELD_GROUP_SHADOWED, FIELD_GROUP_UNDECLARED, 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_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, ORG_AXIS_CROSS_ORG_BU_GRANT, ORG_AXIS_PERMISSION_INHERITANCE, type ObjectRefFinding, type ObjectRefSeverity, type OrgAxisFinding, type OrgAxisSeverity, PAGE_FIELD_UNKNOWN, PAGE_SOURCE_CLASSNAME, type PageFieldFinding, type PageFieldSeverity, 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_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, 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, 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 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_ALIAS_DEPRECATED, 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, findUnguardedNullableOperands, isSourceAuthoredPage, lintAutonumberFormats, lintDataModel, lintFlowPatterns, lintLegacyOrganizationComposites, lintLivenessProperties, lintUniqueDeclarations, lintUnscopedDeclaredIndexes, lintViewRefs, nearestRegisteredFormat, nullGuardMessage, validateActionBodyWrites, validateActionLocations, validateActionNameRefs, validateAiAgentAuthoring, validateAiSurfaceAffinity, validateAiToolReferences, validateApprovalApprovers, validateCapabilityReferences, validateChartBindings, validateComponentProps, validateDashboardActionRefs, validateFilterTokens, validateFlowNodeWrites, validateFlowTemplatePaths, validateFlowTriggerReadiness, validateFormLayout, validateFunctionalCompleteness, validateHookBodyWrites, validateJsxPages, validateListViewMode, validateNavAccess, validateNavTargetRefs, validateObjectReferences, validateOrgAxisRedLines, validatePageFieldBindings, validatePageSourceStyling, validateReactPageProps, validateReactPages, validateReadonlyFlowWrites, validateRecordTitle, validateReferenceIntegrity, validateResponsiveStyles, validateRlsPredicateEnforceability, validateRuleCompilability, validateRuleSchemaFormats, validateSearchableFields, validateSecurityPosture, validateSeedReplaySafety, validateSeedStateMachine, validateSemanticRoles, validateSharingRuleEnforceability, validateStackExpressions, validateTranslatableSections, validateTranslationReferences, validateViewContainers, validateVisibilityPredicates, validateWidgetBindings, walkPageComponents };
|
|
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 };
|