import { autoProperty, autoRelation, mapFromPrismaSchema, prismaSchemaBuilder, } from './'; import { EntityIdInput } from './test-data'; // Define our model types type AddressModel = { country: string; }; type UserModel = { name: string; email: string; age?: number; address: AddressModel; }; // Define Prisma input types (simplified for // these are typically generated by grahql-codegen this example) type AddressInput = { country: string; }; type AddressCreateInput = AddressInput; type AddressUpdateInput = Partial; type UserCreateInput = Omit & { address: { create: AddressCreateInput; connect?: EntityIdInput | null; } | null; }; type UserUpdateInput = Partial> & { address?: { update: AddressUpdateInput; connect?: EntityIdInput | null }; }; // Create schemas const addressSchema = prismaSchemaBuilder< AddressCreateInput, AddressUpdateInput, AddressModel >({ props: { country: autoProperty({ set: true }), }, create: {}, update: {}, }); const userSchema = prismaSchemaBuilder< UserCreateInput, UserUpdateInput, UserModel >({ props: { name: autoProperty({ set: true }), email: autoProperty({ set: true }), age: autoProperty({ set: true }), address: autoRelation(() => addressSchema.relation()), }, create: {}, update: {}, }); if (!userSchema.updateSchema) { throw new Error('Update schema is required'); } if (!userSchema.createSchema) { throw new Error('Create schema is required'); } // Sample data const userFactory = (): Partial => ({ name: 'John Doe', email: 'john@example.com', age: 30, address: { country: 'USA', }, }); // Function to demonstrate create operation function demonstrateCreate(model: Partial) { console.log('--- Create Operation ---'); console.log('Input Model:'); console.log(JSON.stringify(model, null, 2)); if (!userSchema.createSchema) { throw new Error('Create schema is required'); } const createInput = mapFromPrismaSchema({ schema: userSchema.createSchema, value: model, }); console.log('\nPrisma Create Input:'); console.log(JSON.stringify(createInput, null, 2)); } // Function to demonstrate update operation function demonstrateUpdate( model: Partial, oldModel: Partial, ) { console.log('\n--- Update Operation ---'); console.log('Update Model:'); console.log(JSON.stringify(model, null, 2)); if (!userSchema.updateSchema) { throw new Error('Update schema is required'); } const updateInput = mapFromPrismaSchema({ schema: userSchema.updateSchema, value: model, oldValue: oldModel, }); console.log('\nPrisma Update Input:'); console.log(JSON.stringify(updateInput, null, 2)); } // Run demonstrations demonstrateCreate(userFactory()); demonstrateUpdate( { email: 'johndoe@example.com', address: { country: 'Switzerland', }, }, userFactory(), ); // Example of a more complex update demonstrateUpdate( { age: 31, address: { country: 'Italy', }, }, userFactory(), );