Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions schema/2025-11-25/schema.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions schema/draft/schema.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

40 changes: 40 additions & 0 deletions scripts/generate-schemas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,31 @@ const ALL_SCHEMAS = [...LEGACY_SCHEMAS, ...MODERN_SCHEMAS];
// Check if we're in check mode (validate existing schemas match generated ones)
const CHECK_MODE = process.argv.includes('--check');

/**
* Fix NumberSchema properties that should be `number` type instead of `integer`.
*
* The `--defaultNumberType integer` flag used during schema generation converts
* all TypeScript `number` types to JSON Schema `integer`. This is correct for
* most fields (request IDs, ports, etc.) but wrong for `NumberSchema.minimum`,
* `NumberSchema.maximum`, and `NumberSchema.default`, which must accept number
* values because they define constraints for schemas with `"type": "number"`.
*/
function fixNumberSchemaTypes(schemaPath: string): void {
let content = readFileSync(schemaPath, 'utf-8');
const schema = JSON.parse(content);

const numberSchema = schema.$defs?.NumberSchema ?? schema.definitions?.NumberSchema;
if (numberSchema?.properties) {
for (const prop of ['minimum', 'maximum', 'default']) {
if (numberSchema.properties[prop]?.type === 'integer') {
numberSchema.properties[prop].type = 'number';
}
}
}

writeFileSync(schemaPath, JSON.stringify(schema, null, 2) + '\n', 'utf-8');
Comment on lines +32 to +44
}

/**
* Apply JSON Schema 2020-12 transformations to a schema file
*/
Expand Down Expand Up @@ -76,6 +101,18 @@ async function generateSchema(version: string, check: boolean = false): Promise<
expectedSchema = expectedSchema.replace(/#\/definitions\//g, '#/$defs/');
}

// Fix NumberSchema properties that were incorrectly converted to integer
const parsedSchema = JSON.parse(expectedSchema);
const numberSchema = parsedSchema.$defs?.NumberSchema ?? parsedSchema.definitions?.NumberSchema;
if (numberSchema?.properties) {
for (const prop of ['minimum', 'maximum', 'default']) {
if (numberSchema.properties[prop]?.type === 'integer') {
numberSchema.properties[prop].type = 'number';
}
}
}
expectedSchema = JSON.stringify(parsedSchema, null, 2) + '\n';

// Compare
if (existingSchema.trim() !== expectedSchema.trim()) {
console.error(` ✗ Schema ${version} is out of date!`);
Comment on lines +104 to 118
Expand All @@ -99,6 +136,9 @@ async function generateSchema(version: string, check: boolean = false): Promise<
throw error;
}

// Fix NumberSchema properties that were incorrectly converted to integer
fixNumberSchemaTypes(schemaJson);

// Apply transformations for non-legacy schemas
if (!LEGACY_SCHEMAS.includes(version)) {
applyJsonSchema202012Transformations(schemaJson);
Expand Down
Loading