Skip to content

Commit ba32b31

Browse files
committed
fix: adding tests, backwards compat with openapi 3.0
1 parent 6b8060b commit ba32b31

File tree

6 files changed

+60
-35
lines changed

6 files changed

+60
-35
lines changed

packages/openapi-code-generator/src/core/input.spec.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ describe("core/input - SchemaNormalizer", () => {
7070
enum: undefined,
7171
exclusiveMaximum: undefined,
7272
exclusiveMinimum: undefined,
73-
maximum: undefined,
74-
minimum: undefined,
73+
inclusiveMaximum: undefined,
74+
inclusiveMinimum: undefined,
7575
multipleOf: undefined,
7676
nullable: false,
7777
readOnly: false,
@@ -244,15 +244,14 @@ describe("core/input - SchemaNormalizer", () => {
244244
...base.number,
245245
format: "int64",
246246
multipleOf: 2,
247-
maximum: 4,
248-
minimum: -2,
247+
inclusiveMaximum: 4,
248+
inclusiveMinimum: -2,
249249
exclusiveMaximum: 5,
250250
exclusiveMinimum: -3,
251251
})
252252
})
253253

254-
// todo: implement
255-
it.skip("handles openapi 3.0 boolean exclusiveMaximum / exclusiveMinimum modifiers (true)", () => {
254+
it("handles openapi 3.0 boolean exclusiveMaximum / exclusiveMinimum modifiers (true)", () => {
256255
const actual = schemaNormalizer.normalize({
257256
type: "number",
258257
format: "int64",
@@ -272,8 +271,7 @@ describe("core/input - SchemaNormalizer", () => {
272271
})
273272
})
274273

275-
// todo: implement
276-
it.skip("handles openapi 3.0 boolean exclusiveMaximum / exclusiveMinimum modifiers (false)", () => {
274+
it("handles openapi 3.0 boolean exclusiveMaximum / exclusiveMinimum modifiers (false)", () => {
277275
const actual = schemaNormalizer.normalize({
278276
type: "number",
279277
format: "int64",

packages/openapi-code-generator/src/core/input.ts

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -685,18 +685,46 @@ export class SchemaNormalizer {
685685
Number.isFinite(it),
686686
)
687687

688-
let exclusiveMaximum = schemaObject.exclusiveMaximum
688+
const calcMaximums = () => {
689+
// draft-wright-json-schema-validation-01 changed "exclusiveMaximum"/"exclusiveMinimum" from boolean modifiers
690+
// of "maximum"/"minimum" to independent numeric fields.
691+
// we need to support both.
692+
if (typeof schemaObject.exclusiveMaximum === "boolean") {
693+
if (schemaObject.exclusiveMaximum) {
694+
return {
695+
exclusiveMaximum: schemaObject.maximum,
696+
inclusiveMaximum: undefined,
697+
}
698+
} else {
699+
return {
700+
exclusiveMaximum: undefined,
701+
inclusiveMaximum: schemaObject.maximum,
702+
}
703+
}
704+
}
689705

690-
if (typeof exclusiveMaximum === "boolean") {
691-
logger.warn("boolean exclusiveMaximum not yet supported - ignoring")
692-
exclusiveMaximum = undefined
706+
return {exclusiveMaximum: schemaObject.exclusiveMaximum}
693707
}
694708

695-
let exclusiveMinimum = schemaObject.exclusiveMinimum
709+
const calcMinimums = () => {
710+
// draft-wright-json-schema-validation-01 changed "exclusiveMaximum"/"exclusiveMinimum" from boolean modifiers
711+
// of "maximum"/"minimum" to independent numeric fields.
712+
// we need to support both.
713+
if (typeof schemaObject.exclusiveMinimum === "boolean") {
714+
if (schemaObject.exclusiveMinimum) {
715+
return {
716+
exclusiveMinimum: schemaObject.minimum,
717+
inclusiveMinimum: undefined,
718+
}
719+
} else {
720+
return {
721+
exclusiveMinimum: undefined,
722+
inclusiveMinimum: schemaObject.minimum,
723+
}
724+
}
725+
}
696726

697-
if (typeof exclusiveMinimum === "boolean") {
698-
logger.warn("boolean exclusiveMinimum not yet supported - ignoring")
699-
exclusiveMinimum = undefined
727+
return {exclusiveMinimum: schemaObject.exclusiveMinimum}
700728
}
701729

702730
return {
@@ -706,12 +734,11 @@ export class SchemaNormalizer {
706734
// todo: https://github.com/mnahkies/openapi-code-generator/issues/51
707735
format: schemaObject.format,
708736
enum: enumValues.length ? enumValues : undefined,
709-
exclusiveMaximum,
710-
exclusiveMinimum,
711-
maximum: schemaObject.maximum,
712-
minimum: schemaObject.minimum,
737+
inclusiveMaximum: schemaObject.maximum,
738+
inclusiveMinimum: schemaObject.minimum,
713739
multipleOf: schemaObject.multipleOf,
714-
740+
...calcMaximums(),
741+
...calcMinimums(),
715742
"x-enum-extensibility": enumValues.length
716743
? (schemaObject["x-enum-extensibility"] ??
717744
self.config.enumExtensibility)

packages/openapi-code-generator/src/core/openapi-types-normalized.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ export interface IRModelNumeric extends IRModelBase {
3535
enum?: number[] | undefined
3636
exclusiveMaximum?: number | undefined
3737
exclusiveMinimum?: number | undefined
38-
maximum?: number | undefined
39-
minimum?: number | undefined
38+
inclusiveMaximum?: number | undefined
39+
inclusiveMinimum?: number | undefined
4040
multipleOf?: number | undefined
4141

4242
"x-enum-extensibility"?: "open" | "closed" | undefined

packages/openapi-code-generator/src/typescript/common/schema-builders/joi-schema-builder.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -246,13 +246,13 @@ export class JoiBuilder extends AbstractSchemaBuilder<
246246
: undefined,
247247
Number.isFinite(model.exclusiveMinimum)
248248
? `greater(${model.exclusiveMinimum})`
249-
: Number.isFinite(model.minimum)
250-
? `min(${model.minimum})`
249+
: Number.isFinite(model.inclusiveMinimum)
250+
? `min(${model.inclusiveMinimum})`
251251
: undefined,
252252
Number.isFinite(model.exclusiveMaximum)
253253
? `less(${model.exclusiveMaximum})`
254-
: Number.isFinite(model.maximum)
255-
? `max(${model.maximum})`
254+
: Number.isFinite(model.inclusiveMaximum)
255+
? `max(${model.inclusiveMaximum})`
256256
: undefined,
257257
]
258258
.filter(isDefined)

packages/openapi-code-generator/src/typescript/common/schema-builders/zod-v3-schema-builder.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -259,13 +259,13 @@ export class ZodV3Builder extends AbstractSchemaBuilder<
259259
: undefined,
260260
Number.isFinite(model.exclusiveMinimum)
261261
? `gt(${model.exclusiveMinimum})`
262-
: Number.isFinite(model.minimum)
263-
? `min(${model.minimum})`
262+
: Number.isFinite(model.inclusiveMinimum)
263+
? `min(${model.inclusiveMinimum})`
264264
: undefined,
265265
Number.isFinite(model.exclusiveMaximum)
266266
? `lt(${model.exclusiveMaximum})`
267-
: Number.isFinite(model.maximum)
268-
? `max(${model.maximum})`
267+
: Number.isFinite(model.inclusiveMaximum)
268+
? `max(${model.inclusiveMaximum})`
269269
: undefined,
270270
]
271271
.filter(isDefined)

packages/openapi-code-generator/src/typescript/common/schema-builders/zod-v4-schema-builder.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -262,13 +262,13 @@ export class ZodV4Builder extends AbstractSchemaBuilder<
262262
: undefined,
263263
Number.isFinite(model.exclusiveMinimum)
264264
? `gt(${model.exclusiveMinimum})`
265-
: Number.isFinite(model.minimum)
266-
? `min(${model.minimum})`
265+
: Number.isFinite(model.inclusiveMinimum)
266+
? `min(${model.inclusiveMinimum})`
267267
: undefined,
268268
Number.isFinite(model.exclusiveMaximum)
269269
? `lt(${model.exclusiveMaximum})`
270-
: Number.isFinite(model.maximum)
271-
? `max(${model.maximum})`
270+
: Number.isFinite(model.inclusiveMaximum)
271+
? `max(${model.inclusiveMaximum})`
272272
: undefined,
273273
]
274274
.filter(isDefined)

0 commit comments

Comments
 (0)