From ebd1f25dd74937c27bdf58c539438dcb1fa166bc Mon Sep 17 00:00:00 2001 From: lcawl Date: Fri, 27 Sep 2024 14:40:12 -0700 Subject: [PATCH 1/9] Add doc_tag --- compiler-rs/clients_schema/src/lib.rs | 3 +++ .../clients_schema_to_openapi/src/paths.rs | 2 +- .../clients_schema_to_openapi/src/schemas.rs | 2 +- .../pkg/compiler_wasm_lib_bg.wasm | Bin 621769 -> 622496 bytes compiler/src/model/build-model.ts | 1 + compiler/src/model/json-spec.ts | 1 + compiler/src/model/metamodel.ts | 2 +- compiler/src/model/utils.ts | 5 ++++- 8 files changed, 12 insertions(+), 4 deletions(-) diff --git a/compiler-rs/clients_schema/src/lib.rs b/compiler-rs/clients_schema/src/lib.rs index 17d8c70ed0..7df0bc82e7 100644 --- a/compiler-rs/clients_schema/src/lib.rs +++ b/compiler-rs/clients_schema/src/lib.rs @@ -815,6 +815,9 @@ pub struct Endpoint { #[serde(skip_serializing_if = "Option::is_none")] pub availability: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub doc_tag: Option, + /// If missing, there is not yet a request definition for this endpoint. #[serde(skip_serializing_if = "Option::is_none")] pub request: Option, diff --git a/compiler-rs/clients_schema_to_openapi/src/paths.rs b/compiler-rs/clients_schema_to_openapi/src/paths.rs index 7fc7f480a8..719a612d55 100644 --- a/compiler-rs/clients_schema_to_openapi/src/paths.rs +++ b/compiler-rs/clients_schema_to_openapi/src/paths.rs @@ -196,7 +196,7 @@ pub fn add_endpoint( // Create the operation, it will be repeated if we have several methods let operation = openapiv3::Operation { - tags: vec![namespace.to_string()], + tags: if endpoint.doc_tag.is_some() {vec![endpoint.doc_tag.clone().expect("TODO: panic message")]} else {vec![namespace.to_string()]}, summary: sum_desc.summary, description: sum_desc.description, // external_docs: tac.convert_external_docs(endpoint), diff --git a/compiler-rs/clients_schema_to_openapi/src/schemas.rs b/compiler-rs/clients_schema_to_openapi/src/schemas.rs index 256eb5d3b0..00d0c69b4f 100644 --- a/compiler-rs/clients_schema_to_openapi/src/schemas.rs +++ b/compiler-rs/clients_schema_to_openapi/src/schemas.rs @@ -38,7 +38,7 @@ const SCHEMA_PLACEHOLDER: ReferenceOr = ReferenceOr::Reference { /// Convert `schema.json` type and value definitions to OpenAPI schemas: /// /// The `convert_*` functions return a concrete schema and not a reference and do not store them in -/// the OpenAPI `components.schema`. This is the role of `for_type_name` hat creates and stores the +/// the OpenAPI `components.schema`. This is the role of `for_type_name` that creates and stores the /// schema and returns a reference. impl<'a> TypesAndComponents<'a> { /// Convert a value. Returns a schema reference and not a concrete schema, as values can diff --git a/compiler-rs/compiler-wasm-lib/pkg/compiler_wasm_lib_bg.wasm b/compiler-rs/compiler-wasm-lib/pkg/compiler_wasm_lib_bg.wasm index 9528874df406b705e4572ee03529b94622259784..6b945650939b19a5444fafbd4a3c9e6a8b2e034b 100644 GIT binary patch delta 64364 zcmce930##$_y3)Fp1ZJIxCjV>=yR{AkXxBsZuwYll}mfJ?-p8VnOUh94GVLLyyQ@l zp;=M6V4xRG3lodV1&b2N2USZt#z0%xwQfckv3S)}JqFT5`u@t*iU1d4G2OMkJEMH1kI{U;o zBy0|Q)weUOA7AokacuY}{JNDJH(B(S`W6JP4OUBpUQLJ;{Y(%s=QEk35P^}SVG|HN z^uqE0qL2_h^_t=o=P}MIi=$n=B05waNAlaMB|>xPX?ifG$Kd}{RMrwoi=;GPw5xaV zvgE-E&)(!a(W-0TJQQerYisgtS|BFBWq}ygqSv54Jqd-~-?}T${n@vm_0O!Vc!t)D zv7+MF+%HA4zlu{jr*Z!NU&TW%?WC~3d{1A#fMU*WQ&?2xsg0I&Zt2M_T9jTRuE_XGipx?}87~gTtupQpl9PP&wZmfcbk?0qH^#T2v2 z-*PH^_j4h*^b!N}Bdh_{(pm1-cHkqw8#D*GWF{ zBoIXo-IbxE7q`EBIb(%BWzGhw;j=j&D*DKrK23@a3v_+=xjzPpwCmMjlE{wpJVfNE zc{D7(N%KBtb9`N28HK^WKIanO@>gzWFZvugL&3P$=S-n2+jIVg>Fnc2`AS|L#Y%kE z`NMhMIp0n57qBAV&-4356lRuNGCV36yvW!2wKl-s>g$(YI-}fzX+GSk@Bw^)#xSk) z5(DS44075u%Og6UsH3C}zAaSX?A&fP%Al9{Hs{`bky3AXtzUn$RF5Jj>EsEztlZ7? zGNWiW=U%NUPu3;XoWoDT4miJwCe z!Vq2Ap^;pQ5Qb86WW;w2q~sAual$X92w^Bv5E@xV5yDVPVQ8d;B89%u`NzCj)RU*o zOcd%3W@HYfWa1BfPGK-xE=97<6bggc@+p#IrcfBnwv-}yW(tKywt*;n8N~|BBnpH1 zh&7<~qBFp-9*gc6>*2C3p&zXGJ@IBIR_S~5&C64XLnNDk(LDH)cxPBLJ^`p?z^Kau zf1P-M#%~q|DsmkoS;K1xA!4ma2vKA1R} zSNwVugXUPrdT0jd^qpSr+pwf#J4Zxt4qHeDQ68>G566rtqg-v=a z^S!iKx0$7ETin7%T7?P)M0EOS+~~ zy3zI4;ZCmq9nBw@-4iOtsC$}-vErBCzSSDn#DJ`286K-%RD80~+0;JNYmgFRTBa?FdD!GOBEOm;H=9DZVeZT+ZGuKD{NHvEO|W+cvSY5?#OTJzKUP z`6FfiRojuvcX;~=TW%0p{72 z!{3tn89ZmDuh-F8-kg=_9+>&A!}dW=Sb%ONGC4xSjB=4Nk)%&wgLFs{q$4RQn1q>b zk%;qhw1^<}NuRSpPM)OCrSHjxr1F_8KhZ1%8JhbB{Bk?bS>wz9r3DvjeEwfL@P%u9 zwZ9Opm;8E3%evM0yoJW`xidD>(fFkmy*d8ZjtuR4vmu#Uv#y~PB6}OIZnkq3KI(@R z7le2@!4x zdHx!oPQ7(fh8$Q%nZ;KkqBQ!q92}K-|s)}P-EItZJMwg)1K*f^Z z?&7o7_}KA&e0EXsfaAlZ_5aGrRxbBo?t; zFil_2$ReHphx{z}k0*l0s-o9hrLh`&>Jch(>Z$q*)1LjeMrjNG{WvjV#Gm6rvXmGG z`O1^6eeeFcfU@;J{UQwA&8KJBwr+t0sPGLx(hvIh~%N@P`t-PMA9z;^o` zNo;@<*kSEiub4eHa0ZEE=6cBnHrONPw`VuB02=K7RD>I=T0PSSsZYsPB%f{1u0SC@ z(^vvSnIqF#8w5|Kv-^PEmCnXl(RKc-y0Gj>cFw=04?AH)T^k3oJCL4o6-#4?4!)WV zaLmaE?H%=e|GcZ&r3!sjHiY$Ug=}XZV!u(ghB540M9UvxE*8u#svl*Gc=j$aC4&iG z_<=uuEVHqgqH~{Fx>ziIEMPz#E8vg(9mlb$Di!e2Q&QTbb->Oh_JS zHCYprUBy%u$Dd&zvnsK2GHcCetoBz6 zh>xFVt=VC*|9RGd)d~9)HWg_zr^wi>*4v@$xiw zAI~llN2jp_KC4LByt2p+UiL`Krt+_>LkA2$m`ur1=!m)WiNRnJ0UK0Ca6HZ3fpqs5|s z>b(Z?YZt!NFNG0}WO6a03M}dzk!pk%27{ErNL?TNlrUtrE^C5;r$Eo2CF)*g-N22a z)ohl*^Ja*bXR~XGJNL|HkF!uS%b^z;PCKz`9!v30nu{6c3V6@bjHP>#|NVLFb%(dK zHlV4UsHHJRb>>l;bYj|}hzlvUl-!nZj2SVRW<#tZSPEL8R|R8D)2N1ET23Uhd)tVO zf@SlZcf_@MY%yQ@j`$^yUCByB=hxY#uBC5mf>2A->;nO1HnbJ1@>n;~F`q?>6|b|O z`O-JU!Z%nEg~J!J0X%n!cx54mq*i>mkoEif&xf*g;^}-g4MTVPn@kgNZ(^!Qco4oV zcoS2$RNT1;%vt20w1_!i8wzg$3NCtYVF9C9{t^be)W2y7J8m6X0=|>R4yGP?_{xb7 z!(4Oia0*3ZDa|ye7EMv`roL4&sfSbZoDaD5A8GE8l;;$t=z`I6R4 zlA+&9l&~72B2CXO_W$)MbErJ8L^#S>OJr+X4uOzY>>pOny4%xEcx5Xj+HSFOD|?j0 zNYXZT1xbOMx3OE;Ua@Q&MiR6B?(Hne*|2t#B?HS4bXfLUF>^b6f@Ik5+rjt{ZTDBQ zw*1{SVpb(fAt6>+$;cQ$VnKymsULtq-BIxaFkkY>tE2&UK_ zhJ<@=2fL?tc2Q8AID>fyIb-!%jR}ZG24pWY%UQ9;ANvg(Mw0BVZ`n)iBXRg!Hi*Bl zMs(bX7QeJcjM)iBAwjwmt=mXF!R9%CQ*ckN;xsU!Zqn|*;oHtqo<)`|Ul z*bu&WjX$-D-9%+SyO)ioLU-;p3XR@p6xwwkyNXJCW*@sQVDC|rozamIfdPX=geo|& zkF`ZX*8O0NI?-{z6tnjsmUy00gCvCnhbboB+Ru96limASUs5J<)$9>=$Un83z05Bu z*b2|BwE1b%qbL}2Xm%~akgX2LR)=2Zzw7`M9>nl-HO!%0a_WPC2!gj-!@7;cu!^jz zp8a7UiNgU}Czc&zpYmnP{g2f$tLoU?0R5k)H~62cV{=uw1x46V)-Ag5h~dn}@T zE515LY5tVoSWm^hZ=0g*W8PNNlqqfC0ErpvX_jgMMiSVQGPsO($808|R$c1mhL1FZ^ep0G_EfR@_b&p=TOtFzmAp$Q>&oz3>w< z?<{(ji4K<#IsdWDKPU9x+4Y{Hw@F$$w6K9{Pwql@!C$-+IM;M&9fN?9-&vbJ^|CAn z3~W8K3`4e#be5fb42cL(WF&%RpHhVwc)L-Wok}Ye&Hi9rt~$K|-LAmN?P(6C*lBUY z)WcZ)MQE$^ee1gd$QMwV9&R|qn^ED*!n9_3zR3E6^~Z;@s_~88^=d<1{RtsDvi@#SmCsB85+;P&TAEO z{ba`iJPhr|@Y#DHo#RtaJns=##gGkC3Arf07B&_s9#0FJSI} zQF=DZ@P<~9&D=lB3^~kQPZ>^uBSHwsWbUIfeX{!(O0H{~{D}KknL6IxK&e$tQ*U!0 zld1Q*f1}h2Bh@SYQRtDO?&C6fl=}oF_i9pcFZW5AIKcfoC8jk=OmqJs6EAh2qC|MR zLP$<@|63+%?msCJvLl$NTd}7r-fhF%+;&>#ako^pEz)*_jbZxKC#Z%kF^fmFf7 zkmFzH&>{wA(ti*DHHc^j0aOt{BB7FiAA~!VKjsPS@R2mB2VO6?$!RN#Izg}~O64tM z>+oHn4c{FCP(Z+8aUd1aw^p1*pq~IblLLJm0JW8B;_E4+EE<5Gk4YDxa!UvdiH>US zXv>1}yR%X-9XDE>15NW=*37XaA`fTLm^a->n|xs*Uac>p*8KwoAE zI%*08-8tlL-GHyl=<8nrU?Uc%J(^_d(+-(P$v04@V*u(X(;PKOIZAp4neO-zX$2}W z9RZLBKwlr43B;5T60@-eVQ@66=#$^^NhJX%0aQ@7`p|F1uSCTuq-9!>=??&>C{w;Q zl!^}Rk?BvQ6;Y;t11JQbZ)uWgOncrx{0!2vVSs6;#me?PG0YqTw4|~<@9rh}Mv@N| zfV(2}9D9cQ282~8DMH^FMt_Us-*Rh)`z2ySoB?s)h%gsnHX*VB%p#yx&2Ya=Kox+S z5SAdEO^8AOa|p-+FqeQ+N{0Jp&5Jq!%p*(%fL91u3LuAoJOH;KJi#;EuM(mTz0fO;@64#wCr+_xfJFJncBy-tY*0B+MF?$ay6GTftqSSlNt zC;!d?E}wE`0>A|g{!u9kebc}m3u(0pk3h6;@v3M|@ zcZsTFy2X7b{@sOtcZZi%)2Jmm>CYR zfov)!@e5@9C|ZqwX=k3!ngi{fInbUxaQcj_?3{wKO!fjYiR+7OiQ;q@{yOSMG0CFn zQl5a!fyxfB=ib9!niig+ImOD(Jk4*tjCW^{R_{%4Q!ubawg-RDSzc%?c^Y)r?Ol0# z6tvY3Y$oI$>IS*5cI8R&C>wjsXc(5;vK>0Lq^v9NJUmD`z8Hn244PZR24)5*_EMA3 z{bT{KA?Wx3aV$eqCSU~cz2ycsTsCNVjp%bZpUw`74VUv@*nF|98&4aQ3ws|urz_Vw zt#pn+KXFzr06exR#m>n7uLr_a&pkH%9Gif11qOzC+veJC9ptp?^`b?0J}NGAKbhWn z*I;0=(NUd%ut7}i4sn|+7Ix>4gx00Xy6PJ1vdOw?n$~3n-vZNEmkP^)>WaTeU1j^l zwC>;mK( z>sWUr#g@X(L)T$oWmmSyK7UjX5>KiaIy?9w-C}`(3l3;HzNlwHFWw44PA~3Bxag2# za9(|c$BFNHVNGyAEVzPSf?(qnyk)N57FbQy?!)@`Q4d;MFk3M{4IH*%f2jlYt;*~x;E$T=W2(nmu!unJ6@5Sam zdzpU!dVLq5HKOB{5L|(|A5F|tBObky5965JpU$;i)*>*MF_Rz{Y9JTTj4+I| zxM!z5K_t(!wGx*P;GeRk;`ji5DLN`u=bdQko;S2D#4;a`>~*mjiA5XcG|DuD1%xc0 z;BJmM%}1E^az3utdAp8HvUpnI%+6R{9SgF-dM!sfRr)3%zC_eO{u9gbpBl(x6;>c3 z2lE*$Tf8!uR~jOATHi)?DUWaD7DIbVZYhlq;g%vqg4|Lgl7{m1)WA@4S}q=h;~3)E z{R26Wu_6nM@|dCgmeypTIW&@JwB^aMs7oc5Ec*;cZD^RQhw@bP9vjBp(IIrTB+Kct zVPHXU;xL{Xl6FF-O*hgOHBDQZLf`Ee#yf^f%MbzvBWu5g-w#&GxQ6!%DQ9OK(g*$hioh^eFx>Fw>Fic``8*znQP&S=+@YH}i3< zR9rojyJ<~3;ubzqY#7QDM9D4ujvGiYT#7MI09Vj*UP(g)r5^uk$Jg)8+56E6%gmmN zX5fx~|LXAtTdMuFgi8btGv#3IYsYuj?_FO{I5-qAg!kRbC$y_!QS4K(`n@VAyDLbB%N2>#Y+mM43q{lp>af2XGxGrIkiDjHbrV35K2+{2)VRu#QcLt za~!8GA?cYcCf?4wQ4X%3Yh>;i?L6kLxSii3mixFMgr9_ z7$P|gGVEPdBHZwl;DjJ$=9-b{dJj9HKuVtq`A`z|N?N$WKb6#j?_j{yjPkoD{UFiU-3AhJ9?l%AmW!erv z9mJx0VZsbS%KFa{e_wocFPtJDP=<=c40jiVd0UZiF9ATbL|C^4hz}`CT|$OC4q+)_ zmJz0$N=X4w`4xcWgv$9E&H$26uoOgHif|5&H@JrasENvO7t5^C8SWASihx;7z{e>W?uQUA zL-;Vl0)%4_&O$g0VO`4%_hkq(N&$2QkVS>Ap-&5mg3AGv6UC1JSWEy}ud@ia7Qh+m zs7C>8p|<#C)dckgsviCpcLspMF97rdP`w#IskrWbp6nfqcrMkomOjeb1!x?AnwnLp}p&kQJLBQhxP7&|~fE@blW6G4@BEvl%VIIQugeW93HW1W6?f8VC0)jpz zDBFuZoB$vfVHshHsN**hR7j2cOy-BV=iWpR8J6yHg6gQnn+eLL)aw8=P~zu=T2F<1 zK~OE>DhR3~=u3jK>4V|K+J!6zCLMsK%&lPpsZY9}6q6p{?P8xozBANu6X}C50X!{M zJ^=olL~(4Lxt{@01N*@}5I_Y1i2%r=pkgKiUP|9T3m}hx=K#zh;CTR<1WW;Ng2rSj zfI0%E0jMUx3!svKOd>d+py>qVr4#rSfpx_0GYC3C(ARPfW;0_F4t8(x-~S+gnFY1r zp#OJTu>Zrnr?*CGJE;Zj-LV)y*i;LWJJV2v2?Gz)=clfwV}rY)*KA$=_2DXzO_ZuB2oh9Gdwk7)Z=`T z3p^LDS1My^g#cTrRP277U+tk4Xagp+n5$G#E)dL6pVdjgu%OjG<^KGe5Q!i8urItNSTQ%`! z36L!5yl5EVCkp2TemR>g^a*_4RWJv*K45GIkb0It$O{{JaGG1xz;d4HyOPPXf*YbBdA`plz zy=1G+4hW7$T4P@<<{6zV7Iy-=rN97_0cz%O!4G5qyXn)N?GVM!@V4w5vG*C?x*d9w z(^d?1^G{OhgDcVc3YA)~b9ak@U<}b}G9Lir_MXYSecNx%K?0Y#VFlupiah7x-bFA5 zlJL95hm-k(=rh-|JfZC#N~tkYstB$&;JpN6D~G<=C$4*z4{y7lP+&GfRTErqz~2#E zXTaZ!PoCw^dZh;+)}8hf#y5`uoNVB^1XKgaA>caza|rkzKsEt;0AvwR1t61vy#UUT zgJvIqQv`eq-~<6X0W=V>3qU;qy8+Y@aP|uDbqztpa8(2l?^hB)Oj$ty&5tqyh!;x- zYyGf;r0o#DJ_kMj4YZd$9}R;En|4EqhcZc^DRq*cGD!$&0l5Kvoz73lx$GtU_2?iH zPtzz8nDEfTSt}aMxmbTM9;KL+G0kW_2{Sz*FiALQR#~X{GMf)> zUqU5EXhT881xC)$5DTTpEZ!dO$<^ZCS$vFX?F=PrXBKY(e6gsX#b3YVLC9s}Kt(DQ z*gj}AL3)8(Q-cK_5-VTk?Q!gF&&zxu8R{6HQ_acjv4-xS1Di%_9O0#;!>ytF=Rj(7 zk^o^MX&#uDuFJLIMt{~BYJ_AJCR;j(bOZ55`4g;!$-m%_V6*=!sIS|$FR&9CnAK+x4|Oq~Z%U~oeL%#G>{X;gVFfEw}G9G)_o z;t^3Htp-?|FO(%M&x^@yvEPM<94< zW0D--#sI_R$h7-Rn(vd%5NWUQRpBJFYjo-*|DjhnE(Fww(>c;5*7;Rft_Q{YukjS| z;Hx}7;-I;87_J@kXT8cFU^tyxHyxP;d>e1#RuazYN|hBSn8*?XDREXhiYK=gE5+zH_`vwUy>vCwNdlyf z47uT==ndY1eJQHnz-DlT2w%vrZne>n8f8rTLQ19-8cbu3r)Y<0Iis-^V(voTGZLPY zbeO9&9VUp%g}fg$c2qvUEc$b!4EU&^gthC$h^F+c;Zd|276G1FXA23Hc%Ocm?Q}b7tdx%BrOMng}Ol|R%$K6%^j97ZJC(9 zh~Hxt9Y|Kfv=4>#Eq?ul_ylpH=QWP{oO3zM~Wh33AM296jEvcNjmY~bvCfmeZ zoz5r4&4!3qmhc|w@TaA7*q9j8Curo26{=a)m46 zzD{(1o3~E79)+wA>cDaI1&k?FFit%FHZ%pcao^@1oWouFHlL)E?NEkKFvDRL6F~B` zfdG;vb=PasiCYS#`bgQz0K8t^b03Up-dO!W709 zyx3mIH}mX$V!``-th=BZNO|!@!>J4sF*yMYWVa%B!&;W0Vf)99yR*RS`%c|W@*=|QRZM16!{rSd5=-0(hC{eqW zQg5YHl#$IF%Xm$Gyg+pNkh|?Z8OaqlBNG0qjLc`QnIiK;-YOwS#&2=WSF~GPpV_o| zGX9EK{UO&9=E}&;u6bO$*;QfFX3O{-QIEu{UY3!YTwv&%TwmF=Y#E=$TsX)|K+l@r|jbh|7-pO_Y!8eE*%lJ0z)?L3GgYbwYIJTS*ur+K1Ruvn^+dL6=5;izoY|)R12UkF3{vdKzpnzFo z)e7v~t`WOeKqt%-=T`8(HlsM9ujJR;@=H*NU94QqJ>u*t9Scz^c3NLt1345@6e z_-qx9JimQjjriK}5e`)ZOTOhJ+45&T!jwBA-uMWbF|^3b9dr`hqv#)qdyBDSd_rt0 z<{bm|EZ)pph^P`ifSnd2OZa6dVS0(|kL4xY7sxeuHGd5$)vNgk_Pgk?2Aj)&h@op> zU!4#$)`0kvV&fYAEKGque#8!n=luMZkYR{4hT&H~@5M7e6X~TmTX00&UMidMY$-bE z2T@qcdk5-U`7u_Eo!9aRc1ZMIE2$c{7TV~L_+Twm$U*V>T7FkZ`HGk@#_AEH*73(t z?x*YceIUjCG4F<~Yj^Q>V#>$h8*>~{_-*`OtHgj=)^?)HdLE8Xe*Q+5p8l;YJ$L;- zlsL@5JnMPWqs zv!dHZ-mOWMYc`_FnIEA_=f$hM=`()k-}c*en=V?VNG#{QLq1|6Gt(L;CX{1Ny-syS zi;a)i+S|g7=~P?J`=uPBS%KX~yB4W2)vGfroW*!0BoZR>py&e8qdQAH~&QNmiZom7G9JzTyKzsBa;ZuW=0h zl(_0^epwT-5tqitHHrRGL^kON6>W8vJ~&SE=tU(8M(& zV;lM&7elsT{{1FC*v4mJ0(aXkWyw?9`9KWFn(h4h3r4Y?M$u`EB0X>PZ_&R}j`@9+ z{5FWHb(K<7?WvTaDrSciRik#mR|)yBm&b~V9o!8e@vj~HiNILh^9?v{IT0Er?%lxK z+sL=1pFepAealCO^jo6@iV(ZM#Zm`H`FBcbIcujR;oY5*gqod_gx0$Z5`rSCEKs|5 zHy@27ihFlUR*KkzG5bLbKoH3A+#dcA7`|qYl=`d+9k*Y!t-??p6~n9eH4y%JRjA~B zv8Rd;GulbFac|iRA%9eez5FOv1~d2Z`}ndPf89PhAyFz$@8`2(8`h%HJvDhdMz5jB z3BRc3>+mj{xZwz&&dS8jBYd(v8}lP>HiY=LaD7bJ>-b~m;ruh|_-%@#^vp(!uIVNI zAAZKE34HJWv!1`olgiHme<@C0;>yGZE6ypJ8MFQp@BGSdYFT&~hSEA%R(dHQJx#A6 zgv{CCk8j{b3d{F@ew_DK*iJwDgO9d1FRwukEM+;_cWDT^$@6sM|Kc5Ro=&{^7oXkg z~Np;Gk2V(>Y>FX~U=x)^uMRsHwZIxFR^W*;iEq**LIEOe9)pJgE) z{OpY1#S{+fXXnH<2lE1@7+Y8t$2Cc=n1=s(~uA7`QUR*$rGKGjP>}i!yQCz~zEdFR zLm}P%mqSSeGbV&7m#}&f3E8iR8Qo^-7!qZus$Z*)!no}<%guEzim)-Vwl5!`*AR%ln z4kjx1hF#N(j6xX$%9!) zgA`G%lku!fTX;yn=%D*`1@|kXmD?@?#d{3&_AoY^0W=M!MQ$4e8LyI zFvy(G&D9L_P4d8kL7q4xkN>g0$}Q~wK|ulqwGyNHD2;#@VC6Bq`y%EIR-U968~6|f7c38myN9B?4)`YxRU%m8fzw7e=xl;heoW^-C+G+K zuMY#4^Slqmfa{dF+w*X>H_%&9K4xzr|KSbz(k^MKH*Oqu9QUL7XS9q%KaQVu78S}0B*kKPUV`$r^4{`r(PzO z+^Jj^Nw09hBp8BAzop{9ol3u!RlvyS@yJqOV?ENfV8MGLc$rM}x=TrECv%)@tufSj zuJv$w9t~pIcxnx>e6>qoFP^_kX>pTTzQ(YM)a658R9@q|Vi8ab^jsJ!^C)-)Q5HiH z>|B5?+(v1HQ1$d-coGcHtBJb1l#a&xVGtE~gN7(B6{&YCmt5psFhysmgPu1upG^}J z?pCl>hjKo=TS+n6i`GDh1X_c+p^n7m;!1z*-O4;$h?a4Xma&qSnfZ{?4_ao^LrMo| znO`4LN?I8LE){Z8%fOmkCuydVG)qJ9nSbNM$|~Nha1q_F=!Gkwcq*qGf@S`!N0oVD zWJtt4rMw@(*7-k~rtIcyrvJ6+N-<+I#jqEYPKZA9f>OuWZ2!G8A-?d4#Qc|_W!CvW zdrA2*Jovnff7N{DK06*RiG4%)CS{KCSO85WJlI4++39KvFH|08--$;TDmT%C z0G}>Y9z`@gUujQQ_;1LEZmbhi^OY8mnId25g9ncMJM)zSqUq^HplQDU?L~?oZ`_JI z-j?Dr>uqS)_|nbt`nKjYZf`ruz?dVNy@Lr@D&BZUX%E5r83G=^)XW)W*{(*%Z!m z_W503Lh8kzs@rH})UzlL6@IKZ#jiDS4f9e%grfNz@dg zNCQ_W@X>iJuI=*0tIQ)X@;ZQ18V&=<`$>%aT1n=GKZ$W)D_1r%Q|SvM1NKP2R<5CI z;*PCob)C3$t8zVS5Hq$a!+GXxv16;Ui7%=a3$~#%7FGK{-KIS5Xde2C4ZZ0DM&kN0 zan&B>g)5poO#u;xnW4$&yyWF$sRpsAmS31+RKC8zBgA;8End@4tby1iD-@j}5BhVw znuTpT^4;lBiQTG{h7Q%c%5cv)88X?9z?F(V2<)n0PU7qVvg>o?b5vsFUZpo(?wGw7 z^8qvA%YDk57@aZum2?EJ?pG!ua8#og)`}ael`(9s|Kn=(Mck=_rl96{q`<;>Bre#A z-@j8*(M`$UCIt7^Do?}G+g%F=StZoN;L|mt69uK>mcyv-WAQx2J`qbP_)Ki2phEmk z!FJL52!e0LPztKVgd>XE{T;kmV1bHDGF+#)u|7q|S6>1vmo`=P=M?XG{HG{;Zr}IKKbMQ6+(n@9%C<7GPREc1+p9 zAYQIKu5^m7g~-tDdd)isRK42&{BiIcTO#)STUp6kz4y|e3iEQ*Ot2uC!QCgxQo(B!@~1S z@feDe9#-`Y6sLC_s6|YV>TO|>c#(nWPJ-}}m+9C>SVAT&Ia4mO4m<8DN zwM!+w1c7UXBf|X5s(=43@L~Ec3UCV6zx*uB)4q-7sWdi&mRHbVCnHt=6L`FxC^OTt z6Vn@Z>T5OXEST6COzmd}KNdRF?F`}MaP?|iV*N=HhS^+;Bx#s~kS@5w%-HEtn_1)Y zzc=3euo%)CLyR{+#OZjvCy@2KKdHIe#@=Xx+>)XWIo|~NFhxDj1gT3=2mFl^N5?{m z>zm;!y}(*NF$DlPr}b33Ys)&G=f^<`>3qjzcEzFh6lz2FE|_^_k! z25qehI&tqicxoVmHoV|-l6S*li_5FwDuljY>82{AZSCFFeh3D2S8qp9&|RI6;PM{o z^$2G6P`e>m*8|4RT5+a_I+Jbp&*-W4#6r`*u9x}(-skrB@2y&`Y_9+6E7dWyzFIaw zO+;%q4^Zz>QtQ5jR+6h!QbQHN7(^QEFsYlW{6nu+-&Dh=7lQTSVtGRm(>ts2es!2S zlwR%dkGNL-oMELenh#g+86dETl-`2LFVS>S5OG45*;jZfs=5sR)+&AGuzg zNmiWr^>)=CG{;2DVl`QOd579Bi1J6>sh+aJjIbp}?R$6~CpV$nnu3fW&aQC+}z z{Zct;#MDXZ02+r+C#hL@$P}-w!i>_TSz_0B2cwXgcD>4s+9U7?4OAE1N+Qv2*Wp*c z6G6^iku_O;6bkc~$!aSWUGyWyZ7HM}o<&j7JIT+f<9Wf4{<+VobCu2)u~*QlrX~wr z^_j!uBpNym!VHsW`ZV;liT>bd*GnM}1i zs})_RtDX7l`^5dz)lP7lj@Ig0qeqJJlrkhP<1n%-i4+^A?{XufC4Ik!fl*5 ztW0r6%5B3x2mXcOAKXyxNc@W*XmPs{wm?NSEOx9X8Z|}ZI~5z3w2%!KoBV2O3v4mP zY4}4e!bO|7z=5pt1*K}wzfTpTO4WFrmmniWL4QF!h8xX`2AS9-_Li#YtX#ZbswV$K zDc_ZGJ7hY35Ndw1Y8zihdfQf^9dh zzePXU@VYt1cwi6v)N%C8t9d>VZ`ZI$pu@HBPL@>iU%>Jc$+aND>?TfwzLN~s@E*Jp zp{yTg_iY)j`LK`EKon}8o{8gewDk={xe9)YL4OB#igf7tTqvTz^I$UB$VnzMpbB(T zg|vo25`|ufwlV;~NtE+8V-E7%78Y%h| zL)ct58c9nCz0j87^$@RB;t(<&i2|qMN<2mho*0*<-{c3|LJ>XCBvNCR~-;GKZsiN~IIU^ZaU zabEXe#l`hGc)f@2<{A{xTRx6JXX#53qq{e<>-1%a(YZ&NlRC1&-jin;^`S02s6;U4 zP7a0W+)RYtkU0}%;y_1)Oi`@))J9Tm=aY(LgR5u}3W%m?8I2vzSFNWI@ltaP(I^rK zd6KKffUWS2WGfXH08nKZBmx$euy`?+Sje5%D@Zb{@L-d>hNKNDsWzpJ+X@DO4phM) zDrq-ana3%1e5&5$iZS>j#^evDxaTvqjcE0qEkX>aw%NnfKFmUkRi{|`88{|JECIKN zIZcj<5nIdD+29z+O^Do$swYxXtUJ!95vyUzu1%VXmZHN$TS_m*Bdgg`YzH-!3{;BI znVuHtJ{mPVW~Y?^kaOW5n%Y;)+oVQ|M9_NCMqiEDKuuI)A{BA>CN)9Sf2KN{wlqbw z-lWb!b1^XjOiJWPkqsqfp2sBbbNKnBBiYCqYyuPl@d2#TEhaxyH01{$g9#Amp2qsT zjTLeolaP2TShXht9`YJ02LgyPYJ{jJ1cqNm@IG4TQ2b3Te_zS4$%EmQ#)Y5IS_px6 z)r?xK$sVX%yv}BfiY)w)5iPS{$8YleP)`gNDqZIg8VFu$AB! z;baV{oh;mQo;-^oqlBC`U;{GNA^-kkad5)ejNwBakv8aWS&Dp9jx0B$6tR4>n(TFw zE5=3#-Xe{qmz0O{I~s1ZQoe2-6Of=Zjo|lE^>|8wK_kD#RHtQI@LS-GN?fZ!JDw9T z$RRpMd*c;yV3 z8Uy2%N(OI!0af3ai9~sw4TobP3`lj9!H1A(!dn10K#&r?3UHB$uLWEHSg(<#LB|G_ zQ4SQioN1@)V5$kEoD{vycL=y)s9M zJ;Qa>CZC1Z6aUWeMb0LMD|z1KdtG>!-7xZ@3t_&NkV1j^T0{y3rW{@5C=G$j36|o? zG;vK>Dj*XErv&qmvJK>yk{kNDjBp606=~K16VDs0P#R!n0$B`!0s>|b9^1fc^-!V{ zND-CEm7U~W{Oko-4t5gtTrOU)BVINJ(;W|RCz7y-O-}_hM-*J(PR4c4Bn2Xeiv?e* zZKb=Llp75EsA#UJR-4@s79J7ljIu-c z1ZXho&6d^KXfp?8<=71w@*f-4=fat)Z=jY%8iRo;A_v0_&k`U^H8O6bJaCEqTVX|@ zdN>nNCze#^N>tWLD@C-oIfxCY2-yX=bQaPDazWJ+C`0p0O-k#j)<7i&Kg7LJ>Zbx~ zrc;7gOvx_B8zvXDmn5L;ZS)yLps~Ir>oC}Tbm){`W05N-X{xx)z9joYYZ;8-MoH@c z>6&INplBhLW0$>5>yVvxSP|NPB>+u&1OAPY|8|5fGC*I3%y2IWjDMUia=mr_3~y4s zPAWAx!`G9{#;D2_2%1}Br_DgCDX`C%MBa~6lNJ@mzSt#cSNotVG=yK_CX|y4hHi~U&j18t6 z+Cdwl7IWkz2_Wd}M$Z|IJX+UakmQ~Gzv0E1FY`UMTc8z%uhn0$dA^hyUJ`MMnB)&C#1nmR3LpL*mSKGWj- z8e$6WdD^Im$3OTKM+)yK}*v^j(goS z9?jA(QZjWadwj9M)(47wu9kdp`9w&`RaA8s9FiOBO4almdB~+q>DhJ#T zR7B8x@-&wPG{`S%n|@J^FY3%9&E-m6pny885<;yhQtYVnlr3oO(6|GGC3n#NLHE#7 zH?L`#d4V!>>>gK$9b?W5THnYE@Lc`B@XmItw6L*SwImvMSF>F$qs)I&NeosOk+uqH1jWG4OAvz&K^L6(D8cWKT9yFXb%+0sDBa^Q() z#SL+mgaf~BIDPQ^wwet7R$)g00JGy)t^m-&vP_{q4dHaXh%nwzF4Y@kCh%ThI_NbL z1KtW^vgHa6yh2u&wEi+B2D}o$kie6Z2z@1mA2_DafWg1uNE5De^zt#NKb)5a}#EvEefT=C|J5(@{}yvnA9BTX|j#L=8#TDX*EX= z(#xeLF)NHvq98BiS}vR`$Vvu%lsPo;hX+yJK&Cx@351w{hzGngB2QH23a>wX#RtgMVg^d0-Eg_L)M`iNHd@TUQ-VnYFLMU z^f<`5eJr%_x7zBJdnUd&mf2J}H7 zwbEP-V-4Bp?Fb~2BccJ#kn$v;{sM{QI6L6h8 zTN+YUpP&#zx`Dz-Zx5bNW->fbc@)A_IE54HnI@ba2BB}lb-?3CH!xhX8c3!8t1TZxJ8&On!l>(2GS!D&PtT5qH;CGsEA@DUOoCkb8!EmeR zk+q4prE(~A<3T$L;d{@d5WA#jC?8(JIz=J;C|Nf0=HZ6bHoN%QFF$QzO-yg&n%n5&ffFpNMrqgr2$WCn zf`Lup%?$8ufL~EfC5mX|(MA>}a|kR-n<=JC8?0*kZ&?+4R~K+*1hFQHBlZ=^?^=_* z33M=u=0Kp>1ie!3Tm+dP?T+$YCI5%Vb6d4(XfulZNd}*BZ0XM)+7EQ;XQZ4Yl;@Bw8ar#+H zBsAugig$ud%a%@8MdAzu{al{n+HND|j!bdb6+jS4y+|44OWi==r)P{`JEQYeUgPBy z99aMtf)u-!Vm1~AE_FmJlcSsAD~4YXiUakMigX@H8+C~!Fq-Lc=18MvocW^WGmXh( zL2|0aYPcK0=(pDrwOG&uyVDRt?LZu^dvGn0s80m-8tsCkp~&WfVTMGUUK0&R)wHD8 zbdD!iaH3Xrw9G^sJUF)|PSvRGSgdG$P@Nf3+VotSzx*I>q~MI@kwfY{mM@;JRUboe zs8*ecYru~lR^u7&rFxI3kFy5NPz3cai>^+R;_}8%|EjONxrV2k#+^hkjG<#gXLCf5REh-Jyiv2~;IiRkhYG4{0D-c~XL zM=neJd8gI8Sg+vAG;w$_0MFRb?^$bbfMn>k?`#U(Tb9Sos}VQvE#t=^MW?gayDcmb zx1Lp>r61<~=B%3DtomK!q741uAxANpg~IulI>}pzA4S#^ao7_20|%@qmK=!fr&v-T zc9LQ(0V4Dgl)-sT@++TW5{X$-R zpU$kEn77Gw6H?vV>9&Tv-GS+b_z8;3+aEZJiFo666x=~Yyzx4UD&vjUQSf*U($CQM zPPz?ZlkvvuDR#uKg2D~nPodv2;rgt__(0xY36t?$ip%RM;WECE;_`Y41|Io;^^aGq zeHHI|yq<`~r5h3&5P2nWv49}>KXE=Dl1blUWFdP{@?&{0u2;&O@U-d`fCkcm0G*QQ z6t6|!0Z6lSVQL>__*O=ATj1?S$Y=Zpi|AmtUd_t<8Eace{tl^AjN6a}!&yKw6 zvW{)~WW#j4W0D+WeG<2X=fzm>H_mF)qcQE8Ss%poo!!hzb9#9*YvY{uV@}UyT*|Y;K*1-&pRSV11a5z`vVd?TQ29dlRhlINo=7Bnbm~M9fOE()$j}ldQpah<;77 zUXLqRda||YGa_`6%@D>UTjWjYZDM}1bwEhBz-lqN1xLF{^xzte_%+!Ye2oQVw-EPk z#QEgRmew(-zpmx~sq8)AvnZZF;O8#6yS)^65(tpco`l{(KoAgebVLYEsx&E~ga82* zEF?hCND~kkz$gJDy|+UI35beFRX{+5pome5G!+!|{mx#V68QPP??3t6vp2hYTV`ix zXJ>b3QL5!svb0tKN5HJoT1@d>b`B^5!#AupvJDRvd>zMYD5bR49;dNBDXrC0meHNk zz+f)*ECc8g%_^gffnkb&%4lqu;_0&5LS?6YvaGg7L7dcBt%Y~X{Nd&(z@=DiNKBw% zr67!5olq$-Dz=R>AWrM99JTE@Ekr4l;XM?+TUFFlx>Q9gLpMXTV5(I?d&X{DUOOsa zcPXTXRvvh)RYNPIY@&`e(5^daObzWR3?OURb2EL(&Q8j!p_Nq@kf^C0a_3+Ry;a>> zln3X4f<5Iw)YNK3ynh{FW$OkzS*kVrrtPT(N>DzsTh-D2R6?&!$Hno|YQ=eKQ&*dU ziXW=0J@ee`bwHe%e<7J6&s67VOH^RCrU4GTz#ioe#mZ zARrE_g|J|G_M3g|iw(7+3XGBb(qF4>mv5w%(r^INZr%*Z@~H)nrL9l`8g3HkrF{z^ z@u)qbg*Kay-QI7hoeK(x(vd2))9U`uw&n8-XxlN}wBq)Rc3Mjn2N{mH*V6gK-*X+c zUlkk#W@kEXDuI0!i~s-pRs777gX`mo?qB60#-- zdZ0?^i`bdp2>Za#_X4$lL~3uX84gM|@2yn?G`zR=B%G|?S~A3n!hN(_IF#CqoquRF zJ2Pl$A1w>$iho|qX8c@vUNhNz#?8K3n^JaA9B$;6%5%lpmZDf2=F0Z9scS#&Sud8_ zAJZn)FF^b?T&_59MDEp22k==$fOI8&@+~6t?61vnnrme0;p<>B=lN$H|Lo?UIsB8w zKliTTCxhQ|`RykE9N?dm_;G(ALR*3HVt~)XJtx*Z{yE4$XZU9w|Lo?U`TUd3KM!!1 zur-t4a{2A%9r|W~78_8dXeu&L8v+8EI8fWHWZ2bS&~SJRNGd&8t0r#{erBjvIdu-? z9Q1X0v0QNT)Xq4(&R(A2=D5}e9mENa(^-P*9H*A#F-2#^1m6&7rA<8mb}z>nc7&Ay z4{m#ir9e8%tO}1yut{Z|neUv#Q=BtBIJ-CkJo(m8t(xcZqQ{TuU4x&zmK$kOlSHkm zw{A&^8q@vNL~V7+MZe;5Wh`&-z{eL$LU2Ov9w7c#d*d+eM9|~ozJFX-v!*UpR#{J2@VV=kRAk~^h>L_hHOe5_arLh&aQ=_yd z>fJpwb9`_#RZj+&{GB={Yh%{oo_9T8Y|OX zI##O=_I-FP`q?FVz|Iw_o}x|gCx#8{PBBl>S1JC)lyO>Tb?rVnng(lcxl^@}6287w z4$?^e2@DX#HOd^PO)K-q9@JHu+yawilUu+eZ_3n}K>nm=;~jK0n~O3o9M9;oKOV1j zQ!(e-&-`1G&5FMQPBhn$M_R#;e-P%8v_Q)7SuCsn@h#-bB$} zY{D(#b!{MW9rwD-b=B+IGl1?elt+~(`G@$ileDx_zDB@oCWk|ewx-$`Ha@3N@BQ>iV^Q9-A@G`-(8PtETot;tRvAWrX0r1gZD;2?UEr`R(xz&$YWhB^ zJXL$jo8WsLfZEwpf!g~yC{rkHPSxTh#Q`^0r^*6^q-)OvNT3F#y@oiG(;;Imq-Jkv z)hRa}CqA#xm2{15QbtbGng_%;Iet+}o2nI}$P!3)<#{GL#6wm6o+S_1FxoAvmlB8KtpGPhwh*^XQMLv zXxD6Q7%Ja%uB`m)bK&_1ZJH~Y=8?Hh-~P9Z=ArO8T4^xNYIC$+NMza^t-88n3vGze zidCqLA)6Jk);{!9kIQ{u%{P5e!I!HI>XbJz9oLbM*YL}hA{8J2*mdVN!Z2N@j zOJ3cEUD)n+*8JtPV4hY%-4;ae*D=abPF16beS02iu4dh{8!yn-YB*E<^Ac@3&S9p! zs||&7_FZkJGM);pRch11Opt3j{q})Yf{tWryYQazp7y#j-qzpOW~yQ_TKyeo$4bSAKxk%^GUnRN}x|UZ#Q1$$aOhuw9Am|><`zmAT~LO z_O937hD?{RK~oh>BD!n@^7ql)jVR8Sw27S)bc~&IbYr7d-g9{)@EVMJW8ACrQH$;M zxVl+)mUV8@6PqB){YgF9c|emkX$`%E6n+p4p!Y_#5dF9bUFpqDs8TpxI1R(DPj8l8 zsqJQDbd(Y|OEOxxS@V=R$X%PKO}T#ih3G8Y&L&hTCpUxft|HGCInC+6MT^I!yjfec zwe>cEPdy0>yup01)B|Uo^eBZltV5T8vqE|lbz->TET`11+H2n8D%&v55;ff`yV%Ta z5T;hp?QIwc*HGMcI9sU;J0H^&cJ|Vi?b=AlvSoIlEO)8z4$Wut6-njSe8�j{XjC zXa%#q&^Rh=%bLg7=yyL*KO4O;k0#h!O>Z$^Q>z&5x3$_p%pDuk;#_)qr&b{>&#T=6 zJud8rkz>kE=sDh_O*_FbSJ1aRwYYk_|37iC<8d6+_(+@X&3w;CfjAhmSL>?2yNMo- zMf+sY;a#%619G&d>i&&%tPpfKs9mKk%n&q?VNKfrZ?^}+ELv|@KEaqWXaOD00d0Or z`#uKOg8h+?{S)r8yS1KPEG<2zRiH7SOD4T)w^komy0BYo>@A^0PyIdG2%slx5130X z4x<4Bd30@$R=?ht|BV5uQH9B)|1$OR49wlHJqrw6*e@}leF_Ym{%;KA z_k-h)V<7ocXb<+##ZN(YXUTm4$-!dm0g%+C|4t67Rqj^jA5U)90qw=;drS*B0`8uY zPX~r%$Y~p?vOGEl-~j#c)e!jPxhLAflqR2vqzl|=`&-$DDczl3(=E^Yb}9pY~~@}(B7PTN3v z0Lv`!_Mo@a5$;*}n2Y8s;gFf^JkgkAtfQuf(EImL(jlaKmfk-EK5~V29>OSpkFEn! zfoJg*($Am@U->5!C{86x{R-?jA4k>^RPqXp+(J=9ROYZ2)8IX3S0<{7tIK?i$DLTU zR(OMO$&@ch$e@ih`mk0aCLbTW6-JT68Z;UH5iL9H$34o?mZ~1nBK){XJ|czAw~lCi z)urnRBmdJFs45_f z{TT{B0X5S6^;GwSR<3ON&QBeU;YAl)j{&e7K2k=*Y$caoJfTfd-&;=iPiW7ira`6e zUItqa_Y^3>%E^_F4hkqd!zN_tK9Nxo##ab z{$U|Xeqf~`6(<3FhLtd$k>@8S0gKh02fo(o)=YO|f=aROkl_GWz>08T1;K%E`b6{S zSRqCBRN)(R>^xfdjmB2f_I(4o!-9w7XeYI2%j7*|t(0Si6{a0<3JXbJb|sBul~o>% zKB@J^7e`Kl8|Bf%lUjyjdScl*nt2KgVEH*Za0;WtJ-TyBOJwEj^QX0>QrT>tLgC3d zZo&$S2y%rhF`*0=wGP;qPlH&YPy6Rv=!Li0W6xk%Vg2ldvs#k3r7;0gHVE6#TQkBkXJ)U_UITEadKp6m2`68VduK>Glp$Co#2Hv($}JOK9B zh_xHRmOoq8Zom%jS`>v3vz%{zianukvwUqG zj)njX8W<6zZzvd%5gZti;WyUVjf3^;hPo(&s)p%3^4*HGI!upNvoh#FnErIs6xiHD z7nKHUp@@X?-O`;eQ1gNykl8+EHebQVU!0s zwa_btawu;iC5!}bvgR2;9rOP+=p^~limNe1(YTHNWtI7o3{b=7*t-%2C+Fv!w3|^4f=YO}+9enja5MAl8g2F7O3n0N znQRadH7kIp%fIC0<4L~pxgiWS+uPy(v338@#ddmCa~;Znv;amvqc?$(p@e7j%29WH zAIdj5@xN@(d`5po!Brw1+UxbG@w2*5_Xk~EG`;w&-Vig!4bOrOuTbu@I%`hKbkJGH z)~JK-TbP4(iFIssJL+vP;d`~CUIR+0)gATPk@NQf71%_8r8pKRfK0mDQ7^6BCo@5> z?;WwAbg4um6ZAT)wt7E7=leIHrzuWX67-75GQ5+_vPvg?I)ut?opfHcgFdDr74EFp z50GYsql4<3fWp7lS+Ate=KOV^wo9Yqopn}Wo$jpj?D_Z3`e>iNCAEtl1AWVqE;=hy zj&#vk1O00kpztmg9suQ!)m3K&^w6$4FCKo?m5Z^koBnJ-0bI@v1^;{kae87my{f*J z3!o81#Y%L%o31^o;B}#=vcPqPu6NTDy$BgKOz%qTp93DR(2ZfpM`}EMR`&Z2*W1wC z?)sA`#&^RJoJZ~vdKIeJ!{2~XH94S%&g-NHd+33;UIclVaVVMxES8B(wJuRyPrcyX z8-8Wp+MYUJToThuZ;#d;+Doqv&Eq@0^h#*tk9+CmU{UH~FSOHn(tGQCV@%iHIxnQo z>#aW#ps~i5V%At=L7!<|I2!98dh2{mOQ}Bi;&iqexj6`JgJS`*jHAdOg~AUxSJrFQlSMv@#ptL zWj4{ierVX8bfq77WG0pB58BvFjr;4o4BNNA-XowEhEofyS8y$O^CI-_U-$PCNmKRr zJ#=d<$Pb!ARx#(-C2xSgE>IFaK}iGkjwt@e17-2=50u4^dO;7own3p2&7o19^#b}R z?$sHjXCT43gCuf3A5xOTw%%p;eM5Ag1|5qO(S$Blh}sO5h}PTW9H$oEgcOxXqqDM-U)gS3^ak(_J zd8E#|+nPz}#cOC_lK!+ed2p#{+LHv9CJR@I)!z<7D4_5U#S&k0(V4|%j2qTbYB5TW z2R)>ZlJu}*lLw=smYRKtx1-p`#f3qU7956(HbpF_sM9K?gzRx z8bZxwiX5W{D&DcZffebmjzPA+(e5!a@f%~noQ{$?R#IB)vH0+BN*t?q1;RcaD@o$! zSlN4?OOX)RV>0^U{S?_38;+Aen*5%(clCQs z9~Ze#QIu2wdy|cP#8b!_5JF%NMU+)0cvVFeZ6YKhg7NEae zqX7%__|%`$AwPs*XO?5`_U<$QB+WO#MaRq``Z7V~lF!-qUmJ>+hp+AiIvp(q}8{ z?E6`I7Zr-2XFt%#0{r9yy%2{U$p*?FQj-t$V^|OfTcJ;e=j;{wYUQEbaHU=%$X5`% z=Ni35Fi13WgI+T-f3ZpK&CS16=KKadJxEQzYQL~WU#s#<;q7{aT%Cxs^|C=2F`Dnv z-wdqkPrER-K)qdKxBf%wDV|~RGB*pKyd5o+B;L<%_12lGr5hYJ{%`{8&}q*@Od zj^tUevyT4u+Wc@%5EBkW$z(6xeHB~Lux9AXBWFxEn8_8z^%3y*E$^Y58cWD5R0 zbxtAti~UX^9$n1;;REC-=Z)x7D8XfV`V;*osJ!N0{ly?CBeM7FTUEF{Khrm|#bNOU zSS`rHI;cO(?fv#a{kYs!G4PQ7ykMWbUqcvUlE6zH`_FImyE6RxDSc=VcvrWxddFg$ zc3|xfSLOus7Kw&%_@eDIwDYVKLw-7|UqefNeGa6NYY+TR$4;DF``PdHPvMgLqJBmh zN55Ru`zhJfHdh}9v1E5Hpekdb!9C zA7^*HALvgu`hR10akzUKw1D$JXy?aS+r9_ba+LAA{=Kr-9{Pt~SngSQ`JO(PksESf zzl6SU?Y^D^t>^l`^m=9YpouZ*h~;)Hfn5fCateE9L0Y^-w`a%SdRv9AJkU=^Wn&SS zB^}k-i6W;B_v{l7^$t24BK8Cui;8Alk%ovHsOxw$?lzoiSapRC2OEFtmzhd0+h1zN z2E~UYHn$WP0wld@7!pZa4dZA~_=DfDH-}F`;KVT@1~*;8s5i7JNJUuzln_4BMm zx=g>+Hbx^`yLTO9jtXviwXV^~XZn?D)HCXVExl0BXj;&d&et<8$NIKqm&ec`Zx@Fu zBN&^AFY$!}IFv+}>Km)E-(bd*#&jU2SOa6Hnst?qH!!BDt5(}R8X6l+U`lUp%;Y;H z-f3ar z+Of6qlM+Vt+JJb&s81WCX(TLy+=QOWT7~1JybkZ4L2KJ!?hy@60Zx`Dd# zNn@w3AVHXo3#e(A8&+^|0)}xPy@bC#<8fz5)=0n?Ycr4L@06 zJe!>JX*dvq)5ncm-vfD`NV?F`=n><^vj?TYObL|ao*c|#S_ma17=wg2+}@P{cF_@b zpZL(AJoJkbTVC5&IL;M|qdwMoxZK0i5rx^;O(#kTygq;zvo_FeG^}Jr;)$ZUUk1n7 zZ8{q`r^FVea1NMv5*DTbU5v6yB&BsR>Y!D(bTN)AzK(8B@5b@v$s)uD){4^y&l#!B z!kD($(gAB8&H&XVacDfi@(s6ADR>1~zKNFc7eSfo!F{RSjp~X)v%4F`OY#)h6O-Q# zOhcZMUck=jj^t6? z8XHP!y^ZuLKr*Z_1jXWjNoDL*i7g|e1+o3ID(b4B*f<$ID7HA&=wsvt6+;!=&l`18 zVN%XHP~95F8h2uRVLKhTI2_{)cOp+1&^nplI2-%veeCDZVJ zUmWMVeBtLgJkDp|E@)LS)FMWaFx+nm;{BaNBXI{5I$>duirUv`poCDPzQz-NVjbVt zcuw(wbfTZ}WNNr$vJm!Pg|k;B0!-$h>>14PBG@u4I!-VwKw+I31BD4Lj>A|g^HS!= zIMk_oPm+NpgH?0vq7DkUFAMOGIG6iPNHgwlHpC|& zM~e3-Ft+$Y-Olwwap=Ln1}@6*ggAU6gij(u(2yvlPNAZFFRmoan{iq|0-w{whhWa0 z(%8l?O&{`MW&bHSU@-p_9N!55O!!a12?z1qDhfu>tNo1uHH*5Z-~x+q#pCwqRf0-z zw|Db*j16SP6FP)cR;zQ}-86B4QMzjW(F`sLxHkvrETs8bh^=|XkHn>c3KeT@R8(^& z)7U5@8q{7yRxGpv*B$g`tz)Ugu(H_+ahAw5>*0GCtX2qrtn3dE9A+(KC)k?Dj&99_ zQy|v0Z1@}25A1|lr`gf1<8ZvOO3Ey6u0w#Z^4JNp&O6R=dUv3)Mfrd_zF_nyJBO#$ zQP$eoTWO;yk2 zIoV~(9cnxob7?c)bMfQeBtnZgiLK_%SF5OYqA?v3lD#|8xTIh|8!a7fjKqXCbOZ*4 zopzNGMwFs1x=8UOjcS-1C5G_IL{}HcGUooEadnvCP*Ep%) zUNx{_eVWYIjep>XNyeN0NU}ViO?oV;+NqCuy_;&(d*nkcEihK|w8skhU0Ps?q9+@_ zbBWwjjA_9IlB!~V{)RC(pu+t#9!u+9hA}GUz{hCvPef=Tr^)Bvy7stClL-c zj&+7zBh)(0E)+M0b;C8XkO+3UTtP0C*TOQEJ6_#GXF9moN0z1>KkP*-x;Mz)I)lMTxx&aJ3?gWj+AiEh z?)k=Kb`<;Q#< zueCo*UW+)ppzqf+rSGgww0V(Hv?X8R7x2v&t7Pbmg1(2Hl%^N-{W?o&gRL=dZ6b3q zA?RCh5%v3vG_#m1*9RLSKtVSRo6M(Ues)U0(G2n?(RuJ;J^fpma+d3`X0-IZw! zR5sbA-ZO?PA$j*OvHlE7*}v%R_l=H44*Uz<-{&ka;_jSn44kK%?;B%NKl%{#7-a2W z2j+>FgDh9!HZIvk5Ie+rz#*n}haJsgHBx~HrnPZ}4B=4%39SQEAVR41t=zNXY&i*) zr%gFRXKW_&xa{1e#x6NY&Rk~HXm%1Tp2shYMi|XPd!ZPJ#Us-RPM-BwUaj0|_V6B9 zb4IURTP!!G;8dAC;{)R>X#B2I&lN`Xx^q}Jfm55-%^OextXHgqa4iiU!MGSO-|roc zglkwGRRq~9jHgO1<;^_MulY9f$f26|@<2Ztw$ca*QXbgF*I@QsEd5)w)<@2G(wv3G zIn}IH-`XFoHTtN&<#^r>mA@Qcaf4AkBw#uI`3**bF$dMRvZv6N4MuN$6|O$A?o#AN z~^%CVau-o12a9N+UjEg*MCN`tfK3waNoN ziM5nHST2FbOs?>BMu!}Wo`v?_LVCrw8mGceVlaZBfnq{QcWMoT!;wi}J0nakO3G=~$kLprS;=dB$^JUkCMP`GV$0@TkovMbHuG74)EJD68n zH?QJl8AH6+gB3w|cTcA(JB{Z?${ilT@(8ngr3j7o(q;awdZv}h6dM>4>Kr%D7h4L3 zNF}Lr*&Bbu0|96njpcD~7YlV!T1^Y0vbrcwe|`jPPt6C~?J~Cc?tU^HmL%5>af#-~ z#x&m@PJ#D3W!mdLHgJVtwte6eW4ZqhPT_nm7f@%?k?TgZJwFEm%YP)YZ=dlsCo=yt zV~;wamxi**n> z_LV`tiiS8Tg)r}(Nv|G8&)P}<95zaV$;2En>iTaB4J=M3#eQoPrI(Hw&6G6Sam=_? zIzQvMNO^dT^({DVC-cTpW&6N!qfRjL9&^PgO+`)_X~<>r-$oH-roHNvG1!loK+MTp zIw|RP%D2Wr;D?faH%i*wzcc!&{?EVs-WccqTz9G?hqg?+^F>1q@>Ml3>6tX_2jig+ zp9Sh>zw#rb5T~#!pjRvYvoX|{AI3x(0m@j4q(|K__>$FkZWvSjRS9gFOuO1m;}5>UE$+6A+V-|ljwuEhIlu>O>-=eS z^p|n|pT<}49B|JV?ki&f%n&eB%)Wcim>Gb{1%DgC{_G2)WWxjFwv;lK|6?3ddATK7 z5w9r4oVyCK$nM}>_Ls~*=^s`6S?u5+`{eL0FLh;8BOtMLf7+qJ0?To^xG`R|!out> zT^v>44wBO@dxIe=%VQio39}yvVFot}*d)Y@y|F5$lmT0K9A0Lrt>auJr6zJCkPGq&bWdu$G&6uN!d>n|N*teklNl&-a}fLEkmrpYIbY>< z(0$?JnF5=KiWL&$tMEpm{9FSfJDx14opfGNn%qLLn}>_j3;2{*Gk>=A!eY4+Am-zm z+AH+XE$SE95#*@+-P?mg;}vBR^YB&?Vpxbjfb0ly=zm=VR*Y6eiV^=iq<#_cYKwzB z7|Kx+Q!)%7?&TshM)F=cd|2P{cw)#?z5ziy*;jsLSU2fT5m67)bmgL=2O2Z2sECR@ zumF3TB#)PGKq9RyD#{j3!?tBeAG6rW9|UgFxuW6_PV;^kCB`fIy~zl=No9)*K5Nse zxOf6*_9he;Q+xS|;L#0Y3b*%vZ4gsR#zF={3wXDLd6bgeC|UVbgAHQcN{D*S1~Kf9 zra2`<=K^hft%P_n?%;12e(vx^ctOro`mbPBqy|mm`8sxoTN!`bQ=>(ys?H}0E+q!> zs^jodqAV6zX?iJ<#3T8=Qlbo2sEd~t=su-BgD0H;6s7#y7h`%}7hO&ru z-ab-R^i{C8y;`ie0iAtJoJdetoFk~=OJa%Y%{XyQnMLEvi3@7RuPeKi7i!pD?Coa7 z9Ma6S2UHZWU4w%+l|)O=y(tGEIYE(V-Q+hY+FVv1-muLL$Mvk6_W4R;y+S`#7E!de ziZH{%I1vHehdW!))+*xb!YjTV}cvYd{)VqDU8fQ0+Zd4ad zATboKA&Ti2G>^-Dn%dM5bBo=Dkn^aZzi2nzs3A&}IJ^U`gZYL}`U)+^+0UdhHO28l zeAg%{#pZQ!-48veDK>)5t*a%bh33d=VQ{l{Qj^-EIZh3y))upyELe!L*0c`5k#jHW zq~no}U6GE*f5)J9bwu^h-M*9$P+A>P4D%MMBc>>4DCP-Ki(9Gv6JqGI2WI)iSm@hX zl9eS-oBgOalnh!Re^tF9KhVP`L>+9hs#RBinPRnFeA2T6Jv$F;@AIN;ed^>mEBH8j8AV`p2}ep=gSA)>92deH1nHDbb_w zw2Qnl=#u&mD=pU^`xI7OP@Q>=#EVh8{RQ>KxksfMidawJKNrJt>l3iBz zr#Xo1e$ENZJ>U(LagQG<0H$4}5=})}_u4C9QZfk{Yq#B|si>(2+$nGJo$}Zrv5PX| zLCd@8K)i^o78riF zH?#!btA2bsxTvqz*JjEN=tW7|JNbbUK_@A!wWu^ado|)$=b_ev?Y44KGBi~d zpc)YQ_wz*+q26Vf$%api}p*;Rngpe7VFAT>~zt#F9%mJgIP3Q7wG_ z3OPive3rhP+H}P%F?$)d5sM1NPC7wg+>VgTYZ2C6TGkaj;S3$_Dq594zF1lvX@E5Y z410}S)uH|ZPgZo^v5JAF<7$HA6(p(0g+@smhSN?$iAtVlP;y zy=y4k5*Po5!~+c~7SbHckg7C1bdlx`7tfium}AzqvS-n6!$oxDrWpVmK$+HXgq6kb z+bCv)h+!Ifa)kH*ded_wL~GDn>_`ls`>DrB$Z2`@Ya@lCU{B|yBr!hXCk#DRT&@OS z)shCT+d-ossYV{g0EM(&kPWTf{C?bSlq`~hL9Q!PFs$d;XH!I;in;Fo7X|jkJ*21! z@P25wnIKYiuF%0rLJQ)TW0OTs<*~8z$*H0ZCVP{nib!l=v*)IZV+O>pfippY`ry%n zx(!UEQSXS(bbgj77Fy3UBx%T~A<5&%dFbC+=tP~V)@+P%Gic;&(Ex?|fSo_-yV;_J z(uB&sEt;jiioG`F*rr&HD^ycltjIwV89|jF`VGA{M=Xe~9qx7w1ad-kmn#yk7p^H>uDT4<6LZDS zN<)g7Ct6r13b|bxd{4s-f!lF(^U;GRS}7?5CngMiX<*WeLtL(h`Eim5jvDe}O44)5 z!$&743>`jx$f$9y75w+%;j~g>^5Rl<272(!hCSJm5&3sW-iKj#JMY)K9 z5l&5q!sVn!(LV@Hoe7W;F%K>yXdzs#aCb&6qZ;pC{CZ2%D*44x9fpj0VMxlj;mOF; zTU&1_z45%r_9FKOq|M0o)~;RhILcfgN}Kf}oq(rk{{m62Mkjz=rtWaLEHA+2BDWke zCS}N=f#cD0cj(6bAD0u*vsi@`fL7d9K z6cEwKArn!J#H1nZhfJ(q#QEG?<65+Tp?DP{dQ%chBfRzLTGYW+54u63L4-H*E_}?1 zL-D)_ct1eh7l~#nc7@O)F{#RPQBG41fXk#XEZ-dimrMRST<#8UQ`5!x`Y`odELy}C zD&`dY4-f=b*9`*TuZzQ0QkAeIMkj)GnR=;X8C-uK7G7Q zl=Xq#=*MNEn(`VIUJm}eliDvA&BDXWI=Q(N=Et-gGuwDNhY)Q%LK^z29}=28sMcr@ zF>1ffPX0jb;+b8Q55+t+D311gD7r+Cj&r-}p)jL{5B4B%TJPDr_M|2sD2Cf&eRD7*?D&+1l5Q-vk z-g_-3V6|!1S`3qe>9e(>88lqlI*}N1wW`|{#hF#3m)41RQ0>`14{Z2maQXZ;{bCgJRzo4e4TQGlVYwD+)o9d~UsHRk2$_%Y;UrF$0r_ z5AuL9jvJWBjIm*Lx2q!DFYt82Lrd0+Mj*+L;Lq4(Dn3J()&onIDSQK*hV;}1(b#NR z!|8+_==BZI(KMt58$>OiZx$WdAR5FTN2EBUa2swRxZd140j1oP8d8OgB2h`DSsO*Q zDz$66dCKbQ57z@X11{q}_aC=w4&J@~4e8QG(WXk?e?-6bSoF@DL}Ki2Xe=BFWQof< z%)qxgr~WRUC3v>c*-hvxHz{hfco*Gu^Jb_ka;VA{$T{)UYl|2e{dS$lss1qh0;xV1 za3Iyg2+dY8QhAnEZv{f0eZuYPjm)m#sgB1B|AqHv43n}=lnpCU7tOip3d(rGpgK!M zOB%Bc`s>=Xc$+8(`rorn^nv&uy@eL$zK>Oi8Ey^0E-5+g#FuZE|hwEEB%z}@RnA7H= zDD_@`iR9e*&z}P?hL`;T+;Qn=wDkw^cje445Yga*28Cn6ejS6svfS2g=iP-=tiyEr zN3lNkuY(9Kj))xJ|0h33toOdOvoE9HDTnCzPoie{gRc-hs8Auu#4`_5=oRsb`qmM8 z^9p86n`q4yQ8M)C5yVgn6>?c;>G%~q z*s5SS_xvKBDK`BZ1csR=1cUH!I9$%9-%#2wNM;8u_(e>HqN(_=&>GG?MM=Mk(rCl! zzoNr@O%<<-4#k&!%cTIuZA)+X4j&iw;t2By`3G{s_eW^Tb*REtpQm%z#jEP- z@2STP(WKBX-{TVvwJ^~N_i5P;Q9gRv1^B64to@V6QYHIGgoF=%%I$LJ69VXeH+%LP-^A@YD7m!D72J(_-4Zop?~ZkN z7*kBop8l~UIK}OPf;sClt-2*XRFbLVZBbS~17GVNjk_(bV8Yn@4mfJ=IA>J(ljhwK zZF-d$?{-BatvYa-Z+qcC5sf7YISG)${&VAoq_i9|ba?WR!SJ7g_*}GMh{rtk5LjP3 zxXc0hZx}ssSM(1PFQNchzoIs)O=diUf?S>#Dd=|*7yTZBI5vydp5)QvJwr#om^`?V zXA?F39kSU$yWj8P*C6Gx-R?dHo#-E5amI&qxc%{2M?7Wmq|=zcL<_Cxt6-%paX7+4 zWGBFZY_rp=^wtWIQgb)_1Enc1+!aN68p(MF!1&it@bmQ1-{KQxJxzEZy2dtn-7R@+ zeMGB<#|tx`EypljdjOngAsQ6@5f8=Ch@E)vi=dBGmn#PDPRe*FW`y^gT4FK2LFgsrM>Z<1!c@O5kICnGU*fuHQbZqx4&feSIy_AI!GTv7gV!c zbOu0t=9&$c1>}WrSs2fvm>{!U=K}zFRQ?(+)5h>*%pD=n$r)rLkLxD5@H#p5*{yH9MPDTz3_6pV@Kp0GwgH0<^|KeaOr+9 z?&n<=8;}nD&7@_8%>j1h!sgsy#kO}9F?&U!O*jrHV5NL13SJ~%qOskHU(|Ta^-s&U zj3O@UihLVU!e#x=Z$WA4nBz}7&9BEJ5xzjarhi-9Wql}Lha4#ljS#;Ed-`WZVsoZ^ z&wHsYqMSUP$^pyg#~{*=9H7Pjlvx|G?nq!xnFG6vxvZ(*a!9?3zmJ3xVjcr}T5f}h zpGLT>OAX1PSxwD(=2tn67?(tqo0-)#vCr))icM4GxH7QKDCWEYe7nx5O3D4FnYg3ixc3Yy+K{$ha?V3@eIKGOm7$+k2j0g zUj>kf$QyOguz@K92aT7J4oS$H%!^Nr{M4b1tDtY5DSD%M-2tA_ zGD|Of4e_~4OrUzr&3B`k9B?Rf8N8mv!v$?Zmz$e2utqkfh1oz!qE#)-O6sZ^bfSeh zSNWL+wKPY=`KF~=m)CDvnJhE5fTLFbg3?-ZaVzs}jFatKnn39{xkW!fZ`xZ(;^%*Jy9n3JQrn?leRB<21A*>ez{v zbwpdI(}|A2!#dIu5IK+PB$&;@Jtv&GOntcF6p>&Sp*abrP`c6L1hWMurQau*KmHU*<6!a{Rl9F zrvsk;ct+z%#WN32HlEFR_To8-Cl}9EJg%cC7@qQYp1{)z&qzEU;MtAm8$1{B`E)@`eG~SuFdcPlocP2zH%rj;#rWYQEcZ`s!K9BM6V8Nsj za`r}=1UN8}ZGbD{@rG~5dtjo|0kcrz4WEH`mKg$JX80|9ejwua0PqlBy-MY#O)6H6 z_eP$=e!hqhJn&ut4=WdrQUC6stYehg-E3An@eF2A@O=VL5j!5QMlcD>1n5nU=&bnPs0lWkkE$jLT zZX8_WoHPATq=7xn1k3yNUVP06@xo=$Wy%D=5T%n1Yxzq^BkT5ct+Ct-sZ?5T~V;Mc%H>G z2~Q_Hui|09L_9Cxc_|<62{#E(KRhXTrr_at{5*$eIG*g2Zr9X&zdmqB5FbjbI&4xWwxhjL0>bW)WN-lfWkC-*bfXZjjHrFo7G9nb%g3yWT9LxFT5{5 z4=?-|V3yX>XmNjVv^2T|C)FD|;gPRH(AW^~e5r*#0*5^Uj|I%E!JFPofO`bMQvov@ z@P-cojMBvUJley9smB|k5MWsV`^y35>uRB+hkzq3KJ)0m!H~7>ZiCGIYP-Cj9R~C| zK8(WSg;(R9KlZ|F9)Z_B0&k!?{mp2aFw`v5%lpm7N8&I>Skvzf4+qR`=!N4Sf!9Cs zJ$NbSArj3<3@0TM&AJiZPruKvYaaDaG#hmGde;R(1?GtDECq5*dIbIvFwb4UzClYz znB{7Cy;tQ2?}W?9d?Vk*1i&{EU#8zim|fLM*X@=g%@ImOzZ-7JGG^feX6XHBZ<5&u zOPwW0nGMwPzfreQW^;4!Z;tl$mMv6_Kq^Eg&zdSobUqNaN3)UNmZd_ ztSdjDTFF3FLmHHfiB8f@N0yijm-%l?`j|rx&~M4+Tl%gaL6LQ7@@TUpu6ZzHjC<_y zdvQAQukcv+Zn-75>;gJu*)R}h4()|oK_Fz(^}^%4FqIr*HjYld?M#zigUdWR4KCMX z4vijTwu#*aFcjckxQvUR;6fO6U5AT=5bfJBX4xojv{HARYR^HiLS;vpQREqGhCmLg zHWqAm0)i{xs~9}oStr=z#+qBTh{pFF5v>#axa^Io!OLJk=``qNvsU;fgz`AB4pgl0 z1T~7by=?YVo}eNV5Nm+lY=W5*l=?5$wL{&ABma2Tg+FK^K6wCt1uvK73ltjvdS7y3 z!!I;yRZXriX4`m5)bhStbFkSlwD=Zya!>cBo3B!Iy=sn089n&LL0Az}Mbg0JM5_Io Hx%mG95dbKh delta 63044 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 bLv+kECMHZ6Hgzb@rJN!j9Z!0q@y`DP=1SDq diff --git a/compiler/src/model/build-model.ts b/compiler/src/model/build-model.ts index f59d1359fb..dffbde8b7c 100644 --- a/compiler/src/model/build-model.ts +++ b/compiler/src/model/build-model.ts @@ -67,6 +67,7 @@ export function compileEndpoints (): Record { name: api, description: spec.documentation.description, docUrl: spec.documentation.url, + docTag: spec.docTag, // Setting these values by default should be removed // when we no longer use rest-api-spec stubs as the // source of truth for stability/visibility. diff --git a/compiler/src/model/json-spec.ts b/compiler/src/model/json-spec.ts index 491321b5ec..ff4739b308 100644 --- a/compiler/src/model/json-spec.ts +++ b/compiler/src/model/json-spec.ts @@ -61,6 +61,7 @@ export interface JsonSpec { description: string required?: boolean } + docTag?: string } export default function buildJsonSpec (): Map { diff --git a/compiler/src/model/metamodel.ts b/compiler/src/model/metamodel.ts index 9e73372d1c..f67053936a 100644 --- a/compiler/src/model/metamodel.ts +++ b/compiler/src/model/metamodel.ts @@ -408,7 +408,7 @@ export class Endpoint { docId?: string deprecation?: Deprecation availability: Availabilities - + docTag?: string /** * If the request value is `null` it means that there is not yet a * request type definition for this endpoint. diff --git a/compiler/src/model/utils.ts b/compiler/src/model/utils.ts index e330242eef..60e8ab7f31 100644 --- a/compiler/src/model/utils.ts +++ b/compiler/src/model/utils.ts @@ -625,7 +625,7 @@ export function hoistRequestAnnotations ( request: model.Request, jsDocs: JSDoc[], mappings: Record, response: model.TypeName | null ): void { const knownRequestAnnotations = [ - 'rest_spec_name', 'behavior', 'class_serializer', 'index_privileges', 'cluster_privileges', 'doc_id', 'availability' + 'rest_spec_name', 'behavior', 'class_serializer', 'index_privileges', 'cluster_privileges', 'doc_id', 'availability', 'doc_tag' ] // in most of the cases the jsDocs comes in a single block, // but it can happen that the user defines multiple single line jsDoc. @@ -696,6 +696,9 @@ export function hoistRequestAnnotations ( for (const [availabilityName, availabilityValue] of Object.entries(availabilities)) { endpoint.availability[availabilityName] = availabilityValue } + } else if (tag === 'doc_tag') { + assert(jsDocs, value.trim() !== '', `Request ${request.name.name}'s @doc_tag cannot be empty`) + endpoint.docTag = value.trim() } else { assert(jsDocs, false, `Unhandled tag: '${tag}' with value: '${value}' on request ${request.name.name}`) } From 21bfe67ff3ab1a1ed77032054e9866384c32b00c Mon Sep 17 00:00:00 2001 From: lcawl Date: Fri, 27 Sep 2024 14:45:17 -0700 Subject: [PATCH 2/9] Add @doc_tag to create datastream endpoint --- output/openapi/elasticsearch-openapi.json | 2 +- output/openapi/elasticsearch-serverless-openapi.json | 2 +- output/schema/schema.json | 3 ++- .../create_data_stream/IndicesCreateDataStreamRequest.ts | 1 + 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/output/openapi/elasticsearch-openapi.json b/output/openapi/elasticsearch-openapi.json index 3f8184d024..595186b0c3 100644 --- a/output/openapi/elasticsearch-openapi.json +++ b/output/openapi/elasticsearch-openapi.json @@ -10765,7 +10765,7 @@ }, "put": { "tags": [ - "indices" + "data stream" ], "summary": "Create a data stream", "description": "Creates a data stream.\nYou must have a matching index template with data stream enabled.", diff --git a/output/openapi/elasticsearch-serverless-openapi.json b/output/openapi/elasticsearch-serverless-openapi.json index 89b49e7af8..282279af7d 100644 --- a/output/openapi/elasticsearch-serverless-openapi.json +++ b/output/openapi/elasticsearch-serverless-openapi.json @@ -6422,7 +6422,7 @@ }, "put": { "tags": [ - "indices" + "data stream" ], "summary": "Create a data stream", "description": "Creates a data stream.\nYou must have a matching index template with data stream enabled.", diff --git a/output/schema/schema.json b/output/schema/schema.json index 47fc6f06c5..cd8ea00ce7 100644 --- a/output/schema/schema.json +++ b/output/schema/schema.json @@ -6148,6 +6148,7 @@ } }, "description": "Create a data stream.\nCreates a data stream.\nYou must have a matching index template with data stream enabled.", + "docTag": "data stream", "docUrl": "https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html", "name": "indices.create_data_stream", "privileges": { @@ -127906,7 +127907,7 @@ } } ], - "specLocation": "indices/create_data_stream/IndicesCreateDataStreamRequest.ts#L24-L57" + "specLocation": "indices/create_data_stream/IndicesCreateDataStreamRequest.ts#L24-L58" }, { "kind": "response", diff --git a/specification/indices/create_data_stream/IndicesCreateDataStreamRequest.ts b/specification/indices/create_data_stream/IndicesCreateDataStreamRequest.ts index c52129519a..9a22677a50 100644 --- a/specification/indices/create_data_stream/IndicesCreateDataStreamRequest.ts +++ b/specification/indices/create_data_stream/IndicesCreateDataStreamRequest.ts @@ -29,6 +29,7 @@ import { Duration } from '@_types/Time' * @availability stack since=7.9.0 stability=stable * @availability serverless stability=stable visibility=public * @index_privileges create_index + * @doc_tag data stream */ export interface Request extends RequestBase { path_parts: { From bc802916b146016c54d61dac6e48bf804bb8cc53 Mon Sep 17 00:00:00 2001 From: lcawl Date: Fri, 27 Sep 2024 15:04:13 -0700 Subject: [PATCH 3/9] Update modeling-guide.md --- docs/modeling-guide.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/modeling-guide.md b/docs/modeling-guide.md index 123a844acb..b34470daf5 100644 --- a/docs/modeling-guide.md +++ b/docs/modeling-guide.md @@ -631,6 +631,24 @@ class Request { foobar,/guide/en/example ``` +#### `@doc_tag` + +An OpenAPI tag that is used to group similar endpoints in the API documentation. +If it is absent, by default the tag is derived from the first part of the namespace. + +```ts +/** + * @rest_spec_name api + * @doc_tag my tag + */ +class Request { + ... +} +``` + +NOTE: In the OpenAPI specification, operations can have multiple tags. However, we currently support only a single tag. + + #### `@codegen_name` A custom name that can be used to display the property. Useful in Enums and From 38f7c3f1c5c0b88d04645ef69caf0b41e076b78b Mon Sep 17 00:00:00 2001 From: lcawl Date: Fri, 27 Sep 2024 15:11:25 -0700 Subject: [PATCH 4/9] Add docTag to typescript generator metamodel --- typescript-generator/src/metamodel.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/typescript-generator/src/metamodel.ts b/typescript-generator/src/metamodel.ts index 9e73372d1c..039004d2f1 100644 --- a/typescript-generator/src/metamodel.ts +++ b/typescript-generator/src/metamodel.ts @@ -126,6 +126,7 @@ export class Property { description?: string docUrl?: string docId?: string + docTag?: string serverDefault?: boolean | string | number | string[] | number[] deprecation?: Deprecation availability?: Availabilities From dc435004a5a118d69e943205a0a4f37897b8596f Mon Sep 17 00:00:00 2001 From: lcawl Date: Fri, 27 Sep 2024 15:36:13 -0700 Subject: [PATCH 5/9] Add more @doc_tag values --- output/openapi/elasticsearch-openapi.json | 18 +++++++-------- .../elasticsearch-serverless-openapi.json | 14 +++++------ output/schema/schema.json | 23 ++++++++++++------- .../IndicesCreateDataStreamRequest.ts | 2 +- .../IndicesDataStreamsStatsRequest.ts | 1 + .../IndicesDeleteDataStreamRequest.ts | 1 + .../IndicesMigrateToDataStreamRequest.ts | 1 + .../MlPutDataFrameAnalyticsRequest.ts | 1 + specification/ml/put_job/MlPutJobRequest.ts | 1 + .../MlPutTrainedModelRequest.ts | 1 + .../BehavioralAnalyticsPutRequest.ts | 1 + 11 files changed, 39 insertions(+), 25 deletions(-) diff --git a/output/openapi/elasticsearch-openapi.json b/output/openapi/elasticsearch-openapi.json index 595186b0c3..231cbe579b 100644 --- a/output/openapi/elasticsearch-openapi.json +++ b/output/openapi/elasticsearch-openapi.json @@ -10765,7 +10765,7 @@ }, "put": { "tags": [ - "data stream" + "Data stream" ], "summary": "Create a data stream", "description": "Creates a data stream.\nYou must have a matching index template with data stream enabled.", @@ -10819,7 +10819,7 @@ }, "delete": { "tags": [ - "indices" + "Data stream" ], "summary": "Delete data streams", "description": "Deletes one or more data streams and their backing indices.", @@ -10875,7 +10875,7 @@ "/_data_stream/_stats": { "get": { "tags": [ - "indices" + "Data stream" ], "summary": "Get data stream stats", "description": "Retrieves statistics for one or more data streams.", @@ -10896,7 +10896,7 @@ "/_data_stream/{name}/_stats": { "get": { "tags": [ - "indices" + "Data stream" ], "summary": "Get data stream stats", "description": "Retrieves statistics for one or more data streams.", @@ -12972,7 +12972,7 @@ "/_data_stream/_migrate/{name}": { "post": { "tags": [ - "indices" + "Data stream" ], "summary": "Convert an index alias to a data stream", "description": "Converts an index alias to a data stream.\nYou must have a matching index template that is data stream enabled.\nThe alias must meet the following criteria:\nThe alias must have a write index;\nAll indices for the alias must have a `@timestamp` field mapping of a `date` or `date_nanos` field type;\nThe alias must not have any filters;\nThe alias must not use custom routing.\nIf successful, the request removes the alias and creates a data stream with the same name.\nThe indices for the alias become hidden backing indices for the stream.\nThe write index for the alias becomes the write index for the stream.", @@ -16739,7 +16739,7 @@ }, "put": { "tags": [ - "ml" + "Machine learning data frame analytics" ], "summary": "Create a data frame analytics job", "description": "This API creates a data frame analytics job that performs an analysis on the\nsource indices and stores the outcome in a destination index.", @@ -17577,7 +17577,7 @@ }, "put": { "tags": [ - "ml" + "Machine learning anomaly detection" ], "summary": "Create an anomaly detection job", "description": "If you include a `datafeed_config`, you must have read index privileges on the source index.", @@ -17996,7 +17996,7 @@ }, "put": { "tags": [ - "ml" + "Machine learning trained model" ], "summary": "Create a trained model", "description": "Enable you to supply a trained model that is not created by data frame analytics.", @@ -25911,7 +25911,7 @@ }, "put": { "tags": [ - "search_application" + "Behavioral analytics" ], "summary": "Create a behavioral analytics collection", "operationId": "search-application-put-behavioral-analytics", diff --git a/output/openapi/elasticsearch-serverless-openapi.json b/output/openapi/elasticsearch-serverless-openapi.json index 282279af7d..aad4b26c73 100644 --- a/output/openapi/elasticsearch-serverless-openapi.json +++ b/output/openapi/elasticsearch-serverless-openapi.json @@ -6422,7 +6422,7 @@ }, "put": { "tags": [ - "data stream" + "Data stream" ], "summary": "Create a data stream", "description": "Creates a data stream.\nYou must have a matching index template with data stream enabled.", @@ -6476,7 +6476,7 @@ }, "delete": { "tags": [ - "indices" + "Data stream" ], "summary": "Delete data streams", "description": "Deletes one or more data streams and their backing indices.", @@ -7825,7 +7825,7 @@ "/_data_stream/_migrate/{name}": { "post": { "tags": [ - "indices" + "Data stream" ], "summary": "Convert an index alias to a data stream", "description": "Converts an index alias to a data stream.\nYou must have a matching index template that is data stream enabled.\nThe alias must meet the following criteria:\nThe alias must have a write index;\nAll indices for the alias must have a `@timestamp` field mapping of a `date` or `date_nanos` field type;\nThe alias must not have any filters;\nThe alias must not use custom routing.\nIf successful, the request removes the alias and creates a data stream with the same name.\nThe indices for the alias become hidden backing indices for the stream.\nThe write index for the alias becomes the write index for the stream.", @@ -10092,7 +10092,7 @@ }, "put": { "tags": [ - "ml" + "Machine learning data frame analytics" ], "summary": "Create a data frame analytics job", "description": "This API creates a data frame analytics job that performs an analysis on the\nsource indices and stores the outcome in a destination index.", @@ -10719,7 +10719,7 @@ }, "put": { "tags": [ - "ml" + "Machine learning anomaly detection" ], "summary": "Create an anomaly detection job", "description": "If you include a `datafeed_config`, you must have read index privileges on the source index.", @@ -11007,7 +11007,7 @@ }, "put": { "tags": [ - "ml" + "Machine learning trained model" ], "summary": "Create a trained model", "description": "Enable you to supply a trained model that is not created by data frame analytics.", @@ -16218,7 +16218,7 @@ }, "put": { "tags": [ - "search_application" + "Behavioral analytics" ], "summary": "Create a behavioral analytics collection", "operationId": "search-application-put-behavioral-analytics", diff --git a/output/schema/schema.json b/output/schema/schema.json index cd8ea00ce7..c7f1eaba2a 100644 --- a/output/schema/schema.json +++ b/output/schema/schema.json @@ -6148,7 +6148,7 @@ } }, "description": "Create a data stream.\nCreates a data stream.\nYou must have a matching index template with data stream enabled.", - "docTag": "data stream", + "docTag": "Data stream", "docUrl": "https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html", "name": "indices.create_data_stream", "privileges": { @@ -6189,6 +6189,7 @@ } }, "description": "Get data stream stats.\nRetrieves statistics for one or more data streams.", + "docTag": "Data stream", "docUrl": "https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html", "name": "indices.data_streams_stats", "privileges": { @@ -6344,6 +6345,7 @@ } }, "description": "Delete data streams.\nDeletes one or more data streams and their backing indices.", + "docTag": "Data stream", "docUrl": "https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html", "name": "indices.delete_data_stream", "privileges": { @@ -7224,6 +7226,7 @@ } }, "description": "Convert an index alias to a data stream.\nConverts an index alias to a data stream.\nYou must have a matching index template that is data stream enabled.\nThe alias must meet the following criteria:\nThe alias must have a write index;\nAll indices for the alias must have a `@timestamp` field mapping of a `date` or `date_nanos` field type;\nThe alias must not have any filters;\nThe alias must not use custom routing.\nIf successful, the request removes the alias and creates a data stream with the same name.\nThe indices for the alias become hidden backing indices for the stream.\nThe write index for the alias becomes the write index for the stream.", + "docTag": "Data stream", "docUrl": "https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html", "name": "indices.migrate_to_data_stream", "privileges": { @@ -11457,6 +11460,7 @@ }, "description": "Create a data frame analytics job.\nThis API creates a data frame analytics job that performs an analysis on the\nsource indices and stores the outcome in a destination index.", "docId": "put-dfanalytics", + "docTag": "Machine learning data frame analytics", "docUrl": "https://www.elastic.co/guide/en/elasticsearch/reference/{branch}/put-dfanalytics.html", "name": "ml.put_data_frame_analytics", "privileges": { @@ -11596,6 +11600,7 @@ } }, "description": "Create an anomaly detection job.\nIf you include a `datafeed_config`, you must have read index privileges on the source index.", + "docTag": "Machine learning anomaly detection", "docUrl": "https://www.elastic.co/guide/en/elasticsearch/reference/current/ml-put-job.html", "name": "ml.put_job", "privileges": { @@ -11642,6 +11647,7 @@ } }, "description": "Create a trained model.\nEnable you to supply a trained model that is not created by data frame analytics.", + "docTag": "Machine learning trained model", "docUrl": "https://www.elastic.co/guide/en/elasticsearch/reference/current/put-trained-models.html", "name": "ml.put_trained_model", "privileges": { @@ -14442,6 +14448,7 @@ } }, "description": "Create a behavioral analytics collection.", + "docTag": "Behavioral analytics", "docUrl": "https://www.elastic.co/guide/en/elasticsearch/reference/master/put-analytics-collection.html", "name": "search_application.put_behavioral_analytics", "request": { @@ -128054,7 +128061,7 @@ } } ], - "specLocation": "indices/data_streams_stats/IndicesDataStreamsStatsRequest.ts#L23-L48" + "specLocation": "indices/data_streams_stats/IndicesDataStreamsStatsRequest.ts#L23-L49" }, { "kind": "response", @@ -128509,7 +128516,7 @@ } } ], - "specLocation": "indices/delete_data_stream/IndicesDeleteDataStreamRequest.ts#L24-L51" + "specLocation": "indices/delete_data_stream/IndicesDeleteDataStreamRequest.ts#L24-L52" }, { "kind": "response", @@ -131786,7 +131793,7 @@ } } ], - "specLocation": "indices/migrate_to_data_stream/IndicesMigrateToDataStreamRequest.ts#L24-L58" + "specLocation": "indices/migrate_to_data_stream/IndicesMigrateToDataStreamRequest.ts#L24-L59" }, { "kind": "response", @@ -166840,7 +166847,7 @@ } ], "query": [], - "specLocation": "ml/put_data_frame_analytics/MlPutDataFrameAnalyticsRequest.ts#L30-L141" + "specLocation": "ml/put_data_frame_analytics/MlPutDataFrameAnalyticsRequest.ts#L30-L142" }, { "kind": "response", @@ -167831,7 +167838,7 @@ } ], "query": [], - "specLocation": "ml/put_job/MlPutJobRequest.ts#L30-L112" + "specLocation": "ml/put_job/MlPutJobRequest.ts#L30-L113" }, { "kind": "response", @@ -168609,7 +168616,7 @@ } } ], - "specLocation": "ml/put_trained_model/MlPutTrainedModelRequest.ts#L31-L127" + "specLocation": "ml/put_trained_model/MlPutTrainedModelRequest.ts#L31-L128" }, { "kind": "response", @@ -184267,7 +184274,7 @@ } ], "query": [], - "specLocation": "search_application/put_behavioral_analytics/BehavioralAnalyticsPutRequest.ts#L22-L35" + "specLocation": "search_application/put_behavioral_analytics/BehavioralAnalyticsPutRequest.ts#L22-L36" }, { "kind": "response", diff --git a/specification/indices/create_data_stream/IndicesCreateDataStreamRequest.ts b/specification/indices/create_data_stream/IndicesCreateDataStreamRequest.ts index 9a22677a50..685cb96314 100644 --- a/specification/indices/create_data_stream/IndicesCreateDataStreamRequest.ts +++ b/specification/indices/create_data_stream/IndicesCreateDataStreamRequest.ts @@ -29,7 +29,7 @@ import { Duration } from '@_types/Time' * @availability stack since=7.9.0 stability=stable * @availability serverless stability=stable visibility=public * @index_privileges create_index - * @doc_tag data stream + * @doc_tag Data stream */ export interface Request extends RequestBase { path_parts: { diff --git a/specification/indices/data_streams_stats/IndicesDataStreamsStatsRequest.ts b/specification/indices/data_streams_stats/IndicesDataStreamsStatsRequest.ts index 37ab70805b..d0e2ac619b 100644 --- a/specification/indices/data_streams_stats/IndicesDataStreamsStatsRequest.ts +++ b/specification/indices/data_streams_stats/IndicesDataStreamsStatsRequest.ts @@ -27,6 +27,7 @@ import { ExpandWildcards, IndexName } from '@_types/common' * @availability stack since=7.9.0 stability=stable * @availability serverless stability=stable visibility=private * @index_privileges monitor + * @doc_tag Data stream */ export interface Request extends RequestBase { path_parts: { diff --git a/specification/indices/delete_data_stream/IndicesDeleteDataStreamRequest.ts b/specification/indices/delete_data_stream/IndicesDeleteDataStreamRequest.ts index aeaf579adc..dc542e4197 100644 --- a/specification/indices/delete_data_stream/IndicesDeleteDataStreamRequest.ts +++ b/specification/indices/delete_data_stream/IndicesDeleteDataStreamRequest.ts @@ -28,6 +28,7 @@ import { Duration } from '@_types/Time' * @availability stack since=7.9.0 stability=stable * @availability serverless stability=stable visibility=public * @index_privileges delete_index + * @doc_tag Data stream */ export interface Request extends RequestBase { path_parts: { diff --git a/specification/indices/migrate_to_data_stream/IndicesMigrateToDataStreamRequest.ts b/specification/indices/migrate_to_data_stream/IndicesMigrateToDataStreamRequest.ts index b4e5b18105..d3a2cba669 100644 --- a/specification/indices/migrate_to_data_stream/IndicesMigrateToDataStreamRequest.ts +++ b/specification/indices/migrate_to_data_stream/IndicesMigrateToDataStreamRequest.ts @@ -37,6 +37,7 @@ import { Duration } from '@_types/Time' * @availability stack since=7.9.0 stability=stable * @availability serverless stability=stable visibility=public * @index_privileges manage + * @doc_tag Data stream */ export interface Request extends RequestBase { path_parts: { diff --git a/specification/ml/put_data_frame_analytics/MlPutDataFrameAnalyticsRequest.ts b/specification/ml/put_data_frame_analytics/MlPutDataFrameAnalyticsRequest.ts index dc9cf21434..9f1f79485b 100644 --- a/specification/ml/put_data_frame_analytics/MlPutDataFrameAnalyticsRequest.ts +++ b/specification/ml/put_data_frame_analytics/MlPutDataFrameAnalyticsRequest.ts @@ -37,6 +37,7 @@ import { integer } from '@_types/Numeric' * @cluster_privileges manage_ml * @index_privileges create_index, index, manage, read, view_index_metadata * @doc_id put-dfanalytics + * @doc_tag Machine learning data frame analytics */ export interface Request extends RequestBase { path_parts: { diff --git a/specification/ml/put_job/MlPutJobRequest.ts b/specification/ml/put_job/MlPutJobRequest.ts index 0391075377..aeea5fb6b2 100644 --- a/specification/ml/put_job/MlPutJobRequest.ts +++ b/specification/ml/put_job/MlPutJobRequest.ts @@ -35,6 +35,7 @@ import { Duration } from '@_types/Time' * @availability serverless stability=stable visibility=public * @index_privileges read * @cluster_privileges manage_ml + * @doc_tag Machine learning anomaly detection */ export interface Request extends RequestBase { path_parts: { diff --git a/specification/ml/put_trained_model/MlPutTrainedModelRequest.ts b/specification/ml/put_trained_model/MlPutTrainedModelRequest.ts index 1488ac9bea..7206ed430c 100644 --- a/specification/ml/put_trained_model/MlPutTrainedModelRequest.ts +++ b/specification/ml/put_trained_model/MlPutTrainedModelRequest.ts @@ -35,6 +35,7 @@ import { Definition, Input } from './types' * @availability stack since=7.10.0 stability=stable * @availability serverless stability=stable visibility=public * @cluster_privileges manage_ml + * @doc_tag Machine learning trained model */ export interface Request extends RequestBase { path_parts: { diff --git a/specification/search_application/put_behavioral_analytics/BehavioralAnalyticsPutRequest.ts b/specification/search_application/put_behavioral_analytics/BehavioralAnalyticsPutRequest.ts index b0b813c666..a684844c5f 100644 --- a/specification/search_application/put_behavioral_analytics/BehavioralAnalyticsPutRequest.ts +++ b/specification/search_application/put_behavioral_analytics/BehavioralAnalyticsPutRequest.ts @@ -24,6 +24,7 @@ import { Name } from '@_types/common' * @rest_spec_name search_application.put_behavioral_analytics * @availability stack since=8.8.0 stability=experimental * @availability serverless stability=experimental visibility=public + * @doc_tag Behavioral analytics */ export interface Request extends RequestBase { path_parts: { From 6438ecce5e379ae3782b6ec53aa88de784fd386c Mon Sep 17 00:00:00 2001 From: lcawl Date: Fri, 27 Sep 2024 15:57:27 -0700 Subject: [PATCH 6/9] Update naming.md --- api-design-guidelines/naming.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api-design-guidelines/naming.md b/api-design-guidelines/naming.md index 6ebd58feb1..d503b408ac 100644 --- a/api-design-guidelines/naming.md +++ b/api-design-guidelines/naming.md @@ -100,6 +100,8 @@ Care should be given to ensure that: - All member APIs of a given namespace are logically related and form a coherent set. - Related functionality is not distributed across multiple arbitrary namespaces +NOTE: The endpoint namespaces are used to generate tags in the OpenAPI documents. The tags are ultimately used to group the endpoints in the API documentation. To override the default tag, use `@doc_tag`. + ### Use the global namespace sparingly The top-level global namespace should be treated with particular care. It is traditionally reserved for search and document endpoints only. A case should be made and a broader discussion carried out before new endpoints unrelated to these functions are added to the global namespace. From 53aadf44dfcf813f93e0ee83c6cc3c9b89f692a3 Mon Sep 17 00:00:00 2001 From: lcawl Date: Tue, 1 Oct 2024 07:50:43 -0700 Subject: [PATCH 7/9] Copy metamodel from compiler to typescript-generator --- typescript-generator/src/metamodel.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/typescript-generator/src/metamodel.ts b/typescript-generator/src/metamodel.ts index 039004d2f1..f67053936a 100644 --- a/typescript-generator/src/metamodel.ts +++ b/typescript-generator/src/metamodel.ts @@ -126,7 +126,6 @@ export class Property { description?: string docUrl?: string docId?: string - docTag?: string serverDefault?: boolean | string | number | string[] | number[] deprecation?: Deprecation availability?: Availabilities @@ -409,7 +408,7 @@ export class Endpoint { docId?: string deprecation?: Deprecation availability: Availabilities - + docTag?: string /** * If the request value is `null` it means that there is not yet a * request type definition for this endpoint. From 47d2ea61da6bdecc847a64d199b2a212c8892ab1 Mon Sep 17 00:00:00 2001 From: lcawl Date: Tue, 1 Oct 2024 14:10:58 -0700 Subject: [PATCH 8/9] Revert "Add more @doc_tag values" This reverts commit dc435004a5a118d69e943205a0a4f37897b8596f. --- output/openapi/elasticsearch-openapi.json | 18 +++++++-------- .../elasticsearch-serverless-openapi.json | 14 +++++------ output/schema/schema.json | 23 +++++++------------ .../IndicesCreateDataStreamRequest.ts | 2 +- .../IndicesDataStreamsStatsRequest.ts | 1 - .../IndicesDeleteDataStreamRequest.ts | 1 - .../IndicesMigrateToDataStreamRequest.ts | 1 - .../MlPutDataFrameAnalyticsRequest.ts | 1 - specification/ml/put_job/MlPutJobRequest.ts | 1 - .../MlPutTrainedModelRequest.ts | 1 - .../BehavioralAnalyticsPutRequest.ts | 1 - 11 files changed, 25 insertions(+), 39 deletions(-) diff --git a/output/openapi/elasticsearch-openapi.json b/output/openapi/elasticsearch-openapi.json index 28524d25d8..5bd457c80c 100644 --- a/output/openapi/elasticsearch-openapi.json +++ b/output/openapi/elasticsearch-openapi.json @@ -10765,7 +10765,7 @@ }, "put": { "tags": [ - "Data stream" + "data stream" ], "summary": "Create a data stream", "description": "Creates a data stream.\nYou must have a matching index template with data stream enabled.", @@ -10819,7 +10819,7 @@ }, "delete": { "tags": [ - "Data stream" + "indices" ], "summary": "Delete data streams", "description": "Deletes one or more data streams and their backing indices.", @@ -10875,7 +10875,7 @@ "/_data_stream/_stats": { "get": { "tags": [ - "Data stream" + "indices" ], "summary": "Get data stream stats", "description": "Retrieves statistics for one or more data streams.", @@ -10896,7 +10896,7 @@ "/_data_stream/{name}/_stats": { "get": { "tags": [ - "Data stream" + "indices" ], "summary": "Get data stream stats", "description": "Retrieves statistics for one or more data streams.", @@ -12972,7 +12972,7 @@ "/_data_stream/_migrate/{name}": { "post": { "tags": [ - "Data stream" + "indices" ], "summary": "Convert an index alias to a data stream", "description": "Converts an index alias to a data stream.\nYou must have a matching index template that is data stream enabled.\nThe alias must meet the following criteria:\nThe alias must have a write index;\nAll indices for the alias must have a `@timestamp` field mapping of a `date` or `date_nanos` field type;\nThe alias must not have any filters;\nThe alias must not use custom routing.\nIf successful, the request removes the alias and creates a data stream with the same name.\nThe indices for the alias become hidden backing indices for the stream.\nThe write index for the alias becomes the write index for the stream.", @@ -16739,7 +16739,7 @@ }, "put": { "tags": [ - "Machine learning data frame analytics" + "ml" ], "summary": "Create a data frame analytics job", "description": "This API creates a data frame analytics job that performs an analysis on the\nsource indices and stores the outcome in a destination index.", @@ -17577,7 +17577,7 @@ }, "put": { "tags": [ - "Machine learning anomaly detection" + "ml" ], "summary": "Create an anomaly detection job", "description": "If you include a `datafeed_config`, you must have read index privileges on the source index.", @@ -17996,7 +17996,7 @@ }, "put": { "tags": [ - "Machine learning trained model" + "ml" ], "summary": "Create a trained model", "description": "Enable you to supply a trained model that is not created by data frame analytics.", @@ -25911,7 +25911,7 @@ }, "put": { "tags": [ - "Behavioral analytics" + "search_application" ], "summary": "Create a behavioral analytics collection", "operationId": "search-application-put-behavioral-analytics", diff --git a/output/openapi/elasticsearch-serverless-openapi.json b/output/openapi/elasticsearch-serverless-openapi.json index 61cee937a0..3cdd8372fb 100644 --- a/output/openapi/elasticsearch-serverless-openapi.json +++ b/output/openapi/elasticsearch-serverless-openapi.json @@ -6422,7 +6422,7 @@ }, "put": { "tags": [ - "Data stream" + "data stream" ], "summary": "Create a data stream", "description": "Creates a data stream.\nYou must have a matching index template with data stream enabled.", @@ -6476,7 +6476,7 @@ }, "delete": { "tags": [ - "Data stream" + "indices" ], "summary": "Delete data streams", "description": "Deletes one or more data streams and their backing indices.", @@ -7825,7 +7825,7 @@ "/_data_stream/_migrate/{name}": { "post": { "tags": [ - "Data stream" + "indices" ], "summary": "Convert an index alias to a data stream", "description": "Converts an index alias to a data stream.\nYou must have a matching index template that is data stream enabled.\nThe alias must meet the following criteria:\nThe alias must have a write index;\nAll indices for the alias must have a `@timestamp` field mapping of a `date` or `date_nanos` field type;\nThe alias must not have any filters;\nThe alias must not use custom routing.\nIf successful, the request removes the alias and creates a data stream with the same name.\nThe indices for the alias become hidden backing indices for the stream.\nThe write index for the alias becomes the write index for the stream.", @@ -10092,7 +10092,7 @@ }, "put": { "tags": [ - "Machine learning data frame analytics" + "ml" ], "summary": "Create a data frame analytics job", "description": "This API creates a data frame analytics job that performs an analysis on the\nsource indices and stores the outcome in a destination index.", @@ -10719,7 +10719,7 @@ }, "put": { "tags": [ - "Machine learning anomaly detection" + "ml" ], "summary": "Create an anomaly detection job", "description": "If you include a `datafeed_config`, you must have read index privileges on the source index.", @@ -11007,7 +11007,7 @@ }, "put": { "tags": [ - "Machine learning trained model" + "ml" ], "summary": "Create a trained model", "description": "Enable you to supply a trained model that is not created by data frame analytics.", @@ -16218,7 +16218,7 @@ }, "put": { "tags": [ - "Behavioral analytics" + "search_application" ], "summary": "Create a behavioral analytics collection", "operationId": "search-application-put-behavioral-analytics", diff --git a/output/schema/schema.json b/output/schema/schema.json index 9d3df460c2..86a194ac62 100644 --- a/output/schema/schema.json +++ b/output/schema/schema.json @@ -6148,7 +6148,7 @@ } }, "description": "Create a data stream.\nCreates a data stream.\nYou must have a matching index template with data stream enabled.", - "docTag": "Data stream", + "docTag": "data stream", "docUrl": "https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html", "name": "indices.create_data_stream", "privileges": { @@ -6189,7 +6189,6 @@ } }, "description": "Get data stream stats.\nRetrieves statistics for one or more data streams.", - "docTag": "Data stream", "docUrl": "https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html", "name": "indices.data_streams_stats", "privileges": { @@ -6345,7 +6344,6 @@ } }, "description": "Delete data streams.\nDeletes one or more data streams and their backing indices.", - "docTag": "Data stream", "docUrl": "https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html", "name": "indices.delete_data_stream", "privileges": { @@ -7226,7 +7224,6 @@ } }, "description": "Convert an index alias to a data stream.\nConverts an index alias to a data stream.\nYou must have a matching index template that is data stream enabled.\nThe alias must meet the following criteria:\nThe alias must have a write index;\nAll indices for the alias must have a `@timestamp` field mapping of a `date` or `date_nanos` field type;\nThe alias must not have any filters;\nThe alias must not use custom routing.\nIf successful, the request removes the alias and creates a data stream with the same name.\nThe indices for the alias become hidden backing indices for the stream.\nThe write index for the alias becomes the write index for the stream.", - "docTag": "Data stream", "docUrl": "https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html", "name": "indices.migrate_to_data_stream", "privileges": { @@ -11460,7 +11457,6 @@ }, "description": "Create a data frame analytics job.\nThis API creates a data frame analytics job that performs an analysis on the\nsource indices and stores the outcome in a destination index.", "docId": "put-dfanalytics", - "docTag": "Machine learning data frame analytics", "docUrl": "https://www.elastic.co/guide/en/elasticsearch/reference/{branch}/put-dfanalytics.html", "name": "ml.put_data_frame_analytics", "privileges": { @@ -11600,7 +11596,6 @@ } }, "description": "Create an anomaly detection job.\nIf you include a `datafeed_config`, you must have read index privileges on the source index.", - "docTag": "Machine learning anomaly detection", "docUrl": "https://www.elastic.co/guide/en/elasticsearch/reference/current/ml-put-job.html", "name": "ml.put_job", "privileges": { @@ -11647,7 +11642,6 @@ } }, "description": "Create a trained model.\nEnable you to supply a trained model that is not created by data frame analytics.", - "docTag": "Machine learning trained model", "docUrl": "https://www.elastic.co/guide/en/elasticsearch/reference/current/put-trained-models.html", "name": "ml.put_trained_model", "privileges": { @@ -14448,7 +14442,6 @@ } }, "description": "Create a behavioral analytics collection.", - "docTag": "Behavioral analytics", "docUrl": "https://www.elastic.co/guide/en/elasticsearch/reference/master/put-analytics-collection.html", "name": "search_application.put_behavioral_analytics", "request": { @@ -128061,7 +128054,7 @@ } } ], - "specLocation": "indices/data_streams_stats/IndicesDataStreamsStatsRequest.ts#L23-L49" + "specLocation": "indices/data_streams_stats/IndicesDataStreamsStatsRequest.ts#L23-L48" }, { "kind": "response", @@ -128516,7 +128509,7 @@ } } ], - "specLocation": "indices/delete_data_stream/IndicesDeleteDataStreamRequest.ts#L24-L52" + "specLocation": "indices/delete_data_stream/IndicesDeleteDataStreamRequest.ts#L24-L51" }, { "kind": "response", @@ -131793,7 +131786,7 @@ } } ], - "specLocation": "indices/migrate_to_data_stream/IndicesMigrateToDataStreamRequest.ts#L24-L59" + "specLocation": "indices/migrate_to_data_stream/IndicesMigrateToDataStreamRequest.ts#L24-L58" }, { "kind": "response", @@ -166905,7 +166898,7 @@ } ], "query": [], - "specLocation": "ml/put_data_frame_analytics/MlPutDataFrameAnalyticsRequest.ts#L30-L142" + "specLocation": "ml/put_data_frame_analytics/MlPutDataFrameAnalyticsRequest.ts#L30-L141" }, { "kind": "response", @@ -167896,7 +167889,7 @@ } ], "query": [], - "specLocation": "ml/put_job/MlPutJobRequest.ts#L30-L113" + "specLocation": "ml/put_job/MlPutJobRequest.ts#L30-L112" }, { "kind": "response", @@ -168674,7 +168667,7 @@ } } ], - "specLocation": "ml/put_trained_model/MlPutTrainedModelRequest.ts#L31-L128" + "specLocation": "ml/put_trained_model/MlPutTrainedModelRequest.ts#L31-L127" }, { "kind": "response", @@ -184332,7 +184325,7 @@ } ], "query": [], - "specLocation": "search_application/put_behavioral_analytics/BehavioralAnalyticsPutRequest.ts#L22-L36" + "specLocation": "search_application/put_behavioral_analytics/BehavioralAnalyticsPutRequest.ts#L22-L35" }, { "kind": "response", diff --git a/specification/indices/create_data_stream/IndicesCreateDataStreamRequest.ts b/specification/indices/create_data_stream/IndicesCreateDataStreamRequest.ts index 685cb96314..9a22677a50 100644 --- a/specification/indices/create_data_stream/IndicesCreateDataStreamRequest.ts +++ b/specification/indices/create_data_stream/IndicesCreateDataStreamRequest.ts @@ -29,7 +29,7 @@ import { Duration } from '@_types/Time' * @availability stack since=7.9.0 stability=stable * @availability serverless stability=stable visibility=public * @index_privileges create_index - * @doc_tag Data stream + * @doc_tag data stream */ export interface Request extends RequestBase { path_parts: { diff --git a/specification/indices/data_streams_stats/IndicesDataStreamsStatsRequest.ts b/specification/indices/data_streams_stats/IndicesDataStreamsStatsRequest.ts index d0e2ac619b..37ab70805b 100644 --- a/specification/indices/data_streams_stats/IndicesDataStreamsStatsRequest.ts +++ b/specification/indices/data_streams_stats/IndicesDataStreamsStatsRequest.ts @@ -27,7 +27,6 @@ import { ExpandWildcards, IndexName } from '@_types/common' * @availability stack since=7.9.0 stability=stable * @availability serverless stability=stable visibility=private * @index_privileges monitor - * @doc_tag Data stream */ export interface Request extends RequestBase { path_parts: { diff --git a/specification/indices/delete_data_stream/IndicesDeleteDataStreamRequest.ts b/specification/indices/delete_data_stream/IndicesDeleteDataStreamRequest.ts index dc542e4197..aeaf579adc 100644 --- a/specification/indices/delete_data_stream/IndicesDeleteDataStreamRequest.ts +++ b/specification/indices/delete_data_stream/IndicesDeleteDataStreamRequest.ts @@ -28,7 +28,6 @@ import { Duration } from '@_types/Time' * @availability stack since=7.9.0 stability=stable * @availability serverless stability=stable visibility=public * @index_privileges delete_index - * @doc_tag Data stream */ export interface Request extends RequestBase { path_parts: { diff --git a/specification/indices/migrate_to_data_stream/IndicesMigrateToDataStreamRequest.ts b/specification/indices/migrate_to_data_stream/IndicesMigrateToDataStreamRequest.ts index d3a2cba669..b4e5b18105 100644 --- a/specification/indices/migrate_to_data_stream/IndicesMigrateToDataStreamRequest.ts +++ b/specification/indices/migrate_to_data_stream/IndicesMigrateToDataStreamRequest.ts @@ -37,7 +37,6 @@ import { Duration } from '@_types/Time' * @availability stack since=7.9.0 stability=stable * @availability serverless stability=stable visibility=public * @index_privileges manage - * @doc_tag Data stream */ export interface Request extends RequestBase { path_parts: { diff --git a/specification/ml/put_data_frame_analytics/MlPutDataFrameAnalyticsRequest.ts b/specification/ml/put_data_frame_analytics/MlPutDataFrameAnalyticsRequest.ts index 9f1f79485b..dc9cf21434 100644 --- a/specification/ml/put_data_frame_analytics/MlPutDataFrameAnalyticsRequest.ts +++ b/specification/ml/put_data_frame_analytics/MlPutDataFrameAnalyticsRequest.ts @@ -37,7 +37,6 @@ import { integer } from '@_types/Numeric' * @cluster_privileges manage_ml * @index_privileges create_index, index, manage, read, view_index_metadata * @doc_id put-dfanalytics - * @doc_tag Machine learning data frame analytics */ export interface Request extends RequestBase { path_parts: { diff --git a/specification/ml/put_job/MlPutJobRequest.ts b/specification/ml/put_job/MlPutJobRequest.ts index aeea5fb6b2..0391075377 100644 --- a/specification/ml/put_job/MlPutJobRequest.ts +++ b/specification/ml/put_job/MlPutJobRequest.ts @@ -35,7 +35,6 @@ import { Duration } from '@_types/Time' * @availability serverless stability=stable visibility=public * @index_privileges read * @cluster_privileges manage_ml - * @doc_tag Machine learning anomaly detection */ export interface Request extends RequestBase { path_parts: { diff --git a/specification/ml/put_trained_model/MlPutTrainedModelRequest.ts b/specification/ml/put_trained_model/MlPutTrainedModelRequest.ts index 7206ed430c..1488ac9bea 100644 --- a/specification/ml/put_trained_model/MlPutTrainedModelRequest.ts +++ b/specification/ml/put_trained_model/MlPutTrainedModelRequest.ts @@ -35,7 +35,6 @@ import { Definition, Input } from './types' * @availability stack since=7.10.0 stability=stable * @availability serverless stability=stable visibility=public * @cluster_privileges manage_ml - * @doc_tag Machine learning trained model */ export interface Request extends RequestBase { path_parts: { diff --git a/specification/search_application/put_behavioral_analytics/BehavioralAnalyticsPutRequest.ts b/specification/search_application/put_behavioral_analytics/BehavioralAnalyticsPutRequest.ts index a684844c5f..b0b813c666 100644 --- a/specification/search_application/put_behavioral_analytics/BehavioralAnalyticsPutRequest.ts +++ b/specification/search_application/put_behavioral_analytics/BehavioralAnalyticsPutRequest.ts @@ -24,7 +24,6 @@ import { Name } from '@_types/common' * @rest_spec_name search_application.put_behavioral_analytics * @availability stack since=8.8.0 stability=experimental * @availability serverless stability=experimental visibility=public - * @doc_tag Behavioral analytics */ export interface Request extends RequestBase { path_parts: { From a3b903c25572de06c224291e7042de5511763bdd Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Thu, 3 Oct 2024 08:15:17 -0700 Subject: [PATCH 9/9] Update compiler-rs/clients_schema_to_openapi/src/paths.rs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Laurent Saint-Félix --- compiler-rs/clients_schema_to_openapi/src/paths.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/compiler-rs/clients_schema_to_openapi/src/paths.rs b/compiler-rs/clients_schema_to_openapi/src/paths.rs index 719a612d55..878646970a 100644 --- a/compiler-rs/clients_schema_to_openapi/src/paths.rs +++ b/compiler-rs/clients_schema_to_openapi/src/paths.rs @@ -196,7 +196,11 @@ pub fn add_endpoint( // Create the operation, it will be repeated if we have several methods let operation = openapiv3::Operation { - tags: if endpoint.doc_tag.is_some() {vec![endpoint.doc_tag.clone().expect("TODO: panic message")]} else {vec![namespace.to_string()]}, + tags: if let Some(doc_tag) = &endpoint.doc_tag { + vec![doc_tag.clone()] + } else { + vec![namespace.to_string()] + }, summary: sum_desc.summary, description: sum_desc.description, // external_docs: tac.convert_external_docs(endpoint),