@lovrozagar/oat 0.9.1 → 0.11.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.
Files changed (283) hide show
  1. package/README.md +26 -1936
  2. package/dist/cli.js +326 -60
  3. package/dist/config/define-config.d.ts +15 -1
  4. package/dist/config/define-config.d.ts.map +1 -1
  5. package/dist/config/define-config.js.map +1 -1
  6. package/dist/config/validate.d.ts +12 -0
  7. package/dist/config/validate.d.ts.map +1 -0
  8. package/dist/config/validate.js +86 -0
  9. package/dist/config/validate.js.map +1 -0
  10. package/dist/conformance/effects.d.ts +9 -0
  11. package/dist/conformance/effects.d.ts.map +1 -0
  12. package/dist/conformance/effects.js +276 -0
  13. package/dist/conformance/effects.js.map +1 -0
  14. package/dist/conformance/expected-failures.d.ts +18 -0
  15. package/dist/conformance/expected-failures.d.ts.map +1 -0
  16. package/dist/conformance/expected-failures.js +48 -0
  17. package/dist/conformance/expected-failures.js.map +1 -0
  18. package/dist/conformance/feature-gate.d.ts +7 -0
  19. package/dist/conformance/feature-gate.d.ts.map +1 -0
  20. package/dist/conformance/feature-gate.js +428 -0
  21. package/dist/conformance/feature-gate.js.map +1 -0
  22. package/dist/conformance/fuzz.d.ts +108 -0
  23. package/dist/conformance/fuzz.d.ts.map +1 -0
  24. package/dist/conformance/fuzz.js +246 -0
  25. package/dist/conformance/fuzz.js.map +1 -0
  26. package/dist/conformance/leaks.d.ts +10 -0
  27. package/dist/conformance/leaks.d.ts.map +1 -0
  28. package/dist/conformance/leaks.js +23 -0
  29. package/dist/conformance/leaks.js.map +1 -0
  30. package/dist/conformance/pool.d.ts +49 -0
  31. package/dist/conformance/pool.d.ts.map +1 -0
  32. package/dist/conformance/pool.js +75 -0
  33. package/dist/conformance/pool.js.map +1 -0
  34. package/dist/conformance/rate-limit.d.ts +7 -0
  35. package/dist/conformance/rate-limit.d.ts.map +1 -0
  36. package/dist/conformance/rate-limit.js +372 -0
  37. package/dist/conformance/rate-limit.js.map +1 -0
  38. package/dist/conformance/scope.d.ts +15 -0
  39. package/dist/conformance/scope.d.ts.map +1 -0
  40. package/dist/conformance/scope.js +78 -0
  41. package/dist/conformance/scope.js.map +1 -0
  42. package/dist/conformance/seed-contract.d.ts +11 -0
  43. package/dist/conformance/seed-contract.d.ts.map +1 -0
  44. package/dist/conformance/seed-contract.js +680 -0
  45. package/dist/conformance/seed-contract.js.map +1 -0
  46. package/dist/conformance/shapes.d.ts +35 -0
  47. package/dist/conformance/shapes.d.ts.map +1 -0
  48. package/dist/conformance/shapes.js +162 -0
  49. package/dist/conformance/shapes.js.map +1 -0
  50. package/dist/conformance/specs.d.ts +21 -0
  51. package/dist/conformance/specs.d.ts.map +1 -0
  52. package/dist/conformance/specs.js +306 -0
  53. package/dist/conformance/specs.js.map +1 -0
  54. package/dist/conformance/suite.d.ts +209 -0
  55. package/dist/conformance/suite.d.ts.map +1 -0
  56. package/dist/conformance/suite.js +1538 -0
  57. package/dist/conformance/suite.js.map +1 -0
  58. package/dist/conformance/unique.d.ts +7 -0
  59. package/dist/conformance/unique.d.ts.map +1 -0
  60. package/dist/conformance/unique.js +586 -0
  61. package/dist/conformance/unique.js.map +1 -0
  62. package/dist/conformance/worker.d.ts +3 -0
  63. package/dist/conformance/worker.d.ts.map +1 -0
  64. package/dist/conformance/worker.js +27 -0
  65. package/dist/conformance/worker.js.map +1 -0
  66. package/dist/index.d.ts +10 -3
  67. package/dist/index.js +6 -2
  68. package/dist/reference/defects.d.ts +71 -1
  69. package/dist/reference/defects.d.ts.map +1 -1
  70. package/dist/reference/defects.js +74 -8
  71. package/dist/reference/defects.js.map +1 -1
  72. package/dist/reference/dialect.d.ts +6 -4
  73. package/dist/reference/dialect.d.ts.map +1 -1
  74. package/dist/reference/dialect.js +1 -0
  75. package/dist/reference/dialect.js.map +1 -1
  76. package/dist/reference/http.d.ts +17 -25
  77. package/dist/reference/http.d.ts.map +1 -1
  78. package/dist/reference/http.js +574 -224
  79. package/dist/reference/http.js.map +1 -1
  80. package/dist/reference/listing.d.ts +51 -0
  81. package/dist/reference/listing.d.ts.map +1 -0
  82. package/dist/reference/listing.js +256 -0
  83. package/dist/reference/listing.js.map +1 -0
  84. package/dist/reference/model.d.ts +35 -1
  85. package/dist/reference/model.d.ts.map +1 -1
  86. package/dist/reference/model.js +42 -0
  87. package/dist/reference/model.js.map +1 -1
  88. package/dist/reference/query.d.ts +132 -43
  89. package/dist/reference/query.d.ts.map +1 -1
  90. package/dist/reference/query.js +397 -315
  91. package/dist/reference/query.js.map +1 -1
  92. package/dist/reference/shapes.d.ts +60 -0
  93. package/dist/reference/shapes.d.ts.map +1 -0
  94. package/dist/reference/shapes.js +142 -0
  95. package/dist/reference/shapes.js.map +1 -0
  96. package/dist/reference/spec.d.ts +9 -2
  97. package/dist/reference/spec.d.ts.map +1 -1
  98. package/dist/reference/spec.js +291 -71
  99. package/dist/reference/spec.js.map +1 -1
  100. package/dist/reference/store-api.d.ts +14 -43
  101. package/dist/reference/store-api.d.ts.map +1 -1
  102. package/dist/reference/store-api.js +8 -58
  103. package/dist/reference/store-api.js.map +1 -1
  104. package/dist/reference/stores/memory.d.ts +12 -15
  105. package/dist/reference/stores/memory.d.ts.map +1 -1
  106. package/dist/reference/stores/memory.js +22 -70
  107. package/dist/reference/stores/memory.js.map +1 -1
  108. package/dist/reference/stores/postgres.d.ts +11 -23
  109. package/dist/reference/stores/postgres.d.ts.map +1 -1
  110. package/dist/reference/stores/postgres.js +53 -334
  111. package/dist/reference/stores/postgres.js.map +1 -1
  112. package/dist/reference/stores/sql-compile.d.ts +36 -0
  113. package/dist/reference/stores/sql-compile.d.ts.map +1 -0
  114. package/dist/reference/stores/sql-compile.js +95 -0
  115. package/dist/reference/stores/sql-compile.js.map +1 -0
  116. package/dist/reference/stores/sqlite.d.ts +12 -27
  117. package/dist/reference/stores/sqlite.d.ts.map +1 -1
  118. package/dist/reference/stores/sqlite.js +54 -355
  119. package/dist/reference/stores/sqlite.js.map +1 -1
  120. package/dist/report/console.d.ts +2 -1
  121. package/dist/report/console.d.ts.map +1 -1
  122. package/dist/report/console.js +56 -10
  123. package/dist/report/console.js.map +1 -1
  124. package/dist/report/matrix.d.ts +10 -13
  125. package/dist/report/matrix.d.ts.map +1 -1
  126. package/dist/report/matrix.js +82 -18
  127. package/dist/report/matrix.js.map +1 -1
  128. package/dist/report/render.d.ts +18 -1
  129. package/dist/report/render.d.ts.map +1 -1
  130. package/dist/report/render.js +169 -14
  131. package/dist/report/render.js.map +1 -1
  132. package/dist/runtime/async.d.ts +16 -3
  133. package/dist/runtime/async.d.ts.map +1 -1
  134. package/dist/runtime/async.js +24 -19
  135. package/dist/runtime/async.js.map +1 -1
  136. package/dist/runtime/auth.d.ts +2 -9
  137. package/dist/runtime/auth.d.ts.map +1 -1
  138. package/dist/runtime/auth.js +38 -62
  139. package/dist/runtime/auth.js.map +1 -1
  140. package/dist/runtime/body.d.ts +15 -3
  141. package/dist/runtime/body.d.ts.map +1 -1
  142. package/dist/runtime/body.js +61 -12
  143. package/dist/runtime/body.js.map +1 -1
  144. package/dist/runtime/check-costs.d.ts +15 -0
  145. package/dist/runtime/check-costs.d.ts.map +1 -0
  146. package/dist/runtime/check-costs.js +114 -0
  147. package/dist/runtime/check-costs.js.map +1 -0
  148. package/dist/runtime/check-ids.d.ts +15 -0
  149. package/dist/runtime/check-ids.d.ts.map +1 -0
  150. package/dist/runtime/check-ids.js +140 -0
  151. package/dist/runtime/check-ids.js.map +1 -0
  152. package/dist/runtime/checks.d.ts +122 -18
  153. package/dist/runtime/checks.d.ts.map +1 -1
  154. package/dist/runtime/checks.js +3437 -1933
  155. package/dist/runtime/checks.js.map +1 -1
  156. package/dist/runtime/client.d.ts +112 -0
  157. package/dist/runtime/client.d.ts.map +1 -1
  158. package/dist/runtime/client.js +271 -39
  159. package/dist/runtime/client.js.map +1 -1
  160. package/dist/runtime/cookies.d.ts +16 -2
  161. package/dist/runtime/cookies.d.ts.map +1 -1
  162. package/dist/runtime/cookies.js +83 -22
  163. package/dist/runtime/cookies.js.map +1 -1
  164. package/dist/runtime/exchanges.d.ts +4 -5
  165. package/dist/runtime/exchanges.d.ts.map +1 -1
  166. package/dist/runtime/exchanges.js +33 -55
  167. package/dist/runtime/exchanges.js.map +1 -1
  168. package/dist/runtime/exit.d.ts +40 -0
  169. package/dist/runtime/exit.d.ts.map +1 -0
  170. package/dist/runtime/exit.js +48 -0
  171. package/dist/runtime/exit.js.map +1 -0
  172. package/dist/runtime/feature-gate.d.ts +0 -9
  173. package/dist/runtime/feature-gate.d.ts.map +1 -1
  174. package/dist/runtime/feature-gate.js +0 -21
  175. package/dist/runtime/feature-gate.js.map +1 -1
  176. package/dist/runtime/finding.d.ts +61 -7
  177. package/dist/runtime/finding.d.ts.map +1 -1
  178. package/dist/runtime/finding.js +74 -12
  179. package/dist/runtime/finding.js.map +1 -1
  180. package/dist/runtime/fixture.d.ts +35 -28
  181. package/dist/runtime/fixture.d.ts.map +1 -1
  182. package/dist/runtime/fixture.js +92 -731
  183. package/dist/runtime/fixture.js.map +1 -1
  184. package/dist/runtime/generate.d.ts +63 -0
  185. package/dist/runtime/generate.d.ts.map +1 -0
  186. package/dist/runtime/generate.js +635 -0
  187. package/dist/runtime/generate.js.map +1 -0
  188. package/dist/runtime/headers.d.ts +6 -0
  189. package/dist/runtime/headers.d.ts.map +1 -0
  190. package/dist/runtime/headers.js +16 -0
  191. package/dist/runtime/headers.js.map +1 -0
  192. package/dist/runtime/path.d.ts +7 -0
  193. package/dist/runtime/path.d.ts.map +1 -0
  194. package/dist/runtime/path.js +44 -0
  195. package/dist/runtime/path.js.map +1 -0
  196. package/dist/runtime/payloads.d.ts +2 -0
  197. package/dist/runtime/payloads.d.ts.map +1 -1
  198. package/dist/runtime/payloads.js +2 -1
  199. package/dist/runtime/payloads.js.map +1 -1
  200. package/dist/runtime/rate-limit.d.ts +6 -4
  201. package/dist/runtime/rate-limit.d.ts.map +1 -1
  202. package/dist/runtime/rate-limit.js +22 -33
  203. package/dist/runtime/rate-limit.js.map +1 -1
  204. package/dist/runtime/redact.d.ts +24 -0
  205. package/dist/runtime/redact.d.ts.map +1 -0
  206. package/dist/runtime/redact.js +98 -0
  207. package/dist/runtime/redact.js.map +1 -0
  208. package/dist/runtime/run.d.ts +51 -2
  209. package/dist/runtime/run.d.ts.map +1 -1
  210. package/dist/runtime/run.js +463 -195
  211. package/dist/runtime/run.js.map +1 -1
  212. package/dist/runtime/runs.d.ts +5 -0
  213. package/dist/runtime/runs.d.ts.map +1 -1
  214. package/dist/runtime/runs.js +7 -1
  215. package/dist/runtime/runs.js.map +1 -1
  216. package/dist/runtime/scope.d.ts +163 -0
  217. package/dist/runtime/scope.d.ts.map +1 -0
  218. package/dist/runtime/scope.js +423 -0
  219. package/dist/runtime/scope.js.map +1 -0
  220. package/dist/runtime/teardown.d.ts +17 -4
  221. package/dist/runtime/teardown.d.ts.map +1 -1
  222. package/dist/runtime/teardown.js +49 -16
  223. package/dist/runtime/teardown.js.map +1 -1
  224. package/dist/runtime/transcript.d.ts +34 -2
  225. package/dist/runtime/transcript.d.ts.map +1 -1
  226. package/dist/runtime/transcript.js +119 -24
  227. package/dist/runtime/transcript.js.map +1 -1
  228. package/dist/runtime/unique.d.ts +2 -11
  229. package/dist/runtime/unique.d.ts.map +1 -1
  230. package/dist/runtime/unique.js +27 -53
  231. package/dist/runtime/unique.js.map +1 -1
  232. package/dist/runtime/validate.d.ts +13 -2
  233. package/dist/runtime/validate.d.ts.map +1 -1
  234. package/dist/runtime/validate.js +51 -31
  235. package/dist/runtime/validate.js.map +1 -1
  236. package/dist/runtime/wait.d.ts +2 -1
  237. package/dist/runtime/wait.d.ts.map +1 -1
  238. package/dist/runtime/wait.js +2 -36
  239. package/dist/runtime/wait.js.map +1 -1
  240. package/dist/runtime/world.d.ts +31 -3
  241. package/dist/runtime/world.d.ts.map +1 -1
  242. package/dist/runtime/world.js +113 -32
  243. package/dist/runtime/world.js.map +1 -1
  244. package/dist/spec/collection.d.ts +8 -2
  245. package/dist/spec/collection.d.ts.map +1 -1
  246. package/dist/spec/collection.js +47 -7
  247. package/dist/spec/collection.js.map +1 -1
  248. package/dist/spec/extensions.d.ts +5 -1
  249. package/dist/spec/extensions.d.ts.map +1 -1
  250. package/dist/spec/extensions.js +9 -2
  251. package/dist/spec/extensions.js.map +1 -1
  252. package/dist/spec/graph.d.ts +46 -0
  253. package/dist/spec/graph.d.ts.map +1 -1
  254. package/dist/spec/graph.js +175 -11
  255. package/dist/spec/graph.js.map +1 -1
  256. package/dist/spec/load.d.ts +25 -5
  257. package/dist/spec/load.d.ts.map +1 -1
  258. package/dist/spec/load.js +160 -59
  259. package/dist/spec/load.js.map +1 -1
  260. package/dist/spec/query-capabilities.d.ts +4 -0
  261. package/dist/spec/query-capabilities.d.ts.map +1 -1
  262. package/dist/spec/query-capabilities.js +6 -0
  263. package/dist/spec/query-capabilities.js.map +1 -1
  264. package/dist/spec/schema.d.ts +20 -0
  265. package/dist/spec/schema.d.ts.map +1 -0
  266. package/dist/spec/schema.js +118 -0
  267. package/dist/spec/schema.js.map +1 -0
  268. package/dist/spec/tag-schema.d.ts +12 -0
  269. package/dist/spec/tag-schema.d.ts.map +1 -0
  270. package/dist/spec/tag-schema.js +143 -0
  271. package/dist/spec/tag-schema.js.map +1 -0
  272. package/dist/spec/types.js +17 -1
  273. package/dist/spec/types.js.map +1 -1
  274. package/docs/api.md +59 -0
  275. package/docs/assumptions.md +99 -0
  276. package/docs/checks.md +183 -0
  277. package/docs/commands.md +214 -0
  278. package/docs/configuration.md +650 -0
  279. package/docs/model.md +184 -0
  280. package/docs/reference-defects.md +94 -0
  281. package/docs/reports.md +211 -0
  282. package/docs/tags.md +400 -0
  283. package/package.json +3 -1
@@ -0,0 +1,372 @@
1
+ /**
2
+ * Reactive 429 backoff and plan-limit adopt. Tags stay the proactive path; these cases prove
3
+ * the first 429 is not a seed failure and that a 402 does not invent a table.
4
+ */
5
+ import { createServer } from "node:http";
6
+ import { Client } from "../runtime/client.js";
7
+ import { parseRetryAfter, retryWaitMs, RETRY_BACKOFF_CAP_MS } from "../runtime/rate-limit.js";
8
+ import { run } from "../runtime/run.js";
9
+ import { isPlanLimitResponse } from "../runtime/world.js";
10
+ function send(res, status, body, extra) {
11
+ if (body === undefined) {
12
+ res.writeHead(status, extra);
13
+ res.end();
14
+ return;
15
+ }
16
+ const text = JSON.stringify(body);
17
+ res.writeHead(status, {
18
+ "content-length": String(Buffer.byteLength(text)),
19
+ "content-type": "application/json",
20
+ ...extra,
21
+ });
22
+ res.end(text);
23
+ }
24
+ function readJson(req) {
25
+ return new Promise((resolve, reject) => {
26
+ const chunks = [];
27
+ req.on("data", (chunk) => {
28
+ chunks.push(chunk);
29
+ });
30
+ req.on("end", () => {
31
+ const text = Buffer.concat(chunks).toString("utf8");
32
+ if (text === "") {
33
+ resolve(undefined);
34
+ return;
35
+ }
36
+ try {
37
+ resolve(JSON.parse(text));
38
+ }
39
+ catch (error) {
40
+ reject(error);
41
+ }
42
+ });
43
+ req.on("error", reject);
44
+ });
45
+ }
46
+ async function listen(handler) {
47
+ const server = createServer(handler);
48
+ await new Promise((resolve) => {
49
+ server.listen(0, "127.0.0.1", resolve);
50
+ });
51
+ const addr = server.address();
52
+ return {
53
+ close: () => new Promise((resolve, reject) => {
54
+ server.close((error) => (error ? reject(error) : resolve()));
55
+ }),
56
+ url: `http://127.0.0.1:${addr.port}`,
57
+ };
58
+ }
59
+ const ITEM = {
60
+ properties: { id: { type: "string" }, name: { type: "string" } },
61
+ required: ["id", "name"],
62
+ type: "object",
63
+ };
64
+ function thingSpec() {
65
+ return {
66
+ info: { title: "untagged-429", version: "1" },
67
+ openapi: "3.1.0",
68
+ paths: {
69
+ "/v1/things": {
70
+ get: {
71
+ operationId: "thing.list",
72
+ responses: {
73
+ "200": {
74
+ content: {
75
+ "application/json": {
76
+ schema: {
77
+ properties: { items: { items: ITEM, type: "array" } },
78
+ required: ["items"],
79
+ type: "object",
80
+ },
81
+ },
82
+ },
83
+ description: "ok",
84
+ },
85
+ },
86
+ "x-entity": { action: "list", identity: "id", name: "thing" },
87
+ },
88
+ post: {
89
+ operationId: "thing.create",
90
+ requestBody: {
91
+ content: {
92
+ "application/json": {
93
+ schema: { properties: { name: { type: "string" } }, required: ["name"], type: "object" },
94
+ },
95
+ },
96
+ required: true,
97
+ },
98
+ responses: {
99
+ "201": { content: { "application/json": { schema: ITEM } }, description: "created" },
100
+ },
101
+ "x-entity": { action: "create", identity: "id", name: "thing" },
102
+ },
103
+ },
104
+ "/v1/things/{id}": {
105
+ delete: {
106
+ operationId: "thing.delete",
107
+ responses: { "204": { description: "gone" } },
108
+ "x-entity": { action: "delete", identity: "id", name: "thing" },
109
+ },
110
+ get: {
111
+ operationId: "thing.read",
112
+ responses: { "200": { content: { "application/json": { schema: ITEM } }, description: "ok" } },
113
+ "x-entity": { action: "read", identity: "id", name: "thing" },
114
+ },
115
+ },
116
+ },
117
+ };
118
+ }
119
+ export async function runRateLimitSuite() {
120
+ const results = [];
121
+ const push = (name, why, ok, detail) => {
122
+ results.push({ detail, name, ok, why });
123
+ };
124
+ push("Retry-After delta-seconds and exponential cap", "pure wait math must not hang a tester", parseRetryAfter("1") === 1000 && retryWaitMs(undefined, 8) === RETRY_BACKOFF_CAP_MS, `delta=${String(parseRetryAfter("1"))} cap=${String(retryWaitMs(undefined, 8))}`);
125
+ push("402 and table_plan_limit are plan limits; 429 is not", "reuse is 402-only", isPlanLimitResponse(402, {}) &&
126
+ isPlanLimitResponse(400, { error_key: "table_plan_limit" }) &&
127
+ !isPlanLimitResponse(429, { error_key: "table_plan_limit" }), "ok");
128
+ try {
129
+ let posts = 0;
130
+ const rows = new Map();
131
+ const document = thingSpec();
132
+ const server = await listen((req, res) => {
133
+ void (async () => {
134
+ const url = new URL(req.url ?? "/", "http://127.0.0.1");
135
+ const method = (req.method ?? "GET").toUpperCase();
136
+ if (url.pathname === "/v1/openapi/spec" && method === "GET")
137
+ return send(res, 200, document);
138
+ if (url.pathname === "/v1/things" && method === "GET")
139
+ return send(res, 200, { items: [...rows.values()] });
140
+ if (url.pathname === "/v1/things" && method === "POST") {
141
+ posts += 1;
142
+ if (posts === 1)
143
+ return send(res, 429, { error: "too_many_requests" }, { "retry-after": "0" });
144
+ const id = `t_${String(posts)}`;
145
+ const row = { id, name: "n" };
146
+ rows.set(id, row);
147
+ return send(res, 201, row);
148
+ }
149
+ const item = /^\/v1\/things\/([^/]+)$/.exec(url.pathname);
150
+ if (item !== null && method === "DELETE") {
151
+ rows.delete(item[1] ?? "");
152
+ return send(res, 204);
153
+ }
154
+ if (item !== null && method === "GET") {
155
+ const row = rows.get(item[1] ?? "");
156
+ return row === undefined ? send(res, 404) : send(res, 200, row);
157
+ }
158
+ return send(res, 404);
159
+ })().catch(() => {
160
+ if (!res.headersSent)
161
+ send(res, 500);
162
+ });
163
+ });
164
+ try {
165
+ const client = new Client(server.url);
166
+ const first = await client.request("POST", "/v1/things", { body: { name: "n" } });
167
+ push("Client.request retries a 429 with Retry-After and returns 201", "first 429 is not the result", first.status === 201 && client.transcript.map((e) => e.status).join(",") === "429,201", `status=${first.status} seq=${client.transcript.map((e) => e.status).join(",")}`);
168
+ const result = await run({
169
+ baseUrl: server.url,
170
+ keepFixtures: true,
171
+ only: ["thing"],
172
+ principals: [{ headers: { authorization: "Bearer t" }, id: "alpha" }],
173
+ seed: 1,
174
+ spec: `${server.url}/v1/openapi/spec`,
175
+ });
176
+ const blocked = result.findings.filter((f) => f.verdict === "BLOCKED" && f.check === "world.seed");
177
+ push("seed is not failed by the first 429 on an untagged create", "no x-rate-limit required", blocked.length === 0 && result.entitiesTested.includes("thing"), `blocked=${blocked.length} entities=${result.entitiesTested.join(",")}`);
178
+ }
179
+ finally {
180
+ await server.close();
181
+ }
182
+ }
183
+ catch (error) {
184
+ push("Client.request retries a 429 with Retry-After and returns 201", "first 429 is not the result", false, error instanceof Error ? error.message : String(error));
185
+ }
186
+ try {
187
+ const tables = new Map([
188
+ ["tbl_extract", { id: "tbl_extract", name: "from-extract" }],
189
+ ]);
190
+ const rows = new Map();
191
+ let rowSeq = 0;
192
+ const document = {
193
+ info: { title: "plan-limit", version: "1" },
194
+ openapi: "3.1.0",
195
+ paths: {
196
+ "/v1/tables": {
197
+ get: {
198
+ operationId: "table.list",
199
+ responses: {
200
+ "200": {
201
+ content: {
202
+ "application/json": {
203
+ schema: {
204
+ properties: { items: { items: ITEM, type: "array" } },
205
+ required: ["items"],
206
+ type: "object",
207
+ },
208
+ },
209
+ },
210
+ description: "ok",
211
+ },
212
+ },
213
+ "x-entity": { action: "list", identity: "id", name: "table" },
214
+ },
215
+ post: {
216
+ operationId: "table.create",
217
+ requestBody: {
218
+ content: {
219
+ "application/json": {
220
+ schema: { properties: { name: { type: "string" } }, required: ["name"], type: "object" },
221
+ },
222
+ },
223
+ required: true,
224
+ },
225
+ responses: {
226
+ "201": { content: { "application/json": { schema: ITEM } }, description: "created" },
227
+ "402": { description: "payment_required" },
228
+ },
229
+ "x-entity": { action: "create", identity: "id", name: "table" },
230
+ },
231
+ },
232
+ "/v1/tables/{table_id}": {
233
+ delete: {
234
+ operationId: "table.delete",
235
+ parameters: [{ in: "path", name: "table_id", required: true, schema: { type: "string" } }],
236
+ responses: { "204": { description: "gone" } },
237
+ "x-entity": { action: "delete", identity: "id", name: "table" },
238
+ },
239
+ get: {
240
+ operationId: "table.read",
241
+ parameters: [{ in: "path", name: "table_id", required: true, schema: { type: "string" } }],
242
+ responses: { "200": { content: { "application/json": { schema: ITEM } }, description: "ok" } },
243
+ "x-entity": { action: "read", identity: "id", name: "table" },
244
+ },
245
+ },
246
+ "/v1/tables/{table_id}/rows": {
247
+ get: {
248
+ operationId: "row.list",
249
+ parameters: [{ in: "path", name: "table_id", required: true, schema: { type: "string" } }],
250
+ responses: {
251
+ "200": {
252
+ content: {
253
+ "application/json": {
254
+ schema: {
255
+ properties: { items: { items: ITEM, type: "array" } },
256
+ required: ["items"],
257
+ type: "object",
258
+ },
259
+ },
260
+ },
261
+ description: "ok",
262
+ },
263
+ },
264
+ "x-entity": { action: "list", identity: "id", name: "row" },
265
+ },
266
+ post: {
267
+ operationId: "row.create",
268
+ parameters: [{ in: "path", name: "table_id", required: true, schema: { type: "string" } }],
269
+ requestBody: {
270
+ content: {
271
+ "application/json": {
272
+ schema: { properties: { name: { type: "string" } }, required: ["name"], type: "object" },
273
+ },
274
+ },
275
+ required: true,
276
+ },
277
+ responses: {
278
+ "201": { content: { "application/json": { schema: ITEM } }, description: "created" },
279
+ },
280
+ "x-entity": { action: "create", identity: "id", name: "row" },
281
+ },
282
+ },
283
+ "/v1/tables/{table_id}/rows/{row_id}": {
284
+ delete: {
285
+ operationId: "row.delete",
286
+ parameters: [
287
+ { in: "path", name: "table_id", required: true, schema: { type: "string" } },
288
+ { in: "path", name: "row_id", required: true, schema: { type: "string" } },
289
+ ],
290
+ responses: { "204": { description: "gone" } },
291
+ "x-entity": { action: "delete", identity: "id", name: "row" },
292
+ },
293
+ get: {
294
+ operationId: "row.read",
295
+ parameters: [
296
+ { in: "path", name: "table_id", required: true, schema: { type: "string" } },
297
+ { in: "path", name: "row_id", required: true, schema: { type: "string" } },
298
+ ],
299
+ responses: { "200": { content: { "application/json": { schema: ITEM } }, description: "ok" } },
300
+ "x-entity": { action: "read", identity: "id", name: "row" },
301
+ },
302
+ },
303
+ },
304
+ };
305
+ const server = await listen((req, res) => {
306
+ void (async () => {
307
+ const url = new URL(req.url ?? "/", "http://127.0.0.1");
308
+ const method = (req.method ?? "GET").toUpperCase();
309
+ if (url.pathname === "/v1/openapi/spec" && method === "GET")
310
+ return send(res, 200, document);
311
+ if (url.pathname === "/v1/tables" && method === "GET")
312
+ return send(res, 200, { items: [...tables.values()] });
313
+ if (url.pathname === "/v1/tables" && method === "POST") {
314
+ return send(res, 402, { error_key: "table_plan_limit", status_key: "payment_required" });
315
+ }
316
+ const tableItem = /^\/v1\/tables\/([^/]+)$/.exec(url.pathname);
317
+ if (tableItem !== null && method === "GET") {
318
+ const row = tables.get(decodeURIComponent(tableItem[1] ?? ""));
319
+ return row === undefined ? send(res, 404) : send(res, 200, row);
320
+ }
321
+ if (tableItem !== null && method === "DELETE")
322
+ return send(res, 204);
323
+ const rowCol = /^\/v1\/tables\/([^/]+)\/rows$/.exec(url.pathname);
324
+ if (rowCol !== null && method === "GET")
325
+ return send(res, 200, { items: [...rows.values()] });
326
+ if (rowCol !== null && method === "POST") {
327
+ const tableId = decodeURIComponent(rowCol[1] ?? "");
328
+ if (!tables.has(tableId))
329
+ return send(res, 404);
330
+ const body = ((await readJson(req)) ?? {});
331
+ rowSeq += 1;
332
+ const row = { id: `r_${String(rowSeq)}`, name: body.name ?? "n", table_id: tableId };
333
+ rows.set(row.id, row);
334
+ return send(res, 201, row);
335
+ }
336
+ const rowItem = /^\/v1\/tables\/([^/]+)\/rows\/([^/]+)$/.exec(url.pathname);
337
+ if (rowItem !== null && method === "GET") {
338
+ const row = rows.get(decodeURIComponent(rowItem[2] ?? ""));
339
+ return row === undefined ? send(res, 404) : send(res, 200, row);
340
+ }
341
+ if (rowItem !== null && method === "DELETE")
342
+ return send(res, 204);
343
+ return send(res, 404);
344
+ })().catch(() => {
345
+ if (!res.headersSent)
346
+ send(res, 500);
347
+ });
348
+ });
349
+ try {
350
+ const result = await run({
351
+ baseUrl: server.url,
352
+ keepFixtures: true,
353
+ only: ["table", "row"],
354
+ principals: [{ headers: { authorization: "Bearer t" }, id: "alpha" }],
355
+ seed: 1,
356
+ spec: `${server.url}/v1/openapi/spec`,
357
+ });
358
+ const rowBlocked = result.findings.some((f) => f.verdict === "BLOCKED" && f.entity === "row");
359
+ const invented = result.client.transcript.some((e) => e.method === "POST" && new URL(e.url).pathname === "/v1/tables" && e.status < 300);
360
+ const backend402 = result.findings.some((f) => f.verdict === "BACKEND_BUG" && f.detail.includes("402"));
361
+ push("row seeds after table.create 402 when a same-tenant table already exists", "do not invent tables; do not treat documented plan limit as a defect", !rowBlocked && !invented && !backend402 && result.entitiesTested.includes("row"), `blocked=${rowBlocked} invented=${invented} backend402=${backend402} tested=${result.entitiesTested.join(",")}`);
362
+ }
363
+ finally {
364
+ await server.close();
365
+ }
366
+ }
367
+ catch (error) {
368
+ push("row seeds after table.create 402 when a same-tenant table already exists", "do not invent tables; do not treat documented plan limit as a defect", false, error instanceof Error ? error.message : String(error));
369
+ }
370
+ return results;
371
+ }
372
+ //# sourceMappingURL=rate-limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/conformance/rate-limit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Targeted-run recall: `--ops` must not lose a defect it was pointed at.
3
+ *
4
+ * For every defect the reference backend can exhibit, a full run names the operations its finding
5
+ * judges. A run targeted at exactly those operations has to report the same defect. A check whose
6
+ * declared `subjects` omit the operation it actually judges fails here: the targeted run either
7
+ * never queues it or attributes the finding elsewhere.
8
+ */
9
+ import { type ParserResult } from "./suite.ts";
10
+ /**
11
+ * `known` carries, per defect, the operations its finding judged in a full run the caller already
12
+ * made — the defect matrix makes exactly that run — so only the targeted run is sent here.
13
+ */
14
+ export declare function runScopeSuite(filter?: string[], known?: Readonly<Record<string, readonly string[]>>): Promise<ParserResult[]>;
15
+ //# sourceMappingURL=scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/conformance/scope.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAkC,KAAK,YAAY,EAAE,MAAM,YAAY,CAAA;AA+B9E;;;GAGG;AACH,wBAAsB,aAAa,CAClC,MAAM,CAAC,EAAE,MAAM,EAAE,EACjB,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,GACjD,OAAO,CAAC,YAAY,EAAE,CAAC,CAsCzB"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Targeted-run recall: `--ops` must not lose a defect it was pointed at.
3
+ *
4
+ * For every defect the reference backend can exhibit, a full run names the operations its finding
5
+ * judges. A run targeted at exactly those operations has to report the same defect. A check whose
6
+ * declared `subjects` omit the operation it actually judges fails here: the targeted run either
7
+ * never queues it or attributes the finding elsewhere.
8
+ */
9
+ import { DEFECTS } from "../reference/defects.js";
10
+ import { run } from "../runtime/run.js";
11
+ import { EXPECTED, PRINCIPALS, SQL_ONLY } from "./suite.js";
12
+ const NOT_DEFECTS = new Set(["COVERAGE_GAP", "BLOCKED"]);
13
+ function primaryOf(expected) {
14
+ return Array.isArray(expected) ? (expected[0] ?? "") : expected;
15
+ }
16
+ async function runOnce(defects, ops) {
17
+ const { createMemoryServer } = await import("../reference/http.js");
18
+ const server = await createMemoryServer({ defects });
19
+ try {
20
+ const result = await run({
21
+ baseUrl: server.url,
22
+ principals: PRINCIPALS,
23
+ seed: 42,
24
+ spec: `${server.url}/v1/openapi/spec`,
25
+ ...(ops === undefined ? {} : { ops }),
26
+ });
27
+ return {
28
+ findings: result.findings.filter((f) => !NOT_DEFECTS.has(f.verdict)),
29
+ statuses: new Map(result.scope.operations.map((op) => [op.operationId, op.status])),
30
+ };
31
+ }
32
+ finally {
33
+ await server.close();
34
+ }
35
+ }
36
+ /**
37
+ * `known` carries, per defect, the operations its finding judged in a full run the caller already
38
+ * made — the defect matrix makes exactly that run — so only the targeted run is sent here.
39
+ */
40
+ export async function runScopeSuite(filter, known) {
41
+ const results = [];
42
+ const names = Object.keys(DEFECTS)
43
+ .filter((name) => filter === undefined || filter.length === 0 || filter.includes(name))
44
+ .filter((name) => !SQL_ONLY.has(name));
45
+ for (const defect of names) {
46
+ const check = primaryOf(EXPECTED[defect]);
47
+ const name = `--ops recall: ${defect}`;
48
+ const why = `a run targeted at the operation ${check} judges must still report it`;
49
+ try {
50
+ const reported = known?.[defect];
51
+ const ops = reported ?? (await runOnce([defect])).findings.find((f) => f.check === check)?.operations;
52
+ if (ops === undefined) {
53
+ results.push({ detail: "the full run did not report it either", name, ok: false, why });
54
+ continue;
55
+ }
56
+ if (ops.length === 0) {
57
+ results.push({ detail: `${check} finding carries no operation`, name, ok: false, why });
58
+ continue;
59
+ }
60
+ const targeted = await runOnce([defect], [...ops]);
61
+ const detected = targeted.findings.some((f) => f.check === check);
62
+ const failed = ops.some((op) => targeted.statuses.get(op) === "failed");
63
+ results.push({
64
+ detail: `--ops ${ops.join(",")}: ${detected ? "reported" : "MISSED"}, status ${ops
65
+ .map((op) => targeted.statuses.get(op) ?? "absent")
66
+ .join(",")}`,
67
+ name,
68
+ ok: detected && failed,
69
+ why,
70
+ });
71
+ }
72
+ catch (error) {
73
+ results.push({ detail: error instanceof Error ? error.message : String(error), name, ok: false, why });
74
+ }
75
+ }
76
+ return results;
77
+ }
78
+ //# sourceMappingURL=scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/conformance/scope.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAmB,MAAM,yBAAyB,CAAA;AAElE,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AACvC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAqB,MAAM,YAAY,CAAA;AAE9E,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,CAAA;AAExD,SAAS,SAAS,CAAC,QAA2B;IAC7C,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;AAChE,CAAC;AAED,KAAK,UAAU,OAAO,CACrB,OAAqB,EACrB,GAAc;IAEd,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAA;IACnE,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IACpD,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC;YACxB,OAAO,EAAE,MAAM,CAAC,GAAG;YACnB,UAAU,EAAE,UAAU;YACtB,IAAI,EAAE,EAAE;YACR,IAAI,EAAE,GAAG,MAAM,CAAC,GAAG,kBAAkB;YACrC,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;SACrC,CAAC,CAAA;QACF,OAAO;YACN,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACpE,QAAQ,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;SACnF,CAAA;IACF,CAAC;YAAS,CAAC;QACV,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;IACrB,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAClC,MAAiB,EACjB,KAAmD;IAEnD,MAAM,OAAO,GAAmB,EAAE,CAAA;IAClC,MAAM,KAAK,GAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAkB;SAClD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;SACtF,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;IAEvC,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;QACzC,MAAM,IAAI,GAAG,iBAAiB,MAAM,EAAE,CAAA;QACtC,MAAM,GAAG,GAAG,mCAAmC,KAAK,8BAA8B,CAAA;QAClF,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,KAAK,EAAE,CAAC,MAAM,CAAC,CAAA;YAChC,MAAM,GAAG,GACR,QAAQ,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,UAAU,CAAA;YAC1F,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACvB,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,uCAAuC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;gBACvF,SAAQ;YACT,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,+BAA+B,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;gBACvF,SAAQ;YACT,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;YAClD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAA;YACjE,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,QAAQ,CAAC,CAAA;YACvE,OAAO,CAAC,IAAI,CAAC;gBACZ,MAAM,EAAE,SAAS,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,YAAY,GAAG;qBAChF,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC;qBAClD,IAAI,CAAC,GAAG,CAAC,EAAE;gBACb,IAAI;gBACJ,EAAE,EAAE,QAAQ,IAAI,MAAM;gBACtB,GAAG;aACH,CAAC,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;QACvG,CAAC;IACF,CAAC;IACD,OAAO,OAAO,CAAA;AACf,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Fixture walk, cheap-profile effects, and invite/register-as-create contracts.
3
+ *
4
+ * These are the cases a real document trips: `z.unknown()` / `z.record` after `$ref` inlining,
5
+ * `--profile cheap` still POSTing `extract.once`, and `org.inviteMember` / `auth.registerWithEmail`
6
+ * being treated as `POST /things`.
7
+ */
8
+ import type { ParserResult } from "./suite.ts";
9
+ export declare function runFixtureWalkCases(): ParserResult[];
10
+ export declare function runSeedContractSuite(): Promise<ParserResult[]>;
11
+ //# sourceMappingURL=seed-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed-contract.d.ts","sourceRoot":"","sources":["../../src/conformance/seed-contract.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiBH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAM9C,wBAAgB,mBAAmB,IAAI,YAAY,EAAE,CAwNpD;AA2XD,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CA6NpE"}