@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.
Files changed (49) hide show
  1. package/README.md +50 -9
  2. package/dist/cli.js +19 -2
  3. package/dist/cli.js.map +1 -1
  4. package/dist/index.d.ts +2 -1
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +2 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/lib/allOfToOneOfInterface.d.ts +36 -0
  9. package/dist/lib/allOfToOneOfInterface.d.ts.map +1 -0
  10. package/dist/lib/allOfToOneOfInterface.js +5 -0
  11. package/dist/lib/allOfToOneOfInterface.js.map +1 -0
  12. package/dist/lib/allOfToOneOfJsonPath.d.ts +60 -0
  13. package/dist/lib/allOfToOneOfJsonPath.d.ts.map +1 -0
  14. package/dist/lib/allOfToOneOfJsonPath.js +539 -0
  15. package/dist/lib/allOfToOneOfJsonPath.js.map +1 -0
  16. package/dist/lib/cleanupDiscriminatorMappings.d.ts +14 -2
  17. package/dist/lib/cleanupDiscriminatorMappings.d.ts.map +1 -1
  18. package/dist/lib/cleanupDiscriminatorMappings.js +30 -5
  19. package/dist/lib/cleanupDiscriminatorMappings.js.map +1 -1
  20. package/dist/lib/cliActions.d.ts +15 -0
  21. package/dist/lib/cliActions.d.ts.map +1 -1
  22. package/dist/lib/cliActions.js +32 -2
  23. package/dist/lib/cliActions.js.map +1 -1
  24. package/dist/lib/optimizeAllOfComposition.d.ts.map +1 -1
  25. package/dist/lib/optimizeAllOfComposition.js +1 -9
  26. package/dist/lib/optimizeAllOfComposition.js.map +1 -1
  27. package/dist/lib/removeSingleComposition.d.ts +24 -0
  28. package/dist/lib/removeSingleComposition.d.ts.map +1 -0
  29. package/dist/lib/removeSingleComposition.js +121 -0
  30. package/dist/lib/removeSingleComposition.js.map +1 -0
  31. package/dist/redocly/allof-to-oneof-decorator.js +1 -1
  32. package/dist/redocly/allof-to-oneof-decorator.js.map +1 -1
  33. package/dist/redocly/cleanup-discriminator-decorator.d.ts +2 -1
  34. package/dist/redocly/cleanup-discriminator-decorator.d.ts.map +1 -1
  35. package/dist/redocly/cleanup-discriminator-decorator.js +5 -2
  36. package/dist/redocly/cleanup-discriminator-decorator.js.map +1 -1
  37. package/dist/redocly/plugin.d.ts +3 -0
  38. package/dist/redocly/plugin.d.ts.map +1 -1
  39. package/dist/redocly/plugin.js +3 -0
  40. package/dist/redocly/plugin.js.map +1 -1
  41. package/dist/redocly/remove-single-composition-decorator.d.ts +6 -0
  42. package/dist/redocly/remove-single-composition-decorator.d.ts.map +1 -0
  43. package/dist/redocly/remove-single-composition-decorator.js +14 -0
  44. package/dist/redocly/remove-single-composition-decorator.js.map +1 -0
  45. package/package.json +1 -1
  46. package/dist/lib/allOfToOneOf.d.ts +0 -23
  47. package/dist/lib/allOfToOneOf.d.ts.map +0 -1
  48. package/dist/lib/allOfToOneOf.js +0 -413
  49. package/dist/lib/allOfToOneOf.js.map +0 -1
@@ -1,413 +0,0 @@
1
- import { refToName, buildInheritanceGraph } from "./oasUtils.js";
2
- import { collectMatching } from "./schemaTransformUtils.js";
3
- /**
4
- * Check if a schema reference is used anywhere in the document outside of allOf arrays.
5
- * Returns true if the schema is referenced in paths, operations, or components (excluding allOf inheritance).
6
- */
7
- function isSchemaReferencedOutsideAllOf(doc, schemaRef) {
8
- // Check paths and webhooks (no allOf filtering needed here)
9
- if (collectMatching(doc.paths, (node) => node?.$ref === schemaRef).length > 0) {
10
- return true;
11
- }
12
- if (collectMatching(doc.webhooks, (node) => node?.$ref === schemaRef).length > 0) {
13
- return true;
14
- }
15
- // Check components (excluding schemas which need special handling)
16
- const components = doc.components;
17
- if (components) {
18
- const nonSchemaComponents = {
19
- requestBodies: components.requestBodies,
20
- responses: components.responses,
21
- parameters: components.parameters,
22
- callbacks: components.callbacks,
23
- links: components.links,
24
- headers: components.headers
25
- };
26
- if (collectMatching(nonSchemaComponents, (node) => node?.$ref === schemaRef).length > 0) {
27
- return true;
28
- }
29
- // Check schemas but exclude direct allOf references
30
- const schemas = components.schemas;
31
- if (schemas && typeof schemas === "object") {
32
- for (const schema of Object.values(schemas)) {
33
- if (schema && typeof schema === "object") {
34
- // Create a copy of schema without the allOf array to search
35
- const { allOf, ...schemaWithoutAllOf } = schema;
36
- // Search in everything except the direct allOf references
37
- if (collectMatching(schemaWithoutAllOf, (node) => node?.$ref === schemaRef).length > 0) {
38
- return true;
39
- }
40
- }
41
- }
42
- }
43
- }
44
- return false;
45
- }
46
- /**
47
- * Convert allOf + discriminator patterns to oneOf + discriminator.
48
- *
49
- * This operation:
50
- * 1. Finds base schemas with discriminators
51
- * 2. Identifies concrete schemas that extend the base via allOf
52
- * 3. For each concrete schema, adds a const property matching the discriminator value
53
- * 4. Creates a new oneOf wrapper schema containing all concrete schemas
54
- * 5. Replaces all references to the base schema with the wrapper schema (where polymorphism is used)
55
- *
56
- * @param doc - OpenAPI document to transform
57
- * @param opts - Optional configuration
58
- */
59
- export function allOfToOneOf(doc, opts = {}) {
60
- if (!doc || typeof doc !== "object")
61
- return doc;
62
- const schemas = doc.components?.schemas;
63
- if (!schemas || typeof schemas !== "object")
64
- return doc;
65
- // Step 1: Find all base schemas with discriminators
66
- const baseSchemasWithDiscriminator = new Map();
67
- for (const [name, schema] of Object.entries(schemas)) {
68
- if (schema && typeof schema === "object" && schema.discriminator) {
69
- const disc = schema.discriminator;
70
- if (disc.propertyName && disc.mapping && typeof disc.mapping === "object") {
71
- baseSchemasWithDiscriminator.set(name, {
72
- propertyName: disc.propertyName,
73
- mapping: { ...disc.mapping }
74
- });
75
- }
76
- }
77
- }
78
- if (baseSchemasWithDiscriminator.size === 0) {
79
- return doc; // Nothing to convert
80
- }
81
- // Step 2: For each base schema with discriminator, find concrete types extending it
82
- const inheritanceGraph = buildInheritanceGraph(schemas);
83
- const polymorphicWrappers = new Map();
84
- for (const [baseName, discInfo] of baseSchemasWithDiscriminator.entries()) {
85
- const concreteSchemas = Array.from(inheritanceGraph.get(baseName) || []);
86
- if (opts.ignoreSingleSpecialization && concreteSchemas.length === 1) {
87
- continue;
88
- }
89
- if (concreteSchemas.length > 0) {
90
- const wrapperName = `${baseName}Polymorphic`;
91
- polymorphicWrappers.set(baseName, { name: wrapperName, concreteSchemas });
92
- // Step 3: For each concrete schema, optionally add const property for discriminator
93
- if (opts.addDiscriminatorConst !== false) {
94
- const cS = Object.fromEntries(concreteSchemas.map(name => [name, schemas[name]]));
95
- addDiscriminatorConstToConcreteSchemas(cS, discInfo);
96
- }
97
- // Step 4: Create wrapper schema with oneOf
98
- const wrapperSchema = {
99
- oneOf: concreteSchemas.map(name => ({ $ref: `#/components/schemas/${name}` })),
100
- discriminator: {
101
- propertyName: discInfo.propertyName,
102
- mapping: discInfo.mapping
103
- }
104
- };
105
- // If available, preserve description from base
106
- const baseSchema = schemas[baseName];
107
- if (baseSchema && baseSchema.description) {
108
- wrapperSchema.description = `OneOf polymorphic ${baseName}. Use the "${discInfo.propertyName}" property to identify the concrete schema.`;
109
- }
110
- schemas[wrapperName] = wrapperSchema;
111
- }
112
- }
113
- // Step 5: Replace references to base schemas with wrapper schemas where polymorphism is used
114
- // Preserve direct inheritance (allOf) references but rewrite everything else
115
- // Also track if base schema is actually used anywhere
116
- const wrappersToRemove = new Set();
117
- const baseNamesWithoutWrappers = new Set();
118
- for (const [baseName, wrapperInfo] of polymorphicWrappers.entries()) {
119
- const baseRef = `#/components/schemas/${baseName}`;
120
- const wrapperRef = `#/components/schemas/${wrapperInfo.name}`;
121
- // Check if base schema is used anywhere outside of allOf inheritance
122
- const isBaseUsed = isSchemaReferencedOutsideAllOf(doc, baseRef);
123
- if (!isBaseUsed) {
124
- // Base schema is not used in API - mark wrapper for removal
125
- wrappersToRemove.add(wrapperInfo.name);
126
- baseNamesWithoutWrappers.add(baseName);
127
- continue;
128
- }
129
- // In components.schemas we must keep allOf inheritance pointing at the base,
130
- // but other usages (e.g. Human.pets, Pack.members) should point to the wrapper.
131
- replaceInSchema(schemas, baseRef, wrapperRef, true);
132
- // In other document sections we can freely replace all occurrences.
133
- replaceInSchema(doc.paths, baseRef, wrapperRef, false);
134
- replaceInSchema(doc.webhooks, baseRef, wrapperRef, false);
135
- const components = doc.components;
136
- if (components && typeof components === "object") {
137
- // Shared components using schemas
138
- replaceInSchema(components.requestBodies, baseRef, wrapperRef, false);
139
- replaceInSchema(components.responses, baseRef, wrapperRef, false);
140
- replaceInSchema(components.parameters, baseRef, wrapperRef, false);
141
- // Callbacks and links can contain operations and request bodies using schemas
142
- replaceInCallbacks(components.callbacks, baseRef, wrapperRef);
143
- replaceInSchema(components.links, baseRef, wrapperRef, false);
144
- // Intentionally do NOT touch headers or examples
145
- }
146
- }
147
- // Remove polymorphic wrappers that have no clients
148
- for (const wrapperName of wrappersToRemove) {
149
- delete schemas[wrapperName];
150
- }
151
- // Remove from tracking map as well
152
- for (const baseName of baseNamesWithoutWrappers) {
153
- polymorphicWrappers.delete(baseName);
154
- }
155
- // Step 5b: Chain polymorphic wrappers.
156
- // If a wrapper's oneOf entry points at another polymorphic base, redirect it to that base's wrapper
157
- // so that top-level polymorphic wrappers expose nested polymorphic wrappers instead of raw bases.
158
- if (polymorphicWrappers.size > 1) {
159
- for (const [, wrapperInfo] of polymorphicWrappers.entries()) {
160
- const wrapperSchema = schemas[wrapperInfo.name];
161
- if (!wrapperSchema || !Array.isArray(wrapperSchema.oneOf))
162
- continue;
163
- wrapperSchema.oneOf = wrapperSchema.oneOf.map((entry) => {
164
- if (!entry || typeof entry !== "object" || typeof entry.$ref !== "string") {
165
- return entry;
166
- }
167
- const targetName = refToName(entry.$ref || "");
168
- const nested = targetName ? polymorphicWrappers.get(targetName) : undefined;
169
- if (!nested) {
170
- return entry;
171
- }
172
- return { $ref: `#/components/schemas/${nested.name}` };
173
- });
174
- }
175
- }
176
- // Step 5c: Optionally merge nested oneOf schemas
177
- // If a oneOf references a schema that only contains oneOf (no other properties),
178
- // inline the referenced oneOf items into the parent oneOf
179
- if (opts.mergeNestedOneOf) {
180
- mergeNestedOneOfSchemas(schemas);
181
- }
182
- // Step 6: Always remove discriminator from base schemas that were converted
183
- for (const baseName of baseSchemasWithDiscriminator.keys()) {
184
- if (schemas[baseName] && polymorphicWrappers.has(baseName)) {
185
- delete schemas[baseName].discriminator;
186
- }
187
- }
188
- return doc;
189
- }
190
- /**
191
- * Recursively replace $ref in a schema, particularly in polymorphic contexts like array items.
192
- * When skipAllOfReplacement=true, skip replacing $ref directly within allOf arrays.
193
- */
194
- function replaceInSchema(node, oldRef, newRef, skipDirectAllOfRefs = false) {
195
- if (!node || typeof node !== "object")
196
- return;
197
- if (Array.isArray(node)) {
198
- for (const item of node) {
199
- if (item && typeof item === "object") {
200
- replaceInSchema(item, oldRef, newRef, skipDirectAllOfRefs);
201
- }
202
- }
203
- return;
204
- }
205
- // For object properties, replace all $ref occurrences
206
- for (const [key, value] of Object.entries(node)) {
207
- if (value && typeof value === "object") {
208
- // Special handling for allOf: skip direct $ref replacements when requested
209
- if (skipDirectAllOfRefs && key === "allOf" && Array.isArray(value)) {
210
- for (const item of value) {
211
- if (!item || typeof item !== "object")
212
- continue;
213
- // Keep direct inheritance refs to the base inside allOf
214
- if (item.$ref === oldRef) {
215
- continue;
216
- }
217
- replaceInSchema(item, oldRef, newRef, skipDirectAllOfRefs);
218
- }
219
- continue;
220
- }
221
- if (value.$ref === oldRef) {
222
- value.$ref = newRef;
223
- }
224
- replaceInSchema(value, oldRef, newRef, skipDirectAllOfRefs);
225
- }
226
- }
227
- }
228
- /**
229
- * Replace references inside callback components.
230
- * A callback map has shape { [name]: { [expression]: PathItemObject } }.
231
- * We can reuse replaceInSchema on each PathItemObject.
232
- */
233
- function replaceInCallbacks(callbacks, oldRef, newRef) {
234
- if (!callbacks || typeof callbacks !== "object")
235
- return;
236
- // callbacks object shape is { [callbackName]: { [expression]: PathItemObject } }
237
- for (const cb of Object.values(callbacks)) {
238
- if (!cb || typeof cb !== "object")
239
- continue;
240
- for (const pathItem of Object.values(cb)) {
241
- if (!pathItem || typeof pathItem !== "object")
242
- continue;
243
- // PathItemObject has operations, parameters, etc. We need to walk
244
- // operations (get/post/put/patch/delete/options/head/trace) so that
245
- // requestBody/ responses schemas are updated just like in paths.
246
- const opLike = pathItem;
247
- const operationKeys = [
248
- "get",
249
- "put",
250
- "post",
251
- "delete",
252
- "options",
253
- "head",
254
- "patch",
255
- "trace"
256
- ];
257
- for (const key of operationKeys) {
258
- const op = opLike[key];
259
- if (op && typeof op === "object") {
260
- replaceInSchema(op, oldRef, newRef, false);
261
- }
262
- }
263
- }
264
- }
265
- }
266
- /**
267
- * Add const constraint to each concrete schema matching the discriminator value.
268
- * Avoids duplicates by checking if the const constraint already exists.
269
- *
270
- * @param schemas - Concrete schemas extending a base with discriminator (name -> schema)
271
- * @param discInfo - Discriminator info (propertyName, mapping)
272
- */
273
- function addDiscriminatorConstToConcreteSchemas(schemas, discInfo) {
274
- // Iterate through concrete schemas by name
275
- for (const [concreteName, concreteSchema] of Object.entries(schemas)) {
276
- if (!concreteSchema)
277
- continue;
278
- // Find the discriminator value for this concrete schema
279
- let discriminatorValue;
280
- for (const [value, ref] of Object.entries(discInfo.mapping)) {
281
- if (typeof ref === "string" && refToName(ref) === concreteName) {
282
- discriminatorValue = value;
283
- break;
284
- }
285
- }
286
- if (discriminatorValue) {
287
- // Ensure allOf exists
288
- if (!Array.isArray(concreteSchema.allOf)) {
289
- concreteSchema.allOf = [];
290
- }
291
- // Check if const constraint already exists for this schema
292
- const constExists = concreteSchema.allOf.some((item) => item &&
293
- typeof item === "object" &&
294
- item.type === "object" &&
295
- item.properties &&
296
- item.properties[discInfo.propertyName] &&
297
- item.properties[discInfo.propertyName].const === discriminatorValue);
298
- // Only add const if it doesn't already exist
299
- if (!constExists) {
300
- // Add const as a separate allOf constraint (not merged with existing inline objects)
301
- const constConstraint = {
302
- type: "object",
303
- properties: {
304
- [discInfo.propertyName]: {
305
- const: discriminatorValue
306
- }
307
- }
308
- };
309
- concreteSchema.allOf.push(constConstraint);
310
- }
311
- }
312
- }
313
- }
314
- /**
315
- * Merge nested oneOf schemas by inlining references to schemas that only contain oneOf.
316
- * This optimizes cases where a oneOf references another schema that is purely a oneOf wrapper.
317
- *
318
- * @param schemas - All schemas in the document
319
- */
320
- function mergeNestedOneOfSchemas(schemas) {
321
- if (!schemas || typeof schemas !== "object")
322
- return;
323
- // Identify schemas that are "simple oneOf wrappers" (only have oneOf, discriminator, description)
324
- const simpleOneOfSchemas = new Set();
325
- for (const [name, schema] of Object.entries(schemas)) {
326
- if (isSimpleOneOfSchema(schema)) {
327
- simpleOneOfSchemas.add(name);
328
- }
329
- }
330
- if (simpleOneOfSchemas.size === 0)
331
- return;
332
- // Process each schema that has oneOf
333
- for (const schema of Object.values(schemas)) {
334
- if (!schema || typeof schema !== "object" || !Array.isArray(schema.oneOf)) {
335
- continue;
336
- }
337
- let modified = false;
338
- const newOneOf = [];
339
- const mergedMappings = {};
340
- // Check each oneOf entry
341
- for (const entry of schema.oneOf) {
342
- if (!entry || typeof entry !== "object" || typeof entry.$ref !== "string") {
343
- newOneOf.push(entry);
344
- continue;
345
- }
346
- const refName = refToName(entry.$ref);
347
- if (!refName || !simpleOneOfSchemas.has(refName)) {
348
- newOneOf.push(entry);
349
- continue;
350
- }
351
- // This references a simple oneOf schema - inline it
352
- const referencedSchema = schemas[refName];
353
- if (referencedSchema && Array.isArray(referencedSchema.oneOf)) {
354
- // Add all items from the referenced oneOf
355
- newOneOf.push(...referencedSchema.oneOf);
356
- // Merge discriminator mappings
357
- if (referencedSchema.discriminator?.mapping) {
358
- Object.assign(mergedMappings, referencedSchema.discriminator.mapping);
359
- }
360
- modified = true;
361
- }
362
- else {
363
- newOneOf.push(entry);
364
- }
365
- }
366
- if (modified) {
367
- // Remove duplicates from oneOf (same $ref)
368
- const seen = new Set();
369
- schema.oneOf = newOneOf.filter((entry) => {
370
- if (!entry?.$ref)
371
- return true;
372
- if (seen.has(entry.$ref))
373
- return false;
374
- seen.add(entry.$ref);
375
- return true;
376
- });
377
- // Merge discriminator mappings
378
- if (Object.keys(mergedMappings).length > 0) {
379
- if (!schema.discriminator) {
380
- schema.discriminator = { propertyName: "type", mapping: {} };
381
- }
382
- if (!schema.discriminator.mapping) {
383
- schema.discriminator.mapping = {};
384
- }
385
- Object.assign(schema.discriminator.mapping, mergedMappings);
386
- }
387
- }
388
- }
389
- }
390
- /**
391
- * Check if a schema is a "simple oneOf wrapper" - only contains oneOf and optionally discriminator/description.
392
- * These schemas are candidates for inlining.
393
- */
394
- function isSimpleOneOfSchema(schema) {
395
- if (!schema || typeof schema !== "object")
396
- return false;
397
- if (!Array.isArray(schema.oneOf) || schema.oneOf.length === 0)
398
- return false;
399
- // Check that schema ONLY has oneOf, discriminator, and/or description
400
- const allowedKeys = new Set(['oneOf', 'discriminator', 'description']);
401
- const schemaKeys = Object.keys(schema);
402
- for (const key of schemaKeys) {
403
- if (!allowedKeys.has(key)) {
404
- return false;
405
- }
406
- }
407
- // Must not have allOf, properties, or other schema-defining properties
408
- if (schema.allOf || schema.properties || schema.type || schema.anyOf) {
409
- return false;
410
- }
411
- return true;
412
- }
413
- //# sourceMappingURL=allOfToOneOf.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"allOfToOneOf.js","sourceRoot":"","sources":["../../src/lib/allOfToOneOf.ts"],"names":[],"mappings":"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"}