@lovrozagar/oat 0.7.4 → 0.7.5
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 +150 -124
- package/dist/cli.js +19 -1
- package/dist/config/define-config.d.ts +6 -0
- package/dist/config/define-config.d.ts.map +1 -1
- package/dist/config/define-config.js.map +1 -1
- package/dist/report/console.d.ts.map +1 -1
- package/dist/report/console.js +1 -0
- package/dist/report/console.js.map +1 -1
- package/dist/report/render.d.ts +4 -0
- package/dist/report/render.d.ts.map +1 -1
- package/dist/report/render.js +3 -0
- package/dist/report/render.js.map +1 -1
- package/dist/runtime/checks.d.ts.map +1 -1
- package/dist/runtime/checks.js +120 -58
- package/dist/runtime/checks.js.map +1 -1
- package/dist/runtime/client.d.ts +7 -1
- package/dist/runtime/client.d.ts.map +1 -1
- package/dist/runtime/client.js +3 -1
- package/dist/runtime/client.js.map +1 -1
- package/dist/runtime/effects.d.ts +43 -0
- package/dist/runtime/effects.d.ts.map +1 -0
- package/dist/runtime/effects.js +141 -0
- package/dist/runtime/effects.js.map +1 -0
- package/dist/runtime/exchanges.d.ts +37 -0
- package/dist/runtime/exchanges.d.ts.map +1 -0
- package/dist/runtime/exchanges.js +298 -0
- package/dist/runtime/exchanges.js.map +1 -0
- package/dist/runtime/run.d.ts +9 -0
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +17 -1
- package/dist/runtime/run.js.map +1 -1
- package/dist/spec/extensions.d.ts +4 -1
- package/dist/spec/extensions.d.ts.map +1 -1
- package/dist/spec/extensions.js +8 -2
- package/dist/spec/extensions.js.map +1 -1
- package/dist/spec/graph.js +1 -1
- package/dist/spec/graph.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -255,16 +255,17 @@ oat help
|
|
|
255
255
|
|
|
256
256
|
Requires `--config`. CLI flags override the same field in the config when both are set.
|
|
257
257
|
|
|
258
|
-
| flag
|
|
259
|
-
|
|
|
260
|
-
| `--config`
|
|
261
|
-
| `--base-url`
|
|
262
|
-
| `--only`
|
|
263
|
-
| `--seed`
|
|
264
|
-
| `--out`
|
|
265
|
-
| `--max-in-flight`
|
|
266
|
-
| `--keep-fixtures`
|
|
267
|
-
| `--quiet`
|
|
258
|
+
| flag | default | meaning |
|
|
259
|
+
| ------------------------------------------ | -------------------------------- | ----------------------------------------------------------------------------------------- |
|
|
260
|
+
| `--config` | required | module or JSON file, default export |
|
|
261
|
+
| `--base-url` | `config.baseUrl` | backend origin |
|
|
262
|
+
| `--only` | `config.only` or all entities | comma-separated entity names as `oat plan` prints them (singularised) |
|
|
263
|
+
| `--seed` | `config.seed` or `1` | fixture generation seed (reproducible) |
|
|
264
|
+
| `--out` | `config.outDir` or `./.oat/runs` | history root; each run writes `<out>/<datetime>/` and updates `latest` |
|
|
265
|
+
| `--max-in-flight` | `config.maxInFlight` or `4` | HTTP requests allowed at once |
|
|
266
|
+
| `--keep-fixtures` | `config.keepFixtures` or false | do not DELETE what the run created |
|
|
267
|
+
| `--quiet` | false | no stderr progress; files under `--out` still update |
|
|
268
|
+
| `--save-exchanges` / `--no-save-exchanges` | on unless `--profile cheap` | persist every HTTP exchange under the run dir (`exchanges.jsonl`, `exchanges/`, `blobs/`) |
|
|
268
269
|
|
|
269
270
|
**Exit codes:** `0` no defects, `1` at least one root-cause finding (`BACKEND_BUG`, `SPEC_BUG`, `SECURITY`, `AMBIGUITY`), `2` usage error (missing `--config`, no principals, unknown flag). `COVERAGE_GAP` and `BLOCKED` do not fail the process.
|
|
270
271
|
|
|
@@ -435,6 +436,7 @@ export default defineConfig({
|
|
|
435
436
|
only: ["store", "product"], // restrict entities
|
|
436
437
|
keepFixtures: false,
|
|
437
438
|
outDir: "./.oat/runs",
|
|
439
|
+
saveExchanges: true, // default on unless --profile cheap; --quiet does not turn this off
|
|
438
440
|
outOfBand: { attempts: 20, initialMs: 1000, maxMs: 8000 },
|
|
439
441
|
origins: [{ id: "cdn", baseUrl: "https://cdn.example.com", spec: "https://cdn.example.com/openapi.json" }],
|
|
440
442
|
query: {
|
|
@@ -473,12 +475,13 @@ export default defineConfig({
|
|
|
473
475
|
| `only` | no | all | Entity names from `oat plan` |
|
|
474
476
|
| `keepFixtures` | no | `false` | Skip DELETE at the end |
|
|
475
477
|
| `outDir` | no | `./.oat/runs` | History root. Each run writes `<outDir>/<datetime>/` and updates `latest`. Also writes `principals.json` after acquire |
|
|
478
|
+
| `saveExchanges` | no | on unless `profile` is `cheap` | Persist every HTTP exchange under the run dir. `--save-exchanges` / `--no-save-exchanges` override. `--quiet` does not |
|
|
476
479
|
| `query` | no | | Global query-catalog defaults. Overlay after `x-query`. Does not invent operators |
|
|
477
480
|
| `entities` | no | | Per-entity overlays. This release only reads `query`. Unknown names are ignored; `doctor` warns |
|
|
478
481
|
|
|
479
482
|
`spec` may be a path relative to `baseUrl` (`/v1/openapi/spec`) or an absolute URL or a file.
|
|
480
483
|
|
|
481
|
-
CLI `--base-url`, `--only`, `--seed`, `--out`, `--max-in-flight`, `--keep-fixtures` override these when passed.
|
|
484
|
+
CLI `--base-url`, `--only`, `--seed`, `--out`, `--max-in-flight`, `--keep-fixtures`, `--save-exchanges` / `--no-save-exchanges` override these when passed.
|
|
482
485
|
|
|
483
486
|
### Spec loading
|
|
484
487
|
|
|
@@ -1269,11 +1272,20 @@ A spec may leave both `x-async` and `text/event-stream` on the same operation. T
|
|
|
1269
1272
|
|
|
1270
1273
|
```yaml
|
|
1271
1274
|
x-effects:
|
|
1272
|
-
- { entity: table, op: create
|
|
1273
|
-
- { entity:
|
|
1275
|
+
- { entity: table, op: create }
|
|
1276
|
+
- { entity: row, op: append, min: 1 }
|
|
1274
1277
|
```
|
|
1275
1278
|
|
|
1276
|
-
`op`: `create` | `append` | `update` | `delete` | `replace`.
|
|
1279
|
+
`op`: `create` | `append` | `update` | `delete` | `replace`. Each item is `{ entity, op, count?, min? }`.
|
|
1280
|
+
|
|
1281
|
+
- `count` is an **exact** cardinality delta on that entity's list.
|
|
1282
|
+
- `min` is **at-least** (`delta >= min` and `added.length >= min`). Use this when the child count is data-dependent (an extract that appends 1 / 2 / 5 rows).
|
|
1283
|
+
- Omit both → `count: 1` (invite / create).
|
|
1284
|
+
- Set both on one item → rejected at load / `oat doctor` (`x-effects` gap). The item is not checked.
|
|
1285
|
+
|
|
1286
|
+
After a write that declares `create` on A, oat binds the new A id from the write response (`table_id`, or the entity identity) or from A's list delta — the same adopt idea as a 402 plan-limit reuse. Later items in **that same** `x-effects` array whose child list is under A (`GET .../tables/{table_id}/rows`) fill the path with that id. `x-wait` after the same write uses the same bound id. No tester hook.
|
|
1287
|
+
|
|
1288
|
+
An extract-shaped write (create table + append ≥1 row) fails when the new table's row list is empty, and passes when it has 5.
|
|
1277
1289
|
|
|
1278
1290
|
**Fallback:** derived from `x-entity.action` for this entity only.
|
|
1279
1291
|
|
|
@@ -1289,7 +1301,7 @@ x-wait:
|
|
|
1289
1301
|
|
|
1290
1302
|
Put this on the **write**. After that write succeeds, oat polls `operationId` until `until` (JSON path `$.items.0` or JSON pointer `/items/0`) is non-empty, or `hooks.awaitSideEffect` returns `true`. Default `timeoutMs` is **30s**. Timeout is a **finding** (`effects.side-effect-arrives`), not a coverage gap.
|
|
1291
1303
|
|
|
1292
|
-
Use this for queue consumers and webhook inboxes (1–30 s), not for the same request. `x-effects` still asserts cardinality; `x-wait` asserts “this other GET eventually has a body”.
|
|
1304
|
+
Use this for queue consumers and webhook inboxes (1–30 s), not for the same request. `x-effects` still asserts cardinality; `x-wait` asserts “this other GET eventually has a body”. If the poll path needs a parent id the write created, oat binds it the same way `x-effects` does.
|
|
1293
1305
|
|
|
1294
1306
|
**Fallback:** the check does not run.
|
|
1295
1307
|
|
|
@@ -1424,6 +1436,8 @@ Exclusion applies to every invocation, not only create/read/update/delete. `effe
|
|
|
1424
1436
|
|
|
1425
1437
|
The run summary states what a profile skipped: `skipped 12 operation(s) under --profile cheap (12 high-cost)` — the same principle as `did not apply` for a coverage gap: a report that only shows what ran invites the reader to assume the rest was verified.
|
|
1426
1438
|
|
|
1439
|
+
`--profile cheap` also defaults the exchange journal **off**. `--save-exchanges` turns it back on; `--quiet` does not change it.
|
|
1440
|
+
|
|
1427
1441
|
### `x-rate-limit` — pacing oat's own traffic
|
|
1428
1442
|
|
|
1429
1443
|
```yaml
|
|
@@ -1457,102 +1471,102 @@ Order is fixed (foundations first) so cascade suppression has a cause to point a
|
|
|
1457
1471
|
|
|
1458
1472
|
`depends` is the `dependsOn` list: if any of those already failed **for this entity**, this check is `BLOCKED` rather than reported as a second defect. Suppression is transitive.
|
|
1459
1473
|
|
|
1460
|
-
| id | asserts
|
|
1461
|
-
| ---------------------------------------------- |
|
|
1462
|
-
| `list.read-after-write` | a just-created record appears on the list
|
|
1463
|
-
| `create.persists-submitted-fields` | every writable field sent on create is echoed
|
|
1464
|
-
| `payload.string-survives` | a documented-valid string is stored exactly; 4xx after an ASCII control is a fail
|
|
1465
|
-
| `create.status-matches-document` | create status is one the document declared
|
|
1466
|
-
| `response.status-is-documented` | every non-create exchange returns a status that operation names (`default` ≠ 201)
|
|
1467
|
-
| `schema.success-response-matches-document` | create body validates against the success schema
|
|
1468
|
-
| `schema.error-response-matches-document` | an error body validates against the documented error schema
|
|
1469
|
-
| `pagination.limit-bounds-page-size` | page size ≤ the requested limit
|
|
1470
|
-
| `pagination.limit-respects-documented-max` | requesting more than `maxLimit` does not return more
|
|
1471
|
-
| `pagination.has-more-is-accurate` | `hasMore` / `Link rel=next` matches whether another page exists
|
|
1472
|
-
| `pagination.page-walk-covers-set` | walking pages covers the collection with no gaps or dupes
|
|
1473
|
-
| `pagination.cursor-agrees-with-page` | cursor walk and page walk yield the same set
|
|
1474
|
-
| `filter.unknown-field-rejected` | a filter on a field that does not exist is not silently ignored
|
|
1475
|
-
| `filter.equality-selects-exactly-one` | `id.eq.<one>` returns that one record
|
|
1476
|
-
| `filter.zero-match-returns-none` | a filter that matches nothing returns an empty page, not the whole set
|
|
1477
|
-
| `filter.negation-partitions-the-set` | `eq` ∪ `neq` = whole set, intersection empty
|
|
1478
|
-
| `filter.and-composes-as-intersection` | `and(A,B)` = A ∩ B
|
|
1479
|
-
| `filter.or-composes-as-union` | `or(A,B)` = A ∪ B
|
|
1480
|
-
| `filter.like-metacharacters-escaped` | `%` `_` `*` in a value are literals, not wildcards
|
|
1481
|
-
| `filter.numeric-comparison-is-numeric` | `gt`/`lt` on a number uses numeric order, not TEXT (`1,10,2`)
|
|
1482
|
-
| `filter.in-is-union-of-eq` | `in.(a,b)` = `eq.a` ∪ `eq.b`
|
|
1483
|
-
| `filter.nin-complements-in` | `in` ∩ `nin` empty; union = set minus nulls
|
|
1484
|
-
| `filter.gte-is-gt-or-eq` | `gte.x` = `gt.x` ∪ `eq.x`
|
|
1485
|
-
| `filter.lte-is-lt-or-eq` | `lte.x` = `lt.x` ∪ `eq.x`
|
|
1486
|
-
| `filter.ordered-triple-partitions` | `lt` ∪ `eq` ∪ `gt` = set minus nulls; pairwise disjoint
|
|
1487
|
-
| `filter.ilike-is-case-insensitive` | case-flipped value: `ilike` matches; `like` does not (unresolved if both match)
|
|
1488
|
-
| `filter.is-null-selects-nulls` | `is.null` = nulls; `is.notnull` = complement
|
|
1489
|
-
| `filter.contains-membership` | `contains.<el>` = records whose array value includes `el`
|
|
1490
|
-
| `filter.nested-and-or-distributes` | `and(A,or(B,C))` = (A∩B) ∪ (A∩C)
|
|
1491
|
-
| `filter.alias-matches-canonical` | each declared alias token selects the same id-set as its target
|
|
1492
|
-
| `filter.illegal-op-rejected` | one op **not** in that field's `ops` is 4xx
|
|
1493
|
-
| `filter.empty-in` | `in.()` is 4xx (`reject`) or zero rows (`match-none`)
|
|
1494
|
-
| `filter.in-over-limit-rejected` | `in` list of `maxInValues+1` is 4xx
|
|
1495
|
-
| `filter.condition-cap-rejected` | `maxFilterConditions+1` `eq` terms is 4xx
|
|
1496
|
-
| `spec.declared-filterable-ops-accepted` | every declared field × every op in that field's `ops` returns <400
|
|
1497
|
-
| `spec.declared-filterable-illegal-op-rejected` | one illegal op per declared field is 4xx
|
|
1498
|
-
| `error.malformed-filter-not-5xx` | garbage filter text is 4xx, never 5xx
|
|
1499
|
-
| `query.filter-selects-from-whole-set` | a filter is applied to the collection, not to the current page
|
|
1500
|
-
| `sort.order-is-applied` | requesting a sort actually rearranges the page
|
|
1501
|
-
| `sort.reverse-symmetry` | desc is the reverse of asc (nulls included)
|
|
1502
|
-
| `sort.unknown-field-rejected` | `order` on an undeclared field is 4xx, not silent ignore
|
|
1503
|
-
| `sort.numeric-order-is-numeric` | `1,10,2` sorts as numbers, not text
|
|
1504
|
-
| `sort.nulls-first-last` | `nullsfirst` / `nullslast` put nulls at the start / end of asc
|
|
1505
|
-
| `sort.multi-key-tiebreak` | ties on the first key are ordered by the second
|
|
1506
|
-
| `sort.default-order-applied` | omitting `order` matches `defaultOrder`
|
|
1507
|
-
| `sort.stable-tiebreak` | the same `order` twice yields the same sequence
|
|
1508
|
-
| `spec.declared-sortable-nulls-accepted` | each declared nulls token returns <400
|
|
1509
|
-
| `search.q-narrows-result` | a search term that matches one record does not return the whole set
|
|
1510
|
-
| `search.tokens-and` | `q=a b` = intersection (AND). Sameness of AND and OR passes
|
|
1511
|
-
| `search.case-insensitive` | case-flipped token matches the same set (unresolved if the backend is case-sensitive)
|
|
1512
|
-
| `search.empty-q` | `q=` is ignore / match-all / reject as declared
|
|
1513
|
-
| `search.undeclared-field-not-required` | extra recall on a non-searchable field is not `SEARCH_IGNORED`
|
|
1514
|
-
| `search.mode-accepted` | each declared `searchModes` value is <400 on the mode param
|
|
1515
|
-
| `search.modes-differ` | two modes may differ; exact sameness is unresolved, not a fail
|
|
1516
|
-
| `select.projection-honoured` | `select=id,name` does not return undeclared fields
|
|
1517
|
-
| `select.requested-fields-present` | every name in `select=` appears on each returned item
|
|
1518
|
-
| `select.unknown-field-rejected` | unknown select name is 4xx (`reject`) or dropped (`ignore`)
|
|
1519
|
-
| `select.nested-honoured` | `rel(col)` returns `rel` as an object/array carrying only `col`
|
|
1520
|
-
| `count.consistent-with-returned-page` | envelope total ≥ rows on this page, and is not zero when the page is not
|
|
1521
|
-
| `count.matches-filtered-set` | filtered total equals the size of the filtered walk
|
|
1522
|
-
| `query.axes-compose` | filter + sort together: filter still holds on the sorted page
|
|
1523
|
-
| `query.filter-and-select-compose` | filter + select together
|
|
1524
|
-
| `query.search-and-filter-compose` | search + filter together
|
|
1525
|
-
| `query.filter-sort-select-compose` | filter + sort + select
|
|
1526
|
-
| `query.filter-search-sort-compose` | filter + search + sort
|
|
1527
|
-
| `query.filter-search-select-compose` | filter + search + select
|
|
1528
|
-
| `query.sort-and-select-compose` | sort + select: order holds; extras dropped; requested fields present
|
|
1529
|
-
| `query.search-and-select-compose` | search + select: search membership holds; extras dropped
|
|
1530
|
-
| `query.search-and-sort-compose` | search + sort: search membership holds; remaining rows ordered
|
|
1531
|
-
| `query.filter-search-sort-select-compose` | all four: filter ∩ search; order holds; extras dropped
|
|
1532
|
-
| `spec.declared-filterable-is-filterable` | every `x-query.filterable` field actually accepts a filter
|
|
1533
|
-
| `spec.declared-sortable-is-sortable` | every `x-query.sortable` field actually accepts a sort
|
|
1534
|
-
| `spec.declared-selectable-is-selectable` | every `x-query.selectable` field actually accepts a select
|
|
1535
|
-
| `tenant.item-not-readable-cross-tenant` | principal B cannot GET principal A's item
|
|
1536
|
-
| `tenant.denial-does-not-reveal-existence` | 404 vs 403 (or equivalent) does not distinguish "exists other tenant" from "missing"
|
|
1537
|
-
| `tenant.filter-does-not-bypass-scope` | `filter=id.eq.<other tenant>` does not return that row
|
|
1538
|
-
| `auth.rank-is-monotonic` | a lower rank cannot do what a higher rank is denied
|
|
1539
|
-
| `auth.invite-grants-then-revokes` | invite → accept grants; revoke takes it back
|
|
1540
|
-
| `patch.immutable-field-rejected` | PATCHing an `x-immutable` field is rejected or ignored
|
|
1541
|
-
| `softdelete.absent-from-default-list` | a soft-deleted row is gone from the default list
|
|
1542
|
-
| `invalidation.declared-route-changes` | after a write, the other entity's listed route actually changes
|
|
1543
|
-
| `effects.declared-effect-occurs` | `x-effects` cardinality delta is observed on the named list
|
|
1544
|
-
| `effects.side-effect-arrives` | after the write, the named GET’s JSON path is occupied before `timeoutMs`
|
|
1545
|
-
| `async.reaches-terminal-state` | `x-async` reaches `until` (poll, or a terminal SSE frame) before `timeoutMs`
|
|
1546
|
-
| `async.receipt-identifies-the-job` | `idFrom` on the receipt (JSON object or SSE event JSON) resolves to a pollable job
|
|
1547
|
-
| `patch.minimality` | PATCH `{ name }` does not clear other writable fields
|
|
1548
|
-
| `idempotency.replay-does-not-duplicate` | same Idempotency-Key + same body does not create a second row
|
|
1549
|
-
| `delete.absent-record-returns-404` | DELETE of a missing id is 404, not 200
|
|
1550
|
-
| `concurrency.no-lost-update` | two PATCHes to different fields do not clobber each other
|
|
1551
|
-
| `validation.enum-enforced` | a value outside the enum is rejected
|
|
1552
|
-
| `validation.max-length-enforced` | a string over `maxLength` is rejected
|
|
1553
|
-
| `validation.required-enforced` | omitting a required field is rejected
|
|
1554
|
-
| `validation.content-type-enforced` | a wrong Content-Type is 415 when 415 is documented
|
|
1555
|
-
| `consistency.projections-agree` | list, item, and filtered views of the same field agree
|
|
1474
|
+
| id | asserts | needs | depends |
|
|
1475
|
+
| ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------- | --------------------------------------- |
|
|
1476
|
+
| `list.read-after-write` | a just-created record appears on the list | create + a seeded record | — |
|
|
1477
|
+
| `create.persists-submitted-fields` | every writable field sent on create is echoed | create that echoes the record | `list.read-after-write` |
|
|
1478
|
+
| `payload.string-survives` | a documented-valid string is stored exactly; 4xx after an ASCII control is a fail | update or create+delete, item GET, unconstrained string | `list.read-after-write` |
|
|
1479
|
+
| `create.status-matches-document` | create status is one the document declared | create | — |
|
|
1480
|
+
| `response.status-is-documented` | every non-create exchange returns a status that operation names (`default` ≠ 201) | a modeled non-create operation oat invoked | — |
|
|
1481
|
+
| `schema.success-response-matches-document` | create body validates against the success schema | success schema on create | `create.status-matches-document` |
|
|
1482
|
+
| `schema.error-response-matches-document` | an error body validates against the documented error schema | error schema on the item route | — |
|
|
1483
|
+
| `pagination.limit-bounds-page-size` | page size ≤ the requested limit | page-size _role_ (aliases include `limit`, `per_page`, …) | `list.read-after-write` |
|
|
1484
|
+
| `pagination.limit-respects-documented-max` | requesting more than `maxLimit` does not return more | declared `maxLimit` and a larger cohort | `pagination.limit-bounds-page-size` |
|
|
1485
|
+
| `pagination.has-more-is-accurate` | `hasMore` / `Link rel=next` matches whether another page exists | page-forward + `hasMore` or `Link rel=next` | `pagination.limit-bounds-page-size` |
|
|
1486
|
+
| `pagination.page-walk-covers-set` | walking pages covers the collection with no gaps or dupes | page or offset + ≥3 records | `pagination.limit-bounds-page-size` |
|
|
1487
|
+
| `pagination.cursor-agrees-with-page` | cursor walk and page walk yield the same set | both cursor and page | `pagination.limit-bounds-page-size` |
|
|
1488
|
+
| `filter.unknown-field-rejected` | a filter on a field that does not exist is not silently ignored | a filter expression | — |
|
|
1489
|
+
| `filter.equality-selects-exactly-one` | `id.eq.<one>` returns that one record | equality on the identity | `list.read-after-write` |
|
|
1490
|
+
| `filter.zero-match-returns-none` | a filter that matches nothing returns an empty page, not the whole set | same | `list.read-after-write` |
|
|
1491
|
+
| `filter.negation-partitions-the-set` | `eq` ∪ `neq` = whole set, intersection empty | eq and neq | `list.read-after-write`, equality |
|
|
1492
|
+
| `filter.and-composes-as-intersection` | `and(A,B)` = A ∩ B | two filterable fields + AND | equality / list |
|
|
1493
|
+
| `filter.or-composes-as-union` | `or(A,B)` = A ∪ B | `or()` — **postgrest grammar only** | equality / list |
|
|
1494
|
+
| `filter.like-metacharacters-escaped` | `%` `_` `*` in a value are literals, not wildcards | like operator | `list.read-after-write` |
|
|
1495
|
+
| `filter.numeric-comparison-is-numeric` | `gt`/`lt` on a number uses numeric order, not TEXT (`1,10,2`) | numeric field + a filter param | `list.read-after-write`, unknown-field |
|
|
1496
|
+
| `filter.in-is-union-of-eq` | `in.(a,b)` = `eq.a` ∪ `eq.b` | field allows `in`; ≥2 distinct values | equality |
|
|
1497
|
+
| `filter.nin-complements-in` | `in` ∩ `nin` empty; union = set minus nulls | field allows `in` and `nin` | `in` |
|
|
1498
|
+
| `filter.gte-is-gt-or-eq` | `gte.x` = `gt.x` ∪ `eq.x` | field allows `gte` and `gt`; ordered type | numeric comparison |
|
|
1499
|
+
| `filter.lte-is-lt-or-eq` | `lte.x` = `lt.x` ∪ `eq.x` | field allows `lte` and `lt` | numeric comparison |
|
|
1500
|
+
| `filter.ordered-triple-partitions` | `lt` ∪ `eq` ∪ `gt` = set minus nulls; pairwise disjoint | field allows all three | numeric comparison |
|
|
1501
|
+
| `filter.ilike-is-case-insensitive` | case-flipped value: `ilike` matches; `like` does not (unresolved if both match) | field allows both | like |
|
|
1502
|
+
| `filter.is-null-selects-nulls` | `is.null` = nulls; `is.notnull` = complement | field allows `is`; cohort has a null | foundations |
|
|
1503
|
+
| `filter.contains-membership` | `contains.<el>` = records whose array value includes `el` | array field or ops include `contains` | foundations |
|
|
1504
|
+
| `filter.nested-and-or-distributes` | `and(A,or(B,C))` = (A∩B) ∪ (A∩C) | postgrest grammar; ≥2 filterable fields | `and` / `or` |
|
|
1505
|
+
| `filter.alias-matches-canonical` | each declared alias token selects the same id-set as its target | `aliases` non-empty | equality |
|
|
1506
|
+
| `filter.illegal-op-rejected` | one op **not** in that field's `ops` is 4xx | closed `ops` list | unknown-field |
|
|
1507
|
+
| `filter.empty-in` | `in.()` is 4xx (`reject`) or zero rows (`match-none`) | `emptyIn` set; field allows `in` | `in` |
|
|
1508
|
+
| `filter.in-over-limit-rejected` | `in` list of `maxInValues+1` is 4xx | `maxInValues` set | foundations |
|
|
1509
|
+
| `filter.condition-cap-rejected` | `maxFilterConditions+1` `eq` terms is 4xx | `maxFilterConditions` set | foundations |
|
|
1510
|
+
| `spec.declared-filterable-ops-accepted` | every declared field × every op in that field's `ops` returns <400 | closed `ops` | declared-filterable |
|
|
1511
|
+
| `spec.declared-filterable-illegal-op-rejected` | one illegal op per declared field is 4xx | closed `ops` | illegal-op |
|
|
1512
|
+
| `error.malformed-filter-not-5xx` | garbage filter text is 4xx, never 5xx | a filter expression | — |
|
|
1513
|
+
| `query.filter-selects-from-whole-set` | a filter is applied to the collection, not to the current page | filterable + ≥3 records | list / walk |
|
|
1514
|
+
| `sort.order-is-applied` | requesting a sort actually rearranges the page | order + a sortable field | `pagination.limit-bounds-page-size` |
|
|
1515
|
+
| `sort.reverse-symmetry` | desc is the reverse of asc (nulls included) | order + asc/desc | order-is-applied |
|
|
1516
|
+
| `sort.unknown-field-rejected` | `order` on an undeclared field is 4xx, not silent ignore | order param | — |
|
|
1517
|
+
| `sort.numeric-order-is-numeric` | `1,10,2` sorts as numbers, not text | numeric sortable field whose lexical order disagrees | order-is-applied |
|
|
1518
|
+
| `sort.nulls-first-last` | `nullsfirst` / `nullslast` put nulls at the start / end of asc | declared nulls token; dotted grammar; cohort has a null | order + reverse |
|
|
1519
|
+
| `sort.multi-key-tiebreak` | ties on the first key are ordered by the second | ≥2 sortable fields; `maxKeys` absent or ≥2 | order + reverse |
|
|
1520
|
+
| `sort.default-order-applied` | omitting `order` matches `defaultOrder` | `defaultOrder` set; walk complete | order + walk |
|
|
1521
|
+
| `sort.stable-tiebreak` | the same `order` twice yields the same sequence | `stableTiebreak` set | order-is-applied |
|
|
1522
|
+
| `spec.declared-sortable-nulls-accepted` | each declared nulls token returns <400 | some field/global declares `nulls` | order-is-applied |
|
|
1523
|
+
| `search.q-narrows-result` | a search term that matches one record does not return the whole set | search param + searchable fields | `list.read-after-write` |
|
|
1524
|
+
| `search.tokens-and` | `q=a b` = intersection (AND). Sameness of AND and OR passes | searchable fields; two tokens that split the cohort | `q-narrows` |
|
|
1525
|
+
| `search.case-insensitive` | case-flipped token matches the same set (unresolved if the backend is case-sensitive) | searchable field with a letter | `q-narrows` |
|
|
1526
|
+
| `search.empty-q` | `q=` is ignore / match-all / reject as declared | `searchEmpty` set | `q-narrows` |
|
|
1527
|
+
| `search.undeclared-field-not-required` | extra recall on a non-searchable field is not `SEARCH_IGNORED` | ≥1 searchable and ≥1 non-searchable string | `q-narrows` |
|
|
1528
|
+
| `search.mode-accepted` | each declared `searchModes` value is <400 on the mode param | `searchModes` set and a mode role | — |
|
|
1529
|
+
| `search.modes-differ` | two modes may differ; exact sameness is unresolved, not a fail | ≥2 `searchModes`; a mode param | `mode-accepted` |
|
|
1530
|
+
| `select.projection-honoured` | `select=id,name` does not return undeclared fields | select param | — |
|
|
1531
|
+
| `select.requested-fields-present` | every name in `select=` appears on each returned item | select param; ≥1 selectable field | projection |
|
|
1532
|
+
| `select.unknown-field-rejected` | unknown select name is 4xx (`reject`) or dropped (`ignore`) | `select.unknown` set | projection |
|
|
1533
|
+
| `select.nested-honoured` | `rel(col)` returns `rel` as an object/array carrying only `col` | `select.nested` and a named relation | projection |
|
|
1534
|
+
| `count.consistent-with-returned-page` | envelope total ≥ rows on this page, and is not zero when the page is not | envelope total | `list.read-after-write` |
|
|
1535
|
+
| `count.matches-filtered-set` | filtered total equals the size of the filtered walk | total + a filter | list, equality |
|
|
1536
|
+
| `query.axes-compose` | filter + sort together: filter still holds on the sorted page | filterable + sortable | filter + sort foundations |
|
|
1537
|
+
| `query.filter-and-select-compose` | filter + select together | filterable + select | same |
|
|
1538
|
+
| `query.search-and-filter-compose` | search + filter together | filterable + search | same |
|
|
1539
|
+
| `query.filter-sort-select-compose` | filter + sort + select | filter + sort + select | same |
|
|
1540
|
+
| `query.filter-search-sort-compose` | filter + search + sort | filter + search + sort | same |
|
|
1541
|
+
| `query.filter-search-select-compose` | filter + search + select | filter + search + select | same |
|
|
1542
|
+
| `query.sort-and-select-compose` | sort + select: order holds; extras dropped; requested fields present | sortable + selectable | sort + select |
|
|
1543
|
+
| `query.search-and-select-compose` | search + select: search membership holds; extras dropped | searchable + selectable | search + select |
|
|
1544
|
+
| `query.search-and-sort-compose` | search + sort: search membership holds; remaining rows ordered | searchable + sortable | search + sort |
|
|
1545
|
+
| `query.filter-search-sort-select-compose` | all four: filter ∩ search; order holds; extras dropped | all four axes declared | the triples |
|
|
1546
|
+
| `spec.declared-filterable-is-filterable` | every `x-query.filterable` field actually accepts a filter | `x-query` naming filterable fields | filter foundations |
|
|
1547
|
+
| `spec.declared-sortable-is-sortable` | every `x-query.sortable` field actually accepts a sort | `x-query` naming sortable fields | sort foundations |
|
|
1548
|
+
| `spec.declared-selectable-is-selectable` | every `x-query.selectable` field actually accepts a select | `x-query` naming selectable fields | select |
|
|
1549
|
+
| `tenant.item-not-readable-cross-tenant` | principal B cannot GET principal A's item | second principal, different `roots`, and a tagged or inferred tenant | — |
|
|
1550
|
+
| `tenant.denial-does-not-reveal-existence` | 404 vs 403 (or equivalent) does not distinguish "exists other tenant" from "missing" | second principal, and a tagged or inferred tenant | `tenant.item-not-readable-cross-tenant` |
|
|
1551
|
+
| `tenant.filter-does-not-bypass-scope` | `filter=id.eq.<other tenant>` does not return that row | second principal, a filter, and a tagged or inferred tenant | `query.filter-selects-from-whole-set` |
|
|
1552
|
+
| `auth.rank-is-monotonic` | a lower rank cannot do what a higher rank is denied | two same-tenant principals at different `rank` | `list.read-after-write` |
|
|
1553
|
+
| `auth.invite-grants-then-revokes` | invite → accept grants; revoke takes it back | `x-invite` + peer with `inviteAs` | list, cross-tenant |
|
|
1554
|
+
| `patch.immutable-field-rejected` | PATCHing an `x-immutable` field is rejected or ignored | `x-immutable` | — |
|
|
1555
|
+
| `softdelete.absent-from-default-list` | a soft-deleted row is gone from the default list | `x-soft-delete` | `list.read-after-write` |
|
|
1556
|
+
| `invalidation.declared-route-changes` | after a write, the other entity's listed route actually changes | `x-invalidate` naming another entity | list, persist |
|
|
1557
|
+
| `effects.declared-effect-occurs` | `x-effects` cardinality delta is observed on the named list (`count` exact, `min` at-least; nested child lists bind the created parent id) | `x-effects` | `list.read-after-write` |
|
|
1558
|
+
| `effects.side-effect-arrives` | after the write, the named GET’s JSON path is occupied before `timeoutMs` | `x-wait` | `list.read-after-write` |
|
|
1559
|
+
| `async.reaches-terminal-state` | `x-async` reaches `until` (poll, or a terminal SSE frame) before `timeoutMs` | `x-async` | — |
|
|
1560
|
+
| `async.receipt-identifies-the-job` | `idFrom` on the receipt (JSON object or SSE event JSON) resolves to a pollable job | `x-async` + `idFrom` | — |
|
|
1561
|
+
| `patch.minimality` | PATCH `{ name }` does not clear other writable fields | update + item route | — |
|
|
1562
|
+
| `idempotency.replay-does-not-duplicate` | same Idempotency-Key + same body does not create a second row | create + documented Idempotency-Key header | list, persist |
|
|
1563
|
+
| `delete.absent-record-returns-404` | DELETE of a missing id is 404, not 200 | delete | — |
|
|
1564
|
+
| `concurrency.no-lost-update` | two PATCHes to different fields do not clobber each other | update + two writable strings | persist + patch |
|
|
1565
|
+
| `validation.enum-enforced` | a value outside the enum is rejected | enum in the request schema | — |
|
|
1566
|
+
| `validation.max-length-enforced` | a string over `maxLength` is rejected | maxLength | — |
|
|
1567
|
+
| `validation.required-enforced` | omitting a required field is rejected | required field | — |
|
|
1568
|
+
| `validation.content-type-enforced` | a wrong Content-Type is 415 when 415 is documented | documented 415 | — |
|
|
1569
|
+
| `consistency.projections-agree` | list, item, and filtered views of the same field agree | item route + a comparable field | list + persist + filter |
|
|
1556
1570
|
|
|
1557
1571
|
On a typical untagged CRUD document (create, list, item, `page`/`limit`, maybe `sort`):
|
|
1558
1572
|
|
|
@@ -1635,19 +1649,31 @@ Written under `--out` (default `./.oat/runs`). Each invocation creates a UTC tim
|
|
|
1635
1649
|
|
|
1636
1650
|
`--out` / `outDir` replace the root, not the leaf — `--out .oat/runs/prod` writes `.oat/runs/prod/<datetime>/`.
|
|
1637
1651
|
|
|
1638
|
-
| file
|
|
1639
|
-
|
|
|
1640
|
-
| `oat-report.md`
|
|
1641
|
-
| `oat-report.json`
|
|
1642
|
-
| `matrix.html`
|
|
1643
|
-
| `matrix.json`
|
|
1644
|
-
| `issue-repro/*.sh`
|
|
1645
|
-
| `progress.log`
|
|
1646
|
-
| `progress.jsonl`
|
|
1647
|
-
| `progress.tsv`
|
|
1648
|
-
| `progress.json`
|
|
1649
|
-
|
|
1650
|
-
|
|
1652
|
+
| file | |
|
|
1653
|
+
| ---------------------------- | ------------------------------------------------------------------------------------------------------ |
|
|
1654
|
+
| `oat-report.md` | human report: summary, findings with request/response excerpts, coverage, latency p50/p95/max |
|
|
1655
|
+
| `oat-report.json` | same data for CI. Summary only — full exchanges are not inlined here |
|
|
1656
|
+
| `matrix.html` | visual matrix of entities × checks |
|
|
1657
|
+
| `matrix.json` | the same graph (AI-friendly), including a mermaid string |
|
|
1658
|
+
| `issue-repro/*.sh` | one executable `curl` script per finding that has evidence. Directory is omitted when the run is clean |
|
|
1659
|
+
| `progress.log` | logfmt, one event per line, never truncated |
|
|
1660
|
+
| `progress.jsonl` | same events as JSON |
|
|
1661
|
+
| `progress.tsv` | same columns, tab-separated. `req_id` is the join key to the exchange journal |
|
|
1662
|
+
| `progress.json` | latest snapshot only (overwritten ~1s) |
|
|
1663
|
+
| `exchanges.jsonl` | one line per request (`seq`, `requestId`, method, url, status, bytes, …). Greppable |
|
|
1664
|
+
| `exchanges/<requestId>.json` | full exchange: status, headers, described bodies. Missing id → `seq-<n>.json`. Duplicate id → `-<seq>` |
|
|
1665
|
+
| `blobs/<sha256>` | content-addressed file parts and oversized / binary bodies |
|
|
1666
|
+
|
|
1667
|
+
The journal is oat `Exchange` JSON, not HAR (HAR export is out of scope). Default **on** unless `--profile cheap`. `--no-save-exchanges` skips `exchanges/` entirely. `--quiet` does not.
|
|
1668
|
+
|
|
1669
|
+
Bodies are described, never base64 multipart. JSON / text inline up to 256 KiB, then `blobs/<sha256>`. `FormData` file parts and binary downloads (`application/pdf`, spreadsheet, image, `octet-stream`) are always blobs; the same fixture bytes POSTed N times share one file. SSE is stored as parsed `{ event, data }[]` frames.
|
|
1670
|
+
|
|
1671
|
+
Redaction is on by default (not opt-in), applied on write:
|
|
1672
|
+
|
|
1673
|
+
- Headers: `authorization`, `cookie`, `set-cookie`, `proxy-authorization`, and any `x-*-key` / `x-*-secret` / `x-ia-tester-key` (case-insensitive).
|
|
1674
|
+
- JSON bodies, any depth: `access_token`, `refresh_token`, `id_token`, `password`, `token`, `secret`, `api_key` → `"<redacted>"`.
|
|
1675
|
+
|
|
1676
|
+
Join `progress.tsv` `req_id` to `exchanges.jsonl` `requestId` (response `x-request-id` / `request-id` / `x-correlation-id` / `correlation-id` wins; else what oat sent). `oat-report.md` includes one line such as `1841 exchanges → exchanges/`.
|
|
1651
1677
|
|
|
1652
1678
|
### `oat-report.json`
|
|
1653
1679
|
|
package/dist/cli.js
CHANGED
|
@@ -8,6 +8,7 @@ import { report } from "./report/console.js";
|
|
|
8
8
|
import { renderMatrixGraph, renderMatrixHtml } from "./report/matrix.js";
|
|
9
9
|
import { ISSUE_REPRO_DIR, renderConsole, renderJson, renderMarkdown, renderRepros } from "./report/render.js";
|
|
10
10
|
import { createProgressPump, createStderrProgress, formatProgressJsonl, formatProgressLine, formatProgressTsv, PROGRESS_GLOSSARY, PROGRESS_TSV_HEADER, } from "./runtime/progress.js";
|
|
11
|
+
import { resolveSaveExchanges } from "./runtime/exchanges.js";
|
|
11
12
|
import { allocateRunDir, DEFAULT_RUNS_ROOT } from "./runtime/runs.js";
|
|
12
13
|
import { renderTeardown } from "./runtime/teardown.js";
|
|
13
14
|
import { buildModel } from "./spec/graph.js";
|
|
@@ -32,6 +33,8 @@ export const KNOWN_FLAGS = new Set([
|
|
|
32
33
|
"max-defects",
|
|
33
34
|
"json",
|
|
34
35
|
"parser",
|
|
36
|
+
"save-exchanges",
|
|
37
|
+
"no-save-exchanges",
|
|
35
38
|
]);
|
|
36
39
|
export function parseArgs(argv) {
|
|
37
40
|
const [command = "help", ...rest] = argv;
|
|
@@ -78,6 +81,8 @@ Flags
|
|
|
78
81
|
--keep-fixtures leave created records in place instead of tearing them down
|
|
79
82
|
--max-in-flight requests allowed in flight at once (default 4)
|
|
80
83
|
--quiet no live progress on stderr (progress.log still written)
|
|
84
|
+
--save-exchanges persist every HTTP exchange under the run dir (default unless --profile cheap)
|
|
85
|
+
--no-save-exchanges skip the exchange journal (cheap CI)
|
|
81
86
|
--untagged serve (or test) a document with every x-* tag stripped
|
|
82
87
|
--backend conformance storage: memory | sqlite | postgres | d1
|
|
83
88
|
(default: all local; d1 is remote and opt-in)
|
|
@@ -108,6 +113,11 @@ async function commandRun(flags) {
|
|
|
108
113
|
.filter(Boolean);
|
|
109
114
|
const only = onlyFromFlag ?? config.only?.filter((name) => name.trim() !== "");
|
|
110
115
|
const profile = str(flags, "profile") ?? config.profile;
|
|
116
|
+
const saveExchanges = resolveSaveExchanges({
|
|
117
|
+
...(flags["no-save-exchanges"] === true ? { flag: false } : flags["save-exchanges"] === true ? { flag: true } : {}),
|
|
118
|
+
...(config.saveExchanges === undefined ? {} : { config: config.saveExchanges }),
|
|
119
|
+
...(profile === undefined ? {} : { profile }),
|
|
120
|
+
});
|
|
111
121
|
/* No cast: the config's principal type *is* the runtime's, so a mistake here is a compile
|
|
112
122
|
* error in the user's own config rather than a surprise mid-run. */
|
|
113
123
|
const principals = config.principals ?? [];
|
|
@@ -170,6 +180,7 @@ async function commandRun(flags) {
|
|
|
170
180
|
maxInFlight: Number.parseInt(str(flags, "max-in-flight") ?? "", 10) || config.maxInFlight || 4,
|
|
171
181
|
seed: seedFlag === undefined ? (config.seed ?? 1) : Number.parseInt(seedFlag, 10),
|
|
172
182
|
onProgress,
|
|
183
|
+
...(saveExchanges ? { exchangeDir: outDir } : {}),
|
|
173
184
|
});
|
|
174
185
|
}
|
|
175
186
|
finally {
|
|
@@ -194,6 +205,7 @@ async function commandRun(flags) {
|
|
|
194
205
|
profile: result.profile,
|
|
195
206
|
profileExclusions: result.profileExclusions,
|
|
196
207
|
startedAt,
|
|
208
|
+
...(result.exchanges === undefined ? {} : { exchanges: result.exchanges }),
|
|
197
209
|
};
|
|
198
210
|
await writeFile(resolve(outDir, "principals.json"), `${JSON.stringify({ principals: result.principals }, null, 2)}\n`);
|
|
199
211
|
await writeFile(resolve(outDir, "oat-report.md"), renderMarkdown(input));
|
|
@@ -216,6 +228,9 @@ async function commandRun(flags) {
|
|
|
216
228
|
process.stdout.write(` matrix: ${resolve(outDir, "matrix.html")}\n`);
|
|
217
229
|
process.stdout.write(` graph: ${resolve(outDir, "matrix.json")}\n`);
|
|
218
230
|
process.stdout.write(` progress: ${resolve(outDir, "progress.log")} · ${resolve(outDir, "progress.jsonl")}\n`);
|
|
231
|
+
if (result.exchanges !== undefined) {
|
|
232
|
+
process.stdout.write(` exchanges: ${result.exchanges.count} → ${resolve(outDir, "exchanges")}\n`);
|
|
233
|
+
}
|
|
219
234
|
process.stdout.write(` latest: ${allocated.latest}\n\n`);
|
|
220
235
|
/* Exit code counts root causes, not raw findings: gaps and blocked entries are information,
|
|
221
236
|
* not failures, and a CI gate should react to defects only. */
|
|
@@ -233,7 +248,7 @@ export async function main() {
|
|
|
233
248
|
return 0;
|
|
234
249
|
}
|
|
235
250
|
if (command === "conformance") {
|
|
236
|
-
const { postgresAvailable, renderParserSuite, renderSuite, runExampleSpecSuite, runTagUnlockSuite, runParserSuite, runPayloadCatalogSuite, runCoverageReportSuite, runSeedContractSuite, runTenantScopeSuite, runSuite, sqliteAvailable, d1Available, } = await import("./conformance/suite.js");
|
|
251
|
+
const { postgresAvailable, renderParserSuite, renderSuite, runExampleSpecSuite, runTagUnlockSuite, runParserSuite, runPayloadCatalogSuite, runCoverageReportSuite, runSeedContractSuite, runEffectsSuite, runTenantScopeSuite, runSuite, sqliteAvailable, d1Available, } = await import("./conformance/suite.js");
|
|
237
252
|
const { runFeatureGateSuite } = await import("./conformance/feature-gate.js");
|
|
238
253
|
const { runRateLimitSuite } = await import("./conformance/rate-limit.js");
|
|
239
254
|
const parser = renderParserSuite(runParserSuite());
|
|
@@ -262,6 +277,9 @@ export async function main() {
|
|
|
262
277
|
const seedContract = renderParserSuite(await runSeedContractSuite());
|
|
263
278
|
process.stdout.write(seedContract.text);
|
|
264
279
|
parser.failures += seedContract.failures;
|
|
280
|
+
const effects = renderParserSuite(await runEffectsSuite());
|
|
281
|
+
process.stdout.write(effects.text);
|
|
282
|
+
parser.failures += effects.failures;
|
|
265
283
|
const payloads = renderParserSuite(runPayloadCatalogSuite());
|
|
266
284
|
process.stdout.write(payloads.text);
|
|
267
285
|
parser.failures += payloads.failures;
|
|
@@ -392,6 +392,12 @@ export interface OatConfig {
|
|
|
392
392
|
* Defaults to `./.oat/runs`.
|
|
393
393
|
*/
|
|
394
394
|
outDir?: string;
|
|
395
|
+
/**
|
|
396
|
+
* Persist every HTTP exchange under the run dir (`exchanges.jsonl`, `exchanges/`, `blobs/`).
|
|
397
|
+
* Default on unless the active profile is `cheap`. CLI `--save-exchanges` /
|
|
398
|
+
* `--no-save-exchanges` override this. `--quiet` does not.
|
|
399
|
+
*/
|
|
400
|
+
saveExchanges?: boolean;
|
|
395
401
|
}
|
|
396
402
|
/**
|
|
397
403
|
* Identity function that gives a config file full type checking and editor completion.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define-config.d.ts","sourceRoot":"","sources":["../../src/config/define-config.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"define-config.d.ts","sourceRoot":"","sources":["../../src/config/define-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define-config.js","sourceRoot":"","sources":["../../src/config/define-config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAoHH,MAAM,UAAU,UAAU,CAAC,IAAmB;IAC7C,OAAO,UAAU,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,CAAA;AACrF,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAmB;IAC7C,OAAO,OAAO,IAAI,IAAI,CAAA;AACvB,CAAC;
|
|
1
|
+
{"version":3,"file":"define-config.js","sourceRoot":"","sources":["../../src/config/define-config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAoHH,MAAM,UAAU,UAAU,CAAC,IAAmB;IAC7C,OAAO,UAAU,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,CAAA;AACrF,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAmB;IAC7C,OAAO,OAAO,IAAI,IAAI,CAAA;AACvB,CAAC;AAiUD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,YAAY,CAAC,MAAiB;IAC7C,OAAO,MAAM,CAAA;AACd,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../../src/report/console.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAC5F,OAAO,KAAK,EAAe,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAU9D,MAAM,WAAW,YAAY;IAC5B,KAAK,CAAC,EAAE,iBAAiB,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACvC,KAAK,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,0BAA0B,CAAC,CAAA;CACzE;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CA8BzD,CAAA;
|
|
1
|
+
{"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../../src/report/console.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAC5F,OAAO,KAAK,EAAe,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAU9D,MAAM,WAAW,YAAY;IAC5B,KAAK,CAAC,EAAE,iBAAiB,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACvC,KAAK,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,0BAA0B,CAAC,CAAA;CACzE;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CA8BzD,CAAA;AAyCD,iBAAS,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CA+CvD;AAyKD,iBAAS,MAAM,CACd,KAAK,EAAE,SAAS,EAChB,YAAY,EAAE,MAAM,EAAE,EACtB,MAAM,EAAE,OAAO,EACf,MAAM,CAAC,EAAE,YAAY,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CA+MpC;AAED,eAAO,MAAM,MAAM;;;CAAmB,CAAA"}
|
package/dist/report/console.js
CHANGED
|
@@ -68,6 +68,7 @@ const TAG_REMEDY = {
|
|
|
68
68
|
"x-tenant": "name the path parameter that scopes this operation to a tenant",
|
|
69
69
|
"x-invite": "name the invite, accept and revoke operations for delegated access",
|
|
70
70
|
"x-wait": "name the GET to poll after this write until a JSON path is occupied",
|
|
71
|
+
"x-effects": "declare create/append/delete with count or min, not both",
|
|
71
72
|
};
|
|
72
73
|
function bar(value, total, width = 24) {
|
|
73
74
|
if (total === 0)
|