@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.
Files changed (56) hide show
  1. package/lib/api-graph/build-graph.d.ts +71 -0
  2. package/lib/api-graph/build-graph.d.ts.map +1 -0
  3. package/lib/api-graph/build-graph.js +418 -0
  4. package/lib/api-graph/build-graph.js.map +1 -0
  5. package/lib/api-graph/build-index.d.ts +39 -0
  6. package/lib/api-graph/build-index.d.ts.map +1 -0
  7. package/lib/api-graph/build-index.js +191 -0
  8. package/lib/api-graph/build-index.js.map +1 -0
  9. package/lib/api-graph/file-view.d.ts +27 -0
  10. package/lib/api-graph/file-view.d.ts.map +1 -0
  11. package/lib/api-graph/file-view.js +51 -0
  12. package/lib/api-graph/file-view.js.map +1 -0
  13. package/lib/api-graph/find.d.ts +20 -0
  14. package/lib/api-graph/find.d.ts.map +1 -0
  15. package/lib/api-graph/find.js +75 -0
  16. package/lib/api-graph/find.js.map +1 -0
  17. package/lib/api-graph/node-id.d.ts +28 -0
  18. package/lib/api-graph/node-id.d.ts.map +1 -0
  19. package/lib/api-graph/node-id.js +100 -0
  20. package/lib/api-graph/node-id.js.map +1 -0
  21. package/lib/api-graph/pointer.d.ts +86 -0
  22. package/lib/api-graph/pointer.d.ts.map +1 -0
  23. package/lib/api-graph/pointer.js +213 -0
  24. package/lib/api-graph/pointer.js.map +1 -0
  25. package/lib/api-graph/select.d.ts +15 -0
  26. package/lib/api-graph/select.d.ts.map +1 -0
  27. package/lib/api-graph/select.js +71 -0
  28. package/lib/api-graph/select.js.map +1 -0
  29. package/lib/api-graph/slice.d.ts +54 -0
  30. package/lib/api-graph/slice.d.ts.map +1 -0
  31. package/lib/api-graph/slice.js +211 -0
  32. package/lib/api-graph/slice.js.map +1 -0
  33. package/lib/api-graph/types.d.ts +26 -0
  34. package/lib/api-graph/types.d.ts.map +1 -0
  35. package/lib/api-graph/types.js +2 -0
  36. package/lib/api-graph/types.js.map +1 -0
  37. package/lib/api-graph/views.d.ts +139 -0
  38. package/lib/api-graph/views.d.ts.map +1 -0
  39. package/lib/api-graph/views.js +348 -0
  40. package/lib/api-graph/views.js.map +1 -0
  41. package/lib/format/codeframes.d.ts +5 -0
  42. package/lib/format/codeframes.d.ts.map +1 -1
  43. package/lib/format/codeframes.js +74 -19
  44. package/lib/format/codeframes.js.map +1 -1
  45. package/lib/index.d.ts +11 -0
  46. package/lib/index.d.ts.map +1 -1
  47. package/lib/index.js +9 -0
  48. package/lib/index.js.map +1 -1
  49. package/lib/resolve.d.ts +6 -0
  50. package/lib/resolve.d.ts.map +1 -1
  51. package/lib/resolve.js +30 -0
  52. package/lib/resolve.js.map +1 -1
  53. package/lib/types/redocly-yaml.d.ts.map +1 -1
  54. package/lib/types/redocly-yaml.js +0 -12
  55. package/lib/types/redocly-yaml.js.map +1 -1
  56. 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":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAwB,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,cAAc,EACpB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAc5D,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAa,MAAM,YAAY,CAAC;AAExE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,QAAQ,CAAC;IACnB,gBAAgB,EAAE,QAAQ,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,QAAQ,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAA;KAAE,CAAC;IACpE,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAA;KAAE,CAAC;IACjD,YAAY,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAA;KAAE,EAAE,CAAC;IAC3E,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC,aAAa,CAAC,EAAE,QAAQ,CAAC;IACzB,gBAAgB,CAAC,EAAE,QAAQ,CAAC;IAC5B,kBAAkB,CAAC,EAAE,QAAQ,CAAC;CAC/B,CAAC;AAEF,gHAAgH;AAChH,wBAAgB,cAAc,CAAC,SAAS,EAAE,kBAAkB,GAAG,MAAM,CAEpE;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,eAAe,CAAC;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,QAAQ,CAAC;CACxB,CAAC;AAEF,wBAAsB,UAAU,CAAC,OAAO,EAAE;IACxC,YAAY,EAAE,QAAQ,CAAC;IACvB,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC1C,mBAAmB,EAAE,YAAY,CAAC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CACnD,GAAG,OAAO,CAAC,WAAW,CAAC,CAqBvB;AAkYD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,SAAS,EAAE,EAClB,EAAE,OAAe,EAAE,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAC9C,GAAG,CAAC,MAAM,CAAC,CAsBb;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAiCjG"}
@@ -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":"AACA,OAAO,EAAE,aAAa,EAAE,KAAK,EAAiB,MAAM,iBAAiB,CAAC;AACtE,OAAO,EACL,eAAe,GAIhB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAoB,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAsC,MAAM,YAAY,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,QAAQ,GAET,MAAM,cAAc,CAAC;AAmCtB,gHAAgH;AAChH,MAAM,UAAU,cAAc,CAAC,SAA6B;IAC1D,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;AACnF,CAAC;AASD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAOhC;IACC,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,mBAAmB,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAE3F,MAAM,cAAc,GAAG,MAAM,eAAe,CAAC;QAC3C,YAAY;QACZ,QAAQ,EAAE,KAAK,CAAC,IAAI;QACpB,mBAAmB;KACpB,CAAC,CAAC;IAEH,MAAM,GAAG,GAAgB,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IAEzE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC;QACpC,QAAQ,EAAE,YAAY;QACtB,KAAK;QACL,cAAc;QACd,GAAG;QACH,GAAG;QACH,UAAU;KACX,CAAC,CAAC;IAEH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC;AACvD,CAAC;AAED,SAAS,aAAa,CAAC,OAOtB;IACC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAE1E,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC;IAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAEtC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC3C,MAAM,IAAI,GAAiB,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAEhF,2FAA2F;IAC3F,8FAA8F;IAC9F,8FAA8F;IAC9F,gEAAgE;IAChE,MAAM,EAAE,WAAW,EAAE,kBAAkB,EAAE,GAAG,2BAA2B,CACrE,QAAQ,CAAC,MAAM,EACf,OAAO,EACP,UAAU,CACX,CAAC;IAEF,MAAM,eAAe,GAAG,CAAC,MAAqC,EAAE,QAAiB,EAAE,EAAE;QACnF,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QACxE,IAAI,QAAQ;YAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACnC,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACnD,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAU,EAAE,SAAkB,EAAE,EAAE;QAC/D,MAAM,OAAO,GAAG,GAAG,IAAI,OAAO,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QAC1D,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9D,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5B,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,WAAmB,EAAE,OAAe,EAAiC,EAAE;QACxF,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;YAC5B,OAAO,EAAE,GAAG,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC9D,CAAC;QACD,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC3C,qFAAqF;QACrF,+DAA+D;QAC/D,IAAI,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAClD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACxD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,QAAkB,EAAU,EAAE;QAC7C,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;QACxE,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC9B,UAAU,CAAC,MAAM,CAAC,CAAC;QACnB,OAAO,MAAM,CAAC,EAAE,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,MAAkB,EAAE,EAAE;QACxC,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS;YAAE,OAAO;QAC1C,IAAI,QAAQ,GAAG,MAAM,CAAC;QACtB,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACzC,oFAAoF;YACpF,6EAA6E;YAC7E,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,IAAI,IAAI,MAAM,CAAC;YAC3D,eAAe,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,IAAI,CAAC,CAAC;YAC5E,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAC9B,QAAQ,GAAG,UAAU,CAAC;QACxB,CAAC;QACD,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,CAAC,YAAsB,EAAE,SAAiB,EAAU,EAAE;QAC/E,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC;QAEjD,IAAI,MAAqC,CAAC;QAC1C,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;YACf,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;YACxD,MAAM;gBACJ,QAAQ,KAAK,SAAS;oBACpB,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,GAAG,GAAG,QAAQ,CAAC;oBAC5C,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACnD,CAAC;QAED,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC/B,OAAO,MAAM,CAAC,EAAE,CAAC;IACnB,CAAC,CAAC;IAEF,mFAAmF;IACnF,0FAA0F;IAC1F,2FAA2F;IAC3F,0FAA0F;IAC1F,oFAAoF;IACpF,IAAI,mBAA4B,CAAC;IACjC,IAAI,0BAAgD,CAAC;IAErD,2FAA2F;IAC3F,sFAAsF;IACtF,4FAA4F;IAC5F,qFAAqF;IACrF,2FAA2F;IAC3F,yFAAyF;IACzF,2FAA2F;IAC3F,+EAA+E;IAC/E,oFAAoF;IACpF,IAAI,oBAA6B,CAAC;IAClC,IAAI,sBAA0C,CAAC;IAC/C,IAAI,uBAA2C,CAAC;IAEhD,IAAI,0BAAmC,CAAC;IACxC,IAAI,iBAAqC,CAAC;IAC1C,IAAI,8BAAoD,CAAC;IAEzD,MAAM,YAAY,GAChB,CAAC,OAAe,EAAE,EAAE,CACpB,CAAC,IAA6B,EAAE,YAAuD,EAAE,EAAE;QACzF,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;YACzB,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC;gBACzB,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC;gBAC7B,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACnE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAAE,SAAS;YAC/B,kFAAkF;YAClF,MAAM,WAAW,GAAI,MAAM,CAAC,IAA6C,EAAE,WAAW,CAAC;YACvF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC,CAAC;IAEJ,qFAAqF;IACrF,MAAM,sBAAsB,GAAG,MAAM,CAAC,WAAW,CAC/C,kBAAkB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAClC,QAAQ,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QACrD,YAAY,CAAC,OAAO,CAAC;KACtB,CAAC,CACH,CAAC;IAEF,0EAA0E;IAC1E,mEAAmE;IACnE,MAAM,OAAO,GAAG;QACd,GAAG,sBAAsB;QACzB,IAAI,CAAC,IAAI,EAAE,IAAI;YACb,IAAI,CAAC,IAAI,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5F,CAAC;QACD,mFAAmF;QACnF,mFAAmF;QACnF,UAAU,CAAC,IAAwB,EAAE,IAAI;YACvC,wFAAwF;YACxF,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,KAAK,WAAW;gBAAE,OAAO;YACrD,IAAI,CAAC,OAAO,GAAG;gBACb,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAiB,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBACnF,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC;QACJ,CAAC;QACD,GAAG,CAAC,IAAI,EAAE,IAAI;YACZ,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;gBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC,CAAC;QACL,CAAC;QACD,KAAK,EAAE;YACL,KAAK,CAAC,KAAK,EAAE,IAAI;gBACf,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,QAAQ,CAAC;YACvC,CAAC;SACF;QACD,WAAW,EAAE;YACX,KAAK,CAAC,KAAK,EAAE,IAAI;gBACf,IAAI,CAAC,gBAAgB,KAAK,IAAI,CAAC,QAAQ,CAAC;YAC1C,CAAC;SACF;QACD,UAAU,EAAE;YACV,KAAK,CAAC,KAAK,EAAE,IAAI;gBACf,IAAI,CAAC,kBAAkB,KAAK,IAAI,CAAC,QAAQ,CAAC;YAC5C,CAAC;SACF;QACD,QAAQ,EAAE;YACR,KAAK,CAAC,IAAI,EAAE,IAAI;gBACd,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,KAAK,OAAO;oBAAE,OAAO;gBAC5D,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAChE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;oBACrD,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;oBAC9C,KAAK,CAAC,GAAG,CAAC,WAAW,CAAE,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;oBAC/E,mBAAmB,GAAG,IAAI,CAAC;oBAC3B,0BAA0B,GAAG,IAAI,CAAC,WAAW,CAAC;gBAChD,CAAC;gBACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC;oBACxD,0BAA0B,GAAG,IAAI,CAAC;oBAClC,iBAAiB,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;oBAChC,8BAA8B,GAAG,IAAI,CAAC,QAAQ,CAAC;gBACjD,CAAC;YACH,CAAC;SACF;QACD,SAAS,EAAE;YACT,KAAK,CAAC,IAAI,EAAE,IAAI;gBACd,IACE,0BAA0B,KAAK,SAAS;oBACxC,IAAI,CAAC,MAAM,KAAK,0BAA0B,EAC1C,CAAC;oBACD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAChC,IAAI,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;wBAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;4BACnB,EAAE,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,iBAAiB,EAAE;4BAClD,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE;4BAC5B,YAAY,EAAE,iBAAkB;4BAChC,SAAS,EAAE,IAAI;4BACf,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;4BACrB,OAAO,EAAE,IAAI,CAAC,OAAO;4BACrB,WAAW,EAAE,IAAI,CAAC,WAAW;4BAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;4BAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;4BAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;4BACvB,gBAAgB,EAAE,8BAA+B;yBAClD,CAAC,CAAC;oBACL,CAAC;oBACD,OAAO;gBACT,CAAC;gBACD,IAAI,0BAA0B,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,mBAAmB,EAAE,CAAC;oBACpF,OAAO;gBACT,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAChC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC;oBAAE,OAAO;gBAE3C,MAAM,eAAe,GAAG,OAAO,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC5E,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;oBACzC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAE,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;gBAC7D,CAAC;gBACD,KAAK,CAAC,GAAG,CAAC,eAAe,CAAE,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;gBAEnF,oBAAoB,GAAG,IAAI,CAAC;gBAC5B,sBAAsB,GAAG,eAAe,CAAC;gBACzC,uBAAuB,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC;gBAE3D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;oBACnB,EAAE,EAAE,eAAe;oBACnB,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE;oBAC5B,YAAY,EAAE,oBAAoB,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBACzE,SAAS,EAAE,KAAK;oBAChB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;oBACrB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,gBAAgB,EAAE,0BAA0B;iBAC7C,CAAC,CAAC;YACL,CAAC;YACD,KAAK,CAAC,IAAI;gBACR,IAAI,IAAI,KAAK,oBAAoB,EAAE,CAAC;oBAClC,oBAAoB,GAAG,SAAS,CAAC;oBACjC,sBAAsB,GAAG,SAAS,CAAC;oBACnC,uBAAuB,GAAG,SAAS,CAAC;gBACtC,CAAC;YACH,CAAC;SACF;QACD,GAAG,EAAE;YACH,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ;gBAC3B,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;oBACjD,IAAI,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;wBAAE,OAAO;oBAC1D,iFAAiF;oBACjF,sFAAsF;oBACtF,kFAAkF;oBAClF,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;oBAC7D,IACE,QAAQ,CAAC,MAAM,KAAK,CAAC;wBACrB,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC;wBACvD,QAAQ,CAAC,IAAI,KAAK,SAAS;wBAC3B,QAAQ,CAAC,QAAQ,EACjB,CAAC;wBACD,OAAO;oBACT,CAAC;gBACH,CAAC;gBACD,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACvF,MAAM,OAAO,GACX,sBAAsB,KAAK,SAAS;oBACpC,WAAW,CAAC,IAAI,KAAK,MAAM;oBAC3B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,KAAK,uBAAuB;oBAC1D,CAAC,CAAC,sBAAsB;oBACxB,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACvC,sFAAsF;gBACtF,oFAAoF;gBACpF,mFAAmF;gBACnF,MAAM,QAAQ,GACZ,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,QAAQ;oBAC9C,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;oBAC5B,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;gBACnD,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YACxC,CAAC;SACF;KACa,CAAC;IAEjB,eAAe,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,CAAC;IAClE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,IAAI,GAAG,IAAI,CAAC;IAE/B,MAAM,kBAAkB,GAAG,iBAAiB,CAC1C,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAC/C,KAAK,CACN,CAAC;IACF,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,kBAAkB,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;IAE1F,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;AAC9D,CAAC;AAED,MAAM,mBAAmB,GAAG,CAAC,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,qBAAqB,CAAC,CAAC;AAE9F,qGAAqG;AACrG,SAAS,2BAA2B,CAClC,MAAe,EACf,OAAe,EACf,UAAiD;IAEjD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC7C,MAAM,IAAI,GAAG,MAA6E,CAAC;IAE3F,MAAM,cAAc,GAAG,CACrB,OAAgC,EAChC,QAAgB,EAChB,aAAqB,EACrB,EAAE;QACF,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACpD,MAAM,SAAS,GAAI,KAAwC,EAAE,IAAI,CAAC;YAClE,IAAI,OAAO,SAAS,KAAK,QAAQ;gBAAE,SAAS;YAC5C,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7C,sFAAsF;YACtF,mEAAmE;YACnE,IAAI,GAAG,KAAK,EAAE,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ,KAAK,EAAE,CAAC;gBAAE,SAAS;YAC5F,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC;YACjE,kBAAkB,CAAC,GAAG,CAAC,GAAG,aAAa,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,CAAC;IACpC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5D,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;gBAAE,SAAS;YACtC,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,gBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,mBAAmB,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;YAAE,SAAS;QACtC,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;AAC7C,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACtD,CAAC;AAED,0EAA0E;AAC1E,SAAS,aAAa,CACpB,MAAc,EACd,OAA+B,EAC/B,OAA+B;IAE/B,MAAM,YAAY,GAAG,mBAAmB,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAE1E,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;SAChC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SAC3C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE9C,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;SAChC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SAC1E,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;SACvE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEhF,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,KAAe,EACf,KAAkB,EAClB,EAAE,OAAO,GAAG,KAAK,KAA4B,EAAE;IAE/C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3C,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC7C,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpB,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IACxB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB,EAAE,KAAkB;IACxE,MAAM,WAAW,GAAG,IAAI,GAAG,EAAoB,CAAC;IAChD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACjD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACrD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAC;IACzB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAC/B,KAAK,MAAM,QAAQ,IAAI,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACtD,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,SAAS;YACjC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACnB,kBAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC3C,KAAK,MAAM,MAAM,IAAI,IAAI,EAAE,CAAC;QAC1B,IAAI,MAAM,KAAK,QAAQ;YAAE,SAAS;QAClC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC;QACvB,IAAI,MAAM,GAAG,MAAM,CAAC;QACpB,OAAO,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -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"}