@redocly/cli 2.28.1 → 2.29.1

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 (53) hide show
  1. package/lib/commands/score/collect-metrics.d.ts +17 -0
  2. package/lib/commands/score/collect-metrics.d.ts.map +1 -0
  3. package/lib/commands/score/collect-metrics.js +195 -0
  4. package/lib/commands/score/collect-metrics.js.map +1 -0
  5. package/lib/commands/score/collectors/dependency-graph.d.ts +9 -0
  6. package/lib/commands/score/collectors/dependency-graph.d.ts.map +1 -0
  7. package/lib/commands/score/collectors/dependency-graph.js +61 -0
  8. package/lib/commands/score/collectors/dependency-graph.js.map +1 -0
  9. package/lib/commands/score/collectors/document-metrics.d.ts +69 -0
  10. package/lib/commands/score/collectors/document-metrics.d.ts.map +1 -0
  11. package/lib/commands/score/collectors/document-metrics.js +343 -0
  12. package/lib/commands/score/collectors/document-metrics.js.map +1 -0
  13. package/lib/commands/score/constants.d.ts +4 -0
  14. package/lib/commands/score/constants.d.ts.map +1 -0
  15. package/lib/commands/score/constants.js +47 -0
  16. package/lib/commands/score/constants.js.map +1 -0
  17. package/lib/commands/score/formatters/json.d.ts +3 -0
  18. package/lib/commands/score/formatters/json.d.ts.map +1 -0
  19. package/lib/commands/score/formatters/json.js +20 -0
  20. package/lib/commands/score/formatters/json.js.map +1 -0
  21. package/lib/commands/score/formatters/stylish.d.ts +4 -0
  22. package/lib/commands/score/formatters/stylish.d.ts.map +1 -0
  23. package/lib/commands/score/formatters/stylish.js +235 -0
  24. package/lib/commands/score/formatters/stylish.js.map +1 -0
  25. package/lib/commands/score/hotspots.d.ts +3 -0
  26. package/lib/commands/score/hotspots.d.ts.map +1 -0
  27. package/lib/commands/score/hotspots.js +70 -0
  28. package/lib/commands/score/hotspots.js.map +1 -0
  29. package/lib/commands/score/index.d.ts +11 -0
  30. package/lib/commands/score/index.d.ts.map +1 -0
  31. package/lib/commands/score/index.js +69 -0
  32. package/lib/commands/score/index.js.map +1 -0
  33. package/lib/commands/score/scoring.d.ts +14 -0
  34. package/lib/commands/score/scoring.d.ts.map +1 -0
  35. package/lib/commands/score/scoring.js +136 -0
  36. package/lib/commands/score/scoring.js.map +1 -0
  37. package/lib/commands/score/types.d.ts +119 -0
  38. package/lib/commands/score/types.d.ts.map +1 -0
  39. package/lib/commands/score/types.js +2 -0
  40. package/lib/commands/score/types.js.map +1 -0
  41. package/lib/commands/score/utils.d.ts +2 -0
  42. package/lib/commands/score/utils.d.ts.map +1 -0
  43. package/lib/commands/score/utils.js +8 -0
  44. package/lib/commands/score/utils.js.map +1 -0
  45. package/lib/index.js +28 -0
  46. package/lib/index.js.map +1 -1
  47. package/lib/reunite/api/api-client.js +2 -2
  48. package/lib/reunite/api/api-client.js.map +1 -1
  49. package/lib/utils/constants.d.ts +1 -0
  50. package/lib/utils/constants.d.ts.map +1 -1
  51. package/lib/utils/constants.js +1 -0
  52. package/lib/utils/constants.js.map +1 -1
  53. package/package.json +3 -3
@@ -0,0 +1,17 @@
1
+ import { type normalizeTypes, type resolveDocument, type Document, type WalkContext } from '@redocly/openapi-core';
2
+ import type { DebugMediaTypeLog, DocumentMetrics, ScoringConstants } from './types.js';
3
+ export interface CollectMetricsOptions {
4
+ document: Document;
5
+ types: ReturnType<typeof normalizeTypes>;
6
+ resolvedRefMap: ReturnType<typeof resolveDocument> extends Promise<infer R> ? R : never;
7
+ ctx: WalkContext;
8
+ debugOperationId?: string;
9
+ /** When set, must match the constants passed into scoring for this run (e.g. anyOf penalty). */
10
+ scoringConstants?: ScoringConstants;
11
+ }
12
+ export interface CollectMetricsResult {
13
+ metrics: DocumentMetrics;
14
+ debugLogs: DebugMediaTypeLog[];
15
+ }
16
+ export declare function collectMetrics({ document, types, resolvedRefMap, ctx, debugOperationId, scoringConstants, }: CollectMetricsOptions): CollectMetricsResult;
17
+ //# sourceMappingURL=collect-metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect-metrics.d.ts","sourceRoot":"","sources":["../../../src/commands/score/collect-metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EAGnB,KAAK,eAAe,EAKpB,KAAK,QAAQ,EACb,KAAK,WAAW,EACjB,MAAM,uBAAuB,CAAC;AAW/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAe,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAWpG,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;IACzC,cAAc,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACxF,GAAG,EAAE,WAAW,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gGAAgG;IAChG,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,eAAe,CAAC;IACzB,SAAS,EAAE,iBAAiB,EAAE,CAAC;CAChC;AAED,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,KAAK,EACL,cAAc,EACd,GAAG,EACH,gBAAgB,EAChB,gBAAgB,GACjB,EAAE,qBAAqB,GAAG,oBAAoB,CAwN9C"}
@@ -0,0 +1,195 @@
1
+ import { normalizeVisitors, walkDocument, isPlainObject, isRef, isMappingRef, unescapePointerFragment, } from '@redocly/openapi-core';
2
+ import { createScoreAccumulator, createScoreVisitor, createSchemaWalkState, resetSchemaWalkState, createSchemaMetricVisitor, getDocumentMetrics, } from './collectors/document-metrics.js';
3
+ import { DEFAULT_SCORING_CONSTANTS } from './constants.js';
4
+ function resolveJsonPointer(root, ref) {
5
+ if (!ref.startsWith('#/'))
6
+ return undefined;
7
+ let node = root;
8
+ for (const segment of ref.slice(2).split('/')) {
9
+ node = node?.[unescapePointerFragment(segment)];
10
+ }
11
+ return node;
12
+ }
13
+ export function collectMetrics({ document, types, resolvedRefMap, ctx, debugOperationId, scoringConstants, }) {
14
+ const anyOfPenaltyMultiplier = scoringConstants?.weights.anyOfPenaltyMultiplier ??
15
+ DEFAULT_SCORING_CONSTANTS.weights.anyOfPenaltyMultiplier;
16
+ const schemaWalkState = createSchemaWalkState();
17
+ const schemaVisitor = createSchemaMetricVisitor(schemaWalkState);
18
+ const normalizedSchemaVisitors = normalizeVisitors([{ severity: 'warn', ruleId: 'score-schema', visitor: schemaVisitor }], types);
19
+ const walkSchemaRaw = (schemaNode, debug) => {
20
+ resetSchemaWalkState(schemaWalkState);
21
+ if (debug)
22
+ schemaWalkState.debugEntries = [];
23
+ walkDocument({
24
+ document: { ...document, parsed: schemaNode },
25
+ rootType: types.Schema,
26
+ normalizedVisitors: normalizedSchemaVisitors,
27
+ resolvedRefMap,
28
+ ctx,
29
+ });
30
+ const { depth: _, pendingRef: __, debugEntries: _debug, ...stats } = schemaWalkState;
31
+ return {
32
+ ...stats,
33
+ refsUsed: [...schemaWalkState.refsUsed],
34
+ debugEntries: debug ? (schemaWalkState.debugEntries ?? undefined) : undefined,
35
+ };
36
+ };
37
+ const schemaCache = new Map();
38
+ const computing = new WeakSet();
39
+ const emptyStats = {
40
+ maxDepth: 0,
41
+ polymorphismCount: 0,
42
+ anyOfCount: 0,
43
+ hasDiscriminator: false,
44
+ totalSchemaProperties: 0,
45
+ schemaPropertiesWithDescription: 0,
46
+ constraintCount: 0,
47
+ hasPropertyExamples: false,
48
+ writableTopLevelFields: 0,
49
+ refsUsed: [],
50
+ };
51
+ function addStats(a, b) {
52
+ return {
53
+ maxDepth: Math.max(a.maxDepth, b.maxDepth),
54
+ polymorphismCount: a.polymorphismCount + b.polymorphismCount,
55
+ anyOfCount: a.anyOfCount + b.anyOfCount,
56
+ hasDiscriminator: a.hasDiscriminator || b.hasDiscriminator,
57
+ totalSchemaProperties: a.totalSchemaProperties + b.totalSchemaProperties,
58
+ schemaPropertiesWithDescription: a.schemaPropertiesWithDescription + b.schemaPropertiesWithDescription,
59
+ constraintCount: a.constraintCount + b.constraintCount,
60
+ hasPropertyExamples: a.hasPropertyExamples || b.hasPropertyExamples,
61
+ writableTopLevelFields: a.writableTopLevelFields + b.writableTopLevelFields,
62
+ refsUsed: [...a.refsUsed, ...b.refsUsed],
63
+ debugEntries: a.debugEntries || b.debugEntries
64
+ ? [...(a.debugEntries ?? []), ...(b.debugEntries ?? [])]
65
+ : undefined,
66
+ };
67
+ }
68
+ const walkSchema = (schemaNode, debug = false) => {
69
+ let resolved = schemaNode;
70
+ const ref = isRef(schemaNode) ? schemaNode.$ref : undefined;
71
+ if (ref) {
72
+ if (!debug) {
73
+ const cached = schemaCache.get(ref);
74
+ if (cached)
75
+ return cached;
76
+ }
77
+ resolved = resolveJsonPointer(document.parsed, ref) ?? schemaNode;
78
+ }
79
+ if (isPlainObject(resolved) && computing.has(resolved)) {
80
+ return { ...emptyStats };
81
+ }
82
+ if (isPlainObject(resolved)) {
83
+ computing.add(resolved);
84
+ }
85
+ const oneOfBranches = resolved?.oneOf;
86
+ const anyOfBranches = resolved?.anyOf;
87
+ const hasOneOfPoly = Array.isArray(oneOfBranches) && oneOfBranches.length > 1;
88
+ const hasAnyOfPoly = Array.isArray(anyOfBranches) && anyOfBranches.length > 1;
89
+ /** True when we peel off multi-branch oneOf/anyOf for max-branch walks (may be both). */
90
+ const hasPolyComposition = hasOneOfPoly || hasAnyOfPoly;
91
+ const hasAllOf = Array.isArray(resolved?.allOf) && resolved.allOf.length > 0;
92
+ const disc = resolved?.discriminator;
93
+ const discriminatorRefs = !hasPolyComposition && isPlainObject(disc?.mapping)
94
+ ? Object.values(disc.mapping)
95
+ .filter((v) => typeof v === 'string' && isMappingRef(v))
96
+ .map((v) => ({ $ref: v }))
97
+ : null;
98
+ const hasDiscriminatorBranches = Array.isArray(discriminatorRefs) && discriminatorRefs.length > 0;
99
+ let result;
100
+ if (hasPolyComposition || hasAllOf || hasDiscriminatorBranches) {
101
+ const parentOnly = { ...resolved };
102
+ let polyStats = null;
103
+ const mergePolyPart = (part) => {
104
+ polyStats = polyStats ? addStats(polyStats, part) : part;
105
+ };
106
+ const maxBranchPolyStats = (polyKeyword, polyBranches) => {
107
+ let maxBranch = walkSchema(polyBranches[0], debug);
108
+ for (let i = 1; i < polyBranches.length; i++) {
109
+ const branchStats = walkSchema(polyBranches[i], debug);
110
+ if (branchStats.totalSchemaProperties > maxBranch.totalSchemaProperties) {
111
+ maxBranch = branchStats;
112
+ }
113
+ }
114
+ return {
115
+ ...maxBranch,
116
+ polymorphismCount: maxBranch.polymorphismCount + polyBranches.length,
117
+ anyOfCount: maxBranch.anyOfCount + (polyKeyword === 'anyOf' ? polyBranches.length : 0),
118
+ hasDiscriminator: maxBranch.hasDiscriminator || !!disc,
119
+ };
120
+ };
121
+ if (hasPolyComposition) {
122
+ delete parentOnly.discriminator;
123
+ }
124
+ if (hasOneOfPoly) {
125
+ delete parentOnly.oneOf;
126
+ mergePolyPart(maxBranchPolyStats('oneOf', oneOfBranches));
127
+ }
128
+ if (hasAnyOfPoly) {
129
+ delete parentOnly.anyOf;
130
+ mergePolyPart(maxBranchPolyStats('anyOf', anyOfBranches));
131
+ }
132
+ let discStats = null;
133
+ if (hasDiscriminatorBranches) {
134
+ delete parentOnly.discriminator;
135
+ let maxBranch = walkSchema(discriminatorRefs[0], debug);
136
+ for (let i = 1; i < discriminatorRefs.length; i++) {
137
+ const branchStats = walkSchema(discriminatorRefs[i], debug);
138
+ if (branchStats.totalSchemaProperties > maxBranch.totalSchemaProperties) {
139
+ maxBranch = branchStats;
140
+ }
141
+ }
142
+ discStats = {
143
+ ...maxBranch,
144
+ polymorphismCount: maxBranch.polymorphismCount + discriminatorRefs.length,
145
+ hasDiscriminator: true,
146
+ };
147
+ }
148
+ let allOfStats = null;
149
+ if (hasAllOf) {
150
+ delete parentOnly.allOf;
151
+ allOfStats = { ...emptyStats };
152
+ for (const member of resolved.allOf) {
153
+ allOfStats = addStats(allOfStats, walkSchema(member, debug));
154
+ }
155
+ allOfStats.polymorphismCount += resolved.allOf.length;
156
+ }
157
+ const parentStats = walkSchemaRaw(parentOnly, debug);
158
+ result = parentStats;
159
+ if (allOfStats)
160
+ result = addStats(result, allOfStats);
161
+ if (polyStats)
162
+ result = addStats(result, polyStats);
163
+ if (discStats)
164
+ result = addStats(result, discStats);
165
+ if (ref) {
166
+ result = { ...result, refsUsed: [ref, ...result.refsUsed] };
167
+ }
168
+ }
169
+ else {
170
+ result = walkSchemaRaw(schemaNode, debug);
171
+ }
172
+ if (isPlainObject(resolved)) {
173
+ computing.delete(resolved);
174
+ }
175
+ if (ref && !debug) {
176
+ schemaCache.set(ref, result);
177
+ }
178
+ return result;
179
+ };
180
+ const accumulator = createScoreAccumulator(walkSchema, anyOfPenaltyMultiplier, debugOperationId);
181
+ const scoreVisitor = createScoreVisitor(accumulator);
182
+ const normalizedVisitors = normalizeVisitors([{ severity: 'warn', ruleId: 'score', visitor: scoreVisitor }], types);
183
+ walkDocument({
184
+ document,
185
+ rootType: types.Root,
186
+ normalizedVisitors,
187
+ resolvedRefMap,
188
+ ctx,
189
+ });
190
+ return {
191
+ metrics: getDocumentMetrics(accumulator),
192
+ debugLogs: accumulator.debugLogs,
193
+ };
194
+ }
195
+ //# sourceMappingURL=collect-metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect-metrics.js","sourceRoot":"","sources":["../../../src/commands/score/collect-metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { OperationMetrics } from '../types.js';
2
+ /**
3
+ * Builds a dependency graph from shared $ref usage across operations.
4
+ * An edge from A to B means both A and B reference the same schema $ref.
5
+ * The depth for each operation is the longest path from a root node (no incoming edges)
6
+ * in the undirected "shared ref" graph.
7
+ */
8
+ export declare function computeDependencyDepths(operations: Map<string, OperationMetrics>): Map<string, number>;
9
+ //# sourceMappingURL=dependency-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-graph.d.ts","sourceRoot":"","sources":["../../../../src/commands/score/collectors/dependency-graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,GACxC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAsCrB"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Builds a dependency graph from shared $ref usage across operations.
3
+ * An edge from A to B means both A and B reference the same schema $ref.
4
+ * The depth for each operation is the longest path from a root node (no incoming edges)
5
+ * in the undirected "shared ref" graph.
6
+ */
7
+ export function computeDependencyDepths(operations) {
8
+ const refToOps = new Map();
9
+ for (const [opKey, metrics] of operations) {
10
+ for (const ref of metrics.refsUsed) {
11
+ let ops = refToOps.get(ref);
12
+ if (!ops) {
13
+ ops = new Set();
14
+ refToOps.set(ref, ops);
15
+ }
16
+ ops.add(opKey);
17
+ }
18
+ }
19
+ const adjacency = new Map();
20
+ for (const opKey of operations.keys()) {
21
+ adjacency.set(opKey, new Set());
22
+ }
23
+ for (const ops of refToOps.values()) {
24
+ if (ops.size < 2)
25
+ continue;
26
+ const opArray = Array.from(ops);
27
+ for (let i = 0; i < opArray.length; i++) {
28
+ for (let j = i + 1; j < opArray.length; j++) {
29
+ adjacency.get(opArray[i]).add(opArray[j]);
30
+ adjacency.get(opArray[j]).add(opArray[i]);
31
+ }
32
+ }
33
+ }
34
+ const depths = new Map();
35
+ for (const opKey of operations.keys()) {
36
+ const depth = computeLongestBfsPath(opKey, adjacency);
37
+ depths.set(opKey, depth);
38
+ }
39
+ return depths;
40
+ }
41
+ function computeLongestBfsPath(start, adjacency) {
42
+ const visited = new Set([start]);
43
+ let queue = [start];
44
+ let depth = 0;
45
+ while (queue.length > 0) {
46
+ const next = [];
47
+ for (const node of queue) {
48
+ for (const neighbor of adjacency.get(node) ?? []) {
49
+ if (!visited.has(neighbor)) {
50
+ visited.add(neighbor);
51
+ next.push(neighbor);
52
+ }
53
+ }
54
+ }
55
+ if (next.length > 0)
56
+ depth++;
57
+ queue = next;
58
+ }
59
+ return depth;
60
+ }
61
+ //# sourceMappingURL=dependency-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-graph.js","sourceRoot":"","sources":["../../../../src/commands/score/collectors/dependency-graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import { type Oas3Visitor, type Oas3Parameter, type Oas3Schema, type Oas3_1Schema, type Referenced } from '@redocly/openapi-core';
2
+ import type { DebugMediaTypeLog, DebugSchemaEntry, DocumentMetrics, OperationMetrics, SchemaStats } from '../types.js';
3
+ type Schema = Oas3Schema | Oas3_1Schema;
4
+ type Param = Oas3Parameter<Schema>;
5
+ export interface SchemaWalkState {
6
+ depth: number;
7
+ maxDepth: number;
8
+ polymorphismCount: number;
9
+ anyOfCount: number;
10
+ hasDiscriminator: boolean;
11
+ totalSchemaProperties: number;
12
+ schemaPropertiesWithDescription: number;
13
+ constraintCount: number;
14
+ hasPropertyExamples: boolean;
15
+ writableTopLevelFields: number;
16
+ refsUsed: string[];
17
+ debugEntries: DebugSchemaEntry[] | null;
18
+ pendingRef: string | null;
19
+ }
20
+ export declare function createSchemaWalkState(): SchemaWalkState;
21
+ export declare function resetSchemaWalkState(s: SchemaWalkState): void;
22
+ export declare function createSchemaMetricVisitor(state: SchemaWalkState): Oas3Visitor;
23
+ interface CurrentOperationContext {
24
+ path: string;
25
+ method: string;
26
+ operationId?: string;
27
+ operationDescriptionPresent: boolean;
28
+ parameterCount: number;
29
+ requiredParameterCount: number;
30
+ paramsWithDescription: number;
31
+ ambiguousIdentifierCount: number;
32
+ maxRequestSchemaDepth: number;
33
+ maxResponseSchemaDepth: number;
34
+ totalSchemaProperties: number;
35
+ schemaPropertiesWithDescription: number;
36
+ constraintCount: number;
37
+ polymorphismCount: number;
38
+ anyOfCount: number;
39
+ hasDiscriminator: boolean;
40
+ topLevelWritableFieldCount: number;
41
+ requestBodyPresent: boolean;
42
+ requestExamplePresent: boolean;
43
+ responseExamplePresent: boolean;
44
+ structuredErrorResponseCount: number;
45
+ totalErrorResponses: number;
46
+ inRequestBody: boolean;
47
+ inResponse: boolean;
48
+ currentResponseCode: string;
49
+ errorStructuredCounted: boolean;
50
+ /** Internal: best schema walk for polymorphism + anyOf (see `effectivePolymorphismFromCounts`). */
51
+ maxEffectivePolymorphism: number;
52
+ refsUsed: Set<string>;
53
+ }
54
+ export interface ScoreAccumulator {
55
+ operations: Map<string, OperationMetrics>;
56
+ currentPath: string;
57
+ pathLevelParams: Array<Referenced<Param>>;
58
+ current: CurrentOperationContext | null;
59
+ walkSchema: (schema: any, debug?: boolean) => SchemaStats;
60
+ /** Must match scoring `weights.anyOfPenaltyMultiplier` for this run. */
61
+ anyOfPenaltyMultiplier: number;
62
+ debugOperationId?: string;
63
+ debugLogs: DebugMediaTypeLog[];
64
+ }
65
+ export declare function createScoreAccumulator(walkSchema: (schema: any, debug?: boolean) => SchemaStats, anyOfPenaltyMultiplier: number, debugOperationId?: string): ScoreAccumulator;
66
+ export declare function createScoreVisitor(accumulator: ScoreAccumulator): Oas3Visitor;
67
+ export declare function getDocumentMetrics(accumulator: ScoreAccumulator): DocumentMetrics;
68
+ export {};
69
+ //# sourceMappingURL=document-metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-metrics.d.ts","sourceRoot":"","sources":["../../../../src/commands/score/collectors/document-metrics.ts"],"names":[],"mappings":"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"}