@lovrozagar/oat 0.1.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 (145) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +401 -0
  3. package/bin/oat.js +2 -0
  4. package/dist/cli.js +386 -0
  5. package/dist/config/define-config.d.ts +165 -0
  6. package/dist/config/define-config.d.ts.map +1 -0
  7. package/dist/config/define-config.js +24 -0
  8. package/dist/config/define-config.js.map +1 -0
  9. package/dist/config/load.d.ts +10 -0
  10. package/dist/config/load.d.ts.map +1 -0
  11. package/dist/config/load.js +61 -0
  12. package/dist/config/load.js.map +1 -0
  13. package/dist/index.d.ts +17 -0
  14. package/dist/index.js +9 -0
  15. package/dist/reference/defects.d.ts +254 -0
  16. package/dist/reference/defects.d.ts.map +1 -0
  17. package/dist/reference/defects.js +265 -0
  18. package/dist/reference/defects.js.map +1 -0
  19. package/dist/reference/dialect.d.ts +104 -0
  20. package/dist/reference/dialect.d.ts.map +1 -0
  21. package/dist/reference/dialect.js +174 -0
  22. package/dist/reference/dialect.js.map +1 -0
  23. package/dist/reference/http.d.ts +79 -0
  24. package/dist/reference/http.d.ts.map +1 -0
  25. package/dist/reference/http.js +889 -0
  26. package/dist/reference/http.js.map +1 -0
  27. package/dist/reference/model.d.ts +56 -0
  28. package/dist/reference/model.d.ts.map +1 -0
  29. package/dist/reference/model.js +156 -0
  30. package/dist/reference/model.js.map +1 -0
  31. package/dist/reference/query.d.ts +45 -0
  32. package/dist/reference/query.d.ts.map +1 -0
  33. package/dist/reference/query.js +353 -0
  34. package/dist/reference/query.js.map +1 -0
  35. package/dist/reference/spec.d.ts +13 -0
  36. package/dist/reference/spec.d.ts.map +1 -0
  37. package/dist/reference/spec.js +547 -0
  38. package/dist/reference/spec.js.map +1 -0
  39. package/dist/reference/store-api.d.ts +59 -0
  40. package/dist/reference/store-api.d.ts.map +1 -0
  41. package/dist/reference/store-api.js +76 -0
  42. package/dist/reference/store-api.js.map +1 -0
  43. package/dist/reference/stores/memory.d.ts +27 -0
  44. package/dist/reference/stores/memory.d.ts.map +1 -0
  45. package/dist/reference/stores/memory.js +97 -0
  46. package/dist/reference/stores/memory.js.map +1 -0
  47. package/dist/reference/stores/postgres.d.ts +61 -0
  48. package/dist/reference/stores/postgres.d.ts.map +1 -0
  49. package/dist/reference/stores/postgres.js +406 -0
  50. package/dist/reference/stores/postgres.js.map +1 -0
  51. package/dist/reference/stores/sqlite-driver.d.ts +54 -0
  52. package/dist/reference/stores/sqlite-driver.d.ts.map +1 -0
  53. package/dist/reference/stores/sqlite-driver.js +99 -0
  54. package/dist/reference/stores/sqlite-driver.js.map +1 -0
  55. package/dist/reference/stores/sqlite.d.ts +68 -0
  56. package/dist/reference/stores/sqlite.d.ts.map +1 -0
  57. package/dist/reference/stores/sqlite.js +464 -0
  58. package/dist/reference/stores/sqlite.js.map +1 -0
  59. package/dist/report/console.d.ts +33 -0
  60. package/dist/report/console.d.ts.map +1 -0
  61. package/dist/report/console.js +237 -0
  62. package/dist/report/console.js.map +1 -0
  63. package/dist/report/matrix.d.ts +131 -0
  64. package/dist/report/matrix.d.ts.map +1 -0
  65. package/dist/report/matrix.js +865 -0
  66. package/dist/report/matrix.js.map +1 -0
  67. package/dist/report/render.d.ts +66 -0
  68. package/dist/report/render.d.ts.map +1 -0
  69. package/dist/report/render.js +423 -0
  70. package/dist/report/render.js.map +1 -0
  71. package/dist/runtime/async.d.ts +34 -0
  72. package/dist/runtime/async.d.ts.map +1 -0
  73. package/dist/runtime/async.js +130 -0
  74. package/dist/runtime/async.js.map +1 -0
  75. package/dist/runtime/auth.d.ts +46 -0
  76. package/dist/runtime/auth.d.ts.map +1 -0
  77. package/dist/runtime/auth.js +236 -0
  78. package/dist/runtime/auth.js.map +1 -0
  79. package/dist/runtime/checks.d.ts +89 -0
  80. package/dist/runtime/checks.d.ts.map +1 -0
  81. package/dist/runtime/checks.js +3400 -0
  82. package/dist/runtime/checks.js.map +1 -0
  83. package/dist/runtime/client.d.ts +65 -0
  84. package/dist/runtime/client.d.ts.map +1 -0
  85. package/dist/runtime/client.js +122 -0
  86. package/dist/runtime/client.js.map +1 -0
  87. package/dist/runtime/finding.d.ts +50 -0
  88. package/dist/runtime/finding.d.ts.map +1 -0
  89. package/dist/runtime/finding.js +50 -0
  90. package/dist/runtime/finding.js.map +1 -0
  91. package/dist/runtime/fixture.d.ts +20 -0
  92. package/dist/runtime/fixture.d.ts.map +1 -0
  93. package/dist/runtime/fixture.js +175 -0
  94. package/dist/runtime/fixture.js.map +1 -0
  95. package/dist/runtime/progress.d.ts +41 -0
  96. package/dist/runtime/progress.d.ts.map +1 -0
  97. package/dist/runtime/progress.js +186 -0
  98. package/dist/runtime/progress.js.map +1 -0
  99. package/dist/runtime/run.d.ts +69 -0
  100. package/dist/runtime/run.d.ts.map +1 -0
  101. package/dist/runtime/run.js +575 -0
  102. package/dist/runtime/run.js.map +1 -0
  103. package/dist/runtime/teardown.d.ts +38 -0
  104. package/dist/runtime/teardown.d.ts.map +1 -0
  105. package/dist/runtime/teardown.js +129 -0
  106. package/dist/runtime/teardown.js.map +1 -0
  107. package/dist/runtime/validate.d.ts +31 -0
  108. package/dist/runtime/validate.d.ts.map +1 -0
  109. package/dist/runtime/validate.js +111 -0
  110. package/dist/runtime/validate.js.map +1 -0
  111. package/dist/runtime/world.d.ts +49 -0
  112. package/dist/runtime/world.d.ts.map +1 -0
  113. package/dist/runtime/world.js +119 -0
  114. package/dist/runtime/world.js.map +1 -0
  115. package/dist/spec/collection.d.ts +31 -0
  116. package/dist/spec/collection.d.ts.map +1 -0
  117. package/dist/spec/collection.js +121 -0
  118. package/dist/spec/collection.js.map +1 -0
  119. package/dist/spec/conventions.d.ts +103 -0
  120. package/dist/spec/conventions.d.ts.map +1 -0
  121. package/dist/spec/conventions.js +275 -0
  122. package/dist/spec/conventions.js.map +1 -0
  123. package/dist/spec/extensions.d.ts +74 -0
  124. package/dist/spec/extensions.d.ts.map +1 -0
  125. package/dist/spec/extensions.js +335 -0
  126. package/dist/spec/extensions.js.map +1 -0
  127. package/dist/spec/graph.d.ts +89 -0
  128. package/dist/spec/graph.d.ts.map +1 -0
  129. package/dist/spec/graph.js +318 -0
  130. package/dist/spec/graph.js.map +1 -0
  131. package/dist/spec/load.d.ts +36 -0
  132. package/dist/spec/load.d.ts.map +1 -0
  133. package/dist/spec/load.js +166 -0
  134. package/dist/spec/load.js.map +1 -0
  135. package/dist/spec/types.d.ts +57 -0
  136. package/dist/spec/types.d.ts.map +1 -0
  137. package/dist/spec/types.js +24 -0
  138. package/dist/spec/types.js.map +1 -0
  139. package/labs/README.md +130 -0
  140. package/labs/annotated-openapi.yaml +311 -0
  141. package/labs/anyrow.config.ts +107 -0
  142. package/labs/demo.mjs +124 -0
  143. package/labs/local.config.ts +41 -0
  144. package/labs/minimal.config.ts +32 -0
  145. package/package.json +80 -0
@@ -0,0 +1,335 @@
1
+ /**
2
+ * Reads the `x-*` meta tags documented in the README.
3
+ *
4
+ * Every reader follows the same contract: explicit tag → heuristic → `null` plus a recorded
5
+ * gap. oat never silently guesses; an unresolved tag becomes a COVERAGE_GAP in the report
6
+ * naming the tag that would close it.
7
+ */
8
+ import { deriveQueryConventions } from "./conventions.js";
9
+ import { normalisePath } from "./load.js";
10
+ export class GapCollector {
11
+ gaps = [];
12
+ record(operationId, tag, detail) {
13
+ this.gaps.push({ detail, operationId, tag });
14
+ }
15
+ }
16
+ function ext(op, key) {
17
+ const value = op[key];
18
+ return value === undefined ? undefined : value;
19
+ }
20
+ /* ---------------------------------------------------------------- x-invalidate */
21
+ export function readInvalidate(op) {
22
+ const raw = ext(op, "x-invalidate");
23
+ if (!Array.isArray(raw))
24
+ return [];
25
+ return raw.filter((r) => typeof r === "string").map(normaliseRouteRef);
26
+ }
27
+ function normaliseRouteRef(ref) {
28
+ const match = /^\s*([A-Za-z]+)\s+(\S+)\s*$/.exec(ref);
29
+ if (!match?.[1] || !match[2])
30
+ return ref.trim();
31
+ return `${match[1].toUpperCase()} ${normalisePath(match[2])}`;
32
+ }
33
+ /* -------------------------------------------------------------------- x-entity */
34
+ const IRREGULAR_PLURALS = {
35
+ addresses: "address",
36
+ batches: "batch",
37
+ campuses: "campus",
38
+ categories: "category",
39
+ children: "child",
40
+ companies: "company",
41
+ entities: "entity",
42
+ inboxes: "inbox",
43
+ indices: "index",
44
+ people: "person",
45
+ properties: "property",
46
+ queries: "query",
47
+ statuses: "status",
48
+ };
49
+ /**
50
+ * Word endings that are not plural markers. Without these, `status` becomes `statu` and
51
+ * `analysis` becomes `analysi` — the kind of mangling that turns a readable report into one
52
+ * nobody trusts.
53
+ */
54
+ const NON_PLURAL_ENDINGS = /(?:us|ss|is|os|as|ics|ews|ess|ous|sis)$/;
55
+ export function singularise(word) {
56
+ const lower = word.toLowerCase();
57
+ const irregular = IRREGULAR_PLURALS[lower];
58
+ if (irregular !== undefined)
59
+ return irregular;
60
+ if (/(ches|shes|sses|xes|zes)$/.test(lower))
61
+ return lower.slice(0, -2);
62
+ if (/[^aeiou]ies$/.test(lower))
63
+ return `${lower.slice(0, -3)}y`;
64
+ if (NON_PLURAL_ENDINGS.test(lower))
65
+ return lower;
66
+ if (/s$/.test(lower))
67
+ return lower.slice(0, -1);
68
+ return lower;
69
+ }
70
+ const PARAM_SEGMENT = /^\{[^}]+\}$/;
71
+ export function readEntity(endpoint, gaps) {
72
+ const tag = ext(endpoint.op, "x-entity");
73
+ if (tag?.name && tag.action) {
74
+ const ref = {
75
+ action: tag.action,
76
+ name: tag.name,
77
+ source: "tag",
78
+ };
79
+ if (tag.identity !== undefined)
80
+ ref.identity = tag.identity;
81
+ return ref;
82
+ }
83
+ const inferred = inferEntity(endpoint);
84
+ if (inferred === null) {
85
+ gaps?.record(endpoint.operationId, "x-entity", `path "${endpoint.path}" does not follow /<plural>/{id}; entity could not be inferred, ` +
86
+ "so this operation gets no lifecycle coverage");
87
+ return null;
88
+ }
89
+ return inferred;
90
+ }
91
+ /**
92
+ * Heuristic: the last non-parameter segment names the collection; whether a parameter follows
93
+ * it decides collection-scope vs item-scope; the method then decides the action.
94
+ */
95
+ function inferEntity(endpoint) {
96
+ const segments = endpoint.path.split("/").filter(Boolean);
97
+ let nounIndex = -1;
98
+ for (let i = segments.length - 1; i >= 0; i--) {
99
+ const seg = segments[i];
100
+ if (seg !== undefined && !PARAM_SEGMENT.test(seg)) {
101
+ nounIndex = i;
102
+ break;
103
+ }
104
+ }
105
+ if (nounIndex === -1)
106
+ return null;
107
+ const noun = segments[nounIndex];
108
+ if (noun === undefined)
109
+ return null;
110
+ /* A version prefix is never an entity. */
111
+ if (/^v\d+$/i.test(noun))
112
+ return null;
113
+ const trailing = segments.slice(nounIndex + 1);
114
+ const itemScoped = trailing.length > 0 && trailing.every((s) => PARAM_SEGMENT.test(s));
115
+ /* A trailing verb segment (`/rows/aggregate`, `/tables/{id}/restore`) is an action, not CRUD. */
116
+ const isSubAction = nounIndex < segments.length - 1 && !itemScoped;
117
+ const name = singularise(noun);
118
+ const method = endpoint.method.toUpperCase();
119
+ if (isSubAction || (method !== "GET" && !itemScoped && method !== "POST")) {
120
+ return { action: "action", name, source: "heuristic" };
121
+ }
122
+ let action;
123
+ switch (method) {
124
+ case "GET":
125
+ action = itemScoped ? "read" : "list";
126
+ break;
127
+ case "POST":
128
+ action = itemScoped ? "action" : "create";
129
+ break;
130
+ case "PUT":
131
+ case "PATCH":
132
+ action = "update";
133
+ break;
134
+ case "DELETE":
135
+ action = "delete";
136
+ break;
137
+ default:
138
+ return null;
139
+ }
140
+ return { action, name, source: "heuristic" };
141
+ }
142
+ /* --------------------------------------------------------------------- x-query */
143
+ const SCALAR_TYPES = new Set(["string", "number", "integer", "boolean"]);
144
+ export function readQueryCapability(endpoint, itemSchema, gaps) {
145
+ const tag = ext(endpoint.op, "x-query");
146
+ if (tag !== undefined) {
147
+ const cap = {
148
+ filterable: strArray(tag.filterable),
149
+ searchable: strArray(tag.searchable),
150
+ selectable: strArray(tag.selectable),
151
+ sortable: strArray(tag.sortable),
152
+ source: "tag",
153
+ };
154
+ if (typeof tag.maxLimit === "number")
155
+ cap.maxLimit = tag.maxLimit;
156
+ if (typeof tag.defaultOrder === "string")
157
+ cap.defaultOrder = tag.defaultOrder;
158
+ if (typeof tag.stableTiebreak === "string")
159
+ cap.stableTiebreak = tag.stableTiebreak;
160
+ return cap;
161
+ }
162
+ const params = (endpoint.op.parameters ?? []).filter((p) => p.in === "query");
163
+ /* Same aliases the checks already use — `sort`/`fields`/`q`/`per_page`, not only the
164
+ * fixture spellings `filter`/`order`/`select`/`limit`. Pagination-only params do not
165
+ * count: a `page`/`limit` list is not a query grammar. */
166
+ const conventions = deriveQueryConventions(params, null);
167
+ const roles = [conventions.filter, conventions.order, conventions.select, conventions.search].filter((name) => name !== undefined);
168
+ if (roles.length === 0)
169
+ return null;
170
+ const scalars = itemSchema === null ? [] : scalarProperties(itemSchema);
171
+ gaps?.record(endpoint.operationId, "x-query", `endpoint accepts ${roles.join("/")} ` +
172
+ `but does not declare which fields support them. Assuming all ${scalars.length} scalar ` +
173
+ "properties, which will produce false failures on unindexed fields");
174
+ const cap = {
175
+ filterable: scalars,
176
+ searchable: scalars.filter((f) => /name|title|slug|label|description|email/i.test(f)),
177
+ selectable: scalars,
178
+ sortable: scalars,
179
+ source: "heuristic",
180
+ };
181
+ if (conventions.limit !== undefined) {
182
+ const limitParam = params.find((p) => p.name === conventions.limit);
183
+ const max = limitParam?.schema?.maximum;
184
+ if (typeof max === "number")
185
+ cap.maxLimit = max;
186
+ }
187
+ return cap;
188
+ }
189
+ function scalarProperties(schema) {
190
+ const props = schema.properties;
191
+ if (props === null || typeof props !== "object")
192
+ return [];
193
+ const out = [];
194
+ for (const [name, raw] of Object.entries(props)) {
195
+ if (raw === null || typeof raw !== "object")
196
+ continue;
197
+ if (isScalarSchema(raw))
198
+ out.push(name);
199
+ }
200
+ return out;
201
+ }
202
+ function isScalarSchema(schema) {
203
+ const type = schema.type;
204
+ if (typeof type === "string")
205
+ return SCALAR_TYPES.has(type);
206
+ if (Array.isArray(type))
207
+ return type.every((t) => t === "null" || SCALAR_TYPES.has(String(t)));
208
+ /* `oneOf: [{type: string}, {type: null}]` is the nullable-scalar idiom. */
209
+ const oneOf = schema.oneOf ?? schema.anyOf;
210
+ if (Array.isArray(oneOf)) {
211
+ return oneOf.every((branch) => branch !== null &&
212
+ typeof branch === "object" &&
213
+ isScalarSchema(branch));
214
+ }
215
+ return false;
216
+ }
217
+ function strArray(value) {
218
+ return Array.isArray(value) ? value.filter((v) => typeof v === "string") : [];
219
+ }
220
+ /* --------------------------------------------------- x-async / x-effects / misc */
221
+ export function readAsync(op) {
222
+ const tag = ext(op, "x-async");
223
+ if (tag === undefined || typeof tag.poll !== "string")
224
+ return null;
225
+ const spec = {
226
+ poll: tag.poll,
227
+ pollIntervalMs: typeof tag.pollIntervalMs === "number" ? tag.pollIntervalMs : 2000,
228
+ timeoutMs: typeof tag.timeoutMs === "number" ? tag.timeoutMs : 120_000,
229
+ };
230
+ if (typeof tag.idFrom === "string")
231
+ spec.idFrom = tag.idFrom;
232
+ if (typeof tag.until === "string")
233
+ spec.until = tag.until;
234
+ if (typeof tag.successWhen === "string")
235
+ spec.successWhen = tag.successWhen;
236
+ return spec;
237
+ }
238
+ export function readEffects(op) {
239
+ const raw = ext(op, "x-effects");
240
+ if (!Array.isArray(raw))
241
+ return [];
242
+ const out = [];
243
+ for (const item of raw) {
244
+ if (item === null || typeof item !== "object")
245
+ continue;
246
+ const rec = item;
247
+ if (typeof rec.entity !== "string" || typeof rec.op !== "string")
248
+ continue;
249
+ const effect = { entity: rec.entity, op: rec.op };
250
+ if (typeof rec.count === "number")
251
+ effect.count = rec.count;
252
+ out.push(effect);
253
+ }
254
+ return out;
255
+ }
256
+ export function readInvite(op) {
257
+ const tag = ext(op, "x-invite");
258
+ if (tag === undefined)
259
+ return null;
260
+ const invite = typeof tag.invite === "string" ? tag.invite : undefined;
261
+ const accept = typeof tag.accept === "string" ? tag.accept : undefined;
262
+ const revoke = typeof tag.revoke === "string" ? tag.revoke : undefined;
263
+ if (invite === undefined || accept === undefined || revoke === undefined)
264
+ return null;
265
+ return {
266
+ accept,
267
+ grantPointer: typeof tag.grantPointer === "string" ? tag.grantPointer : "$.grant_id",
268
+ granteeField: typeof tag.granteeField === "string" ? tag.granteeField : "key",
269
+ invite,
270
+ revoke,
271
+ tokenPointer: typeof tag.tokenPointer === "string" ? tag.tokenPointer : "$.token",
272
+ };
273
+ }
274
+ export function readSoftDelete(op) {
275
+ const value = ext(op, "x-soft-delete");
276
+ return typeof value === "string" ? value : null;
277
+ }
278
+ export function readImmutable(op) {
279
+ return strArray(ext(op, "x-immutable"));
280
+ }
281
+ export function readGenerated(op, bodySchema) {
282
+ const declared = strArray(ext(op, "x-generated"));
283
+ if (declared.length > 0)
284
+ return declared;
285
+ /* `readOnly: true` carries the same meaning and is standard OpenAPI. */
286
+ if (bodySchema === null || typeof bodySchema !== "object")
287
+ return [];
288
+ const props = bodySchema.properties;
289
+ if (props === null || typeof props !== "object")
290
+ return [];
291
+ return Object.entries(props)
292
+ .filter(([, v]) => v !== null && typeof v === "object" && v.readOnly === true)
293
+ .map(([k]) => k);
294
+ }
295
+ export function readCost(op) {
296
+ const value = ext(op, "x-cost");
297
+ return value === "high" || value === "medium" ? value : "low";
298
+ }
299
+ export function readFlag(op, key) {
300
+ return ext(op, key) === true;
301
+ }
302
+ export function readCleanup(op) {
303
+ const value = ext(op, "x-cleanup");
304
+ return typeof value === "string" ? normaliseRouteRef(value) : null;
305
+ }
306
+ /* -------------------------------------------------------------------- x-tenant */
307
+ const TENANT_PARAM = /^(org(anization)?|tenant|workspace|account|project|app)_?(id|slug)?$/i;
308
+ export function readTenantSource(endpoint) {
309
+ if (typeof ext(endpoint.op, "x-tenant") === "string")
310
+ return "tag";
311
+ const guess = pathParameterNames(endpoint.path).find((name) => TENANT_PARAM.test(name));
312
+ return guess === undefined ? null : "heuristic";
313
+ }
314
+ export function readTenantParam(endpoint, gaps) {
315
+ const tag = ext(endpoint.op, "x-tenant");
316
+ if (typeof tag === "string")
317
+ return tag;
318
+ const pathParams = pathParameterNames(endpoint.path);
319
+ const guess = pathParams.find((name) => TENANT_PARAM.test(name));
320
+ if (guess === undefined)
321
+ return null;
322
+ gaps?.record(endpoint.operationId, "x-tenant", `assuming "${guess}" scopes this operation to a tenant, inferred from its name`);
323
+ return guess;
324
+ }
325
+ export function pathParameterNames(path) {
326
+ return [...path.matchAll(/\{([^}]+)\}/g)].map((m) => m[1] ?? "").filter(Boolean);
327
+ }
328
+ /** Path parameters declared as roots — resources oat cannot create and must be given. */
329
+ export function readRootParams(op) {
330
+ const params = (op.parameters ?? []);
331
+ return params
332
+ .filter((p) => p.in === "path" && p["x-root"] === true)
333
+ .map((p) => p.name);
334
+ }
335
+ //# sourceMappingURL=extensions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensions.js","sourceRoot":"","sources":["../../src/spec/extensions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Builds the entity graph — the model every scenario is planned against.
3
+ *
4
+ * The central move: `x-invalidate` is read as a graph edge, not a cache hint. Inverting it
5
+ * gives each entity its *read surface*, the set of projections through which an instance is
6
+ * observable. That set is the criss-cross matrix.
7
+ */
8
+ import type { CollectionShape } from "./collection.ts";
9
+ import { type AsyncSpec, type EffectSpec, type EntityAction, type InviteSpec, GapCollector, type QueryCapability } from "./extensions.ts";
10
+ import { type QueryConventions } from "./conventions.ts";
11
+ import { type OpenApiDocument, type OperationObject } from "./types.ts";
12
+ export interface OperationModel {
13
+ operationId: string;
14
+ method: string;
15
+ path: string;
16
+ route: string;
17
+ entity: string | null;
18
+ action: EntityAction | null;
19
+ entitySource: "tag" | "heuristic" | null;
20
+ invalidates: string[];
21
+ effects: EffectSpec[];
22
+ async: AsyncSpec | null;
23
+ tenantParam: string | null;
24
+ /** Whether tenancy was declared via `x-tenant` or merely guessed from the path. */
25
+ tenantSource: "tag" | "heuristic" | null;
26
+ pathParams: string[];
27
+ rootParams: string[];
28
+ queryParamNames: string[];
29
+ /**
30
+ * Header parameter this operation accepts as an idempotency key, when it declares one.
31
+ *
32
+ * Read straight from the document rather than from a new meta tag: an API that promises replay
33
+ * safety publishes the header, and the promise is what makes the property testable.
34
+ */
35
+ idempotencyHeader: string | null;
36
+ /** What this endpoint's query parameters and envelope mean, derived from the document. */
37
+ conventions: QueryConventions;
38
+ documentedStatuses: number[];
39
+ securitySchemes: string[];
40
+ collection: CollectionShape | null;
41
+ identity: string | null;
42
+ query: QueryCapability | null;
43
+ immutable: string[];
44
+ generated: string[];
45
+ softDelete: string | null;
46
+ invite: InviteSpec | null;
47
+ cost: "low" | "medium" | "high";
48
+ destructive: boolean;
49
+ idempotent: boolean;
50
+ freshPrincipal: boolean;
51
+ cleanup: string | null;
52
+ hasRequestBody: boolean;
53
+ isMutation: boolean;
54
+ }
55
+ export interface EntityModel {
56
+ name: string;
57
+ identity: string | null;
58
+ create?: string;
59
+ list?: string;
60
+ read?: string;
61
+ update?: string;
62
+ delete?: string;
63
+ actions: string[];
64
+ invite: InviteSpec | null;
65
+ /** Read routes through which an instance is observable — the criss-cross matrix. */
66
+ readSurface: string[];
67
+ /** Read routes contributed by `x-invalidate` rather than by sibling inference. */
68
+ declaredSurface: string[];
69
+ tenantParams: string[];
70
+ trackable: boolean;
71
+ }
72
+ export interface SpecModel {
73
+ operations: OperationModel[];
74
+ byOperationId: Map<string, OperationModel>;
75
+ byRoute: Map<string, OperationModel>;
76
+ /** The untouched operation objects, keyed by id — schemas are read from here. */
77
+ rawOperations: Map<string, OperationObject>;
78
+ entities: Map<string, EntityModel>;
79
+ roots: string[];
80
+ gaps: GapCollector;
81
+ securitySchemes: string[];
82
+ hasAuthOperations: boolean;
83
+ }
84
+ export declare function buildModel(doc: OpenApiDocument): SpecModel;
85
+ /** The collection segment immediately preceding `{param}` in the path. */
86
+ export declare function owningEntityName(path: string, param: string): string | null;
87
+ /** `{project_id}` → `project`, `{tableId}` → `table`. */
88
+ export declare function impliedEntityName(param: string): string | null;
89
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/spec/graph.ts"],"names":[],"mappings":"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"}