Skip to content

Commit 48e97e6

Browse files
committed
fix(to-json-schema): do not mark exactOptional entry as required JSON property
1 parent c2b3597 commit 48e97e6

File tree

2 files changed

+41
-21
lines changed

2 files changed

+41
-21
lines changed

packages/to-json-schema/src/converters/convertSchema/convertSchema.test.ts

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -361,8 +361,10 @@ describe('convertSchema', () => {
361361
v.object({
362362
key1: v.string(),
363363
key2: v.optional(v.string()),
364-
key3: v.number(),
365-
key4: v.nullish(v.number()),
364+
key3: v.boolean(),
365+
key4: v.exactOptional(v.boolean()),
366+
key5: v.number(),
367+
key6: v.nullish(v.number()),
366368
}),
367369
undefined,
368370
createContext()
@@ -372,10 +374,12 @@ describe('convertSchema', () => {
372374
properties: {
373375
key1: { type: 'string' },
374376
key2: { type: 'string' },
375-
key3: { type: 'number' },
376-
key4: { anyOf: [{ type: 'number' }, { type: 'null' }] },
377+
key3: { type: 'boolean' },
378+
key4: { type: 'boolean' },
379+
key5: { type: 'number' },
380+
key6: { anyOf: [{ type: 'number' }, { type: 'null' }] },
377381
},
378-
required: ['key1', 'key3'],
382+
required: ['key1', 'key3', 'key5'],
379383
});
380384
});
381385

@@ -387,8 +391,10 @@ describe('convertSchema', () => {
387391
{
388392
key1: v.string(),
389393
key2: v.optional(v.string()),
390-
key3: v.number(),
391-
key4: v.nullish(v.number()),
394+
key3: v.boolean(),
395+
key4: v.exactOptional(v.boolean()),
396+
key5: v.number(),
397+
key6: v.nullish(v.number()),
392398
},
393399
v.number()
394400
),
@@ -400,10 +406,12 @@ describe('convertSchema', () => {
400406
properties: {
401407
key1: { type: 'string' },
402408
key2: { type: 'string' },
403-
key3: { type: 'number' },
404-
key4: { anyOf: [{ type: 'number' }, { type: 'null' }] },
409+
key3: { type: 'boolean' },
410+
key4: { type: 'boolean' },
411+
key5: { type: 'number' },
412+
key6: { anyOf: [{ type: 'number' }, { type: 'null' }] },
405413
},
406-
required: ['key1', 'key3'],
414+
required: ['key1', 'key3', 'key5'],
407415
additionalProperties: { type: 'number' },
408416
});
409417
});
@@ -415,8 +423,10 @@ describe('convertSchema', () => {
415423
v.looseObject({
416424
key1: v.string(),
417425
key2: v.optional(v.string()),
418-
key3: v.number(),
419-
key4: v.nullish(v.number()),
426+
key3: v.boolean(),
427+
key4: v.exactOptional(v.boolean()),
428+
key5: v.number(),
429+
key6: v.nullish(v.number()),
420430
}),
421431
undefined,
422432
createContext()
@@ -426,10 +436,12 @@ describe('convertSchema', () => {
426436
properties: {
427437
key1: { type: 'string' },
428438
key2: { type: 'string' },
429-
key3: { type: 'number' },
430-
key4: { anyOf: [{ type: 'number' }, { type: 'null' }] },
439+
key3: { type: 'boolean' },
440+
key4: { type: 'boolean' },
441+
key5: { type: 'number' },
442+
key6: { anyOf: [{ type: 'number' }, { type: 'null' }] },
431443
},
432-
required: ['key1', 'key3'],
444+
required: ['key1', 'key3', 'key5'],
433445
});
434446
});
435447

@@ -440,8 +452,10 @@ describe('convertSchema', () => {
440452
v.strictObject({
441453
key1: v.string(),
442454
key2: v.optional(v.string()),
443-
key3: v.number(),
444-
key4: v.nullish(v.number()),
455+
key3: v.boolean(),
456+
key4: v.exactOptional(v.boolean()),
457+
key5: v.number(),
458+
key6: v.nullish(v.number()),
445459
}),
446460
undefined,
447461
createContext()
@@ -451,10 +465,12 @@ describe('convertSchema', () => {
451465
properties: {
452466
key1: { type: 'string' },
453467
key2: { type: 'string' },
454-
key3: { type: 'number' },
455-
key4: { anyOf: [{ type: 'number' }, { type: 'null' }] },
468+
key3: { type: 'boolean' },
469+
key4: { type: 'boolean' },
470+
key5: { type: 'number' },
471+
key6: { anyOf: [{ type: 'number' }, { type: 'null' }] },
456472
},
457-
required: ['key1', 'key3'],
473+
required: ['key1', 'key3', 'key5'],
458474
additionalProperties: false,
459475
});
460476
});

packages/to-json-schema/src/converters/convertSchema/convertSchema.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,11 @@ export function convertSchema(
318318
for (const key in valibotSchema.entries) {
319319
const entry = valibotSchema.entries[key] as SchemaOrPipe;
320320
jsonSchema.properties[key] = convertSchema({}, entry, config, context);
321-
if (entry.type !== 'nullish' && entry.type !== 'optional') {
321+
if (
322+
entry.type !== 'exact_optional' &&
323+
entry.type !== 'nullish' &&
324+
entry.type !== 'optional'
325+
) {
322326
jsonSchema.required.push(key);
323327
}
324328
}

0 commit comments

Comments
 (0)