11#!/usr/bin/env tsx
22
3- import { execSync } from 'child_process' ;
3+ import { exec } from 'child_process' ;
44import { readFileSync , writeFileSync } from 'fs' ;
55import { join } from 'path' ;
6+ import { promisify } from 'util' ;
7+
8+ const execAsync = promisify ( exec ) ;
69
710// Legacy schema versions that should remain as JSON Schema draft-07
811const LEGACY_SCHEMAS = [ '2024-11-05' , '2025-03-26' , '2025-06-18' ] ;
912
13+ // Modern schema versions that use JSON Schema 2020-12
14+ const MODERN_SCHEMAS = [ '2025-11-25' , 'draft' ] ;
15+
1016// All schema versions to generate
11- const ALL_SCHEMAS = [ ...LEGACY_SCHEMAS , '2025-11-25' , 'draft' ] ;
17+ const ALL_SCHEMAS = [ ...LEGACY_SCHEMAS , ... MODERN_SCHEMAS ] ;
1218
1319// Check if we're in check mode (validate existing schemas match generated ones)
1420const CHECK_MODE = process . argv . includes ( '--check' ) ;
@@ -43,22 +49,19 @@ function applyJsonSchema202012Transformations(schemaPath: string): void {
4349/**
4450 * Generate JSON schema for a specific version
4551 */
46- function generateSchema ( version : string , check : boolean = false ) : boolean {
52+ async function generateSchema ( version : string , check : boolean = false ) : Promise < boolean > {
4753 const schemaDir = join ( 'schema' , version ) ;
4854 const schemaTs = join ( schemaDir , 'schema.ts' ) ;
4955 const schemaJson = join ( schemaDir , 'schema.json' ) ;
5056
5157 if ( check ) {
52- console . log ( `Checking schema for ${ version } ...` ) ;
53-
5458 // Read existing schema
5559 const existingSchema = readFileSync ( schemaJson , 'utf-8' ) ;
5660
5761 // Generate schema to stdout and capture it
5862 try {
59- const generated = execSync (
60- `npx typescript-json-schema --defaultNumberType integer --required --skipLibCheck "${ schemaTs } " "*"` ,
61- { encoding : 'utf-8' }
63+ const { stdout : generated } = await execAsync (
64+ `npx typescript-json-schema --defaultNumberType integer --required --skipLibCheck "${ schemaTs } " "*"`
6265 ) ;
6366
6467 let expectedSchema = generated ;
@@ -86,13 +89,10 @@ function generateSchema(version: string, check: boolean = false): boolean {
8689 throw error ;
8790 }
8891 } else {
89- console . log ( `Generating schema for ${ version } ...` ) ;
90-
9192 // Run typescript-json-schema
9293 try {
93- execSync (
94- `npx typescript-json-schema --defaultNumberType integer --required --skipLibCheck "${ schemaTs } " "*" -o "${ schemaJson } "` ,
95- { stdio : 'inherit' }
94+ await execAsync (
95+ `npx typescript-json-schema --defaultNumberType integer --required --skipLibCheck "${ schemaTs } " "*" -o "${ schemaJson } "`
9696 ) ;
9797 } catch ( error ) {
9898 console . error ( `Failed to generate schema for ${ version } ` ) ;
@@ -101,28 +101,26 @@ function generateSchema(version: string, check: boolean = false): boolean {
101101
102102 // Apply transformations for non-legacy schemas
103103 if ( ! LEGACY_SCHEMAS . includes ( version ) ) {
104- console . log ( `Applying JSON Schema 2020-12 transformations to ${ version } ...` ) ;
105104 applyJsonSchema202012Transformations ( schemaJson ) ;
106105 }
107106
107+ console . log ( ` ✓ Generated schema for ${ version } ` ) ;
108108 return true ;
109109 }
110110}
111111
112112/**
113113 * Main function
114114 */
115- function main ( ) : void {
115+ async function main ( ) : Promise < void > {
116116 if ( CHECK_MODE ) {
117- console . log ( 'Checking JSON schemas...\n' ) ;
117+ console . log ( 'Checking JSON schemas in parallel ...\n' ) ;
118118
119- let allValid = true ;
120- for ( const version of ALL_SCHEMAS ) {
121- const valid = generateSchema ( version , true ) ;
122- if ( ! valid ) {
123- allValid = false ;
124- }
125- }
119+ const results = await Promise . all (
120+ ALL_SCHEMAS . map ( version => generateSchema ( version , true ) )
121+ ) ;
122+
123+ const allValid = results . every ( valid => valid ) ;
126124
127125 console . log ( ) ;
128126 if ( ! allValid ) {
@@ -132,16 +130,19 @@ function main(): void {
132130 console . log ( 'All schemas are up to date!' ) ;
133131 }
134132 } else {
135- console . log ( 'Generating JSON schemas...\n' ) ;
133+ console . log ( 'Generating JSON schemas in parallel ...\n' ) ;
136134
137- for ( const version of ALL_SCHEMAS ) {
138- generateSchema ( version , false ) ;
139- }
135+ await Promise . all (
136+ ALL_SCHEMAS . map ( version => generateSchema ( version , false ) )
137+ ) ;
140138
141139 console . log ( '\nSchema generation complete!' ) ;
142140 console . log ( `- (draft-07): ${ LEGACY_SCHEMAS . join ( ', ' ) } ` ) ;
143- console . log ( `- (2020-12): draft ` ) ;
141+ console . log ( `- (2020-12): ${ MODERN_SCHEMAS . join ( ', ' ) } ` ) ;
144142 }
145143}
146144
147- main ( ) ;
145+ main ( ) . catch ( error => {
146+ console . error ( 'Schema generation failed:' , error ) ;
147+ process . exit ( 1 ) ;
148+ } ) ;
0 commit comments