@lovrozagar/oat 0.10.0 → 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 (278) hide show
  1. package/README.md +25 -2006
  2. package/dist/cli.js +283 -59
  3. package/dist/config/define-config.d.ts +8 -0
  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 +8 -3
  67. package/dist/index.js +5 -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.map +1 -1
  121. package/dist/report/console.js +23 -9
  122. package/dist/report/console.js.map +1 -1
  123. package/dist/report/matrix.d.ts +2 -0
  124. package/dist/report/matrix.d.ts.map +1 -1
  125. package/dist/report/matrix.js +63 -10
  126. package/dist/report/matrix.js.map +1 -1
  127. package/dist/report/render.d.ts +10 -1
  128. package/dist/report/render.d.ts.map +1 -1
  129. package/dist/report/render.js +75 -13
  130. package/dist/report/render.js.map +1 -1
  131. package/dist/runtime/async.d.ts +16 -3
  132. package/dist/runtime/async.d.ts.map +1 -1
  133. package/dist/runtime/async.js +24 -19
  134. package/dist/runtime/async.js.map +1 -1
  135. package/dist/runtime/auth.d.ts +2 -9
  136. package/dist/runtime/auth.d.ts.map +1 -1
  137. package/dist/runtime/auth.js +38 -62
  138. package/dist/runtime/auth.js.map +1 -1
  139. package/dist/runtime/body.d.ts +15 -3
  140. package/dist/runtime/body.d.ts.map +1 -1
  141. package/dist/runtime/body.js +61 -12
  142. package/dist/runtime/body.js.map +1 -1
  143. package/dist/runtime/check-costs.d.ts +15 -0
  144. package/dist/runtime/check-costs.d.ts.map +1 -0
  145. package/dist/runtime/check-costs.js +114 -0
  146. package/dist/runtime/check-costs.js.map +1 -0
  147. package/dist/runtime/check-ids.d.ts +15 -0
  148. package/dist/runtime/check-ids.d.ts.map +1 -0
  149. package/dist/runtime/check-ids.js +140 -0
  150. package/dist/runtime/check-ids.js.map +1 -0
  151. package/dist/runtime/checks.d.ts +83 -20
  152. package/dist/runtime/checks.d.ts.map +1 -1
  153. package/dist/runtime/checks.js +3285 -1947
  154. package/dist/runtime/checks.js.map +1 -1
  155. package/dist/runtime/client.d.ts +112 -0
  156. package/dist/runtime/client.d.ts.map +1 -1
  157. package/dist/runtime/client.js +271 -39
  158. package/dist/runtime/client.js.map +1 -1
  159. package/dist/runtime/cookies.d.ts +16 -2
  160. package/dist/runtime/cookies.d.ts.map +1 -1
  161. package/dist/runtime/cookies.js +83 -22
  162. package/dist/runtime/cookies.js.map +1 -1
  163. package/dist/runtime/exchanges.d.ts +4 -5
  164. package/dist/runtime/exchanges.d.ts.map +1 -1
  165. package/dist/runtime/exchanges.js +33 -55
  166. package/dist/runtime/exchanges.js.map +1 -1
  167. package/dist/runtime/exit.d.ts +40 -0
  168. package/dist/runtime/exit.d.ts.map +1 -0
  169. package/dist/runtime/exit.js +48 -0
  170. package/dist/runtime/exit.js.map +1 -0
  171. package/dist/runtime/feature-gate.d.ts +0 -9
  172. package/dist/runtime/feature-gate.d.ts.map +1 -1
  173. package/dist/runtime/feature-gate.js +0 -21
  174. package/dist/runtime/feature-gate.js.map +1 -1
  175. package/dist/runtime/finding.d.ts +49 -8
  176. package/dist/runtime/finding.d.ts.map +1 -1
  177. package/dist/runtime/finding.js +51 -8
  178. package/dist/runtime/finding.js.map +1 -1
  179. package/dist/runtime/fixture.d.ts +35 -28
  180. package/dist/runtime/fixture.d.ts.map +1 -1
  181. package/dist/runtime/fixture.js +92 -731
  182. package/dist/runtime/fixture.js.map +1 -1
  183. package/dist/runtime/generate.d.ts +63 -0
  184. package/dist/runtime/generate.d.ts.map +1 -0
  185. package/dist/runtime/generate.js +635 -0
  186. package/dist/runtime/generate.js.map +1 -0
  187. package/dist/runtime/headers.d.ts +6 -0
  188. package/dist/runtime/headers.d.ts.map +1 -0
  189. package/dist/runtime/headers.js +16 -0
  190. package/dist/runtime/headers.js.map +1 -0
  191. package/dist/runtime/path.d.ts +7 -0
  192. package/dist/runtime/path.d.ts.map +1 -0
  193. package/dist/runtime/path.js +44 -0
  194. package/dist/runtime/path.js.map +1 -0
  195. package/dist/runtime/payloads.d.ts +2 -0
  196. package/dist/runtime/payloads.d.ts.map +1 -1
  197. package/dist/runtime/payloads.js +2 -1
  198. package/dist/runtime/payloads.js.map +1 -1
  199. package/dist/runtime/rate-limit.d.ts +6 -4
  200. package/dist/runtime/rate-limit.d.ts.map +1 -1
  201. package/dist/runtime/rate-limit.js +22 -33
  202. package/dist/runtime/rate-limit.js.map +1 -1
  203. package/dist/runtime/redact.d.ts +24 -0
  204. package/dist/runtime/redact.d.ts.map +1 -0
  205. package/dist/runtime/redact.js +98 -0
  206. package/dist/runtime/redact.js.map +1 -0
  207. package/dist/runtime/run.d.ts +34 -2
  208. package/dist/runtime/run.d.ts.map +1 -1
  209. package/dist/runtime/run.js +346 -138
  210. package/dist/runtime/run.js.map +1 -1
  211. package/dist/runtime/runs.d.ts +5 -0
  212. package/dist/runtime/runs.d.ts.map +1 -1
  213. package/dist/runtime/runs.js +7 -1
  214. package/dist/runtime/runs.js.map +1 -1
  215. package/dist/runtime/teardown.d.ts +17 -4
  216. package/dist/runtime/teardown.d.ts.map +1 -1
  217. package/dist/runtime/teardown.js +49 -16
  218. package/dist/runtime/teardown.js.map +1 -1
  219. package/dist/runtime/transcript.d.ts +34 -2
  220. package/dist/runtime/transcript.d.ts.map +1 -1
  221. package/dist/runtime/transcript.js +119 -24
  222. package/dist/runtime/transcript.js.map +1 -1
  223. package/dist/runtime/unique.d.ts +2 -11
  224. package/dist/runtime/unique.d.ts.map +1 -1
  225. package/dist/runtime/unique.js +27 -53
  226. package/dist/runtime/unique.js.map +1 -1
  227. package/dist/runtime/validate.d.ts +13 -2
  228. package/dist/runtime/validate.d.ts.map +1 -1
  229. package/dist/runtime/validate.js +51 -31
  230. package/dist/runtime/validate.js.map +1 -1
  231. package/dist/runtime/wait.d.ts +2 -1
  232. package/dist/runtime/wait.d.ts.map +1 -1
  233. package/dist/runtime/wait.js +2 -36
  234. package/dist/runtime/wait.js.map +1 -1
  235. package/dist/runtime/world.d.ts +24 -1
  236. package/dist/runtime/world.d.ts.map +1 -1
  237. package/dist/runtime/world.js +101 -26
  238. package/dist/runtime/world.js.map +1 -1
  239. package/dist/spec/collection.d.ts +8 -2
  240. package/dist/spec/collection.d.ts.map +1 -1
  241. package/dist/spec/collection.js +47 -7
  242. package/dist/spec/collection.js.map +1 -1
  243. package/dist/spec/extensions.d.ts +5 -1
  244. package/dist/spec/extensions.d.ts.map +1 -1
  245. package/dist/spec/extensions.js +9 -2
  246. package/dist/spec/extensions.js.map +1 -1
  247. package/dist/spec/graph.d.ts +46 -0
  248. package/dist/spec/graph.d.ts.map +1 -1
  249. package/dist/spec/graph.js +175 -11
  250. package/dist/spec/graph.js.map +1 -1
  251. package/dist/spec/load.d.ts +25 -5
  252. package/dist/spec/load.d.ts.map +1 -1
  253. package/dist/spec/load.js +160 -59
  254. package/dist/spec/load.js.map +1 -1
  255. package/dist/spec/query-capabilities.d.ts +4 -0
  256. package/dist/spec/query-capabilities.d.ts.map +1 -1
  257. package/dist/spec/query-capabilities.js +6 -0
  258. package/dist/spec/query-capabilities.js.map +1 -1
  259. package/dist/spec/schema.d.ts +20 -0
  260. package/dist/spec/schema.d.ts.map +1 -0
  261. package/dist/spec/schema.js +118 -0
  262. package/dist/spec/schema.js.map +1 -0
  263. package/dist/spec/tag-schema.d.ts +12 -0
  264. package/dist/spec/tag-schema.d.ts.map +1 -0
  265. package/dist/spec/tag-schema.js +143 -0
  266. package/dist/spec/tag-schema.js.map +1 -0
  267. package/dist/spec/types.js +17 -1
  268. package/dist/spec/types.js.map +1 -1
  269. package/docs/api.md +59 -0
  270. package/docs/assumptions.md +99 -0
  271. package/docs/checks.md +183 -0
  272. package/docs/commands.md +214 -0
  273. package/docs/configuration.md +650 -0
  274. package/docs/model.md +184 -0
  275. package/docs/reference-defects.md +94 -0
  276. package/docs/reports.md +211 -0
  277. package/docs/tags.md +400 -0
  278. package/package.json +3 -1
@@ -0,0 +1,428 @@
1
+ /**
2
+ * `x-feature-gate` is a declared fact. These cases prove a matching 403 is coverage, and that
3
+ * the two ways to be wrong — no tag, or a tag that disagrees with `vars.feature` — stay failures.
4
+ */
5
+ import { createServer } from "node:http";
6
+ import { report } from "../report/console.js";
7
+ import { run } from "../runtime/run.js";
8
+ import { buildModel } from "../spec/graph.js";
9
+ import { dereference } from "../spec/load.js";
10
+ const FORBIDDEN_SCHEMA = {
11
+ properties: {
12
+ error_key: { type: "string" },
13
+ status: { type: "integer" },
14
+ status_key: { type: "string" },
15
+ success: { type: "boolean" },
16
+ vars: { additionalProperties: true, type: "object" },
17
+ },
18
+ type: "object",
19
+ };
20
+ const WEBHOOK_ITEM = {
21
+ properties: { id: { type: "string" }, url: { type: "string" } },
22
+ required: ["id", "url"],
23
+ type: "object",
24
+ };
25
+ function webhookSpec(tag) {
26
+ const create = {
27
+ operationId: "webhook.create",
28
+ requestBody: {
29
+ content: {
30
+ "application/json": {
31
+ schema: {
32
+ additionalProperties: false,
33
+ properties: { url: { type: "string" } },
34
+ required: ["url"],
35
+ type: "object",
36
+ },
37
+ },
38
+ },
39
+ required: true,
40
+ },
41
+ responses: {
42
+ "201": {
43
+ content: { "application/json": { schema: WEBHOOK_ITEM } },
44
+ description: "created",
45
+ },
46
+ "403": {
47
+ content: { "application/json": { schema: FORBIDDEN_SCHEMA } },
48
+ description: "forbidden",
49
+ },
50
+ },
51
+ "x-entity": { action: "create", identity: "id", name: "webhook" },
52
+ };
53
+ if (tag !== null)
54
+ create["x-feature-gate"] = tag;
55
+ return {
56
+ info: { title: "Feature-gate harness", version: "1.0" },
57
+ openapi: "3.1.0",
58
+ paths: {
59
+ "/v1/orgs/{org_id}/webhooks": {
60
+ get: {
61
+ operationId: "webhook.list",
62
+ parameters: [{ in: "path", name: "org_id", required: true, schema: { type: "string" } }],
63
+ responses: {
64
+ "200": {
65
+ content: {
66
+ "application/json": {
67
+ schema: {
68
+ properties: { webhooks: { items: WEBHOOK_ITEM, type: "array" } },
69
+ required: ["webhooks"],
70
+ type: "object",
71
+ },
72
+ },
73
+ },
74
+ description: "ok",
75
+ },
76
+ },
77
+ "x-entity": { action: "list", identity: "id", name: "webhook" },
78
+ },
79
+ parameters: [{ in: "path", name: "org_id", required: true, schema: { type: "string" } }],
80
+ post: create,
81
+ },
82
+ "/v1/orgs/{org_id}/webhooks/{webhook_id}": {
83
+ get: {
84
+ operationId: "webhook.read",
85
+ parameters: [
86
+ { in: "path", name: "org_id", required: true, schema: { type: "string" } },
87
+ { in: "path", name: "webhook_id", required: true, schema: { type: "string" } },
88
+ ],
89
+ responses: {
90
+ "200": {
91
+ content: { "application/json": { schema: WEBHOOK_ITEM } },
92
+ description: "ok",
93
+ },
94
+ "404": {
95
+ content: {
96
+ "application/json": {
97
+ schema: { properties: { error_key: { type: "string" } }, type: "object" },
98
+ },
99
+ },
100
+ description: "not found",
101
+ },
102
+ },
103
+ "x-entity": { action: "read", identity: "id", name: "webhook" },
104
+ },
105
+ patch: {
106
+ operationId: "webhook.update",
107
+ parameters: [
108
+ { in: "path", name: "org_id", required: true, schema: { type: "string" } },
109
+ { in: "path", name: "webhook_id", required: true, schema: { type: "string" } },
110
+ ],
111
+ requestBody: {
112
+ content: {
113
+ "application/json": {
114
+ schema: { additionalProperties: false, properties: { url: { type: "string" } }, type: "object" },
115
+ },
116
+ },
117
+ },
118
+ responses: {
119
+ "200": {
120
+ content: { "application/json": { schema: WEBHOOK_ITEM } },
121
+ description: "ok",
122
+ },
123
+ "403": {
124
+ content: { "application/json": { schema: FORBIDDEN_SCHEMA } },
125
+ description: "forbidden",
126
+ },
127
+ "404": {
128
+ content: {
129
+ "application/json": {
130
+ schema: { properties: { error_key: { type: "string" } }, type: "object" },
131
+ },
132
+ },
133
+ description: "not found",
134
+ },
135
+ },
136
+ "x-entity": { action: "update", identity: "id", name: "webhook" },
137
+ ...(tag !== null ? { "x-feature-gate": tag } : {}),
138
+ },
139
+ },
140
+ "/v1/orgs/{org_id}/invites": {
141
+ get: {
142
+ operationId: "invite.list",
143
+ parameters: [{ in: "path", name: "org_id", required: true, schema: { type: "string" } }],
144
+ responses: {
145
+ "200": {
146
+ content: {
147
+ "application/json": {
148
+ schema: {
149
+ properties: {
150
+ invites: {
151
+ items: {
152
+ properties: { email: { type: "string" }, id: { type: "string" } },
153
+ type: "object",
154
+ },
155
+ type: "array",
156
+ },
157
+ },
158
+ required: ["invites"],
159
+ type: "object",
160
+ },
161
+ },
162
+ },
163
+ description: "ok",
164
+ },
165
+ },
166
+ "x-entity": { action: "list", identity: "id", name: "invite" },
167
+ },
168
+ parameters: [{ in: "path", name: "org_id", required: true, schema: { type: "string" } }],
169
+ post: {
170
+ operationId: "invite.create",
171
+ requestBody: {
172
+ content: {
173
+ "application/json": {
174
+ schema: {
175
+ additionalProperties: false,
176
+ properties: { email: { type: "string" } },
177
+ required: ["email"],
178
+ type: "object",
179
+ },
180
+ },
181
+ },
182
+ required: true,
183
+ },
184
+ responses: {
185
+ "201": {
186
+ content: {
187
+ "application/json": {
188
+ schema: {
189
+ properties: { email: { type: "string" }, id: { type: "string" } },
190
+ type: "object",
191
+ },
192
+ },
193
+ },
194
+ description: "created",
195
+ },
196
+ },
197
+ "x-entity": { action: "create", identity: "id", name: "invite" },
198
+ },
199
+ },
200
+ },
201
+ };
202
+ }
203
+ function gateBody(feature) {
204
+ return {
205
+ error_key: "forbidden",
206
+ status: 403,
207
+ status_key: "forbidden",
208
+ success: false,
209
+ vars: {
210
+ current_plan: "free",
211
+ feature,
212
+ feature_name: feature === "webhooks" ? "Webhooks" : feature,
213
+ required_plan: "pro",
214
+ type: "feature_gate",
215
+ },
216
+ };
217
+ }
218
+ async function serveHarness(options) {
219
+ const spec = webhookSpec(options.specTag);
220
+ const webhooks = new Map();
221
+ const invites = new Map();
222
+ let seq = 0;
223
+ if (options.listSeeded === true) {
224
+ webhooks.set("wh_existing", { id: "wh_existing", url: "https://example.test/hook" });
225
+ }
226
+ const readJson = (req) => new Promise((resolve, reject) => {
227
+ const chunks = [];
228
+ req.on("data", (chunk) => {
229
+ chunks.push(chunk);
230
+ });
231
+ req.on("end", () => {
232
+ const text = Buffer.concat(chunks).toString("utf8");
233
+ if (text === "") {
234
+ resolve(undefined);
235
+ return;
236
+ }
237
+ try {
238
+ resolve(JSON.parse(text));
239
+ }
240
+ catch (error) {
241
+ reject(error);
242
+ }
243
+ });
244
+ req.on("error", reject);
245
+ });
246
+ const send = (res, status, body) => {
247
+ if (body === undefined) {
248
+ res.writeHead(status);
249
+ res.end();
250
+ return;
251
+ }
252
+ const text = JSON.stringify(body);
253
+ res.writeHead(status, { "content-length": String(Buffer.byteLength(text)), "content-type": "application/json" });
254
+ res.end(text);
255
+ };
256
+ const server = createServer((req, res) => {
257
+ void (async () => {
258
+ const url = new URL(req.url ?? "/", "http://127.0.0.1");
259
+ const method = (req.method ?? "GET").toUpperCase();
260
+ if (url.pathname === "/v1/openapi/spec" && method === "GET")
261
+ return send(res, 200, spec);
262
+ const header = req.headers.authorization;
263
+ if (typeof header !== "string" || !header.startsWith("Bearer ")) {
264
+ return send(res, 401, { error_key: "unauthorized" });
265
+ }
266
+ if (url.pathname === "/v1/orgs/org_1/webhooks" && method === "GET") {
267
+ return send(res, 200, { webhooks: [...webhooks.values()] });
268
+ }
269
+ if (url.pathname === "/v1/orgs/org_1/webhooks" && method === "POST") {
270
+ if (options.create === "gate-match")
271
+ return send(res, 403, gateBody("webhooks"));
272
+ if (options.create === "gate-mismatch")
273
+ return send(res, 403, gateBody("custom_domain"));
274
+ if (options.create === "plain-403")
275
+ return send(res, 403, { error_key: "forbidden" });
276
+ const body = (await readJson(req));
277
+ if (typeof body?.url !== "string") {
278
+ return send(res, 400, { error_key: "required", vars: { field: "url" } });
279
+ }
280
+ const id = `wh_${String((seq += 1))}`;
281
+ const row = { id, url: body.url };
282
+ webhooks.set(id, row);
283
+ return send(res, 201, row);
284
+ }
285
+ const item = /^\/v1\/orgs\/org_1\/webhooks\/([^/]+)$/.exec(url.pathname);
286
+ if (item !== null && method === "GET") {
287
+ const row = webhooks.get(decodeURIComponent(item[1] ?? ""));
288
+ return row === undefined ? send(res, 404, { error_key: "not_found" }) : send(res, 200, row);
289
+ }
290
+ if (item !== null && method === "PATCH") {
291
+ if ((options.update ?? "ok") === "gate-match")
292
+ return send(res, 403, gateBody("webhooks"));
293
+ const row = webhooks.get(decodeURIComponent(item[1] ?? ""));
294
+ if (row === undefined)
295
+ return send(res, 404, { error_key: "not_found" });
296
+ const body = (await readJson(req));
297
+ if (typeof body?.url === "string")
298
+ row.url = body.url;
299
+ return send(res, 200, row);
300
+ }
301
+ if (url.pathname === "/v1/orgs/org_1/invites" && method === "GET") {
302
+ return send(res, 200, { invites: [...invites.values()] });
303
+ }
304
+ if (url.pathname === "/v1/orgs/org_1/invites" && method === "POST") {
305
+ const body = (await readJson(req));
306
+ if (typeof body?.email !== "string") {
307
+ return send(res, 400, { error_key: "required", vars: { field: "email" } });
308
+ }
309
+ const id = `inv_${String((seq += 1))}`;
310
+ const row = { email: body.email, id };
311
+ invites.set(id, row);
312
+ return send(res, 201, row);
313
+ }
314
+ return send(res, 404, { error_key: "not_found" });
315
+ })().catch(() => {
316
+ if (!res.headersSent)
317
+ send(res, 500, { error_key: "internal" });
318
+ });
319
+ });
320
+ await new Promise((resolve) => {
321
+ server.listen(0, "127.0.0.1", resolve);
322
+ });
323
+ const addr = server.address();
324
+ return {
325
+ close: () => new Promise((resolve, reject) => {
326
+ server.close((error) => (error ? reject(error) : resolve()));
327
+ }),
328
+ url: `http://127.0.0.1:${addr.port}`,
329
+ };
330
+ }
331
+ const PRINCIPALS = [{ headers: { authorization: "Bearer tok_alpha" }, id: "alpha", roots: { org_id: "org_1" } }];
332
+ async function against(options, only) {
333
+ const server = await serveHarness(options);
334
+ try {
335
+ const result = await run({
336
+ baseUrl: server.url,
337
+ ...(only === undefined ? {} : { only }),
338
+ principals: PRINCIPALS,
339
+ seed: 1,
340
+ spec: `${server.url}/v1/openapi/spec`,
341
+ });
342
+ return { checksSkipped: result.checksSkipped, findings: result.findings };
343
+ }
344
+ finally {
345
+ await server.close();
346
+ }
347
+ }
348
+ function defects(findings) {
349
+ return findings.filter((f) => f.verdict !== "COVERAGE_GAP" && f.verdict !== "BLOCKED");
350
+ }
351
+ export async function runFeatureGateSuite() {
352
+ const results = [];
353
+ const push = (name, why, ok, detail) => {
354
+ results.push({ detail, name, ok, why });
355
+ };
356
+ const { doc: defensive } = dereference({
357
+ info: { title: "defensive", version: "1" },
358
+ openapi: "3.1.0",
359
+ paths: {
360
+ "/v1/things": {
361
+ post: {
362
+ operationId: "thing.create",
363
+ responses: { "201": { description: "ok" } },
364
+ "x-entity": { action: "create", identity: "id", name: "thing" },
365
+ "x-feature-gate": { not: "a string" },
366
+ },
367
+ },
368
+ },
369
+ });
370
+ const defensiveModel = buildModel(defensive);
371
+ push("non-string x-feature-gate is null", "same defensive read as x-cost / x-rate-limit", defensiveModel.byOperationId.get("thing.create")?.featureGate === null, `featureGate=${String(defensiveModel.byOperationId.get("thing.create")?.featureGate)}`);
372
+ const tagged = buildModel(webhookSpec("webhooks"));
373
+ const planText = report.plan(tagged, false);
374
+ const doctor = report.doctor(tagged, [], false);
375
+ push("plan lists x-feature-gate", "doctor / plan should show the tag", planText.includes("x-feature-gate: webhooks") &&
376
+ tagged.byOperationId.get("webhook.create")?.featureGate === "webhooks", planText.includes("x-feature-gate: webhooks") ? "shown" : "missing from plan");
377
+ push("doctor lists x-feature-gate", "doctor / plan should show the tag", doctor.text.includes("x-feature-gate: webhooks"), doctor.text.includes("x-feature-gate: webhooks") ? "shown" : "missing from doctor");
378
+ try {
379
+ const { findings } = await against({ create: "gate-match", specTag: "webhooks" }, ["webhook", "invite"]);
380
+ const seed = findings.find((f) => f.check === "world.seed" && f.entity === "webhook");
381
+ const inviteSeed = findings.find((f) => f.check === "world.seed" && f.entity === "invite");
382
+ const real = defects(findings);
383
+ const namesTag = seed?.detail.includes("x-feature-gate: webhooks") === true;
384
+ push("matching gate 403 is a coverage gap", "the backend matched the document", seed?.verdict === "COVERAGE_GAP" && namesTag && real.length === 0, `seed=${seed?.verdict ?? "none"} detail=${seed?.detail ?? "—"} defects=${real.map((f) => f.check).join(",") || "none"}`);
385
+ push("untagged invite still seeds", "CRUD without the tag is unchanged", inviteSeed === undefined && real.length === 0, inviteSeed === undefined ? "invite has no world.seed finding" : `${inviteSeed.verdict}: ${inviteSeed.detail}`);
386
+ }
387
+ catch (error) {
388
+ push("matching gate 403 is a coverage gap", "the backend matched the document", false, error instanceof Error ? error.message : String(error));
389
+ push("untagged invite still seeds", "CRUD without the tag is unchanged", false, "harness threw");
390
+ }
391
+ try {
392
+ const { findings } = await against({ create: "gate-mismatch", specTag: "webhooks" }, ["webhook"]);
393
+ const seed = findings.find((f) => f.check === "world.seed" && f.entity === "webhook");
394
+ push("mismatched vars.feature stays a seed error", "backend/tag drift must not look documented", seed?.verdict === "BLOCKED", `seed=${seed?.verdict ?? "none"} ${seed?.detail ?? ""}`);
395
+ }
396
+ catch (error) {
397
+ push("mismatched vars.feature stays a seed error", "backend/tag drift must not look documented", false, error instanceof Error ? error.message : String(error));
398
+ }
399
+ try {
400
+ const { findings } = await against({ create: "plain-403", specTag: null }, ["webhook"]);
401
+ const seed = findings.find((f) => f.check === "world.seed" && f.entity === "webhook");
402
+ push("untagged 403 stays a seed error", "do not treat every 403 as a feature gate", seed?.verdict === "BLOCKED", `seed=${seed?.verdict ?? "none"} ${seed?.detail ?? ""}`);
403
+ }
404
+ catch (error) {
405
+ push("untagged 403 stays a seed error", "do not treat every 403 as a feature gate", false, error instanceof Error ? error.message : String(error));
406
+ }
407
+ try {
408
+ const { findings } = await against({ create: "created", specTag: "webhooks", update: "gate-match" }, ["webhook"]);
409
+ const seed = findings.find((f) => f.check === "world.seed" && f.entity === "webhook");
410
+ const writeGaps = findings.filter((f) => f.verdict === "COVERAGE_GAP" && f.detail.includes("x-feature-gate: webhooks") && f.check !== "world.seed");
411
+ const real = defects(findings);
412
+ push("gated update after a 201 create is a coverage gap", "the gate is off for create; a later write still cites the tag", seed === undefined && writeGaps.length > 0 && real.length === 0, `seed=${seed?.verdict ?? "none"} writeGaps=${writeGaps.map((f) => f.check).join(",") || "none"} defects=${real.map((f) => `${f.verdict}:${f.check}`).join(",") || "none"}`);
413
+ }
414
+ catch (error) {
415
+ push("gated update after a 201 create is a coverage gap", "the gate is off for create; a later write still cites the tag", false, error instanceof Error ? error.message : String(error));
416
+ }
417
+ try {
418
+ const { findings } = await against({ create: "gate-match", listSeeded: true, specTag: "webhooks" }, ["webhook"]);
419
+ const seed = findings.find((f) => f.check === "world.seed" && f.entity === "webhook");
420
+ const real = defects(findings);
421
+ push("gated create with existing rows is not a defect", "read-only checks may still run against the list, same as excluded create", seed?.verdict === "COVERAGE_GAP" && real.length === 0, `seed=${seed?.verdict ?? "none"} defects=${real.map((f) => `${f.verdict}:${f.check}`).join(",") || "none"}`);
422
+ }
423
+ catch (error) {
424
+ push("gated create with existing rows is not a defect", "read-only checks may still run against the list, same as excluded create", false, error instanceof Error ? error.message : String(error));
425
+ }
426
+ return results;
427
+ }
428
+ //# sourceMappingURL=feature-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-gate.js","sourceRoot":"","sources":["../../src/conformance/feature-gate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Combination fuzzing: many defects at once, chosen at random.
3
+ *
4
+ * The defect matrix injects one fault at a time, which is not how a backend fails. Real ones
5
+ * carry several simultaneously, and that interaction is where a tool quietly stops being useful:
6
+ * a broken listing makes every downstream check report a consequence, and a report of thirty
7
+ * findings with one root cause is nearly as useless as a report of none.
8
+ *
9
+ * So the oracle here is not "did every injected defect produce a finding". It is:
10
+ *
11
+ * - **recall** — each injected defect's primary check fired, *or* was legitimately suppressed
12
+ * because a check it depends on was itself broken by another injected defect;
13
+ * - **precision** — no finding outside the union of what the injected set can justify.
14
+ *
15
+ * Suppression is the interesting half. Counting a suppressed check as a miss would push oat
16
+ * toward reporting cascades; counting any suppression as fine would let it hide real defects
17
+ * behind unrelated ones. The dependency graph is what separates those two, so it is consulted
18
+ * rather than assumed.
19
+ */
20
+ import type { DefectName } from "../reference/defects.ts";
21
+ import { type Backend } from "./suite.ts";
22
+ export interface FuzzCase {
23
+ seed: number;
24
+ injected: DefectName[];
25
+ /** Injected defects whose primary check neither fired nor was justifiably suppressed. */
26
+ missed: Array<{
27
+ defect: DefectName;
28
+ primary: string;
29
+ }>;
30
+ /**
31
+ * Findings no injected defect accounts for.
32
+ *
33
+ * Carries the summary and evidence, not just the check id. A failure here is often rare —
34
+ * timing-sensitive cases surface once in several hundred runs — and re-running to find out
35
+ * what happened may simply not reproduce it. The report has to be enough on its own.
36
+ */
37
+ spurious: Array<{
38
+ check: string;
39
+ entity: string;
40
+ summary: string;
41
+ detail: string;
42
+ }>;
43
+ /** Injected defects whose check was suppressed by a broken dependency — expected, not a miss. */
44
+ cascaded: Array<{
45
+ defect: DefectName;
46
+ because: string;
47
+ }>;
48
+ /**
49
+ * Injected defects whose check ran, could not reach a verdict, and said so.
50
+ *
51
+ * Not a pass and not a miss. The defect went unreported, but the report names the check and
52
+ * the reason, which is what lets a reader re-run it once the blocking condition is gone. The
53
+ * failure this separates it from — a check that gives up in silence — is indistinguishable
54
+ * from a clean result, and that is the one worth failing the suite over.
55
+ */
56
+ unresolved: Array<{
57
+ defect: DefectName;
58
+ reason: string;
59
+ }>;
60
+ findings: number;
61
+ ok: boolean;
62
+ error?: string;
63
+ }
64
+ export interface FuzzOptions {
65
+ cases?: number;
66
+ maxDefects?: number;
67
+ backend?: Backend;
68
+ dialect?: string;
69
+ seed?: number;
70
+ onCase?: (result: FuzzCase) => void;
71
+ }
72
+ export declare function runFuzz(options?: FuzzOptions): Promise<FuzzCase[]>;
73
+ export declare function renderFuzz(results: FuzzCase[]): {
74
+ text: string;
75
+ failures: number;
76
+ };
77
+ export interface PrecisionCase {
78
+ seed: number;
79
+ findings: Array<{
80
+ check: string;
81
+ entity: string;
82
+ summary: string;
83
+ }>;
84
+ inconclusive: number;
85
+ error?: string;
86
+ }
87
+ /**
88
+ * Precision under varied data, against a backend with no defects at all.
89
+ *
90
+ * The combination fuzzer varies the *faults*; this varies the *data*. Every check builds its
91
+ * cohort from a seed — empty strings, LIKE metacharacters, unicode, nulls, lexical extremes — and
92
+ * the conformance suite has only ever used seed 42. A property that holds at 42 and fails at 43
93
+ * was never a property of the contract; it was a property of that one fixture.
94
+ *
95
+ * Here the backend is correct by construction, so the bar is absolute: any finding at all is a
96
+ * false positive, and false positives are what make a tool get switched off.
97
+ */
98
+ export declare function runPrecision(options?: {
99
+ cases?: number;
100
+ backend?: Backend;
101
+ dialect?: string;
102
+ seed?: number;
103
+ }): Promise<PrecisionCase[]>;
104
+ export declare function renderPrecision(results: PrecisionCase[]): {
105
+ text: string;
106
+ failures: number;
107
+ };
108
+ //# sourceMappingURL=fuzz.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fuzz.d.ts","sourceRoot":"","sources":["../../src/conformance/fuzz.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAGzD,OAAO,EAAE,KAAK,OAAO,EAAoC,MAAM,YAAY,CAAA;AAE3E,MAAM,WAAW,QAAQ;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,UAAU,EAAE,CAAA;IACtB,yFAAyF;IACzF,MAAM,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,UAAU,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACtD;;;;;;OAMG;IACH,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACnF,iGAAiG;IACjG,QAAQ,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,UAAU,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACxD;;;;;;;OAOG;IACH,UAAU,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,UAAU,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACzD,QAAQ,EAAE,MAAM,CAAA;IAChB,EAAE,EAAE,OAAO,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAgCD,MAAM,WAAW,WAAW;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAA;CACnC;AAED,wBAAsB,OAAO,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CA+B5E;AA8ED,wBAAgB,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAgClF;AAED,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACnE,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CACjC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAClF,OAAO,CAAC,aAAa,EAAE,CAAC,CA4C1B;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAqB5F"}