@amartus/oas-utils 0.5.2 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -9
- package/dist/cli.js +19 -2
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/allOfToOneOfInterface.d.ts +36 -0
- package/dist/lib/allOfToOneOfInterface.d.ts.map +1 -0
- package/dist/lib/allOfToOneOfInterface.js +5 -0
- package/dist/lib/allOfToOneOfInterface.js.map +1 -0
- package/dist/lib/allOfToOneOfJsonPath.d.ts +60 -0
- package/dist/lib/allOfToOneOfJsonPath.d.ts.map +1 -0
- package/dist/lib/allOfToOneOfJsonPath.js +539 -0
- package/dist/lib/allOfToOneOfJsonPath.js.map +1 -0
- package/dist/lib/cleanupDiscriminatorMappings.d.ts +14 -2
- package/dist/lib/cleanupDiscriminatorMappings.d.ts.map +1 -1
- package/dist/lib/cleanupDiscriminatorMappings.js +30 -5
- package/dist/lib/cleanupDiscriminatorMappings.js.map +1 -1
- package/dist/lib/cliActions.d.ts +15 -0
- package/dist/lib/cliActions.d.ts.map +1 -1
- package/dist/lib/cliActions.js +32 -2
- package/dist/lib/cliActions.js.map +1 -1
- package/dist/lib/optimizeAllOfComposition.d.ts.map +1 -1
- package/dist/lib/optimizeAllOfComposition.js +1 -9
- package/dist/lib/optimizeAllOfComposition.js.map +1 -1
- package/dist/lib/removeSingleComposition.d.ts +24 -0
- package/dist/lib/removeSingleComposition.d.ts.map +1 -0
- package/dist/lib/removeSingleComposition.js +121 -0
- package/dist/lib/removeSingleComposition.js.map +1 -0
- package/dist/redocly/allof-to-oneof-decorator.js +1 -1
- package/dist/redocly/allof-to-oneof-decorator.js.map +1 -1
- package/dist/redocly/cleanup-discriminator-decorator.d.ts +2 -1
- package/dist/redocly/cleanup-discriminator-decorator.d.ts.map +1 -1
- package/dist/redocly/cleanup-discriminator-decorator.js +5 -2
- package/dist/redocly/cleanup-discriminator-decorator.js.map +1 -1
- package/dist/redocly/plugin.d.ts +3 -0
- package/dist/redocly/plugin.d.ts.map +1 -1
- package/dist/redocly/plugin.js +3 -0
- package/dist/redocly/plugin.js.map +1 -1
- package/dist/redocly/remove-single-composition-decorator.d.ts +6 -0
- package/dist/redocly/remove-single-composition-decorator.d.ts.map +1 -0
- package/dist/redocly/remove-single-composition-decorator.js +14 -0
- package/dist/redocly/remove-single-composition-decorator.js.map +1 -0
- package/package.json +1 -1
- package/dist/lib/allOfToOneOf.d.ts +0 -23
- package/dist/lib/allOfToOneOf.d.ts.map +0 -1
- package/dist/lib/allOfToOneOf.js +0 -413
- package/dist/lib/allOfToOneOf.js.map +0 -1
|
@@ -7,30 +7,53 @@ import { updateDiscriminatorMappings } from "./schemaTransformUtils.js";
|
|
|
7
7
|
* 1. Iterates through all schemas looking for discriminator definitions
|
|
8
8
|
* 2. For each discriminator mapping entry, checks if the referenced schema exists
|
|
9
9
|
* 3. Removes mapping entries that reference undefined schemas
|
|
10
|
-
* 4.
|
|
10
|
+
* 4. Optionally removes entire discriminators from schemas matching specified patterns
|
|
11
|
+
* 5. Returns count of cleaned mappings for reporting
|
|
11
12
|
*
|
|
12
13
|
* @param doc - OpenAPI document to clean
|
|
14
|
+
* @param options - Configuration options for discriminator cleanup
|
|
13
15
|
* @returns Object with cleanup statistics
|
|
14
16
|
*/
|
|
15
|
-
export function cleanupDiscriminatorMappings(doc) {
|
|
17
|
+
export function cleanupDiscriminatorMappings(doc, options) {
|
|
16
18
|
if (!doc || typeof doc !== "object") {
|
|
17
|
-
return { schemasChecked: 0, mappingsRemoved: 0, details: [] };
|
|
19
|
+
return { schemasChecked: 0, mappingsRemoved: 0, discriminatorsRemoved: 0, details: [], removedDiscriminators: [] };
|
|
18
20
|
}
|
|
19
21
|
const schemas = doc.components?.schemas;
|
|
20
22
|
if (!schemas || typeof schemas !== "object") {
|
|
21
|
-
return { schemasChecked: 0, mappingsRemoved: 0, details: [] };
|
|
23
|
+
return { schemasChecked: 0, mappingsRemoved: 0, discriminatorsRemoved: 0, details: [], removedDiscriminators: [] };
|
|
22
24
|
}
|
|
25
|
+
// Helper function to match schema name against glob-style patterns
|
|
26
|
+
const matchesPattern = (schemaName, patterns) => {
|
|
27
|
+
return patterns.some(pattern => {
|
|
28
|
+
const regexPattern = pattern
|
|
29
|
+
.replace(/[.+?^${}()|[\]\\]/g, '\\$&') // Escape special regex chars
|
|
30
|
+
.replace(/\*/g, '.*'); // Convert * to .*
|
|
31
|
+
const regex = new RegExp(`^${regexPattern}$`);
|
|
32
|
+
return regex.test(schemaName);
|
|
33
|
+
});
|
|
34
|
+
};
|
|
23
35
|
// Collect all existing schema names for validation
|
|
24
36
|
const existingSchemas = new Set(Object.keys(schemas));
|
|
25
37
|
let totalMappingsRemoved = 0;
|
|
26
38
|
let schemasChecked = 0;
|
|
39
|
+
let discriminatorsRemoved = 0;
|
|
27
40
|
const details = [];
|
|
41
|
+
const removedDiscriminators = [];
|
|
28
42
|
// Iterate through all schemas
|
|
29
43
|
for (const [schemaName, schema] of Object.entries(schemas)) {
|
|
30
44
|
if (!schema || typeof schema !== "object")
|
|
31
45
|
continue;
|
|
32
|
-
// Check if schema has discriminator
|
|
46
|
+
// Check if schema has discriminator
|
|
33
47
|
if (schema.discriminator && typeof schema.discriminator === "object") {
|
|
48
|
+
// Check if discriminator should be removed based on patterns
|
|
49
|
+
if (options?.removeDiscriminatorPatterns &&
|
|
50
|
+
options.removeDiscriminatorPatterns.length > 0 &&
|
|
51
|
+
matchesPattern(schemaName, options.removeDiscriminatorPatterns)) {
|
|
52
|
+
delete schema.discriminator;
|
|
53
|
+
discriminatorsRemoved++;
|
|
54
|
+
removedDiscriminators.push(schemaName);
|
|
55
|
+
continue; // Skip to next schema since discriminator is removed
|
|
56
|
+
}
|
|
34
57
|
const discriminator = schema.discriminator;
|
|
35
58
|
if (discriminator.mapping && typeof discriminator.mapping === "object") {
|
|
36
59
|
schemasChecked++;
|
|
@@ -58,7 +81,9 @@ export function cleanupDiscriminatorMappings(doc) {
|
|
|
58
81
|
return {
|
|
59
82
|
schemasChecked,
|
|
60
83
|
mappingsRemoved: totalMappingsRemoved,
|
|
84
|
+
discriminatorsRemoved,
|
|
61
85
|
details,
|
|
86
|
+
removedDiscriminators,
|
|
62
87
|
};
|
|
63
88
|
}
|
|
64
89
|
//# sourceMappingURL=cleanupDiscriminatorMappings.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cleanupDiscriminatorMappings.js","sourceRoot":"","sources":["../../src/lib/cleanupDiscriminatorMappings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"cleanupDiscriminatorMappings.js","sourceRoot":"","sources":["../../src/lib/cleanupDiscriminatorMappings.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/cliActions.d.ts
CHANGED
|
@@ -31,6 +31,7 @@ export declare function runAllOfToOneOf(opts: {
|
|
|
31
31
|
output?: string;
|
|
32
32
|
addDiscriminatorConst?: boolean;
|
|
33
33
|
ignoreSingleSpecialization?: boolean;
|
|
34
|
+
mergeNestedOneof?: boolean;
|
|
34
35
|
}, format: (doc: any, target?: string) => string, reader: () => Promise<string>): Promise<void>;
|
|
35
36
|
/**
|
|
36
37
|
* Seals object schemas to prevent additional properties.
|
|
@@ -53,9 +54,23 @@ export declare function runSealSchema(opts: {
|
|
|
53
54
|
*/
|
|
54
55
|
export declare function runCleanupDiscriminators(opts: {
|
|
55
56
|
output?: string;
|
|
57
|
+
removePatterns?: string[];
|
|
56
58
|
}, format: (doc: any, target?: string) => string, reader: () => Promise<string>): Promise<void>;
|
|
57
59
|
export declare function runRemoveDangling(opts: {
|
|
58
60
|
output?: string;
|
|
59
61
|
aggressive?: boolean;
|
|
60
62
|
}, format: (doc: any, target?: string) => string, reader: () => Promise<string>): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Removes single-composition schemas (schemas whose only content is a single
|
|
65
|
+
* allOf/anyOf/oneOf with one $ref) and rewires all references to point directly
|
|
66
|
+
* to the target schema.
|
|
67
|
+
*
|
|
68
|
+
* @param opts - Options including output path
|
|
69
|
+
* @param format - Function to format output
|
|
70
|
+
* @param reader - Function to read input
|
|
71
|
+
*/
|
|
72
|
+
export declare function runRemoveSingleComposition(opts: {
|
|
73
|
+
output?: string;
|
|
74
|
+
aggressive?: boolean;
|
|
75
|
+
}, format: (doc: any, target?: string) => string, reader: () => Promise<string>): Promise<void>;
|
|
61
76
|
//# sourceMappingURL=cliActions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cliActions.d.ts","sourceRoot":"","sources":["../../src/lib/cliActions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cliActions.d.ts","sourceRoot":"","sources":["../../src/lib/cliActions.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/cliActions.js
CHANGED
|
@@ -4,10 +4,11 @@ import YAML from "yaml";
|
|
|
4
4
|
import { optimizeAllOfComposition } from "./optimizeAllOfComposition.js";
|
|
5
5
|
import { removeUnusedSchemas } from "./removeUnusedSchemas.js";
|
|
6
6
|
import { removeFromOneOfByName, removeFromOneOfGlobally, } from "./removeFromOneOfByName.js";
|
|
7
|
-
import { allOfToOneOf } from "./
|
|
7
|
+
import { allOfToOneOf } from "./allOfToOneOfJsonPath.js";
|
|
8
8
|
import { sealSchema } from "./sealSchema.js";
|
|
9
9
|
import { cleanupDiscriminatorMappings } from "./cleanupDiscriminatorMappings.js";
|
|
10
10
|
import { removeDanglingRefs } from "./removeDanglingRefs.js";
|
|
11
|
+
import { removeSingleComposition } from "./removeSingleComposition.js";
|
|
11
12
|
function parseYamlOrJson(data) {
|
|
12
13
|
// Accept pre-parsed objects (useful in tests)
|
|
13
14
|
if (data && typeof data === "object")
|
|
@@ -151,6 +152,8 @@ export async function runAllOfToOneOf(opts, format, reader) {
|
|
|
151
152
|
const topts = {
|
|
152
153
|
addDiscriminatorConst: opts.addDiscriminatorConst !== false,
|
|
153
154
|
ignoreSingleSpecialization: Boolean(opts.ignoreSingleSpecialization),
|
|
155
|
+
mergeNestedOneOf: Boolean(opts.mergeNestedOneof),
|
|
156
|
+
onWarning: (msg) => console.warn(`[WARN] ${msg}`),
|
|
154
157
|
};
|
|
155
158
|
allOfToOneOf(doc, topts);
|
|
156
159
|
const afterSchemas = Object.keys(doc.components.schemas);
|
|
@@ -190,7 +193,12 @@ export async function runCleanupDiscriminators(opts, format, reader) {
|
|
|
190
193
|
const doc = parseYamlOrJson(await reader());
|
|
191
194
|
if (!validateComponentSchemas(doc))
|
|
192
195
|
return;
|
|
193
|
-
const result = cleanupDiscriminatorMappings(doc
|
|
196
|
+
const result = cleanupDiscriminatorMappings(doc, {
|
|
197
|
+
removeDiscriminatorPatterns: opts.removePatterns
|
|
198
|
+
});
|
|
199
|
+
if (result.discriminatorsRemoved > 0) {
|
|
200
|
+
console.error(`[CLEANUP-DISCRIMINATORS] Removed ${result.discriminatorsRemoved} discriminator(s) entirely from schemas: [${result.removedDiscriminators.join(", ")}]`);
|
|
201
|
+
}
|
|
194
202
|
if (result.schemasChecked > 0) {
|
|
195
203
|
console.error(`[CLEANUP-DISCRIMINATORS] Checked ${result.schemasChecked} schema(s) with discriminators.`);
|
|
196
204
|
if (result.mappingsRemoved > 0) {
|
|
@@ -219,4 +227,26 @@ export async function runRemoveDangling(opts, format, reader) {
|
|
|
219
227
|
}
|
|
220
228
|
await writeOutput(doc, opts.output, format);
|
|
221
229
|
}
|
|
230
|
+
/**
|
|
231
|
+
* Removes single-composition schemas (schemas whose only content is a single
|
|
232
|
+
* allOf/anyOf/oneOf with one $ref) and rewires all references to point directly
|
|
233
|
+
* to the target schema.
|
|
234
|
+
*
|
|
235
|
+
* @param opts - Options including output path
|
|
236
|
+
* @param format - Function to format output
|
|
237
|
+
* @param reader - Function to read input
|
|
238
|
+
*/
|
|
239
|
+
export async function runRemoveSingleComposition(opts, format, reader) {
|
|
240
|
+
const doc = parseYamlOrJson(await reader());
|
|
241
|
+
if (!validateComponentSchemas(doc))
|
|
242
|
+
return;
|
|
243
|
+
const result = removeSingleComposition(doc, { aggressive: Boolean(opts.aggressive) });
|
|
244
|
+
if (result.schemasRemoved > 0) {
|
|
245
|
+
console.error(`[REMOVE-SINGLE-COMPOSITION] Removed ${result.schemasRemoved} single-composition schema(s): ${result.removed.join(", ")}`);
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
console.error("[INFO] No single-composition schemas found.");
|
|
249
|
+
}
|
|
250
|
+
await writeOutput(doc, opts.output, format);
|
|
251
|
+
}
|
|
222
252
|
//# sourceMappingURL=cliActions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cliActions.js","sourceRoot":"","sources":["../../src/lib/cliActions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAiB,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EACL,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"cliActions.js","sourceRoot":"","sources":["../../src/lib/cliActions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optimizeAllOfComposition.d.ts","sourceRoot":"","sources":["../../src/lib/optimizeAllOfComposition.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"optimizeAllOfComposition.d.ts","sourceRoot":"","sources":["../../src/lib/optimizeAllOfComposition.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAqGtD"}
|
|
@@ -1,13 +1,5 @@
|
|
|
1
1
|
import { refToName } from "./oasUtils.js";
|
|
2
|
-
|
|
3
|
-
let JSONPath = undefined;
|
|
4
|
-
try {
|
|
5
|
-
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
6
|
-
JSONPath = require("jsonpath-plus").JSONPath;
|
|
7
|
-
}
|
|
8
|
-
catch (e) {
|
|
9
|
-
JSONPath = undefined;
|
|
10
|
-
}
|
|
2
|
+
import { JSONPath } from "jsonpath-plus";
|
|
11
3
|
/**
|
|
12
4
|
* Optimize allOf composition globally across an OpenAPI document.
|
|
13
5
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optimizeAllOfComposition.js","sourceRoot":"","sources":["../../src/lib/optimizeAllOfComposition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,
|
|
1
|
+
{"version":3,"file":"optimizeAllOfComposition.js","sourceRoot":"","sources":["../../src/lib/optimizeAllOfComposition.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface RemoveSingleCompositionOptions {
|
|
2
|
+
/**
|
|
3
|
+
* When true, also removes single-composition schemas that have additional
|
|
4
|
+
* keywords (e.g. `description`, `discriminator`) alongside the composition keyword,
|
|
5
|
+
* unless one of the extra keywords is `properties`.
|
|
6
|
+
*
|
|
7
|
+
* @default false
|
|
8
|
+
*/
|
|
9
|
+
aggressive?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Remove single-composition schemas from an OpenAPI document.
|
|
13
|
+
*
|
|
14
|
+
* A single-composition schema is one whose only content is a single composition keyword
|
|
15
|
+
* (allOf, anyOf, or oneOf) with exactly one $ref entry. Such schemas add indirection
|
|
16
|
+
* without semantic value and can be replaced by their target reference.
|
|
17
|
+
*
|
|
18
|
+
* Mutates the document in place and returns removal statistics.
|
|
19
|
+
*/
|
|
20
|
+
export declare function removeSingleComposition(doc: any, options?: RemoveSingleCompositionOptions): {
|
|
21
|
+
schemasRemoved: number;
|
|
22
|
+
removed: string[];
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=removeSingleComposition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"removeSingleComposition.d.ts","sourceRoot":"","sources":["../../src/lib/removeSingleComposition.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,8BAA8B;IAC7C;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAuDD;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,8BAA8B,GAAG;IAC3F,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAyDA"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { refToName } from './oasUtils.js';
|
|
2
|
+
import { traverseAndTransform } from './schemaTransformUtils.js';
|
|
3
|
+
const COMPOSITION_KEYWORDS = ['allOf', 'anyOf', 'oneOf'];
|
|
4
|
+
/** Keywords that prevent removal even in aggressive mode */
|
|
5
|
+
const PRESERVE_KEYWORDS = ['properties'];
|
|
6
|
+
/**
|
|
7
|
+
* Checks if a schema is a single-composition wrapper: a schema whose only content
|
|
8
|
+
* is one composition keyword (allOf/anyOf/oneOf) containing exactly one $ref entry.
|
|
9
|
+
*
|
|
10
|
+
* In aggressive mode, schemas with extra keywords (like `description` or `discriminator`)
|
|
11
|
+
* are also considered removable, unless one of the extra keywords is `properties`.
|
|
12
|
+
*
|
|
13
|
+
* @returns The target $ref string, or undefined if not a single-composition schema
|
|
14
|
+
*/
|
|
15
|
+
function getSingleCompositionTarget(schema, aggressive = false) {
|
|
16
|
+
if (!schema || typeof schema !== 'object' || Array.isArray(schema))
|
|
17
|
+
return undefined;
|
|
18
|
+
const keys = Object.keys(schema);
|
|
19
|
+
if (keys.length === 0)
|
|
20
|
+
return undefined;
|
|
21
|
+
const keyword = keys.find(k => COMPOSITION_KEYWORDS.includes(k));
|
|
22
|
+
if (!keyword)
|
|
23
|
+
return undefined;
|
|
24
|
+
const otherKeys = keys.filter(k => k !== keyword);
|
|
25
|
+
if (otherKeys.length > 0) {
|
|
26
|
+
if (!aggressive)
|
|
27
|
+
return undefined;
|
|
28
|
+
if (otherKeys.some(k => PRESERVE_KEYWORDS.includes(k)))
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
const arr = schema[keyword];
|
|
32
|
+
if (!Array.isArray(arr) || arr.length !== 1)
|
|
33
|
+
return undefined;
|
|
34
|
+
const item = arr[0];
|
|
35
|
+
if (item && typeof item === 'object' && typeof item.$ref === 'string') {
|
|
36
|
+
return item.$ref;
|
|
37
|
+
}
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Resolves transitive chains in the replacement map.
|
|
42
|
+
* If Foo→Bar and Bar→Baz, resolves Foo→Baz.
|
|
43
|
+
*/
|
|
44
|
+
function resolveTransitiveChains(replacements) {
|
|
45
|
+
for (const [from, to] of replacements) {
|
|
46
|
+
let resolved = to;
|
|
47
|
+
const visited = new Set([from]);
|
|
48
|
+
while (replacements.has(resolved) && !visited.has(resolved)) {
|
|
49
|
+
visited.add(resolved);
|
|
50
|
+
resolved = replacements.get(resolved);
|
|
51
|
+
}
|
|
52
|
+
if (resolved !== to) {
|
|
53
|
+
replacements.set(from, resolved);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Remove single-composition schemas from an OpenAPI document.
|
|
59
|
+
*
|
|
60
|
+
* A single-composition schema is one whose only content is a single composition keyword
|
|
61
|
+
* (allOf, anyOf, or oneOf) with exactly one $ref entry. Such schemas add indirection
|
|
62
|
+
* without semantic value and can be replaced by their target reference.
|
|
63
|
+
*
|
|
64
|
+
* Mutates the document in place and returns removal statistics.
|
|
65
|
+
*/
|
|
66
|
+
export function removeSingleComposition(doc, options) {
|
|
67
|
+
if (!doc || typeof doc !== 'object')
|
|
68
|
+
return { schemasRemoved: 0, removed: [] };
|
|
69
|
+
const aggressive = Boolean(options?.aggressive);
|
|
70
|
+
const schemas = doc.components?.schemas;
|
|
71
|
+
if (!schemas || typeof schemas !== 'object')
|
|
72
|
+
return { schemasRemoved: 0, removed: [] };
|
|
73
|
+
// Step 1: Identify single-composition schemas and build replacement map
|
|
74
|
+
const replacements = new Map(); // full ref → full ref
|
|
75
|
+
for (const [name, schema] of Object.entries(schemas)) {
|
|
76
|
+
const targetRef = getSingleCompositionTarget(schema, aggressive);
|
|
77
|
+
if (targetRef) {
|
|
78
|
+
const fromRef = `#/components/schemas/${name}`;
|
|
79
|
+
replacements.set(fromRef, targetRef);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (replacements.size === 0)
|
|
83
|
+
return { schemasRemoved: 0, removed: [] };
|
|
84
|
+
// Step 2: Resolve transitive chains
|
|
85
|
+
resolveTransitiveChains(replacements);
|
|
86
|
+
// Step 3: Replace all $ref occurrences throughout the document
|
|
87
|
+
traverseAndTransform(doc, (node) => {
|
|
88
|
+
if (node && typeof node === 'object' && typeof node.$ref === 'string') {
|
|
89
|
+
const replacement = replacements.get(node.$ref);
|
|
90
|
+
if (replacement) {
|
|
91
|
+
node.$ref = replacement;
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return false;
|
|
96
|
+
});
|
|
97
|
+
// Step 4: Update discriminator mappings
|
|
98
|
+
for (const schema of Object.values(schemas)) {
|
|
99
|
+
if (!schema || typeof schema !== 'object')
|
|
100
|
+
continue;
|
|
101
|
+
const mapping = schema.discriminator?.mapping;
|
|
102
|
+
if (!mapping || typeof mapping !== 'object')
|
|
103
|
+
continue;
|
|
104
|
+
for (const [key, ref] of Object.entries(mapping)) {
|
|
105
|
+
if (typeof ref === 'string' && replacements.has(ref)) {
|
|
106
|
+
mapping[key] = replacements.get(ref);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Step 5: Delete the removed schemas
|
|
111
|
+
const removed = [];
|
|
112
|
+
for (const fromRef of replacements.keys()) {
|
|
113
|
+
const name = refToName(fromRef);
|
|
114
|
+
if (name && schemas[name]) {
|
|
115
|
+
delete schemas[name];
|
|
116
|
+
removed.push(name);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return { schemasRemoved: removed.length, removed };
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=removeSingleComposition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"removeSingleComposition.js","sourceRoot":"","sources":["../../src/lib/removeSingleComposition.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"allof-to-oneof-decorator.js","sourceRoot":"","sources":["../../src/redocly/allof-to-oneof-decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"allof-to-oneof-decorator.js","sourceRoot":"","sources":["../../src/redocly/allof-to-oneof-decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAE9D,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAAC,IAAS;IACrD,OAAO;QACL,IAAI,EAAE;YACJ,KAAK,CAAC,MAAW;gBACf,YAAY,CAAC,MAAM,EAAE;oBACnB,qBAAqB,EAAE,IAAI,EAAE,qBAAqB,KAAK,KAAK;oBAC5D,0BAA0B,EAAE,IAAI,EAAE,0BAA0B,IAAI,KAAK;iBACtE,CAAC,CAAC;YACL,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import { CleanupDiscriminatorOptions } from "../lib/cleanupDiscriminatorMappings.js";
|
|
2
|
+
export default function CleanupDiscriminatorsDecorator(opts?: CleanupDiscriminatorOptions): {
|
|
2
3
|
Root: {
|
|
3
4
|
leave(target: any): void;
|
|
4
5
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cleanup-discriminator-decorator.d.ts","sourceRoot":"","sources":["../../src/redocly/cleanup-discriminator-decorator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cleanup-discriminator-decorator.d.ts","sourceRoot":"","sources":["../../src/redocly/cleanup-discriminator-decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,2BAA2B,EAAE,MAAM,wCAAwC,CAAC;AAEnH,MAAM,CAAC,OAAO,UAAU,8BAA8B,CAAC,IAAI,GAAE,2BAAgC;;sBAGzE,GAAG;;EActB"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { cleanupDiscriminatorMappings } from "../lib/cleanupDiscriminatorMappings.js";
|
|
2
|
-
export default function CleanupDiscriminatorsDecorator(opts) {
|
|
2
|
+
export default function CleanupDiscriminatorsDecorator(opts = {}) {
|
|
3
3
|
return {
|
|
4
4
|
Root: {
|
|
5
5
|
leave(target) {
|
|
6
|
-
const result = cleanupDiscriminatorMappings(target);
|
|
6
|
+
const result = cleanupDiscriminatorMappings(target, opts);
|
|
7
|
+
if (result.discriminatorsRemoved > 0) {
|
|
8
|
+
console.log(`[CLEANUP-DISCRIMINATORS] Removed ${result.discriminatorsRemoved} discriminator(s) entirely from schemas: [${result.removedDiscriminators.join(", ")}]`);
|
|
9
|
+
}
|
|
7
10
|
if (result.mappingsRemoved > 0) {
|
|
8
11
|
console.log(`[CLEANUP-DISCRIMINATORS] Removed ${result.mappingsRemoved} mapping(s).`);
|
|
9
12
|
for (const detail of result.details) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cleanup-discriminator-decorator.js","sourceRoot":"","sources":["../../src/redocly/cleanup-discriminator-decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,
|
|
1
|
+
{"version":3,"file":"cleanup-discriminator-decorator.js","sourceRoot":"","sources":["../../src/redocly/cleanup-discriminator-decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAA+B,MAAM,wCAAwC,CAAC;AAEnH,MAAM,CAAC,OAAO,UAAU,8BAA8B,CAAC,OAAoC,EAAE;IAC3F,OAAO;QACL,IAAI,EAAE;YACJ,KAAK,CAAC,MAAW;gBACf,MAAM,MAAM,GAAG,4BAA4B,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC1D,IAAI,MAAM,CAAC,qBAAqB,GAAG,CAAC,EAAE,CAAC;oBACrC,OAAO,CAAC,GAAG,CAAC,oCAAoC,MAAM,CAAC,qBAAqB,6CAA6C,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACvK,CAAC;gBACD,IAAI,MAAM,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;oBAC/B,OAAO,CAAC,GAAG,CAAC,oCAAoC,MAAM,CAAC,eAAe,cAAc,CAAC,CAAC;oBACtF,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;wBACpC,OAAO,CAAC,GAAG,CAAC,sCAAsC,MAAM,CAAC,MAAM,wBAAwB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACvH,CAAC;gBACH,CAAC;YACH,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
|
package/dist/redocly/plugin.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ import AllOfToOneOfDecorator from "./allof-to-oneof-decorator.js";
|
|
|
5
5
|
import SealSchemaDecorator from "./seal-schema-decorator.js";
|
|
6
6
|
import CleanupDiscriminatorsDecorator from "./cleanup-discriminator-decorator.js";
|
|
7
7
|
import RemoveDanglingDecorator from "./remove-dangling-decorator.js";
|
|
8
|
+
import RemoveSingleCompositionDecorator from "./remove-single-composition-decorator.js";
|
|
8
9
|
export default function oasRemoveUnusedPlugin(): {
|
|
9
10
|
id: string;
|
|
10
11
|
decorators: {
|
|
@@ -16,6 +17,7 @@ export default function oasRemoveUnusedPlugin(): {
|
|
|
16
17
|
"seal-schema": typeof SealSchemaDecorator;
|
|
17
18
|
"cleanup-discriminators": typeof CleanupDiscriminatorsDecorator;
|
|
18
19
|
"remove-dangling-refs": typeof RemoveDanglingDecorator;
|
|
20
|
+
"remove-single-composition": typeof RemoveSingleCompositionDecorator;
|
|
19
21
|
"remove-unused-schemas": typeof RemoveUnusedDecorator;
|
|
20
22
|
"remove-from-oneof": typeof RemoveFromOneOfDecorator;
|
|
21
23
|
};
|
|
@@ -27,6 +29,7 @@ export default function oasRemoveUnusedPlugin(): {
|
|
|
27
29
|
"seal-schema": typeof SealSchemaDecorator;
|
|
28
30
|
"cleanup-discriminators": typeof CleanupDiscriminatorsDecorator;
|
|
29
31
|
"remove-dangling-refs": typeof RemoveDanglingDecorator;
|
|
32
|
+
"remove-single-composition": typeof RemoveSingleCompositionDecorator;
|
|
30
33
|
"remove-unused-schemas": typeof RemoveUnusedDecorator;
|
|
31
34
|
"remove-from-oneof": typeof RemoveFromOneOfDecorator;
|
|
32
35
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/redocly/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,MAAM,8BAA8B,CAAC;AACjE,OAAO,wBAAwB,MAAM,kCAAkC,CAAC;AACxE,OAAO,sBAAsB,MAAM,+BAA+B,CAAC;AACnE,OAAO,qBAAqB,MAAM,+BAA+B,CAAC;AAClE,OAAO,mBAAmB,MAAM,4BAA4B,CAAC;AAC7D,OAAO,8BAA8B,MAAM,sCAAsC,CAAC;AAClF,OAAO,uBAAuB,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/redocly/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,MAAM,8BAA8B,CAAC;AACjE,OAAO,wBAAwB,MAAM,kCAAkC,CAAC;AACxE,OAAO,sBAAsB,MAAM,+BAA+B,CAAC;AACnE,OAAO,qBAAqB,MAAM,+BAA+B,CAAC;AAClE,OAAO,mBAAmB,MAAM,4BAA4B,CAAC;AAC7D,OAAO,8BAA8B,MAAM,sCAAsC,CAAC;AAClF,OAAO,uBAAuB,MAAM,gCAAgC,CAAC;AACrE,OAAO,gCAAgC,MAAM,0CAA0C,CAAC;AAExF,MAAM,CAAC,OAAO,UAAU,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkC5C"}
|
package/dist/redocly/plugin.js
CHANGED
|
@@ -5,6 +5,7 @@ import AllOfToOneOfDecorator from "./allof-to-oneof-decorator.js";
|
|
|
5
5
|
import SealSchemaDecorator from "./seal-schema-decorator.js";
|
|
6
6
|
import CleanupDiscriminatorsDecorator from "./cleanup-discriminator-decorator.js";
|
|
7
7
|
import RemoveDanglingDecorator from "./remove-dangling-decorator.js";
|
|
8
|
+
import RemoveSingleCompositionDecorator from "./remove-single-composition-decorator.js";
|
|
8
9
|
export default function oasRemoveUnusedPlugin() {
|
|
9
10
|
return {
|
|
10
11
|
id: "oas-utils",
|
|
@@ -18,6 +19,7 @@ export default function oasRemoveUnusedPlugin() {
|
|
|
18
19
|
"seal-schema": SealSchemaDecorator,
|
|
19
20
|
"cleanup-discriminators": CleanupDiscriminatorsDecorator,
|
|
20
21
|
"remove-dangling-refs": RemoveDanglingDecorator,
|
|
22
|
+
"remove-single-composition": RemoveSingleCompositionDecorator,
|
|
21
23
|
// Back-compat aliases
|
|
22
24
|
"remove-unused-schemas": RemoveUnusedDecorator,
|
|
23
25
|
"remove-from-oneof": RemoveFromOneOfDecorator,
|
|
@@ -31,6 +33,7 @@ export default function oasRemoveUnusedPlugin() {
|
|
|
31
33
|
"seal-schema": SealSchemaDecorator,
|
|
32
34
|
"cleanup-discriminators": CleanupDiscriminatorsDecorator,
|
|
33
35
|
"remove-dangling-refs": RemoveDanglingDecorator,
|
|
36
|
+
"remove-single-composition": RemoveSingleCompositionDecorator,
|
|
34
37
|
// Back-compat aliases
|
|
35
38
|
"remove-unused-schemas": RemoveUnusedDecorator,
|
|
36
39
|
"remove-from-oneof": RemoveFromOneOfDecorator,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/redocly/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,MAAM,8BAA8B,CAAC;AACjE,OAAO,wBAAwB,MAAM,kCAAkC,CAAC;AACxE,OAAO,sBAAsB,MAAM,+BAA+B,CAAC;AACnE,OAAO,qBAAqB,MAAM,+BAA+B,CAAC;AAClE,OAAO,mBAAmB,MAAM,4BAA4B,CAAC;AAC7D,OAAO,8BAA8B,MAAM,sCAAsC,CAAC;AAClF,OAAO,uBAAuB,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/redocly/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,MAAM,8BAA8B,CAAC;AACjE,OAAO,wBAAwB,MAAM,kCAAkC,CAAC;AACxE,OAAO,sBAAsB,MAAM,+BAA+B,CAAC;AACnE,OAAO,qBAAqB,MAAM,+BAA+B,CAAC;AAClE,OAAO,mBAAmB,MAAM,4BAA4B,CAAC;AAC7D,OAAO,8BAA8B,MAAM,sCAAsC,CAAC;AAClF,OAAO,uBAAuB,MAAM,gCAAgC,CAAC;AACrE,OAAO,gCAAgC,MAAM,0CAA0C,CAAC;AAExF,MAAM,CAAC,OAAO,UAAU,qBAAqB;IAC3C,OAAO;QACP,EAAE,EAAE,WAAW;QACb,UAAU,EAAE;YACV,IAAI,EAAE;gBACR,iDAAiD;gBACjD,eAAe,EAAE,qBAAqB;gBACtC,cAAc,EAAE,wBAAwB;gBACxC,gBAAgB,EAAE,sBAAsB;gBACxC,gBAAgB,EAAE,qBAAqB;gBACvC,aAAa,EAAE,mBAAmB;gBAClC,wBAAwB,EAAE,8BAA8B;gBACxD,sBAAsB,EAAE,uBAAuB;gBAC/C,2BAA2B,EAAE,gCAAgC;gBAC7D,sBAAsB;gBACtB,uBAAuB,EAAE,qBAAqB;gBAC9C,mBAAmB,EAAE,wBAAwB;aAC1C;YACD,IAAI,EAAE;gBACR,kBAAkB;gBAClB,eAAe,EAAE,qBAAqB;gBACtC,cAAc,EAAE,wBAAwB;gBACxC,gBAAgB,EAAE,sBAAsB;gBACxC,gBAAgB,EAAE,qBAAqB;gBACvC,aAAa,EAAE,mBAAmB;gBAClC,wBAAwB,EAAE,8BAA8B;gBACxD,sBAAsB,EAAE,uBAAuB;gBAC/C,2BAA2B,EAAE,gCAAgC;gBAC7D,sBAAsB;gBACtB,uBAAuB,EAAE,qBAAqB;gBAC9C,mBAAmB,EAAE,wBAAwB;aAC1C;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove-single-composition-decorator.d.ts","sourceRoot":"","sources":["../../src/redocly/remove-single-composition-decorator.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,UAAU,gCAAgC,CAAC,IAAI,EAAE,GAAG;;sBAG9C,GAAG;;EAQtB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { removeSingleComposition } from '../lib/removeSingleComposition.js';
|
|
2
|
+
export default function RemoveSingleCompositionDecorator(opts) {
|
|
3
|
+
return {
|
|
4
|
+
Root: {
|
|
5
|
+
leave(target) {
|
|
6
|
+
const result = removeSingleComposition(target, { aggressive: Boolean(opts?.aggressive) });
|
|
7
|
+
if (result.schemasRemoved > 0) {
|
|
8
|
+
console.log(`[REMOVE-SINGLE-COMPOSITION] Removed ${result.schemasRemoved} single-composition schema(s): ${result.removed.join(", ")}`);
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=remove-single-composition-decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove-single-composition-decorator.js","sourceRoot":"","sources":["../../src/redocly/remove-single-composition-decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAE5E,MAAM,CAAC,OAAO,UAAU,gCAAgC,CAAC,IAAS;IAChE,OAAO;QACL,IAAI,EAAE;YACJ,KAAK,CAAC,MAAW;gBACf,MAAM,MAAM,GAAG,uBAAuB,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;gBAC1F,IAAI,MAAM,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;oBAC9B,OAAO,CAAC,GAAG,CAAC,uCAAuC,MAAM,CAAC,cAAc,kCAAkC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACzI,CAAC;YACH,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
export interface AllOfToOneOfOptions {
|
|
2
|
-
/** If true, add const property with discriminator value to specialization schemas (default: true) */
|
|
3
|
-
addDiscriminatorConst?: boolean;
|
|
4
|
-
/** If true, skip oneOf transformation if only one specialization is found (default: false) */
|
|
5
|
-
ignoreSingleSpecialization?: boolean;
|
|
6
|
-
/** If true, merge nested oneOf schemas by inlining references to schemas that only contain oneOf (default: false) */
|
|
7
|
-
mergeNestedOneOf?: boolean;
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Convert allOf + discriminator patterns to oneOf + discriminator.
|
|
11
|
-
*
|
|
12
|
-
* This operation:
|
|
13
|
-
* 1. Finds base schemas with discriminators
|
|
14
|
-
* 2. Identifies concrete schemas that extend the base via allOf
|
|
15
|
-
* 3. For each concrete schema, adds a const property matching the discriminator value
|
|
16
|
-
* 4. Creates a new oneOf wrapper schema containing all concrete schemas
|
|
17
|
-
* 5. Replaces all references to the base schema with the wrapper schema (where polymorphism is used)
|
|
18
|
-
*
|
|
19
|
-
* @param doc - OpenAPI document to transform
|
|
20
|
-
* @param opts - Optional configuration
|
|
21
|
-
*/
|
|
22
|
-
export declare function allOfToOneOf(doc: any, opts?: AllOfToOneOfOptions): any;
|
|
23
|
-
//# sourceMappingURL=allOfToOneOf.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"allOfToOneOf.d.ts","sourceRoot":"","sources":["../../src/lib/allOfToOneOf.ts"],"names":[],"mappings":"AAqDA,MAAM,WAAW,mBAAmB;IAClC,qGAAqG;IACrG,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,8FAA8F;IAC9F,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,qHAAqH;IACrH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,GAAE,mBAAwB,GAAG,GAAG,CA2J1E"}
|