import { genTsType, GenTsTypeOptions } from '../src/ts-type'; function test( name: string, expectedType: string, data: any, options?: GenTsTypeOptions, ) { let generatedType = genTsType(data, options); if (generatedType !== expectedType) { console.error('failed:', name); console.error('ground truth:', expectedType); console.error('generated type:', generatedType); console.error('data:', data); process.exit(1); } console.log('passed:', name); } test( 'nested Object and Array with formatting', `{ user: string; friends: Array<{ user: string; since: Date; }>; }`, { user: 'Alice', friends: [{ user: 'Bob', since: new Date() }] }, { semi_colon: true }, ); test( 'nested Object and Array with formatting', `{ user: string friends: Array<{ user: string since: Date }> }`, { user: 'Alice', friends: [{ user: 'Bob', since: new Date() }] }, { semi_colon: false }, ); test( 'Array of Object with optional field', `Array<{ name: string; nickname?: string; }>`, [{ name: 'Alice' }, { name: 'Bob', nickname: 'Charlie' }], { union_type: false, semi_colon: true }, ); test( 'Array of Object with optional field', `Array<{ name: string nickname?: string }>`, [{ name: 'Alice' }, { name: 'Bob', nickname: 'Charlie' }], { union_type: false, semi_colon: false }, ); test( 'Nested Object with different types in array (collapse)', `Array<{ items: Array<{ name: string age?: number year?: number }> }>`, [ { items: [{ name: 'Alice', age: 30 }] }, { items: [{ name: 'Alice', year: 2000 }] }, ], { union_type: false }, ); test( 'Nested Object with different types in array (union type)', `Array<{ items: Array<{ name: string age: number } | { name: string year: number }> }>`, [ { items: [{ name: 'Alice', age: 30 }] }, { items: [{ name: 'Alice', year: 2000 }] }, ], { union_type: true }, ); test( 'Object with key having special characters', `{ name: string bin: { 'gen-ts-type': string } devDependencies: { '@types/node': string } mixed_object: { 'no_space': string 'has space': string } }`, { name: 'gen-ts-type', bin: { 'gen-ts-type': 'gen-ts-type.js', }, devDependencies: { '@types/node': '^22.15.18', }, mixed_object: { no_space: 'sample_value', 'has space': 'sample value', }, }, ); test('Set', `Set`, new Set([1, 2])); test('Set with multiple type', `Set`, new Set([1, 2, 'str']), { union_type: true, }); test('Map', `Map`, new Map([['age', 12]])); test('Empty Array', `Array`, []); test('Empty Set', `Set`, new Set()); test('Empty Map', `Map`, new Map()); test('Empty Object', `{}`, {}); test( 'Export Named Type', `export type PackageJSON = { name: string version: string }`, { name: 'gen-ts-type', version: '2.0.0' }, { export: true, name: 'PackageJSON' }, ); test( 'Include Sample Value', `{ name: string /** e.g. "Alice" */ friends: Array<{ name: string /** e.g. "Bob" */ since: Date /** e.g. "2025-05-17T08:30:42.123Z" */ }> }`, { name: 'Alice', friends: [{ name: 'Bob', since: new Date('2025-05-17T08:30:42.123Z') }], }, { include_sample: true, }, );