import { strictEqual } from 'assert'; import { AliasDeclarationNode, ArrayExpressionNode, ExportStatementNode, ExtendsClauseNode, GenericExpressionNode, IdentifierNode, ImportClauseNode, ImportStatementNode, InferClauseNode, InterfaceDeclarationNode, LiteralNode, MappedTypeNode, ObjectExpressionNode, PropertyNode, TemplateNode, UnionExpressionNode, } from '../ast'; import { ColumnMetadata, DatabaseMetadata, EnumCollection, TableMetadata, } from '../core'; import { MysqlDialect } from '../dialects'; import { describe, it } from '../test.utils'; import { Transformer } from '../transformer'; import { Serializer } from './serializer'; export const testSerializer = () => { void describe('serializer', () => { const serializer = new Serializer(); void it('serializeAliasDeclaration', () => { strictEqual( serializer.serializeAliasDeclaration( new AliasDeclarationNode('MyType', new LiteralNode('foo')), ), 'type MyType = "foo";', ); strictEqual( serializer.serializeAliasDeclaration( new AliasDeclarationNode( 'Union', new TemplateNode( ['A', 'B'], new UnionExpressionNode([ new IdentifierNode('A'), new IdentifierNode('B'), ]), ), ), ), 'type Union = A | B;', ); }); void it('serializeArrayExpression', () => { strictEqual( serializer.serializeArrayExpression( new ArrayExpressionNode(new IdentifierNode('Json')), ), 'Json[]', ); }); void it('serializeExportStatement', () => { strictEqual( serializer.serializeExportStatement( new ExportStatementNode( new AliasDeclarationNode('MyType', new LiteralNode('foo')), ), ), 'export type MyType = "foo";', ); }); void it('serializeExtendsClause', () => { strictEqual( serializer.serializeExtendsClause( new ExtendsClauseNode( 'A', new IdentifierNode('B'), new IdentifierNode('A'), new IdentifierNode('C'), ), ), 'A extends B\n ? A\n : C', ); }); void it('serializeGenericExpression', () => { strictEqual( serializer.serializeGenericExpression( new GenericExpressionNode('MyType', [ new IdentifierNode('A'), new IdentifierNode('B'), ]), ), 'MyType', ); }); void it('serializeIdentifier', () => { strictEqual( serializer.serializeIdentifier(new IdentifierNode('MyIdentifier')), 'MyIdentifier', ); }); void it('serializeImportClause', () => { strictEqual( serializer.serializeImportClause(new ImportClauseNode('ColumnType')), 'ColumnType', ); strictEqual( serializer.serializeImportClause( new ImportClauseNode('RawBuilder', 'R'), ), 'RawBuilder as R', ); }); void it('serializeImportStatement', () => { strictEqual( serializer.serializeImportStatement( new ImportStatementNode('kysely', [ new ImportClauseNode('ColumnType'), new ImportClauseNode('RawBuilder', 'R'), ]), ), 'import type { ColumnType, RawBuilder as R } from "kysely";', ); }); void it('serializeInferClause', () => { strictEqual( serializer.serializeInferClause(new InferClauseNode('A')), 'infer A', ); }); void it('serializeInterfaceDeclaration', () => { strictEqual( serializer.serializeInterfaceDeclaration( new InterfaceDeclarationNode( 'MyInterface', new ObjectExpressionNode([ new PropertyNode('foo', new LiteralNode('bar')), ]), ), ), 'interface MyInterface {\n foo: "bar";\n}', ); }); void it('serializeLiteral', () => { strictEqual(serializer.serializeLiteral(new LiteralNode('foo')), '"foo"'); }); void it('serializeMappedType', () => { strictEqual( serializer.serializeMappedType( new MappedTypeNode(new IdentifierNode('Json')), ), '{\n [K in string]?: Json;\n}', ); }); void it('serializeObjectExpression', () => { strictEqual( serializer.serializeObjectExpression(new ObjectExpressionNode([])), '{}', ); strictEqual( serializer.serializeObjectExpression( new ObjectExpressionNode([ new PropertyNode('bar baz', new IdentifierNode('BarBaz')), new PropertyNode('foo', new IdentifierNode('Foo')), ]), ), '{\n "bar baz": BarBaz;\n foo: Foo;\n}', ); }); void describe('serializeObjectExpression', () => { void it('should order fields properly', () => { strictEqual( serializer.serializeObjectExpression( new ObjectExpressionNode([ new PropertyNode('zip', new IdentifierNode('Num7')), new PropertyNode('avocado field', new IdentifierNode('Num3')), new PropertyNode('brachiosaurus', new IdentifierNode('Num4')), new PropertyNode('Zoo_field', new IdentifierNode('Num1')), new PropertyNode('jc_33', new IdentifierNode('Num5')), new PropertyNode('HelloField', new IdentifierNode('Num0')), new PropertyNode('typescript_LANG', new IdentifierNode('Num6')), new PropertyNode('_TEST', new IdentifierNode('Num2')), ]), ), `{ _TEST: Num2; "avocado field": Num3; brachiosaurus: Num4; HelloField: Num0; jc_33: Num5; typescript_LANG: Num6; zip: Num7; Zoo_field: Num1; }`, ); }); }); void it('serializeProperty', () => { strictEqual( serializer.serializeProperty( new PropertyNode('foo', new IdentifierNode('Foo')), ), 'foo: Foo;\n', ); strictEqual( serializer.serializeProperty( new PropertyNode('bar baz', new IdentifierNode('BarBaz')), ), '"bar baz": BarBaz;\n', ); }); void it('serializeUnionExpression', () => { strictEqual( serializer.serializeUnionExpression( new UnionExpressionNode([ new IdentifierNode('JsonArray'), new IdentifierNode('JsonObject'), new IdentifierNode('JsonPrimitive'), ]), ), 'JsonArray | JsonObject | JsonPrimitive', ); }); void describe('serializeUnionExpression', () => { void it('should order union constituents properly', () => { strictEqual( serializer.serializeUnionExpression( new UnionExpressionNode([ new IdentifierNode('z_TYPE'), new IdentifierNode('undefined'), new IdentifierNode('Aa_Type'), new IdentifierNode('AA3Type'), new IdentifierNode('Z_TYPE'), new IdentifierNode('HType'), new IdentifierNode('null'), new IdentifierNode('AA_Type'), new IdentifierNode('Aa3Type'), ]), ), 'AA3Type | AA_Type | Aa3Type | Aa_Type | HType | Z_TYPE | z_TYPE | null | undefined', ); }); }); void describe('serialize', () => { void it('should serialize JSON fields properly', () => { const dialect = new MysqlDialect(); const enums = new EnumCollection(); const transformer = new Transformer(); const ast = transformer.transform({ camelCase: true, dialect, metadata: new DatabaseMetadata( [ new TableMetadata({ columns: [ new ColumnMetadata({ dataType: 'json', hasDefaultValue: false, isAutoIncrementing: false, isNullable: false, name: 'json', }), ], name: 'foo', schema: 'public', }), ], enums, ), }); strictEqual( serializer.serialize(ast), 'import type { ColumnType } from "kysely";\n' + '\n' + 'export type Json = ColumnType;\n' + '\n' + 'export type JsonArray = JsonValue[];\n' + '\n' + 'export type JsonObject = {\n' + ' [K in string]?: JsonValue;\n' + '};\n' + '\n' + 'export type JsonPrimitive = boolean | number | string | null;\n' + '\n' + 'export type JsonValue = JsonArray | JsonObject | JsonPrimitive;\n' + '\n' + 'export interface Foo {\n' + ' json: Json;\n' + '}\n' + '\n' + 'export interface DB {\n' + ' foo: Foo;\n' + '}\n', ); }); }); }); };