From ff7d7b7667f5996ce5bf0cbeeb22ec8d644a5777 Mon Sep 17 00:00:00 2001 From: Mike Wu Date: Thu, 29 Aug 2024 11:43:30 +0900 Subject: [PATCH] fix: break out Parameter into separate types (#68) --- src/lib/blueprint.ts | 120 ++++++++++++++++++--- test/snapshots/seam-blueprint.test.ts.md | 6 +- test/snapshots/seam-blueprint.test.ts.snap | Bin 3704 -> 3701 bytes 3 files changed, 109 insertions(+), 17 deletions(-) diff --git a/src/lib/blueprint.ts b/src/lib/blueprint.ts index 3e8c752..3473695 100644 --- a/src/lib/blueprint.ts +++ b/src/lib/blueprint.ts @@ -50,17 +50,67 @@ export interface Endpoint { codeSamples: CodeSample[] } -export interface Parameter { +interface BaseParameter { name: string isRequired: boolean isUndocumented: boolean isDeprecated: boolean deprecationMessage: string description: string - jsonType: string - format: string } +interface StringParameter extends BaseParameter { + format: 'string' + jsonType: 'string' +} + +interface EnumParameter extends BaseParameter { + format: 'enum' + jsonType: 'string' + values: EnumValue[] +} + +interface RecordParameter extends BaseParameter { + format: 'record' + jsonType: 'object' +} + +interface ListParameter extends BaseParameter { + format: 'list' + jsonType: 'array' +} + +interface BooleanParameter extends BaseParameter { + format: 'boolean' + jsonType: 'boolean' +} + +interface ObjectParameter extends BaseParameter { + format: 'object' + jsonType: 'object' + parameters: Parameter[] +} + +interface DatetimeParameter extends BaseParameter { + format: 'datetime' + jsonType: 'string' +} + +interface IdParameter extends BaseParameter { + format: 'id' + jsonType: 'string' +} + +export type Parameter = + | StringParameter + | EnumParameter + | RecordParameter + | ListParameter + | BooleanParameter + | ObjectParameter + | DatetimeParameter + | IdParameter + export interface Request { methods: Method[] semanticMethod: Method @@ -354,21 +404,63 @@ const createRequestBody = (operation: OpenapiOperation): Parameter[] => { return [] } - const requiredProperties = schema.required ?? [] + return createParameters(schema.properties, schema.required) +} - return Object.entries(schema.properties).map( +const createParameters = ( + properties: Record, + requiredParameters: string[] = [], +): Parameter[] => { + return Object.entries(properties).map( ([name, property]: [string, any]): Parameter => { - const parsedProperty = PropertySchema.parse(property) + const parsedProp = PropertySchema.parse(property) - return { + const baseParam: BaseParameter = { name, - jsonType: parsedProperty.type, - format: property.format, - description: parsedProperty.description, - isRequired: requiredProperties.includes(name), - isDeprecated: parsedProperty.deprecated, - isUndocumented: parsedProperty['x-undocumented'].length > 0, - deprecationMessage: parsedProperty['x-deprecated'], + description: parsedProp.description, + isRequired: requiredParameters.includes(name), + isDeprecated: parsedProp['x-deprecated'].length > 0, + deprecationMessage: parsedProp['x-deprecated'], + isUndocumented: parsedProp['x-undocumented'].length > 0, + } + + switch (parsedProp.type) { + case 'string': + if (parsedProp.enum !== undefined) { + return { + ...baseParam, + format: 'enum', + jsonType: 'string', + values: parsedProp.enum.map((value: any) => ({ + name: value, + })), + } + } + if (parsedProp.format === 'date-time') { + return { ...baseParam, format: 'datetime', jsonType: 'string' } + } + if (parsedProp.format === 'uuid') { + return { ...baseParam, format: 'id', jsonType: 'string' } + } + return { ...baseParam, format: 'string', jsonType: 'string' } + case 'boolean': + return { ...baseParam, format: 'boolean', jsonType: 'boolean' } + case 'array': + return { ...baseParam, format: 'list', jsonType: 'array' } + case 'object': + if (parsedProp.properties !== undefined) { + return { + ...baseParam, + format: 'object', + jsonType: 'object', + parameters: createParameters( + parsedProp.properties as Record, + ), + } + } + return { ...baseParam, format: 'record', jsonType: 'object' } + default: + throw new Error(`Unsupported property type: ${parsedProp.type}`) } }, ) diff --git a/test/snapshots/seam-blueprint.test.ts.md b/test/snapshots/seam-blueprint.test.ts.md index 0098227..abe2505 100644 --- a/test/snapshots/seam-blueprint.test.ts.md +++ b/test/snapshots/seam-blueprint.test.ts.md @@ -251,7 +251,7 @@ Generated by [AVA](https://avajs.dev). { deprecationMessage: '', description: 'ID of the desired access control system.', - format: 'uuid', + format: 'id', isDeprecated: false, isRequired: true, isUndocumented: false, @@ -289,7 +289,7 @@ Generated by [AVA](https://avajs.dev). { deprecationMessage: '', description: 'ID of the connected account by which to filter the list of returned access control systems.', - format: 'uuid', + format: 'id', isDeprecated: false, isRequired: false, isUndocumented: false, @@ -327,7 +327,7 @@ Generated by [AVA](https://avajs.dev). { deprecationMessage: '', description: 'ID of the ACS system for which you want to retrieve all compatible credential manager ACS systems.', - format: 'uuid', + format: 'id', isDeprecated: false, isRequired: true, isUndocumented: false, diff --git a/test/snapshots/seam-blueprint.test.ts.snap b/test/snapshots/seam-blueprint.test.ts.snap index 82003febc982bc0c580f7db090d9155930a581e4..b03914a3e5bd5122215732411d5a26bd6bb8076e 100644 GIT binary patch literal 3701 zcmV-*4vO(XRzVc?Cl==-pRR;Aqj<+9~1J6`~iU$!UV`LO{N1(7?P3<5K5=e7MONI z!?;ax=m68ELx8p^3FPhG-jBDEC1LC0(0E2O?{+`m@B6;*_p{&k_Py`=)ALEw)^1^U zJxsa5O=@cnC7fPtW@*MTEN(E1WLV1P?5>A(opAC;GuKz47UG{0QNsHG90YJZ02{z2 zrDmg2b9M4&s&PdrG@F~7p)^3Lg3_oc9|N#iw5vBNbq-~A*3l?)Z#`3TtH!ajTwHI$ zCMD!wt#D&SjH!1tX0_WqR0AkAZu550taY1D zie|*aie{aMt%cjQz=~$QhZW5YZu1qoj;U2 z>k32p>pE{J-ebEwC&Gdg!nKjcD6lyS9F79HDDd$p@K;gb-=aWWz2x$0`Pq$()&rCE zfL0ImH2{}20OXDPpsEpwH3APd0Z%por<;JPW?-;c60Z%2Cz=7; z4BXQU^tS+4v;cMs@X;3FsTN5*5)l7Y3-Es}z|Kv;OPhh#R$!tPxTzI*f2$;37ZCq$ zEAWF>;MG>(Q(J&0}&M%RwePR0ry>_0`E|P2UXxJD)77tyru%ZJ-}r>fYT$X=nPo!p&sDg9^gkk zz;Aniz8%1&I{0fya9#@&17Lzw`nx z_5w|Pz)gL?oqfP(`haiu0sq-2iC+{D-?S6x*a;ln34DJi@bXSzOFuBx4I+0H6;5?-`KP>ov+hMjLG zg+8Giw{$}cjj5+nl&7c@@R-W7nT+jlrp^&vH>?FU%c#RtZmanv;eumlGwj@!g2RL{ zW5F`4g_x^8#_d=h;i>N>x*j7|jA+b7xB#mRvujA5rBo#*v(>p7&$dg&jaZT}s;l`+ zNAoM#S+D1Fv^#6*)M1=h!Zp4*`9*Rb6w{6QdFoJ0qpY{oV9&0lh1|vQ*{E8Zv~80T zt5SSjroS@6_G`pS5M56Q{+1 zr%Sk79{1jiLo>voF`lBaOv<(>i_P0kjCia!TrE5&=+8KDc+8<1H5QlYD$86}TCw7Y zVf_j z#j3S1#6*6G2}56xsEi#WoT|jqRc@rIO1OF|WoSY7si#PO3Z(i9u8in}Q=#nwdhd$n zO;3<@SV$-XmpG2?us<*k)=+m;uD>GZ)nDTmJH*msEJHP8-q2J|owQ-uroE6`av7`g zT!yaXJZfdr7ZBqb=&hVO7BLgTc=wb+A1XP;S|nzcuE!I7<1vF}Op;TDH7ZXLu4=a9 zP?oVR-F?Xy?oFQm2rTWCH!=oW%VLnwJ;x*jWE~v8XU24UgOG0^L31>C(EArz{r4*6!wmmfa6=g7U0mF_ozKB{kL8slF;2oppQ2x$)8|GaPRhCD@gk z%&CT@nOXOYPr!>W0^-Wavct%es$sbxhrTOI8CR3Go|8FnzCv79d(&K6k2SnNxf{9A za4~YVd7IoD<0UsD-f)<_*HBயTMaA39(b@dQVhKZ1!xdo2dzB(XM6wdkFfq+# zIC75Lo`NLT+UmR^-bdV!`dvD%5zFy~3BnW@tf_%bI`#OmJ$Xh^S8w#>Qu|a(Gf6!@ zujcHmYNrkE<(j2sGsGcj%Bi!*>%xz)-!XF?x6A;FCUaZ#=BS0dP!TF`ETghFEj232 z`Dx}6GeG*KL6qBzJz zevpZx-Cnh9O?(+PPsZ2E<{_8OM~gl_TJ-UiB|a{2J)+c^alnZKx5t4$jRW_`fltPP z&&Po;#(}TJ%Zq0lrQ+GTzlj5X9|wLI2hPNSm*T)HaiDqxXdVGNN6Hm+l`AN_7n77% z_m2R3Mu1C305SsHJtCD!4F$@*zcK=RZ3H+YpnHLty^_e@vlaG^$rf090lpWwdoS?l zUf>^Pb>jgGFbdR+0((Y*xl!Olqmszv*({inEqH1a`1`&>X#Qs$Nj3`k?}&+?+xRH0_Ho$3kA%d9WN9xe|Nl4!2HYc zLIHEUqN~G{(|y7`wPlv_j}3t)#H0POvfz=vg6YXJ7_B=EN~Y)b(4>q+1@GORlQ>p1{ibU=b_ z3&5^80GyCv+XJxN0pJc9rUqb-9snMfVLbuZO9y~o$*>&(Snm|DYf6Ik24LD0V92n( z0PLevz{jV`7cRr{XG4!q0biCtaT)aV6!5GB+9!klc?$Sf3AA4Z{cH;OF9~!=22~#f z>JOHK4lnV^-C6eAGTcZogVR+&iOEUAb{1BKMj0`=y-K|eNyk{U{rA|F@x3WSUuvms zI}5}zZgXGFR@SnyWS_R=lex3XbQ8u%f+S5lS84#G&Z42MVx)~G;aVz@%o?Wd?#aCs zoeMcS-p8mLgg{~T&QGv~?^Ih4x~tsPKyO$*^r3_KuV3p<9|X=E1R4(kHy#4seF*ro zL%`FAfHQ}H`omIo8wq?}G=3PEIt`SoqT&;DpdB2lp;lg&%*zpg_-lEr|W@2$5=#^nuqLa0fS T)HIU*f4%TKEUIU;n?V2oMj08; literal 3704 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