@lovrozagar/oat 0.10.0 → 0.12.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/README.md +25 -2006
- package/dist/cli.js +283 -59
- package/dist/config/define-config.d.ts +8 -0
- package/dist/config/define-config.d.ts.map +1 -1
- package/dist/config/define-config.js.map +1 -1
- package/dist/config/validate.d.ts +12 -0
- package/dist/config/validate.d.ts.map +1 -0
- package/dist/config/validate.js +86 -0
- package/dist/config/validate.js.map +1 -0
- package/dist/conformance/effects.d.ts +9 -0
- package/dist/conformance/effects.d.ts.map +1 -0
- package/dist/conformance/effects.js +276 -0
- package/dist/conformance/effects.js.map +1 -0
- package/dist/conformance/expected-failures.d.ts +18 -0
- package/dist/conformance/expected-failures.d.ts.map +1 -0
- package/dist/conformance/expected-failures.js +48 -0
- package/dist/conformance/expected-failures.js.map +1 -0
- package/dist/conformance/feature-gate.d.ts +7 -0
- package/dist/conformance/feature-gate.d.ts.map +1 -0
- package/dist/conformance/feature-gate.js +428 -0
- package/dist/conformance/feature-gate.js.map +1 -0
- package/dist/conformance/fuzz.d.ts +108 -0
- package/dist/conformance/fuzz.d.ts.map +1 -0
- package/dist/conformance/fuzz.js +246 -0
- package/dist/conformance/fuzz.js.map +1 -0
- package/dist/conformance/leaks.d.ts +10 -0
- package/dist/conformance/leaks.d.ts.map +1 -0
- package/dist/conformance/leaks.js +23 -0
- package/dist/conformance/leaks.js.map +1 -0
- package/dist/conformance/pool.d.ts +49 -0
- package/dist/conformance/pool.d.ts.map +1 -0
- package/dist/conformance/pool.js +75 -0
- package/dist/conformance/pool.js.map +1 -0
- package/dist/conformance/rate-limit.d.ts +7 -0
- package/dist/conformance/rate-limit.d.ts.map +1 -0
- package/dist/conformance/rate-limit.js +372 -0
- package/dist/conformance/rate-limit.js.map +1 -0
- package/dist/conformance/scope.d.ts +15 -0
- package/dist/conformance/scope.d.ts.map +1 -0
- package/dist/conformance/scope.js +78 -0
- package/dist/conformance/scope.js.map +1 -0
- package/dist/conformance/seed-contract.d.ts +11 -0
- package/dist/conformance/seed-contract.d.ts.map +1 -0
- package/dist/conformance/seed-contract.js +680 -0
- package/dist/conformance/seed-contract.js.map +1 -0
- package/dist/conformance/shapes.d.ts +35 -0
- package/dist/conformance/shapes.d.ts.map +1 -0
- package/dist/conformance/shapes.js +162 -0
- package/dist/conformance/shapes.js.map +1 -0
- package/dist/conformance/specs.d.ts +21 -0
- package/dist/conformance/specs.d.ts.map +1 -0
- package/dist/conformance/specs.js +306 -0
- package/dist/conformance/specs.js.map +1 -0
- package/dist/conformance/suite.d.ts +209 -0
- package/dist/conformance/suite.d.ts.map +1 -0
- package/dist/conformance/suite.js +1538 -0
- package/dist/conformance/suite.js.map +1 -0
- package/dist/conformance/unique.d.ts +7 -0
- package/dist/conformance/unique.d.ts.map +1 -0
- package/dist/conformance/unique.js +586 -0
- package/dist/conformance/unique.js.map +1 -0
- package/dist/conformance/worker.d.ts +3 -0
- package/dist/conformance/worker.d.ts.map +1 -0
- package/dist/conformance/worker.js +27 -0
- package/dist/conformance/worker.js.map +1 -0
- package/dist/index.d.ts +8 -3
- package/dist/index.js +5 -2
- package/dist/reference/defects.d.ts +71 -1
- package/dist/reference/defects.d.ts.map +1 -1
- package/dist/reference/defects.js +74 -8
- package/dist/reference/defects.js.map +1 -1
- package/dist/reference/dialect.d.ts +6 -4
- package/dist/reference/dialect.d.ts.map +1 -1
- package/dist/reference/dialect.js +1 -0
- package/dist/reference/dialect.js.map +1 -1
- package/dist/reference/http.d.ts +17 -25
- package/dist/reference/http.d.ts.map +1 -1
- package/dist/reference/http.js +574 -224
- package/dist/reference/http.js.map +1 -1
- package/dist/reference/listing.d.ts +51 -0
- package/dist/reference/listing.d.ts.map +1 -0
- package/dist/reference/listing.js +256 -0
- package/dist/reference/listing.js.map +1 -0
- package/dist/reference/model.d.ts +35 -1
- package/dist/reference/model.d.ts.map +1 -1
- package/dist/reference/model.js +42 -0
- package/dist/reference/model.js.map +1 -1
- package/dist/reference/query.d.ts +132 -43
- package/dist/reference/query.d.ts.map +1 -1
- package/dist/reference/query.js +397 -315
- package/dist/reference/query.js.map +1 -1
- package/dist/reference/shapes.d.ts +60 -0
- package/dist/reference/shapes.d.ts.map +1 -0
- package/dist/reference/shapes.js +142 -0
- package/dist/reference/shapes.js.map +1 -0
- package/dist/reference/spec.d.ts +9 -2
- package/dist/reference/spec.d.ts.map +1 -1
- package/dist/reference/spec.js +291 -71
- package/dist/reference/spec.js.map +1 -1
- package/dist/reference/store-api.d.ts +14 -43
- package/dist/reference/store-api.d.ts.map +1 -1
- package/dist/reference/store-api.js +8 -58
- package/dist/reference/store-api.js.map +1 -1
- package/dist/reference/stores/memory.d.ts +12 -15
- package/dist/reference/stores/memory.d.ts.map +1 -1
- package/dist/reference/stores/memory.js +22 -70
- package/dist/reference/stores/memory.js.map +1 -1
- package/dist/reference/stores/postgres.d.ts +11 -23
- package/dist/reference/stores/postgres.d.ts.map +1 -1
- package/dist/reference/stores/postgres.js +53 -334
- package/dist/reference/stores/postgres.js.map +1 -1
- package/dist/reference/stores/sql-compile.d.ts +36 -0
- package/dist/reference/stores/sql-compile.d.ts.map +1 -0
- package/dist/reference/stores/sql-compile.js +95 -0
- package/dist/reference/stores/sql-compile.js.map +1 -0
- package/dist/reference/stores/sqlite.d.ts +12 -27
- package/dist/reference/stores/sqlite.d.ts.map +1 -1
- package/dist/reference/stores/sqlite.js +54 -355
- package/dist/reference/stores/sqlite.js.map +1 -1
- package/dist/report/console.d.ts.map +1 -1
- package/dist/report/console.js +23 -9
- package/dist/report/console.js.map +1 -1
- package/dist/report/matrix.d.ts +2 -0
- package/dist/report/matrix.d.ts.map +1 -1
- package/dist/report/matrix.js +63 -10
- package/dist/report/matrix.js.map +1 -1
- package/dist/report/render.d.ts +10 -1
- package/dist/report/render.d.ts.map +1 -1
- package/dist/report/render.js +75 -13
- package/dist/report/render.js.map +1 -1
- package/dist/runtime/async.d.ts +16 -3
- package/dist/runtime/async.d.ts.map +1 -1
- package/dist/runtime/async.js +24 -19
- package/dist/runtime/async.js.map +1 -1
- package/dist/runtime/auth.d.ts +8 -9
- package/dist/runtime/auth.d.ts.map +1 -1
- package/dist/runtime/auth.js +60 -62
- package/dist/runtime/auth.js.map +1 -1
- package/dist/runtime/body.d.ts +15 -3
- package/dist/runtime/body.d.ts.map +1 -1
- package/dist/runtime/body.js +61 -12
- package/dist/runtime/body.js.map +1 -1
- package/dist/runtime/check-costs.d.ts +15 -0
- package/dist/runtime/check-costs.d.ts.map +1 -0
- package/dist/runtime/check-costs.js +114 -0
- package/dist/runtime/check-costs.js.map +1 -0
- package/dist/runtime/check-ids.d.ts +15 -0
- package/dist/runtime/check-ids.d.ts.map +1 -0
- package/dist/runtime/check-ids.js +140 -0
- package/dist/runtime/check-ids.js.map +1 -0
- package/dist/runtime/checks.d.ts +88 -20
- package/dist/runtime/checks.d.ts.map +1 -1
- package/dist/runtime/checks.js +3288 -1947
- package/dist/runtime/checks.js.map +1 -1
- package/dist/runtime/client.d.ts +112 -0
- package/dist/runtime/client.d.ts.map +1 -1
- package/dist/runtime/client.js +271 -39
- package/dist/runtime/client.js.map +1 -1
- package/dist/runtime/cookies.d.ts +16 -2
- package/dist/runtime/cookies.d.ts.map +1 -1
- package/dist/runtime/cookies.js +83 -22
- package/dist/runtime/cookies.js.map +1 -1
- package/dist/runtime/exchanges.d.ts +4 -5
- package/dist/runtime/exchanges.d.ts.map +1 -1
- package/dist/runtime/exchanges.js +33 -55
- package/dist/runtime/exchanges.js.map +1 -1
- package/dist/runtime/exit.d.ts +40 -0
- package/dist/runtime/exit.d.ts.map +1 -0
- package/dist/runtime/exit.js +48 -0
- package/dist/runtime/exit.js.map +1 -0
- package/dist/runtime/feature-gate.d.ts +0 -9
- package/dist/runtime/feature-gate.d.ts.map +1 -1
- package/dist/runtime/feature-gate.js +0 -21
- package/dist/runtime/feature-gate.js.map +1 -1
- package/dist/runtime/finding.d.ts +49 -8
- package/dist/runtime/finding.d.ts.map +1 -1
- package/dist/runtime/finding.js +51 -8
- package/dist/runtime/finding.js.map +1 -1
- package/dist/runtime/fixture.d.ts +35 -28
- package/dist/runtime/fixture.d.ts.map +1 -1
- package/dist/runtime/fixture.js +92 -731
- package/dist/runtime/fixture.js.map +1 -1
- package/dist/runtime/generate.d.ts +63 -0
- package/dist/runtime/generate.d.ts.map +1 -0
- package/dist/runtime/generate.js +635 -0
- package/dist/runtime/generate.js.map +1 -0
- package/dist/runtime/headers.d.ts +6 -0
- package/dist/runtime/headers.d.ts.map +1 -0
- package/dist/runtime/headers.js +16 -0
- package/dist/runtime/headers.js.map +1 -0
- package/dist/runtime/path.d.ts +7 -0
- package/dist/runtime/path.d.ts.map +1 -0
- package/dist/runtime/path.js +44 -0
- package/dist/runtime/path.js.map +1 -0
- package/dist/runtime/payloads.d.ts +2 -0
- package/dist/runtime/payloads.d.ts.map +1 -1
- package/dist/runtime/payloads.js +2 -1
- package/dist/runtime/payloads.js.map +1 -1
- package/dist/runtime/rate-limit.d.ts +6 -4
- package/dist/runtime/rate-limit.d.ts.map +1 -1
- package/dist/runtime/rate-limit.js +22 -33
- package/dist/runtime/rate-limit.js.map +1 -1
- package/dist/runtime/redact.d.ts +24 -0
- package/dist/runtime/redact.d.ts.map +1 -0
- package/dist/runtime/redact.js +98 -0
- package/dist/runtime/redact.js.map +1 -0
- package/dist/runtime/run.d.ts +34 -2
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +374 -138
- package/dist/runtime/run.js.map +1 -1
- package/dist/runtime/runs.d.ts +5 -0
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +7 -1
- package/dist/runtime/runs.js.map +1 -1
- package/dist/runtime/teardown.d.ts +17 -4
- package/dist/runtime/teardown.d.ts.map +1 -1
- package/dist/runtime/teardown.js +49 -16
- package/dist/runtime/teardown.js.map +1 -1
- package/dist/runtime/transcript.d.ts +34 -2
- package/dist/runtime/transcript.d.ts.map +1 -1
- package/dist/runtime/transcript.js +119 -24
- package/dist/runtime/transcript.js.map +1 -1
- package/dist/runtime/unique.d.ts +2 -11
- package/dist/runtime/unique.d.ts.map +1 -1
- package/dist/runtime/unique.js +27 -53
- package/dist/runtime/unique.js.map +1 -1
- package/dist/runtime/validate.d.ts +13 -2
- package/dist/runtime/validate.d.ts.map +1 -1
- package/dist/runtime/validate.js +51 -31
- package/dist/runtime/validate.js.map +1 -1
- package/dist/runtime/wait.d.ts +2 -1
- package/dist/runtime/wait.d.ts.map +1 -1
- package/dist/runtime/wait.js +2 -36
- package/dist/runtime/wait.js.map +1 -1
- package/dist/runtime/world.d.ts +24 -1
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +101 -26
- package/dist/runtime/world.js.map +1 -1
- package/dist/spec/collection.d.ts +8 -2
- package/dist/spec/collection.d.ts.map +1 -1
- package/dist/spec/collection.js +47 -7
- package/dist/spec/collection.js.map +1 -1
- package/dist/spec/extensions.d.ts +11 -1
- package/dist/spec/extensions.d.ts.map +1 -1
- package/dist/spec/extensions.js +10 -2
- package/dist/spec/extensions.js.map +1 -1
- package/dist/spec/graph.d.ts +46 -0
- package/dist/spec/graph.d.ts.map +1 -1
- package/dist/spec/graph.js +175 -11
- package/dist/spec/graph.js.map +1 -1
- package/dist/spec/load.d.ts +25 -5
- package/dist/spec/load.d.ts.map +1 -1
- package/dist/spec/load.js +160 -59
- package/dist/spec/load.js.map +1 -1
- package/dist/spec/query-capabilities.d.ts +4 -0
- package/dist/spec/query-capabilities.d.ts.map +1 -1
- package/dist/spec/query-capabilities.js +6 -0
- package/dist/spec/query-capabilities.js.map +1 -1
- package/dist/spec/schema.d.ts +20 -0
- package/dist/spec/schema.d.ts.map +1 -0
- package/dist/spec/schema.js +118 -0
- package/dist/spec/schema.js.map +1 -0
- package/dist/spec/tag-schema.d.ts +12 -0
- package/dist/spec/tag-schema.d.ts.map +1 -0
- package/dist/spec/tag-schema.js +144 -0
- package/dist/spec/tag-schema.js.map +1 -0
- package/dist/spec/types.js +17 -1
- package/dist/spec/types.js.map +1 -1
- package/docs/api.md +59 -0
- package/docs/assumptions.md +99 -0
- package/docs/checks.md +183 -0
- package/docs/commands.md +214 -0
- package/docs/configuration.md +650 -0
- package/docs/model.md +184 -0
- package/docs/reference-defects.md +94 -0
- package/docs/reports.md +211 -0
- package/docs/tags.md +403 -0
- package/package.json +3 -1
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { CHECKS } from "./checks.js";
|
|
2
|
+
export const TYPICAL_REQUESTS = {
|
|
3
|
+
"async.reaches-terminal-state": 5,
|
|
4
|
+
"async.receipt-identifies-the-job": 1,
|
|
5
|
+
"auth.invite-grants-then-revokes": 7,
|
|
6
|
+
"auth.rank-is-monotonic": 3,
|
|
7
|
+
"concurrency.no-lost-update": 5,
|
|
8
|
+
"consistency.projections-agree": 6,
|
|
9
|
+
"count.consistent-with-returned-page": 1,
|
|
10
|
+
"count.matches-filtered-set": 1,
|
|
11
|
+
"create.persists-submitted-fields": 1,
|
|
12
|
+
"create.status-matches-document": 1,
|
|
13
|
+
"create.unique-conflict-rejected": 3,
|
|
14
|
+
"delete.absent-record-returns-404": 1,
|
|
15
|
+
"effects.declared-effect-occurs": 3,
|
|
16
|
+
"effects.side-effect-arrives": 3,
|
|
17
|
+
"error.malformed-filter-not-5xx": 1,
|
|
18
|
+
"filter.alias-matches-canonical": 1,
|
|
19
|
+
"filter.and-composes-as-intersection": 4,
|
|
20
|
+
"filter.condition-cap-rejected": 1,
|
|
21
|
+
"filter.contains-membership": 1,
|
|
22
|
+
"filter.empty-in": 2,
|
|
23
|
+
"filter.equality-selects-exactly-one": 1,
|
|
24
|
+
"filter.gte-is-gt-or-eq": 4,
|
|
25
|
+
"filter.ilike-is-case-insensitive": 2,
|
|
26
|
+
"filter.illegal-op-rejected": 2,
|
|
27
|
+
"filter.in-is-union-of-eq": 3,
|
|
28
|
+
"filter.in-over-limit-rejected": 1,
|
|
29
|
+
"filter.is-null-selects-nulls": 2,
|
|
30
|
+
"filter.like-metacharacters-escaped": 2,
|
|
31
|
+
"filter.lte-is-lt-or-eq": 3,
|
|
32
|
+
"filter.negation-partitions-the-set": 3,
|
|
33
|
+
"filter.nested-and-or-distributes": 4,
|
|
34
|
+
"filter.nin-complements-in": 2,
|
|
35
|
+
"filter.numeric-comparison-is-numeric": 1,
|
|
36
|
+
"filter.or-composes-as-union": 2,
|
|
37
|
+
"filter.ordered-triple-partitions": 6,
|
|
38
|
+
"filter.unknown-field-rejected": 2,
|
|
39
|
+
"filter.zero-match-returns-none": 1,
|
|
40
|
+
"idempotency.replay-does-not-duplicate": 7,
|
|
41
|
+
"invalidation.declared-route-changes": 5,
|
|
42
|
+
"list.read-after-write": 2,
|
|
43
|
+
"pagination.cursor-agrees-with-page": 10,
|
|
44
|
+
"pagination.has-more-is-accurate": 2,
|
|
45
|
+
"pagination.limit-bounds-page-size": 1,
|
|
46
|
+
"pagination.limit-respects-documented-max": 1,
|
|
47
|
+
"pagination.page-walk-covers-set": 13,
|
|
48
|
+
"patch.immutable-field-rejected": 2,
|
|
49
|
+
"patch.minimality": 6,
|
|
50
|
+
"payload.string-survives": 128,
|
|
51
|
+
"query.axes-compose": 5,
|
|
52
|
+
"query.filter-and-select-compose": 4,
|
|
53
|
+
"query.filter-search-select-compose": 1,
|
|
54
|
+
"query.filter-search-sort-compose": 1,
|
|
55
|
+
"query.filter-search-sort-select-compose": 1,
|
|
56
|
+
"query.filter-selects-from-whole-set": 21,
|
|
57
|
+
"query.filter-sort-select-compose": 4,
|
|
58
|
+
"query.search-and-filter-compose": 2,
|
|
59
|
+
"query.search-and-select-compose": 4,
|
|
60
|
+
"query.search-and-sort-compose": 2,
|
|
61
|
+
"query.sort-and-select-compose": 1,
|
|
62
|
+
"response.status-is-documented": 1,
|
|
63
|
+
"schema.error-response-matches-document": 1,
|
|
64
|
+
"schema.success-response-matches-document": 1,
|
|
65
|
+
"search.case-insensitive": 1,
|
|
66
|
+
"search.empty-q": 4,
|
|
67
|
+
"search.mode-accepted": 2,
|
|
68
|
+
"search.q-narrows-result": 2,
|
|
69
|
+
"search.tokens-and": 3,
|
|
70
|
+
"select.nested-honoured": 1,
|
|
71
|
+
"select.projection-honoured": 1,
|
|
72
|
+
"select.requested-fields-present": 1,
|
|
73
|
+
"select.unknown-field-rejected": 1,
|
|
74
|
+
"softdelete.absent-from-default-list": 3,
|
|
75
|
+
"sort.default-order-applied": 3,
|
|
76
|
+
"sort.multi-key-tiebreak": 2,
|
|
77
|
+
"sort.nulls-first-last": 2,
|
|
78
|
+
"sort.numeric-order-is-numeric": 1,
|
|
79
|
+
"sort.order-is-applied": 1,
|
|
80
|
+
"sort.reverse-symmetry": 4,
|
|
81
|
+
"sort.stable-tiebreak": 4,
|
|
82
|
+
"sort.unknown-field-rejected": 1,
|
|
83
|
+
"spec.declared-filterable-is-filterable": 9,
|
|
84
|
+
"spec.declared-filterable-ops-accepted": 41,
|
|
85
|
+
"spec.declared-rate-limit-is-honoured": 1,
|
|
86
|
+
"spec.declared-selectable-is-selectable": 10,
|
|
87
|
+
"spec.declared-sortable-is-sortable": 8,
|
|
88
|
+
"spec.declared-sortable-nulls-accepted": 20,
|
|
89
|
+
"tenant.denial-does-not-reveal-existence": 2,
|
|
90
|
+
"tenant.filter-does-not-bypass-scope": 1,
|
|
91
|
+
"tenant.item-not-readable-cross-tenant": 1,
|
|
92
|
+
"update.unique-conflict-rejected": 5,
|
|
93
|
+
"validation.content-type-enforced": 1,
|
|
94
|
+
"validation.enum-enforced": 1,
|
|
95
|
+
"validation.max-length-enforced": 1,
|
|
96
|
+
"validation.required-enforced": 1,
|
|
97
|
+
};
|
|
98
|
+
const DEFAULT_CHECK_COST = 2;
|
|
99
|
+
/**
|
|
100
|
+
* Estimated requests for testing one entity: seeding the cohort, then every check that would
|
|
101
|
+
* grade one of its operations. Static, like the plan it belongs to — the real count depends on
|
|
102
|
+
* what the backend answers.
|
|
103
|
+
*/
|
|
104
|
+
export function estimateRequests(entity, model, cohortSize = 7) {
|
|
105
|
+
const seeding = entity.create === undefined ? 1 : cohortSize + 1;
|
|
106
|
+
let checks = 0;
|
|
107
|
+
for (const check of CHECKS) {
|
|
108
|
+
if (check.subjects(entity, model).length === 0)
|
|
109
|
+
continue;
|
|
110
|
+
checks += TYPICAL_REQUESTS[check.id] ?? DEFAULT_CHECK_COST;
|
|
111
|
+
}
|
|
112
|
+
return seeding + checks;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=check-costs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-costs.js","sourceRoot":"","sources":["../../src/runtime/check-costs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every registered check id. `Check.id` and `dependsOn` are typed against this list, so a
|
|
3
|
+
* misspelled dependency fails to compile instead of silently never suppressing anything; the
|
|
4
|
+
* registry is checked against it again when it loads.
|
|
5
|
+
*/
|
|
6
|
+
export declare const CHECK_IDS: readonly ["async.reaches-terminal-state", "async.receipt-identifies-the-job", "auth.invite-grants-then-revokes", "auth.rank-is-monotonic", "auth.rank-is-monotonic-on-writes", "concurrency.no-lost-update", "consistency.projections-agree", "count.consistent-with-returned-page", "count.matches-filtered-set", "create.persists-submitted-fields", "create.status-matches-document", "create.unique-conflict-rejected", "delete.absent-record-returns-404", "effects.declared-effect-occurs", "effects.side-effect-arrives", "error.malformed-filter-not-5xx", "filter.alias-matches-canonical", "filter.and-composes-as-intersection", "filter.condition-cap-rejected", "filter.contains-membership", "filter.empty-in", "filter.equality-selects-exactly-one", "filter.gte-is-gt-or-eq", "filter.ilike-is-case-insensitive", "filter.illegal-op-rejected", "filter.in-is-union-of-eq", "filter.in-over-limit-rejected", "filter.is-null-selects-nulls", "filter.like-metacharacters-escaped", "filter.lte-is-lt-or-eq", "filter.negation-partitions-the-set", "filter.nested-and-or-distributes", "filter.nin-complements-in", "filter.numeric-comparison-is-numeric", "filter.or-composes-as-union", "filter.ordered-triple-partitions", "filter.unknown-field-rejected", "filter.zero-match-returns-none", "idempotency.replay-does-not-duplicate", "invalidation.declared-route-changes", "list.read-after-write", "pagination.bounds-handled", "pagination.cursor-agrees-with-page", "pagination.has-more-is-accurate", "pagination.limit-bounds-page-size", "pagination.limit-respects-documented-max", "pagination.page-walk-covers-set", "patch.immutable-field-rejected", "patch.minimality", "payload.string-survives", "query.axes-compose", "query.filter-and-select-compose", "query.filter-search-select-compose", "query.filter-search-sort-compose", "query.filter-search-sort-select-compose", "query.filter-selects-from-whole-set", "query.filter-sort-select-compose", "query.search-and-filter-compose", "query.search-and-select-compose", "query.search-and-sort-compose", "query.sort-and-select-compose", "query.unknown-parameter-consistent", "response.status-is-documented", "schema.error-response-matches-document", "schema.success-response-matches-document", "search.case-insensitive", "search.empty-q", "search.mode-accepted", "search.q-narrows-result", "search.tokens-and", "select.nested-honoured", "select.projection-honoured", "select.requested-fields-present", "select.unknown-field-rejected", "softdelete.absent-from-default-list", "sort.default-order-applied", "sort.multi-key-tiebreak", "sort.nulls-first-last", "sort.numeric-order-is-numeric", "sort.order-is-applied", "sort.reverse-symmetry", "sort.stable-tiebreak", "sort.unknown-field-rejected", "spec.declared-filterable-is-filterable", "spec.declared-filterable-ops-accepted", "spec.declared-rate-limit-is-honoured", "spec.declared-selectable-is-selectable", "spec.declared-sortable-is-sortable", "spec.declared-sortable-nulls-accepted", "tenant.denial-does-not-reveal-existence", "tenant.filter-does-not-bypass-scope", "tenant.item-not-readable-cross-tenant", "tenant.parent-not-reachable-from-another-root", "tenant.item-not-writable-cross-tenant", "update.unique-conflict-rejected", "validation.content-type-enforced", "validation.enum-enforced", "validation.max-length-enforced", "validation.required-enforced"];
|
|
7
|
+
export type CheckId = (typeof CHECK_IDS)[number];
|
|
8
|
+
/** The families checks are grouped, built and verified by. */
|
|
9
|
+
export type CheckFamily = "pagination" | "filter" | "sort" | "search/select" | "composition" | "write" | "validation" | "isolation" | "effects/async" | "conformance" | "spec declarations" | "consistency";
|
|
10
|
+
type Prefix<Id> = Id extends `${infer Head}.${string}` ? Head : never;
|
|
11
|
+
/** Every check id prefix belongs to exactly one family; a new prefix fails to compile until it has one. */
|
|
12
|
+
export declare const FAMILY_OF_PREFIX: Record<Prefix<CheckId>, CheckFamily>;
|
|
13
|
+
export declare function familyOf(id: CheckId): CheckFamily;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=check-ids.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-ids.d.ts","sourceRoot":"","sources":["../../src/runtime/check-ids.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,SAAS,wwGAoGZ,CAAA;AAEV,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAA;AAEhD,8DAA8D;AAC9D,MAAM,MAAM,WAAW,GACpB,YAAY,GACZ,QAAQ,GACR,MAAM,GACN,eAAe,GACf,aAAa,GACb,OAAO,GACP,YAAY,GACZ,WAAW,GACX,eAAe,GACf,aAAa,GACb,mBAAmB,GACnB,aAAa,CAAA;AAEhB,KAAK,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,IAAI,IAAI,MAAM,EAAE,GAAG,IAAI,GAAG,KAAK,CAAA;AAErE,2GAA2G;AAC3G,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,WAAW,CA4BjE,CAAA;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,OAAO,GAAG,WAAW,CAEjD"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every registered check id. `Check.id` and `dependsOn` are typed against this list, so a
|
|
3
|
+
* misspelled dependency fails to compile instead of silently never suppressing anything; the
|
|
4
|
+
* registry is checked against it again when it loads.
|
|
5
|
+
*/
|
|
6
|
+
export const CHECK_IDS = [
|
|
7
|
+
"async.reaches-terminal-state",
|
|
8
|
+
"async.receipt-identifies-the-job",
|
|
9
|
+
"auth.invite-grants-then-revokes",
|
|
10
|
+
"auth.rank-is-monotonic",
|
|
11
|
+
"auth.rank-is-monotonic-on-writes",
|
|
12
|
+
"concurrency.no-lost-update",
|
|
13
|
+
"consistency.projections-agree",
|
|
14
|
+
"count.consistent-with-returned-page",
|
|
15
|
+
"count.matches-filtered-set",
|
|
16
|
+
"create.persists-submitted-fields",
|
|
17
|
+
"create.status-matches-document",
|
|
18
|
+
"create.unique-conflict-rejected",
|
|
19
|
+
"delete.absent-record-returns-404",
|
|
20
|
+
"effects.declared-effect-occurs",
|
|
21
|
+
"effects.side-effect-arrives",
|
|
22
|
+
"error.malformed-filter-not-5xx",
|
|
23
|
+
"filter.alias-matches-canonical",
|
|
24
|
+
"filter.and-composes-as-intersection",
|
|
25
|
+
"filter.condition-cap-rejected",
|
|
26
|
+
"filter.contains-membership",
|
|
27
|
+
"filter.empty-in",
|
|
28
|
+
"filter.equality-selects-exactly-one",
|
|
29
|
+
"filter.gte-is-gt-or-eq",
|
|
30
|
+
"filter.ilike-is-case-insensitive",
|
|
31
|
+
"filter.illegal-op-rejected",
|
|
32
|
+
"filter.in-is-union-of-eq",
|
|
33
|
+
"filter.in-over-limit-rejected",
|
|
34
|
+
"filter.is-null-selects-nulls",
|
|
35
|
+
"filter.like-metacharacters-escaped",
|
|
36
|
+
"filter.lte-is-lt-or-eq",
|
|
37
|
+
"filter.negation-partitions-the-set",
|
|
38
|
+
"filter.nested-and-or-distributes",
|
|
39
|
+
"filter.nin-complements-in",
|
|
40
|
+
"filter.numeric-comparison-is-numeric",
|
|
41
|
+
"filter.or-composes-as-union",
|
|
42
|
+
"filter.ordered-triple-partitions",
|
|
43
|
+
"filter.unknown-field-rejected",
|
|
44
|
+
"filter.zero-match-returns-none",
|
|
45
|
+
"idempotency.replay-does-not-duplicate",
|
|
46
|
+
"invalidation.declared-route-changes",
|
|
47
|
+
"list.read-after-write",
|
|
48
|
+
"pagination.bounds-handled",
|
|
49
|
+
"pagination.cursor-agrees-with-page",
|
|
50
|
+
"pagination.has-more-is-accurate",
|
|
51
|
+
"pagination.limit-bounds-page-size",
|
|
52
|
+
"pagination.limit-respects-documented-max",
|
|
53
|
+
"pagination.page-walk-covers-set",
|
|
54
|
+
"patch.immutable-field-rejected",
|
|
55
|
+
"patch.minimality",
|
|
56
|
+
"payload.string-survives",
|
|
57
|
+
"query.axes-compose",
|
|
58
|
+
"query.filter-and-select-compose",
|
|
59
|
+
"query.filter-search-select-compose",
|
|
60
|
+
"query.filter-search-sort-compose",
|
|
61
|
+
"query.filter-search-sort-select-compose",
|
|
62
|
+
"query.filter-selects-from-whole-set",
|
|
63
|
+
"query.filter-sort-select-compose",
|
|
64
|
+
"query.search-and-filter-compose",
|
|
65
|
+
"query.search-and-select-compose",
|
|
66
|
+
"query.search-and-sort-compose",
|
|
67
|
+
"query.sort-and-select-compose",
|
|
68
|
+
"query.unknown-parameter-consistent",
|
|
69
|
+
"response.status-is-documented",
|
|
70
|
+
"schema.error-response-matches-document",
|
|
71
|
+
"schema.success-response-matches-document",
|
|
72
|
+
"search.case-insensitive",
|
|
73
|
+
"search.empty-q",
|
|
74
|
+
"search.mode-accepted",
|
|
75
|
+
"search.q-narrows-result",
|
|
76
|
+
"search.tokens-and",
|
|
77
|
+
"select.nested-honoured",
|
|
78
|
+
"select.projection-honoured",
|
|
79
|
+
"select.requested-fields-present",
|
|
80
|
+
"select.unknown-field-rejected",
|
|
81
|
+
"softdelete.absent-from-default-list",
|
|
82
|
+
"sort.default-order-applied",
|
|
83
|
+
"sort.multi-key-tiebreak",
|
|
84
|
+
"sort.nulls-first-last",
|
|
85
|
+
"sort.numeric-order-is-numeric",
|
|
86
|
+
"sort.order-is-applied",
|
|
87
|
+
"sort.reverse-symmetry",
|
|
88
|
+
"sort.stable-tiebreak",
|
|
89
|
+
"sort.unknown-field-rejected",
|
|
90
|
+
"spec.declared-filterable-is-filterable",
|
|
91
|
+
"spec.declared-filterable-ops-accepted",
|
|
92
|
+
"spec.declared-rate-limit-is-honoured",
|
|
93
|
+
"spec.declared-selectable-is-selectable",
|
|
94
|
+
"spec.declared-sortable-is-sortable",
|
|
95
|
+
"spec.declared-sortable-nulls-accepted",
|
|
96
|
+
"tenant.denial-does-not-reveal-existence",
|
|
97
|
+
"tenant.filter-does-not-bypass-scope",
|
|
98
|
+
"tenant.item-not-readable-cross-tenant",
|
|
99
|
+
"tenant.parent-not-reachable-from-another-root",
|
|
100
|
+
"tenant.item-not-writable-cross-tenant",
|
|
101
|
+
"update.unique-conflict-rejected",
|
|
102
|
+
"validation.content-type-enforced",
|
|
103
|
+
"validation.enum-enforced",
|
|
104
|
+
"validation.max-length-enforced",
|
|
105
|
+
"validation.required-enforced",
|
|
106
|
+
];
|
|
107
|
+
/** Every check id prefix belongs to exactly one family; a new prefix fails to compile until it has one. */
|
|
108
|
+
export const FAMILY_OF_PREFIX = {
|
|
109
|
+
async: "effects/async",
|
|
110
|
+
auth: "isolation",
|
|
111
|
+
concurrency: "write",
|
|
112
|
+
consistency: "consistency",
|
|
113
|
+
count: "pagination",
|
|
114
|
+
create: "write",
|
|
115
|
+
delete: "write",
|
|
116
|
+
effects: "effects/async",
|
|
117
|
+
error: "filter",
|
|
118
|
+
filter: "filter",
|
|
119
|
+
idempotency: "write",
|
|
120
|
+
invalidation: "consistency",
|
|
121
|
+
list: "consistency",
|
|
122
|
+
pagination: "pagination",
|
|
123
|
+
patch: "write",
|
|
124
|
+
payload: "write",
|
|
125
|
+
query: "composition",
|
|
126
|
+
response: "conformance",
|
|
127
|
+
schema: "conformance",
|
|
128
|
+
search: "search/select",
|
|
129
|
+
select: "search/select",
|
|
130
|
+
softdelete: "write",
|
|
131
|
+
sort: "sort",
|
|
132
|
+
spec: "spec declarations",
|
|
133
|
+
tenant: "isolation",
|
|
134
|
+
update: "write",
|
|
135
|
+
validation: "validation",
|
|
136
|
+
};
|
|
137
|
+
export function familyOf(id) {
|
|
138
|
+
return FAMILY_OF_PREFIX[id.slice(0, id.indexOf("."))];
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=check-ids.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-ids.js","sourceRoot":"","sources":["../../src/runtime/check-ids.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/checks.d.ts
CHANGED
|
@@ -5,13 +5,14 @@
|
|
|
5
5
|
* ground truth — they compare the API against itself, through independent projections, or against
|
|
6
6
|
* the oracle of what oat just wrote. Check ids are stable: the conformance suite asserts on them.
|
|
7
7
|
*/
|
|
8
|
-
import type { Hooks } from "../config/define-config.ts";
|
|
8
|
+
import type { Hooks, PayloadPolicy } from "../config/define-config.ts";
|
|
9
9
|
import type { InviteSpec } from "../spec/extensions.ts";
|
|
10
|
+
import { type CheckId } from "./check-ids.ts";
|
|
10
11
|
import type { QueryCapability } from "../spec/extensions.ts";
|
|
11
12
|
import { type EffectiveQueryCapabilities } from "../spec/query-capabilities.ts";
|
|
12
|
-
import type
|
|
13
|
-
import type { Client } from "./client.ts";
|
|
14
|
-
import type
|
|
13
|
+
import { type EntityModel, type OperationModel, type SpecModel } from "../spec/graph.ts";
|
|
14
|
+
import type { Client, ReadClient } from "./client.ts";
|
|
15
|
+
import { type FindingCollector, type Outcome } from "./finding.ts";
|
|
15
16
|
import type { BackoffConfig } from "./poll.ts";
|
|
16
17
|
import type { UploadContext } from "./upload.ts";
|
|
17
18
|
import type { SchemaValidator } from "./validate.ts";
|
|
@@ -23,17 +24,26 @@ export interface Actor {
|
|
|
23
24
|
/** Higher can do everything a lower rank can. Same rank = peers. */
|
|
24
25
|
rank: number;
|
|
25
26
|
headers: () => Record<string, string>;
|
|
27
|
+
/**
|
|
28
|
+
* Replace this actor's credential after a response issues a new one.
|
|
29
|
+
* Static principals and auth flows both implement it. Absent means the actor cannot.
|
|
30
|
+
*/
|
|
31
|
+
adoptCredential?: (token: string) => void;
|
|
26
32
|
/** Tenant identity from config / the auth flow — not the full path scope. */
|
|
27
33
|
roots: Record<string, string>;
|
|
28
34
|
scope: Record<string, string>;
|
|
29
35
|
/** Value the owner puts in an invite body for this principal. */
|
|
30
36
|
inviteAs: string | undefined;
|
|
31
37
|
}
|
|
32
|
-
|
|
38
|
+
/**
|
|
39
|
+
* What a check runs against. A check that does not mutate gets a client that cannot write; a
|
|
40
|
+
* helper that writes asks for a `WriteContext`, so a read-only check calling it does not compile.
|
|
41
|
+
*/
|
|
42
|
+
export interface CheckContext<C extends ReadClient = ReadClient> {
|
|
33
43
|
entityName: string;
|
|
34
44
|
identity: string;
|
|
35
45
|
model: SpecModel;
|
|
36
|
-
client:
|
|
46
|
+
client: C;
|
|
37
47
|
findings: FindingCollector;
|
|
38
48
|
scope: Record<string, string>;
|
|
39
49
|
listOp: OperationModel;
|
|
@@ -61,6 +71,8 @@ export interface CheckContext {
|
|
|
61
71
|
altScope: Record<string, string> | undefined;
|
|
62
72
|
validator: SchemaValidator | undefined;
|
|
63
73
|
seed: number;
|
|
74
|
+
/** Per-run token for values that must not collide across runs: unique columns, idempotency keys. */
|
|
75
|
+
nonce: string;
|
|
64
76
|
/** Effective unique column sets for this entity (`[]` when the tag is absent or empty). */
|
|
65
77
|
uniqueSets: string[][];
|
|
66
78
|
/** First-variant create 409 adopted a same-tenant row; unique probes still run. */
|
|
@@ -79,12 +91,26 @@ export interface CheckContext {
|
|
|
79
91
|
waitOps: OperationModel[];
|
|
80
92
|
hooks: Hooks;
|
|
81
93
|
outOfBand: BackoffConfig;
|
|
94
|
+
/**
|
|
95
|
+
* The payload policy, and the write paths that have had the whole catalog this run — keyed
|
|
96
|
+
* by media type and field type, naming the entity that ran it. Optional so a hand-built
|
|
97
|
+
* context still works; absent means the whole catalog.
|
|
98
|
+
*/
|
|
99
|
+
payloads?: {
|
|
100
|
+
policy: PayloadPolicy;
|
|
101
|
+
ran: Map<string, string>;
|
|
102
|
+
};
|
|
82
103
|
/**
|
|
83
104
|
* Whether an operation is graded by this run. Always true on a full run. Checks that judge
|
|
84
105
|
* several operations consult it before invoking or judging one. Optional so a hand-built
|
|
85
106
|
* context still works.
|
|
86
107
|
*/
|
|
87
108
|
inScope?: (op: OperationModel) => boolean;
|
|
109
|
+
/**
|
|
110
|
+
* Registers a record this check caused to exist — a declared effect, a started job — for
|
|
111
|
+
* teardown. Records made through the entity's own create are tracked without it.
|
|
112
|
+
*/
|
|
113
|
+
recordCreated?: (entity: string, id: string, scope: Record<string, string>) => void;
|
|
88
114
|
/**
|
|
89
115
|
* Narrows what this check graded to the operations it actually judged. A check that judges
|
|
90
116
|
* after the fact — from whatever the transcript happens to hold — calls it, so an operation
|
|
@@ -92,31 +118,52 @@ export interface CheckContext {
|
|
|
92
118
|
*/
|
|
93
119
|
judged?: (operationIds: readonly string[]) => void;
|
|
94
120
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
121
|
+
/** The context of a check that changes server state. */
|
|
122
|
+
export type WriteContext = CheckContext<Client>;
|
|
123
|
+
/**
|
|
124
|
+
* What a check's planning step decided: it can run, with what it needs to — or it cannot, and why.
|
|
125
|
+
*
|
|
126
|
+
* Planning is the only place a check decides whether it applies, and `run` receives what the plan
|
|
127
|
+
* found instead of looking again. A check that applies but then finds nothing to test cannot
|
|
128
|
+
* happen by construction: the two questions are one.
|
|
129
|
+
*/
|
|
130
|
+
export type Plan<T> = {
|
|
131
|
+
ok: true;
|
|
132
|
+
value: T;
|
|
133
|
+
} | {
|
|
134
|
+
ok: false;
|
|
135
|
+
needs?: string;
|
|
136
|
+
};
|
|
137
|
+
export declare function ready<T>(value: T): Plan<T>;
|
|
138
|
+
/** The check cannot run here; `needs` says what is missing, else the check's own `needs` does. */
|
|
139
|
+
export declare function cannot(needs?: string): Plan<never>;
|
|
140
|
+
/** `next`, once `gate` holds — a plan built in stages, stopping at the first thing missing. */
|
|
141
|
+
export declare function andThen<A, T>(gate: Plan<A>, next: (value: A) => Plan<T>): Plan<T>;
|
|
142
|
+
/** A plan that carries nothing: the check applies exactly when `condition` holds. */
|
|
143
|
+
export declare function when(condition: boolean, needs?: string): Plan<undefined>;
|
|
144
|
+
interface CheckBase<T> {
|
|
145
|
+
id: CheckId;
|
|
146
|
+
/** Decides whether the check applies to this entity, and gathers what `run` needs if it does. */
|
|
147
|
+
plan(ctx: CheckContext): Plan<T>;
|
|
99
148
|
/**
|
|
100
149
|
* Check ids whose failure makes this one's result meaningless. When any has already fired for
|
|
101
150
|
* this entity, the check is skipped rather than reporting a consequence as a separate defect —
|
|
102
151
|
* one root cause should produce one finding, not a page of them.
|
|
103
152
|
*/
|
|
104
|
-
dependsOn?:
|
|
153
|
+
dependsOn?: CheckId[];
|
|
154
|
+
/**
|
|
155
|
+
* Whether the check judges traffic other checks sent. It runs after every check before it has
|
|
156
|
+
* finished, never alongside them, so it cannot miss what its batch-mates were still sending.
|
|
157
|
+
*/
|
|
158
|
+
judgesTranscript?: boolean;
|
|
105
159
|
/**
|
|
106
160
|
* What this check needs in order to run at all, in the reader's terms.
|
|
107
161
|
*
|
|
108
|
-
* Reported when
|
|
162
|
+
* Reported when the plan cannot run. Skipping silently would leave someone on an API
|
|
109
163
|
* shaped differently from the fixture believing a quiet run meant a clean one, when in truth
|
|
110
164
|
* half the suite never fired.
|
|
111
165
|
*/
|
|
112
166
|
needs?: string;
|
|
113
|
-
/**
|
|
114
|
-
* Whether the check changes server state. Mutating checks run alone and in order; read-only
|
|
115
|
-
* checks batch together. Two writers racing on the same cohort would make each other's
|
|
116
|
-
* observations wrong, and the resulting finding would describe the interference rather than
|
|
117
|
-
* the backend.
|
|
118
|
-
*/
|
|
119
|
-
mutates?: boolean;
|
|
120
167
|
/**
|
|
121
168
|
* Operations whose contract this check judges, decided from the entity graph alone.
|
|
122
169
|
*
|
|
@@ -126,8 +173,20 @@ export interface Check {
|
|
|
126
173
|
* cannot run invisibly under `--ops`.
|
|
127
174
|
*/
|
|
128
175
|
subjects: (entity: EntityModel, model: SpecModel) => string[];
|
|
129
|
-
run: (ctx: CheckContext) => Promise<void>;
|
|
130
176
|
}
|
|
177
|
+
/**
|
|
178
|
+
* Whether the check changes server state. Mutating checks run alone and in order, with a client
|
|
179
|
+
* that can write; read-only checks batch together, with one that cannot. Two writers racing on
|
|
180
|
+
* the same cohort would make each other's observations wrong, and the resulting finding would
|
|
181
|
+
* describe the interference rather than the backend.
|
|
182
|
+
*/
|
|
183
|
+
export type Check<T = unknown> = CheckBase<T> & ({
|
|
184
|
+
mutates: true;
|
|
185
|
+
run(ctx: WriteContext, plan: T): Promise<Outcome>;
|
|
186
|
+
} | {
|
|
187
|
+
mutates?: false;
|
|
188
|
+
run(ctx: CheckContext, plan: T): Promise<Outcome>;
|
|
189
|
+
});
|
|
131
190
|
/** Subject sets shared by the registry. Each reads the same fields the check's context is built from. */
|
|
132
191
|
export declare const subjectsOf: {
|
|
133
192
|
async: (entity: EntityModel, model: SpecModel) => string[];
|
|
@@ -149,4 +208,13 @@ export declare const subjectsOf: {
|
|
|
149
208
|
writeAndRead: (entity: EntityModel) => string[];
|
|
150
209
|
};
|
|
151
210
|
export declare const CHECKS: readonly Check[];
|
|
211
|
+
/** Plans a check and, when it applies, runs it — what the scheduler does, for one check. */
|
|
212
|
+
export declare function runCheck(check: Check, ctx: WriteContext): Promise<Outcome>;
|
|
213
|
+
/**
|
|
214
|
+
* The registry checks itself as it loads: ids are unique, every id is one `CheckId` names, and
|
|
215
|
+
* every dependency is registered earlier. A dependency registered later can never suppress
|
|
216
|
+
* anything — it has not run yet when the scheduler consults it.
|
|
217
|
+
*/
|
|
218
|
+
export declare function validateRegistry(checks: readonly Check[]): void;
|
|
219
|
+
export {};
|
|
152
220
|
//# sourceMappingURL=checks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checks.d.ts","sourceRoot":"","sources":["../../src/runtime/checks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"checks.d.ts","sourceRoot":"","sources":["../../src/runtime/checks.ts"],"names":[],"mappings":"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"}
|