@redocly/openapi-core 0.0.0-snapshot.1786626470 → 0.0.0-snapshot.1786811652
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/lib/api-graph/build-graph.d.ts +71 -0
- package/lib/api-graph/build-graph.d.ts.map +1 -0
- package/lib/api-graph/build-graph.js +418 -0
- package/lib/api-graph/build-graph.js.map +1 -0
- package/lib/api-graph/build-index.d.ts +39 -0
- package/lib/api-graph/build-index.d.ts.map +1 -0
- package/lib/api-graph/build-index.js +191 -0
- package/lib/api-graph/build-index.js.map +1 -0
- package/lib/api-graph/file-view.d.ts +27 -0
- package/lib/api-graph/file-view.d.ts.map +1 -0
- package/lib/api-graph/file-view.js +51 -0
- package/lib/api-graph/file-view.js.map +1 -0
- package/lib/api-graph/find.d.ts +20 -0
- package/lib/api-graph/find.d.ts.map +1 -0
- package/lib/api-graph/find.js +75 -0
- package/lib/api-graph/find.js.map +1 -0
- package/lib/api-graph/node-id.d.ts +28 -0
- package/lib/api-graph/node-id.d.ts.map +1 -0
- package/lib/api-graph/node-id.js +100 -0
- package/lib/api-graph/node-id.js.map +1 -0
- package/lib/api-graph/pointer.d.ts +86 -0
- package/lib/api-graph/pointer.d.ts.map +1 -0
- package/lib/api-graph/pointer.js +213 -0
- package/lib/api-graph/pointer.js.map +1 -0
- package/lib/api-graph/select.d.ts +15 -0
- package/lib/api-graph/select.d.ts.map +1 -0
- package/lib/api-graph/select.js +71 -0
- package/lib/api-graph/select.js.map +1 -0
- package/lib/api-graph/slice.d.ts +54 -0
- package/lib/api-graph/slice.d.ts.map +1 -0
- package/lib/api-graph/slice.js +211 -0
- package/lib/api-graph/slice.js.map +1 -0
- package/lib/api-graph/types.d.ts +26 -0
- package/lib/api-graph/types.d.ts.map +1 -0
- package/lib/api-graph/types.js +2 -0
- package/lib/api-graph/types.js.map +1 -0
- package/lib/api-graph/views.d.ts +139 -0
- package/lib/api-graph/views.d.ts.map +1 -0
- package/lib/api-graph/views.js +348 -0
- package/lib/api-graph/views.js.map +1 -0
- package/lib/format/codeframes.d.ts +5 -0
- package/lib/format/codeframes.d.ts.map +1 -1
- package/lib/format/codeframes.js +74 -19
- package/lib/format/codeframes.js.map +1 -1
- package/lib/index.d.ts +11 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +9 -0
- package/lib/index.js.map +1 -1
- package/lib/resolve.d.ts +6 -0
- package/lib/resolve.d.ts.map +1 -1
- package/lib/resolve.js +30 -0
- package/lib/resolve.js.map +1 -1
- package/lib/types/redocly-yaml.d.ts.map +1 -1
- package/lib/types/redocly-yaml.js +0 -12
- package/lib/types/redocly-yaml.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { SpecVersion } from '../oas-types.js';
|
|
2
|
+
import { type Location } from '../ref-utils.js';
|
|
3
|
+
import { type BaseResolver, type Document, type ResolvedRefMap } from '../resolve.js';
|
|
4
|
+
import type { NormalizedNodeType } from '../types/index.js';
|
|
5
|
+
import type { DependencyGraph, GraphEdge } from './types.js';
|
|
6
|
+
export type CollectedOperation = {
|
|
7
|
+
id: string;
|
|
8
|
+
method: string;
|
|
9
|
+
containerKey: string;
|
|
10
|
+
isWebhook: boolean;
|
|
11
|
+
tags: string[];
|
|
12
|
+
summary?: string;
|
|
13
|
+
description?: string;
|
|
14
|
+
operationId?: string;
|
|
15
|
+
deprecated?: boolean;
|
|
16
|
+
location: Location;
|
|
17
|
+
pathItemLocation: Location;
|
|
18
|
+
};
|
|
19
|
+
export type CollectedComponent = {
|
|
20
|
+
section: string;
|
|
21
|
+
name: string;
|
|
22
|
+
description?: string;
|
|
23
|
+
location: Location;
|
|
24
|
+
};
|
|
25
|
+
export type ApiIndexMeta = {
|
|
26
|
+
info?: {
|
|
27
|
+
title?: string;
|
|
28
|
+
description?: string;
|
|
29
|
+
location: Location;
|
|
30
|
+
};
|
|
31
|
+
servers?: {
|
|
32
|
+
urls: string[];
|
|
33
|
+
location: Location;
|
|
34
|
+
};
|
|
35
|
+
declaredTags: {
|
|
36
|
+
name: string;
|
|
37
|
+
description?: string;
|
|
38
|
+
location: Location;
|
|
39
|
+
}[];
|
|
40
|
+
operations: CollectedOperation[];
|
|
41
|
+
components: CollectedComponent[];
|
|
42
|
+
pathsLocation?: Location;
|
|
43
|
+
webhooksLocation?: Location;
|
|
44
|
+
componentsLocation?: Location;
|
|
45
|
+
};
|
|
46
|
+
/** A webhook operation has no graph node of its own; every method under a webhook shares one container node. */
|
|
47
|
+
export declare function graphNodeIdFor(operation: CollectedOperation): string;
|
|
48
|
+
export type ApiAnalysis = {
|
|
49
|
+
graph: DependencyGraph;
|
|
50
|
+
meta: ApiIndexMeta;
|
|
51
|
+
resolvedRefMap: ResolvedRefMap;
|
|
52
|
+
rootDocument: Document;
|
|
53
|
+
};
|
|
54
|
+
export declare function analyzeApi(options: {
|
|
55
|
+
rootDocument: Document;
|
|
56
|
+
specVersion: SpecVersion;
|
|
57
|
+
types: Record<string, NormalizedNodeType>;
|
|
58
|
+
externalRefResolver: BaseResolver;
|
|
59
|
+
cwd: string;
|
|
60
|
+
resolveRef: (base: string, uri: string) => string;
|
|
61
|
+
}): Promise<ApiAnalysis>;
|
|
62
|
+
export declare function collectConnectedIds(seeds: string[], edges: GraphEdge[], { reverse }?: {
|
|
63
|
+
reverse?: boolean;
|
|
64
|
+
}): Set<string>;
|
|
65
|
+
/**
|
|
66
|
+
* BFS over reversed edges from `targetId`. For every node that (transitively) references the
|
|
67
|
+
* target, returns the shortest reference chain ordered target-first:
|
|
68
|
+
* `[targetId, …, referrerId]`.
|
|
69
|
+
*/
|
|
70
|
+
export declare function collectReversePathsTo(targetId: string, edges: GraphEdge[]): Map<string, string[]>;
|
|
71
|
+
//# sourceMappingURL=build-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-graph.d.ts","sourceRoot":"","sources":["../../src/api-graph/build-graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
import { isAbsoluteUrl, isRef } from '../ref-utils.js';
|
|
2
|
+
import { resolveDocument, } from '../resolve.js';
|
|
3
|
+
import { isPlainObject } from '../utils/is-plain-object.js';
|
|
4
|
+
import { normalizeVisitors } from '../visitors.js';
|
|
5
|
+
import { walkDocument } from '../walk.js';
|
|
6
|
+
import { COMPONENT_SECTIONS } from './build-index.js';
|
|
7
|
+
import { compareStrings, mapForeignLocation, mapRootPointer, OPERATION_METHODS, parsePointerSegments, toNodeId, } from './node-id.js';
|
|
8
|
+
/** A webhook operation has no graph node of its own; every method under a webhook shares one container node. */
|
|
9
|
+
export function graphNodeIdFor(operation) {
|
|
10
|
+
return operation.isWebhook ? `webhooks/${operation.containerKey}` : operation.id;
|
|
11
|
+
}
|
|
12
|
+
export async function analyzeApi(options) {
|
|
13
|
+
const { rootDocument, specVersion, types, externalRefResolver, cwd, resolveRef } = options;
|
|
14
|
+
const resolvedRefMap = await resolveDocument({
|
|
15
|
+
rootDocument,
|
|
16
|
+
rootType: types.Root,
|
|
17
|
+
externalRefResolver,
|
|
18
|
+
});
|
|
19
|
+
const ctx = { problems: [], specVersion, visitorsData: {} };
|
|
20
|
+
const { graph, meta } = walkStructure({
|
|
21
|
+
document: rootDocument,
|
|
22
|
+
types,
|
|
23
|
+
resolvedRefMap,
|
|
24
|
+
ctx,
|
|
25
|
+
cwd,
|
|
26
|
+
resolveRef,
|
|
27
|
+
});
|
|
28
|
+
return { graph, meta, resolvedRefMap, rootDocument };
|
|
29
|
+
}
|
|
30
|
+
function walkStructure(options) {
|
|
31
|
+
const { document, types, resolvedRefMap, ctx, cwd, resolveRef } = options;
|
|
32
|
+
const rootAbs = document.source.absoluteRef;
|
|
33
|
+
const rootId = toNodeId(rootAbs, cwd);
|
|
34
|
+
const nodes = new Map();
|
|
35
|
+
const edges = new Map();
|
|
36
|
+
const meta = { declaredTags: [], operations: [], components: [] };
|
|
37
|
+
// A split layout defines root components as whole-file refs (`Order: {$ref: Order.yaml}`).
|
|
38
|
+
// Bundling used to inline those files under their component names; to keep the same canonical
|
|
39
|
+
// ids without bundling, map each aliased file to its `section/Name` id up front, and remember
|
|
40
|
+
// the alias entries themselves so they don't become self-edges.
|
|
41
|
+
const { fileAliases, aliasEntryPointers } = collectRootComponentAliases(document.parsed, rootAbs, resolveRef);
|
|
42
|
+
const addOrUpdateNode = (mapped, resolved) => {
|
|
43
|
+
const node = nodes.get(mapped.id) ?? { id: mapped.id, resolved: false };
|
|
44
|
+
if (resolved)
|
|
45
|
+
node.resolved = true;
|
|
46
|
+
if (isAbsoluteUrl(mapped.id))
|
|
47
|
+
node.external = true;
|
|
48
|
+
node.kind = mapped.kind;
|
|
49
|
+
node.file = mapped.file;
|
|
50
|
+
nodes.set(mapped.id, node);
|
|
51
|
+
};
|
|
52
|
+
const addEdge = (from, to, refString) => {
|
|
53
|
+
const edgeKey = `${from} -> ${to}`;
|
|
54
|
+
const edge = edges.get(edgeKey) ?? { from, to, refs: [] };
|
|
55
|
+
if (refString !== undefined && !edge.refs.includes(refString)) {
|
|
56
|
+
edge.refs.push(refString);
|
|
57
|
+
}
|
|
58
|
+
edges.set(edgeKey, edge);
|
|
59
|
+
};
|
|
60
|
+
const mapToNode = (absoluteRef, pointer) => {
|
|
61
|
+
if (absoluteRef === rootAbs) {
|
|
62
|
+
return { ...mapRootPointer(pointer, rootId), file: rootId };
|
|
63
|
+
}
|
|
64
|
+
const fileId = toNodeId(absoluteRef, cwd);
|
|
65
|
+
const mapped = mapForeignLocation(fileId, pointer);
|
|
66
|
+
const alias = fileAliases.get(absoluteRef);
|
|
67
|
+
// Any location that falls back to the whole file collapses to the aliased component,
|
|
68
|
+
// exactly as it did when the file was bundled under that name.
|
|
69
|
+
if (alias !== undefined && mapped.kind === 'file') {
|
|
70
|
+
return { id: alias, kind: 'component', file: fileId };
|
|
71
|
+
}
|
|
72
|
+
return mapped;
|
|
73
|
+
};
|
|
74
|
+
const nodeFor = (location) => {
|
|
75
|
+
const mapped = mapToNode(location.source.absoluteRef, location.pointer);
|
|
76
|
+
addOrUpdateNode(mapped, true);
|
|
77
|
+
linkToRoot(mapped);
|
|
78
|
+
return mapped.id;
|
|
79
|
+
};
|
|
80
|
+
const linkToRoot = (mapped) => {
|
|
81
|
+
if (mapped.ancestry === undefined)
|
|
82
|
+
return;
|
|
83
|
+
let previous = rootId;
|
|
84
|
+
for (const ancestorId of mapped.ancestry) {
|
|
85
|
+
// Keep a file already stamped by a direct PathItem visit (e.g. a $ref'd path file);
|
|
86
|
+
// rootId is only a fallback for an ancestor first created through this link.
|
|
87
|
+
const ancestorFile = nodes.get(ancestorId)?.file ?? rootId;
|
|
88
|
+
addOrUpdateNode({ id: ancestorId, kind: 'path', file: ancestorFile }, true);
|
|
89
|
+
addEdge(previous, ancestorId);
|
|
90
|
+
previous = ancestorId;
|
|
91
|
+
}
|
|
92
|
+
addEdge(previous, mapped.id);
|
|
93
|
+
};
|
|
94
|
+
const unresolvedTargetId = (siteLocation, refString) => {
|
|
95
|
+
const [uri, fragment] = refString.split('#');
|
|
96
|
+
const siteFile = siteLocation.source.absoluteRef;
|
|
97
|
+
let mapped;
|
|
98
|
+
if (uri === '') {
|
|
99
|
+
mapped = mapToNode(siteFile, '#' + (fragment ?? '/'));
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
const fileId = toNodeId(resolveRef(siteFile, uri), cwd);
|
|
103
|
+
mapped =
|
|
104
|
+
fragment !== undefined
|
|
105
|
+
? mapForeignLocation(fileId, '#' + fragment)
|
|
106
|
+
: { id: fileId, kind: 'file', file: fileId };
|
|
107
|
+
}
|
|
108
|
+
addOrUpdateNode(mapped, false);
|
|
109
|
+
return mapped.id;
|
|
110
|
+
};
|
|
111
|
+
// Remembers the top-level PathItem currently being walked, so a $ref'd path item's
|
|
112
|
+
// operations (whose own rawLocation points into the foreign file, not the root) can still
|
|
113
|
+
// be traced back to a root-relative pointer. Identity, not the pointer, decides ownership:
|
|
114
|
+
// an Operation nested in a callback's own PathItem has a different `parent` object and is
|
|
115
|
+
// correctly ignored even though tracking is never reset between sibling operations.
|
|
116
|
+
let currentPathItemNode;
|
|
117
|
+
let currentPathItemRawLocation;
|
|
118
|
+
// Remembers the spine operation whose subtree is currently being walked, plus the absolute
|
|
119
|
+
// ref of the file that operation is defined in. Inside that same file — including the
|
|
120
|
+
// operation's own callbacks, whose nested PathItem/Operation never overwrite this tracking,
|
|
121
|
+
// same identity rule as above — a $ref's owner site collapses to a bare FILE node by
|
|
122
|
+
// `mapForeignLocation` (it has no `components/...`-shaped pointer of its own); redirecting
|
|
123
|
+
// that owner to the operation instead matches the old bundled walk, where the same ref's
|
|
124
|
+
// owner was the operation. Once a ref has hopped into a *different* file (e.g. a component
|
|
125
|
+
// schema referencing another schema), the site's absoluteRef no longer matches
|
|
126
|
+
// `currentOperationFileAbs`, so it correctly keeps the current file-owner behavior.
|
|
127
|
+
let currentOperationNode;
|
|
128
|
+
let currentOperationNodeId;
|
|
129
|
+
let currentOperationFileAbs;
|
|
130
|
+
let currentWebhookPathItemNode;
|
|
131
|
+
let currentWebhookKey;
|
|
132
|
+
let currentWebhookPathItemLocation;
|
|
133
|
+
const collectNamed = (section) => (node, collectorCtx) => {
|
|
134
|
+
for (const name of Object.keys(node)) {
|
|
135
|
+
const value = node[name];
|
|
136
|
+
const target = isRef(value)
|
|
137
|
+
? collectorCtx.resolve(value)
|
|
138
|
+
: { node: value, location: collectorCtx.location.child([name]) };
|
|
139
|
+
if (!target.location)
|
|
140
|
+
continue;
|
|
141
|
+
// Resolved nodes are untyped JSON, so narrowing to the one field we read is safe.
|
|
142
|
+
const description = target.node?.description;
|
|
143
|
+
meta.components.push({ section, name, description, location: target.location });
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
// Each section's visitor is its Named* node type: schemas → NamedSchemas, and so on.
|
|
147
|
+
const namedComponentVisitors = Object.fromEntries(COMPONENT_SECTIONS.map((section) => [
|
|
148
|
+
`Named${section[0].toUpperCase()}${section.slice(1)}`,
|
|
149
|
+
collectNamed(section),
|
|
150
|
+
]));
|
|
151
|
+
// The dynamically built Named* keys can't be inferred as visitor members,
|
|
152
|
+
// so the assembled object needs an explicit Oas3Visitor assertion.
|
|
153
|
+
const visitor = {
|
|
154
|
+
...namedComponentVisitors,
|
|
155
|
+
Info(node, vctx) {
|
|
156
|
+
meta.info = { title: node.title, description: node.description, location: vctx.location };
|
|
157
|
+
},
|
|
158
|
+
// Oas3Visitor has no dedicated ServerList entry, so node falls back to the visitor
|
|
159
|
+
// type's untyped catch-all — annotate it explicitly to avoid implicit `any` below.
|
|
160
|
+
ServerList(node, vctx) {
|
|
161
|
+
// Path items and operations can override servers; only the root list describes the API.
|
|
162
|
+
if (vctx.rawLocation.pointer !== '#/servers')
|
|
163
|
+
return;
|
|
164
|
+
meta.servers = {
|
|
165
|
+
urls: node.map((server) => server.url).filter((url) => Boolean(url)),
|
|
166
|
+
location: vctx.location,
|
|
167
|
+
};
|
|
168
|
+
},
|
|
169
|
+
Tag(node, vctx) {
|
|
170
|
+
meta.declaredTags.push({
|
|
171
|
+
name: node.name,
|
|
172
|
+
description: node.description,
|
|
173
|
+
location: vctx.location,
|
|
174
|
+
});
|
|
175
|
+
},
|
|
176
|
+
Paths: {
|
|
177
|
+
enter(_node, vctx) {
|
|
178
|
+
meta.pathsLocation ??= vctx.location;
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
WebhooksMap: {
|
|
182
|
+
enter(_node, vctx) {
|
|
183
|
+
meta.webhooksLocation ??= vctx.location;
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
Components: {
|
|
187
|
+
enter(_node, vctx) {
|
|
188
|
+
meta.componentsLocation ??= vctx.location;
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
PathItem: {
|
|
192
|
+
enter(node, vctx) {
|
|
193
|
+
if (vctx.rawLocation.source.absoluteRef !== rootAbs)
|
|
194
|
+
return;
|
|
195
|
+
const segments = parsePointerSegments(vctx.rawLocation.pointer);
|
|
196
|
+
if (segments.length === 2 && segments[0] === 'paths') {
|
|
197
|
+
const spineNodeId = nodeFor(vctx.rawLocation);
|
|
198
|
+
nodes.get(spineNodeId).file = toNodeId(vctx.location.source.absoluteRef, cwd);
|
|
199
|
+
currentPathItemNode = node;
|
|
200
|
+
currentPathItemRawLocation = vctx.rawLocation;
|
|
201
|
+
}
|
|
202
|
+
if (segments.length === 2 && segments[0] === 'webhooks') {
|
|
203
|
+
currentWebhookPathItemNode = node;
|
|
204
|
+
currentWebhookKey = segments[1];
|
|
205
|
+
currentWebhookPathItemLocation = vctx.location;
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
},
|
|
209
|
+
Operation: {
|
|
210
|
+
enter(node, vctx) {
|
|
211
|
+
if (currentWebhookPathItemNode !== undefined &&
|
|
212
|
+
vctx.parent === currentWebhookPathItemNode) {
|
|
213
|
+
const method = String(vctx.key);
|
|
214
|
+
if (OPERATION_METHODS.has(method)) {
|
|
215
|
+
meta.operations.push({
|
|
216
|
+
id: `${method.toUpperCase()} ${currentWebhookKey}`,
|
|
217
|
+
method: method.toUpperCase(),
|
|
218
|
+
containerKey: currentWebhookKey,
|
|
219
|
+
isWebhook: true,
|
|
220
|
+
tags: node.tags ?? [],
|
|
221
|
+
summary: node.summary,
|
|
222
|
+
description: node.description,
|
|
223
|
+
operationId: node.operationId,
|
|
224
|
+
deprecated: node.deprecated,
|
|
225
|
+
location: vctx.location,
|
|
226
|
+
pathItemLocation: currentWebhookPathItemLocation,
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
if (currentPathItemRawLocation === undefined || vctx.parent !== currentPathItemNode) {
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
const method = String(vctx.key);
|
|
235
|
+
if (!OPERATION_METHODS.has(method))
|
|
236
|
+
return;
|
|
237
|
+
const operationNodeId = nodeFor(currentPathItemRawLocation.child([method]));
|
|
238
|
+
if (typeof node.operationId === 'string') {
|
|
239
|
+
nodes.get(operationNodeId).operationId = node.operationId;
|
|
240
|
+
}
|
|
241
|
+
nodes.get(operationNodeId).file = toNodeId(vctx.location.source.absoluteRef, cwd);
|
|
242
|
+
currentOperationNode = node;
|
|
243
|
+
currentOperationNodeId = operationNodeId;
|
|
244
|
+
currentOperationFileAbs = vctx.location.source.absoluteRef;
|
|
245
|
+
meta.operations.push({
|
|
246
|
+
id: operationNodeId,
|
|
247
|
+
method: method.toUpperCase(),
|
|
248
|
+
containerKey: parsePointerSegments(currentPathItemRawLocation.pointer)[1],
|
|
249
|
+
isWebhook: false,
|
|
250
|
+
tags: node.tags ?? [],
|
|
251
|
+
summary: node.summary,
|
|
252
|
+
description: node.description,
|
|
253
|
+
operationId: node.operationId,
|
|
254
|
+
deprecated: node.deprecated,
|
|
255
|
+
location: vctx.location,
|
|
256
|
+
pathItemLocation: currentPathItemRawLocation,
|
|
257
|
+
});
|
|
258
|
+
},
|
|
259
|
+
leave(node) {
|
|
260
|
+
if (node === currentOperationNode) {
|
|
261
|
+
currentOperationNode = undefined;
|
|
262
|
+
currentOperationNodeId = undefined;
|
|
263
|
+
currentOperationFileAbs = undefined;
|
|
264
|
+
}
|
|
265
|
+
},
|
|
266
|
+
},
|
|
267
|
+
ref: {
|
|
268
|
+
enter(refNode, vctx, resolved) {
|
|
269
|
+
if (vctx.location.source.absoluteRef === rootAbs) {
|
|
270
|
+
if (aliasEntryPointers.has(vctx.location.pointer))
|
|
271
|
+
return;
|
|
272
|
+
// A root paths/webhooks entry that is a whole-file ref used to be inlined by the
|
|
273
|
+
// bundler: the spine and its operations come from the PathItem visitor, so a resolved
|
|
274
|
+
// entry adds no edge. An unresolved one still must surface as a broken file node.
|
|
275
|
+
const segments = parsePointerSegments(vctx.location.pointer);
|
|
276
|
+
if (segments.length === 2 &&
|
|
277
|
+
(segments[0] === 'paths' || segments[0] === 'webhooks') &&
|
|
278
|
+
resolved.node !== undefined &&
|
|
279
|
+
resolved.location) {
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
const mappedOwner = mapToNode(vctx.location.source.absoluteRef, vctx.location.pointer);
|
|
284
|
+
const ownerId = currentOperationNodeId !== undefined &&
|
|
285
|
+
mappedOwner.kind === 'file' &&
|
|
286
|
+
vctx.location.source.absoluteRef === currentOperationFileAbs
|
|
287
|
+
? currentOperationNodeId
|
|
288
|
+
: nodeFor(vctx.location);
|
|
289
|
+
const refString = String(refNode.$ref);
|
|
290
|
+
// Mirrors NoUnresolvedRefs: `resolved.location` can be truthy (pointing at a fallback
|
|
291
|
+
// location) even when the pointer path inside the target document doesn't exist, so
|
|
292
|
+
// `node` is the only reliable signal that the $ref actually resolved to something.
|
|
293
|
+
const targetId = resolved.node !== undefined && resolved.location
|
|
294
|
+
? nodeFor(resolved.location)
|
|
295
|
+
: unresolvedTargetId(vctx.location, refString);
|
|
296
|
+
addEdge(ownerId, targetId, refString);
|
|
297
|
+
},
|
|
298
|
+
},
|
|
299
|
+
};
|
|
300
|
+
addOrUpdateNode({ id: rootId, kind: 'root', file: rootId }, true);
|
|
301
|
+
nodes.get(rootId).root = true;
|
|
302
|
+
const normalizedVisitors = normalizeVisitors([{ severity: 'warn', ruleId: 'tree', visitor }], types);
|
|
303
|
+
walkDocument({ document, rootType: types.Root, normalizedVisitors, resolvedRefMap, ctx });
|
|
304
|
+
return { graph: finalizeGraph(rootId, nodes, edges), meta };
|
|
305
|
+
}
|
|
306
|
+
const OAS2_ALIAS_SECTIONS = ['definitions', 'parameters', 'responses', 'securityDefinitions'];
|
|
307
|
+
/** Finds root component entries that are plain whole-file refs and maps the file to the entry id. */
|
|
308
|
+
function collectRootComponentAliases(parsed, rootAbs, resolveRef) {
|
|
309
|
+
const fileAliases = new Map();
|
|
310
|
+
const aliasEntryPointers = new Set();
|
|
311
|
+
const root = parsed;
|
|
312
|
+
const collectSection = (section, idPrefix, pointerPrefix) => {
|
|
313
|
+
for (const [name, value] of Object.entries(section)) {
|
|
314
|
+
const refString = value?.$ref;
|
|
315
|
+
if (typeof refString !== 'string')
|
|
316
|
+
continue;
|
|
317
|
+
const [uri, fragment] = refString.split('#');
|
|
318
|
+
// Only whole-file refs behave like bundle-time inlining; refs into a named section of
|
|
319
|
+
// another file already map to a canonical foreign id on their own.
|
|
320
|
+
if (uri === '' || (fragment !== undefined && fragment !== '/' && fragment !== ''))
|
|
321
|
+
continue;
|
|
322
|
+
fileAliases.set(resolveRef(rootAbs, uri), `${idPrefix}/${name}`);
|
|
323
|
+
aliasEntryPointers.add(`${pointerPrefix}/${escapeAliasKey(name)}`);
|
|
324
|
+
}
|
|
325
|
+
};
|
|
326
|
+
const components = root?.components;
|
|
327
|
+
if (components !== undefined) {
|
|
328
|
+
for (const [section, entries] of Object.entries(components)) {
|
|
329
|
+
if (!isPlainObject(entries))
|
|
330
|
+
continue;
|
|
331
|
+
collectSection(entries, section, `#/components/${escapeAliasKey(section)}`);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
for (const section of OAS2_ALIAS_SECTIONS) {
|
|
335
|
+
const entries = root?.[section];
|
|
336
|
+
if (!isPlainObject(entries))
|
|
337
|
+
continue;
|
|
338
|
+
collectSection(entries, section, `#/${section}`);
|
|
339
|
+
}
|
|
340
|
+
return { fileAliases, aliasEntryPointers };
|
|
341
|
+
}
|
|
342
|
+
function escapeAliasKey(key) {
|
|
343
|
+
return key.replace(/~/g, '~0').replace(/\//g, '~1');
|
|
344
|
+
}
|
|
345
|
+
/** Keeps only nodes reachable from the root, sorted for stable output. */
|
|
346
|
+
function finalizeGraph(rootId, nodeMap, edgeMap) {
|
|
347
|
+
const connectedIds = collectConnectedIds([rootId], [...edgeMap.values()]);
|
|
348
|
+
const nodes = [...nodeMap.values()]
|
|
349
|
+
.filter((node) => connectedIds.has(node.id))
|
|
350
|
+
.sort((a, b) => compareStrings(a.id, b.id));
|
|
351
|
+
const edges = [...edgeMap.values()]
|
|
352
|
+
.filter((edge) => connectedIds.has(edge.from) && connectedIds.has(edge.to))
|
|
353
|
+
.map((edge) => ({ ...edge, refs: [...edge.refs].sort(compareStrings) }))
|
|
354
|
+
.sort((a, b) => compareStrings(a.from, b.from) || compareStrings(a.to, b.to));
|
|
355
|
+
return { roots: [rootId], nodes, edges };
|
|
356
|
+
}
|
|
357
|
+
export function collectConnectedIds(seeds, edges, { reverse = false } = {}) {
|
|
358
|
+
const adjacency = new Map();
|
|
359
|
+
for (const edge of edges) {
|
|
360
|
+
const from = reverse ? edge.to : edge.from;
|
|
361
|
+
const to = reverse ? edge.from : edge.to;
|
|
362
|
+
const neighbours = adjacency.get(from) ?? [];
|
|
363
|
+
neighbours.push(to);
|
|
364
|
+
adjacency.set(from, neighbours);
|
|
365
|
+
}
|
|
366
|
+
const seen = new Set(seeds);
|
|
367
|
+
const queue = [...seen];
|
|
368
|
+
while (queue.length > 0) {
|
|
369
|
+
const current = queue.shift();
|
|
370
|
+
for (const next of adjacency.get(current) ?? []) {
|
|
371
|
+
if (!seen.has(next)) {
|
|
372
|
+
seen.add(next);
|
|
373
|
+
queue.push(next);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
return seen;
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* BFS over reversed edges from `targetId`. For every node that (transitively) references the
|
|
381
|
+
* target, returns the shortest reference chain ordered target-first:
|
|
382
|
+
* `[targetId, …, referrerId]`.
|
|
383
|
+
*/
|
|
384
|
+
export function collectReversePathsTo(targetId, edges) {
|
|
385
|
+
const referrersOf = new Map();
|
|
386
|
+
for (const edge of edges) {
|
|
387
|
+
const referrers = referrersOf.get(edge.to) ?? [];
|
|
388
|
+
referrers.push(edge.from);
|
|
389
|
+
referrersOf.set(edge.to, referrers);
|
|
390
|
+
}
|
|
391
|
+
const parentTowardTarget = new Map();
|
|
392
|
+
const seen = new Set([targetId]);
|
|
393
|
+
const queue = [targetId];
|
|
394
|
+
while (queue.length > 0) {
|
|
395
|
+
const current = queue.shift();
|
|
396
|
+
for (const referrer of referrersOf.get(current) ?? []) {
|
|
397
|
+
if (seen.has(referrer))
|
|
398
|
+
continue;
|
|
399
|
+
seen.add(referrer);
|
|
400
|
+
parentTowardTarget.set(referrer, current);
|
|
401
|
+
queue.push(referrer);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
const chains = new Map();
|
|
405
|
+
for (const nodeId of seen) {
|
|
406
|
+
if (nodeId === targetId)
|
|
407
|
+
continue;
|
|
408
|
+
const chain = [nodeId];
|
|
409
|
+
let cursor = nodeId;
|
|
410
|
+
while (parentTowardTarget.has(cursor)) {
|
|
411
|
+
cursor = parentTowardTarget.get(cursor);
|
|
412
|
+
chain.push(cursor);
|
|
413
|
+
}
|
|
414
|
+
chains.set(nodeId, chain.reverse());
|
|
415
|
+
}
|
|
416
|
+
return chains;
|
|
417
|
+
}
|
|
418
|
+
//# sourceMappingURL=build-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-graph.js","sourceRoot":"","sources":["../../src/api-graph/build-graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { SpecVersion } from '../oas-types.js';
|
|
2
|
+
import { type Location } from '../ref-utils.js';
|
|
3
|
+
import type { ApiAnalysis } from './build-graph.js';
|
|
4
|
+
export declare const SUMMARY_LIMIT = 160;
|
|
5
|
+
/** OpenAPI component sections, in the order the index lists them. */
|
|
6
|
+
export declare const COMPONENT_SECTIONS: readonly string[];
|
|
7
|
+
export type IndexGroupBy = 'tags' | 'paths';
|
|
8
|
+
export type ApiIndexNode = {
|
|
9
|
+
id: string;
|
|
10
|
+
title: string;
|
|
11
|
+
pointer?: string;
|
|
12
|
+
file?: string;
|
|
13
|
+
start_line?: number;
|
|
14
|
+
end_line?: number;
|
|
15
|
+
summary?: string;
|
|
16
|
+
operationId?: string;
|
|
17
|
+
deprecated?: boolean;
|
|
18
|
+
nodes?: ApiIndexNode[];
|
|
19
|
+
};
|
|
20
|
+
export type ApiIndex = {
|
|
21
|
+
docName: string;
|
|
22
|
+
spec: SpecVersion;
|
|
23
|
+
docDescription?: string;
|
|
24
|
+
structure: ApiIndexNode[];
|
|
25
|
+
};
|
|
26
|
+
export declare function buildApiIndex(analysis: ApiAnalysis, options: {
|
|
27
|
+
specVersion: SpecVersion;
|
|
28
|
+
cwd: string;
|
|
29
|
+
groupBy: IndexGroupBy;
|
|
30
|
+
}): ApiIndex;
|
|
31
|
+
export declare function toRelativePath(absoluteRef: string, cwd: string): string;
|
|
32
|
+
export declare function toFileRange(location: Location, cwd: string): {
|
|
33
|
+
pointer: string;
|
|
34
|
+
file: string;
|
|
35
|
+
start_line: number;
|
|
36
|
+
end_line: number;
|
|
37
|
+
};
|
|
38
|
+
export declare function truncateSummary(text: string | undefined): string | undefined;
|
|
39
|
+
//# sourceMappingURL=build-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-index.d.ts","sourceRoot":"","sources":["../../src/api-graph/build-index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAiB,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,KAAK,EACV,WAAW,EAIZ,MAAM,kBAAkB,CAAC;AAE1B,eAAO,MAAM,aAAa,MAAM,CAAC;AAGjC,qEAAqE;AACrE,eAAO,MAAM,kBAAkB,EAAE,SAAS,MAAM,EAU/C,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,CAAC;AAE5C,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,WAAW,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,YAAY,EAAE,CAAC;CAC3B,CAAC;AAEF,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE;IAAE,WAAW,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,GACxE,QAAQ,CAmEV;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIvE;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM;;;;;EAa1D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAQ5E"}
|