@descryy/runtime-openapi-observation 0.2.0 → 0.4.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/LICENSE ADDED
@@ -0,0 +1,6 @@
1
+ Copyright (c) Descry
2
+
3
+ All rights reserved. This software is proprietary and confidential.
4
+ No license, express or implied, to reproduce, distribute, modify, or
5
+ create derivative works is granted except as explicitly agreed in
6
+ writing.
@@ -1,20 +1,14 @@
1
1
  /**
2
- * Which DTO schemas a resolved `API_ENDPOINT` actually declares, by role —
3
- * the two-hop join `adapter-openapi` (descry-adapters) writes but nothing
4
- * here had read yet: `API_ROUTE --SERVES_API--> API_ENDPOINT`,
5
- * `API_ROUTE --USES_TYPE(roles)--> DTO`. An endpoint resolves; its declared
6
- * shape is one edge traversal further, through the route that serves it —
7
- * `API_ENDPOINT` itself carries no `attrs.fields`, only `attrs.method`/
8
- * `attrs.pathTemplate` (`adapter.ts`, read directly rather than assumed).
2
+ * Which DTO schemas a resolved `API_ENDPOINT` declares, by role — a
3
+ * two-hop join `adapter-openapi` writes but nothing here reads yet:
4
+ * `API_ROUTE --SERVES_API--> API_ENDPOINT`, `API_ROUTE --USES_TYPE(roles)-->
5
+ * DTO`. `API_ENDPOINT` itself carries no `attrs.fields`, only
6
+ * `attrs.method`/`attrs.pathTemplate`.
9
7
  *
10
- * **Multiple serving routes are folded, not refused.** Unlike
11
- * `resolveEndpointNode`'s own "similar endpoint" ambiguity (which route
12
- * served THIS request), several real routes legitimately serving one shared
13
- * `API_ENDPOINT` (a repo-scoped route in each of several repositories,
14
- * DEC-115) all declare the *same contract* by construction — the endpoint is
15
- * the join point precisely because it is workspace-scoped and they are not.
16
- * So every DTO any serving route declares, under whichever roles it declares
17
- * them, is unioned rather than picked between.
8
+ * Multiple serving routes are folded, not refused: several routes
9
+ * legitimately serving one shared `API_ENDPOINT` (repo-scoped, DEC-115)
10
+ * declare the same contract by construction, so every DTO any serving
11
+ * route declares is unioned rather than picked between.
18
12
  */
19
13
  import type { IRNode } from "@descryy/ir";
20
14
  import { type SqlDriver } from "@descryy/core";
@@ -22,6 +16,6 @@ export type SchemaRole = "request" | "response" | "errorResponse";
22
16
  export type DeclaredSchemaRoles = {
23
17
  readonly [K in SchemaRole]: readonly IRNode[];
24
18
  };
25
- /** `{request: [], response: [], errorResponse: []}` for an endpoint no route serves (should not happen for a `resolved` endpoint, but reported rather than assumed) or one whose serving route(s) declared no `USES_TYPE` edge at all — a real, disclosed "this operation names no schema", not an error. */
19
+ /** `{request: [], response: [], errorResponse: []}` when no route serves this endpoint or none declared a `USES_TYPE` edge — a real "this operation names no schema", not an error. */
26
20
  export declare function declaredSchemaRoles(driver: SqlDriver, endpointNodeId: string): DeclaredSchemaRoles;
27
21
  //# sourceMappingURL=declared-roles.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"declared-roles.d.ts","sourceRoot":"","sources":["../src/declared-roles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAE5E,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,eAAe,CAAC;AAElE,MAAM,MAAM,mBAAmB,GAAG;IAAE,QAAQ,EAAE,CAAC,IAAI,UAAU,GAAG,SAAS,MAAM,EAAE;CAAE,CAAC;AAOpF,6SAA6S;AAC7S,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,GAAG,mBAAmB,CAqBlG"}
1
+ {"version":3,"file":"declared-roles.d.ts","sourceRoot":"","sources":["../src/declared-roles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAE5E,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,eAAe,CAAC;AAElE,MAAM,MAAM,mBAAmB,GAAG;IAAE,QAAQ,EAAE,CAAC,IAAI,UAAU,GAAG,SAAS,MAAM,EAAE;CAAE,CAAC;AAOpF,uLAAuL;AACvL,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,GAAG,mBAAmB,CAqBlG"}
@@ -1,27 +1,21 @@
1
1
  /**
2
- * Which DTO schemas a resolved `API_ENDPOINT` actually declares, by role —
3
- * the two-hop join `adapter-openapi` (descry-adapters) writes but nothing
4
- * here had read yet: `API_ROUTE --SERVES_API--> API_ENDPOINT`,
5
- * `API_ROUTE --USES_TYPE(roles)--> DTO`. An endpoint resolves; its declared
6
- * shape is one edge traversal further, through the route that serves it —
7
- * `API_ENDPOINT` itself carries no `attrs.fields`, only `attrs.method`/
8
- * `attrs.pathTemplate` (`adapter.ts`, read directly rather than assumed).
2
+ * Which DTO schemas a resolved `API_ENDPOINT` declares, by role — a
3
+ * two-hop join `adapter-openapi` writes but nothing here reads yet:
4
+ * `API_ROUTE --SERVES_API--> API_ENDPOINT`, `API_ROUTE --USES_TYPE(roles)-->
5
+ * DTO`. `API_ENDPOINT` itself carries no `attrs.fields`, only
6
+ * `attrs.method`/`attrs.pathTemplate`.
9
7
  *
10
- * **Multiple serving routes are folded, not refused.** Unlike
11
- * `resolveEndpointNode`'s own "similar endpoint" ambiguity (which route
12
- * served THIS request), several real routes legitimately serving one shared
13
- * `API_ENDPOINT` (a repo-scoped route in each of several repositories,
14
- * DEC-115) all declare the *same contract* by construction — the endpoint is
15
- * the join point precisely because it is workspace-scoped and they are not.
16
- * So every DTO any serving route declares, under whichever roles it declares
17
- * them, is unioned rather than picked between.
8
+ * Multiple serving routes are folded, not refused: several routes
9
+ * legitimately serving one shared `API_ENDPOINT` (repo-scoped, DEC-115)
10
+ * declare the same contract by construction, so every DTO any serving
11
+ * route declares is unioned rather than picked between.
18
12
  */
19
13
  import { getNode, incoming, outgoing } from "@descryy/core";
20
14
  function rolesOf(attrs) {
21
15
  const roles = attrs?.roles;
22
16
  return Array.isArray(roles) ? roles.filter((r) => typeof r === "string") : [];
23
17
  }
24
- /** `{request: [], response: [], errorResponse: []}` for an endpoint no route serves (should not happen for a `resolved` endpoint, but reported rather than assumed) or one whose serving route(s) declared no `USES_TYPE` edge at all — a real, disclosed "this operation names no schema", not an error. */
18
+ /** `{request: [], response: [], errorResponse: []}` when no route serves this endpoint or none declared a `USES_TYPE` edge — a real "this operation names no schema", not an error. */
25
19
  export function declaredSchemaRoles(driver, endpointNodeId) {
26
20
  const result = { request: [], response: [], errorResponse: [] };
27
21
  const seen = new Set();
@@ -1 +1 @@
1
- {"version":3,"file":"declared-roles.js","sourceRoot":"","sources":["../src/declared-roles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAkB,MAAM,eAAe,CAAC;AAM5E,SAAS,OAAO,CAAC,KAAoD;IACnE,MAAM,KAAK,GAAG,KAAK,EAAE,KAAK,CAAC;IAC3B,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7F,CAAC;AAED,6SAA6S;AAC7S,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,cAAsB;IAC3E,MAAM,MAAM,GAAoC,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;IACjG,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAClF,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC5E,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;YACrC,IAAI,GAAG,KAAK,SAAS;gBAAE,SAAS,CAAC,kEAAkE;YACnG,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,eAAe;oBAAE,SAAS;gBACpF,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBAChC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"declared-roles.js","sourceRoot":"","sources":["../src/declared-roles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAkB,MAAM,eAAe,CAAC;AAM5E,SAAS,OAAO,CAAC,KAAoD;IACnE,MAAM,KAAK,GAAG,KAAK,EAAE,KAAK,CAAC;IAC3B,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7F,CAAC;AAED,uLAAuL;AACvL,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,cAAsB;IAC3E,MAAM,MAAM,GAAoC,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;IACjG,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAClF,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC5E,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;YACrC,IAAI,GAAG,KAAK,SAAS;gBAAE,SAAS,CAAC,kEAAkE;YACnG,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,eAAe;oBAAE,SAAS;gBACpF,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBAChC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,16 +1,14 @@
1
1
  /**
2
- * Resolving an observed request's method+path against the graph's declared
3
- * `API_ENDPOINT` shapes — checklist §15's "documented endpoint" /
4
- * "undocumented endpoint" / "wrong method" boxes, and §18's "table/column
5
- * mapping" analogue for the OpenAPI half: does the contract know about this
6
- * call at all, and if not, is that because the path was never declared, or
7
- * because it was declared under a different verb.
2
+ * Resolving an observed request's method+path against declared
3
+ * `API_ENDPOINT` shapes — checklist §15's "documented"/"undocumented"/
4
+ * "wrong method" and §18's table/column-mapping analogue for OpenAPI: does
5
+ * the contract know this call, and if not, was the path never declared or
6
+ * declared under a different verb.
8
7
  *
9
8
  * Both underlying queries (`resolveEndpointNode`, `resolveEndpointNodesByPath`)
10
9
  * are `@descryy/runtime-graph-correlator`'s, reused rather than duplicated —
11
- * `resolveEndpointNodesByPath` exists in that package specifically because
12
- * this comparison needed it (a method-agnostic path query resolveEndpointNode
13
- * deliberately doesn't answer on its own).
10
+ * `resolveEndpointNodesByPath` exists there specifically because this
11
+ * comparison needed a method-agnostic path query.
14
12
  */
15
13
  import type { IRNode } from "@descryy/ir";
16
14
  import type { SqlDriver } from "@descryy/core";
@@ -1 +1 @@
1
- {"version":3,"file":"endpoint-comparison.d.ts","sourceRoot":"","sources":["../src/endpoint-comparison.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG/C,MAAM,MAAM,kBAAkB;AAC5B,oEAAoE;AAClE;IAAE,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;AAC/D;;;GAGG;GACD;IAAE,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AAC/D;;;;GAIG;GACD;IACE,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;IACjD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AACH,0GAA0G;GACxG;IAAE,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvG,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,GAAG,kBAAkB,CA2BxG"}
1
+ {"version":3,"file":"endpoint-comparison.d.ts","sourceRoot":"","sources":["../src/endpoint-comparison.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG/C,MAAM,MAAM,kBAAkB;AAC5B,oEAAoE;AAClE;IAAE,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;AAC/D;;;GAGG;GACD;IAAE,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AAC/D;;;;GAIG;GACD;IACE,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;IACjD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AACH,0GAA0G;GACxG;IAAE,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvG,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,GAAG,kBAAkB,CA0BxG"}
@@ -1,16 +1,14 @@
1
1
  /**
2
- * Resolving an observed request's method+path against the graph's declared
3
- * `API_ENDPOINT` shapes — checklist §15's "documented endpoint" /
4
- * "undocumented endpoint" / "wrong method" boxes, and §18's "table/column
5
- * mapping" analogue for the OpenAPI half: does the contract know about this
6
- * call at all, and if not, is that because the path was never declared, or
7
- * because it was declared under a different verb.
2
+ * Resolving an observed request's method+path against declared
3
+ * `API_ENDPOINT` shapes — checklist §15's "documented"/"undocumented"/
4
+ * "wrong method" and §18's table/column-mapping analogue for OpenAPI: does
5
+ * the contract know this call, and if not, was the path never declared or
6
+ * declared under a different verb.
8
7
  *
9
8
  * Both underlying queries (`resolveEndpointNode`, `resolveEndpointNodesByPath`)
10
9
  * are `@descryy/runtime-graph-correlator`'s, reused rather than duplicated —
11
- * `resolveEndpointNodesByPath` exists in that package specifically because
12
- * this comparison needed it (a method-agnostic path query resolveEndpointNode
13
- * deliberately doesn't answer on its own).
10
+ * `resolveEndpointNodesByPath` exists there specifically because this
11
+ * comparison needed a method-agnostic path query.
14
12
  */
15
13
  import { resolveEndpointNode, resolveEndpointNodesByPath } from "@descryy/runtime-graph-correlator";
16
14
  export function compareObservedEndpoint(driver, observed) {
@@ -21,9 +19,8 @@ export function compareObservedEndpoint(driver, observed) {
21
19
  if (exact.outcome === "ambiguous") {
22
20
  return { outcome: "ambiguous", candidates: exact.candidates, reason: exact.reason };
23
21
  }
24
- // exact.outcome === "not-found" -- the exact method+path is not declared.
25
- // Whether the *path* is declared under some other method is a separate
26
- // question resolveEndpointNode's own method filter cannot answer.
22
+ // not-found: exact method+path isn't declared. Whether the path is
23
+ // declared under another method is a separate question.
27
24
  const byPath = resolveEndpointNodesByPath(driver, observed.path);
28
25
  if (byPath.nodes.length === 0) {
29
26
  return { outcome: "undocumented", reason: exact.reason };
@@ -1 +1 @@
1
- {"version":3,"file":"endpoint-comparison.js","sourceRoot":"","sources":["../src/endpoint-comparison.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AA6BpG,MAAM,UAAU,uBAAuB,CAAC,MAAiB,EAAE,QAAyB;IAClF,MAAM,KAAK,GAAG,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE1E,IAAI,KAAK,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QACjC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;IACzD,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;QAClC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IACtF,CAAC;IAED,0EAA0E;IAC1E,uEAAuE;IACvE,kEAAkE;IAClE,MAAM,MAAM,GAAG,0BAA0B,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjE,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IAC3D,CAAC;IAED,MAAM,oBAAoB,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAChH,OAAO;QACL,OAAO,EAAE,cAAc;QACvB,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE;QAC7C,oBAAoB;QACpB,MAAM,EACJ,GAAG,QAAQ,CAAC,IAAI,sBAAsB,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ;YAC7E,GAAG,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,mDAAmD;KACtF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"endpoint-comparison.js","sourceRoot":"","sources":["../src/endpoint-comparison.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AA6BpG,MAAM,UAAU,uBAAuB,CAAC,MAAiB,EAAE,QAAyB;IAClF,MAAM,KAAK,GAAG,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE1E,IAAI,KAAK,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QACjC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;IACzD,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;QAClC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IACtF,CAAC;IAED,mEAAmE;IACnE,wDAAwD;IACxD,MAAM,MAAM,GAAG,0BAA0B,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjE,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IAC3D,CAAC;IAED,MAAM,oBAAoB,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAChH,OAAO;QACL,OAAO,EAAE,cAAc;QACvB,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE;QAC7C,oBAAoB;QACpB,MAAM,EACJ,GAAG,QAAQ,CAAC,IAAI,sBAAsB,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ;YAC7E,GAAG,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,mDAAmD;KACtF,CAAC;AACJ,CAAC"}
@@ -1,27 +1,21 @@
1
1
  /**
2
- * Ties `compareObservedEndpoint`, `classifyStatus`, `declaredSchemaRoles` and
3
- * `compareBodyAgainstSchema` together into the one comparison checklist
4
- * §15's own boxes actually describe: is the call documented, did its
5
- * outcome's class match a schema role the contract declares for it, and —
6
- * when a body was observed — does that body's own fields match that role's
7
- * declared shape.
2
+ * Ties `compareObservedEndpoint`, `classifyStatus`, `declaredSchemaRoles`
3
+ * and `compareBodyAgainstSchema` together into checklist §15's comparison:
4
+ * is the call documented, did its outcome's class match a declared schema
5
+ * role, and — when a body was observed — does it match that role's shape.
8
6
  *
9
- * **What "surprising" claims, precisely, and what it does not.** The
10
- * contract (`adapter-openapi`) carries `responseSchemas`/`errorSchemas` by
11
- * *role*, never a specific status code (§14/§18's own DECISIONS entry names
12
- * this limit). So this can say "the operation's contract declares zero
13
- * schemas for outcomes shaped like this one" — a real, checkable fact — and
14
- * cannot say "this contract expected 200, not 201." Reported as
15
- * `statusSurprising: boolean | null`, never as a confident status-code
16
- * mismatch it has no basis for.
7
+ * What "surprising" claims and doesn't: the contract carries schemas by
8
+ * *role*, never a specific status code (§14/§18). So this can say "the
9
+ * contract declares zero schemas for outcomes shaped like this one" but
10
+ * never "expected 200, not 201." Reported as `statusSurprising: boolean |
11
+ * null`, never a status-code mismatch it has no basis for.
17
12
  *
18
- * **Request and response are compared against different roles, on purpose.**
19
- * A request body is always checked against the `request` role, regardless of
20
- * outcome; a response body is checked against whichever role the *observed*
21
- * status bucket expects (`response` for success, `errorResponse` for a client
22
- * or server error) — the same operation's success and error bodies are
23
- * different contracts, and comparing an error body against the success DTO
24
- * would report every field of a real, correct error response as missing.
13
+ * Request and response are compared against different roles on purpose: a
14
+ * request body is always checked against `request`; a response body
15
+ * against whichever role the observed status bucket expects (`response`
16
+ * for success, `errorResponse` for an error) — comparing an error body
17
+ * against the success DTO would report a correct error response as all
18
+ * fields missing.
25
19
  */
26
20
  import type { SqlDriver } from "@descryy/core";
27
21
  import { type EndpointComparison, type ObservedRequest } from "./endpoint-comparison.ts";
@@ -1 +1 @@
1
- {"version":3,"file":"exchange-comparison.d.ts","sourceRoot":"","sources":["../src/exchange-comparison.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAA2B,KAAK,kBAAkB,EAAE,KAAK,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAClH,OAAO,EAAuB,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAyC,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EAA4B,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEzF,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,6IAA6I;IAC7I,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,+HAA+H;IAC/H,QAAQ,CAAC,aAAa,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACnD;;;;;;;OAOG;IACH,QAAQ,CAAC,gBAAgB,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1C,4IAA4I;IAC5I,QAAQ,CAAC,aAAa,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAChD,0IAA0I;IAC1I,QAAQ,CAAC,cAAc,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAClD;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,GAAG,kBAAkB,CAwBzG"}
1
+ {"version":3,"file":"exchange-comparison.d.ts","sourceRoot":"","sources":["../src/exchange-comparison.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAA2B,KAAK,kBAAkB,EAAE,KAAK,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAClH,OAAO,EAAuB,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAyC,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EAA4B,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEzF,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,6IAA6I;IAC7I,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,+HAA+H;IAC/H,QAAQ,CAAC,aAAa,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACnD;;;;;;;OAOG;IACH,QAAQ,CAAC,gBAAgB,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1C,4IAA4I;IAC5I,QAAQ,CAAC,aAAa,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAChD,0IAA0I;IAC1I,QAAQ,CAAC,cAAc,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAClD;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,GAAG,kBAAkB,CAwBzG"}
@@ -1,27 +1,21 @@
1
1
  /**
2
- * Ties `compareObservedEndpoint`, `classifyStatus`, `declaredSchemaRoles` and
3
- * `compareBodyAgainstSchema` together into the one comparison checklist
4
- * §15's own boxes actually describe: is the call documented, did its
5
- * outcome's class match a schema role the contract declares for it, and —
6
- * when a body was observed — does that body's own fields match that role's
7
- * declared shape.
2
+ * Ties `compareObservedEndpoint`, `classifyStatus`, `declaredSchemaRoles`
3
+ * and `compareBodyAgainstSchema` together into checklist §15's comparison:
4
+ * is the call documented, did its outcome's class match a declared schema
5
+ * role, and — when a body was observed — does it match that role's shape.
8
6
  *
9
- * **What "surprising" claims, precisely, and what it does not.** The
10
- * contract (`adapter-openapi`) carries `responseSchemas`/`errorSchemas` by
11
- * *role*, never a specific status code (§14/§18's own DECISIONS entry names
12
- * this limit). So this can say "the operation's contract declares zero
13
- * schemas for outcomes shaped like this one" — a real, checkable fact — and
14
- * cannot say "this contract expected 200, not 201." Reported as
15
- * `statusSurprising: boolean | null`, never as a confident status-code
16
- * mismatch it has no basis for.
7
+ * What "surprising" claims and doesn't: the contract carries schemas by
8
+ * *role*, never a specific status code (§14/§18). So this can say "the
9
+ * contract declares zero schemas for outcomes shaped like this one" but
10
+ * never "expected 200, not 201." Reported as `statusSurprising: boolean |
11
+ * null`, never a status-code mismatch it has no basis for.
17
12
  *
18
- * **Request and response are compared against different roles, on purpose.**
19
- * A request body is always checked against the `request` role, regardless of
20
- * outcome; a response body is checked against whichever role the *observed*
21
- * status bucket expects (`response` for success, `errorResponse` for a client
22
- * or server error) — the same operation's success and error bodies are
23
- * different contracts, and comparing an error body against the success DTO
24
- * would report every field of a real, correct error response as missing.
13
+ * Request and response are compared against different roles on purpose: a
14
+ * request body is always checked against `request`; a response body
15
+ * against whichever role the observed status bucket expects (`response`
16
+ * for success, `errorResponse` for an error) — comparing an error body
17
+ * against the success DTO would report a correct error response as all
18
+ * fields missing.
25
19
  */
26
20
  import { compareObservedEndpoint } from "./endpoint-comparison.js";
27
21
  import { declaredSchemaRoles } from "./declared-roles.js";
@@ -1 +1 @@
1
- {"version":3,"file":"exchange-comparison.js","sourceRoot":"","sources":["../src/exchange-comparison.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,EAAE,uBAAuB,EAAiD,MAAM,0BAA0B,CAAC;AAClH,OAAO,EAAE,mBAAmB,EAA4B,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAqB,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EAAE,wBAAwB,EAAyB,MAAM,wBAAwB,CAAC;AA6BzF,MAAM,UAAU,uBAAuB,CAAC,MAAiB,EAAE,QAA0B;IACnF,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC3D,MAAM,YAAY,GAAG,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAErD,IAAI,QAAQ,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;QACtC,OAAO;YACL,QAAQ;YACR,YAAY;YACZ,aAAa,EAAE,IAAI;YACnB,gBAAgB,EAAE,IAAI;YACtB,aAAa,EAAE,IAAI;YACnB,cAAc,EAAE,IAAI;SACrB,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACxE,MAAM,YAAY,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;IACzD,MAAM,gBAAgB,GAAG,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IAEjG,MAAM,aAAa,GAAG,wBAAwB,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC5F,MAAM,cAAc,GAClB,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;IAE9G,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC;AACpG,CAAC"}
1
+ {"version":3,"file":"exchange-comparison.js","sourceRoot":"","sources":["../src/exchange-comparison.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EAAE,uBAAuB,EAAiD,MAAM,0BAA0B,CAAC;AAClH,OAAO,EAAE,mBAAmB,EAA4B,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAqB,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EAAE,wBAAwB,EAAyB,MAAM,wBAAwB,CAAC;AA6BzF,MAAM,UAAU,uBAAuB,CAAC,MAAiB,EAAE,QAA0B;IACnF,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC3D,MAAM,YAAY,GAAG,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAErD,IAAI,QAAQ,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;QACtC,OAAO;YACL,QAAQ;YACR,YAAY;YACZ,aAAa,EAAE,IAAI;YACnB,gBAAgB,EAAE,IAAI;YACtB,aAAa,EAAE,IAAI;YACnB,cAAc,EAAE,IAAI;SACrB,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACxE,MAAM,YAAY,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;IACzD,MAAM,gBAAgB,GAAG,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IAEjG,MAAM,aAAa,GAAG,wBAAwB,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC5F,MAAM,cAAc,GAClB,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;IAE9G,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC;AACpG,CAAC"}
@@ -1,27 +1,21 @@
1
1
  /**
2
- * The row §15 left open: an observed request/response BODY compared against a
3
- * declared DTO's fields, not merely *which* DTOs a role names
4
- * (`declaredSchemaRoles`, which stops at "here are the schemas"). Reads
5
- * `DTO.attrs.fieldDetail` — `{name, nullable, required, type?}[]`, written by
6
- * `adapter-openapi`'s own `document.ts` directly from the contract, never
7
- * derived here.
2
+ * §15's open row: an observed request/response BODY compared against a
3
+ * declared DTO's fields, not just which DTOs a role names
4
+ * (`declaredSchemaRoles` stops at "here are the schemas"). Reads
5
+ * `DTO.attrs.fieldDetail` (`{name, nullable, required, type?}[]`), written
6
+ * by `adapter-openapi`'s `document.ts` directly from the contract.
8
7
  *
9
- * **Comparable to the resolved graph, not to a stream.** This takes a raw
10
- * body already in hand (the same `string | null` `browser-network-collector`
11
- * already captures) — parsing and shape-checking are this file's job, sourcing
12
- * the bytes is not, matching every other comparator in this package.
8
+ * Takes a raw body already in hand — sourcing the bytes isn't this file's
9
+ * job, matching every other comparator in this package.
13
10
  *
14
- * **Extra fields are never reported.** This adapter does not capture
11
+ * Extra fields are never reported: this adapter doesn't capture
15
12
  * `additionalProperties`, so "the body has a field the contract doesn't
16
- * mention" is not a claim the contract supports either way — reporting it
17
- * would be inventing a stricter contract than the one that was published.
13
+ * mention" isn't a claim the contract supports either way.
18
14
  *
19
- * **A role naming more than one DTO refuses, rather than picks one.**
20
- * `declaredSchemaRoles` unions across every serving route by design (DEC-115,
21
- * multiple repo-scoped routes serving one workspace endpoint) — ordinarily
22
- * they agree, but when they name two different schemas for the same role,
23
- * comparing the body against whichever came first would silently prefer one
24
- * repository's contract over another's.
15
+ * A role naming more than one DTO refuses rather than picks one:
16
+ * `declaredSchemaRoles` unions across serving routes (DEC-115) — when they
17
+ * name different schemas for the same role, picking one would silently
18
+ * prefer one repository's contract over another's.
25
19
  */
26
20
  import type { IRNode } from "@descryy/ir";
27
21
  export interface FieldDetail {
@@ -1 +1 @@
1
- {"version":3,"file":"schema-comparison.d.ts","sourceRoot":"","sources":["../src/schema-comparison.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GACxH;IAAE,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,gBAAgB;AAC1B,4EAA4E;AAC1E;IAAE,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAA;CAAE;AAC5C,8EAA8E;GAC5E;IAAE,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AAC3G,gGAAgG;GAC9F;IAAE,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AACnE,wFAAwF;GACtF;IAAE,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AAC3F,8EAA8E;GAC5E;IAAE,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAC7F;IAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,aAAa,EAAE,CAAA;CAAE,CAAC;AAwC7G,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,gBAAgB,CA+DzH"}
1
+ {"version":3,"file":"schema-comparison.d.ts","sourceRoot":"","sources":["../src/schema-comparison.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GACxH;IAAE,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,gBAAgB;AAC1B,4EAA4E;AAC1E;IAAE,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAA;CAAE;AAC5C,8EAA8E;GAC5E;IAAE,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AAC3G,gGAAgG;GAC9F;IAAE,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AACnE,wFAAwF;GACtF;IAAE,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AAC3F,8EAA8E;GAC5E;IAAE,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAC7F;IAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,aAAa,EAAE,CAAA;CAAE,CAAC;AAwC7G,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,gBAAgB,CA6DzH"}
@@ -1,27 +1,21 @@
1
1
  /**
2
- * The row §15 left open: an observed request/response BODY compared against a
3
- * declared DTO's fields, not merely *which* DTOs a role names
4
- * (`declaredSchemaRoles`, which stops at "here are the schemas"). Reads
5
- * `DTO.attrs.fieldDetail` — `{name, nullable, required, type?}[]`, written by
6
- * `adapter-openapi`'s own `document.ts` directly from the contract, never
7
- * derived here.
2
+ * §15's open row: an observed request/response BODY compared against a
3
+ * declared DTO's fields, not just which DTOs a role names
4
+ * (`declaredSchemaRoles` stops at "here are the schemas"). Reads
5
+ * `DTO.attrs.fieldDetail` (`{name, nullable, required, type?}[]`), written
6
+ * by `adapter-openapi`'s `document.ts` directly from the contract.
8
7
  *
9
- * **Comparable to the resolved graph, not to a stream.** This takes a raw
10
- * body already in hand (the same `string | null` `browser-network-collector`
11
- * already captures) — parsing and shape-checking are this file's job, sourcing
12
- * the bytes is not, matching every other comparator in this package.
8
+ * Takes a raw body already in hand — sourcing the bytes isn't this file's
9
+ * job, matching every other comparator in this package.
13
10
  *
14
- * **Extra fields are never reported.** This adapter does not capture
11
+ * Extra fields are never reported: this adapter doesn't capture
15
12
  * `additionalProperties`, so "the body has a field the contract doesn't
16
- * mention" is not a claim the contract supports either way — reporting it
17
- * would be inventing a stricter contract than the one that was published.
13
+ * mention" isn't a claim the contract supports either way.
18
14
  *
19
- * **A role naming more than one DTO refuses, rather than picks one.**
20
- * `declaredSchemaRoles` unions across every serving route by design (DEC-115,
21
- * multiple repo-scoped routes serving one workspace endpoint) — ordinarily
22
- * they agree, but when they name two different schemas for the same role,
23
- * comparing the body against whichever came first would silently prefer one
24
- * repository's contract over another's.
15
+ * A role naming more than one DTO refuses rather than picks one:
16
+ * `declaredSchemaRoles` unions across serving routes (DEC-115) — when they
17
+ * name different schemas for the same role, picking one would silently
18
+ * prefer one repository's contract over another's.
25
19
  */
26
20
  function isFieldDetail(value) {
27
21
  if (typeof value !== "object" || value === null)
@@ -104,9 +98,7 @@ export function compareBodyAgainstSchema(schemas, rawBody) {
104
98
  if (field.type === undefined)
105
99
  continue;
106
100
  const check = TYPE_CHECKS[field.type];
107
- // An unrecognised declared type (the document names something outside
108
- // this map) is not checked, rather than silently treated as a match —
109
- // there is nothing here yet to compare it against.
101
+ // Unrecognised declared type isn't checked, not silently treated as a match.
110
102
  if (check !== undefined && !check(value)) {
111
103
  mismatches.push({
112
104
  kind: "type-mismatch",
@@ -1 +1 @@
1
- {"version":3,"file":"schema-comparison.js","sourceRoot":"","sources":["../src/schema-comparison.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema-comparison.js","sourceRoot":"","sources":["../src/schema-comparison.ts"],"names":[],"mappings":"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"}
@@ -1,21 +1,17 @@
1
1
  /**
2
- * A real HTTP status classified into the class an OpenAPI document actually
3
- * has a role vocabulary for. `adapter-openapi`'s `Operation` (descry-adapters)
4
- * carries `responseSchemas` (2xx) and `errorSchemas` (non-2xx) — two roles,
5
- * not eleven status codes — so this reader stops at the same resolution the
6
- * contract itself does, rather than inventing a numeric comparison the
7
- * document was never asked to support.
2
+ * A real HTTP status classified into the class an OpenAPI document has a
3
+ * role vocabulary for. `adapter-openapi`'s `Operation` carries
4
+ * `responseSchemas` (2xx) and `errorSchemas` (non-2xx) — two roles, not
5
+ * eleven status codes — so this stops at the contract's own resolution.
8
6
  */
9
7
  export declare const STATUS_BUCKETS: readonly ["informational", "success", "redirect", "client-error", "server-error"];
10
8
  export type StatusBucket = (typeof STATUS_BUCKETS)[number];
11
9
  export declare function classifyStatus(status: number): StatusBucket;
12
10
  /**
13
- * The DTO role (`adapter.ts`'s own `roles` vocabulary: `"request"` /
14
- * `"response"` / `"errorResponse"`) a bucket corresponds to — `null` for
15
- * informational/redirect, which `adapter-openapi` never assigns a role to at
16
- * all. Refused rather than guessed: reporting "no declared schema" for a
17
- * bucket the contract was never asked about would read as a finding where
18
- * there is only an unmodelled case.
11
+ * The DTO role a bucket corresponds to (`"request"`/`"response"`/
12
+ * `"errorResponse"`) — `null` for informational/redirect, which
13
+ * `adapter-openapi` never assigns a role to. Refused rather than guessed:
14
+ * "no declared schema" for an unmodelled bucket would read as a finding.
19
15
  */
20
16
  export declare function expectedRoleForBucket(bucket: StatusBucket): "response" | "errorResponse" | null;
21
17
  //# sourceMappingURL=status-bucket.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"status-bucket.d.ts","sourceRoot":"","sources":["../src/status-bucket.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,eAAO,MAAM,cAAc,mFAAoF,CAAC;AAChH,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAM3D;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,GAAG,UAAU,GAAG,eAAe,GAAG,IAAI,CAI/F"}
1
+ {"version":3,"file":"status-bucket.d.ts","sourceRoot":"","sources":["../src/status-bucket.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,cAAc,mFAAoF,CAAC;AAChH,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAM3D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,GAAG,UAAU,GAAG,eAAe,GAAG,IAAI,CAI/F"}
@@ -1,10 +1,8 @@
1
1
  /**
2
- * A real HTTP status classified into the class an OpenAPI document actually
3
- * has a role vocabulary for. `adapter-openapi`'s `Operation` (descry-adapters)
4
- * carries `responseSchemas` (2xx) and `errorSchemas` (non-2xx) — two roles,
5
- * not eleven status codes — so this reader stops at the same resolution the
6
- * contract itself does, rather than inventing a numeric comparison the
7
- * document was never asked to support.
2
+ * A real HTTP status classified into the class an OpenAPI document has a
3
+ * role vocabulary for. `adapter-openapi`'s `Operation` carries
4
+ * `responseSchemas` (2xx) and `errorSchemas` (non-2xx) — two roles, not
5
+ * eleven status codes — so this stops at the contract's own resolution.
8
6
  */
9
7
  export const STATUS_BUCKETS = ["informational", "success", "redirect", "client-error", "server-error"];
10
8
  export function classifyStatus(status) {
@@ -19,12 +17,10 @@ export function classifyStatus(status) {
19
17
  return "server-error";
20
18
  }
21
19
  /**
22
- * The DTO role (`adapter.ts`'s own `roles` vocabulary: `"request"` /
23
- * `"response"` / `"errorResponse"`) a bucket corresponds to — `null` for
24
- * informational/redirect, which `adapter-openapi` never assigns a role to at
25
- * all. Refused rather than guessed: reporting "no declared schema" for a
26
- * bucket the contract was never asked about would read as a finding where
27
- * there is only an unmodelled case.
20
+ * The DTO role a bucket corresponds to (`"request"`/`"response"`/
21
+ * `"errorResponse"`) — `null` for informational/redirect, which
22
+ * `adapter-openapi` never assigns a role to. Refused rather than guessed:
23
+ * "no declared schema" for an unmodelled bucket would read as a finding.
28
24
  */
29
25
  export function expectedRoleForBucket(bucket) {
30
26
  if (bucket === "success")
@@ -1 +1 @@
1
- {"version":3,"file":"status-bucket.js","sourceRoot":"","sources":["../src/status-bucket.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,CAAU,CAAC;AAGhH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;QAAE,OAAO,eAAe,CAAC;IAC1D,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;QAAE,OAAO,SAAS,CAAC;IACpD,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;QAAE,OAAO,UAAU,CAAC;IACrD,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;QAAE,OAAO,cAAc,CAAC;IACzD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAoB;IACxD,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,UAAU,CAAC;IAC5C,IAAI,MAAM,KAAK,cAAc,IAAI,MAAM,KAAK,cAAc;QAAE,OAAO,eAAe,CAAC;IACnF,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"status-bucket.js","sourceRoot":"","sources":["../src/status-bucket.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,CAAU,CAAC;AAGhH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;QAAE,OAAO,eAAe,CAAC;IAC1D,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;QAAE,OAAO,SAAS,CAAC;IACpD,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;QAAE,OAAO,UAAU,CAAC;IACrD,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;QAAE,OAAO,cAAc,CAAC;IACzD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAoB;IACxD,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,UAAU,CAAC;IAC5C,IAAI,MAAM,KAAK,cAAc,IAAI,MAAM,KAAK,cAAc;QAAE,OAAO,eAAe,CAAC;IACnF,OAAO,IAAI,CAAC;AACd,CAAC"}
package/package.json CHANGED
@@ -1,9 +1,14 @@
1
1
  {
2
2
  "name": "@descryy/runtime-openapi-observation",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "description": "OpenAPI runtime contract comparison (plan \u00a715/\u00a718): a real observed HTTP exchange, compared against the graph's already-declared API_ENDPOINT/DTO shapes -- documented/undocumented/wrong-method resolution and status-bucket-vs-declared-role comparison.",
6
6
  "license": "UNLICENSED",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/descryhq-wq/descry-runtime.git",
10
+ "directory": "packages/openapi-observation"
11
+ },
7
12
  "engines": {
8
13
  "node": ">=22.5"
9
14
  },
@@ -24,9 +29,9 @@
24
29
  "build": "tsc -b"
25
30
  },
26
31
  "dependencies": {
27
- "@descryy/ir": "0.3.0",
28
- "@descryy/core": "0.3.0",
29
- "@descryy/runtime-graph-correlator": "0.2.0"
32
+ "@descryy/ir": "0.5.0",
33
+ "@descryy/core": "0.5.0",
34
+ "@descryy/runtime-graph-correlator": "0.4.0"
30
35
  },
31
36
  "devDependencies": {
32
37
  "@descry/adapter-openapi": "file:../../../descry-adapters/packages/adapter-openapi",