From 8235a42caa457ea00a966a25de1b3acfa777b955 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Sat, 29 Apr 2023 01:56:08 +0800 Subject: [PATCH] Upgrade Prisma (#770) upgrade prisma --- Cargo.lock | Bin 234537 -> 233910 bytes Cargo.toml | 12 +-- crates/sync-generator/src/attribute/mod.rs | 7 +- crates/sync-generator/src/lib.rs | 105 +++++++++++---------- 4 files changed, 64 insertions(+), 60 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0f5f2857274d1d2e4ba74395b8b6f404498f979f..a2fdc3461922679b00d0f1a86d47e6103598510e 100644 GIT binary patch delta 3548 zcmcInTWnNS6wTQ~JDs-l0cECT8fd5TQd;k8?!!DVi`Gj_Zn$3@&b5Q>Jw&9V!ktLuPWtrq-1>HJ@zm%Bl*dn(lB<)tTklu4+<^ z8MddHx+^SZcs9?Prl(LZYrBr3D!OV|I=4*fF;(CfUaWDlwJ=;aIkI=pk_f2c)%~zw za%kks$_T)MgJTP3-#vM3?7evK=GiR~pkhZe)CS5qJxHxg;>43AHF^BpP;Id6;v>PP z%SpU*IJSB6)TM9z@T@~N)kYC6P8H;BG` zi!Wa7)VXb#hNdamtfFh2%35p_|9_ptvLdqX%(x(^QR=qU)IA0Trmy{<{niW zBv&rRre%`$_(`Y=OB>)|Br%76hHCt{4-)t?h5D+NjK8B;;_bb(7z}Pt<1mGnqIjB= zfo|++g%_g$Yd%0)&^QeXaU>OM!dDKEt>v>z{b(MVaKt8^5rml*Vyw$R74AMrIveF+ z->V+EoZzLrFC}DYVz9q`mH?7NKr}WYXan7IO^2ZE56$(1XFXNu+0BJq-5aXTz~Ycy}@5c~wl!G?=Hmrm9Phs%z*bXOt_{)ookXYy*!a zB_<;fGaG)Z@;jF1(VA@d&U`8uo^TGZ)uP P7yaWp!o#W92XFih$E6+} delta 3593 zcmb_fTWl0%6waJ2Y-vkxYZuIL79NS2@ymD5;GAR?DXd}G#Nb$o zH3XKoMcyE$&GM3|aRMPMk#yD&Md$pUFkYS);PQWWJzY7ar_buMoJ%wGBu7kZ!>g$`_fAV0ENh5QViD7prAo!?? zl^sx8MEX)DwhqDk@dHpFgxVJg!P=jm-6g%POT6{SQjd-L3B5qh_R#x~q;*U_E+ZH7JW$R1|1m565OSl+iZV|`Rbh4Buw`ARR5f)@BC1MQo-=ey5;#-Go+c*jwd79S#|#JELoYD_ z5#LP)!q~c+VtDBjW~VO#qp(M(w~Ib0iH z=(1w;Mqj9f@4-)Jo_xAgJ{$aidMFT><*i)Bb1^6xH*Xw`!2|f?{ZI+nK3q5mO}KXs zgmGOQYKl{xiN4-cI){23W@4A8-tV1&68xjVWgN=;uEc~0e8kJw|+08cXzB63eHpRE=s~7U*(^l2IU?_f|!Xz z71nH{i|Tn4Hu`Cqir})~b(6k3N#mE3w96kT$hdX+gnnmC$$5zY=j>qW-2N@l-Zsg$ zIhL7Om80f!n^)e&&@d3A*ew{M%l&kO3D-F z>Iu`zk!;GavUr|Qe^{KPhWf=UD8{RCD8tvIG?LH|GV^x-^qYCSe21rFlud0z&=f61 z@q*1vG@|Qi;%4(0OhWY{(;PRiJ9c_&+(ISq`Ts`5o_)+c<8!S%4l8i(G1xLmSiQdp zyp`N22z74tAgpHa&~aZ^oJNQ$d^JX|B29xcadd=w!HXxTsE7lUna&VIJq+<}Pl Attribute<'a> { } } -pub fn model_attributes(model: &dml::Model) -> Vec { +pub fn model_attributes(model: ModelWalker) -> Vec { model - .documentation + .ast_model() + .documentation() .as_ref() .map(|docs| docs.lines().flat_map(Attribute::parse).collect()) .unwrap_or_default() diff --git a/crates/sync-generator/src/lib.rs b/crates/sync-generator/src/lib.rs index d267850fa..f8fa830b3 100644 --- a/crates/sync-generator/src/lib.rs +++ b/crates/sync-generator/src/lib.rs @@ -2,7 +2,10 @@ mod attribute; use attribute::*; -use prisma_client_rust_sdk::prelude::*; +use prisma_client_rust_sdk::{ + prelude::*, + prisma::prisma_models::walkers::{FieldWalker, ModelWalker, RefinedFieldWalker}, +}; #[derive(Debug, serde::Serialize, thiserror::Error)] enum Error {} @@ -10,10 +13,10 @@ enum Error {} #[derive(serde::Deserialize)] struct SDSyncGenerator {} -type FieldVec<'a> = Vec<&'a dml::Field>; +type FieldVec<'a> = Vec>; -#[derive(Debug)] #[allow(unused)] +#[derive(Clone)] enum ModelSyncType<'a> { Local { id: FieldVec<'a>, @@ -31,7 +34,7 @@ enum ModelSyncType<'a> { } impl<'a> ModelSyncType<'a> { - fn from_attribute(attr: Attribute, model: &'a dml::Model) -> Option { + fn from_attribute(attr: Attribute, model: ModelWalker<'a>) -> Option { let id = attr .field("id") .map(|field| match field { @@ -40,16 +43,15 @@ impl<'a> ModelSyncType<'a> { }) .unwrap_or_else(|| { model - .primary_key + .primary_key() .as_ref() .unwrap() - .fields - .iter() - .map(|f| f.name.as_str()) + .fields() + .map(|f| f.name()) .collect() }) .into_iter() - .flat_map(|name| model.find_field(name)) + .flat_map(|name| model.fields().find(|f| f.name() == name)) .collect(); Some(match attr.name { @@ -60,7 +62,7 @@ impl<'a> ModelSyncType<'a> { }) } - fn sync_id(&self) -> Vec<&dml::Field> { + fn sync_id(&self) -> Vec { match self { Self::Owned { id } => id.clone(), Self::Local { id } => id.clone(), @@ -90,21 +92,22 @@ impl PrismaGenerator for SDSyncGenerator { type Error = Error; fn generate(self, args: GenerateArgs) -> Result { - let models_with_attributes = args - .dml - .models() - .map(|model| (model, model_attributes(model))); + let db = &args.schema.db; - let models_with_sync_types = models_with_attributes.map(|(model, attributes)| { - let sync_type = attributes - .into_iter() - .find_map(|a| ModelSyncType::from_attribute(a, model)); + let models_with_sync_types = db + .walk_models() + .map(|model| (model, model_attributes(model))) + .map(|(model, attributes)| { + let sync_type = attributes + .into_iter() + .find_map(|a| ModelSyncType::from_attribute(a, model)); - (model, sync_type) - }); + (model, sync_type) + }) + .collect::>(); - let model_modules = models_with_sync_types.clone().map(|(model, sync_type)| { - let model_name_snake = snake_ident(&model.name); + let model_modules = models_with_sync_types.clone().into_iter().map(|(model, sync_type)| { + let model_name_snake = snake_ident(model.name()); let sync_id = sync_type.as_ref() .map(|sync_type| { @@ -112,15 +115,14 @@ impl PrismaGenerator for SDSyncGenerator { let fields = fields.iter().flat_map(|field| { let name_snake = snake_ident(field.name()); - let typ = match field { - dml::Field::ScalarField(_) => { + let typ = match field.refine() { + RefinedFieldWalker::Scalar(_) => { field.type_tokens("e!(self)) }, - dml::Field::RelationField(relation)=> { - let relation_model_name_snake = snake_ident(&relation.relation_info.referenced_model); + RefinedFieldWalker::Relation(relation)=> { + let relation_model_name_snake = snake_ident(relation.related_model().name()); Some(quote!(super::#relation_model_name_snake::SyncId)) }, - _ => return None }; Some(quote!(pub #name_snake: #typ)) @@ -149,32 +151,33 @@ impl PrismaGenerator for SDSyncGenerator { let field_name_snake_str = field_name_snake.to_string(); - match field { - dml::Field::ScalarField(_) => { + match field.refine() { + RefinedFieldWalker::Scalar(_) => { Some(quote! { #field_name_snake_str => #model_name_snake::#field_name_snake::set(::serde_json::from_value(val).unwrap()), }) }, - dml::Field::RelationField(relation_field) => { - let relation_model_name_snake = snake_ident(&relation_field.relation_info.referenced_model); + RefinedFieldWalker::Relation(relation_field) => { + let relation_model_name_snake = snake_ident(relation_field.related_model().name()); - match &relation_field.relation_info.references[..] { - [_] => { - Some(quote! { - #field_name_snake_str => { - let val: std::collections::HashMap = ::serde_json::from_value(val).unwrap(); - let val = val.into_iter().next().unwrap(); + match relation_field.referenced_fields() { + Some(i) => { + if i.count() == 1 { + Some(quote! { + #field_name_snake_str => { + let val: std::collections::HashMap = ::serde_json::from_value(val).unwrap(); + let val = val.into_iter().next().unwrap(); - #model_name_snake::#field_name_snake::connect( - #relation_model_name_snake::UniqueWhereParam::deserialize(&val.0, val.1).unwrap() - ) - }, - }) + #model_name_snake::#field_name_snake::connect( + #relation_model_name_snake::UniqueWhereParam::deserialize(&val.0, val.1).unwrap() + ) + }, + }) + } else { None } }, _ => None } }, - _ => None } }); @@ -195,11 +198,10 @@ impl PrismaGenerator for SDSyncGenerator { let unique_param_impl = { let field_matches = model - .loose_unique_criterias() - .iter() - .flat_map(|criteria| match &criteria.fields[..] { - [field] => { - let unique_field_name_str = &field.name; + .unique_criterias() + .flat_map(|criteria| match &criteria.fields().next() { + Some(field) if criteria.fields().len() == 1 => { + let unique_field_name_str = field.name(); let unique_field_name_snake = snake_ident(unique_field_name_str); Some(quote!(#unique_field_name_str => @@ -242,10 +244,11 @@ impl PrismaGenerator for SDSyncGenerator { let model_sync_data = { let (variants, matches): (Vec<_>, Vec<_>) = models_with_sync_types + .into_iter() .filter_map(|(model, sync_type)| { - let model_name_snake = snake_ident(&model.name); - let model_name_pascal = pascal_ident(&model.name); - let model_name_str = &model.name; + let model_name_snake = snake_ident(model.name()); + let model_name_pascal = pascal_ident(model.name()); + let model_name_str = model.name(); sync_type.and_then(|a| { let data_type = match a {