@kubb/ast 5.18.0 → 5.18.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +54 -27
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +12 -4
- package/dist/index.d.ts +12 -4
- package/dist/index.js +54 -27
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.cts
CHANGED
|
@@ -1157,6 +1157,11 @@ type ParameterNode = BaseNode & {
|
|
|
1157
1157
|
* `application/json` when the value is sent as a JSON-encoded string. Absent for `schema` parameters.
|
|
1158
1158
|
*/
|
|
1159
1159
|
contentType?: string;
|
|
1160
|
+
/**
|
|
1161
|
+
* Serialization settings per property of a `content` parameter, from the `encoding` of its media type. An OpenAPI 3.2
|
|
1162
|
+
* `querystring` parameter sent as `application/x-www-form-urlencoded` uses it to set `style` and `explode` per field.
|
|
1163
|
+
*/
|
|
1164
|
+
encoding?: Record<string, EncodingNode>;
|
|
1160
1165
|
examples?: Array<ExampleNode>;
|
|
1161
1166
|
deprecated?: boolean;
|
|
1162
1167
|
allowEmptyValue?: boolean;
|
|
@@ -1221,7 +1226,7 @@ type Digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
|
|
|
1221
1226
|
/**
|
|
1222
1227
|
* Response status code literal used by operations.
|
|
1223
1228
|
*
|
|
1224
|
-
* Includes three-digit HTTP status code strings, ranges such as `"
|
|
1229
|
+
* Includes three-digit HTTP status code strings, ranges such as `"2xx"`, and `"default"` for catch-all responses.
|
|
1225
1230
|
*
|
|
1226
1231
|
* @example
|
|
1227
1232
|
* ```ts
|
|
@@ -1229,7 +1234,7 @@ type Digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
|
|
|
1229
1234
|
* const fallback: StatusCode = 'default'
|
|
1230
1235
|
* ```
|
|
1231
1236
|
*/
|
|
1232
|
-
type StatusCode = `${1 | 2 | 3 | 4 | 5}${Digit}${Digit}` | `${1 | 2 | 3 | 4 | 5}
|
|
1237
|
+
type StatusCode = `${1 | 2 | 3 | 4 | 5}${Digit}${Digit}` | `${1 | 2 | 3 | 4 | 5}xx` | 'default';
|
|
1233
1238
|
/**
|
|
1234
1239
|
* AST node representing one operation response variant.
|
|
1235
1240
|
*
|
|
@@ -2663,7 +2668,8 @@ export declare function collectSchemaRefs(node: SchemaNode): ReadonlySet<string>
|
|
|
2663
2668
|
*
|
|
2664
2669
|
* Only refs that carry a `$ref` pointer count, so a synthesized ref pointing at a sibling in the
|
|
2665
2670
|
* same file (a union member created by name) is left out. That leaves exactly the set
|
|
2666
|
-
* `resolver.imports` emits.
|
|
2671
|
+
* `resolver.imports` emits. Refs inside `conditionals`, `contains` and `content` count only with
|
|
2672
|
+
* `checks: true`, for a plugin that prints those checks.
|
|
2667
2673
|
*
|
|
2668
2674
|
* @example
|
|
2669
2675
|
* ```ts
|
|
@@ -2671,7 +2677,9 @@ export declare function collectSchemaRefs(node: SchemaNode): ReadonlySet<string>
|
|
|
2671
2677
|
* // ['Category', 'Tag']
|
|
2672
2678
|
* ```
|
|
2673
2679
|
*/
|
|
2674
|
-
export declare function collectImportedRefNames(node: SchemaNode
|
|
2680
|
+
export declare function collectImportedRefNames(node: SchemaNode, { checks }?: {
|
|
2681
|
+
checks?: boolean;
|
|
2682
|
+
}): ReadonlyArray<string>;
|
|
2675
2683
|
/**
|
|
2676
2684
|
* Collects the names of all top-level schemas transitively used by a set of operations.
|
|
2677
2685
|
*
|
package/dist/index.d.ts
CHANGED
|
@@ -1157,6 +1157,11 @@ type ParameterNode = BaseNode & {
|
|
|
1157
1157
|
* `application/json` when the value is sent as a JSON-encoded string. Absent for `schema` parameters.
|
|
1158
1158
|
*/
|
|
1159
1159
|
contentType?: string;
|
|
1160
|
+
/**
|
|
1161
|
+
* Serialization settings per property of a `content` parameter, from the `encoding` of its media type. An OpenAPI 3.2
|
|
1162
|
+
* `querystring` parameter sent as `application/x-www-form-urlencoded` uses it to set `style` and `explode` per field.
|
|
1163
|
+
*/
|
|
1164
|
+
encoding?: Record<string, EncodingNode>;
|
|
1160
1165
|
examples?: Array<ExampleNode>;
|
|
1161
1166
|
deprecated?: boolean;
|
|
1162
1167
|
allowEmptyValue?: boolean;
|
|
@@ -1221,7 +1226,7 @@ type Digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
|
|
|
1221
1226
|
/**
|
|
1222
1227
|
* Response status code literal used by operations.
|
|
1223
1228
|
*
|
|
1224
|
-
* Includes three-digit HTTP status code strings, ranges such as `"
|
|
1229
|
+
* Includes three-digit HTTP status code strings, ranges such as `"2xx"`, and `"default"` for catch-all responses.
|
|
1225
1230
|
*
|
|
1226
1231
|
* @example
|
|
1227
1232
|
* ```ts
|
|
@@ -1229,7 +1234,7 @@ type Digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
|
|
|
1229
1234
|
* const fallback: StatusCode = 'default'
|
|
1230
1235
|
* ```
|
|
1231
1236
|
*/
|
|
1232
|
-
type StatusCode = `${1 | 2 | 3 | 4 | 5}${Digit}${Digit}` | `${1 | 2 | 3 | 4 | 5}
|
|
1237
|
+
type StatusCode = `${1 | 2 | 3 | 4 | 5}${Digit}${Digit}` | `${1 | 2 | 3 | 4 | 5}xx` | 'default';
|
|
1233
1238
|
/**
|
|
1234
1239
|
* AST node representing one operation response variant.
|
|
1235
1240
|
*
|
|
@@ -2663,7 +2668,8 @@ export declare function collectSchemaRefs(node: SchemaNode): ReadonlySet<string>
|
|
|
2663
2668
|
*
|
|
2664
2669
|
* Only refs that carry a `$ref` pointer count, so a synthesized ref pointing at a sibling in the
|
|
2665
2670
|
* same file (a union member created by name) is left out. That leaves exactly the set
|
|
2666
|
-
* `resolver.imports` emits.
|
|
2671
|
+
* `resolver.imports` emits. Refs inside `conditionals`, `contains` and `content` count only with
|
|
2672
|
+
* `checks: true`, for a plugin that prints those checks.
|
|
2667
2673
|
*
|
|
2668
2674
|
* @example
|
|
2669
2675
|
* ```ts
|
|
@@ -2671,7 +2677,9 @@ export declare function collectSchemaRefs(node: SchemaNode): ReadonlySet<string>
|
|
|
2671
2677
|
* // ['Category', 'Tag']
|
|
2672
2678
|
* ```
|
|
2673
2679
|
*/
|
|
2674
|
-
export declare function collectImportedRefNames(node: SchemaNode
|
|
2680
|
+
export declare function collectImportedRefNames(node: SchemaNode, { checks }?: {
|
|
2681
|
+
checks?: boolean;
|
|
2682
|
+
}): ReadonlyArray<string>;
|
|
2675
2683
|
/**
|
|
2676
2684
|
* Collects the names of all top-level schemas transitively used by a set of operations.
|
|
2677
2685
|
*
|
package/dist/index.js
CHANGED
|
@@ -201,6 +201,15 @@ const VISITOR_KEYS = {
|
|
|
201
201
|
Property: ["schema"],
|
|
202
202
|
Parameter: ["schema"]
|
|
203
203
|
};
|
|
204
|
+
/**
|
|
205
|
+
* Schema fields that hold checks rather than shape: the `conditionals` entries, `contains` and a string's `content`.
|
|
206
|
+
* `transform` and `collect` skip them, and `visitChildNodes` walks them with `checks: true`.
|
|
207
|
+
*/
|
|
208
|
+
const schemaCheckKeys = [
|
|
209
|
+
"conditionals",
|
|
210
|
+
"contains",
|
|
211
|
+
"content"
|
|
212
|
+
];
|
|
204
213
|
/** Visitor callback names in traversal order, the keys of {@link Visitor}. */
|
|
205
214
|
const visitorKeys = [
|
|
206
215
|
"input",
|
|
@@ -251,28 +260,35 @@ function getChildren(node, recurse) {
|
|
|
251
260
|
});
|
|
252
261
|
return children;
|
|
253
262
|
}
|
|
254
|
-
/**
|
|
255
|
-
|
|
256
|
-
|
|
263
|
+
/**
|
|
264
|
+
* Calls `visit` for each direct child node and stops at the first call that returns `true`.
|
|
265
|
+
* With `checks: true`, a schema's {@link schemaCheckKeys} fields are walked too.
|
|
266
|
+
*/
|
|
267
|
+
function visitChildNodes(node, visit, { checks = false } = {}) {
|
|
268
|
+
const keys = checks && node.kind === nodeKinds.schema ? [...VISITOR_KEYS[node.kind] ?? [], ...schemaCheckKeys] : VISITOR_KEYS[node.kind];
|
|
257
269
|
if (!keys) return false;
|
|
258
270
|
const record = node;
|
|
259
271
|
const seen = /* @__PURE__ */ new Set();
|
|
260
272
|
const visitOnce = (child) => !seen.has(child) && (seen.add(child), visit(child));
|
|
273
|
+
const visitRecord = (value) => {
|
|
274
|
+
for (const name in value) {
|
|
275
|
+
if (!Object.hasOwn(value, name)) continue;
|
|
276
|
+
const item = value[name];
|
|
277
|
+
if (isNode(item) && visitOnce(item)) return true;
|
|
278
|
+
}
|
|
279
|
+
return false;
|
|
280
|
+
};
|
|
261
281
|
for (const key of keys) {
|
|
262
282
|
const value = record[key];
|
|
263
283
|
if (Array.isArray(value)) {
|
|
264
|
-
for (const item of value) if (isNode(item)
|
|
284
|
+
for (const item of value) if (isNode(item) ? visitOnce(item) : isNodeRecord(item) && visitRecord(item)) return true;
|
|
265
285
|
continue;
|
|
266
286
|
}
|
|
267
287
|
if (isNode(value)) {
|
|
268
288
|
if (visitOnce(value)) return true;
|
|
269
289
|
continue;
|
|
270
290
|
}
|
|
271
|
-
if (isNodeRecord(value)
|
|
272
|
-
if (!Object.hasOwn(value, name)) continue;
|
|
273
|
-
const item = value[name];
|
|
274
|
-
if (isNode(item) && visitOnce(item)) return true;
|
|
275
|
-
}
|
|
291
|
+
if (isNodeRecord(value) && visitRecord(value)) return true;
|
|
276
292
|
}
|
|
277
293
|
return false;
|
|
278
294
|
}
|
|
@@ -1181,23 +1197,33 @@ function memo(store, key, compute) {
|
|
|
1181
1197
|
return value;
|
|
1182
1198
|
}
|
|
1183
1199
|
// src/utils/schemaGraph.ts
|
|
1184
|
-
/**
|
|
1185
|
-
* Walks a node's subtree once and lists every ref it holds, in traversal order, as the resolved
|
|
1186
|
-
* name plus whether the ref carries a `$ref` pointer. Memoized by node identity, so
|
|
1187
|
-
* `collectSchemaRefs` and `collectImportedRefNames` share one scan per schema.
|
|
1188
|
-
*/
|
|
1189
1200
|
const refEntries = /* @__PURE__ */ new WeakMap();
|
|
1201
|
+
const checkRefEntries = /* @__PURE__ */ new WeakMap();
|
|
1190
1202
|
const schemaRefs = /* @__PURE__ */ new WeakMap();
|
|
1191
1203
|
const importedRefNames = /* @__PURE__ */ new WeakMap();
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1204
|
+
const importedCheckRefNames = /* @__PURE__ */ new WeakMap();
|
|
1205
|
+
/**
|
|
1206
|
+
* Walks a node's subtree once and lists every ref it holds, in traversal order, as the resolved
|
|
1207
|
+
* name plus whether the ref carries a `$ref` pointer. Memoized per node and per `checks` mode, so
|
|
1208
|
+
* each helper below scans a schema once.
|
|
1209
|
+
*/
|
|
1210
|
+
function collectRefEntries(node, { checks }) {
|
|
1211
|
+
return memo(checks ? checkRefEntries : refEntries, node, () => {
|
|
1212
|
+
const entries = [];
|
|
1213
|
+
const walk = (current) => {
|
|
1214
|
+
if (current.kind === nodeKinds.schema && current.type === "ref") {
|
|
1215
|
+
const name = resolveRefName(current);
|
|
1216
|
+
if (name) entries.push({
|
|
1217
|
+
name,
|
|
1218
|
+
hasPointer: Boolean(current.ref)
|
|
1219
|
+
});
|
|
1220
|
+
}
|
|
1221
|
+
visitChildNodes(current, walk, { checks });
|
|
1222
|
+
return false;
|
|
1223
|
+
};
|
|
1224
|
+
walk(node);
|
|
1225
|
+
return entries;
|
|
1226
|
+
});
|
|
1201
1227
|
}
|
|
1202
1228
|
/**
|
|
1203
1229
|
* Collects the names of every schema a node's subtree references, resolved with `resolveRefName`.
|
|
@@ -1211,7 +1237,7 @@ function collectRefEntries(node) {
|
|
|
1211
1237
|
* ```
|
|
1212
1238
|
*/
|
|
1213
1239
|
function collectSchemaRefs(node) {
|
|
1214
|
-
return memo(schemaRefs, node, () => new Set(collectRefEntries(node).map((entry) => entry.name)));
|
|
1240
|
+
return memo(schemaRefs, node, () => new Set(collectRefEntries(node, { checks: true }).map((entry) => entry.name)));
|
|
1215
1241
|
}
|
|
1216
1242
|
/**
|
|
1217
1243
|
* Collects the de-duplicated target names of every pointer-carrying ref in a node's subtree, in
|
|
@@ -1220,7 +1246,8 @@ function collectSchemaRefs(node) {
|
|
|
1220
1246
|
*
|
|
1221
1247
|
* Only refs that carry a `$ref` pointer count, so a synthesized ref pointing at a sibling in the
|
|
1222
1248
|
* same file (a union member created by name) is left out. That leaves exactly the set
|
|
1223
|
-
* `resolver.imports` emits.
|
|
1249
|
+
* `resolver.imports` emits. Refs inside `conditionals`, `contains` and `content` count only with
|
|
1250
|
+
* `checks: true`, for a plugin that prints those checks.
|
|
1224
1251
|
*
|
|
1225
1252
|
* @example
|
|
1226
1253
|
* ```ts
|
|
@@ -1228,8 +1255,8 @@ function collectSchemaRefs(node) {
|
|
|
1228
1255
|
* // ['Category', 'Tag']
|
|
1229
1256
|
* ```
|
|
1230
1257
|
*/
|
|
1231
|
-
function collectImportedRefNames(node) {
|
|
1232
|
-
return memo(importedRefNames, node, () => [...new Set(collectRefEntries(node).flatMap((entry) => entry.hasPointer ? [entry.name] : []))]);
|
|
1258
|
+
function collectImportedRefNames(node, { checks = false } = {}) {
|
|
1259
|
+
return memo(checks ? importedCheckRefNames : importedRefNames, node, () => [...new Set(collectRefEntries(node, { checks }).flatMap((entry) => entry.hasPointer ? [entry.name] : []))]);
|
|
1233
1260
|
}
|
|
1234
1261
|
/**
|
|
1235
1262
|
* Collects the names of all top-level schemas transitively used by a set of operations.
|