From cd0997ec5812e76addfb4f0327221a83f6085cea Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Wed, 16 Aug 2023 16:03:04 -0400 Subject: [PATCH 01/54] chore: Moving word doc to github --- .../intents/user-interest/media/image1.png | Bin 0 -> 14294 bytes .../intents/user-interest/media/image2.png | Bin 0 -> 14615 bytes .../intents/user-interest/media/image3.png | Bin 0 -> 16673 bytes .../intents/user-interest/media/image4.png | Bin 0 -> 15496 bytes .../specifications/intents/user-interest.md | 290 ++++++++++++++++++ 5 files changed, 290 insertions(+) create mode 100644 requirements/images/specifications/intents/user-interest/media/image1.png create mode 100644 requirements/images/specifications/intents/user-interest/media/image2.png create mode 100644 requirements/images/specifications/intents/user-interest/media/image3.png create mode 100644 requirements/images/specifications/intents/user-interest/media/image4.png create mode 100644 requirements/specifications/intents/user-interest.md diff --git a/requirements/images/specifications/intents/user-interest/media/image1.png b/requirements/images/specifications/intents/user-interest/media/image1.png new file mode 100644 index 0000000000000000000000000000000000000000..b0171a9a4ca0e95d45314ce3ce84ff6669623e19 GIT binary patch literal 14294 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 literal 0 HcmV?d00001 diff --git a/requirements/images/specifications/intents/user-interest/media/image2.png b/requirements/images/specifications/intents/user-interest/media/image2.png new file mode 100644 index 0000000000000000000000000000000000000000..94102a60fa1d79eab4760418b07643dae07bd5b0 GIT binary patch literal 14615 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 literal 0 HcmV?d00001 diff --git a/requirements/images/specifications/intents/user-interest/media/image4.png b/requirements/images/specifications/intents/user-interest/media/image4.png new file mode 100644 index 0000000000000000000000000000000000000000..6a15fe0c612806675309696195d47143ed946315 GIT binary patch literal 15496 zcmch;cQo9=_b`kQM1rVE)K#OmAXZ<&B1-gCB4KqRdT+5L`s&e%-evWkM8YC^T_qA0 zVHeRm&q}`E-*cXGp7*?ez3-mme9pad+uWJCGxyGj)X`GCbL+t^JUqNRYTzfjcz8G9 zcz6U{BsXvvDzB7&+=tLsQBx5Q?_)gK`AZ@k%xVSJ)x^W|r=c&H()z#JU@$u5qQcq9M$jHdX#>V;id24H{xw*NY zpWnN8?^07!!^0yI5)&PqoK{wU@9rJ+_VzhDJNx+fZvWYxo|!EuDCp?yTKu`x)YNo% zc(}5%A|@ubwY9arft{V5A08f#j*eDQQ7J7gH8L`?x3}Nk-l?vsJv%#_o14qX$jHzC zkd&O#-QBIPudk%6JTf}g+SdN92MM*YSz2E4^zz!-*+HRDt82f%_4WsaMFJJnU%C6u zFD%9-zCSxZFD)ytsj1P>HO1&0@wR64x&-oR{rtZ$y3UyO`RT0*ayzO)-1pGwQjYwzmT(1F-nU3s})y|TYT z_FQG8UO_Fcf_$(3Y+p@|U%h>E)z)&g^y{j&>Z&OJ3LbM+QF_u)cQP_^6d8VwUirQ7 zMP#eln`)<; zb8Sg`|oRN=UnR!fX-0$^`wBD=6rsj81(Q6x< zvp>+IQwu{Ab4x4he|Gk!=YL@~|NLD3y|cT&@*A^`*;@FuI)Pf;+}`<<>3a`1;qWar zRG;9zBVq#M0MgfBh&vwMz0B)Bd^OLoWE_&%Lrqhec$Jj=F0rV;hgu*Wo)m}L6GeTW z+0E=oE9&Wv?YHJPUy@N$)>_`BBeU#nBT#(#mj7{kL!Wa}u{f!hab2TYhQ#LJs?#H_ zj3WEgDTx){5d_gJGNQ;Z8OaWz;d>a+*i-+!x~}=rKYx*>n>IqyK%bzKmCOo z*ZZhdLR$ILt#6nh0+e|V>-jaFqe61{O;Ff(NnfH0Q|{RH^PZ-Z81<$bn!t)k`4~o$ ziXK7dM0afNkj^zkQyEC)@d%Vnv^v#=z4~0qy&<5cf6dRmcz9~_HjB`(M3*5^A4f9) z9_i_#>VrxY>k6pxGK|nXs2?PMe1BfCKcNtTuQ@7Z=P8K8W``NB{SOEqD%Q-DFm0O6 z^rQn4R}ER;80%Yc+nlP>90Zd6qg+=2PbyZpqe49TNqtN9LZmT)y(%M8cFTH=aRG9R z&x~*_0iahcj*f!Uh*}+8WU|3S>Xf#|Ctl7^7vg7MTR`54nQ{F-LBbjN>KtI zSbNfW+c#kem)5s3ttpb0YO*cSq%8)h`gZ|kKp3rNm zL`CX8*H~NDmtCLIYCm4gv`;z(HSnU_4KJ+vq_`VA+^v*z#^hE})B}5(uG-=-NM1mF!15Q8q11T8JmjTp z?|PYkvvjq4sL3pFIC^#i9b};@Ir^fuHYA>us$P6xN=>@W{IDglt|(Z&6}YZOzEj89 z<3({N;jHk1wLGvjTDD&4y-=d)!7eDF#F&&=bOB9yI7Kw&roD#B9GUxONgwz@r!cs- zHM}Aat?AeHmK91^%O&kKO3r@4qvF;mOzd4R+zgja$qx4b5Zk#ogq@Fn+a5p0Y&T>^ zJUX zLbk*u;t5WcnU;p;;B_QLzz1#lSaenl3QGCBo#)hv-MoN&%DjcGb#OswhQVWwEk7rK z8WO@T%Lep)aVTztRP<7pooYF(OIj*XFB*{6nxt`q%c~k}2zW)_I8jJ_$U&Rf;RgS) zy~!#Lt$`?wEvjfso~1EP{yLW-K|xL2JdiyzE!KP$1d>fIAL`;f0zAc1JQ-T*iaG+_ zzrzYeB#=t}NIJw!0?+<##ye8A*?>S<-3p`%4Eu9j%p9lrkKO>;x-k(-8omyehH-Fb z4||VANL8KN4bBMUuny`NBA@F{j(I=8VxLAosDHSj>1XD`eRc4zysl|6D3}EG)azqp zPg~P&&WDfTu|-?0(Swh51-5@oekmXFA>{#8bt9_YQ{Rv=Zyz-jUb}z#ead_s#!piA z{ZPE)^Tc;DKown?9`cPnU8cjP&7C(Ot(e=9Ag@*8TSTLbzuibsn?Bw3c0=QB9k|Ig z?;Jaiomp>hOV`hw`?l%7GzDd%X}yEU0DWa6JHj_bD)OCY@5;#o;`Lxhh252mIVc+_keeh<@$t5MC#p&0q^WvAS&GyVY8}+sR z(x~^2WK5XI6!-)}F(You`H(W&rik^+LggdIUq3hi>n(KaEydqj4j~eEMD>9Difv8+ zU+;0olDo1mE6N$DTt-ooj&c|p#Po^iB}46b1pHZE$AZ*K*SPQYke8=bg+yXF)=kB1 zmL_qMfT`vjP2Olq3`@H#;wzR= zT*19Yo!ByAdhY>cu)&N*lycoTGNU}u$uMzHdQ5VwZ|y|LPFQ|o@akUekO2#TX9YOHJ#J_$3Ne1FtN{L$z*|^Ai=2BYYlf6#o>|udK=U)-R(#bsz|gskKom1K z9di}Kj0uipI-l5P1I%+WWdO+}7a3{NMRTObDDtCqt( z`rEoahqDxs-n3*gZYLyHI>8?+v{#9YJ;@+1vgMCjbd_(O0vW{))8jfr$tx&k6yp%4 zs1p!ScH~!cruV}+DIM&GW$|pwNOa9Zn$CL|^Hk0y_Kjh#C{zE@C`-<$k*D>Ij1Oi=Pz;Rb#^*|inwZ<^ ziFVMSe#4F@Ty7=J5&mMz+0cI_+-G$7ou|Y%%HL8Ft^oa&=Tlu>zRe zS8Uu)XP-5CRoE_;G-K$E)Qeex;BWjmD_9HHJfgpS(Cdyk7ob%v-)4j%KU52V&S zlgP{Rrx$`CphPDwM~IbQferzNN7eGzd$>;jhXn>*EyL<&$wKX^>uo*rCAP&yJE_3X zh)%#feRmvT3Ax8o?LM+$Ceb}(%A2yaIF0=|8NZ^zPdr|6f9k>jpr7=2yBCY0vbqYj zA+ELIhYYNkb`%eu5+E=Xjk~H80=gF`e`(mo(JyV#FZC0tAoE|^rQIH3E~uthmbC<* z1>F2gP$2V%)pPgHjlnp}K;wSC-bRFlk{7$4TgoiJC_7BzD`I8O*S;cwke6ZYQ;;S4 zht1oMg8cGdJ=zPF=yygGC6>zTxzp_cdxCUsn~^E!4-8RHnYmPcOk=@QVJl8fo|=<2 z9|SbXA#KLLARH#htmyDUzDJtK8@*};v^S)wjI~tVP39Z|=phoTZc8nRPO+sGht9C?dJsG(W&=?&19P|BgCbjC6TlZ7Vnu1J!UimI1>HVMo_p(z|H zo#-*fWtX!sOi`5W4*@oLL)*aQp7j1qnucB;)ku2Le19vOh?(c_L1RPse)&@`x`gLD zdZDt`b@v5R;v}WBtcERTgKv*KUl|EP-%_?E0A$~eQVwlB=GE`);IG+|oU@8lK3Lcwfr1XazNSK$yY03jRqz#TQ3|(#*{Z(Pk23@1lr^}w+R-=Yf5^6GL*U^9z9m(=D!*f0yrH6 zFTw3_y7|cZ(h1|-k3XFv4|loGzT(ai$}^e(X?M#^SWr-2Lo9(yo!5I>0pGTqH!Ubq zmli{Y*-&^CMAs-RCDFi883b;ETW(tVYcP3fV3n5Ue|+ryI9bHQF;^WYx0qc=7iqJg z)aj7j(ZLZWF!?lIYpuM-o)|C*;zLe)_Apejc~?A6|4IgVbT<>S!bE1!a)iKokYWE! z(jbP#s_dP=r8UB^ALSPsdZ7(3nMle~7d(yNFwe4yo3z|XK7fw+JH9Y}V^wn84mEJ1 zbuqLSeOPQ{`7&SB)P|^EJp}H6f~yx{$eYE{8qX4#@Bj<%Hf69}e3@O8nS&W&vIM<; z=3YsYE%`>HSVph4d4^9WLKHM4l)5|v7)Hw#nZk!fw4l~?D!u!aq!8h`_i=KC1{Q3K2?~{N-+QC)i<}L0`acsunQQbDl{2> zMsYkxeu%wi#YAP2(a~Nl=Psl%d>9u5APZPZ*iu$#%YP1lD9;TZhGFlvsT|Tp{2mRX zMA%nq7R8BEx;i@)vr!8bI=(M{NTad$>%rRd)Jm7%KYok~6*lA-X3s3sByK;3Q~OCD zy{~NT6ou*c?W*(`^EhzHu@)*JgY??9ejIviS@%`c;;&sRJ?Yt;5T2UcC$+b(LFBVJ zmb}U7Y#p$<0ieGbn;4Sj+YG6Keyeyw26^4Rwbxo6zcQAB8W?Nou=??1a&*=rk#WHs zOHcbFq{X7xGfZ~D+2w=U(R*x-Cq5lc^_YHnLq1&k1C&d26f^}ImE#cYzZTt-cslO! zm>~r^tcc`QKoa5sl*mj-NF8qc{jRTssxtq0%egVHfE;;42Wovez-vXsOhGAHpEud! zB=I>MEoV6imb?>>V1~gxZ{jknI#PZP*+0Kz-+tsu&5S4@+=Czd2aR@ZT>ljLOO_i% zcKEoqbo6QVl)gjR`S{<=EmQLaVANPZTgk{`2U7zdFfqE0?wNU@vE{=}*?_CSdp4fq zBL{uwx2%b53;u?FT;mpBy39S3%HB5%v7B|qla;^n|Jy=d#}nT%qccXf`GmRZOv4vE z%4_sDn%9-7B8h#KBULJ*Q_3b1TDy`9jP**k{&weJA5a$gcGTvewmv~zW-Ll#{y(1HH=cNqUz>gdz^S0>Nuo+nZ!-Ny z$><@F`fo;zQa}>b*>M_RyT*f{g9+JTJfHiO|EEusZu$JrHHf4S<);#YO)G|jpzFsD z8^L4t$O#kLwo&_kmVg8){Z0%V%rouh68i0{P_b2CP!e9HZ-{Qx|3@`_&#m$)#UH-t z&CxL0WEpi&nyOiTY5mVP6aH&7*_$EnnKY&9mqQKArrT#!%qDe1vRm%@vHzPQ^mJxp zM2PREvk3*WXH0V=)3QXdp>*qe@A`6K-GBb1bi*GxEa$e}0yr`@cpfCgGDtF;WlOLa zuT?*u)4x~tcfK%?pdPpBt+*L)3uBZdRRb^q!t9(D`~M~ru2FbEH^r@gPNLXcw2|4& z;;`0m9kTjgJ7YmLJEiUIlSEC(b={hdbtvoO`6d!}Izkl50E*Uh2{$pV zH|fBK@S+tn17`adAoF zyQ^#fjzA)X zUX<&9u<}~)0nz|Av#TT4d;0vVV!fCJnY8{qSiR#sY7)ync6b^Bj}hbiAuc2B_iDfL zeNKN|Z0s#f?d;%lr2EkO7a+fo_r zJweXB&3z(2|77`r$3jm2tsZe5zXR3@M3R{df%e*>ZQ+dUDK2X5)bfc3fRjPnCwjhx z9{K$oo}K^-{kcD*>>RWSuW|!^HdBhFkEnsA)bQ!XdLRb3PO$D0!$vw7qHdp$QNF`T zX|pcHTHvjF>v}mX3@r+>18^4Gp`0#-l?Oa2L$RYan%)17e=Ky8Bg9PaIUEhZ(>H~L9 zzdJypeM@O}m3!CPf4XnBtUX7B2Q-K@9z#(iC5X1D?5r6vM@nYDP zyR$7a-JbUaWCxuG5Cvi-zuynqtrJvft8v;jNU1qX^WL)p$qjbMIL6f=f?FEtjT-E{_d{#Jf=uu+3*s&2|Bjd)>S*d=flE{v=X4v3l=Mkg6^)Au9YF75&Dj zz4#)Ftk1WvlmoqoW(?LU*Xy3FPm$epb&FZ-_;fC#WCmy`@}+6<)%B6?kp&LSRzCem z_GO(+3m_|ww!d6mfysPxn6fpNMU}#DF5EwPa#C^*8r%5j7Mnqm41L{aVy5~Lt~Cg@ zK0eo|X+Pxk+-so^wz*f6(4Q~~7wYVp;A{&1Y=NxMtjGww{FoaVrP~NEba^b{r7{t7 zSdUf{>9@LNug#YsFj)76^GvFO{x?R+hL^0*VMgx*H%=$_?@r_jvE~4Y+F2Hb#Bc;j z?V}Wj6hSmljf@!fkYiJ@Q$c>OWH_@5Meoa^n>E0P?y^;`vYXB+96jBQu2zK}0hAXL z<^%m=+%xpw3_WmrB9lYQoXvikZQG$ z!c)?Ov_`i0DR_xK)6+*iCP!DxG!Us*0;{>bHEQpM9>e5jm7%QxVAz@;aH24zSCr(1X_jdSe{{%btFm<<_gwU?3wg47d@X}V zvZpqJp{fE+fk3>RdQ4&uZ~*TvbKhhT67MHDk@5Xg)SDyjGcakO+ZC)BXdYL495&$ z?*x6&1p_~+!+?Pik{2pSc9c7Il?d2zoZS47!-~|mU!75YK+IEchB|Txy_@t3fND;# zYer$Q(o3*sNNF3MtI zYIuJ7y{|-tQ7blf79OUY!FyFXjuuHB;C*FNy4g_u2=Xa!D73q1?AI^i$hgYQjqlb> z5{Xf7?2!tC?-ibCfPs~JiEZ7-{Jy`Hfp<>aPe3Z6*zhsbgSY%IX1gD|noUf`k3_k- ztT*4YVA6VxAcuL7p0vNbbwXVN7pk**E*3LA&t5K6+rP6GA@)p_9iT0%C#zASi^|eh zyUi+d{O3o<*;`23PUx?fnC4%V?16mq~F;V$@u9?+|< zoy%C^J3){*pm?8^;~O7Z+b$}Eha|D!hyV~2fzF)4*R1m@M|pxyDwVQ>jb#B*egd&j;I4|zJ!bI-lo z=T{0VF$l~+0ukb)T|uZry4iI>H*bPw6_9>X9M%{p1%{)_jR;Uc0ZSgxwfAqBWlV1H zl7hv^QR<2o4rZv=q&1~|Qo@Y$Ks3^nkiT&!QFj-0q9b)FNs{}4tc6Zn&I#34(aGX# ztWd@f_!y+qvPhrFsM=U?{W~jkKNPNR%teuIO9Wu2fIX$86g|ZyF8J5l{@($Byj}2l zcX;XH@1#Y4(4P)&iy96|SbZqmB%jSL_dKl!dj3l&80%lda=vjO`bG)Y$ue5?H-|eG zQ!dM0?UzrAn$A8SUDARK2|*6wAM!3nF$e3%HC=w~r)RP!N+b|w9DVEezO;YMC4#D+ zH~c*7^tcc9b6n{6%n(DA92rg@kz(e>rjKT4aupN_x{RY+nx>}Czeft7hMngHVzOuD zsDdiw>?TRq4-)R3FgT#+)aCBr*iIA&RtY+f%OBJah+nqs<{5B8Q!o2Yu*;;96G&H1 z6%djTAZus8whl=%auZGv!Xree|Elkoih3>_*KLs3 zNT(VI;YHLp>upg^ZbA#{R0}*W*CjoH6*{p4pl@^lP&^iHIj&wDHxX#pBc%VEuI06B zC=tvKCyzyT{DFXzqIpua>xwFrsdl}$rh@*dViexr>HhfABLtyx8T#NPf9XHYSM2Ll zEnx|ZVI9!A8*=UUn}xbS1!eXXYc|E}g%b8z)I;dz-ZQWNh@hMt!%t?wIg}7~8`L3} zxI0SPceL^pjO!pi;KolgCf0{kdW5XdHzDwbvTSmlDKO5UxS0PKq$!st7o=Ac|34%o zspL8+WVnza!L`Int<=+Fh?1NZQvGhJAo_KgM?2~nVIe-CLRT9YBFbJt*3zXvyNG>A zFct!zG%k&&rnb;99;s-B_i7aVvQfPYzX_`($PGHbAP7iKWYaMK&xX&B|07T73xc=+ z6{I>Zobo-P;s6Txt=&JN|KYjqTyyy{UoMI!G<=`Eg7ieVjCI@5ixS^g0U6bQZM#0wx3*3Pd&h+;i!?d<_2R6m+#IIrU|PzPEQV!Azq61_d*h z9CJ_}N`#Pu0Km5!VY?R=?fLLzojZqqfZk20A>p{W1_dC5;u`l3+n6ilNOeUGWrKbl zxB?)nE8$RJ>Y${6d7ZZDT3^31j8O~=|1JhX@aoMe7Z3-4A<^O2~h*?i+-x5CZFarInt8cWoZ z;TcdqoE9g*+8`=o^K-1*vBjhcq^2dza7^`;*@Aj>?W6Aq1LVk^Iwu7^x~ivY=*4mp z-)`!9QF+M*wh6=}jcy<+q?+F%pUX}*-~VK+y*1AnLiY;wg$ALE3TfmwX@{n8TzWIz zU_r?3jf`3M@iX8x93S;7`Uf5+O50@yR#OeEQX^1nx9|$gMxyutESIL!G=Qt}<`r+18_^dP3a=KO|VJ6QQ_P`Boe0xIcQo`#rmSy;^n{ zoRup%^KHAFHo^O$U^}sXppYBBZApz;dXD(3uU)~nAARFSTU*)WOg-G6a%vBo(rd)@ zFm{PJeg}amH3LA;JxP3}ekfvi=CWMJ9X?$n`&SUpiviM7RnL-AMC}DaUr!E^#5m&y z@)(xIO_34CI=#eHpMywHt^Sdf(ds*Cj_^snW2c@zPy;rKCiCT4y_QzF%<~AM_=qQI z&@EgX5?k@nWy-hTYp`=Rzi505w=l*-7H_Ozk`y?K|&3RrU)A&!Li z+!pL2xLc%~lp-U(*3N+&E{sNY!FRvLgD88P_4*Gc(z`@$zppn~e##ON6W4@gWr^6Z za=hb8QH7KQGBiq@nb8|cG~x@;x-D^udMfCb@fT{PS&#xsn&D~ifmidxm4x3tWp;oQ-nT+L<0T>rz&@GSlK>LY$e zVvKV2W24pMWig~R(X*m+HY4{80XOSA`kEGg?@)noS1OkG zt=p53eo%Wu*McZ^tt}>h$1ew{aco1T@Sqz8aJp&Jqs=xMn6D!qQMpbdCE4C6X)wEf{*%aNsIzS&xpyXU(Mo+K@ATYUmtCR8dza*ko`_TLA` z9XD(R2j9;%O_H08y$GCn*9w=6slW~oP8_rf>IA*;@i~UMhG=cfPh+X@H+kyh(bkPG z=Qwo>2(_}=%`4xk&5zlb!`wUrGD6HD+C5d<#k#nD- z#|C)u60WyzIn2}9s`VN`ft6AWRsd5HSZ7rBG}r_4#H8rk`yLPj)Q)yU&2NVmVWvjk zGOl(@ovC{;-p6Z5?ovpXz}jpq){5%_4UHe3h#q{*QDjP`^0^8+ZCZU&r$JcXE5G^K z`&m|Q^Rp`|=21Ggs1$65ZQ#JHwe-uWi+khv{XAVr+H7EMb~U@56t3Me$S>m69VzRH zw0keGbHVNUK)HZC)CxXnp4rAc$G~WMC7)dZI9%LztwVZ@=;2)G!;5_U2YS}sQyAbD zh3}m+r8f`tyz-$#cLwQNGTwK2ggL89N>cz7pYXVc?#3LTzfbbHlAE}oYUMfJ$*fFG zxQfy)=Y6|`vwG<-D56Hxky2Kx{hn9~QnuJ&V(aertAUk}j#K#FBYAq9Y`bM@w|;f2 zQEf1e;zOJ^vd`Wfv78ZfrZl9z$6V$4Aj`nTs6$GxLvO9WBCu?65cJwUc&dBf|0F~bCC}^ zF8~ARk39{zutHTYkIu5q4>7)8rs>Mn9t$jPQ^H&Tj&~9%M{nE9Op^{)V_Xj&zz7pm zmM-B5-Fl7oz+5rOfe<)r26&!D)a|&j0C%ir%}DN>X!(j`VLS`a#zkh;q6+|Ke&SK$ z@!{M0NZig;oJ{K$-E0R>=YFj5A1Fj6~1E<$-;0e2Vr22R$uCEROlOlw14<^z*M+frv+hJGqCC?gnk8^6(|7R5u0Z90Q7`!j0H=csiaQc}qgDIEP3ZjuN^l~#1o@}Np zFVJB^bv50^l-*Js=aLVFbF^U?*sKZC#39I9#FZ&5#zXilvD%MtIa2{4>if#rbX|^S9u2zJ3Ed& z?Nb5-$dzSJTN@Aw)Ues&c9>R=z@FwIFPaf$a4T{W`c1i-BM9q9MXHg(R2=z|l(y!e zblbE!Y%+;2Mbb1aNgJ}LkW6^nWD(S7lbU`LG}fSI!zANac){&d&RMkW<%@%nlbP6L)VXbRcy$|>Vv}-E9&5fY(~}+ zPAMlX-tg^GR6@q>ts*%?W}Uv`NeW*+dbhDQ!elwnm~yqCgbc5i!^r z980Nt!*HsaRV=*#J)o0bjLZ4>GEKn^dvHoo8oC4vvCN(0<*Myhi=780@}?G_a<4ov zhnw54E)sqW@eV;@@YodR-QvLP5|I)wW-3s`7hO5d+=~I{A@5+Ct}FQDF2E%BgN;*%oF#*=Z@r(YIOA$TPR&l!=S6SeA`wF%8`;wf_C1PWb_mJ+`!d#T z8$z_O7!iGBu-|@LO3R8bI@gun&0#iH0yH#yuV=+xZYav0;tu#7e3pFUJ427zVj3;G)d!{9p+)`$)HQun@(oP(TIxGm0^*g8Fz44@QB3h|$1-vR-NJ&PNt z+%}3u+))c+5jZ{P$alv_&N!1 zNE}!eEbKeCUfeSJWmj0~G-Sb!W0+d$GZ5+;Q$a?mO*=$BAc5Q^xv!ChAv#|;;+%>9 z&4w1o(eI`_BZEz3;F0+V?^C)3MeVZ*IkKbC$qYCb?bGar?d(KX|MrMO_~B-1i>2Sa z$FNFxJ{iC&CI{3hFL(J?9RxJWIY}nmd@Cydn2@z_>NtEqc1zfj6aAKhu8T(q{oTN* zdu!?VI8CI24Ny4c6TUwj{CbH4y|#@@S`PhejwryYYMhVZBZ@^59nr}{1zW}ic6{2xu3Hu(N#Xj+1VVvZ~oT$u06m$ zCTJ(+r=-PnK6?d6*F{gjrV%{=%88pn&9HroGAA6#BHPC!gFw2}wSwWE-bISJS|F|f zvP?DBmHHMZ|9iXAn{A3*^&QvqO*l~nJxQ6kA4&Q}qJ#;(1G;IVcQFEMw16v*jDG0L z=xbMe3+Xxzgez1bYu4dI+g}g{Q@{k zem7d;<-#j_k@02m+r2%iBxRDVq>!cr5jEo4YvI}O^rqi1^tU|f#E*M-K^w80X!)yU zd6&h@fkkZb+~SohrfqI<;gon=r$-gps!KStzr6O+hvN>;Eg+=);_hnA<>dFf$8jsf zU%|+yhq5>yDF((U14Hh>CLRbvrxNn_=npa8uTbhtu}N@6JwmyQ8`(iIJECw(UHN8s zaLeY-aNvTf#4C^+yCc5`ZG{IOu2?7j6g*768hm(9op10x>3vq^5CNA1Yis}v?$-_T zz^InvR3Gv_kOVkBxL@~Qj`*OfUq2Mm&5!O%1H@d$Nc(E!CI?lypm6&s7x0D9-!P;D zxXM-Sy4r7i>2k#r0W#FQ`*S?rbzdZj)0P=Zcv7*ma|8_%gxw~J#Z3f7ZjP?w(hu=3 zc{tLqOGs1IY+an3=L)O6Af(PnQ(s0|7Tce}W~|+vq+z~`bk|*R`^2uZ)bH`(@cg{Z zJn}Gxb@RtkaqD*kD4Y>YiHBpU1Dh&e985~<;4?(cNq8rpsOl`-%b?1Sm1DBo>4KM1{UcyG4#xg`oO zHz*l6lR$&R*!i5K#8a%}M${ts(asL{#~FOl3|#bj{X7qAq23$BF$CJB!B0B+X{Ch2 zj<|daacke{T(NR0VadD$yB!WCQ3EDAmH%8g8VPiw!I`9XH}OwTX00nej=UDOUlo78 zCcn@cc-CfWiSK>~Mo2~gig-gg))n@NWzaspt5%VcB;5mN$ZNobKlZU?aRGG#rRX}2 z`330IJKx=WOYtZY23I2nMG#PrHECDOjm!my!SO&5pcV|^YNHLeu@KLV*vyMm7m zZzDm-uefI{p|?)7fBmWEHs_ZXtwt&B802K&uTvYXzc*eNeGYu;T$xYm-laT%;3j_X>xrzT5 zjKu#Z1W5cB>|6N@zCNM-%VU;z`!8Ca>a8WiOlH z4Y&PU8^0Z{jGhiizU-`c9+bkVDq!IAPta@QboDB_uHAmejS)HwTR8VW>bFJsQ@4@T z8byZXGNjj4dFW$)3rC}blo@bm^fz8@wp5T8dhaC8ff&BFN9Gp>#<|dv^hCL)?9`yX zp`2+97g3aaxznEl(gtYDJ3?e~D-Ht&CEw9dit?KnH)>hig&A09#NDL^L`!jthGR>g zC#l>ZxlebLxai?%`b~%}lWVv}$N$zx8n--SesX<(#TNkL3Ksf1tWY~_u?ln5AKCh6 zERql9!i;Z0lJY=ag#K+@HvrwslqcpTan=KYcU0A`L>k;$mZ;yw!tpawPXbDsIdKnu znUPSlK|MWW5DDr0NNBcO3Yw`x@8$75Z9urT?`c87Om_|jlTUZJUw7j@oahw!lQOtZ z2e{^w(-jKYq02Pye4v07Ms=iSG;O_ie_i5y$GNIl_w7V*z!)(Q7FDte4DWI;8%E`Oe^_;x{8L=At_Ooqy|8h-Z6kBrDKKJM`K zsGpza!tVSe^SJTlP4n+a%a0YPl?r^=?R0Aa9(l*Khc4BK;kXt!TE(`rE~$Jvt)0(;90Td_Rb-=M9Z}vih1Wig#o_wBwD@-!N;H-$RD#)!j zFFtW{9DV16egl$Yfzy;kVDuqSryh^a2Y!e(6g0CHO!@ z-;e%8s+Yh62L;VFSqlkfH|2)RO*ev1s#BdEhBPPuzT61u#gw`=fV=FC1*uU(>qww% zpuO0$Pc(^xB{VlT{}ciUCkiKB%$I)H}&kdYxSW-4my|4>+AqWop@cGT}VuF3?V}5HM}% z_eu8L_f|`TBXOWpbo*XZINXDjVmMsiLoG{d*9sX_Tch)vy6J@4cUPh0B7>ks8tr!@ zs1Q?CKmyYb5kL#NVYIquIQR=1I8Q!rznbj{(joPBrX{X_44Yr|Nno@DK)>MnTN}WV^{i@k8`Y04jB_q>Mpc~?yS`rY^7}-0x=mM*Jy9+_I~OaBiY{#%o2|MIK42mp z!1j-N`*Df#841H_=f%E_zP5Du+&0u;?QpPiW8QwAosdg&q6#ZK`?fv0h5tDR@!yL* zf~?RsK=a+>tNK*bDi_ z+Pem9&}jH8`ZjLZyhDdgMdjX`>!(P(3Qzs9ODO^5CB8cw@LyWoje4?DWpGPPqiI%9+q?`oH&^ z_|?8(zk#gf#h1yniBfhRyAx81*(6Zn*r&z*mb*;F^Mg7#x`mUklNSpg&IGn zAG=L(`dju~S-R+-AW;s9rfG1qy^y=YApImUPBsPrb;|?EO<>>MFhG_1&^uFdzJsgM zGm9wz)^#LO@J3%)^G-(biuP9mg2mD#q@OAn^H(=2bJ_tZmu!?n%P5=?x;OxR+++9lE=xGUQv;wW6fP+^^NG+t^hx8qX#;D2lKidBP z{(BO7MZquBwg=fvX~!w&^iVeTfWGvw23omU<34zz!lI%A!cqbvkMu<(fx?nNabZ4T nVW6<^im|Hk|H0tw0=2jC{eNaiCb~jjcTY`O>q#}}#hd>HK}D$a literal 0 HcmV?d00001 diff --git a/requirements/specifications/intents/user-interest.md b/requirements/specifications/intents/user-interest.md new file mode 100644 index 000000000..cedfc59bb --- /dev/null +++ b/requirements/specifications/intents/user-interest.md @@ -0,0 +1,290 @@ +# User Interest Intents + +Document Status: Candidate Specification + +See [Firebolt Requirements Governance](../../governance.md) for more info. + +| Contributor | Organization | +| -------------- | -------------- | +| Eugene Chung | Comcast | +| Tim Dibben | Sky | +| Mike Horwitz | Comcast | +| Jeremy LaCivita | Comcast | + +## 1. Overview + +In additional to traditional discovery APIs such as Watch History and +Watch Next, Firebolt provides a more abstract API that facilitates +impromptu content discovery connections between first-party Aggregated +Experiences and third-party Apps. + +The User Interest Capability enables Apps to provide meta-data on +content that the user has expressed an interest in to Aggregated +Experience Apps that have been given access to use this Capability. + +This allows for open ended design of Aggregated Experience App features +that present App-specific content to re-engage the user with the content +inside the originating App. + +While the functionality and UX is left to the Aggregated Experience App, +typically designed by each Firebolt Distributor, the Firebolt API +enables events to register user interest and pass entity meta-data: + +![Diagram Description automatically +generated](../../../requirements/images/specifications/intents/user-interest/media/image1.png) + +Which generally enables Aggregated Experiences to present that entity +meta-data in some way that leads to re-launching the original App at a +later point, using a `navigateTo` notification: + +![Diagram Description automatically +generated](../../../requirements/images/specifications/intents/user-interest/media/image2.png) + +This is just one example of what an Aggregated Experience App might do +with the User Interest API. + +Note that this API **should not** be used to implement Watch History or +Watch Next features. These concepts are much more fundamental to +Firebolt and have explicit APIs so that Firebolt Distributors can keep +track of which apps are using them separately. + +## 2. Table of Contents +- [1. Overview](#1-overview) +- [2. Table of Contents](#2-table-of-contents) +- [3. User Interest from an in-app UX](#3-user-interest-from-an-in-app-ux) +- [4. User Interest from a platform UX](#4-user-interest-from-a-platform-ux) +- [5. User Interest Bulk Updates](#5-user-interest-bulk-updates) +- [6. Core SDK APIs](#6-core-sdk-apis) +- [7. Discovery.interested](#7-discoveryinterested) +- [8. InterestIntent](#8-interestintent) +- [9. Manage SDK APIs](#9-manage-sdk-apis) +- [10. Content.onInterestedIn](#10-contentoninterestedin) +- [11. InterestedInIntent](#11-interestedinintent) + + +## 3. User Interest from an in-app UX + +Some Apps will have a built-in user interface for users to express +interest in content from the App. This could be a \"Favorite\" button, +an in-app \"My List\" button, etc. + +If the App wants to leverage any additional exposure from the device\'s +Aggregated Experience, it can wire up this UI to the Firebolt User +Interest API, in addition to any in-app features that it\'s already +invoking. + +By calling the `Discovery.interested` method with the relevant entity +meta-data, the device\'s Aggregated Experience will be notified of the +user\'s interest in that entity: + +```typescript +Discovery.interested(type:InterestType, entity:EntityInfo) +``` + +The type parameter denotes what sort of interest: + +- `interest` +- `disinterest` + +When this method is called with a valid `EntityInfo`, the platform +**MUST** dispatch a `Content.onInterestedIn` notification to all Apps +that have registered for it (typically Aggregated Experience Apps) with +information about the app, interest type, and the entity. + +If the result is `null` or is not a valid entity, i.e. does not match +the [EntityInfo](../entities/) schema, then no `Content.onInterestedIn` +notification will be dispatched. + +The `Discovery.interested` method **MUST NOT** be used in place of more +specific Discovery methods, e.g. `Discovery.watchNext` or +`Discovery.watched`. These methods facilitate specific UX flows that may +have separate legal opt-outs for each user. + +The `Discovery.interested` method **MUST NOT** be called unless the user +is activating a UI element in the app, or in a second screen experience +that is communicating with the app, that implies interest of some kind. + +**TODO**: This seems like a contractual obligation, as testing this is +non-trivial / impossible. Are we keeping track of contractual +requirements anywhere? + +## 4. User Interest from a platform UX + +Firebolt platforms may provide a platform UX, e.g. voice or and RCU, to +express user interest in content from an active App. To facilitate this +Apps will need to be told about the user\'s expressed interest in their +content. + +In this case, two different intents are required to complete the +interaction. The `InterestIntent` is leveraged by an Aggregated +Experience to let the current foreground app know that the user is +interested in something currently on the screen or selected. Once the +foreground app receives this intent, the flow is much like the previous +use case. + +First, the Aggregated Experience (or some app with the correct +capability) detects that the user is interested in something. In this +picture the interest is triggered by an RCU button, but how this occurs +is outside the scope of this document. When this happens, an +`InterestIntent` is generated and sent to the foreground app. + +![](../../../requirements/images/specifications/intents/user-interest/media/image3.png) + +Next, the foreground app receives and responds to the `InterestIntent` +by providing the EntityInfo, which triggers an `InterestedInIntent`: + +![Diagram Description automatically +generated](../../../requirements/images/specifications/intents/user-interest/media/image4.png) + +A user\'s intention to express interest in something is handled by the +`InterestIntent`. This intent happens *before* the platform knows which +content is displayed and/or selected by the foreground or background +apps. The `InterestIntent` may originate from a cloud system, e.g. +Voice, or from the RCU, or elsewhere. Origination of this intent is out +of scope for this document. This intent includes the type of interest, +e.g. interest or disinterest. + +To fire an `InterestIntent` to the current App, another app, typically +the Aggregated Experience, will call the `Content.interest()` method +of the Discovery SDK. This generates a new intent. + +When this intent occurs, any App in the foreground or background +Lifecycle state, that has registered a callback via the +`Discovery.interested` API **MUST** have that callback invoked with the +`InterestIntent` as the only parameter. + +Once an App\'s callback is invoked, that app will have `interestTimeout` +milliseconds to return a value or throw an error. Values returned after +that time **MUST** be ignored. The timeout value is stored in the +device\'s configuration manifest. + +To be notified when a user expresses interest in the currently displayed +content, an App **MUST** call `Discovery.interested` with a callback +method, to register as a provider of this capability: + +```typescript +Discovery.interested((intent:InterestIntent) => EntityInfo) +``` + +This API uses Firebolt\'s `polymorphic-pull` OpenRPC tag, to specify +that it is a push/pull API. + +If there is a valid entity to return, then the method registered by the +App **MUST** return the currently displayed entity meta-data. + +If there is no valid entity to return, then the method **MUST** throw an +exception. + +If more than one App returns a valid `EntityInfo`, the value from the +App in the foreground **MUST** be used, and the others will be ignored. +If only one is returned, then it may come from the foreground or +background app. See +[Lifecycle](../lifecycle/) for more info on Lifecycle states. + +Once a single `EntityInfo` is selected the platform **MUST** dispatch a +`Content.onInterestedIn` notification to all Apps that have registered +for it (typically Aggregated Experience Apps) with metadata about the +app and entity as its data. + +The `Content.onInterestedIn` event has the `InterestedInIntent` as its +data. + +The platform **MUST NOT** dispatch more than one `onInterestedIn` +notification, even if more than one App responded to the pull request. + +An Aggregated Experience can register for the `Content.onInterestedIn` +notification, and it will receive notifications when an `EntityInfo` is +returned from the active App after a `Discovery.interested` call is +fulfilled. + +## 5. User Interest Bulk Updates + +Sending bulk interest updates, e.g. Entities the user expressed interest +in on a different platform, is not supported. + +## 6. Core SDK APIs + +The following APIs are exposed by the Firebolt Core SDK as part of the +`core:discovery` domain/module. + +See the [Firebolt API +Documentation](https://developer.comcast.com/firebolt/core/sdk/latest/api/) +for details around syntax, errors, and permissions. + +## 7. Discovery.interested + +This is a push/pull API that allows Apps to either push entities that +the user has expressed interest in to the platform, or respond to pull +request from the platform for the same. + +To push an entity that the user is interested in pass an `EntityInfo` +object to the method: + +```typescript +Discovery.interested(type: InterestType, entity: EntityInfo): Promise +``` + +To respond to pull requests for the current entity, because the user has +expressed interest in some way that the platform manages, register a +callback as the parameter: + +```typescript +Discovery.interested((intent:InterestIntent) => EntityInfo): Promise +``` + +The callback takes an `InterestIntent` that provides any context about +the user\'s intention. + +## 8. InterestIntent + +An `InterestIntent` denotes that the user has expressed interest in the +currently displayed and/or selected content: + +```typescript +type InterestIntent { + action: "interest" + data: { + type: "interest" + }, + context: { + source: "rcu" | "voice" + } +} +``` + + +## 9. Manage SDK APIs + +The following APIs are exposed by the Firebolt Core SDK as part of the +`manage:content `domain/module. + +See the [Firebolt API +Documentation](https://developer.comcast.com/firebolt/core/sdk/latest/api/) +for details around syntax, errors, and permissions. + +## 10. Content.onInterestedIn + +This notification allows Aggregated Experience Apps to be informed when +a user expresses interest in some Content, and the content resolves to a +valid Entity from some App. + +`Content.listen('interestedIn', InterestedInIntent => void): Promise` + +The callback will be passed an `InterestedEventData` object with +information about the entity that the user expressed interest in. + +## 11. InterestedInIntent + +`InterestedInIntent` provides information about what the user has +expressed interest in: + +```typescript +type InterestedInIntent { + action: "interestedIn", + data: { + appId: string, + type: InterestType, + entity: EntityInfo + } +} +``` From befa844652c1634274998f545385b8ab0a0ecc37 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Fri, 18 Aug 2023 11:34:14 -0400 Subject: [PATCH 02/54] chore: Fixing ToC --- .../specifications/intents/user-interest.md | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/requirements/specifications/intents/user-interest.md b/requirements/specifications/intents/user-interest.md index cedfc59bb..1e3761b64 100644 --- a/requirements/specifications/intents/user-interest.md +++ b/requirements/specifications/intents/user-interest.md @@ -55,11 +55,11 @@ track of which apps are using them separately. - [4. User Interest from a platform UX](#4-user-interest-from-a-platform-ux) - [5. User Interest Bulk Updates](#5-user-interest-bulk-updates) - [6. Core SDK APIs](#6-core-sdk-apis) -- [7. Discovery.interested](#7-discoveryinterested) -- [8. InterestIntent](#8-interestintent) -- [9. Manage SDK APIs](#9-manage-sdk-apis) -- [10. Content.onInterestedIn](#10-contentoninterestedin) -- [11. InterestedInIntent](#11-interestedinintent) + - [6.1. Discovery.interested](#61-discoveryinterested) + - [6.2. InterestIntent](#62-interestintent) +- [7. Manage SDK APIs](#7-manage-sdk-apis) + - [7.1. Content.onInterestedIn](#71-contentoninterestedin) + - [7.2. InterestedInIntent](#72-interestedinintent) ## 3. User Interest from an in-app UX @@ -211,7 +211,7 @@ See the [Firebolt API Documentation](https://developer.comcast.com/firebolt/core/sdk/latest/api/) for details around syntax, errors, and permissions. -## 7. Discovery.interested +### 6.1. Discovery.interested This is a push/pull API that allows Apps to either push entities that the user has expressed interest in to the platform, or respond to pull @@ -235,7 +235,7 @@ Discovery.interested((intent:InterestIntent) => EntityInfo): Promise The callback takes an `InterestIntent` that provides any context about the user\'s intention. -## 8. InterestIntent +### 6.2. InterestIntent An `InterestIntent` denotes that the user has expressed interest in the currently displayed and/or selected content: @@ -253,7 +253,7 @@ type InterestIntent { ``` -## 9. Manage SDK APIs +## 7. Manage SDK APIs The following APIs are exposed by the Firebolt Core SDK as part of the `manage:content `domain/module. @@ -262,7 +262,7 @@ See the [Firebolt API Documentation](https://developer.comcast.com/firebolt/core/sdk/latest/api/) for details around syntax, errors, and permissions. -## 10. Content.onInterestedIn +### 7.1. Content.onInterestedIn This notification allows Aggregated Experience Apps to be informed when a user expresses interest in some Content, and the content resolves to a @@ -273,7 +273,7 @@ valid Entity from some App. The callback will be passed an `InterestedEventData` object with information about the entity that the user expressed interest in. -## 11. InterestedInIntent +### 7.2. InterestedInIntent `InterestedInIntent` provides information about what the user has expressed interest in: From 161314e22072c3ff7860f0e886b4648049faf0f6 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Tue, 9 Jan 2024 13:54:44 -0500 Subject: [PATCH 03/54] fix: Leverage provider pattern --- .../specifications/intents/user-interest.md | 103 +++++++++--------- 1 file changed, 51 insertions(+), 52 deletions(-) diff --git a/requirements/specifications/intents/user-interest.md b/requirements/specifications/intents/user-interest.md index 1e3761b64..b35b4c2d4 100644 --- a/requirements/specifications/intents/user-interest.md +++ b/requirements/specifications/intents/user-interest.md @@ -56,26 +56,28 @@ track of which apps are using them separately. - [5. User Interest Bulk Updates](#5-user-interest-bulk-updates) - [6. Core SDK APIs](#6-core-sdk-apis) - [6.1. Discovery.interested](#61-discoveryinterested) - - [6.2. InterestIntent](#62-interestintent) + - [6.2. Discovery Interest Provider](#62-discovery-interest-provider) + - [6.3. InterestIntent](#63-interestintent) - [7. Manage SDK APIs](#7-manage-sdk-apis) - - [7.1. Content.onInterestedIn](#71-contentoninterestedin) - - [7.2. InterestedInIntent](#72-interestedinintent) + - [7.1. Content.interesting](#71-contentinteresting) + - [7.2. Content.onInterestedIn](#72-contentoninterestedin) + - [7.3. InterestedInIntent](#73-interestedinintent) ## 3. User Interest from an in-app UX Some Apps will have a built-in user interface for users to express -interest in content from the App. This could be a \"Favorite\" button, -an in-app \"My List\" button, etc. +interest in content from the App. This could be a "Favorite" button, +an in-app "My List" button, etc. -If the App wants to leverage any additional exposure from the device\'s -Aggregated Experience, it can wire up this UI to the Firebolt User -Interest API, in addition to any in-app features that it\'s already +If the App wants to leverage any additional exposure from the device's +Aggregated Experience, it can wire up its own UI to the Firebolt User +Interest API, in addition to any in-app features that it's already invoking. By calling the `Discovery.interested` method with the relevant entity meta-data, the device\'s Aggregated Experience will be notified of the -user\'s interest in that entity: +user's interest in that entity: ```typescript Discovery.interested(type:InterestType, entity:EntityInfo) @@ -86,11 +88,18 @@ The type parameter denotes what sort of interest: - `interest` - `disinterest` +An app **MUST** `provide` the `xrn:firebolt:capability:discovery:interest` +capability in order to call `Discovery.interested`. + When this method is called with a valid `EntityInfo`, the platform **MUST** dispatch a `Content.onInterestedIn` notification to all Apps that have registered for it (typically Aggregated Experience Apps) with information about the app, interest type, and the entity. +An app **MUST** have permissions to `use` the +`xrn:firebolt:capability:discovery:interest` capability in order to +listen to the `Content.onInterestedIn` notification. + If the result is `null` or is not a valid entity, i.e. does not match the [EntityInfo](../entities/) schema, then no `Content.onInterestedIn` notification will be dispatched. @@ -115,26 +124,21 @@ express user interest in content from an active App. To facilitate this Apps will need to be told about the user\'s expressed interest in their content. -In this case, two different intents are required to complete the -interaction. The `InterestIntent` is leveraged by an Aggregated -Experience to let the current foreground app know that the user is -interested in something currently on the screen or selected. Once the -foreground app receives this intent, the flow is much like the previous -use case. - First, the Aggregated Experience (or some app with the correct capability) detects that the user is interested in something. In this picture the interest is triggered by an RCU button, but how this occurs -is outside the scope of this document. When this happens, an -`InterestIntent` is generated and sent to the foreground app. +is outside the scope of this document. When this happens, the Aggregated +Experience app calls `Content.interesting()`, which will trigger the +foreground app's UserInterest provider and call it's `interested` method +by invoking the RPC method `Discovery.onRequestInterested`. ![](../../../requirements/images/specifications/intents/user-interest/media/image3.png) -Next, the foreground app receives and responds to the `InterestIntent` -by providing the EntityInfo, which triggers an `InterestedInIntent`: +Next, the foreground app receives and responds to the request with an +EntityInfo, which is returned as the result to the pending +`Content.interesting` method: -![Diagram Description automatically -generated](../../../requirements/images/specifications/intents/user-interest/media/image4.png) +![](../../../requirements/images/specifications/intents/user-interest/media/image4.png) A user\'s intention to express interest in something is handled by the `InterestIntent`. This intent happens *before* the platform knows which @@ -159,15 +163,9 @@ that time **MUST** be ignored. The timeout value is stored in the device\'s configuration manifest. To be notified when a user expresses interest in the currently displayed -content, an App **MUST** call `Discovery.interested` with a callback -method, to register as a provider of this capability: - -```typescript -Discovery.interested((intent:InterestIntent) => EntityInfo) -``` - -This API uses Firebolt\'s `polymorphic-pull` OpenRPC tag, to specify -that it is a push/pull API. +content, an App **MUST** provide the +`xrn:firebolt:capability:discovery:interest` capability by enabling the +`Discovery.onRequestInterest` notification. If there is a valid entity to return, then the method registered by the App **MUST** return the currently displayed entity meta-data. @@ -205,17 +203,12 @@ in on a different platform, is not supported. ## 6. Core SDK APIs The following APIs are exposed by the Firebolt Core SDK as part of the -`core:discovery` domain/module. - -See the [Firebolt API -Documentation](https://developer.comcast.com/firebolt/core/sdk/latest/api/) -for details around syntax, errors, and permissions. +`Discovery` module. ### 6.1. Discovery.interested -This is a push/pull API that allows Apps to either push entities that -the user has expressed interest in to the platform, or respond to pull -request from the platform for the same. +This is a push API that allows Apps to push entities that the user has +expressed interest in to the platform. To push an entity that the user is interested in pass an `EntityInfo` object to the method: @@ -224,18 +217,20 @@ object to the method: Discovery.interested(type: InterestType, entity: EntityInfo): Promise ``` -To respond to pull requests for the current entity, because the user has +### 6.2. Discovery Interest Provider +To respond to requests for the current entity, because the user has expressed interest in some way that the platform manages, register a -callback as the parameter: +provider: ```typescript -Discovery.interested((intent:InterestIntent) => EntityInfo): Promise -``` +interface IDiscoveryInterestProvider { + function interested(type: InterestIntent): Promise +} -The callback takes an `InterestIntent` that provides any context about -the user\'s intention. +Discovery.provide("xrn:firbolt:capability:discovery:interest", IDiscoveryInterestProvider) +``` -### 6.2. InterestIntent +### 6.3. InterestIntent An `InterestIntent` denotes that the user has expressed interest in the currently displayed and/or selected content: @@ -256,13 +251,17 @@ type InterestIntent { ## 7. Manage SDK APIs The following APIs are exposed by the Firebolt Core SDK as part of the -`manage:content `domain/module. +`Content` module. -See the [Firebolt API -Documentation](https://developer.comcast.com/firebolt/core/sdk/latest/api/) -for details around syntax, errors, and permissions. +### 7.1. Content.interesting +This method triggers the corresponding Discovery provider API for the +foreground and/or background app. + +```typescript +Content.interesting(type: InterestType): Promise +``` -### 7.1. Content.onInterestedIn +### 7.2. Content.onInterestedIn This notification allows Aggregated Experience Apps to be informed when a user expresses interest in some Content, and the content resolves to a @@ -273,7 +272,7 @@ valid Entity from some App. The callback will be passed an `InterestedEventData` object with information about the entity that the user expressed interest in. -### 7.2. InterestedInIntent +### 7.3. InterestedInIntent `InterestedInIntent` provides information about what the user has expressed interest in: From b21b03f3d321d6d759e7a5020f7c6b9132419615 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Thu, 11 Jan 2024 16:46:32 -0500 Subject: [PATCH 04/54] fix: Simplify which apps may respond --- .../specifications/intents/user-interest.md | 41 ++++++++++--------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/requirements/specifications/intents/user-interest.md b/requirements/specifications/intents/user-interest.md index b35b4c2d4..9dc1e506a 100644 --- a/requirements/specifications/intents/user-interest.md +++ b/requirements/specifications/intents/user-interest.md @@ -55,6 +55,7 @@ track of which apps are using them separately. - [4. User Interest from a platform UX](#4-user-interest-from-a-platform-ux) - [5. User Interest Bulk Updates](#5-user-interest-bulk-updates) - [6. Core SDK APIs](#6-core-sdk-apis) + - [6.1. InterestType](#61-interesttype) - [6.1. Discovery.interested](#61-discoveryinterested) - [6.2. Discovery Interest Provider](#62-discovery-interest-provider) - [6.3. InterestIntent](#63-interestintent) @@ -140,27 +141,25 @@ EntityInfo, which is returned as the result to the pending ![](../../../requirements/images/specifications/intents/user-interest/media/image4.png) -A user\'s intention to express interest in something is handled by the +A user's intention to express interest in something is handled by the `InterestIntent`. This intent happens *before* the platform knows which -content is displayed and/or selected by the foreground or background -apps. The `InterestIntent` may originate from a cloud system, e.g. -Voice, or from the RCU, or elsewhere. Origination of this intent is out +content is displayed and/or selected by the foreground app. The +`InterestIntent` may originate from a cloud system, e.g. Voice, or from the RCU, or elsewhere. Origination of this intent is out of scope for this document. This intent includes the type of interest, e.g. interest or disinterest. To fire an `InterestIntent` to the current App, another app, typically -the Aggregated Experience, will call the `Content.interest()` method -of the Discovery SDK. This generates a new intent. +the Aggregated Experience, will call the `Content.interesting()` method +of the Discovery SDK. -When this intent occurs, any App in the foreground or background -Lifecycle state, that has registered a callback via the -`Discovery.interested` API **MUST** have that callback invoked with the -`InterestIntent` as the only parameter. +When `Content.interesting` is called, if the App in the foreground +Lifecycle state has registered a provider for the `xrn:firebolt:capability:discovery:interest` capability, then it **MUST** have that provider invoked with the values from the +`Content.interesting` call. -Once an App\'s callback is invoked, that app will have `interestTimeout` +Once an App's callback is invoked, that app will have `interestTimeout` milliseconds to return a value or throw an error. Values returned after that time **MUST** be ignored. The timeout value is stored in the -device\'s configuration manifest. +device's configuration manifest. To be notified when a user expresses interest in the currently displayed content, an App **MUST** provide the @@ -173,11 +172,8 @@ App **MUST** return the currently displayed entity meta-data. If there is no valid entity to return, then the method **MUST** throw an exception. -If more than one App returns a valid `EntityInfo`, the value from the -App in the foreground **MUST** be used, and the others will be ignored. -If only one is returned, then it may come from the foreground or -background app. See -[Lifecycle](../lifecycle/) for more info on Lifecycle states. +If the foreground App returns a valid `EntityInfo` before the timeout, +then, the value from the **MUST** be used. Once a single `EntityInfo` is selected the platform **MUST** dispatch a `Content.onInterestedIn` notification to all Apps that have registered @@ -205,6 +201,12 @@ in on a different platform, is not supported. The following APIs are exposed by the Firebolt Core SDK as part of the `Discovery` module. +### 6.1. InterestType +This is an enum with the following values: + +- `"interest"` +- `"disinterest"` + ### 6.1. Discovery.interested This is a push API that allows Apps to push entities that the user has @@ -224,7 +226,7 @@ provider: ```typescript interface IDiscoveryInterestProvider { - function interested(type: InterestIntent): Promise + function interested(type: InterestType): Promise } Discovery.provide("xrn:firbolt:capability:discovery:interest", IDiscoveryInterestProvider) @@ -247,7 +249,6 @@ type InterestIntent { } ``` - ## 7. Manage SDK APIs The following APIs are exposed by the Firebolt Core SDK as part of the @@ -255,7 +256,7 @@ The following APIs are exposed by the Firebolt Core SDK as part of the ### 7.1. Content.interesting This method triggers the corresponding Discovery provider API for the -foreground and/or background app. +foreground app. ```typescript Content.interesting(type: InterestType): Promise From fe8dc46eb69e06505ff1948f4743a7fdd3144be6 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Fri, 12 Jan 2024 12:19:12 -0500 Subject: [PATCH 05/54] feat: User Interest added to Discovery SDK --- .../specifications/intents/user-interest.md | 70 +-- src/openrpc/content.json | 561 ++++++++++++++++++ src/openrpc/discovery.json | 160 +++++ src/schemas/discovery.json | 70 +++ src/schemas/entertainment.json | 1 - src/schemas/intents.json | 60 ++ src/sdks/core/sdk.config.json | 3 +- src/sdks/discovery/.npmignore | 6 + src/sdks/discovery/CHANGELOG.md | 0 src/sdks/discovery/CONTRIBUTING.md | 1 + src/sdks/discovery/LICENSE | 1 + src/sdks/discovery/NOTICE | 1 + src/sdks/discovery/README.md | 26 + src/sdks/discovery/jest.config.json | 8 + src/sdks/discovery/package.json | 53 ++ src/sdks/discovery/sdk.config.json | 16 + src/sdks/discovery/src/js/sdk/index.mjs | 30 + src/sdks/manage/sdk.config.json | 3 + 18 files changed, 1033 insertions(+), 37 deletions(-) create mode 100644 src/openrpc/content.json create mode 100644 src/schemas/discovery.json create mode 100644 src/sdks/discovery/.npmignore create mode 100644 src/sdks/discovery/CHANGELOG.md create mode 120000 src/sdks/discovery/CONTRIBUTING.md create mode 120000 src/sdks/discovery/LICENSE create mode 120000 src/sdks/discovery/NOTICE create mode 100644 src/sdks/discovery/README.md create mode 100644 src/sdks/discovery/jest.config.json create mode 100644 src/sdks/discovery/package.json create mode 100644 src/sdks/discovery/sdk.config.json create mode 100644 src/sdks/discovery/src/js/sdk/index.mjs diff --git a/requirements/specifications/intents/user-interest.md b/requirements/specifications/intents/user-interest.md index 9dc1e506a..94a62b045 100644 --- a/requirements/specifications/intents/user-interest.md +++ b/requirements/specifications/intents/user-interest.md @@ -56,12 +56,12 @@ track of which apps are using them separately. - [5. User Interest Bulk Updates](#5-user-interest-bulk-updates) - [6. Core SDK APIs](#6-core-sdk-apis) - [6.1. InterestType](#61-interesttype) - - [6.1. Discovery.interested](#61-discoveryinterested) - - [6.2. Discovery Interest Provider](#62-discovery-interest-provider) - - [6.3. InterestIntent](#63-interestintent) + - [6.2. Discovery.userInterest](#62-discoveryuserinterest) + - [6.3. Discovery Interest Provider](#63-discovery-interest-provider) + - [6.4. InterestIntent](#64-interestintent) - [7. Manage SDK APIs](#7-manage-sdk-apis) - - [7.1. Content.interesting](#71-contentinteresting) - - [7.2. Content.onInterestedIn](#72-contentoninterestedin) + - [7.1. Content.requestUserInterest](#71-contentrequestuserinterest) + - [7.2. Content.onUserInterestedIn](#72-contentonuserinterestedin) - [7.3. InterestedInIntent](#73-interestedinintent) @@ -76,12 +76,12 @@ Aggregated Experience, it can wire up its own UI to the Firebolt User Interest API, in addition to any in-app features that it's already invoking. -By calling the `Discovery.interested` method with the relevant entity +By calling the `Discovery.userInterest` method with the relevant entity meta-data, the device\'s Aggregated Experience will be notified of the user's interest in that entity: ```typescript -Discovery.interested(type:InterestType, entity:EntityInfo) +Discovery.userInterest(type:UserInterestType, entity:EntityInfo) ``` The type parameter denotes what sort of interest: @@ -90,27 +90,27 @@ The type parameter denotes what sort of interest: - `disinterest` An app **MUST** `provide` the `xrn:firebolt:capability:discovery:interest` -capability in order to call `Discovery.interested`. +capability in order to call `Discovery.userInterest`. When this method is called with a valid `EntityInfo`, the platform -**MUST** dispatch a `Content.onInterestedIn` notification to all Apps +**MUST** dispatch a `Content.onUserInterestedIn` notification to all Apps that have registered for it (typically Aggregated Experience Apps) with information about the app, interest type, and the entity. An app **MUST** have permissions to `use` the `xrn:firebolt:capability:discovery:interest` capability in order to -listen to the `Content.onInterestedIn` notification. +listen to the `Content.onUserInterestedIn` notification. If the result is `null` or is not a valid entity, i.e. does not match -the [EntityInfo](../entities/) schema, then no `Content.onInterestedIn` +the [EntityInfo](../entities/) schema, then no `Content.onUserInterestedIn` notification will be dispatched. -The `Discovery.interested` method **MUST NOT** be used in place of more +The `Discovery.userInterest` method **MUST NOT** be used in place of more specific Discovery methods, e.g. `Discovery.watchNext` or `Discovery.watched`. These methods facilitate specific UX flows that may have separate legal opt-outs for each user. -The `Discovery.interested` method **MUST NOT** be called unless the user +The `Discovery.userInterest` method **MUST NOT** be called unless the user is activating a UI element in the app, or in a second screen experience that is communicating with the app, that implies interest of some kind. @@ -129,15 +129,15 @@ First, the Aggregated Experience (or some app with the correct capability) detects that the user is interested in something. In this picture the interest is triggered by an RCU button, but how this occurs is outside the scope of this document. When this happens, the Aggregated -Experience app calls `Content.interesting()`, which will trigger the -foreground app's UserInterest provider and call it's `interested` method -by invoking the RPC method `Discovery.onRequestInterested`. +Experience app calls `Content.requestUserInterest()`, which will trigger the +foreground app's UserInterest provider and call it's `userInterest` method +by invoking the RPC method `Discovery.onRequestUserInterest`. ![](../../../requirements/images/specifications/intents/user-interest/media/image3.png) Next, the foreground app receives and responds to the request with an EntityInfo, which is returned as the result to the pending -`Content.interesting` method: +`Content.requestUserInterest` method: ![](../../../requirements/images/specifications/intents/user-interest/media/image4.png) @@ -149,12 +149,12 @@ of scope for this document. This intent includes the type of interest, e.g. interest or disinterest. To fire an `InterestIntent` to the current App, another app, typically -the Aggregated Experience, will call the `Content.interesting()` method +the Aggregated Experience, will call the `Content.requestUserInterest()` method of the Discovery SDK. -When `Content.interesting` is called, if the App in the foreground +When `Content.requestUserInterest` is called, if the App in the foreground Lifecycle state has registered a provider for the `xrn:firebolt:capability:discovery:interest` capability, then it **MUST** have that provider invoked with the values from the -`Content.interesting` call. +`Content.requestUserInterest` call. Once an App's callback is invoked, that app will have `interestTimeout` milliseconds to return a value or throw an error. Values returned after @@ -164,7 +164,7 @@ device's configuration manifest. To be notified when a user expresses interest in the currently displayed content, an App **MUST** provide the `xrn:firebolt:capability:discovery:interest` capability by enabling the -`Discovery.onRequestInterest` notification. +`Discovery.onRequestUserInterest` notification. If there is a valid entity to return, then the method registered by the App **MUST** return the currently displayed entity meta-data. @@ -176,19 +176,19 @@ If the foreground App returns a valid `EntityInfo` before the timeout, then, the value from the **MUST** be used. Once a single `EntityInfo` is selected the platform **MUST** dispatch a -`Content.onInterestedIn` notification to all Apps that have registered +`Content.onUserInterestedIn` notification to all Apps that have registered for it (typically Aggregated Experience Apps) with metadata about the app and entity as its data. -The `Content.onInterestedIn` event has the `InterestedInIntent` as its +The `Content.onUserInterestedIn` event has the `InterestedInIntent` as its data. -The platform **MUST NOT** dispatch more than one `onInterestedIn` +The platform **MUST NOT** dispatch more than one `onUserInterestedIn` notification, even if more than one App responded to the pull request. -An Aggregated Experience can register for the `Content.onInterestedIn` +An Aggregated Experience can register for the `Content.onUserInterestedIn` notification, and it will receive notifications when an `EntityInfo` is -returned from the active App after a `Discovery.interested` call is +returned from the active App after a `Discovery.userInterest` call is fulfilled. ## 5. User Interest Bulk Updates @@ -207,7 +207,7 @@ This is an enum with the following values: - `"interest"` - `"disinterest"` -### 6.1. Discovery.interested +### 6.2. Discovery.userInterest This is a push API that allows Apps to push entities that the user has expressed interest in to the platform. @@ -216,23 +216,23 @@ To push an entity that the user is interested in pass an `EntityInfo` object to the method: ```typescript -Discovery.interested(type: InterestType, entity: EntityInfo): Promise +Discovery.userInterest(type: InterestType, entity: EntityInfo): Promise ``` -### 6.2. Discovery Interest Provider +### 6.3. Discovery Interest Provider To respond to requests for the current entity, because the user has expressed interest in some way that the platform manages, register a provider: ```typescript interface IDiscoveryInterestProvider { - function interested(type: InterestType): Promise + function userInterest(type: InterestType): Promise } Discovery.provide("xrn:firbolt:capability:discovery:interest", IDiscoveryInterestProvider) ``` -### 6.3. InterestIntent +### 6.4. InterestIntent An `InterestIntent` denotes that the user has expressed interest in the currently displayed and/or selected content: @@ -254,21 +254,21 @@ type InterestIntent { The following APIs are exposed by the Firebolt Core SDK as part of the `Content` module. -### 7.1. Content.interesting +### 7.1. Content.requestUserInterest This method triggers the corresponding Discovery provider API for the foreground app. ```typescript -Content.interesting(type: InterestType): Promise +Content.requestUserInterest(type: InterestType): Promise ``` -### 7.2. Content.onInterestedIn +### 7.2. Content.onUserInterestedIn This notification allows Aggregated Experience Apps to be informed when a user expresses interest in some Content, and the content resolves to a valid Entity from some App. -`Content.listen('interestedIn', InterestedInIntent => void): Promise` +`Content.listen('userInterestedIn', InterestedInIntent => void): Promise` The callback will be passed an `InterestedEventData` object with information about the entity that the user expressed interest in. diff --git a/src/openrpc/content.json b/src/openrpc/content.json new file mode 100644 index 000000000..2da27f7c0 --- /dev/null +++ b/src/openrpc/content.json @@ -0,0 +1,561 @@ +{ + "openrpc": "1.2.4", + "info": { + "title": "Content", + "version": "0.0.0", + "description": "" + }, + "methods": [ + { + "name": "providers", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:providers" + ] + } + ], + "summary": "Returns a list of providers and the discovery apis they support", + "params": [], + "result": { + "name": "providers", + "summary": "List of providers and the discovery apis they support", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ContentProvider" + } + } + }, + "examples": [ + { + "name": "Getting the list of providers and the discovery apis they support", + "params": [], + "result": { + "name": "Default Result", + "value": [ + { + "id": "Vudu", + "apis": [ + "purchases", + "entity" + ] + }, + { + "id": "NetflixApp", + "apis": [ + "search" + ] + } + ] + } + } + ] + }, + { + "name": "purchases", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:purchased-content" + ] + } + ], + "summary": "Gets a list of entities that the user has purchased", + "params": [ + { + "name": "provider", + "summary": "The id of the provider to request purchased content from", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "parameters", + "summary": "Any parameters to control what purchases are returned", + "schema": { + "$ref": "#/components/schemas/PurchasedContentParameters" + }, + "required": true + }, + { + "name": "options", + "summary": "Any options with making the request to provider", + "schema": { + "$ref": "#/components/schemas/FederationOptions" + }, + "required": false + } + ], + "result": { + "name": "ProvidedPurchasedContentResult", + "summary": "List of entities that the user has purchased", + "schema": { + "$ref": "#/components/schemas/ProvidedPurchasedContentResult" + } + }, + "examples": [ + { + "name": "Gets a list of entities that the user has purchased", + "params": [ + { + "name": "provider", + "value": "Vudu" + }, + { + "name": "parameters", + "value": { + "limit": 10 + } + }, + { + "name": "options", + "value": { + "timeout": 10000 + } + } + ], + "result": { + "name": "Default Result", + "value": { + "provider": "Vudu", + "data": { + "totalCount": 1, + "expires": "2025-01-01T00:00:00.000Z", + "entries": [ + { + "identifiers": { + "entityId": "345" + }, + "entityType": "program", + "programType": "movie", + "title": "Cool Runnings", + "synopsis": "When a Jamaican sprinter is disqualified from the Olympic Games, he enlists the help of a dishonored coach to start the first Jamaican Bobsled Team.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + } + ] + } + } + } + } + ] + }, + { + "name": "entity", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:entity-info" + ] + } + ], + "summary": "Gets information about a program entity from a provider and its available watchable assets, such as entitlement status and price. Includes information about the program entity and its relevant associated entities, such as extras, previews, and, in the case of TV series, seasons and episodes.", + "params": [ + { + "name": "provider", + "summary": "The id of the provider that has the entity info", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "parameters", + "summary": "The content parameters", + "schema": { + "$ref": "#/components/schemas/EntityInfoParameters" + }, + "required": true + }, + { + "name": "options", + "summary": "Any options with making the request to provider", + "schema": { + "$ref": "#/components/schemas/FederationOptions" + }, + "required": false + } + ], + "result": { + "name": "content", + "summary": "Information about program entity", + "schema": { + "$ref": "#/components/schemas/ProvidedEntityInfoResult" + } + }, + "examples": [ + { + "name": "Get info about specific content from a provider", + "params": [ + { + "name": "provider", + "value": "Vudu" + }, + { + "name": "parameters", + "value": { + "entityId": "111" + } + }, + { + "name": "options", + "value": { + "timeout": 10000 + } + } + ], + "result": { + "name": "Default Result", + "value": { + "provider": "Vudu", + "data": { + "expires": "2025-01-01T00:00:00.000Z", + "entity": { + "identifiers": { + "entityId": "345" + }, + "entityType": "program", + "programType": "movie", + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "123" + }, + "expires": "2025-01-01T00:00:00.000Z", + "entitled": true, + "entitledExpires": "2025-01-01T00:00:00.000Z", + "offeringType": "buy", + "price": 2.99, + "videoQuality": [ + "UHD" + ], + "audioProfile": [ + "dolbyAtmos" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ], + "subtitles": [ + "es" + ], + "audioDescriptions": [ + "en" + ] + } + ] + } + } + } + } + } + ] + }, + { + "name": "requestUserInterest", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:interest" + ] + } + ], + "params": [ + { + "name": "type", + "schema": { + "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/UserInterestType" + } + } + ], + "result": { + "name": "entity", + "schema": { + "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/EntityInfo" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "type", + "value": "interest" + } + ], + "result": { + "name": "entity", + "value": { + "identifiers": { + "entityId": "xyz" + }, + "entityType": "program", + "programType": "movie", + "title": "Interesting Movie Title" + } + } + } + ] + }, + { + "name": "onUserInterestedIn", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:interest" + ] + } + ], + "params": [], + "result": { + "name": "intent", + "schema": { + "$ref": "https://meta.comcast.com/firebolt/intents#/definitions/InterestedInIntent" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "interest", + "value": { + "action": "interestedIn", + "data": { + "appId": "cool-app", + "type": "interest", + "entity": { + "identifiers": { + "entityId": "xyz" + }, + "entityType": "program", + "programType": "movie", + "title": "Interesting Movie Title" + } + }, + "context": { + "source": "api" + } + } + } + } + ] + } + ], + "components": { + "schemas": { + "ContentProvider": { + "title": "ContentProvider", + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "apis": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "id", + "apis" + ], + "additionalProperties": false + }, + "ProvidedPurchasedContentResult": { + "title": "ProvidedPurchasedContentResult", + "type": "object", + "properties": { + "provider": { + "type": "string" + }, + "data": { + "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/PurchasedContentResult" + } + }, + "required": [ + "provider", + "data" + ], + "additionalProperties": false + }, + "FederationOptions": { + "title": "FederationOptions", + "type": "object", + "properties": { + "timeout": { + "type": "number" + } + }, + "required": [], + "additionalProperties": true + }, + "SearchParameters": { + "title": "SearchParameters", + "type": "object", + "properties": { + "query": { + "type": "string" + }, + "limit": { + "type": "number" + }, + "context": { + "$ref": "#/components/schemas/SearchContext" + } + }, + "required": [ + "query" + ], + "additionalProperties": true + }, + "SearchContext": { + "title": "SearchContext", + "type": "object", + "properties": { + "source": { + "type": "string" + } + }, + "required": [], + "additionalProperties": true + }, + "SearchResult": { + "title": "SearchResult", + "type": "object", + "properties": { + "totalCount": { + "type": "number" + }, + "entries": { + "type": "array", + "items": { + "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/EntityInfo" + } + } + }, + "required": [ + "totalCount", + "entries" + ], + "additionalProperties": false + }, + "ProvidedSearchResult": { + "title": "ProvidedSearchResult", + "type": "object", + "properties": { + "provider": { + "type": "string" + }, + "data": { + "$ref": "#/components/schemas/SearchResult" + } + }, + "required": [ + "provider", + "data" + ], + "additionalProperties": false + }, + "ProvidedEntityInfoResult": { + "title": "ProvidedEntityInfoResult", + "type": "object", + "properties": { + "provider": { + "type": "string" + }, + "data": { + "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/EntityInfoResult" + } + }, + "required": [ + "provider", + "data" + ], + "additionalProperties": false + }, + "EntityInfoParameters": { + "title": "EntityInfoParameters", + "type": "object", + "properties": { + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + } + }, + "required": [ + "entityId" + ], + "additionalProperties": false, + "examples": [ + { + "entityId": "345" + } + ] + }, + "PurchasedContentParameters": { + "title": "PurchasedContentParameters", + "type": "object", + "properties": { + "limit": { + "type": "integer", + "minimum": -1 + }, + "offeringType": { + "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/OfferingType" + }, + "programType": { + "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/ProgramType" + } + }, + "required": [ + "limit" + ], + "additionalProperties": false, + "examples": [ + { + "limit": 100 + } + ] + } + } + } + } \ No newline at end of file diff --git a/src/openrpc/discovery.json b/src/openrpc/discovery.json index eb7530a35..796926bb0 100644 --- a/src/openrpc/discovery.json +++ b/src/openrpc/discovery.json @@ -1467,6 +1467,136 @@ } } ] + }, + { + "name": "userInterest", + "summary": "Notify the platform that content was marked as interesting to the user.", + "tags": [ + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:interest" + } + ], + "params": [ + { + "name": "type", + "required": true, + "schema": { + "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/UserInterestType" + }, + "summary": "The entity Id of the watched content." + }, + { + "name": "entity", + "schema": { + "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/EntityInfo" + } + } + ], + "result": { + "name": "default", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Notify the platform of interest.", + "params": [ + { + "name": "type", + "value": "interest" + }, + { + "name": "entity", + "value": { + "identifiers": { + "entityId": "xyz" + }, + "entityType": "program", + "programType": "movie", + "title": "Interesting Movie Title" + } + } + ], + "result": { + "name": "default", + "value": null + } + }, + { + "name": "Notify the platform of disinterest.", + "params": [ + { + "name": "type", + "value": "disinterest" + }, + { + "name": "entity", + "value": { + "identifiers": { + "entityId": "xyz" + }, + "entityType": "program", + "programType": "movie", + "title": "Uninteresting Movie Title" + } + } + ], + "result": { + "name": "default", + "value": null + } + } + ] + }, + { + "name": "onRequestUserInterest", + "summary": "Invoked when the platform is requesting metadata for content that the user finds interesting.", + "tags": [ + { + "name": "event", + "x-response": { + "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/EntityInfo", + "examples": [ + { + "identifiers": { + "entityId": "xyz" + }, + "entityType": "program", + "programType": "movie", + "title": "Interesting Movie Title" + } + ] + } + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:interest" + } + ], + "params": [], + "result": { + "name": "request", + "schema": { + "$ref": "#/components/schemas/UserInterestProviderRequest" + } + }, + "examples": [ + { + "name": "Platform requests the currently displayed content.", + "params": [], + "result": { + "name": "request", + "value": { + "correlationId": "1", + "parameters": { + "type": "interest" + } + } + } + } + ] } ], "components": { @@ -1785,6 +1915,36 @@ "enum": [ "xrn:firebolt:channel:any" ] + }, + "UserInterestProviderRequest": { + "title": "UserInterestProviderRequest", + "type": "object", + "required": [ + "correlationId", + "parameters" + ], + "properties": { + "correlationId": { + "type": "string", + "description": "An id to correlate the provider response with this request" + }, + "parameters": { + "description": "The request to initiate a user interest session", + "$ref": "#/components/schemas/UserInterestParameters" + } + } + }, + "UserInterestParameters": { + "title": "UserInterestParameters", + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/UserInterestType" + } + } } } } diff --git a/src/schemas/discovery.json b/src/schemas/discovery.json new file mode 100644 index 000000000..07bba19d0 --- /dev/null +++ b/src/schemas/discovery.json @@ -0,0 +1,70 @@ +{ + "$id": "https://meta.comcast.com/firebolt/discovery", + "title": "Discovery", + "anyOf": [ + { + "$ref": "#/definitions/PurchasedContentResult" + } + ], + "definitions": { + "UserInterestType": { + "title": "InterestType", + "type": "string", + "enum": [ + "interest", + "disinterest" + ] + }, + "PurchasedContentResult": { + "title": "PurchasedContentResult", + "type": "object", + "properties": { + "expires": { + "type": "string", + "format": "date-time" + }, + "totalCount": { + "type": "integer", + "minimum": 0 + }, + "entries": { + "type": "array", + "items": { + "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/EntityInfo" + } + } + }, + "required": [ + "expires", + "totalCount", + "entries" + ], + "additionalProperties": false + }, + "EntityInfoResult": { + "title": "EntityInfoResult", + "description": "The result for an `entityInfo()` push or pull.", + "type": "object", + "properties": { + "expires": { + "type": "string", + "format": "date-time" + }, + "entity": { + "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/EntityInfo" + }, + "related": { + "type": "array", + "items": { + "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/EntityInfo" + } + } + }, + "required": [ + "expires", + "entity" + ], + "additionalProperties": false + } + } +} \ No newline at end of file diff --git a/src/schemas/entertainment.json b/src/schemas/entertainment.json index 8fd14ee38..8f94854e8 100644 --- a/src/schemas/entertainment.json +++ b/src/schemas/entertainment.json @@ -80,7 +80,6 @@ "required": [ "identifiers", "entityType", - "programType", "title" ], "properties": { diff --git a/src/schemas/intents.json b/src/schemas/intents.json index d690fa88a..755a97000 100644 --- a/src/schemas/intents.json +++ b/src/schemas/intents.json @@ -104,6 +104,9 @@ }, { "$ref": "#/definitions/DialogIntent" + }, + { + "$ref": "#/definitions/InterestedInIntent" } ] }, @@ -2176,6 +2179,63 @@ } ] }, + "InterestedInIntent": { + "description": "A Firebolt compliant representation of a user's interest in a piece of content.", + "title": "InterestedInIntent", + "allOf": [ + { + "title": "InterestedInIntent", + "$ref": "#/definitions/Intent" + }, + { + "title": "InterestedInIntent", + "$ref": "#/definitions/IntentProperties" + }, + { + "title": "InterestedInIntent", + "type": "object", + "properties": { + "action": { + "const": "interestedIn" + }, + "data": { + "type": "object", + "properties": { + "appId": { + "type": "string" + }, + "type": { + "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/UserInterestType" + }, + "entity": { + "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/EntityInfo" + } + } + } + } + } + ], + "examples": [ + { + "action": "interestedIn", + "data": { + "appId": "coolapp", + "type": "interest", + "entity": { + "identifiers": { + "entityId": "xyz" + }, + "entityType": "program", + "programType": "movie", + "title": "Interesting Movie Title" + } + }, + "context": { + "source": "voice" + } + } + ] + }, "Identifier": { "type": "string" }, diff --git a/src/sdks/core/sdk.config.json b/src/sdks/core/sdk.config.json index f406f8bea..14ba4d55c 100644 --- a/src/sdks/core/sdk.config.json +++ b/src/sdks/core/sdk.config.json @@ -69,7 +69,8 @@ ], "provide": [ "xrn:firebolt:capability:discovery:entity-info", - "xrn:firebolt:capability:discovery:purchased-content" + "xrn:firebolt:capability:discovery:purchased-content", + "xrn:firebolt:capability:discovery:interest" ] }, { diff --git a/src/sdks/discovery/.npmignore b/src/sdks/discovery/.npmignore new file mode 100644 index 000000000..0e2ba4d22 --- /dev/null +++ b/src/sdks/discovery/.npmignore @@ -0,0 +1,6 @@ +build/* +src/* +test/* +.DS_Store +jest.config.* +tsconfig.* \ No newline at end of file diff --git a/src/sdks/discovery/CHANGELOG.md b/src/sdks/discovery/CHANGELOG.md new file mode 100644 index 000000000..e69de29bb diff --git a/src/sdks/discovery/CONTRIBUTING.md b/src/sdks/discovery/CONTRIBUTING.md new file mode 120000 index 000000000..c97564d93 --- /dev/null +++ b/src/sdks/discovery/CONTRIBUTING.md @@ -0,0 +1 @@ +../../../CONTRIBUTING.md \ No newline at end of file diff --git a/src/sdks/discovery/LICENSE b/src/sdks/discovery/LICENSE new file mode 120000 index 000000000..5853aaea5 --- /dev/null +++ b/src/sdks/discovery/LICENSE @@ -0,0 +1 @@ +../../../LICENSE \ No newline at end of file diff --git a/src/sdks/discovery/NOTICE b/src/sdks/discovery/NOTICE new file mode 120000 index 000000000..295f6bdb3 --- /dev/null +++ b/src/sdks/discovery/NOTICE @@ -0,0 +1 @@ +../../../NOTICE \ No newline at end of file diff --git a/src/sdks/discovery/README.md b/src/sdks/discovery/README.md new file mode 100644 index 000000000..8092cf5b6 --- /dev/null +++ b/src/sdks/discovery/README.md @@ -0,0 +1,26 @@ +--- +title: Firebolt Manage SDK +--- + +[![semantic-release: conventional](https://img.shields.io/badge/semantic--release-conventional-e10079?logo=semantic-release)](https://github.com/semantic-release/semantic-release) + +# Firebolt Manage SDK +For building Firebolt compliant apps for discovering first-party content on Firebolt devices. + +## Usage +To install, run: + +``` +npm install @firebolt-js/discovery-sdk +``` + +To use the package, import one of it's modules, e.g.: + +```js +import { Content } from '@firebolt-js/discovery-sdk' +``` + +## Contributing +The Firebolt SDKs are built using the Firebolt OpenRPC toolset: + +See [Firebolt OpenRPC](https://www.github.com/rdkcentral/firebolt-openrpc/), for more info. diff --git a/src/sdks/discovery/jest.config.json b/src/sdks/discovery/jest.config.json new file mode 100644 index 000000000..745370cfa --- /dev/null +++ b/src/sdks/discovery/jest.config.json @@ -0,0 +1,8 @@ +{ + "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|js?)$", + "transform": {}, + "testPathIgnorePatterns": ["/node_modules/", "/../../../test"], + "moduleFileExtensions": ["js", "jsx", "mjs"], + "verbose": true, + "testEnvironment": "jest-environment-jsdom" + } \ No newline at end of file diff --git a/src/sdks/discovery/package.json b/src/sdks/discovery/package.json new file mode 100644 index 000000000..d03293645 --- /dev/null +++ b/src/sdks/discovery/package.json @@ -0,0 +1,53 @@ +{ + "name": "@firebolt-js/discovery-sdk", + "version": "1.0.0", + "description": "The Firebolt Discovery JS SDK", + "main": "./dist/lib/firebolt-discovery.mjs", + "types": "./dist/lib/firebolt-discovery.d.ts", + "exports": { + ".": "./dist/lib/firebolt-discovery.mjs" + }, + "type": "module", + "scripts": { + "validate": "npx firebolt-openrpc validate --input ./dist/firebolt-discovery-open-rpc.json", + "sdk": "npx firebolt-openrpc sdk --input ./dist/firebolt-discovery-open-rpc.json --template ./src/js --output ./build/javascript/src", + "native": "npx firebolt-openrpc sdk --input ./dist/firebolt-discovery-open-rpc.json --template ./src/js --output ./build/c/src --language ../../../node_modules/@firebolt-js/openrpc/languages/c", + "compile": "cd ../../.. && npm run compile", + "slice": "npx firebolt-openrpc slice -i ../../../dist/firebolt-open-rpc.json --sdk ./sdk.config.json -o ./dist/firebolt-discovery-open-rpc.json", + "docs": "npx firebolt-openrpc docs --input ./dist/firebolt-discovery-open-rpc.json --output build/docs/markdown --as-path", + "wiki": "npx firebolt-openrpc docs --input ./dist/firebolt-discovery-open-rpc.json --output build/docs/markdown", + "dist:notest": "npm run clean && npm run slice && npm run validate && npm run sdk && npm run docs && npm run prettier && npm run dist:copy && echo 'Firebolt Discovery SDK /dist/ is ready.\n'", + "dist:copy": "npm run dist:copy:sdk && npm run dist:copy:docs", + "dist:copy:sdk": "mkdirp ./dist && cp -R build/javascript/src dist/lib && cp ./dist/firebolt-discovery-open-rpc.json ../../../dist/firebolt-discovery-open-rpc.json", + "dist:copy:docs": "mkdirp ./dist && cp -R build/docs/markdown dist/docs", + "dist": "npm run dist:notest && npm run test", + "clean": "rm -rf ./build && rm -rf ./dist", + "test:setup": "rm -rf test/transpiled-suite && npx tsc --target es6 --moduleResolution node --outDir test/transpiled-suite", + "test": "npm run test:setup && NODE_OPTIONS=--experimental-vm-modules npx --config=jest.config.json --detectOpenHandles jest", + "prepack": "node ../../js/version.mjs validate && npm run broilerplate", + "broilerplate": "rm ./CONTRIBUTING.md && cp ../../../CONTRIBUTING.md ./CONTRIBUTING.md && rm ./LICENSE && cp ../../../LICENSE ./LICENSE && rm ./NOTICE && cp ../../../NOTICE ./NOTICE", + "prettier": "prettier build/**/*.mjs --write --parser babel && prettier build/**/*.md --write --parser markdown" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/rdkcentral/firebolt-core-sdk", + "directory": "src/sdks/discovery" + }, + "author": "", + "bugs": { + "url": "https://github.com/rdkcentral/firebolt-core-sdk/issues" + }, + "homepage": "https://github.com/rdkcentral/firebolt-core-sdk#readme", + "devDependencies": { + "jest": "^28.1.0", + "jest-environment-jsdom": "^28.1.3", + "prettier": "^3.1.0", + "typescript": "^4.6.4" + }, + "keywords": [ + "firebolt", + "apps", + "sdk" + ], + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/src/sdks/discovery/sdk.config.json b/src/sdks/discovery/sdk.config.json new file mode 100644 index 000000000..43f888fbf --- /dev/null +++ b/src/sdks/discovery/sdk.config.json @@ -0,0 +1,16 @@ +{ + "info": { + "title": "Firebolt Discovery SDK" + }, + "methods": [ + { + "module": "Content", + "use": [ + "xrn:firebolt:capability:discovery:providers", + "xrn:firebolt:capability:discovery:purchased-content", + "xrn:firebolt:capability:discovery:entity-info", + "xrn:firebolt:capability:discovery:interest" + ] + } + ] +} \ No newline at end of file diff --git a/src/sdks/discovery/src/js/sdk/index.mjs b/src/sdks/discovery/src/js/sdk/index.mjs new file mode 100644 index 000000000..a9f2f5ca6 --- /dev/null +++ b/src/sdks/discovery/src/js/sdk/index.mjs @@ -0,0 +1,30 @@ +/* + * Copyright 2021 Comcast Cable Communications Management, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { setMockResponses } from './Transport/MockTransport.mjs' + +/* ${MOCK_IMPORTS} */ + +setMockResponses({ + /* ${MOCK_OBJECTS} */ +}) + +/* ${EXPORTS} */ +export { default as Log } from './Log/index.mjs' +export { default as Events } from './Events/index.mjs' +export { default as Settings } from './Settings/index.mjs' diff --git a/src/sdks/manage/sdk.config.json b/src/sdks/manage/sdk.config.json index 56d869412..0215c0dd4 100644 --- a/src/sdks/manage/sdk.config.json +++ b/src/sdks/manage/sdk.config.json @@ -138,6 +138,9 @@ }, { "module": "Discovery", + "use": [ + "xrn:firebolt:capability:discovery:interest" + ], "manage": [ "xrn:firebolt:capability:discovery:sign-in-status" ] From 28b0df2019873e1e48e202accdc2020143a6ced6 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Fri, 12 Jan 2024 13:10:20 -0500 Subject: [PATCH 06/54] fix: Discovery Tests --- package.json | 3 +- src/sdks/discovery/test/suite/content.test.ts | 28 +++++++++++++++++++ src/sdks/discovery/tsconfig.json | 5 ++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 src/sdks/discovery/test/suite/content.test.ts create mode 100644 src/sdks/discovery/tsconfig.json diff --git a/package.json b/package.json index 4ab27e1dd..88bd7b887 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ }, "workspaces": [ "src/sdks/core", - "src/sdks/manage" + "src/sdks/manage", + "src/sdks/discovery" ], "scripts": { "fs:setup": "npm run clean && mkdir -p dist", diff --git a/src/sdks/discovery/test/suite/content.test.ts b/src/sdks/discovery/test/suite/content.test.ts new file mode 100644 index 000000000..cbfa6f2d6 --- /dev/null +++ b/src/sdks/discovery/test/suite/content.test.ts @@ -0,0 +1,28 @@ +/* + * Copyright 2021 Comcast Cable Communications Management, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { test, expect } from "@jest/globals"; +import { Content } from "../../build/javascript/src/firebolt-discovery"; + +test("Content.requestUserInterest()", () => { + const expTime: number = new Date().getTime() + 100; + return Content.requestUserInterest(Content.InterestType.INTEREST).then((entity:Content.EntityInfo) => { + expect(entity).toBeDefined() + expect(entity.title).toBe("Interesting Movie Title") + }) +}); diff --git a/src/sdks/discovery/tsconfig.json b/src/sdks/discovery/tsconfig.json new file mode 100644 index 000000000..56ff58bc8 --- /dev/null +++ b/src/sdks/discovery/tsconfig.json @@ -0,0 +1,5 @@ +{ + "include": [ + "test/suite/*" + ] +} \ No newline at end of file From 288883eae5c0b9ae0beb1d4d7f42d247ea6b7ce6 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Fri, 12 Jan 2024 14:29:17 -0500 Subject: [PATCH 07/54] Update package-lock.json --- package-lock.json | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 05ac3fde3..93731cad4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,8 @@ "license": "Apache-2.0", "workspaces": [ "src/sdks/core", - "src/sdks/manage" + "src/sdks/manage", + "src/sdks/discovery" ], "bin": { "firebolt-version": "src/js/version.mjs" @@ -1065,6 +1066,10 @@ "node": ">=8" } }, + "node_modules/@firebolt-js/discovery-sdk": { + "resolved": "src/sdks/discovery", + "link": true + }, "node_modules/@firebolt-js/manage-sdk": { "resolved": "src/sdks/manage", "link": true @@ -16960,6 +16965,16 @@ "typescript": "^4.6.4" } }, + "src/sdks/discovery": { + "version": "1.0.0", + "license": "Apache-2.0", + "devDependencies": { + "jest": "^28.1.0", + "jest-environment-jsdom": "^28.1.3", + "prettier": "^3.1.0", + "typescript": "^4.6.4" + } + }, "src/sdks/manage": { "name": "@firebolt-js/manage-sdk", "version": "1.0.0", From e769c556d0990419a733abdf37307797802723be Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Tue, 16 Jan 2024 10:58:29 -0500 Subject: [PATCH 08/54] fix: feedback from @kpears201 --- .../specifications/intents/user-interest.md | 50 +++++++------------ src/sdks/discovery/README.md | 4 +- src/sdks/discovery/sdk.config.json | 2 +- src/sdks/manage/sdk.config.json | 3 -- 4 files changed, 21 insertions(+), 38 deletions(-) diff --git a/requirements/specifications/intents/user-interest.md b/requirements/specifications/intents/user-interest.md index 94a62b045..ab7aa7e12 100644 --- a/requirements/specifications/intents/user-interest.md +++ b/requirements/specifications/intents/user-interest.md @@ -53,13 +53,14 @@ track of which apps are using them separately. - [2. Table of Contents](#2-table-of-contents) - [3. User Interest from an in-app UX](#3-user-interest-from-an-in-app-ux) - [4. User Interest from a platform UX](#4-user-interest-from-a-platform-ux) + - [4.1. Upstream User Interest Intent](#41-upstream-user-interest-intent) - [5. User Interest Bulk Updates](#5-user-interest-bulk-updates) - [6. Core SDK APIs](#6-core-sdk-apis) - [6.1. InterestType](#61-interesttype) - [6.2. Discovery.userInterest](#62-discoveryuserinterest) - [6.3. Discovery Interest Provider](#63-discovery-interest-provider) - [6.4. InterestIntent](#64-interestintent) -- [7. Manage SDK APIs](#7-manage-sdk-apis) +- [7. Discovery SDK APIs](#7-discovery-sdk-apis) - [7.1. Content.requestUserInterest](#71-contentrequestuserinterest) - [7.2. Content.onUserInterestedIn](#72-contentonuserinterestedin) - [7.3. InterestedInIntent](#73-interestedinintent) @@ -97,6 +98,14 @@ When this method is called with a valid `EntityInfo`, the platform that have registered for it (typically Aggregated Experience Apps) with information about the app, interest type, and the entity. +The `Content.onUserInterestedIn` event has the `InterestedInIntent` as its +data. + +An Aggregated Experience can register for the `Content.onUserInterestedIn` +notification, and it will receive notifications when an `EntityInfo` is +returned from the active App after a `Discovery.userInterest` call is +fulfilled. + An app **MUST** have permissions to `use` the `xrn:firebolt:capability:discovery:interest` capability in order to listen to the `Content.onUserInterestedIn` notification. @@ -141,21 +150,6 @@ EntityInfo, which is returned as the result to the pending ![](../../../requirements/images/specifications/intents/user-interest/media/image4.png) -A user's intention to express interest in something is handled by the -`InterestIntent`. This intent happens *before* the platform knows which -content is displayed and/or selected by the foreground app. The -`InterestIntent` may originate from a cloud system, e.g. Voice, or from the RCU, or elsewhere. Origination of this intent is out -of scope for this document. This intent includes the type of interest, -e.g. interest or disinterest. - -To fire an `InterestIntent` to the current App, another app, typically -the Aggregated Experience, will call the `Content.requestUserInterest()` method -of the Discovery SDK. - -When `Content.requestUserInterest` is called, if the App in the foreground -Lifecycle state has registered a provider for the `xrn:firebolt:capability:discovery:interest` capability, then it **MUST** have that provider invoked with the values from the -`Content.requestUserInterest` call. - Once an App's callback is invoked, that app will have `interestTimeout` milliseconds to return a value or throw an error. Values returned after that time **MUST** be ignored. The timeout value is stored in the @@ -173,23 +167,15 @@ If there is no valid entity to return, then the method **MUST** throw an exception. If the foreground App returns a valid `EntityInfo` before the timeout, -then, the value from the **MUST** be used. +then, the returned value **MUST** be used. -Once a single `EntityInfo` is selected the platform **MUST** dispatch a -`Content.onUserInterestedIn` notification to all Apps that have registered -for it (typically Aggregated Experience Apps) with metadata about the -app and entity as its data. +### 4.1. Upstream User Interest Intent +In some cases, e.g. a voice assistant, some upstream component will inform +the platform that the user is interested in whatever is currently being presented. -The `Content.onUserInterestedIn` event has the `InterestedInIntent` as its -data. +To do this, the upstream system **MUST** send a `UserInterest` intent, which describes the type of interest. -The platform **MUST NOT** dispatch more than one `onUserInterestedIn` -notification, even if more than one App responded to the pull request. - -An Aggregated Experience can register for the `Content.onUserInterestedIn` -notification, and it will receive notifications when an `EntityInfo` is -returned from the active App after a `Discovery.userInterest` call is -fulfilled. +When a Firebolt platform receives this intent, it **SHOULD** initiate the platform's [user interest flow](#4-user-interest-from-a-platform-ux). ## 5. User Interest Bulk Updates @@ -249,9 +235,9 @@ type InterestIntent { } ``` -## 7. Manage SDK APIs +## 7. Discovery SDK APIs -The following APIs are exposed by the Firebolt Core SDK as part of the +The following APIs are exposed by the Firebolt Discovery SDK as part of the `Content` module. ### 7.1. Content.requestUserInterest diff --git a/src/sdks/discovery/README.md b/src/sdks/discovery/README.md index 8092cf5b6..2ec46b95d 100644 --- a/src/sdks/discovery/README.md +++ b/src/sdks/discovery/README.md @@ -1,10 +1,10 @@ --- -title: Firebolt Manage SDK +title: Firebolt Discovery SDK --- [![semantic-release: conventional](https://img.shields.io/badge/semantic--release-conventional-e10079?logo=semantic-release)](https://github.com/semantic-release/semantic-release) -# Firebolt Manage SDK +# Firebolt Discovery SDK For building Firebolt compliant apps for discovering first-party content on Firebolt devices. ## Usage diff --git a/src/sdks/discovery/sdk.config.json b/src/sdks/discovery/sdk.config.json index 43f888fbf..bacdd0b6c 100644 --- a/src/sdks/discovery/sdk.config.json +++ b/src/sdks/discovery/sdk.config.json @@ -13,4 +13,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/src/sdks/manage/sdk.config.json b/src/sdks/manage/sdk.config.json index 0215c0dd4..56d869412 100644 --- a/src/sdks/manage/sdk.config.json +++ b/src/sdks/manage/sdk.config.json @@ -138,9 +138,6 @@ }, { "module": "Discovery", - "use": [ - "xrn:firebolt:capability:discovery:interest" - ], "manage": [ "xrn:firebolt:capability:discovery:sign-in-status" ] From eec3bd7c43ededb06ac9519ba23de51bf9d1a1d3 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Tue, 16 Jan 2024 11:17:21 -0500 Subject: [PATCH 09/54] fix: Remove todos --- requirements/specifications/intents/user-interest.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/requirements/specifications/intents/user-interest.md b/requirements/specifications/intents/user-interest.md index ab7aa7e12..bc5e5c65b 100644 --- a/requirements/specifications/intents/user-interest.md +++ b/requirements/specifications/intents/user-interest.md @@ -43,7 +43,7 @@ generated](../../../requirements/images/specifications/intents/user-interest/med This is just one example of what an Aggregated Experience App might do with the User Interest API. -Note that this API **should not** be used to implement Watch History or +Note that this API **SHOULD NOT** be used to implement Watch History or Watch Next features. These concepts are much more fundamental to Firebolt and have explicit APIs so that Firebolt Distributors can keep track of which apps are using them separately. @@ -114,19 +114,15 @@ If the result is `null` or is not a valid entity, i.e. does not match the [EntityInfo](../entities/) schema, then no `Content.onUserInterestedIn` notification will be dispatched. -The `Discovery.userInterest` method **MUST NOT** be used in place of more +The `Discovery.userInterest` method **SHOULD NOT** be used in place of more specific Discovery methods, e.g. `Discovery.watchNext` or `Discovery.watched`. These methods facilitate specific UX flows that may have separate legal opt-outs for each user. -The `Discovery.userInterest` method **MUST NOT** be called unless the user +The `Discovery.userInterest` method **SHOULD NOT** be called unless the user is activating a UI element in the app, or in a second screen experience that is communicating with the app, that implies interest of some kind. -**TODO**: This seems like a contractual obligation, as testing this is -non-trivial / impossible. Are we keeping track of contractual -requirements anywhere? - ## 4. User Interest from a platform UX Firebolt platforms may provide a platform UX, e.g. voice or and RCU, to From 6b0ac9f610409cbb558e5ce8680efadd0b8dc521 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Fri, 23 Feb 2024 10:43:45 -0500 Subject: [PATCH 10/54] feat: App Passthrough OpenRPC tags --- .../app-passthrough-apis.md | 420 ++++++++++++++++++ 1 file changed, 420 insertions(+) create mode 100644 requirements/specifications/openrpc-extensions/app-passthrough-apis.md diff --git a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md new file mode 100644 index 000000000..833a476e1 --- /dev/null +++ b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md @@ -0,0 +1,420 @@ +# App Pass-through APIs + +Document Status: Working Draft + +See [Firebolt Requirements Governance](../../governance.md) for more info. + +| Contributor | Organization | +|-----------------|----------------| +| Jeremy LaCivita | Comcast | +| Kevin Pearson | Comcast | + +## 1. Overview +This document describes the App Pass-through Firebolt OpenRPC extension. + +Some APIs require an app to fulfill the request on behalf of another app, e.g. to provide a UX or cross-app data sharing. Generally the calling app doesn't care or have a say in which other app provides the API, that is up to the Firebolt distributor. + +To facilitate these APIs, Firebolt denotes an OpenRPC tag with OpenRPC extensions to connect the `provide` API to the `use` API. + +This document is written using the [IETF Best Common Practice 14](https://www.rfc-editor.org/rfc/rfc2119.txt) and should include the following summary in the Overview section: + +The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL NOT**", "**SHOULD**", "**SHOULD NOT**", "**RECOMMENDED**", "**NOT RECOMMENDED**", "**MAY**", and "**OPTIONAL**" in this document are to be interpreted as described in [BCP 14](https://www.rfc-editor.org/rfc/rfc2119.txt) [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here. + +## 2. Table of Contents +- [1. Overview](#1-overview) +- [2. Table of Contents](#2-table-of-contents) +- [3. App Provided Extension](#3-app-provided-extension) + - [3.1. Aggregated vs Single Providers](#31-aggregated-vs-single-providers) + - [3.2. Selecting the best provider app](#32-selecting-the-best-provider-app) + - [3.3. Inserting the appId](#33-inserting-the-appid) +- [4. Example: User Interest](#4-example-user-interest) +- [5. Example: Keyboard](#5-example-keyboard) + +## 3. App Provided Extension +Firebolt OpenRPC **MUST** support a `boolean` `x-app-provided` extension property on the `capabilities` tag that denotes a method is provided by some app on the device. + +The `x-app-provided` extension **MUST NOT** be used on a method with any value in the `x-provides` extension. + +If a method has a `capabilities` tag with `x-app-provided` set to `true` then it **MUST** `use` a single capability or `manage` a single capability, but not both. + +If a method has a `capabilities` tag with `x-app-provided` set to `true` and the `capabilities` tag also has an `x-app-method` string property, then: + +> The method denoted by the `x-app-method` property **MUST** provide the same capability that is either used or managed by this method; This method is referred to as the "provider" for the rest of this document. + +If a method has a `capabilities` tag with `x-app-provided` set to `true` and there is no `x-app-method` property and the method has an `event` tag, then: + +> There **MUST** be another method that provides that capability via `x-provides`, and is a notification method (i.e. it has no `x-response` defined); This method is referred to as the "provider" for the rest of this document. + +If a method has a `capabilities` tag with `x-app-provided` set to `true` and there is no `x-app-method` property and the method does not have an `event` tag, then: + +> There **MUST** be another method that provides that capability via `x-provides`, and is not a notification method (i.e. it has an `x-response` defined); This method is referred to as the "provider" for the rest of this document. + +If, at this point, there is no provider method, or more than one provider method, then this method is not a valid Firebolt OpenRPC method schema, and a validation error **MUST** be generated. + +### 3.1. Aggregated vs Single Providers +If a method has a `capabilities` tag with `x-app-provided` set to `true` then the tag **MAY** have a `boolean` `x-aggregate` property which denotes whether or not multiple apps may provide responses to a single request. + +If the `x-aggregate` property is not present then it defaults to `false`. + +If a method has `x-aggregate` set to `true` then: + +> The method **MUST** have a result with the type set to `array`. +> +> The `items` schema of the array **MUST** match the `x-response` schema on the provider method. + +Otherwise, if `x-aggregate` is `false` (explicityly or by default): + +> The method **MUST** have a result, which can by any type. +> +> The result schema **MUST** match the `x-response` schema on the provider method. + +### 3.2. Selecting the best provider app +If a method has `x-aggregate` set to `false` then there **MAY** have a `boolean` `x-app-selection` property which denotes how to pick a single app to provide the response. + +If the `x-app-selection` property is not present then it defaults to `false`. + +If `x-app-selection` is set to `"presentation"` then the app selected to provide the result **MUST** be the `foreground` or `background` app. + +If `x-app-selection` is set to `"presentation"` and neither the `forground` or `background` app provides the required capability then the calling app **MUST** receive an error and not a result. + +If `x-app-selection` is set to `"recent"` then the app selected to provide the result **MUST** be the most recently launched app that provides the required capability. + +### 3.3. Inserting the appId +TBD about `x-app-id` injection. + +## 4. Example: User Interest + +User Interest does not use the `x-app-method` property because there is only one method and one event in the API, so they can be detected automatically via the capability string. + +Schemas + +```json +{ + "components": { + "schemas": { + "InterestType": { + "type": "string", + "enum": [ + "interest", + "disinterest" + ] + }, + "InterestInfo": { + "type": "object", + "properties": { + "appId": { + "type": "string" + }, + "entity": { + "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/EntityInfo" + }, + "type": { + "$ref": "#/components/schemas/InterestType" + } + }, + "required": [ + "entity" + ] + } + } + } +} +``` + +Content.requestUserInterest (pull, use) + +```json +{ + "methods": [ + { + "name": "requestUserInterest", + "tags": [ + { + "name": "capabilities", + "x-app-provided": true, + "x-app-selection": "presentation", + "x-aggregate": false, + "x-app-id": "appId", + "x-uses": [ + "xrn:firebolt:capability:discovery:interest" + ] + } + ], + "params": [ + { + "name": "type", + "required": true, + "schema": { + "$ref": "#/components/schemas/InterestType" + } + } + ], + "result": { + "name": "interestedIn", + "schema": { + "$ref": "#/components/schemas/InterestInfo", + } + } + } + ] +} +``` + +Discovery.onRequestUserInterest (1.0, pull, provide) + +```json +{ + "methods": [ + { + "name": "onRequestUserInterest", + "tags": [ + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:interest", + }, + { + "name": "event", + "x-response": { + "$ref": "#/components/schemas/InterestInfo" + } + } + ], + "result": { + "name": "request", + "schema": { + "type": "object", + "properties": { + "type": { + "$ref": "#/components/schemas/InterestType", + } + } + } + } + } + ] +} +``` + +Discovery.userInterest (2.0, pull, provide) + +```json +{ + "methods": [ + { + "name": "userInterest", + "tags": [ + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:interest" + } + ], + "params": [ + { + "name": "type", + "schema": { + "$ref": "#/components/schemas/InterestType", + } + } + ], + "result": { + "name": "entity", + "schema": { + "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/EntityInfo" + } + } + } + ] +} +``` + + +Discovery.userInterest (push) + +```json +{ + "methods": [ + { + "name": "userInterest", + "tags": [ + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:interest" + } + ], + "params": [ + { + "name": "info", + "schema": { + "$ref": "#/components/schemas/InterestInfo", + } + } + ] + } + ] +} +``` + +Content.onUserInterest (push) + +```json +{ + "methods": [ + { + "name": "onUserInterest", + "tags": [ + { + "name": "capabilities", + "x-app-provided": true, + "x-aggregate": false, + "x-app-id": "appId", + "x-uses": [ + "xrn:firebolt:capability:discovery:interest" + ] + }, + { + "name": "event" + } + ], + "result": { + "name": "info", + "schema": { + "$ref": "#/components/schemas/InterestedInfo", + } + } + } + ] +} +``` + +## 5. Example: Keyboard + +Keyboard *requires* the* `x-app-method` property because there are three methods in the same capability, so the mapping cannot be detected automatically via the capability string. + +Schemas + +```json +{ + "components": { + "schemas": { + + } + } +} +``` + +Keyboard.standard (use) + +```json +{ + "methods": [ + { + "name": "Keyboard.standard", + "tags": [ + { + "name": "capabilities", + "x-app-provided": true, + "x-app-method": "Keyboard.onRequestStandard", + "x-uses": [ + "xrn:firebolt:capability:input:keyboard" + ] + } + ], + "summary": "Show the standard platform keyboard, and return the submitted value", + "params": [ + { + "name": "message", + "summary": "The message to display while prompting", + "required": true, + "schema": { + "type": "string" + } + } + ], + "result": { + "name": "value", + "summary": "the selected or entered text", + "schema": { + "type": "string" + } + } + } + ] +} +``` + +Keyboard.onRequestStandard (1.0, provide) + +```json +{ + "methods": [ + { + "name": "Keyboard.onRequestStandard", + "params": [ + ], + "tags": [ + { + "name": "event", + "x-response": { + "$ref": "#/components/schemas/KeyboardResult", + "examples": [ + { + "text": "username" + } + ] + } + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true + } + ], + "result": { + "name": "sessionRequest", + "summary": "The request to start a keyboard session", + "schema": { + { + "$ref": "#/components/schemas/KeyboardProviderRequest" + } + } + } + } + ] +} +``` + +Keyboard.standard (2.0, provide in the app RPC doc): + +```json +{ + "methods": [ + { + "name": "Keyboard.standard", + "params": [ + { + "name": "message", + "schema": { + "type": "string" + } + } + ], + "tags": [ + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true + } + ], + "result": { + "name": "value", + "summary": "The user entered string", + "schema": { + { + "type": "string" + } + } + } + } + ] +} +``` From ec030df25841f791f6e12a8cc55cd80323e05ca6 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Fri, 23 Feb 2024 11:08:14 -0500 Subject: [PATCH 11/54] fix: added appId insertion into results --- .../app-passthrough-apis.md | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md index 833a476e1..4a8f920aa 100644 --- a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md +++ b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md @@ -35,28 +35,28 @@ Firebolt OpenRPC **MUST** support a `boolean` `x-app-provided` extension propert The `x-app-provided` extension **MUST NOT** be used on a method with any value in the `x-provides` extension. -If a method has a `capabilities` tag with `x-app-provided` set to `true` then it **MUST** `use` a single capability or `manage` a single capability, but not both. +If a method has a `capabilities` tag with `x-app-provided` set to `true` then it **MUST** `use` a single capability or `manage` a single capability, but not both. Any such method is referred to as an "app provided method" for the rest of this document. -If a method has a `capabilities` tag with `x-app-provided` set to `true` and the `capabilities` tag also has an `x-app-method` string property, then: +If an app provided method's `capabilities` tag has an `x-app-method` string property, then: > The method denoted by the `x-app-method` property **MUST** provide the same capability that is either used or managed by this method; This method is referred to as the "provider" for the rest of this document. -If a method has a `capabilities` tag with `x-app-provided` set to `true` and there is no `x-app-method` property and the method has an `event` tag, then: +If an app provided method's `capabilities` tag has no `x-app-method` property and the method has an `event` tag, then: > There **MUST** be another method that provides that capability via `x-provides`, and is a notification method (i.e. it has no `x-response` defined); This method is referred to as the "provider" for the rest of this document. -If a method has a `capabilities` tag with `x-app-provided` set to `true` and there is no `x-app-method` property and the method does not have an `event` tag, then: +If an app provided method's `capabilities` tag has no `x-app-method` property and the method does not have an `event` tag, then: > There **MUST** be another method that provides that capability via `x-provides`, and is not a notification method (i.e. it has an `x-response` defined); This method is referred to as the "provider" for the rest of this document. If, at this point, there is no provider method, or more than one provider method, then this method is not a valid Firebolt OpenRPC method schema, and a validation error **MUST** be generated. ### 3.1. Aggregated vs Single Providers -If a method has a `capabilities` tag with `x-app-provided` set to `true` then the tag **MAY** have a `boolean` `x-aggregate` property which denotes whether or not multiple apps may provide responses to a single request. +An app provided method's `capabilites` tag **MAY** have a `boolean` `x-aggregate` property which denotes whether or not multiple apps may provide responses to a single request of the method. If the `x-aggregate` property is not present then it defaults to `false`. -If a method has `x-aggregate` set to `true` then: +If an app provided method has `x-aggregate` set to `true` then: > The method **MUST** have a result with the type set to `array`. > @@ -80,7 +80,9 @@ If `x-app-selection` is set to `"presentation"` and neither the `forground` or ` If `x-app-selection` is set to `"recent"` then the app selected to provide the result **MUST** be the most recently launched app that provides the required capability. ### 3.3. Inserting the appId -TBD about `x-app-id` injection. +If an app provided method's `capabilities` tag has an `x-app-id-property` property and `x-aggregate` is not set to `true`, then the result schema **MUST** have a property with that name, and property's value **MUST** be set to the the appId of the providing app for the result. + +If an app provided method's `capabilities` tag has an `x-app-id-property` property and `x-aggregate` is `true`, then the `items` schema of the result schema **MUST** have a property with that name, and property's value **MUST** be set to the the appId of the providing app for each of the items in the result. ## 4. Example: User Interest @@ -134,7 +136,7 @@ Content.requestUserInterest (pull, use) "x-app-provided": true, "x-app-selection": "presentation", "x-aggregate": false, - "x-app-id": "appId", + "x-app-id-property": "appId", "x-uses": [ "xrn:firebolt:capability:discovery:interest" ] @@ -266,7 +268,7 @@ Content.onUserInterest (push) "name": "capabilities", "x-app-provided": true, "x-aggregate": false, - "x-app-id": "appId", + "x-app-id-property": "appId", "x-uses": [ "xrn:firebolt:capability:discovery:interest" ] From 6deb6c9bb0364816e77aebd45fd29b5077e22aa3 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Fri, 23 Feb 2024 11:10:36 -0500 Subject: [PATCH 12/54] fix: Added API Gateway note --- .../openrpc-extensions/app-passthrough-apis.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md index 4a8f920aa..67103c844 100644 --- a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md +++ b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md @@ -27,8 +27,9 @@ The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL - [3.1. Aggregated vs Single Providers](#31-aggregated-vs-single-providers) - [3.2. Selecting the best provider app](#32-selecting-the-best-provider-app) - [3.3. Inserting the appId](#33-inserting-the-appid) -- [4. Example: User Interest](#4-example-user-interest) -- [5. Example: Keyboard](#5-example-keyboard) +- [4. API Gateway](#4-api-gateway) +- [5. Example: User Interest](#5-example-user-interest) +- [6. Example: Keyboard](#6-example-keyboard) ## 3. App Provided Extension Firebolt OpenRPC **MUST** support a `boolean` `x-app-provided` extension property on the `capabilities` tag that denotes a method is provided by some app on the device. @@ -84,7 +85,10 @@ If an app provided method's `capabilities` tag has an `x-app-id-property` proper If an app provided method's `capabilities` tag has an `x-app-id-property` property and `x-aggregate` is `true`, then the `items` schema of the result schema **MUST** have a property with that name, and property's value **MUST** be set to the the appId of the providing app for each of the items in the result. -## 4. Example: User Interest +## 4. API Gateway +The Firebolt API Gateway **MUST** detect app-passthrough APIs and map the `use`/`manage` APIs to the corresponding `provide` APIs by parsing the Firebolt OpenRPC Specification and following the logic outline in this document. + +## 5. Example: User Interest User Interest does not use the `x-app-method` property because there is only one method and one event in the API, so they can be detected automatically via the capability string. @@ -288,7 +292,7 @@ Content.onUserInterest (push) } ``` -## 5. Example: Keyboard +## 6. Example: Keyboard Keyboard *requires* the* `x-app-method` property because there are three methods in the same capability, so the mapping cannot be detected automatically via the capability string. From f6756d4426d8ae7797521c6ddab20524b1d4188e Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Fri, 23 Feb 2024 11:12:45 -0500 Subject: [PATCH 13/54] fix: clarified validation --- .../specifications/openrpc-extensions/app-passthrough-apis.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md index 67103c844..0cc01354d 100644 --- a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md +++ b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md @@ -50,7 +50,7 @@ If an app provided method's `capabilities` tag has no `x-app-method` property an > There **MUST** be another method that provides that capability via `x-provides`, and is not a notification method (i.e. it has an `x-response` defined); This method is referred to as the "provider" for the rest of this document. -If, at this point, there is no provider method, or more than one provider method, then this method is not a valid Firebolt OpenRPC method schema, and a validation error **MUST** be generated. +If an app provided method has no provider method, or more than one provider method, then it is not a valid Firebolt OpenRPC method schema, and a validation error **MUST** be generated. ### 3.1. Aggregated vs Single Providers An app provided method's `capabilites` tag **MAY** have a `boolean` `x-aggregate` property which denotes whether or not multiple apps may provide responses to a single request of the method. From 3f3b2c9bf7db741afc05c6cb56b3c92f11741065 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Tue, 27 Feb 2024 11:34:25 -0500 Subject: [PATCH 14/54] fix: Support composition for stronger validation --- .../app-passthrough-apis.md | 61 ++++++++++++++++--- .../openrpc-extensions/push-pull-methods.md | 53 ++++++++++++++++ 2 files changed, 105 insertions(+), 9 deletions(-) create mode 100644 requirements/specifications/openrpc-extensions/push-pull-methods.md diff --git a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md index 0cc01354d..57de69476 100644 --- a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md +++ b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md @@ -26,7 +26,9 @@ The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL - [3. App Provided Extension](#3-app-provided-extension) - [3.1. Aggregated vs Single Providers](#31-aggregated-vs-single-providers) - [3.2. Selecting the best provider app](#32-selecting-the-best-provider-app) - - [3.3. Inserting the appId](#33-inserting-the-appid) + - [3.3. Calculating the final result](#33-calculating-the-final-result) + - [3.3.1. Composite Results](#331-composite-results) + - [3.3.2. Inserting the appId](#332-inserting-the-appid) - [4. API Gateway](#4-api-gateway) - [5. Example: User Interest](#5-example-user-interest) - [6. Example: Keyboard](#6-example-keyboard) @@ -57,20 +59,26 @@ An app provided method's `capabilites` tag **MAY** have a `boolean` `x-aggregate If the `x-aggregate` property is not present then it defaults to `false`. +If an app provided method has an `event` tag then the `capabilities` tag **MUST NOT** have the `x-aggregate` property set to `true`. + If an app provided method has `x-aggregate` set to `true` then: > The method **MUST** have a result with the type set to `array`. > > The `items` schema of the array **MUST** match the `x-response` schema on the provider method. +> +> The final result returned by the app provided method **MUST** be a flattened array with all of the calculated results from each provider. Otherwise, if `x-aggregate` is `false` (explicityly or by default): > The method **MUST** have a result, which can by any type. > > The result schema **MUST** match the `x-response` schema on the provider method. +> +> The final result returned by the app provided method **MUST** be the [calculated result](#33-calculating-the-final-result) from the selected provider. ### 3.2. Selecting the best provider app -If a method has `x-aggregate` set to `false` then there **MAY** have a `boolean` `x-app-selection` property which denotes how to pick a single app to provide the response. +If a method does not have `x-aggregate` set to `true` then it **MAY** have a `boolean` `x-app-selection` property which denotes how to pick a single app to provide the response. If the `x-app-selection` property is not present then it defaults to `false`. @@ -80,10 +88,37 @@ If `x-app-selection` is set to `"presentation"` and neither the `forground` or ` If `x-app-selection` is set to `"recent"` then the app selected to provide the result **MUST** be the most recently launched app that provides the required capability. -### 3.3. Inserting the appId -If an app provided method's `capabilities` tag has an `x-app-id-property` property and `x-aggregate` is not set to `true`, then the result schema **MUST** have a property with that name, and property's value **MUST** be set to the the appId of the providing app for the result. +### 3.3. Calculating the final result +For each app provided method result, the result **MUST** be calculated with the following potential transformations. + +If an app provided method has `x-aggregate` set to `true`, then the term "calculated result" refers to the items of the app provided method result array for the remainder of this section. + +If an app provided method has `x-aggregate` set to `false` or the property does not exist, then the term "calculated result" refers to the app provided method result for the remainder of this section. + +#### 3.3.1. Composite Results +An app provided method may be configured to use the provided value as the calculated result, or to compose it into an object along with other values. + +If the app provided method does not have an `event` tag then: + +> If an app provided method's `capabilities` tag has an `x-composite-result` property set to `true`, then the app provided method result schema **MUST** have a property that matches name and schema of the provider method result, and property's value **MUST** be set to the value returned by the providing app for the final result. +> +> If an app provided method's `capabilities` tag does not have an `x-composite-result` property or it is `false`, then the calculated result schema **MUST** match the app provided method result schema and the value of the calculated result **MUST** be the value returned by the providing app. + +If the app provided method has an `event` tag then: + +> If an app provided method's `capabilities` tag has an `x-composite-result` property, then every property of the provided method result schema that has a matching name and schema *parameter* in the provider method **MUST** have that property set to the value of the matching parameter from the provider notification for the final result. +> +> If an app provided method's `capabilities` tag does not have an `x-composite-result` property, then the calculated result schema **MUST** match the *last parameter* of the provider method and the value of the calculated result **MUST** be the value of that parameter from the provider notification for the final result. + + +#### 3.3.2. Inserting the appId +An app provided method may be configured to insert the providing app id into composite results. This is not allowed in non-composite results to avoid collisions with the provder method sending an appId and Firebolt overriding it. + +If an app provided method's `capabilities` tag has an `x-composite-result` property set to `true` then the method **MAY** have an `x-app-id-property`. -If an app provided method's `capabilities` tag has an `x-app-id-property` property and `x-aggregate` is `true`, then the `items` schema of the result schema **MUST** have a property with that name, and property's value **MUST** be set to the the appId of the providing app for each of the items in the result. +If an app provided method's `capabilities` tag has an `x-composite-result` property set to `false` or does not have the property then the method **MUST NOT** have an `x-app-id-property`. + +If an app provided method's `capabilities` tag has an `x-app-id-property` property, then the calculated result schema **MUST** have a property with that name, and property's value **MUST** be set to the the appId of the providing app for that calculated result. ## 4. API Gateway The Firebolt API Gateway **MUST** detect app-passthrough APIs and map the `use`/`manage` APIs to the corresponding `provide` APIs by parsing the Firebolt OpenRPC Specification and following the logic outline in this document. @@ -139,8 +174,9 @@ Content.requestUserInterest (pull, use) "name": "capabilities", "x-app-provided": true, "x-app-selection": "presentation", - "x-aggregate": false, + "x-composite-result": true, "x-app-id-property": "appId", + "x-aggregate": false, "x-uses": [ "xrn:firebolt:capability:discovery:interest" ] @@ -181,7 +217,7 @@ Discovery.onRequestUserInterest (1.0, pull, provide) { "name": "event", "x-response": { - "$ref": "#/components/schemas/InterestInfo" + "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/EntityInfo" } } ], @@ -249,10 +285,16 @@ Discovery.userInterest (push) ], "params": [ { - "name": "info", + "name": "type", "schema": { - "$ref": "#/components/schemas/InterestInfo", + "$ref": "#/components/schemas/InterestType", } + }, + { + "name": "entity", + "schema": { + "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/EntityInfo" + } } ] } @@ -271,6 +313,7 @@ Content.onUserInterest (push) { "name": "capabilities", "x-app-provided": true, + "x-composite-result": true, "x-aggregate": false, "x-app-id-property": "appId", "x-uses": [ diff --git a/requirements/specifications/openrpc-extensions/push-pull-methods.md b/requirements/specifications/openrpc-extensions/push-pull-methods.md new file mode 100644 index 000000000..adb7440a0 --- /dev/null +++ b/requirements/specifications/openrpc-extensions/push-pull-methods.md @@ -0,0 +1,53 @@ +# App Pass-through APIs + +Document Status: Working Draft + +See [Firebolt Requirements Governance](../../governance.md) for more info. + +| Contributor | Organization | +|-----------------|----------------| +| Jeremy LaCivita | Comcast | +| Kevin Pearson | Comcast | + +## 1. Overview +This document describes the Push / Pull Firebolt OpenRPC extension. + +Some APIs require both a push and a pull version so that data can be provided on request, or out of band. + +To facilitate these APIs, Firebolt denotes an OpenRPC tag with OpenRPC extensions to auto-genrate the push notifcation, pull provider, and pull request APIs from the main push API. + +This document is written using the [IETF Best Common Practice 14](https://www.rfc-editor.org/rfc/rfc2119.txt) and should include the following summary in the Overview section: + +The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL NOT**", "**SHOULD**", "**SHOULD NOT**", "**RECOMMENDED**", "**NOT RECOMMENDED**", "**MAY**", and "**OPTIONAL**" in this document are to be interpreted as described in [BCP 14](https://www.rfc-editor.org/rfc/rfc2119.txt) [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here. + +## 2. Table of Contents +- [1. Overview](#1-overview) +- [2. Table of Contents](#2-table-of-contents) +- [3. Push / Pull Extension](#3-push--pull-extension) + +## 3. Push / Pull Extension +Firebolt OpenRPC **MUST** support a method tag named `push-pull` that denotes a method should have a set of pull APIs generated from the current method, which is referred to as the "push method" for the remainder of this section. + +If a *any* method has a `push-pull` tag then an additional method named `onRequest` **MUST** be auto-generated by the OpenRPC tooling; This new method is called the "pull provider method" for the remainder of this section. + +The pull provider method **MUST** have the `x-result` extension schema set to the schema of the last parameter of the push method. + +The pull provider method **MUST** have any remaining parameters (not the last one) from the push method, as these are context parameters used by both push and pull. + +The pull provider method **MUST** have the same capabilities tag as the push method. + +If a *any* method has a `push-pull` tag then an additional method named `request` **MUST** be auto-generated by the OpenRPC tooling; This new method is called the "pull request method" for the remainder of this section. + +The pull request method **MUST** have the `result` schema set to the schema of the last parameter of the push method. + +The pull request method **MUST** have any remaining parameters (not the last one) from the push method, as these are context parameters used by both push and pull. + +The pull request method **MUST** have the `x-uses` array contain the value of the `x-provides` value from the push method. + +If a *any* method has a `push-pull` tag then an additional method named `on` **MUST** be auto-generated by the OpenRPC tooling; This new method is called the "push notification method" for the remainder of this section. + +The push notification method **MUST** have the `result` schema set to the schema of the last parameter of the push method. + +The push notification method **MUST** have any remaining parameters (not the last one) from the push method, as these are context parameters used by both push and pull. + +The push notification method **MUST** have the `x-uses` array contain the value of the `x-provides` value from the push method. From ed35a970e33860af4bb49b0d64f4ef0cb6394698 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Thu, 29 Feb 2024 10:56:18 -0500 Subject: [PATCH 15/54] fix: Rework based on @kpears201 's feedback --- .../app-passthrough-apis.md | 124 ++++++++---------- 1 file changed, 55 insertions(+), 69 deletions(-) diff --git a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md index 57de69476..9d465d367 100644 --- a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md +++ b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md @@ -23,9 +23,9 @@ The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL ## 2. Table of Contents - [1. Overview](#1-overview) - [2. Table of Contents](#2-table-of-contents) -- [3. App Provided Extension](#3-app-provided-extension) - - [3.1. Aggregated vs Single Providers](#31-aggregated-vs-single-providers) - - [3.2. Selecting the best provider app](#32-selecting-the-best-provider-app) +- [3. Provided By Extension](#3-provided-by-extension) + - [3.1. Selecting the best provider app](#31-selecting-the-best-provider-app) + - [3.2. Selecting all provider apps](#32-selecting-all-provider-apps) - [3.3. Calculating the final result](#33-calculating-the-final-result) - [3.3.1. Composite Results](#331-composite-results) - [3.3.2. Inserting the appId](#332-inserting-the-appid) @@ -33,92 +33,85 @@ The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL - [5. Example: User Interest](#5-example-user-interest) - [6. Example: Keyboard](#6-example-keyboard) -## 3. App Provided Extension -Firebolt OpenRPC **MUST** support a `boolean` `x-app-provided` extension property on the `capabilities` tag that denotes a method is provided by some app on the device. +## 3. Provided By Extension +Firebolt OpenRPC **MUST** support a `string` `x-provided-by` extension property on the `capabilities` tag that denotes a method is provided by some app on the device registeringf or the specified provider API, e.g. `Module.onRequestMethod`. -The `x-app-provided` extension **MUST NOT** be used on a method with any value in the `x-provides` extension. +The method denoted by `x-provided-by` is referred to as the "provider" or "provider method" for the remainder of this document. -If a method has a `capabilities` tag with `x-app-provided` set to `true` then it **MUST** `use` a single capability or `manage` a single capability, but not both. Any such method is referred to as an "app provided method" for the rest of this document. +The method with the `x-provided-by` extension is referred to as the "app provided method" for the remainder of this document. -If an app provided method's `capabilities` tag has an `x-app-method` string property, then: +The `x-provided-by` extension **MUST NOT** be used on a method with any value in the `x-provides` extension. -> The method denoted by the `x-app-method` property **MUST** provide the same capability that is either used or managed by this method; This method is referred to as the "provider" for the rest of this document. +An app provided method **MUST** `use` a single capability or `manage` a single capability, but not both. -If an app provided method's `capabilities` tag has no `x-app-method` property and the method has an `event` tag, then: +The provider method **MUST** provide the same capability that the app provided method either uses or manages. -> There **MUST** be another method that provides that capability via `x-provides`, and is a notification method (i.e. it has no `x-response` defined); This method is referred to as the "provider" for the rest of this document. +If the app provided method has an `event` tag then the provider method **MUST** be a notification method (i.e. it has no `x-response` defined). -If an app provided method's `capabilities` tag has no `x-app-method` property and the method does not have an `event` tag, then: - -> There **MUST** be another method that provides that capability via `x-provides`, and is not a notification method (i.e. it has an `x-response` defined); This method is referred to as the "provider" for the rest of this document. +If the app provided method has no `event` tag then the provider method **MUST NOT** be a notification method (i.e. it *does* have an `x-response` defined). If an app provided method has no provider method, or more than one provider method, then it is not a valid Firebolt OpenRPC method schema, and a validation error **MUST** be generated. -### 3.1. Aggregated vs Single Providers -An app provided method's `capabilites` tag **MAY** have a `boolean` `x-aggregate` property which denotes whether or not multiple apps may provide responses to a single request of the method. +### 3.1. Selecting the best provider app +An app provided method's `capabilites` tag **MAY** have the `x-provider-selection` property which denotes the method for selecting which app(s) will should provide the capability. -If the `x-aggregate` property is not present then it defaults to `false`. +If the `x-provider-selection` property is not present then it defaults to `"running"`. -If an app provided method has an `event` tag then the `capabilities` tag **MUST NOT** have the `x-aggregate` property set to `true`. +If `x-provider-selection` is set to `"active"` then the app selected to provide the value **MUST** be the `foreground` or `background` app with a bias for `foreground` apps and ties broken by which app was mostly recently foreground and fullscreen. -If an app provided method has `x-aggregate` set to `true` then: +If `x-provider-selection` is set to, or defaults to, `"running"` then the app selected to provide the result **MUST** be an app that is currently in the `foreground`, `background`, or `inactive` states, biased in that order, with ties broken by which app was most recently foreground and fullscreen. -> The method **MUST** have a result with the type set to `array`. -> -> The `items` schema of the array **MUST** match the `x-response` schema on the provider method. -> -> The final result returned by the app provided method **MUST** be a flattened array with all of the calculated results from each provider. +If `x-provider-selection` is set to `"all"` refer to [Selecting of all provider apps](#31-selecting-all-provider-apps), below. -Otherwise, if `x-aggregate` is `false` (explicityly or by default): +If the app provided method does not have an `event` tag and no matching app provides the required capability then the calling app **MUST** receive an error that the capability is unavailable and not a result. -> The method **MUST** have a result, which can by any type. -> -> The result schema **MUST** match the `x-response` schema on the provider method. -> -> The final result returned by the app provided method **MUST** be the [calculated result](#33-calculating-the-final-result) from the selected provider. +If the app provided method has an `event` tag then event registration **MUST** not return an availability error due to a lack of providers, since one may be launched at a future point. -### 3.2. Selecting the best provider app -If a method does not have `x-aggregate` set to `true` then it **MAY** have a `boolean` `x-app-selection` property which denotes how to pick a single app to provide the response. +**TODO**: ^^ do we want to scan the catalog and see if it's even possible to have an app that provides it? Seems heavy/overkill and dives into a spec we don't have yet. -If the `x-app-selection` property is not present then it defaults to `false`. +### 3.2. Selecting all provider apps +An app provided method's `capabilites` tag **MAY** have the `x-provider-selection` property set to `all` which denotes that all providers of this capability may provide responses to a single request of the method. -If `x-app-selection` is set to `"presentation"` then the app selected to provide the result **MUST** be the `foreground` or `background` app. +If an app provided method has `x-provider-selection` set to `all` and the app provided method does not have an `event` tag then: -If `x-app-selection` is set to `"presentation"` and neither the `forground` or `background` app provides the required capability then the calling app **MUST** receive an error and not a result. +> The method **MUST** have a result with the type set to `array`. +> +> The `items` schema of the array **MUST** match the `x-response` schema on the provider method. +> +> The final result returned by the app provided method **MUST** be a flattened array with all of the values from all providers. + +Otherwise, if `x-provider-selection` is set to `all` and the app provided method has an `event` tag then: -If `x-app-selection` is set to `"recent"` then the app selected to provide the result **MUST** be the most recently launched app that provides the required capability. +> The method result schema **MUST** match the `x-response` schema on the provider method. +> +> The app provided method **MUST** dispatch a single, separate event with the value from each notification made by any provider. ### 3.3. Calculating the final result For each app provided method result, the result **MUST** be calculated with the following potential transformations. -If an app provided method has `x-aggregate` set to `true`, then the term "calculated result" refers to the items of the app provided method result array for the remainder of this section. +If an app provided method has `x-provider-selection` set to `all` and the app provided method does not have an `event` tag, then the term "calculated result" refers to the items of the app provided method result array for the remainder of this section. -If an app provided method has `x-aggregate` set to `false` or the property does not exist, then the term "calculated result" refers to the app provided method result for the remainder of this section. +Otherwise, the term "calculated result" refers to the app provided method result for the remainder of this section. #### 3.3.1. Composite Results -An app provided method may be configured to use the provided value as the calculated result, or to compose it into an object along with other values. +An app provided method may be configured to use the provided value as the calculated result, or to compose it into an object along with other values. -If the app provided method does not have an `event` tag then: +If the app provided method does not have an `event` tag: -> If an app provided method's `capabilities` tag has an `x-composite-result` property set to `true`, then the app provided method result schema **MUST** have a property that matches name and schema of the provider method result, and property's value **MUST** be set to the value returned by the providing app for the final result. +> If the calculated result schema matches the provider method result schema then the provider method result value **MUST** be passed through as-is, this is *not* considered a "composite result." > -> If an app provided method's `capabilities` tag does not have an `x-composite-result` property or it is `false`, then the calculated result schema **MUST** match the app provided method result schema and the value of the calculated result **MUST** be the value returned by the providing app. +> Otherwise, if the calculated result schema is an object with a property whose name and schema matches the provider method result name and schema then the provider method result value **MUST** inserted into an object under the property name; this is refered to as a "composite result" for the rest of this document. -If the app provided method has an `event` tag then: +If the app provided method has an `event` tag: -> If an app provided method's `capabilities` tag has an `x-composite-result` property, then every property of the provided method result schema that has a matching name and schema *parameter* in the provider method **MUST** have that property set to the value of the matching parameter from the provider notification for the final result. +> If the calculated result schema matches the provider method's *last* parameter schema then the value of that parameter **MUST** be passed through as the calculated result value as-is. > -> If an app provided method's `capabilities` tag does not have an `x-composite-result` property, then the calculated result schema **MUST** match the *last parameter* of the provider method and the value of the calculated result **MUST** be the value of that parameter from the provider notification for the final result. - +> Otherwise, if the calculated result schema is an object with a property whose name and schema matches the provider method's *last* parameter name and schema then the value of that parameter **MUST** inserted into an object under the property name; this is refered to as a "composite result" for the rest of this document. #### 3.3.2. Inserting the appId An app provided method may be configured to insert the providing app id into composite results. This is not allowed in non-composite results to avoid collisions with the provder method sending an appId and Firebolt overriding it. -If an app provided method's `capabilities` tag has an `x-composite-result` property set to `true` then the method **MAY** have an `x-app-id-property`. - -If an app provided method's `capabilities` tag has an `x-composite-result` property set to `false` or does not have the property then the method **MUST NOT** have an `x-app-id-property`. - -If an app provided method's `capabilities` tag has an `x-app-id-property` property, then the calculated result schema **MUST** have a property with that name, and property's value **MUST** be set to the the appId of the providing app for that calculated result. +If a "composite result" was used to wrap the provider method value and the app provided method's schema has an `appId` `string` property at the top level then the property's value **MUST** be set to the the appId of the providing app for that calculated result. ## 4. API Gateway The Firebolt API Gateway **MUST** detect app-passthrough APIs and map the `use`/`manage` APIs to the corresponding `provide` APIs by parsing the Firebolt OpenRPC Specification and following the logic outline in this document. @@ -140,20 +133,18 @@ Schemas "disinterest" ] }, - "InterestInfo": { + "EntityDetailsFromApp": { "type": "object", "properties": { "appId": { "type": "string" }, "entity": { - "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/EntityInfo" - }, - "type": { - "$ref": "#/components/schemas/InterestType" + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/EntityDetails" } }, "required": [ + "appId", "entity" ] } @@ -172,11 +163,8 @@ Content.requestUserInterest (pull, use) "tags": [ { "name": "capabilities", - "x-app-provided": true, - "x-app-selection": "presentation", - "x-composite-result": true, - "x-app-id-property": "appId", - "x-aggregate": false, + "x-provided-by": "Discovery.onRequestUserInterest", + "x-provider-selection": "active", "x-uses": [ "xrn:firebolt:capability:discovery:interest" ] @@ -194,7 +182,7 @@ Content.requestUserInterest (pull, use) "result": { "name": "interestedIn", "schema": { - "$ref": "#/components/schemas/InterestInfo", + "$ref": "#/components/schemas/EntityFromApp", } } } @@ -217,7 +205,7 @@ Discovery.onRequestUserInterest (1.0, pull, provide) { "name": "event", "x-response": { - "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/EntityInfo" + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/Entity" } } ], @@ -261,7 +249,7 @@ Discovery.userInterest (2.0, pull, provide) "result": { "name": "entity", "schema": { - "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/EntityInfo" + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/Entity" } } } @@ -293,7 +281,7 @@ Discovery.userInterest (push) { "name": "entity", "schema": { - "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/EntityInfo" + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/Entity" } } ] @@ -312,10 +300,8 @@ Content.onUserInterest (push) "tags": [ { "name": "capabilities", - "x-app-provided": true, - "x-composite-result": true, - "x-aggregate": false, - "x-app-id-property": "appId", + "x-provided-by": "Discovery.userInterest", + "x-provider-selection": "active", "x-uses": [ "xrn:firebolt:capability:discovery:interest" ] From 8a4635567db9611f21171acff9f4f9fd3f8e6380 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Thu, 29 Feb 2024 11:46:55 -0500 Subject: [PATCH 16/54] fix: Removed use of notifications for push methods --- .../openrpc-extensions/app-passthrough-apis.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md index 9d465d367..637ed758c 100644 --- a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md +++ b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md @@ -34,7 +34,7 @@ The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL - [6. Example: Keyboard](#6-example-keyboard) ## 3. Provided By Extension -Firebolt OpenRPC **MUST** support a `string` `x-provided-by` extension property on the `capabilities` tag that denotes a method is provided by some app on the device registeringf or the specified provider API, e.g. `Module.onRequestMethod`. +Firebolt OpenRPC **MUST** support a `string` `x-provided-by` extension property on the `capabilities` tag that denotes a method is provided by some app on the device registering for the specified provider API, e.g. `Module.onRequestMethod`. The method denoted by `x-provided-by` is referred to as the "provider" or "provider method" for the remainder of this document. @@ -46,9 +46,7 @@ An app provided method **MUST** `use` a single capability or `manage` a single c The provider method **MUST** provide the same capability that the app provided method either uses or manages. -If the app provided method has an `event` tag then the provider method **MUST** be a notification method (i.e. it has no `x-response` defined). - -If the app provided method has no `event` tag then the provider method **MUST NOT** be a notification method (i.e. it *does* have an `x-response` defined). +If the app provided method has an `event` tag then the provider method **MUST** have a result schema with `"type"` set to the string `"null"`. If an app provided method has no provider method, or more than one provider method, then it is not a valid Firebolt OpenRPC method schema, and a validation error **MUST** be generated. From 0e8cd00546f33e0a92562b4f44a736028762d223 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Thu, 29 Feb 2024 11:49:32 -0500 Subject: [PATCH 17/54] fix: Minor push/pull fixes --- .../specifications/openrpc-extensions/push-pull-methods.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements/specifications/openrpc-extensions/push-pull-methods.md b/requirements/specifications/openrpc-extensions/push-pull-methods.md index adb7440a0..fa4cfbb72 100644 --- a/requirements/specifications/openrpc-extensions/push-pull-methods.md +++ b/requirements/specifications/openrpc-extensions/push-pull-methods.md @@ -30,7 +30,7 @@ Firebolt OpenRPC **MUST** support a method tag named `push-pull` that denotes a If a *any* method has a `push-pull` tag then an additional method named `onRequest` **MUST** be auto-generated by the OpenRPC tooling; This new method is called the "pull provider method" for the remainder of this section. -The pull provider method **MUST** have the `x-result` extension schema set to the schema of the last parameter of the push method. +The pull provider method **MUST** have the `x-response` extension schema set to the schema of the last parameter of the push method. The pull provider method **MUST** have any remaining parameters (not the last one) from the push method, as these are context parameters used by both push and pull. @@ -42,7 +42,7 @@ The pull request method **MUST** have the `result` schema set to the schema of t The pull request method **MUST** have any remaining parameters (not the last one) from the push method, as these are context parameters used by both push and pull. -The pull request method **MUST** have the `x-uses` array contain the value of the `x-provides` value from the push method. +The pull request method **MUST** have the `x-manages` array contain the value of the `x-provides` value from the push method. If a *any* method has a `push-pull` tag then an additional method named `on` **MUST** be auto-generated by the OpenRPC tooling; This new method is called the "push notification method" for the remainder of this section. From 82aa24a5c6a407e909a53215832d77f9c1645898 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Thu, 29 Feb 2024 14:16:14 -0500 Subject: [PATCH 18/54] fix: Further review w/ @kpears201 --- .../app-passthrough-apis.md | 84 +++++++++++-------- 1 file changed, 47 insertions(+), 37 deletions(-) diff --git a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md index 637ed758c..cac273b09 100644 --- a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md +++ b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md @@ -24,14 +24,14 @@ The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL - [1. Overview](#1-overview) - [2. Table of Contents](#2-table-of-contents) - [3. Provided By Extension](#3-provided-by-extension) - - [3.1. Selecting the best provider app](#31-selecting-the-best-provider-app) - - [3.2. Selecting all provider apps](#32-selecting-all-provider-apps) - - [3.3. Calculating the final result](#33-calculating-the-final-result) - - [3.3.1. Composite Results](#331-composite-results) - - [3.3.2. Inserting the appId](#332-inserting-the-appid) -- [4. API Gateway](#4-api-gateway) -- [5. Example: User Interest](#5-example-user-interest) -- [6. Example: Keyboard](#6-example-keyboard) +- [4. Selecting the best provider app](#4-selecting-the-best-provider-app) +- [5. Calculating the result](#5-calculating-the-result) + - [5.1. Selecting multiple provider apps](#51-selecting-multiple-provider-apps) + - [5.2. Composite Results](#52-composite-results) + - [5.3. Inserting the appId](#53-inserting-the-appid) +- [6. API Gateway](#6-api-gateway) +- [7. Example: User Interest](#7-example-user-interest) +- [8. Example: Keyboard](#8-example-keyboard) ## 3. Provided By Extension Firebolt OpenRPC **MUST** support a `string` `x-provided-by` extension property on the `capabilities` tag that denotes a method is provided by some app on the device registering for the specified provider API, e.g. `Module.onRequestMethod`. @@ -48,18 +48,22 @@ The provider method **MUST** provide the same capability that the app provided m If the app provided method has an `event` tag then the provider method **MUST** have a result schema with `"type"` set to the string `"null"`. -If an app provided method has no provider method, or more than one provider method, then it is not a valid Firebolt OpenRPC method schema, and a validation error **MUST** be generated. +If an app provided method has no provider method then it is not a valid Firebolt OpenRPC method schema, and a validation error **MUST** be generated. -### 3.1. Selecting the best provider app -An app provided method's `capabilites` tag **MAY** have the `x-provider-selection` property which denotes the method for selecting which app(s) will should provide the capability. +## 4. Selecting the best provider app +A provider method's `capabilites` tag **MAY** have the `x-lifecycle` property which denotes which lifecycle states the providing app is allowed to be in during an app provided transaction. -If the `x-provider-selection` property is not present then it defaults to `"running"`. +If the `x-lifecycle` property is not present then it **MUST** be assumed to be `["foreground", "background", "inactive"]` for the remainder of this section. -If `x-provider-selection` is set to `"active"` then the app selected to provide the value **MUST** be the `foreground` or `background` app with a bias for `foreground` apps and ties broken by which app was mostly recently foreground and fullscreen. +The app selected to provide a value **MUST** be in one of the lifecycle states listed in the `x-lifecycle` extension of the provider method. -If `x-provider-selection` is set to, or defaults to, `"running"` then the app selected to provide the result **MUST** be an app that is currently in the `foreground`, `background`, or `inactive` states, biased in that order, with ties broken by which app was most recently foreground and fullscreen. +If `x-multiple-providers` is set to `true` then all apps matching `x-lifecycle` at the time of the transaction **MUST** be used to provide the value, see [Selecting multiple provider apps](#32-selecting-multiple-provider-apps) for more info. -If `x-provider-selection` is set to `"all"` refer to [Selecting of all provider apps](#31-selecting-all-provider-apps), below. +If `x-multiple-providers` is set to `false` or not set then: + +> If more than one app is possible, then the candidate apps **MUST** be pruned by reevaluating the `x-lifecycle` array with the last value removed; This is repeated until there is only one app or only one lifecycle state remaining. +> +> If more than one app is still possible, then the app that was most recently in the `foreground` state **MUST** be selected; In the case of a tie, the platform **MUST** choose only one app using its own discretion. If the app provided method does not have an `event` tag and no matching app provides the required capability then the calling app **MUST** receive an error that the capability is unavailable and not a result. @@ -67,31 +71,37 @@ If the app provided method has an `event` tag then event registration **MUST** n **TODO**: ^^ do we want to scan the catalog and see if it's even possible to have an app that provides it? Seems heavy/overkill and dives into a spec we don't have yet. -### 3.2. Selecting all provider apps -An app provided method's `capabilites` tag **MAY** have the `x-provider-selection` property set to `all` which denotes that all providers of this capability may provide responses to a single request of the method. +## 5. Calculating the result +Each app provided method result **MUST** be calculated with the following potential transformations. -If an app provided method has `x-provider-selection` set to `all` and the app provided method does not have an `event` tag then: +If an app provided method has `x-multiple-providers` set to `true` and the app provided method does not have an `event` tag, then the term "calculated result" refers to each item of the app provided method result array for the remainder of this section. + +Otherwise, the term "calculated result" refers to the app provided method result for the remainder of this section. + +### 5.1. Selecting multiple provider apps +An app provided method's `capabilites` tag **MAY** have the `x-multiple-providers` property set to `true` which denotes that more than one app may provider this capability at the same time. + +If an app provided method has `x-multiple-providers` set to `true` and the app provided method does not have an `event` tag then: > The method **MUST** have a result with the type set to `array`. > -> The `items` schema of the array **MUST** match the `x-response` schema on the provider method. +> At least one of the following **MUST** be true: +> +> - The `items` schema of the array **MUST** match the `x-response` schema on the provider method. +> +> - The `items` schema of the array **MUST** have a property whose name is not `"appId"` and schema matches the `x-response` schema. > -> The final result returned by the app provided method **MUST** be a flattened array with all of the values from all providers. +> The final result returned by the app provided method **MUST** be a flattened array with all of the values from all selected providers. -Otherwise, if `x-provider-selection` is set to `all` and the app provided method has an `event` tag then: +If an app provided method has `x-multiple-providers` is set to `true` and the app provided method has an `event` tag then: -> The method result schema **MUST** match the `x-response` schema on the provider method. +> - The method result schema **MUST** match the `x-response` schema on the provider method. > -> The app provided method **MUST** dispatch a single, separate event with the value from each notification made by any provider. - -### 3.3. Calculating the final result -For each app provided method result, the result **MUST** be calculated with the following potential transformations. - -If an app provided method has `x-provider-selection` set to `all` and the app provided method does not have an `event` tag, then the term "calculated result" refers to the items of the app provided method result array for the remainder of this section. - -Otherwise, the term "calculated result" refers to the app provided method result for the remainder of this section. +> - The method result schema **MUST** have a property whose name is not `"appId"` and schema matches the `x-response` schema. +> +> The app provided method **MUST** dispatch each "calculated result" as a separate event to all listeners. -#### 3.3.1. Composite Results +### 5.2. Composite Results An app provided method may be configured to use the provided value as the calculated result, or to compose it into an object along with other values. If the app provided method does not have an `event` tag: @@ -106,15 +116,15 @@ If the app provided method has an `event` tag: > > Otherwise, if the calculated result schema is an object with a property whose name and schema matches the provider method's *last* parameter name and schema then the value of that parameter **MUST** inserted into an object under the property name; this is refered to as a "composite result" for the rest of this document. -#### 3.3.2. Inserting the appId +### 5.3. Inserting the appId An app provided method may be configured to insert the providing app id into composite results. This is not allowed in non-composite results to avoid collisions with the provder method sending an appId and Firebolt overriding it. If a "composite result" was used to wrap the provider method value and the app provided method's schema has an `appId` `string` property at the top level then the property's value **MUST** be set to the the appId of the providing app for that calculated result. -## 4. API Gateway +## 6. API Gateway The Firebolt API Gateway **MUST** detect app-passthrough APIs and map the `use`/`manage` APIs to the corresponding `provide` APIs by parsing the Firebolt OpenRPC Specification and following the logic outline in this document. -## 5. Example: User Interest +## 7. Example: User Interest User Interest does not use the `x-app-method` property because there is only one method and one event in the API, so they can be detected automatically via the capability string. @@ -162,7 +172,7 @@ Content.requestUserInterest (pull, use) { "name": "capabilities", "x-provided-by": "Discovery.onRequestUserInterest", - "x-provider-selection": "active", + "x-lifecycle": "active", "x-uses": [ "xrn:firebolt:capability:discovery:interest" ] @@ -299,7 +309,7 @@ Content.onUserInterest (push) { "name": "capabilities", "x-provided-by": "Discovery.userInterest", - "x-provider-selection": "active", + "x-lifecycle": "active", "x-uses": [ "xrn:firebolt:capability:discovery:interest" ] @@ -319,7 +329,7 @@ Content.onUserInterest (push) } ``` -## 6. Example: Keyboard +## 8. Example: Keyboard Keyboard *requires* the* `x-app-method` property because there are three methods in the same capability, so the mapping cannot be detected automatically via the capability string. From 3e4c5859b01308cdb8c5a822590c23a53c6e493e Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Thu, 29 Feb 2024 14:22:19 -0500 Subject: [PATCH 19/54] fix: Clarification and updated examples --- .../openrpc-extensions/app-passthrough-apis.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md index cac273b09..768eeaa6a 100644 --- a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md +++ b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md @@ -57,9 +57,9 @@ If the `x-lifecycle` property is not present then it **MUST** be assumed to be ` The app selected to provide a value **MUST** be in one of the lifecycle states listed in the `x-lifecycle` extension of the provider method. -If `x-multiple-providers` is set to `true` then all apps matching `x-lifecycle` at the time of the transaction **MUST** be used to provide the value, see [Selecting multiple provider apps](#32-selecting-multiple-provider-apps) for more info. +If the *app provided method's* `capabilities` tag has the `x-multiple-providers` property is set to `true` then all apps matching `x-lifecycle` at the time of the transaction **MUST** be used to provide the value, see [Selecting multiple provider apps](#32-selecting-multiple-provider-apps) for more info. -If `x-multiple-providers` is set to `false` or not set then: +If the *app provided method's* `capabilities` tag has the `x-multiple-providers` is set to `false` or not set then: > If more than one app is possible, then the candidate apps **MUST** be pruned by reevaluating the `x-lifecycle` array with the last value removed; This is repeated until there is only one app or only one lifecycle state remaining. > @@ -172,7 +172,6 @@ Content.requestUserInterest (pull, use) { "name": "capabilities", "x-provided-by": "Discovery.onRequestUserInterest", - "x-lifecycle": "active", "x-uses": [ "xrn:firebolt:capability:discovery:interest" ] @@ -209,6 +208,7 @@ Discovery.onRequestUserInterest (1.0, pull, provide) { "name": "capabilities", "x-provides": "xrn:firebolt:capability:discovery:interest", + "x-lifecycle": ["foreground", "background"], }, { "name": "event", @@ -243,6 +243,7 @@ Discovery.userInterest (2.0, pull, provide) "tags": [ { "name": "capabilities", + "x-lifecycle": ["foreground", "background"], "x-provides": "xrn:firebolt:capability:discovery:interest" } ], @@ -276,7 +277,8 @@ Discovery.userInterest (push) "tags": [ { "name": "capabilities", - "x-provides": "xrn:firebolt:capability:discovery:interest" + "x-provides": "xrn:firebolt:capability:discovery:interest", + "x-lifecycle": ["foreground", "background"], } ], "params": [ @@ -309,7 +311,6 @@ Content.onUserInterest (push) { "name": "capabilities", "x-provided-by": "Discovery.userInterest", - "x-lifecycle": "active", "x-uses": [ "xrn:firebolt:capability:discovery:interest" ] From f9a01458d0d0daacedc9692a24b3f1fd42f801d6 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Fri, 1 Mar 2024 10:56:59 -0500 Subject: [PATCH 20/54] feat: Added lifecycle api gating --- .../app-passthrough-apis.md | 2 + .../lifecycle-api-gating.md | 65 +++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 requirements/specifications/openrpc-extensions/lifecycle-api-gating.md diff --git a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md index 768eeaa6a..666612dac 100644 --- a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md +++ b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md @@ -64,6 +64,8 @@ If the *app provided method's* `capabilities` tag has the `x-multiple-providers` > If more than one app is possible, then the candidate apps **MUST** be pruned by reevaluating the `x-lifecycle` array with the last value removed; This is repeated until there is only one app or only one lifecycle state remaining. > > If more than one app is still possible, then the app that was most recently in the `foreground` state **MUST** be selected; In the case of a tie, the platform **MUST** choose only one app using its own discretion. +> +> If there is no provider most recently in the `foreground` state then the app that was most recently in the inactive state **MUST** be selected. If the app provided method does not have an `event` tag and no matching app provides the required capability then the calling app **MUST** receive an error that the capability is unavailable and not a result. diff --git a/requirements/specifications/openrpc-extensions/lifecycle-api-gating.md b/requirements/specifications/openrpc-extensions/lifecycle-api-gating.md new file mode 100644 index 000000000..d32554dad --- /dev/null +++ b/requirements/specifications/openrpc-extensions/lifecycle-api-gating.md @@ -0,0 +1,65 @@ +# App Pass-through APIs + +Document Status: Working Draft + +See [Firebolt Requirements Governance](../../governance.md) for more info. + +| Contributor | Organization | +|-----------------|----------------| +| Jeremy LaCivita | Comcast | +| Kevin Pearson | Comcast | + +## 1. Overview +This document describes the the `x-lifecycle` Firebolt OpenRPC extension. + +Some APIs require that they are only called when an app is in a certain Lifecycle state. + +To facilitate these APIs, Firebolt denotes an OpenRPC extension to limit the states than ap app is allowed to be in when a method request is made. + +This document is written using the [IETF Best Common Practice 14](https://www.rfc-editor.org/rfc/rfc2119.txt) and should include the following summary in the Overview section: + +The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL NOT**", "**SHOULD**", "**SHOULD NOT**", "**RECOMMENDED**", "**NOT RECOMMENDED**", "**MAY**", and "**OPTIONAL**" in this document are to be interpreted as described in [BCP 14](https://www.rfc-editor.org/rfc/rfc2119.txt) [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here. + +## 2. Table of Contents +- [1. Overview](#1-overview) +- [2. Table of Contents](#2-table-of-contents) +- [3. Lifecycle Extension on the Capabilities tag](#3-lifecycle-extension-on-the-capabilities-tag) + - [Events](#events) + +## 3. Lifecycle Extension on the Capabilities tag +Firebolt OpenRPC **MUST** support an extension named `x-lifecycle` that denotes a method should not be requested when an app is in a particular state. + +The `x-lifecycle` extension **MUST** only be used on a method's `capabilities` tag. + +The `x-lifecycle` value **MUST** be an array with one or more of the following values: + + - initializing + - foreground + - background + - inactive + +If the `x-lifecycle` value is not provided, then it **MUST** default to: + +```json +[ + "initializing" + "foreground" + "background" + "inactive" +] +``` + +If a method has an `x-lifecycle` extension on the `capabilities` tag then that method **MUST NOT** return a success/result unless the app is in one of the listed lifecycle states during the time of the method request. + +If the app is not in one of the listed lifecycle states during the time of the request then the method **MUST** return an unavailable error. + +**TODO**: define the error? + +### Events +If a method with an `event` tag has the `x-lifecycle` extension set to a valid value then event notifications **MUST NOT** be sent to the app when it is not in one of the listed states during the time of the notification. + +The default behavior is that events not sent to an app due to `x-lifecycle` configuration **MUST NOT** be stored and sent to the app at a later point. + +An overriding requirement **MUST** exist in a specific feature document in order for a specific event to deviate from the default behavior. + +Registering for event notifications is possible in any lifecycle state and **MUST NOT** be prevented by a method's `x-lifecycle` value. From cb441d788f4cdd612df5d59a455b8db07e6b022e Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Wed, 6 Mar 2024 09:50:21 -0500 Subject: [PATCH 21/54] fix: Get app-passthrough working with existing APIs --- package-lock.json | 292 ++--------- package.json | 6 +- .../app-passthrough-apis.md | 3 + src/openrpc/discovery.json | 298 +++++++++++- src/openrpc/keyboard.json | 38 +- src/schemas/advertising.json | 23 + src/schemas/discovery.json | 106 ++++ src/schemas/entity.json | 457 ++++++++++++++++++ src/schemas/intents.json | 454 +---------------- src/schemas/lifecycle.json | 38 ++ src/schemas/types.json | 194 ++++++++ src/sdks/manage/test/suite/keyboard.test.ts | 24 +- 12 files changed, 1196 insertions(+), 737 deletions(-) create mode 100644 src/schemas/advertising.json create mode 100644 src/schemas/discovery.json create mode 100644 src/schemas/entity.json create mode 100644 src/schemas/lifecycle.json create mode 100644 src/schemas/types.json diff --git a/package-lock.json b/package-lock.json index 4994954ab..2939b0264 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "devDependencies": { "@commitlint/cli": "^17.0.3", "@commitlint/config-conventional": "^17.0.3", - "@firebolt-js/openrpc": "2.3.0", + "@firebolt-js/openrpc": "../firebolt-openrpc", "@firebolt-js/schemas": "2.0.0", "@saithodev/semantic-release-backmerge": "^3.2.0", "@semantic-release/changelog": "^6.0.1", @@ -36,6 +36,38 @@ "typescript": "^4.6.4" } }, + "../firebolt-openrpc": { + "name": "@firebolt-js/openrpc", + "version": "2.3.0-next.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "ajv": "^8.12.0", + "ajv-formats": "^2.1.1", + "array.prototype.groupby": "^1.1.0", + "crocks": "^0.12.4", + "deepmerge": "^4.2.2", + "fs-extra": "^10.1.0", + "highland": "^2.13.5", + "mkdirp": "^0.5.6", + "node-fetch": "^3.2.10", + "nopt": "^5.0.0", + "util": "^0.12.4" + }, + "bin": { + "firebolt-openrpc": "src/cli.mjs" + }, + "devDependencies": { + "@commitlint/cli": "^17.1.2", + "@commitlint/config-conventional": "^17.1.0", + "@semantic-release/changelog": "^6.0.1", + "@semantic-release/git": "^10.0.1", + "@semantic-release/npm": "^9.0.1", + "husky": "^8.0.1", + "jest": "^27.3.1", + "semantic-release": "^19.0.5" + } + }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", @@ -1070,95 +1102,8 @@ "link": true }, "node_modules/@firebolt-js/openrpc": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@firebolt-js/openrpc/-/openrpc-2.3.0.tgz", - "integrity": "sha512-JlhFy4r1dkIUHESVi72LaYgbdjP3hG04OfaLEtqLx5sLYDOQ8Y+KHiD2h81u8fvRgLEc6HiX5HgCFdapoUg8Wg==", - "dev": true, - "dependencies": { - "ajv": "^8.3.0", - "ajv-formats": "^2.1.0", - "array.prototype.groupby": "^1.1.0", - "crocks": "^0.12.4", - "deepmerge": "^4.2.2", - "fs-extra": "^10.1.0", - "highland": "^2.13.5", - "mkdirp": "^0.5.6", - "node-fetch": "^3.2.10", - "nopt": "^5.0.0", - "util": "^0.12.4" - }, - "bin": { - "firebolt-openrpc": "src/cli.mjs" - } - }, - "node_modules/@firebolt-js/openrpc/node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/@firebolt-js/openrpc/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@firebolt-js/openrpc/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@firebolt-js/openrpc/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/@firebolt-js/openrpc/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/@firebolt-js/openrpc/node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } + "resolved": "../firebolt-openrpc", + "link": true }, "node_modules/@firebolt-js/schemas": { "version": "2.0.0", @@ -2731,20 +2676,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.groupby": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array.prototype.groupby/-/array.prototype.groupby-1.1.0.tgz", - "integrity": "sha512-p+QtvmnNEBqajQWLG3kPls8cLPBfJgvayzc/qplsX8Vchtevtq+TR2gyav5xs5h+mdUjfgOvYoCdTsVxu3b5sA==", - "deprecated": "This proposal has been altered; please use https://npmjs.com/object.groupby instead!", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.1" - } - }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", @@ -3370,12 +3301,6 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, - "node_modules/crocks": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/crocks/-/crocks-0.12.4.tgz", - "integrity": "sha512-paln6xJUrR9e/OWMFsyTi4dLyr+q99C5f7PQbGgSDHtwsfW0sCNZvnpHzvniI2dAE0uoBgeIP1Ukmme8Z0HxxA==", - "dev": true - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -3432,15 +3357,6 @@ "node": ">=8" } }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, "node_modules/data-urls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", @@ -4810,29 +4726,6 @@ "bser": "2.1.1" } }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, "node_modules/figures": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", @@ -4947,18 +4840,6 @@ "node": ">= 6" } }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dev": true, - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, "node_modules/from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -5416,15 +5297,6 @@ "node": ">= 0.4" } }, - "node_modules/highland": { - "version": "2.13.5", - "resolved": "https://registry.npmjs.org/highland/-/highland-2.13.5.tgz", - "integrity": "sha512-dn2flPapIIAa4BtkB2ahjshg8iSJtrJtdhEb9/oiOrS5HMQTR/GuhFpqJ+11YBdtnl3AwWKvbZd1Uxr8uAmA7A==", - "dev": true, - "dependencies": { - "util-deprecate": "^1.0.2" - } - }, "node_modules/hook-std": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", @@ -5683,22 +5555,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -5813,21 +5669,6 @@ "node": ">=6" } }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -7458,25 +7299,6 @@ "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", "dev": true }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } - }, "node_modules/node-emoji": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", @@ -7486,24 +7308,6 @@ "lodash": "^4.17.21" } }, - "node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "dev": true, - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -16576,19 +16380,6 @@ "requires-port": "^1.0.0" } }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -16668,15 +16459,6 @@ "makeerror": "1.0.12" } }, - "node_modules/web-streams-polyfill": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -16951,7 +16733,7 @@ }, "src/sdks/core": { "name": "@firebolt-js/sdk", - "version": "1.1.0-next.3", + "version": "1.1.0", "license": "Apache-2.0", "devDependencies": { "jest": "^28.1.0", @@ -16962,7 +16744,7 @@ }, "src/sdks/manage": { "name": "@firebolt-js/manage-sdk", - "version": "1.1.0-next.3", + "version": "1.1.0", "license": "Apache-2.0", "devDependencies": { "jest": "^28.1.0", diff --git a/package.json b/package.json index bab5f2042..20611130a 100644 --- a/package.json +++ b/package.json @@ -12,10 +12,10 @@ ], "scripts": { "fs:setup": "npm run clean && mkdir -p dist", - "validate:each": "npx firebolt-openrpc validate --input src/openrpc --schemas node_modules/@firebolt-js/schemas/src/schemas --schemas src/schemas --transformations", + "validate:each": "npx firebolt-openrpc validate --input src/openrpc --schemas src/schemas --transformations", "validate:compiled": "npx firebolt-openrpc validate --input dist/firebolt-open-rpc.json && npm run validate --workspaces", "validate": "npm run validate:each && npm run validate:compiled ", - "compile": "npx firebolt-openrpc openrpc --input src --template src/template/openrpc/template.json --output ./dist/firebolt-open-rpc.json --schemas node_modules/@firebolt-js/schemas/src/schemas --schemas src/schemas", + "compile": "npx firebolt-openrpc openrpc --input src --template src/template/openrpc/template.json --output ./dist/firebolt-open-rpc.json --schemas src/schemas", "slice": "npm run slice --workspaces", "sdks": "npm run sdk --workspaces", "docs": "npm run docs --workspaces", @@ -44,7 +44,7 @@ "devDependencies": { "@commitlint/cli": "^17.0.3", "@commitlint/config-conventional": "^17.0.3", - "@firebolt-js/openrpc": "2.3.0", + "@firebolt-js/openrpc": "../firebolt-openrpc", "@firebolt-js/schemas": "2.0.0", "@saithodev/semantic-release-backmerge": "^3.2.0", "@semantic-release/changelog": "^6.0.1", diff --git a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md index 666612dac..dc9d91d33 100644 --- a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md +++ b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md @@ -51,6 +51,9 @@ If the app provided method has an `event` tag then the provider method **MUST** If an app provided method has no provider method then it is not a valid Firebolt OpenRPC method schema, and a validation error **MUST** be generated. ## 4. Selecting the best provider app + +**TODO**: This entire section should be moved into a per-device config for the capability, and not specified in the OpenRPC. + A provider method's `capabilites` tag **MAY** have the `x-lifecycle` property which denotes which lifecycle states the providing app is allowed to be in during an app provided transaction. If the `x-lifecycle` property is not present then it **MUST** be assumed to be `["foreground", "background", "inactive"]` for the remainder of this section. diff --git a/src/openrpc/discovery.json b/src/openrpc/discovery.json index eb7530a35..79ef7830e 100644 --- a/src/openrpc/discovery.json +++ b/src/openrpc/discovery.json @@ -52,6 +52,10 @@ { "name": "capabilities", "x-provides": "xrn:firebolt:capability:discovery:entity-info" + }, + { + "name": "deprecated", + "x-alternative": "Discovery.details" } ], "summary": "Provide information about a program entity and its available watchable assets, such as entitlement status and price, via either a push or pull call flow.", @@ -409,12 +413,194 @@ } ], "result": { - "name": "success", + "name": "result", "value": true } } ] }, + { + "name": "details", + "tags": [ + { + "name": "push-pull", + "x-subscriber-type": "global" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:entity-info" + } + ], + "summary": "Provide information about a program entity and its available watchable assets, such as entitlement status and price, via either a push or pull call flow.", + "description": "Provide information about a program entity and its available watchable assets, such as entitlement status and price, via either a push or pull call flow. Includes information about the program entity and its relevant associated entities, such as extras, previews, and, in the case of TV series, seasons and episodes.\n\nSee the `EntityInfo` and `WayToWatch` data structures below for more information.\n\nThe app only needs to implement Pull support for `entityInfo` at this time.", + "params": [ + { + "name": "entityId", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "result", + "required": true, + "schema": { + "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/DetailsResult" + }, + "summary": "The entityInfo data." + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Send entity info for a movie to the platform.", + "params": [ + { + "name": "entityId", + "value": "345" + }, + { + "name": "result", + "value": { + "expires": "2025-01-01T00:00:00.000Z", + "details": { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + }, + "waysToWatch": [ + { + "identifiers": { + "assetId": "123" + }, + "expires": "2025-01-01T00:00:00.000Z", + "entitled": true, + "entitledExpires": "2025-01-01T00:00:00.000Z", + "offeringType": "buy", + "price": 2.99, + "videoQuality": [ + "UHD" + ], + "audioProfile": [ + "dolbyAtmos" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ], + "subtitles": [ + "es" + ], + "audioDescriptions": [ + "en" + ] + } + ] + } + } + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Send entity info for a movie with a trailer to the platform.", + "params": [ + { + "name": "entityId", + "value": "345" + }, + { + "name": "result", + "value": { + "expires": "2025-01-01T00:00:00.000Z", + "details": { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + }, + "waysToWatch": [ + { + "identifiers": { + "assetId": "123" + }, + "expires": "2025-01-01T00:00:00.000Z", + "entitled": true, + "entitledExpires": "2025-01-01T00:00:00.000Z", + "offeringType": "buy", + "price": 2.99, + "videoQuality": [ + "UHD" + ], + "audioProfile": [ + "dolbyAtmos" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ], + "subtitles": [ + "es" + ], + "audioDescriptions": [ + "en" + ] + } + ] + } + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, { "name": "purchasedContent", "tags": [ @@ -424,7 +610,11 @@ { "name": "capabilities", "x-provides": "xrn:firebolt:capability:discovery:purchased-content" - } + }, + { + "name": "deprecated", + "x-alternative": "Discovery.purchases" + } ], "summary": "Provide a list of purchased content for the authenticated account, such as rentals and electronic sell through purchases.", "params": [ @@ -530,6 +720,108 @@ ], "description": "Return content purchased by the user, such as rentals and electronic sell through purchases.\n\nThe app should return the user's 100 most recent purchases in `entries`. The total count of purchases must be provided in `count`. If `count` is greater than the total number of `entries`, the UI may provide a link into the app to see the complete purchase list.\n\nThe `EntityInfo` object returned is not required to have `waysToWatch` populated, but it is recommended that it do so in case the UI wants to surface additional information on the purchases screen.\n\nThe app should implement both Push and Pull methods for `purchasedContent`.\n\nThe app should actively push `purchasedContent` when:\n\n* The app becomes Active.\n* When the state of the purchasedContent set has changed.\n* The app goes into Inactive or Background state, if there is a chance a change event has been missed." }, + { + "name": "purchases", + "tags": [ + { + "name": "push-pull" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:purchased-content" + } + ], + "summary": "Provide a list of purchased content for the authenticated account, such as rentals and electronic sell through purchases.", + "params": [ + { + "name": "result", + "required": true, + "schema": { + "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/DetailsArrayResult" + }, + "summary": "The data for the purchasedContent" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Inform the platform of the user's purchased content", + "params": [ + { + "name": "result", + "value": { + "totalCount": 10, + "expires": "2025-01-01T00:00:00.000Z", + "entries": [ + { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + }, + "waysToWatch": [ + { + "identifiers": { + "assetId": "123" + }, + "expires": "2025-01-01T00:00:00.000Z", + "entitled": true, + "entitledExpires": "2025-01-01T00:00:00.000Z", + "offeringType": "buy", + "price": 2.99, + "videoQuality": [ + "UHD" + ], + "audioProfile": [ + "dolbyAtmos" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ], + "subtitles": [ + "es" + ], + "audioDescriptions": [ + "en" + ] + } + ] + } + ] + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ], + "description": "Return content purchased by the user, such as rentals and electronic sell through purchases.\n\nThe app should return the user's 100 most recent purchases in `entries`. The total count of purchases must be provided in `count`. If `count` is greater than the total number of `entries`, the UI may provide a link into the app to see the complete purchase list.\n\nThe `EntityInfo` object returned is not required to have `waysToWatch` populated, but it is recommended that it do so in case the UI wants to surface additional information on the purchases screen.\n\nThe app should implement both Push and Pull methods for `purchasedContent`.\n\nThe app should actively push `purchasedContent` when:\n\n* The app becomes Active.\n* When the state of the purchasedContent set has changed.\n* The app goes into Inactive or Background state, if there is a chance a change event has been missed." + }, { "name": "watched", "summary": "Notify the platform that content was partially or completely watched", @@ -636,7 +928,7 @@ "name": "identifiers", "summary": "A set of content identifiers for this call to action", "schema": { - "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/ContentIdentifiers" + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/Entity" }, "required": true }, diff --git a/src/openrpc/keyboard.json b/src/openrpc/keyboard.json index 0ef1f725b..9d8e39412 100644 --- a/src/openrpc/keyboard.json +++ b/src/openrpc/keyboard.json @@ -11,6 +11,7 @@ "tags": [ { "name": "capabilities", + "x-provided-by": "Keyboard.onRequestEmail", "x-uses": [ "xrn:firebolt:capability:input:keyboard" ] @@ -84,6 +85,7 @@ "tags": [ { "name": "capabilities", + "x-provided-by": "Keyboard.onRequestPassword", "x-uses": [ "xrn:firebolt:capability:input:keyboard" ] @@ -128,6 +130,7 @@ "tags": [ { "name": "capabilities", + "x-provided-by": "Keyboard.onRequestStandard", "x-uses": [ "xrn:firebolt:capability:input:keyboard" ] @@ -175,11 +178,9 @@ { "name": "event", "x-response": { - "$ref": "#/components/schemas/KeyboardResult", + "type": "string", "examples": [ - { - "text": "username" - } + "username" ] } }, @@ -220,11 +221,9 @@ { "name": "event", "x-response": { - "$ref": "#/components/schemas/KeyboardResult", + "type": "string", "examples": [ - { - "text": "password" - } + "password" ] } }, @@ -265,11 +264,9 @@ { "name": "event", "x-response": { - "$ref": "#/components/schemas/KeyboardResult", + "type": "string", "examples": [ - { - "text": "email@address.com" - } + "email@address.com" ] } }, @@ -359,23 +356,6 @@ "$ref": "#/components/schemas/KeyboardParameters" } } - }, - "KeyboardResult": { - "title": "KeyboardResult", - "type": "object", - "required": [ - "text" - ], - "properties": { - "text": { - "type": "string", - "description": "The text the user entered into the keyboard" - }, - "canceled": { - "type": "boolean", - "description": "Whether the user canceled entering text before they were finished typing on the keyboard" - } - } } } } diff --git a/src/schemas/advertising.json b/src/schemas/advertising.json new file mode 100644 index 000000000..e3aca3ede --- /dev/null +++ b/src/schemas/advertising.json @@ -0,0 +1,23 @@ +{ + "$id": "https://meta.comcast.com/firebolt/advertising", + "title": "Advertising", + "oneOf": [ + { + "$ref": "#/definitions/SkipRestriction" + } + ], + "definitions": { + "SkipRestriction": { + "title": "SkipRestriction", + "$comment": "xrn:advertising:policy:skipRestriction:", + "type": "string", + "enum": [ + "none", + "adsUnwatched", + "adsAll", + "all" + ], + "description": "The advertisement skip restriction.\n\nApplies to fast-forward/rewind (e.g. trick mode), seeking over an entire opportunity (e.g. jump), seeking out of what's currently playing, and \"Skip this ad...\" features. Seeking over multiple ad opportunities only requires playback of the _last_ opportunity, not all opportunities, preceding the seek destination.\n\n| Value | Description |\n|--------------|--------------------------------------------------------------------------------|\n| none |No fast-forward, jump, or skip restrictions |\n| adsUnwatched | Restrict fast-forward, jump, and skip for unwatched ad opportunities only. |\n| adsAll | Restrict fast-forward, jump, and skip for all ad opportunities |\n| all | Restrict fast-forward, jump, and skip for all ad opportunities and all content |\n\nNamespace: `xrn:advertising:policy:skipRestriction:`\n\n" + } + } +} \ No newline at end of file diff --git a/src/schemas/discovery.json b/src/schemas/discovery.json new file mode 100644 index 000000000..b4f68c40f --- /dev/null +++ b/src/schemas/discovery.json @@ -0,0 +1,106 @@ +{ + "$id": "https://meta.comcast.com/firebolt/discovery", + "title": "Discovery", + "anyOf": [ + { + "$ref": "#/definitions/PurchasedContentResult" + } + ], + "definitions": { + "PurchasedContentResult": { + "title": "PurchasedContentResult", + "type": "object", + "properties": { + "expires": { + "type": "string", + "format": "date-time" + }, + "totalCount": { + "type": "integer", + "minimum": 0 + }, + "entries": { + "type": "array", + "items": { + "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/EntityInfo" + } + } + }, + "required": [ + "expires", + "totalCount", + "entries" + ], + "additionalProperties": false + }, + "EntityInfoResult": { + "title": "EntityInfoResult", + "description": "The result for an `entityInfo()` push or pull.", + "type": "object", + "properties": { + "expires": { + "type": "string", + "format": "date-time" + }, + "entity": { + "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/EntityInfo" + }, + "related": { + "type": "array", + "items": { + "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/EntityInfo" + } + } + }, + "required": [ + "expires", + "entity" + ], + "additionalProperties": false + }, + "DetailsResult": { + "title": "DetailsResult", + "type": "object", + "additionalProperties": false, + "required": [ + "expires", + "details" + ], + "properties": { + "expires": { + "type": "string", + "format": "date-time" + }, + "details": { + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/EntityDetails" + } + } + }, + "DetailsArrayResult": { + "title": "DetailsArrayResult", + "type": "object", + "additionalProperties": false, + "required": [ + "expires", + "entries", + "totalCount" + ], + "properties": { + "expires": { + "type": "string", + "format": "date-time" + }, + "totalCount": { + "type": "integer", + "minimum": 0 + }, + "entries": { + "type": "array", + "items": { + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/EntityDetails" + } + } + } + } + } + } \ No newline at end of file diff --git a/src/schemas/entity.json b/src/schemas/entity.json new file mode 100644 index 000000000..e385462c3 --- /dev/null +++ b/src/schemas/entity.json @@ -0,0 +1,457 @@ +{ + "$id": "https://meta.comcast.com/firebolt/entity", + "title": "Entity", + "oneOf": [ + { + "$ref": "#/definitions/Entity" + }, + { + "$ref": "#/definitions/PlayableEntity" + }, + { + "$ref": "#/definitions/EntityDetails" + } + ], + "definitions": { + "Entity": { + "oneOf": [ + { + "$ref": "#/definitions/ProgramEntity" + }, + { + "$ref": "#/definitions/MusicEntity" + }, + { + "$ref": "#/definitions/ChannelEntity" + }, + { + "$ref": "#/definitions/UntypedEntity" + }, + { + "$ref": "#/definitions/PlaylistEntity" + } + ] + }, + "EntityDetails": { + "title": "EntityDetails", + "type": "object", + "required": [ + "identifiers", + "info" + ], + "properties": { + "identifiers": { + "$ref": "#/definitions/Entity" + }, + "info": { + "$ref": "#/definitions/Metadata" + }, + "waysToWatch": { + "type": "array", + "items": { + "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/WayToWatch" + }, + "description": "An array of ways a user is might watch this entity, regardless of entitlements." + } + } + }, + "ChannelEntity": { + "title": "ChannelEntity", + "type": "object", + "properties": { + "entityType": { + "const": "channel" + }, + "channelType": { + "type": "string", + "enum": [ + "streaming", + "overTheAir" + ] + }, + "entityId": { + "type": "string", + "description": "ID of the channel, in the target App's scope." + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "required": [ + "entityType", + "channelType", + "entityId" + ], + "additionalProperties": false + }, + "ProgramEntity": { + "title": "ProgramEntity", + "oneOf": [ + { + "$ref": "#/definitions/MovieEntity" + }, + { + "$ref": "#/definitions/TVEpisodeEntity" + }, + { + "$ref": "#/definitions/TVSeasonEntity" + }, + { + "$ref": "#/definitions/TVSeriesEntity" + }, + { + "$ref": "#/definitions/AdditionalEntity" + } + ] + }, + "MusicEntity": { + "title": "MusicEntity", + "type": "object", + "properties": { + "entityType": { + "const": "music" + }, + "musicType": { + "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/MusicType" + }, + "entityId": { + "type": "string" + } + }, + "required": [ + "entityType", + "musicType", + "entityId" + ] + }, + "MovieEntity": { + "title": "MovieEntity", + "description": "A Firebolt compliant representation of a Movie entity.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "const": "movie" + }, + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "movie", + "entityId": "el-camino" + } + ] + }, + "TVEpisodeEntity": { + "title": "TVEpisodeEntity", + "description": "A Firebolt compliant representation of a TV Episode entity.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId", + "seriesId", + "seasonId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "const": "episode" + }, + "entityId": { + "type": "string" + }, + "seriesId": { + "type": "string" + }, + "seasonId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "episode", + "entityId": "breaking-bad-pilot", + "seriesId": "breaking-bad", + "seasonId": "breaking-bad-season-1" + } + ] + }, + "TVSeasonEntity": { + "title": "TVSeasonEntity", + "description": "A Firebolt compliant representation of a TV Season entity.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId", + "seriesId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "const": "season" + }, + "entityId": { + "type": "string" + }, + "seriesId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "season", + "entityId": "breaking-bad-season-1", + "seriesId": "breaking-bad" + } + ] + }, + "TVSeriesEntity": { + "title": "TVSeriesEntity", + "description": "A Firebolt compliant representation of a TV Series entity.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "const": "series" + }, + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "series", + "entityId": "breaking-bad" + } + ] + }, + "PlaylistEntity": { + "title": "PlaylistEntity", + "description": "A Firebolt compliant representation of a Playlist entity.", + "type": "object", + "required": [ + "entityType", + "entityId" + ], + "properties": { + "entityType": { + "const": "playlist" + }, + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "playlist", + "entityId": "playlist/xyz" + } + ] + }, + "PlayableEntity": { + "title": "PlayableEntity", + "anyOf": [ + { + "$ref": "#/definitions/MovieEntity" + }, + { + "$ref": "#/definitions/TVEpisodeEntity" + }, + { + "$ref": "#/definitions/PlaylistEntity" + }, + { + "$ref": "#/definitions/MusicEntity" + }, + { + "$ref": "#/definitions/AdditionalEntity" + } + ] + }, + "AdditionalEntity": { + "title": "AdditionalEntity", + "description": "A Firebolt compliant representation of the remaining program entity types.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "type": "string", + "enum": [ + "concert", + "sportingEvent", + "preview", + "other", + "advertisement", + "musicVideo", + "minisode", + "extra" + ] + }, + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "concert", + "entityId": "live-aid" + } + ] + }, + "UntypedEntity": { + "title": "UntypedEntity", + "allOf": [ + { + "description": "A Firebolt compliant representation of the remaining entity types.", + "type": "object", + "required": [ + "entityId" + ], + "properties": { + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false + } + ], + "examples": [ + { + "entityId": "an-entity" + } + ] + }, + "Metadata": { + "title": "Metadata", + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "Title of the entity." + }, + "synopsis": { + "type": "string", + "description": "Short description of the entity." + }, + "seasonNumber": { + "type": "number", + "description": "For TV seasons, the season number. For TV episodes, the season that the episode belongs to." + }, + "seasonCount": { + "type": "number", + "description": "For TV series, seasons, and episodes, the total number of seasons." + }, + "episodeNumber": { + "type": "number", + "description": "For TV episodes, the episode number." + }, + "episodeCount": { + "type": "number", + "description": "For TV seasons and episodes, the total number of episodes in the current season." + }, + "releaseDate": { + "type": "string", + "format": "date-time", + "description": "The date that the program or entity was released or first aired." + }, + "contentRatings": { + "type": "array", + "items": { + "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/ContentRating" + }, + "description": "A list of ContentRating objects, describing the entity's ratings in various rating schemes." + } + } + } + } +} \ No newline at end of file diff --git a/src/schemas/intents.json b/src/schemas/intents.json index 041018322..aa2a44d0f 100644 --- a/src/schemas/intents.json +++ b/src/schemas/intents.json @@ -370,29 +370,7 @@ "const": "entity" }, "data": { - "anyOf": [ - { - "$ref": "#/definitions/MovieEntity" - }, - { - "$ref": "#/definitions/TVEpisodeEntity" - }, - { - "$ref": "#/definitions/TVSeriesEntity" - }, - { - "$ref": "#/definitions/TVSeasonEntity" - }, - { - "$ref": "#/definitions/MusicEntity" - }, - { - "$ref": "#/definitions/AdditionalEntity" - }, - { - "$ref": "#/definitions/UntypedEntity" - } - ] + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/Entity" } } } @@ -411,398 +389,6 @@ } ] }, - "ChannelEntity": { - "title": "ChannelEntity", - "type": "object", - "properties": { - "entityType": { - "const": "channel" - }, - "channelType": { - "type": "string", - "enum": [ - "streaming", - "overTheAir" - ] - }, - "entityId": { - "type": "string", - "description": "ID of the channel, in the target App's scope." - }, - "appContentData": { - "type": "string", - "maxLength": 256 - } - }, - "required": [ - "entityType", - "channelType", - "entityId" - ], - "additionalProperties": false - }, - "ProgramEntity": { - "title": "ProgramEntity", - "type": "object", - "properties": { - "entityType": { - "const": "program" - }, - "programType": { - "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/ProgramType" - }, - "entityId": { - "type": "string" - } - }, - "required": [ - "entityType", - "programType", - "entityId" - ] - }, - "MusicEntity": { - "title": "MusicEntity", - "type": "object", - "properties": { - "entityType": { - "const": "music" - }, - "musicType": { - "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/MusicType" - }, - "entityId": { - "type": "string" - } - }, - "required": [ - "entityType", - "musicType", - "entityId" - ] - }, - "MovieEntity": { - "title": "MovieEntity", - "allOf": [ - { - "$ref": "#/definitions/ProgramEntity" - }, - { - "description": "A Firebolt compliant representation of a Movie entity.", - "title": "MovieEntity", - "type": "object", - "required": [ - "entityType", - "programType", - "entityId" - ], - "properties": { - "entityType": { - "const": "program" - }, - "programType": { - "const": "movie" - }, - "entityId": { - "$ref": "#/definitions/Identifier" - }, - "assetId": { - "$ref": "#/definitions/Identifier" - }, - "appContentData": { - "type": "string", - "maxLength": 256 - } - }, - "additionalProperties": false - } - ], - "examples": [ - { - "entityType": "program", - "programType": "movie", - "entityId": "el-camino" - } - ] - }, - "TVEpisodeEntity": { - "title": "TVEpisodeEntity", - "allOf": [ - { - "$ref": "#/definitions/ProgramEntity" - }, - { - "description": "A Firebolt compliant representation of a TV Episode entity.", - "title": "TVEpisodeEntity", - "type": "object", - "required": [ - "entityType", - "programType", - "entityId", - "seriesId", - "seasonId" - ], - "properties": { - "entityType": { - "const": "program" - }, - "programType": { - "const": "episode" - }, - "entityId": { - "$ref": "#/definitions/Identifier" - }, - "seriesId": { - "$ref": "#/definitions/Identifier" - }, - "seasonId": { - "$ref": "#/definitions/Identifier" - }, - "assetId": { - "$ref": "#/definitions/Identifier" - }, - "appContentData": { - "type": "string", - "maxLength": 256 - } - }, - "additionalProperties": false - } - ], - "examples": [ - { - "entityType": "program", - "programType": "episode", - "entityId": "breaking-bad-pilot", - "seriesId": "breaking-bad", - "seasonId": "breaking-bad-season-1" - } - ] - }, - "TVSeasonEntity": { - "title": "TVSeasonEntity", - "description": "A Firebolt compliant representation of a TV Season entity.", - "allOf": [ - { - "$ref": "#/definitions/ProgramEntity" - }, - { - "type": "object", - "required": [ - "entityType", - "programType", - "entityId", - "seriesId" - ], - "properties": { - "entityType": { - "const": "program" - }, - "programType": { - "const": "season" - }, - "entityId": { - "$ref": "#/definitions/Identifier" - }, - "seriesId": { - "$ref": "#/definitions/Identifier" - }, - "assetId": { - "$ref": "#/definitions/Identifier" - }, - "appContentData": { - "type": "string", - "maxLength": 256 - } - }, - "additionalProperties": false - } - ], - "examples": [ - { - "entityType": "program", - "programType": "season", - "entityId": "breaking-bad-season-1", - "seriesId": "breaking-bad" - } - ] - }, - "TVSeriesEntity": { - "title": "TVSeriesEntity", - "allOf": [ - { - "$ref": "#/definitions/ProgramEntity" - }, - { - "description": "A Firebolt compliant representation of a TV Series entity.", - "type": "object", - "required": [ - "entityType", - "programType", - "entityId" - ], - "properties": { - "entityType": { - "const": "program" - }, - "programType": { - "const": "series" - }, - "entityId": { - "$ref": "#/definitions/Identifier" - }, - "assetId": { - "$ref": "#/definitions/Identifier" - }, - "appContentData": { - "type": "string", - "maxLength": 256 - } - }, - "additionalProperties": false - } - ], - "examples": [ - { - "entityType": "program", - "programType": "series", - "entityId": "breaking-bad" - } - ] - }, - "PlaylistEntity": { - "title": "PlaylistEntity", - "description": "A Firebolt compliant representation of a Playlist entity.", - "type": "object", - "required": [ - "entityType", - "entityId" - ], - "properties": { - "entityType": { - "const": "playlist" - }, - "entityId": { - "$ref": "#/definitions/Identifier" - }, - "assetId": { - "$ref": "#/definitions/Identifier" - }, - "appContentData": { - "type": "string", - "maxLength": 256 - } - }, - "additionalProperties": false, - "examples": [ - { - "entityType": "playlist", - "entityId": "playlist/xyz" - } - ] - }, - "PlayableEntity": { - "title": "PlayableEntity", - "anyOf": [ - { - "$ref": "#/definitions/MovieEntity" - }, - { - "$ref": "#/definitions/TVEpisodeEntity" - }, - { - "$ref": "#/definitions/PlaylistEntity" - }, - { - "$ref": "#/definitions/MusicEntity" - }, - { - "$ref": "#/definitions/AdditionalEntity" - } - ] - }, - "AdditionalEntity": { - "title": "AdditionalEntity", - "allOf": [ - { - "$ref": "#/definitions/ProgramEntity" - }, - { - "description": "A Firebolt compliant representation of the remaining entity types.", - "type": "object", - "required": [ - "entityType", - "entityId" - ], - "properties": { - "entityType": { - "const": "program" - }, - "programType": { - "type": "string", - "enum": [ - "concert", - "sportingEvent", - "preview", - "other", - "advertisement", - "musicVideo", - "minisode", - "extra" - ] - }, - "entityId": { - "$ref": "#/definitions/Identifier" - }, - "assetId": { - "$ref": "#/definitions/Identifier" - }, - "appContentData": { - "type": "string", - "maxLength": 256 - } - }, - "additionalProperties": false - } - ], - "examples": [ - { - "entityType": "program", - "programType": "concert", - "entityId": "live-aid" - } - ] - }, - "UntypedEntity": { - "title": "UntypedEntity", - "allOf": [ - { - "description": "A Firebolt compliant representation of the remaining entity types.", - "type": "object", - "required": [ - "entityId" - ], - "properties": { - "entityId": { - "$ref": "#/definitions/Identifier" - }, - "assetId": { - "$ref": "#/definitions/Identifier" - }, - "appContentData": { - "type": "string", - "maxLength": 256 - } - }, - "additionalProperties": false - } - ], - "examples": [ - { - "entityId": "an-entity" - } - ] - }, "TuneIntent": { "description": "A Firebolt compliant representation of a user intention to 'tune' to a traditional over-the-air broadcast, or an OTT Stream from an OTT or vMVPD App.", "title": "TuneIntent", @@ -830,7 +416,7 @@ "additionalProperties": false, "properties": { "entity": { - "$ref": "#/definitions/ChannelEntity" + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/ChannelEntity" }, "options": { "description": "The options property of the data property MUST have only one of the following fields.", @@ -899,7 +485,7 @@ "const": "playback" }, "data": { - "$ref": "#/definitions/PlayableEntity" + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/PlayableEntity" } } } @@ -1029,7 +615,7 @@ "type": "object", "properties": { "entity": { - "$ref": "#/definitions/PlayableEntity" + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/PlayableEntity" }, "options": { "type": "object", @@ -1269,7 +855,7 @@ "menus": { "type": "array", "items": { - "$ref": "#/definitions/Identifier" + "type": "string" }, "minItems": 1, "maxItems": 100 @@ -1280,7 +866,7 @@ "type": "object", "properties": { "appId": { - "$ref": "#/definitions/Identifier" + "type": "string" }, "exclude": { "type": "boolean" @@ -1366,19 +952,19 @@ "entity": { "anyOf": [ { - "$ref": "#/definitions/MovieEntity" + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/MovieEntity" }, { - "$ref": "#/definitions/TVEpisodeEntity" + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/TVEpisodeEntity" }, { - "$ref": "#/definitions/TVSeriesEntity" + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/TVSeriesEntity" }, { - "$ref": "#/definitions/TVSeasonEntity" + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/TVSeasonEntity" }, { - "$ref": "#/definitions/AdditionalEntity" + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/AdditionalEntity" } ] }, @@ -1388,24 +974,24 @@ "type": "object", "properties": { "appId": { - "$ref": "#/definitions/Identifier" + "type": "string" }, "entity": { "anyOf": [ { - "$ref": "#/definitions/MovieEntity" + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/MovieEntity" }, { - "$ref": "#/definitions/TVEpisodeEntity" + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/TVEpisodeEntity" }, { - "$ref": "#/definitions/TVSeriesEntity" + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/TVSeriesEntity" }, { - "$ref": "#/definitions/TVSeasonEntity" + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/TVSeasonEntity" }, { - "$ref": "#/definitions/AdditionalEntity" + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/AdditionalEntity" } ] } @@ -1416,7 +1002,7 @@ "menus": { "type": "array", "items": { - "$ref": "#/definitions/Identifier" + "type": "string" }, "minItems": 1, "maxItems": 100 @@ -1427,7 +1013,7 @@ "type": "object", "properties": { "appId": { - "$ref": "#/definitions/Identifier" + "type": "string" }, "exclude": { "type": "boolean" @@ -2226,7 +1812,7 @@ "type": "string" }, "appId": { - "$ref": "#/definitions/Identifier" + "type": "string" } } }, diff --git a/src/schemas/lifecycle.json b/src/schemas/lifecycle.json new file mode 100644 index 000000000..906cf41ea --- /dev/null +++ b/src/schemas/lifecycle.json @@ -0,0 +1,38 @@ +{ + "$id": "https://meta.comcast.com/firebolt/lifecycle", + "title": "Lifecycle", + "oneOf": [ + { + "$ref": "#/definitions/LifecycleState" + }, + { + "$ref": "#/definitions/CloseReason" + } + ], + "definitions": { + "LifecycleState": { + "title": "LifecycleState", + "description": "The application lifecycle state", + "type": "string", + "enum": [ + "initializing", + "inactive", + "foreground", + "background", + "unloading", + "suspended" + ] + }, + "CloseReason": { + "title": "CloseReason", + "description": "The application close reason", + "type": "string", + "enum": [ + "remoteButton", + "userExit", + "done", + "error" + ] + } + } +} diff --git a/src/schemas/types.json b/src/schemas/types.json new file mode 100644 index 000000000..0caa49c1f --- /dev/null +++ b/src/schemas/types.json @@ -0,0 +1,194 @@ +{ + "$id": "https://meta.comcast.com/firebolt/types", + "title": "Types", + "definitions": { + "SemanticVersion": { + "title": "SemanticVersion", + "type": "object", + "properties": { + "major": { + "type": "integer", + "minimum": 0 + }, + "minor": { + "type": "integer", + "minimum": 0 + }, + "patch": { + "type": "integer", + "minimum": 0 + }, + "readable": { + "type": "string" + } + }, + "required": [ + "major", + "minor", + "patch", + "readable" + ], + "additionalProperties": false + }, + "AudioProfile": { + "title": "AudioProfile", + "type": "string", + "enum": [ + "stereo", + "dolbyDigital5.1", + "dolbyDigital7.1", + "dolbyDigital5.1+", + "dolbyDigital7.1+", + "dolbyAtmos" + ] + }, + "BooleanMap": { + "title": "BooleanMap", + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "FlatMap": { + "type": "object", + "additionalProperties": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + } + }, + "LocalizedString": { + "title": "LocalizedString", + "description": "Localized string supports either a simple `string` or a Map of language codes to strings. When using a simple `string`, the current preferred langauge from `Localization.langauge()` is assumed.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + ], + "examples": [ + "A simple string, with no language code", + { + "en": "This is english", + "es": "esto es español" + } + ] + }, + "ListenResponse": { + "title": "ListenResponse", + "type": "object", + "required": [ + "event", + "listening" + ], + "properties": { + "event": { + "type": "string", + "pattern": "[a-zA-Z]+\\.on[A-Z][a-zA-Z]+" + }, + "listening": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "ProviderRequest": { + "title": "ProviderRequest", + "type": "object", + "required": [ + "correlationId" + ], + "additionalProperties": false, + "properties": { + "correlationId": { + "type": "string", + "description": "The id that was passed in to the event that triggered a provider method to be called" + }, + "parameters": { + "description": "The result of the provider response.", + "type": ["object", "null"] + } + } + }, + "ProviderResponse": { + "title": "ProviderResponse", + "type": "object", + "required": [ + "correlationId" + ], + "additionalProperties": false, + "properties": { + "correlationId": { + "type": "string", + "description": "The id that was passed in to the event that triggered a provider method to be called" + }, + "result": { + "description": "The result of the provider response." + } + } + }, + "Timeout": { + "title": "Timeout", + "description": "Defines the timeout in seconds. If the threshold for timeout is passed for any operation without a result it will throw an error.", + "type": "integer", + "default": 0, + "minimum": 0, + "maximum": 9999 + }, + "Dimensions": { + "type": "object", + "properties": { + "width": { + "type": "integer", + "minimum": 1 + }, + "height": { + "type": "integer", + "minimum": 1 + } + }, + "required": [ "width", "height" ] + }, + "Image": { + "type": "object", + "properties": { + "uri": { + "description": "URI for the image. May be a relative path (e.g. ./foo/image.png) or absolute (e.g. https://foo.com/bar.png) depending on usage.", + "type": "string" + }, + "aspectRatio": { + "description": "The aspect ratio of the image", + "type": "string", + "pattern": "^\\d+x\\d+" + }, + "description": { + "description": "Description of the image.", + "type": "string" + }, + "type": { + "description": "The type of the image.", + "type": "string", + "enum": [ + "icon", "poster", "banner", "splash", "hero" + ] + } + }, + "required": [ + "uri", "aspectRatio", "type" + ] + } + } +} \ No newline at end of file diff --git a/src/sdks/manage/test/suite/keyboard.test.ts b/src/sdks/manage/test/suite/keyboard.test.ts index c40b7d40e..6ee3a5aed 100644 --- a/src/sdks/manage/test/suite/keyboard.test.ts +++ b/src/sdks/manage/test/suite/keyboard.test.ts @@ -82,19 +82,19 @@ class DelegatingKBProvider implements Keyboard.KeyboardInputProvider { standard( parameters: Keyboard.KeyboardParameters, session: Keyboard.FocusableProviderSession - ): Promise { + ): Promise { return this.delegate.standard(parameters, session) } password( parameters: Keyboard.KeyboardParameters, session: Keyboard.FocusableProviderSession - ): Promise { + ): Promise { return this.delegate.password(parameters, session) } email( parameters: Keyboard.KeyboardParameters, session: Keyboard.FocusableProviderSession - ): Promise { + ): Promise { return this.delegate.email(parameters, session) } } @@ -103,21 +103,19 @@ class KBProvider implements Keyboard.KeyboardInputProvider { standard( parameters: Keyboard.KeyboardParameters, session: Keyboard.FocusableProviderSession - ): Promise { - return Promise.resolve({ - text: 'foo' - }); + ): Promise { + return Promise.resolve('foo'); } password( parameters: Keyboard.KeyboardParameters, session: Keyboard.FocusableProviderSession - ): Promise { + ): Promise { return Promise.resolve(null); } email( parameters: Keyboard.KeyboardParameters, session: Keyboard.FocusableProviderSession - ): Promise { + ): Promise { return Promise.resolve(null); } } @@ -126,19 +124,19 @@ class KBProviderWithError implements Keyboard.KeyboardInputProvider { async standard( parameters: Keyboard.KeyboardParameters, session: Keyboard.FocusableProviderSession - ): Promise { + ): Promise { throw new Error('failed') } async password( parameters: Keyboard.KeyboardParameters, session: Keyboard.FocusableProviderSession - ): Promise { + ): Promise { throw new Error('failed') } async email( parameters: Keyboard.KeyboardParameters, session: Keyboard.FocusableProviderSession - ): Promise { + ): Promise { throw new Error('failed') } } @@ -156,7 +154,7 @@ test("Keyboard.provide() declarations", async () => { let result = await promise console.log(result) expect(result.method).toStrictEqual('keyboard.standardResponse') - expect(result.params.result.text).toStrictEqual('foo') + expect(result.params.result).toStrictEqual('foo') }); test("Keyboard.provide() with blank object", () => { From b5a5cc12005173329dc1b411607c011738fede22 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Thu, 7 Mar 2024 12:59:51 -0500 Subject: [PATCH 22/54] fix: swap generation order --- src/openrpc/content.json | 343 +++++++++++++++++++++++++++++++++++++ src/openrpc/discovery.json | 284 ------------------------------ 2 files changed, 343 insertions(+), 284 deletions(-) create mode 100644 src/openrpc/content.json diff --git a/src/openrpc/content.json b/src/openrpc/content.json new file mode 100644 index 000000000..3683860f1 --- /dev/null +++ b/src/openrpc/content.json @@ -0,0 +1,343 @@ +{ + "openrpc": "1.2.4", + "info": { + "title": "Content", + "version": "0.0.0", + "description": "" + }, + "methods": [ + { + "name": "requestDetails", + "tags": [ + { + "name": "push-pull", + "x-subscriber-type": "global" + }, + { + "name": "capabilities", + "x-provided-by": "Discovery.onRequestDetails", + "x-uses": [ + "xrn:firebolt:capability:discovery:entity-info" + ] + } + ], + "summary": "Provide information about a program entity and its available watchable assets, such as entitlement status and price, via either a push or pull call flow.", + "description": "Provide information about a program entity and its available watchable assets, such as entitlement status and price, via either a push or pull call flow. Includes information about the program entity and its relevant associated entities, such as extras, previews, and, in the case of TV series, seasons and episodes.\n\nSee the `EntityInfo` and `WayToWatch` data structures below for more information.\n\nThe app only needs to implement Pull support for `entityInfo` at this time.", + "params": [ + { + "name": "entityId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "result": { + "name": "details", + "schema": { + "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/DetailsResult" + }, + "summary": "The entityInfo data." + }, + "examples": [ + { + "name": "Send entity info for a movie to the platform.", + "params": [ + { + "name": "entityId", + "value": "345" + } + ], + "result": { + "name": "details", + "value": { + "expires": "2025-01-01T00:00:00.000Z", + "details": { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + }, + "waysToWatch": [ + { + "identifiers": { + "assetId": "123" + }, + "expires": "2025-01-01T00:00:00.000Z", + "entitled": true, + "entitledExpires": "2025-01-01T00:00:00.000Z", + "offeringType": "buy", + "price": 2.99, + "videoQuality": [ + "UHD" + ], + "audioProfile": [ + "dolbyAtmos" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ], + "subtitles": [ + "es" + ], + "audioDescriptions": [ + "en" + ] + } + ] + } + } + } + }, + { + "name": "Send entity info for a movie with a trailer to the platform.", + "params": [ + { + "name": "entityId", + "value": "345" + } + ], + "result": { + "name": "details", + "value": { + "expires": "2025-01-01T00:00:00.000Z", + "details": { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + }, + "waysToWatch": [ + { + "identifiers": { + "assetId": "123" + }, + "expires": "2025-01-01T00:00:00.000Z", + "entitled": true, + "entitledExpires": "2025-01-01T00:00:00.000Z", + "offeringType": "buy", + "price": 2.99, + "videoQuality": [ + "UHD" + ], + "audioProfile": [ + "dolbyAtmos" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ], + "subtitles": [ + "es" + ], + "audioDescriptions": [ + "en" + ] + } + ] + } + } + } + } + ] + }, + { + "name": "requestPurchases", + "tags": [ + { + "name": "push-pull" + }, + { + "name": "capabilities", + "x-provided-by": "Discovery.onRequestPurchases", + "x-uses": [ + "xrn:firebolt:capability:discovery:purchased-content" + ] + } + ], + "summary": "Provide a list of purchased content for the authenticated account, such as rentals and electronic sell through purchases.", + "params": [], + "result": { + "name": "purchases", + "required": true, + "schema": { + "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/DetailsArrayResult" + }, + "summary": "The data for the purchasedContent" + }, + "examples": [ + { + "name": "Inform the platform of the user's purchased content", + "params": [], + "result": { + "name": "purchases", + "value": { + "totalCount": 10, + "expires": "2025-01-01T00:00:00.000Z", + "entries": [ + { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + }, + "waysToWatch": [ + { + "identifiers": { + "assetId": "123" + }, + "expires": "2025-01-01T00:00:00.000Z", + "entitled": true, + "entitledExpires": "2025-01-01T00:00:00.000Z", + "offeringType": "buy", + "price": 2.99, + "videoQuality": [ + "UHD" + ], + "audioProfile": [ + "dolbyAtmos" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ], + "subtitles": [ + "es" + ], + "audioDescriptions": [ + "en" + ] + } + ] + } + ] + } + } + } + ], + "description": "Return content purchased by the user, such as rentals and electronic sell through purchases.\n\nThe app should return the user's 100 most recent purchases in `entries`. The total count of purchases must be provided in `count`. If `count` is greater than the total number of `entries`, the UI may provide a link into the app to see the complete purchase list.\n\nThe `EntityInfo` object returned is not required to have `waysToWatch` populated, but it is recommended that it do so in case the UI wants to surface additional information on the purchases screen.\n\nThe app should implement both Push and Pull methods for `purchasedContent`.\n\nThe app should actively push `purchasedContent` when:\n\n* The app becomes Active.\n* When the state of the purchasedContent set has changed.\n* The app goes into Inactive or Background state, if there is a chance a change event has been missed." + }, + { + "name": "requestUserInterest", + "tags": [ + { + "name": "push-pull" + }, + { + "name": "capabilities", + "x-provided-by": "Discovery.onRequestUserInterest", + "x-uses": [ + "xrn:firebolt:capability:discovery:entity-info" + ] + } + ], + "summary": "Provide information about a program entity and its available watchable assets, such as entitlement status and price, via either a push or pull call flow.", + "description": "Provide information about a program entity and its available watchable assets, such as entitlement status and price, via either a push or pull call flow. Includes information about the program entity and its relevant associated entities, such as extras, previews, and, in the case of TV series, seasons and episodes.\n\nSee the `EntityInfo` and `WayToWatch` data structures below for more information.\n\nThe app only needs to implement Pull support for `entityInfo` at this time.", + "params": [ + { + "name": "type", + "required": true, + "schema": { + "type": "string" + } + } + ], + "result": { + "name": "entity", + "required": true, + "schema": { + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/EntityDetails" + }, + "summary": "The EntityDetails data." + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "type", + "value": "interest" + } + ], + "result": { + "name": "entity", + "value": { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + } + } + } + } + ] + } + ] +} \ No newline at end of file diff --git a/src/openrpc/discovery.json b/src/openrpc/discovery.json index 79ef7830e..06ad4b12d 100644 --- a/src/openrpc/discovery.json +++ b/src/openrpc/discovery.json @@ -419,188 +419,6 @@ } ] }, - { - "name": "details", - "tags": [ - { - "name": "push-pull", - "x-subscriber-type": "global" - }, - { - "name": "capabilities", - "x-provides": "xrn:firebolt:capability:discovery:entity-info" - } - ], - "summary": "Provide information about a program entity and its available watchable assets, such as entitlement status and price, via either a push or pull call flow.", - "description": "Provide information about a program entity and its available watchable assets, such as entitlement status and price, via either a push or pull call flow. Includes information about the program entity and its relevant associated entities, such as extras, previews, and, in the case of TV series, seasons and episodes.\n\nSee the `EntityInfo` and `WayToWatch` data structures below for more information.\n\nThe app only needs to implement Pull support for `entityInfo` at this time.", - "params": [ - { - "name": "entityId", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "result", - "required": true, - "schema": { - "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/DetailsResult" - }, - "summary": "The entityInfo data." - } - ], - "result": { - "name": "result", - "schema": { - "type": "null" - } - }, - "examples": [ - { - "name": "Send entity info for a movie to the platform.", - "params": [ - { - "name": "entityId", - "value": "345" - }, - { - "name": "result", - "value": { - "expires": "2025-01-01T00:00:00.000Z", - "details": { - "identifiers": { - "entityId": "345", - "entityType": "program", - "programType": "movie" - }, - "info": { - "title": "Cool Runnings", - "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", - "releaseDate": "1993-01-01T00:00:00.000Z", - "contentRatings": [ - { - "scheme": "US-Movie", - "rating": "PG" - }, - { - "scheme": "CA-Movie", - "rating": "G" - } - ] - }, - "waysToWatch": [ - { - "identifiers": { - "assetId": "123" - }, - "expires": "2025-01-01T00:00:00.000Z", - "entitled": true, - "entitledExpires": "2025-01-01T00:00:00.000Z", - "offeringType": "buy", - "price": 2.99, - "videoQuality": [ - "UHD" - ], - "audioProfile": [ - "dolbyAtmos" - ], - "audioLanguages": [ - "en" - ], - "closedCaptions": [ - "en" - ], - "subtitles": [ - "es" - ], - "audioDescriptions": [ - "en" - ] - } - ] - } - } - } - ], - "result": { - "name": "result", - "value": null - } - }, - { - "name": "Send entity info for a movie with a trailer to the platform.", - "params": [ - { - "name": "entityId", - "value": "345" - }, - { - "name": "result", - "value": { - "expires": "2025-01-01T00:00:00.000Z", - "details": { - "identifiers": { - "entityId": "345", - "entityType": "program", - "programType": "movie" - }, - "info": { - "title": "Cool Runnings", - "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", - "releaseDate": "1993-01-01T00:00:00.000Z", - "contentRatings": [ - { - "scheme": "US-Movie", - "rating": "PG" - }, - { - "scheme": "CA-Movie", - "rating": "G" - } - ] - }, - "waysToWatch": [ - { - "identifiers": { - "assetId": "123" - }, - "expires": "2025-01-01T00:00:00.000Z", - "entitled": true, - "entitledExpires": "2025-01-01T00:00:00.000Z", - "offeringType": "buy", - "price": 2.99, - "videoQuality": [ - "UHD" - ], - "audioProfile": [ - "dolbyAtmos" - ], - "audioLanguages": [ - "en" - ], - "closedCaptions": [ - "en" - ], - "subtitles": [ - "es" - ], - "audioDescriptions": [ - "en" - ] - } - ] - } - } - } - ], - "result": { - "name": "result", - "value": null - } - } - ] - }, { "name": "purchasedContent", "tags": [ @@ -720,108 +538,6 @@ ], "description": "Return content purchased by the user, such as rentals and electronic sell through purchases.\n\nThe app should return the user's 100 most recent purchases in `entries`. The total count of purchases must be provided in `count`. If `count` is greater than the total number of `entries`, the UI may provide a link into the app to see the complete purchase list.\n\nThe `EntityInfo` object returned is not required to have `waysToWatch` populated, but it is recommended that it do so in case the UI wants to surface additional information on the purchases screen.\n\nThe app should implement both Push and Pull methods for `purchasedContent`.\n\nThe app should actively push `purchasedContent` when:\n\n* The app becomes Active.\n* When the state of the purchasedContent set has changed.\n* The app goes into Inactive or Background state, if there is a chance a change event has been missed." }, - { - "name": "purchases", - "tags": [ - { - "name": "push-pull" - }, - { - "name": "capabilities", - "x-provides": "xrn:firebolt:capability:discovery:purchased-content" - } - ], - "summary": "Provide a list of purchased content for the authenticated account, such as rentals and electronic sell through purchases.", - "params": [ - { - "name": "result", - "required": true, - "schema": { - "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/DetailsArrayResult" - }, - "summary": "The data for the purchasedContent" - } - ], - "result": { - "name": "result", - "schema": { - "type": "null" - } - }, - "examples": [ - { - "name": "Inform the platform of the user's purchased content", - "params": [ - { - "name": "result", - "value": { - "totalCount": 10, - "expires": "2025-01-01T00:00:00.000Z", - "entries": [ - { - "identifiers": { - "entityId": "345", - "entityType": "program", - "programType": "movie" - }, - "info": { - "title": "Cool Runnings", - "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", - "releaseDate": "1993-01-01T00:00:00.000Z", - "contentRatings": [ - { - "scheme": "US-Movie", - "rating": "PG" - }, - { - "scheme": "CA-Movie", - "rating": "G" - } - ] - }, - "waysToWatch": [ - { - "identifiers": { - "assetId": "123" - }, - "expires": "2025-01-01T00:00:00.000Z", - "entitled": true, - "entitledExpires": "2025-01-01T00:00:00.000Z", - "offeringType": "buy", - "price": 2.99, - "videoQuality": [ - "UHD" - ], - "audioProfile": [ - "dolbyAtmos" - ], - "audioLanguages": [ - "en" - ], - "closedCaptions": [ - "en" - ], - "subtitles": [ - "es" - ], - "audioDescriptions": [ - "en" - ] - } - ] - } - ] - } - } - ], - "result": { - "name": "result", - "value": null - } - } - ], - "description": "Return content purchased by the user, such as rentals and electronic sell through purchases.\n\nThe app should return the user's 100 most recent purchases in `entries`. The total count of purchases must be provided in `count`. If `count` is greater than the total number of `entries`, the UI may provide a link into the app to see the complete purchase list.\n\nThe `EntityInfo` object returned is not required to have `waysToWatch` populated, but it is recommended that it do so in case the UI wants to surface additional information on the purchases screen.\n\nThe app should implement both Push and Pull methods for `purchasedContent`.\n\nThe app should actively push `purchasedContent` when:\n\n* The app becomes Active.\n* When the state of the purchasedContent set has changed.\n* The app goes into Inactive or Background state, if there is a chance a change event has been missed." - }, { "name": "watched", "summary": "Notify the platform that content was partially or completely watched", From 3109d17b6914eaac8eae11bffd8b755efa475aa3 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Mon, 11 Mar 2024 13:31:25 -0400 Subject: [PATCH 23/54] fix: update capabilty and added test --- src/openrpc/content.json | 2 +- src/sdks/core/sdk.config.json | 3 ++- src/sdks/core/test/suite/discovery.test.ts | 14 ++++++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/openrpc/content.json b/src/openrpc/content.json index 3683860f1..46d9326c4 100644 --- a/src/openrpc/content.json +++ b/src/openrpc/content.json @@ -279,7 +279,7 @@ "name": "capabilities", "x-provided-by": "Discovery.onRequestUserInterest", "x-uses": [ - "xrn:firebolt:capability:discovery:entity-info" + "xrn:firebolt:capability:discovery:user-interest" ] } ], diff --git a/src/sdks/core/sdk.config.json b/src/sdks/core/sdk.config.json index f406f8bea..551cebfeb 100644 --- a/src/sdks/core/sdk.config.json +++ b/src/sdks/core/sdk.config.json @@ -69,7 +69,8 @@ ], "provide": [ "xrn:firebolt:capability:discovery:entity-info", - "xrn:firebolt:capability:discovery:purchased-content" + "xrn:firebolt:capability:discovery:purchased-content", + "xrn:firebolt:capability:discovery:user-interest" ] }, { diff --git a/src/sdks/core/test/suite/discovery.test.ts b/src/sdks/core/test/suite/discovery.test.ts index 638c57432..dae97660b 100644 --- a/src/sdks/core/test/suite/discovery.test.ts +++ b/src/sdks/core/test/suite/discovery.test.ts @@ -150,3 +150,17 @@ test("clear()", () => { const result: boolean = Discovery.clear(-1000); expect(result).toBeFalsy(); }); + +test("details() provider", () => { + class myDetailsProvider implements Discovery.DetailsProvider { + details(parameters?: object, session?: Discovery.ProviderSession): Promise { + return null + } + } + + class myUserInterestProvider implements Discovery.UserInterestProvider { + userInterest(parameters?: object, session?: Discovery.ProviderSession): Promise { + return null + } + } +}) \ No newline at end of file From 73a1e7c1aa653343b7d806454f3d3d997a0b9ad5 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Mon, 18 Mar 2024 14:07:16 -0400 Subject: [PATCH 24/54] fix: Use new app provider pattern --- package-lock.json | 1 + src/openrpc/content.json | 13 +- src/openrpc/discovery.json | 160 ------------------ src/schemas/discovery.json | 19 ++- src/schemas/intents.json | 61 +------ src/sdks/discovery/package.json | 2 +- src/sdks/discovery/sdk.config.json | 2 +- src/sdks/discovery/test/suite/content.test.ts | 5 +- 8 files changed, 37 insertions(+), 226 deletions(-) diff --git a/package-lock.json b/package-lock.json index 25fb654ff..bf4b03029 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16748,6 +16748,7 @@ } }, "src/sdks/discovery": { + "name": "@firebolt-js/discovery-sdk", "version": "1.0.0", "license": "Apache-2.0", "devDependencies": { diff --git a/src/openrpc/content.json b/src/openrpc/content.json index cb18b426f..65297ed58 100644 --- a/src/openrpc/content.json +++ b/src/openrpc/content.json @@ -290,7 +290,14 @@ "name": "type", "required": true, "schema": { - "type": "string" + "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/InterestType" + } + }, + { + "name": "reason", + "required": true, + "schema": { + "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/InterestReason" } } ], @@ -309,6 +316,10 @@ { "name": "type", "value": "interest" + }, + { + "name": "reason", + "value": "playlist" } ], "result": { diff --git a/src/openrpc/discovery.json b/src/openrpc/discovery.json index 60f2e62d7..06ad4b12d 100644 --- a/src/openrpc/discovery.json +++ b/src/openrpc/discovery.json @@ -1475,136 +1475,6 @@ } } ] - }, - { - "name": "userInterest", - "summary": "Notify the platform that content was marked as interesting to the user.", - "tags": [ - { - "name": "capabilities", - "x-provides": "xrn:firebolt:capability:discovery:interest" - } - ], - "params": [ - { - "name": "type", - "required": true, - "schema": { - "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/UserInterestType" - }, - "summary": "The entity Id of the watched content." - }, - { - "name": "entity", - "schema": { - "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/EntityInfo" - } - } - ], - "result": { - "name": "default", - "schema": { - "type": "null" - } - }, - "examples": [ - { - "name": "Notify the platform of interest.", - "params": [ - { - "name": "type", - "value": "interest" - }, - { - "name": "entity", - "value": { - "identifiers": { - "entityId": "xyz" - }, - "entityType": "program", - "programType": "movie", - "title": "Interesting Movie Title" - } - } - ], - "result": { - "name": "default", - "value": null - } - }, - { - "name": "Notify the platform of disinterest.", - "params": [ - { - "name": "type", - "value": "disinterest" - }, - { - "name": "entity", - "value": { - "identifiers": { - "entityId": "xyz" - }, - "entityType": "program", - "programType": "movie", - "title": "Uninteresting Movie Title" - } - } - ], - "result": { - "name": "default", - "value": null - } - } - ] - }, - { - "name": "onRequestUserInterest", - "summary": "Invoked when the platform is requesting metadata for content that the user finds interesting.", - "tags": [ - { - "name": "event", - "x-response": { - "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/EntityInfo", - "examples": [ - { - "identifiers": { - "entityId": "xyz" - }, - "entityType": "program", - "programType": "movie", - "title": "Interesting Movie Title" - } - ] - } - }, - { - "name": "capabilities", - "x-provides": "xrn:firebolt:capability:discovery:interest" - } - ], - "params": [], - "result": { - "name": "request", - "schema": { - "$ref": "#/components/schemas/UserInterestProviderRequest" - } - }, - "examples": [ - { - "name": "Platform requests the currently displayed content.", - "params": [], - "result": { - "name": "request", - "value": { - "correlationId": "1", - "parameters": { - "type": "interest" - } - } - } - } - ] } ], "components": { @@ -1923,36 +1793,6 @@ "enum": [ "xrn:firebolt:channel:any" ] - }, - "UserInterestProviderRequest": { - "title": "UserInterestProviderRequest", - "type": "object", - "required": [ - "correlationId", - "parameters" - ], - "properties": { - "correlationId": { - "type": "string", - "description": "An id to correlate the provider response with this request" - }, - "parameters": { - "description": "The request to initiate a user interest session", - "$ref": "#/components/schemas/UserInterestParameters" - } - } - }, - "UserInterestParameters": { - "title": "UserInterestParameters", - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/UserInterestType" - } - } } } } diff --git a/src/schemas/discovery.json b/src/schemas/discovery.json index 46f7f53c1..b00d954a5 100644 --- a/src/schemas/discovery.json +++ b/src/schemas/discovery.json @@ -101,6 +101,23 @@ } } } - } + }, + "InterestType": { + "title": "InterestType", + "type": "string", + "enum": [ + "interest", + "disinterest" + ] + }, + "InterestReason": { + "title": "InterestReason", + "type": "string", + "enum": [ + "playlist", + "reaction", + "recording" + ] + } } } diff --git a/src/schemas/intents.json b/src/schemas/intents.json index af1827b7e..3ce3d1ca8 100644 --- a/src/schemas/intents.json +++ b/src/schemas/intents.json @@ -104,9 +104,6 @@ }, { "$ref": "#/definitions/DialogIntent" - }, - { - "$ref": "#/definitions/InterestedInIntent" } ] }, @@ -1791,63 +1788,7 @@ } ] }, - "InterestedInIntent": { - "description": "A Firebolt compliant representation of a user's interest in a piece of content.", - "title": "InterestedInIntent", - "allOf": [ - { - "title": "InterestedInIntent", - "$ref": "#/definitions/Intent" - }, - { - "title": "InterestedInIntent", - "$ref": "#/definitions/IntentProperties" - }, - { - "title": "InterestedInIntent", - "type": "object", - "properties": { - "action": { - "const": "interestedIn" - }, - "data": { - "type": "object", - "properties": { - "appId": { - "type": "string" - }, - "type": { - "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/UserInterestType" - }, - "entity": { - "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/EntityInfo" - } - } - } - } - } - ], - "examples": [ - { - "action": "interestedIn", - "data": { - "appId": "coolapp", - "type": "interest", - "entity": { - "identifiers": { - "entityId": "xyz" - }, - "entityType": "program", - "programType": "movie", - "title": "Interesting Movie Title" - } - }, - "context": { - "source": "voice" - } - } - ] - }, + "Identifier": { "type": "string" }, diff --git a/src/sdks/discovery/package.json b/src/sdks/discovery/package.json index d03293645..1b1b4e80c 100644 --- a/src/sdks/discovery/package.json +++ b/src/sdks/discovery/package.json @@ -1,6 +1,6 @@ { "name": "@firebolt-js/discovery-sdk", - "version": "1.0.0", + "version": "1.1.0", "description": "The Firebolt Discovery JS SDK", "main": "./dist/lib/firebolt-discovery.mjs", "types": "./dist/lib/firebolt-discovery.d.ts", diff --git a/src/sdks/discovery/sdk.config.json b/src/sdks/discovery/sdk.config.json index bacdd0b6c..a610c6442 100644 --- a/src/sdks/discovery/sdk.config.json +++ b/src/sdks/discovery/sdk.config.json @@ -9,7 +9,7 @@ "xrn:firebolt:capability:discovery:providers", "xrn:firebolt:capability:discovery:purchased-content", "xrn:firebolt:capability:discovery:entity-info", - "xrn:firebolt:capability:discovery:interest" + "xrn:firebolt:capability:discovery:user-interest" ] } ] diff --git a/src/sdks/discovery/test/suite/content.test.ts b/src/sdks/discovery/test/suite/content.test.ts index cbfa6f2d6..5acdf0e41 100644 --- a/src/sdks/discovery/test/suite/content.test.ts +++ b/src/sdks/discovery/test/suite/content.test.ts @@ -21,8 +21,9 @@ import { Content } from "../../build/javascript/src/firebolt-discovery"; test("Content.requestUserInterest()", () => { const expTime: number = new Date().getTime() + 100; - return Content.requestUserInterest(Content.InterestType.INTEREST).then((entity:Content.EntityInfo) => { + Content.requestDetails + return Content.requestUserInterest(Content.InterestType.INTEREST, Content.InterestReason.PLAYLIST).then((entity:Content.EntityDetails) => { expect(entity).toBeDefined() - expect(entity.title).toBe("Interesting Movie Title") + expect(entity.info.title).toBe("Cool Runnings") }) }); From 3983f136bfd812a3db6565c4d397ee4782fbcf45 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Tue, 19 Mar 2024 13:07:10 -0400 Subject: [PATCH 25/54] fix: Reworking doc to be less abstract --- .../specifications/intents/user-interest.md | 139 ++++++----- .../app-passthrough-apis.md | 229 ++++++++++++------ 2 files changed, 240 insertions(+), 128 deletions(-) diff --git a/requirements/specifications/intents/user-interest.md b/requirements/specifications/intents/user-interest.md index bc5e5c65b..ae0c0c1c1 100644 --- a/requirements/specifications/intents/user-interest.md +++ b/requirements/specifications/intents/user-interest.md @@ -1,4 +1,4 @@ -# User Interest Intents +# User Interest Document Status: Candidate Specification @@ -51,22 +51,24 @@ track of which apps are using them separately. ## 2. Table of Contents - [1. Overview](#1-overview) - [2. Table of Contents](#2-table-of-contents) -- [3. User Interest from an in-app UX](#3-user-interest-from-an-in-app-ux) -- [4. User Interest from a platform UX](#4-user-interest-from-a-platform-ux) - - [4.1. Upstream User Interest Intent](#41-upstream-user-interest-intent) -- [5. User Interest Bulk Updates](#5-user-interest-bulk-updates) -- [6. Core SDK APIs](#6-core-sdk-apis) - - [6.1. InterestType](#61-interesttype) - - [6.2. Discovery.userInterest](#62-discoveryuserinterest) - - [6.3. Discovery Interest Provider](#63-discovery-interest-provider) - - [6.4. InterestIntent](#64-interestintent) -- [7. Discovery SDK APIs](#7-discovery-sdk-apis) - - [7.1. Content.requestUserInterest](#71-contentrequestuserinterest) - - [7.2. Content.onUserInterestedIn](#72-contentonuserinterestedin) - - [7.3. InterestedInIntent](#73-interestedinintent) - - -## 3. User Interest from an in-app UX +- [3. User Interest Flows](#3-user-interest-flows) + - [3.1. User Interest from an in-app UX](#31-user-interest-from-an-in-app-ux) + - [3.2. User Interest from a platform UX](#32-user-interest-from-a-platform-ux) + - [3.3. Upstream User Interest Intent](#33-upstream-user-interest-intent) + - [3.4. User Interest Bulk Updates](#34-user-interest-bulk-updates) +- [4. Core SDK APIs](#4-core-sdk-apis) + - [4.1. InterestType](#41-interesttype) + - [4.2. InterestReason](#42-interestreason) + - [4.3. Discovery.userInterest](#43-discoveryuserinterest) + - [4.4. Discovery Interest Provider](#44-discovery-interest-provider) + - [4.5. InterestIntent](#45-interestintent) +- [5. Discovery SDK APIs](#5-discovery-sdk-apis) + - [5.1. Content.requestUserInterest](#51-contentrequestuserinterest) + - [5.2. Content.onUserInterestedIn](#52-contentonuserinterestedin) + + +## 3. User Interest Flows +### 3.1. User Interest from an in-app UX Some Apps will have a built-in user interface for users to express interest in content from the App. This could be a "Favorite" button, @@ -82,33 +84,43 @@ meta-data, the device\'s Aggregated Experience will be notified of the user's interest in that entity: ```typescript -Discovery.userInterest(type:UserInterestType, entity:EntityInfo) +Discovery.userInterest(type:InterestType, reason: InterestReason, entity:EntityInfo) ``` -The type parameter denotes what sort of interest: +The `type` parameter denotes the directionality of the interest: - `interest` -- `disinterest` +- `disinterest` + +The `reason` parameter denotes why or how the user has expressed interest: + +| Reason | Description | +| ------ | ----------- | +| `playlist` | Interested in adding to a list | +| `reaction` | Interested in submitting a reaction, e.g. like or dislike | +| `recording` | Interest in scheduling a recording | +| `share` | Interest in sharing the content on social media | + +**NOTE**: We can remove some of these (not `playlist`) these are here for now to illustrate the purpose for the reason paramater. An app **MUST** `provide` the `xrn:firebolt:capability:discovery:interest` capability in order to call `Discovery.userInterest`. When this method is called with a valid `EntityInfo`, the platform -**MUST** dispatch a `Content.onUserInterestedIn` notification to all Apps +**MUST** dispatch a `Content.onUserInterest` notification to all Apps that have registered for it (typically Aggregated Experience Apps) with information about the app, interest type, and the entity. -The `Content.onUserInterestedIn` event has the `InterestedInIntent` as its -data. +The `Content.onUserInterest` event has a `UserInterestInfo` object with the `type`, `reason` and `entity` parameters as it's properties. -An Aggregated Experience can register for the `Content.onUserInterestedIn` +An Aggregated Experience can register for the `Content.onUserInterest` notification, and it will receive notifications when an `EntityInfo` is returned from the active App after a `Discovery.userInterest` call is fulfilled. An app **MUST** have permissions to `use` the `xrn:firebolt:capability:discovery:interest` capability in order to -listen to the `Content.onUserInterestedIn` notification. +listen to the `Content.onUserInterest` notification. If the result is `null` or is not a valid entity, i.e. does not match the [EntityInfo](../entities/) schema, then no `Content.onUserInterestedIn` @@ -123,7 +135,7 @@ The `Discovery.userInterest` method **SHOULD NOT** be called unless the user is activating a UI element in the app, or in a second screen experience that is communicating with the app, that implies interest of some kind. -## 4. User Interest from a platform UX +### 3.2. User Interest from a platform UX Firebolt platforms may provide a platform UX, e.g. voice or and RCU, to express user interest in content from an active App. To facilitate this @@ -165,31 +177,53 @@ exception. If the foreground App returns a valid `EntityInfo` before the timeout, then, the returned value **MUST** be used. -### 4.1. Upstream User Interest Intent +If there is no app registered the an error **MUST** be returned. + +### 3.3. Upstream User Interest Intent In some cases, e.g. a voice assistant, some upstream component will inform the platform that the user is interested in whatever is currently being presented. -To do this, the upstream system **MUST** send a `UserInterest` intent, which describes the type of interest. +To do this, the upstream system **MUST** send a `Interest` intent, which describes the type of and reason for the interest. + +```json +{ + "action": "interest", + "data": { + "type": "interest", + "reason": "playlist" + } +} +``` When a Firebolt platform receives this intent, it **SHOULD** initiate the platform's [user interest flow](#4-user-interest-from-a-platform-ux). -## 5. User Interest Bulk Updates +### 3.4. User Interest Bulk Updates Sending bulk interest updates, e.g. Entities the user expressed interest in on a different platform, is not supported. -## 6. Core SDK APIs +## 4. Core SDK APIs The following APIs are exposed by the Firebolt Core SDK as part of the `Discovery` module. -### 6.1. InterestType +### 4.1. InterestType This is an enum with the following values: - `"interest"` - `"disinterest"` -### 6.2. Discovery.userInterest +### 4.2. InterestReason +This is an enum with the following values: + +| Reason | Description | +| ------ | ----------- | +| `playlist` | Interested in adding to a list | +| `reaction` | Interested in submitting a reaction, e.g. like or dislike | +| `recording` | Interest in scheduling a recording | +| `share` | Interest in sharing the content on social media | + +### 4.3. Discovery.userInterest This is a push API that allows Apps to push entities that the user has expressed interest in to the platform. @@ -198,23 +232,23 @@ To push an entity that the user is interested in pass an `EntityInfo` object to the method: ```typescript -Discovery.userInterest(type: InterestType, entity: EntityInfo): Promise +Discovery.userInterest(type: InterestType, reason: InterestReason, entity: EntityInfo): Promise ``` -### 6.3. Discovery Interest Provider +### 4.4. Discovery Interest Provider To respond to requests for the current entity, because the user has expressed interest in some way that the platform manages, register a provider: ```typescript interface IDiscoveryInterestProvider { - function userInterest(type: InterestType): Promise + function userInterest(type: InterestType, reason: InterestReason): Promise } Discovery.provide("xrn:firbolt:capability:discovery:interest", IDiscoveryInterestProvider) ``` -### 6.4. InterestIntent +### 4.5. InterestIntent An `InterestIntent` denotes that the user has expressed interest in the currently displayed and/or selected content: @@ -223,7 +257,8 @@ currently displayed and/or selected content: type InterestIntent { action: "interest" data: { - type: "interest" + type: "interest" | "disinterest", + reason: "playlist" | "reaction" | "recording" }, context: { source: "rcu" | "voice" @@ -231,42 +266,26 @@ type InterestIntent { } ``` -## 7. Discovery SDK APIs +## 5. Discovery SDK APIs The following APIs are exposed by the Firebolt Discovery SDK as part of the `Content` module. -### 7.1. Content.requestUserInterest +### 5.1. Content.requestUserInterest This method triggers the corresponding Discovery provider API for the foreground app. ```typescript -Content.requestUserInterest(type: InterestType): Promise +Content.requestUserInterest(type: InterestType, reason: InterestReason): Promise ``` -### 7.2. Content.onUserInterestedIn +### 5.2. Content.onUserInterestedIn This notification allows Aggregated Experience Apps to be informed when a user expresses interest in some Content, and the content resolves to a valid Entity from some App. -`Content.listen('userInterestedIn', InterestedInIntent => void): Promise` - -The callback will be passed an `InterestedEventData` object with -information about the entity that the user expressed interest in. - -### 7.3. InterestedInIntent +`Content.listen('userInterest', UserInterestInfo => void): Promise` -`InterestedInIntent` provides information about what the user has -expressed interest in: - -```typescript -type InterestedInIntent { - action: "interestedIn", - data: { - appId: string, - type: InterestType, - entity: EntityInfo - } -} -``` +The callback will be passed an `UserInterestInfo` object with +the type, reason, and information about the entity that the user expressed interest in. diff --git a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md index dc9d91d33..7e66951db 100644 --- a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md +++ b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md @@ -8,9 +8,12 @@ See [Firebolt Requirements Governance](../../governance.md) for more info. |-----------------|----------------| | Jeremy LaCivita | Comcast | | Kevin Pearson | Comcast | +| Yuri Pasquali | Sky | ## 1. Overview -This document describes the App Pass-through Firebolt OpenRPC extension. +This document describes how one Firebolt App can provide a capability that may be used by another Firebolt App leveraging the platform as a permission broker that passes the requests and respones to each app with out feature-specific logic. + +This document covers the App Pass-through Firebolt OpenRPC extension as well as how Firebolt implementations should detect and execute app provided pass-through APIs. Some APIs require an app to fulfill the request on behalf of another app, e.g. to provide a UX or cross-app data sharing. Generally the calling app doesn't care or have a say in which other app provides the API, that is up to the Firebolt distributor. @@ -23,113 +26,203 @@ The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL ## 2. Table of Contents - [1. Overview](#1-overview) - [2. Table of Contents](#2-table-of-contents) -- [3. Provided By Extension](#3-provided-by-extension) -- [4. Selecting the best provider app](#4-selecting-the-best-provider-app) -- [5. Calculating the result](#5-calculating-the-result) - - [5.1. Selecting multiple provider apps](#51-selecting-multiple-provider-apps) - - [5.2. Composite Results](#52-composite-results) - - [5.3. Inserting the appId](#53-inserting-the-appid) -- [6. API Gateway](#6-api-gateway) -- [7. Example: User Interest](#7-example-user-interest) -- [8. Example: Keyboard](#8-example-keyboard) - -## 3. Provided By Extension -Firebolt OpenRPC **MUST** support a `string` `x-provided-by` extension property on the `capabilities` tag that denotes a method is provided by some app on the device registering for the specified provider API, e.g. `Module.onRequestMethod`. +- [3. Open RPC Extensions](#3-open-rpc-extensions) + - [3.1. Provided By Extension](#31-provided-by-extension) + - [3.2. Multiple Providers Extension](#32-multiple-providers-extension) +- [4. Routing App pass-through APIs](#4-routing-app-pass-through-apis) +- [5. Direct pass-through results](#5-direct-pass-through-results) +- [6. Aggregated pass-through results](#6-aggregated-pass-through-results) +- [7. Pass-through notifications](#7-pass-through-notifications) +- [8. Provider Candidates](#8-provider-candidates) +- [9. Best Candidate](#9-best-candidate) +- [10. Session Transformations](#10-session-transformations) +- [11. Provider Parameter Injection](#11-provider-parameter-injection) +- [12. API Gateway](#12-api-gateway) +- [13. Example: User Interest](#13-example-user-interest) +- [14. Example: Keyboard](#14-example-keyboard) + +## 3. Open RPC Extensions + +### 3.1. Provided By Extension +Firebolt OpenRPC **MUST** support a `string` `x-provided-by` extension property on the `capabilities` tag that denotes a method is provided by some app on the device registering for the specified provider API, e.g.: + +```json +{ + "methods": [ + { + "name": "Keyboard.standard", + "tags": [ + { + "name": "capabilities", + "x-provided-by": "Keyboard.onRequestStandard", + "x-uses": [ + "xrn:firebolt:capability:input:keyboard" + ] + } + ] + } + ] +} +``` The method denoted by `x-provided-by` is referred to as the "provider" or "provider method" for the remainder of this document. -The method with the `x-provided-by` extension is referred to as the "app provided method" for the remainder of this document. +The method with the `x-provided-by` extension is referred to as the "platform method" for the remainder of this document. -The `x-provided-by` extension **MUST NOT** be used on a method with any value in the `x-provides` extension. +To prevent unresolvable chaining of methods the `x-provided-by` extension **MUST NOT** be used on a method with any value in the `x-provides` extension. -An app provided method **MUST** `use` a single capability or `manage` a single capability, but not both. +To prevent compound methods an platform method **MUST** `use` a single capability or `manage` a single capability, but not both. -The provider method **MUST** provide the same capability that the app provided method either uses or manages. +The provider method **MUST** provide the same capability that the platform method either uses or manages. -If the app provided method has an `event` tag then the provider method **MUST** have a result schema with `"type"` set to the string `"null"`. +If an platform method has no provider method then it is not a valid Firebolt OpenRPC method schema, and a validation error **MUST** be generated. -If an app provided method has no provider method then it is not a valid Firebolt OpenRPC method schema, and a validation error **MUST** be generated. +### 3.2. Multiple Providers Extension +Firebolt OpenRPC **MUST** support a `string` `x-multiple-providers` extension property on the `capabilities` tag that denotes a single method request may be provided by multiple apps on the device registering for the specified provider API, e.g.: -## 4. Selecting the best provider app +```json +{ + "methods": [ + { + "name": "Content.search", + "tags": [ + { + "name": "capabilities", + "x-provided-by": "Discover.onRequestSearch", + "x-multiple-providers": true, + "x-uses": [ + "xrn:firebolt:capability:discovery:search" + ] + } + ] + } + ] +} +``` -**TODO**: This entire section should be moved into a per-device config for the capability, and not specified in the OpenRPC. +Setting `x-multiple-providers` to `true` means that all available apps that can provide the capability **MUST** be called and their results aggregated into an array for the final result. -A provider method's `capabilites` tag **MAY** have the `x-lifecycle` property which denotes which lifecycle states the providing app is allowed to be in during an app provided transaction. +A platform method with `x-multiple-providers` set to `true` **MUST** have an `array` result type. -If the `x-lifecycle` property is not present then it **MUST** be assumed to be `["foreground", "background", "inactive"]` for the remainder of this section. +## 4. Routing App pass-through APIs +When an app calls a platform method the platform **MUST** return an unavailable error if there is no candidate app to execute the provider method. -The app selected to provide a value **MUST** be in one of the lifecycle states listed in the `x-lifecycle` extension of the provider method. +## 5. Direct pass-through results +A direct pass-through is where a single app provides a single response to a single request by another app. -If the *app provided method's* `capabilities` tag has the `x-multiple-providers` property is set to `true` then all apps matching `x-lifecycle` at the time of the transaction **MUST** be used to provide the value, see [Selecting multiple provider apps](#32-selecting-multiple-provider-apps) for more info. +This section only applies to app provider methods that do not have an `event` tag and do not have the `x-multiple-providers` extension set to `true`. -If the *app provided method's* `capabilities` tag has the `x-multiple-providers` is set to `false` or not set then: +The platform method result schema **MUST** either: -> If more than one app is possible, then the candidate apps **MUST** be pruned by reevaluating the `x-lifecycle` array with the last value removed; This is repeated until there is only one app or only one lifecycle state remaining. -> -> If more than one app is still possible, then the app that was most recently in the `foreground` state **MUST** be selected; In the case of a tie, the platform **MUST** choose only one app using its own discretion. +> Match the `x-response` schema on the provider method so that the result can be passed through. > -> If there is no provider most recently in the `foreground` state then the app that was most recently in the inactive state **MUST** be selected. +> or +> +> Have a property that matches the `x-response` schema on the provider method so that the result can +> be composed and passed through. -If the app provided method does not have an `event` tag and no matching app provides the required capability then the calling app **MUST** receive an error that the capability is unavailable and not a result. +When an app calls a platform method the platform **MUST** return an unavailable error if there is no [candidate app](#7-provider-candidates) to execute the provider method. -If the app provided method has an `event` tag then event registration **MUST** not return an availability error due to a lack of providers, since one may be launched at a future point. +The platform **MUST** call the provider method from the [best candidate](#8-best-candidate) app and acquire the result. -**TODO**: ^^ do we want to scan the catalog and see if it's even possible to have an app that provides it? Seems heavy/overkill and dives into a spec we don't have yet. +If the platform method result schema matches the `x-response` schema on the provider method then the value **MUST** be used as-is. -## 5. Calculating the result -Each app provided method result **MUST** be calculated with the following potential transformations. +Otherwise if the platform method result schema has a property that matches the `x-response` schema on the provider method then the value **MUST** be composed into an object under the corresponding property name and the platform **MUST** apply any [session transformations](#9-session-transformations) to the composed result. -If an app provided method has `x-multiple-providers` set to `true` and the app provided method does not have an `event` tag, then the term "calculated result" refers to each item of the app provided method result array for the remainder of this section. +## 6. Aggregated pass-through results +An aggregated pass-through is where many apps provides responses to a single request by another app. The results are aggregated inside of an array. -Otherwise, the term "calculated result" refers to the app provided method result for the remainder of this section. +This section only applies to app provider methods that do not have an `event` tag and do have the `x-multiple-providers` extension set to `true`. -### 5.1. Selecting multiple provider apps -An app provided method's `capabilites` tag **MAY** have the `x-multiple-providers` property set to `true` which denotes that more than one app may provider this capability at the same time. +The platform method result schema **MUST** have a type of `array`. -If an app provided method has `x-multiple-providers` set to `true` and the app provided method does not have an `event` tag then: +The platform method result schema **MUST** have an `items` sub-schema that either: -> The method **MUST** have a result with the type set to `array`. +> Matches the `x-response` schema on the provider method so that the result can be added to the final array. > -> At least one of the following **MUST** be true: -> -> - The `items` schema of the array **MUST** match the `x-response` schema on the provider method. -> -> - The `items` schema of the array **MUST** have a property whose name is not `"appId"` and schema matches the `x-response` schema. +> or > -> The final result returned by the app provided method **MUST** be a flattened array with all of the values from all selected providers. +> Has a property that matches the `x-response` schema on the provider method so that the result can be composed +> and added to the final array. -If an app provided method has `x-multiple-providers` is set to `true` and the app provided method has an `event` tag then: +When an app calls a platform method the platform **MUST** return an unavailable error if there is no [candidate app](#7-provider-candidates) to execute the provider method. -> - The method result schema **MUST** match the `x-response` schema on the provider method. -> -> - The method result schema **MUST** have a property whose name is not `"appId"` and schema matches the `x-response` schema. -> -> The app provided method **MUST** dispatch each "calculated result" as a separate event to all listeners. +The platform **MUST** call the provider method from each [candidate app](#7-provider-candidates) and aggregated all of the results into an array. -### 5.2. Composite Results -An app provided method may be configured to use the provided value as the calculated result, or to compose it into an object along with other values. +If the platform method result `items` schema matches the `x-response` schema on the provider method then each provier value **MUST** be used as-is. -If the app provided method does not have an `event` tag: +Otherwise if the platform method result `items` schema has a property that matches the `x-response` schema on the provider method then each provider value **MUST** be composed into an object under the corresponding property name and the platform **MUST** apply any [session transformations](#9-session-transformations) to the composed result. -> If the calculated result schema matches the provider method result schema then the provider method result value **MUST** be passed through as-is, this is *not* considered a "composite result." -> -> Otherwise, if the calculated result schema is an object with a property whose name and schema matches the provider method result name and schema then the provider method result value **MUST** inserted into an object under the property name; this is refered to as a "composite result" for the rest of this document. +## 7. Pass-through notifications +Firebolt events have a synchronous subscriber registration method, e.g. `Lifecycle.onInactive(true)`, in addition to asynchronous notifications when the event actually happens. For events powered by an app pass-through, only the asynchronous notifications are passed in by the providing app. The initial event registration is handled by the platform, and the success response is not handled by the providing app. + +This section only applies to platform methods that have an `event` tag. + +App provided event registration **MUST** not return an availability error due to a lack of providers, since one may be launched at a future point. -If the app provided method has an `event` tag: +To ensure that event provider methods all behave the same the provider method **MUST** have a result schema with `"type"` set to the string `"null"`, since it will not expect any result from the platform after pushing the notification. -> If the calculated result schema matches the provider method's *last* parameter schema then the value of that parameter **MUST** be passed through as the calculated result value as-is. +The platform method result schema **MUST** either: + +> Match the *last* parameter schema on the provider method so that the result can be passed through. > -> Otherwise, if the calculated result schema is an object with a property whose name and schema matches the provider method's *last* parameter name and schema then the value of that parameter **MUST** inserted into an object under the property name; this is refered to as a "composite result" for the rest of this document. +> Have a property that matches the *last* parameter schema on the provider method so that the result can +> be passed through. + +The platform method event context parameters **MUST** each match the corresponding parameter schema on the provider method so that the result can be passed through. + +When a provider app calls a provider method mapped to an event the platform **MUST** ignore the notification if the app is not a [candidate app](#7-provider-candidates) for this capability. + +If the platform method result schema matches the *last* parameter schema on the provider method then the value **MUST** be used as-is. + +Otherwise if the platform method result schema has a property that matches the *last* parameter schema on the provider method then the value **MUST** be composed into an object under the corresponding property name and the platform **MUST** apply any [session transformations](#9-session-transformations) to the composed result. + +Finally the platform **MUST** dispatch the notification to the app that registered for the event via the original platform method, using all but the last parameter as context. + +## 8. Provider Candidates +The Firebolt Device Manfist **MUST** have a list of `ProviderPolicy` configurations that map capabilities to policies for determining candidate providers: + +```json +{ + "providerPolicies": [ + { + "lifecycle": [ + "foreground" + ], + "allowLaunch": true, + "capabilities": [ + "xrn:firebolt:capability:foo:bar" + ] + } + ] +} +``` + +The policy **MUST** have a list of valid lifecycle states for an app to provide the capability. + +The policy **MUST** have a boolean property `allowLaunch` to denote whether launching provider apps in order to fulfill a platform method is allowed. + +## 9. Best Candidate +If there is only one candidate then it **MUST** be the best candidate. + +If there is more than one candidate, then the app that was most recently in the foreground state **MUST** be the best candidate. + +If none of the candidates have been in the foreground state then the app that was most recently launched **MUST** be the best candidate. + +If none of the candidates have been launched and the `ProviderPolicy` has `allowLaunch` set to true then the platform **SHOULD** select a candidate app, launch it, and use it as the best candidate; how this selection occurs is out of scope for this document. + +## 10. Session Transformations +An platform method may be configured to insert the providing app id into composite values. This is not allowed in non-composite results to avoid collisions with the provder method sending an appId and Firebolt overriding it. -### 5.3. Inserting the appId -An app provided method may be configured to insert the providing app id into composite results. This is not allowed in non-composite results to avoid collisions with the provder method sending an appId and Firebolt overriding it. +If a "composite result" was used to wrap the provider method value and the platform method's schema has an `appId` `string` property at the top level then the property's value **MUST** be set to the the appId of the providing app for that calculated result. -If a "composite result" was used to wrap the provider method value and the app provided method's schema has an `appId` `string` property at the top level then the property's value **MUST** be set to the the appId of the providing app for that calculated result. +## 11. Provider Parameter Injection +If the provider method has a parameter named `appId` and the platform method *does not*, then the appId of the app calling the platform method **MUST** be sent to the provider in the `appId` parameter. -## 6. API Gateway +## 12. API Gateway The Firebolt API Gateway **MUST** detect app-passthrough APIs and map the `use`/`manage` APIs to the corresponding `provide` APIs by parsing the Firebolt OpenRPC Specification and following the logic outline in this document. -## 7. Example: User Interest +## 13. Example: User Interest User Interest does not use the `x-app-method` property because there is only one method and one event in the API, so they can be detected automatically via the capability string. @@ -335,7 +428,7 @@ Content.onUserInterest (push) } ``` -## 8. Example: Keyboard +## 14. Example: Keyboard Keyboard *requires* the* `x-app-method` property because there are three methods in the same capability, so the mapping cannot be detected automatically via the capability string. From d5749f18ed72122f8ed5f5993351a90b5b2f2908 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Fri, 12 Apr 2024 13:16:07 -0400 Subject: [PATCH 26/54] fix: Add reason, clean up app-passthrough --- .../specifications/intents/user-interest.md | 40 +- .../app-passthrough-apis.md | 431 ++++++++---------- 2 files changed, 225 insertions(+), 246 deletions(-) diff --git a/requirements/specifications/intents/user-interest.md b/requirements/specifications/intents/user-interest.md index ae0c0c1c1..10e3c61e0 100644 --- a/requirements/specifications/intents/user-interest.md +++ b/requirements/specifications/intents/user-interest.md @@ -64,7 +64,7 @@ track of which apps are using them separately. - [4.5. InterestIntent](#45-interestintent) - [5. Discovery SDK APIs](#5-discovery-sdk-apis) - [5.1. Content.requestUserInterest](#51-contentrequestuserinterest) - - [5.2. Content.onUserInterestedIn](#52-contentonuserinterestedin) + - [5.2. Content.onUserInterest](#52-contentonuserinterest) ## 3. User Interest Flows @@ -80,11 +80,11 @@ Interest API, in addition to any in-app features that it's already invoking. By calling the `Discovery.userInterest` method with the relevant entity -meta-data, the device\'s Aggregated Experience will be notified of the +meta-data, the device's Aggregated Experience will be notified of the user's interest in that entity: ```typescript -Discovery.userInterest(type:InterestType, reason: InterestReason, entity:EntityInfo) +Discovery.userInterest(type:InterestType, reason: InterestReason, entity:EntityDetails) ``` The `type` parameter denotes the directionality of the interest: @@ -106,15 +106,23 @@ The `reason` parameter denotes why or how the user has expressed interest: An app **MUST** `provide` the `xrn:firebolt:capability:discovery:interest` capability in order to call `Discovery.userInterest`. -When this method is called with a valid `EntityInfo`, the platform +When this method is called with a valid `EntityDetails`, the platform **MUST** dispatch a `Content.onUserInterest` notification to all Apps that have registered for it (typically Aggregated Experience Apps) with information about the app, interest type, and the entity. -The `Content.onUserInterest` event has a `UserInterestInfo` object with the `type`, `reason` and `entity` parameters as it's properties. +The `Content.onUserInterest` event has three context parameters: + +| context | type | description | +|---------|------|-------------| +| appid | string | The id of the app that pushed the user interest. | +| type | `InterestType` | the type of interest. | +| reason | `InterestReason` | the reason for the interest | + +The `Content.onUserInterest` event has a result type of `EntityDetails`. An Aggregated Experience can register for the `Content.onUserInterest` -notification, and it will receive notifications when an `EntityInfo` is +notification, and it will receive notifications when an `EntityDetails` is returned from the active App after a `Discovery.userInterest` call is fulfilled. @@ -123,7 +131,7 @@ An app **MUST** have permissions to `use` the listen to the `Content.onUserInterest` notification. If the result is `null` or is not a valid entity, i.e. does not match -the [EntityInfo](../entities/) schema, then no `Content.onUserInterestedIn` +the [EntityDetails](../entities/) schema, then no `Content.onUserInterestedIn` notification will be dispatched. The `Discovery.userInterest` method **SHOULD NOT** be used in place of more @@ -139,10 +147,10 @@ that is communicating with the app, that implies interest of some kind. Firebolt platforms may provide a platform UX, e.g. voice or and RCU, to express user interest in content from an active App. To facilitate this -Apps will need to be told about the user\'s expressed interest in their +Apps will need to be told about the user's expressed interest in their content. -First, the Aggregated Experience (or some app with the correct +First, the Aggregated Experience (or some app with this capability) detects that the user is interested in something. In this picture the interest is triggered by an RCU button, but how this occurs is outside the scope of this document. When this happens, the Aggregated @@ -153,7 +161,7 @@ by invoking the RPC method `Discovery.onRequestUserInterest`. ![](../../../requirements/images/specifications/intents/user-interest/media/image3.png) Next, the foreground app receives and responds to the request with an -EntityInfo, which is returned as the result to the pending +EntityDetails, which is returned as the result to the pending `Content.requestUserInterest` method: ![](../../../requirements/images/specifications/intents/user-interest/media/image4.png) @@ -174,7 +182,7 @@ App **MUST** return the currently displayed entity meta-data. If there is no valid entity to return, then the method **MUST** throw an exception. -If the foreground App returns a valid `EntityInfo` before the timeout, +If the foreground App returns a valid `EntityDetails` before the timeout, then, the returned value **MUST** be used. If there is no app registered the an error **MUST** be returned. @@ -228,11 +236,11 @@ This is an enum with the following values: This is a push API that allows Apps to push entities that the user has expressed interest in to the platform. -To push an entity that the user is interested in pass an `EntityInfo` +To push an entity that the user is interested in pass an `EntityDetails` object to the method: ```typescript -Discovery.userInterest(type: InterestType, reason: InterestReason, entity: EntityInfo): Promise +Discovery.userInterest(type: InterestType, reason: InterestReason, entity: EntityDetails): Promise ``` ### 4.4. Discovery Interest Provider @@ -242,7 +250,7 @@ provider: ```typescript interface IDiscoveryInterestProvider { - function userInterest(type: InterestType, reason: InterestReason): Promise + function userInterest(type: InterestType, reason: InterestReason): Promise } Discovery.provide("xrn:firbolt:capability:discovery:interest", IDiscoveryInterestProvider) @@ -276,10 +284,10 @@ This method triggers the corresponding Discovery provider API for the foreground app. ```typescript -Content.requestUserInterest(type: InterestType, reason: InterestReason): Promise +Content.requestUserInterest(type: InterestType, reason: InterestReason): Promise ``` -### 5.2. Content.onUserInterestedIn +### 5.2. Content.onUserInterest This notification allows Aggregated Experience Apps to be informed when a user expresses interest in some Content, and the content resolves to a diff --git a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md index 7e66951db..58d39ac24 100644 --- a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md +++ b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md @@ -11,11 +11,11 @@ See [Firebolt Requirements Governance](../../governance.md) for more info. | Yuri Pasquali | Sky | ## 1. Overview -This document describes how one Firebolt App can provide a capability that may be used by another Firebolt App leveraging the platform as a permission broker that passes the requests and respones to each app with out feature-specific logic. +This document describes how one Firebolt App can provide a capability that may be used by another Firebolt App, with the platform as a permission broker that passes the requests and respones to each app with out feature-specific logic. This document covers the App Pass-through Firebolt OpenRPC extension as well as how Firebolt implementations should detect and execute app provided pass-through APIs. -Some APIs require an app to fulfill the request on behalf of another app, e.g. to provide a UX or cross-app data sharing. Generally the calling app doesn't care or have a say in which other app provides the API, that is up to the Firebolt distributor. +Some APIs require an app to fulfill the request on behalf of another app, e.g. to provide a UX or cross-app data sharing. Generally the calling app doesn't care, or have a say in, which other app provides the API, that is up to the Firebolt distributor. To facilitate these APIs, Firebolt denotes an OpenRPC tag with OpenRPC extensions to connect the `provide` API to the `use` API. @@ -30,16 +30,18 @@ The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL - [3.1. Provided By Extension](#31-provided-by-extension) - [3.2. Multiple Providers Extension](#32-multiple-providers-extension) - [4. Routing App pass-through APIs](#4-routing-app-pass-through-apis) -- [5. Direct pass-through results](#5-direct-pass-through-results) -- [6. Aggregated pass-through results](#6-aggregated-pass-through-results) -- [7. Pass-through notifications](#7-pass-through-notifications) -- [8. Provider Candidates](#8-provider-candidates) -- [9. Best Candidate](#9-best-candidate) -- [10. Session Transformations](#10-session-transformations) -- [11. Provider Parameter Injection](#11-provider-parameter-injection) -- [12. API Gateway](#12-api-gateway) -- [13. Example: User Interest](#13-example-user-interest) -- [14. Example: Keyboard](#14-example-keyboard) + - [4.1. No available providers](#41-no-available-providers) + - [4.2. Direct pass-through](#42-direct-pass-through) + - [4.3. Aggregated pass-through results](#43-aggregated-pass-through-results) + - [4.4. Pass-through notifications](#44-pass-through-notifications) +- [5. Provider Candidates](#5-provider-candidates) +- [6. Best Candidate](#6-best-candidate) +- [7. Result Transformations](#7-result-transformations) +- [8. Provider Parameter Injection](#8-provider-parameter-injection) +- [9. API Gateway](#9-api-gateway) +- [10. Example: User Interest](#10-example-user-interest) + - [10.1. User Interest Pull](#101-user-interest-pull) + - [10.2. User Interest Push](#102-user-interest-push) ## 3. Open RPC Extensions @@ -65,13 +67,13 @@ Firebolt OpenRPC **MUST** support a `string` `x-provided-by` extension property } ``` -The method denoted by `x-provided-by` is referred to as the "provider" or "provider method" for the remainder of this document. +The method denoted by `x-provided-by` is referred to as the "*provider*" or "*provider method*" for the remainder of this document. -The method with the `x-provided-by` extension is referred to as the "platform method" for the remainder of this document. +The method with the `x-provided-by` extension is referred to as the "*platform method*" for the remainder of this document. To prevent unresolvable chaining of methods the `x-provided-by` extension **MUST NOT** be used on a method with any value in the `x-provides` extension. -To prevent compound methods an platform method **MUST** `use` a single capability or `manage` a single capability, but not both. +To prevent compound methods a platform method **MUST** `use` a single capability or `manage` a single capability, but not both. The provider method **MUST** provide the same capability that the platform method either uses or manages. @@ -105,9 +107,26 @@ Setting `x-multiple-providers` to `true` means that all available apps that can A platform method with `x-multiple-providers` set to `true` **MUST** have an `array` result type. ## 4. Routing App pass-through APIs -When an app calls a platform method the platform **MUST** return an unavailable error if there is no candidate app to execute the provider method. +App pass-through APIs may be routed in one of several ways. -## 5. Direct pass-through results +When an app calls a platform method, i.e. one with an `x-provided-by` extension, the platform **MUST** use one of the routing methods defined in this section based on various properties of the method. + +### 4.1. No available providers +When an app calls a platform method with an `x-provided-by` extension, the platform **MUST** return an unavailable error if there is no [candidate app](#7-provider-candidates) to execute the provider method. + +```json +{ + "id": 1, + "error": { + "code": -50300, + "message": "Capability is unavailable." + } +} +``` + +**TODO**: formalize our messages and codes. + +### 4.2. Direct pass-through A direct pass-through is where a single app provides a single response to a single request by another app. This section only applies to app provider methods that do not have an `event` tag and do not have the `x-multiple-providers` extension set to `true`. @@ -121,16 +140,14 @@ The platform method result schema **MUST** either: > Have a property that matches the `x-response` schema on the provider method so that the result can > be composed and passed through. -When an app calls a platform method the platform **MUST** return an unavailable error if there is no [candidate app](#7-provider-candidates) to execute the provider method. - The platform **MUST** call the provider method from the [best candidate](#8-best-candidate) app and acquire the result. If the platform method result schema matches the `x-response` schema on the provider method then the value **MUST** be used as-is. -Otherwise if the platform method result schema has a property that matches the `x-response` schema on the provider method then the value **MUST** be composed into an object under the corresponding property name and the platform **MUST** apply any [session transformations](#9-session-transformations) to the composed result. +Otherwise if the platform method result schema has a property that matches the `x-response` schema on the provider method then the value **MUST** be composed into an object under the corresponding property name and the platform **MUST** apply any [result transformations](#9-result-transformations) to the composed result. -## 6. Aggregated pass-through results -An aggregated pass-through is where many apps provides responses to a single request by another app. The results are aggregated inside of an array. +### 4.3. Aggregated pass-through results +An aggregated pass-through is where many apps provide responses to a single request by another app. The results are aggregated inside of an array. This section only applies to app provider methods that do not have an `event` tag and do have the `x-multiple-providers` extension set to `true`. @@ -145,51 +162,123 @@ The platform method result schema **MUST** have an `items` sub-schema that eithe > Has a property that matches the `x-response` schema on the provider method so that the result can be composed > and added to the final array. -When an app calls a platform method the platform **MUST** return an unavailable error if there is no [candidate app](#7-provider-candidates) to execute the provider method. - The platform **MUST** call the provider method from each [candidate app](#7-provider-candidates) and aggregated all of the results into an array. If the platform method result `items` schema matches the `x-response` schema on the provider method then each provier value **MUST** be used as-is. -Otherwise if the platform method result `items` schema has a property that matches the `x-response` schema on the provider method then each provider value **MUST** be composed into an object under the corresponding property name and the platform **MUST** apply any [session transformations](#9-session-transformations) to the composed result. +Otherwise if the platform method result `items` schema has a property that matches the `x-response` schema on the provider method then each provider value **MUST** be composed into an object under the corresponding property name and the platform **MUST** apply any [result transformations](#9-result-transformations) to the composed result. -## 7. Pass-through notifications +### 4.4. Pass-through notifications Firebolt events have a synchronous subscriber registration method, e.g. `Lifecycle.onInactive(true)`, in addition to asynchronous notifications when the event actually happens. For events powered by an app pass-through, only the asynchronous notifications are passed in by the providing app. The initial event registration is handled by the platform, and the success response is not handled by the providing app. This section only applies to platform methods that have an `event` tag. App provided event registration **MUST** not return an availability error due to a lack of providers, since one may be launched at a future point. -To ensure that event provider methods all behave the same the provider method **MUST** have a result schema with `"type"` set to the string `"null"`, since it will not expect any result from the platform after pushing the notification. +**TODO**: do we want to search the catalog and return unavailable if none are possible? Seems overkill. + +To ensure that event provider methods all behave the same the provider method **MUST** have a `result` schema with `"type"` set to `"null"`, since it will not expect any data in the response from the platform after pushing the notification. The platform method result schema **MUST** either: > Match the *last* parameter schema on the provider method so that the result can be passed through. > -> Have a property that matches the *last* parameter schema on the provider method so that the result can -> be passed through. +> Have a property that matches the *last* parameter schema on the provider method so that the result can be passed through. + +**TODO**: Find event context params spec and move into this branch -The platform method event context parameters **MUST** each match the corresponding parameter schema on the provider method so that the result can be passed through. +Example platform method with context: +```json +{ + "name": "onFoo", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capabilities:example:foo" + ], + "x-provided-by": "foo" + }, + { + "name": "event" + } + ], + "params": [ + { + "name": "context1", + "schema":{ + "type": "string" + } + }, + { + "name": "context2", + "schema": { + "type": "number" + } + } + ], + "result": { + "name": "value", + "schema": { + "type": "boolean" + } + } +} +``` + +Matching provider method: + +```json +{ + "name": "foo", + "tags": [ + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capabilities:example:foo" + }, + { + "name": "event" + } + ], + "params": [ + { + "name": "context1", + "schema":{ + "type": "string" + } + }, + { + "name": "context2", + "schema": { + "type": "number" + } + }, + { + "name": "value", + "schema": { + "type": "boolean" + } + } + ] +} +``` When a provider app calls a provider method mapped to an event the platform **MUST** ignore the notification if the app is not a [candidate app](#7-provider-candidates) for this capability. If the platform method result schema matches the *last* parameter schema on the provider method then the value **MUST** be used as-is. -Otherwise if the platform method result schema has a property that matches the *last* parameter schema on the provider method then the value **MUST** be composed into an object under the corresponding property name and the platform **MUST** apply any [session transformations](#9-session-transformations) to the composed result. +Otherwise if the platform method result schema has a property that matches the *last* parameter schema on the provider method then the value **MUST** be composed into an object under the corresponding property name and the platform **MUST** apply any [result transformations](#9-result-transformations) to the composed result. Finally the platform **MUST** dispatch the notification to the app that registered for the event via the original platform method, using all but the last parameter as context. -## 8. Provider Candidates +## 5. Provider Candidates The Firebolt Device Manfist **MUST** have a list of `ProviderPolicy` configurations that map capabilities to policies for determining candidate providers: ```json { "providerPolicies": [ { - "lifecycle": [ - "foreground" - ], - "allowLaunch": true, + "inFocus": true, "capabilities": [ "xrn:firebolt:capability:foo:bar" ] @@ -197,36 +286,39 @@ The Firebolt Device Manfist **MUST** have a list of `ProviderPolicy` configurati ] } ``` +The policy **MUST** have a list of capabilities that it is applied to. -The policy **MUST** have a list of valid lifecycle states for an app to provide the capability. +A capability **MUST NOT** be included in more than one policy. -The policy **MUST** have a boolean property `allowLaunch` to denote whether launching provider apps in order to fulfill a platform method is allowed. +The policy **MAY** have an `inFocus` boolean. -## 9. Best Candidate -If there is only one candidate then it **MUST** be the best candidate. +If the policy has `inFocus` set to `true` then any app without RCU input focus when the capability is invoked **MUST NOT** be considered a candidate. -If there is more than one candidate, then the app that was most recently in the foreground state **MUST** be the best candidate. +## 6. Best Candidate +If there is only one candidate then it **MUST** be the best candidate. -If none of the candidates have been in the foreground state then the app that was most recently launched **MUST** be the best candidate. +If there is more than one candidate, then the candidate app that most recently had RCU input focus **MUST** be the best candidate. -If none of the candidates have been launched and the `ProviderPolicy` has `allowLaunch` set to true then the platform **SHOULD** select a candidate app, launch it, and use it as the best candidate; how this selection occurs is out of scope for this document. +If none of the candidates have had focus yet, then the candidate app that was most recently launched **MUST** be the best candidate. -## 10. Session Transformations -An platform method may be configured to insert the providing app id into composite values. This is not allowed in non-composite results to avoid collisions with the provder method sending an appId and Firebolt overriding it. +## 7. Result Transformations +A platform method may be configured to insert the providing app id into composite values. This is not allowed in non-composite results to avoid collisions with the provder method sending an appId and Firebolt overriding it. -If a "composite result" was used to wrap the provider method value and the platform method's schema has an `appId` `string` property at the top level then the property's value **MUST** be set to the the appId of the providing app for that calculated result. +If a "composite result" was used to wrap the provider method value and the platform method's schema has an `appId` `string` property at the top level then the property's value **MUST** be set to the the appId of the providing app for that result. -## 11. Provider Parameter Injection +## 8. Provider Parameter Injection If the provider method has a parameter named `appId` and the platform method *does not*, then the appId of the app calling the platform method **MUST** be sent to the provider in the `appId` parameter. -## 12. API Gateway -The Firebolt API Gateway **MUST** detect app-passthrough APIs and map the `use`/`manage` APIs to the corresponding `provide` APIs by parsing the Firebolt OpenRPC Specification and following the logic outline in this document. +If the platform method is an `event` and the provider method has context parameters then each context parameter from the provider that has a matching context parameter in the event **MUST** have it's value passed to that parameter. -## 13. Example: User Interest +If the platform method is an `event` with a "composite result" and the provider method has context parameters then each context parameter from the provider that has a matching property on the `result` object **MUST** have it's value copied into that property. -User Interest does not use the `x-app-method` property because there is only one method and one event in the API, so they can be detected automatically via the capability string. +## 9. API Gateway +The Firebolt API Gateway **MUST** detect app-passthrough APIs and map the `use`/`manage` APIs to the corresponding `provide` APIs by parsing the Firebolt OpenRPC Specification and following the logic outline in this document. -Schemas +## 10. Example: User Interest + +The following schemas are referenced by these examples: ```json { @@ -239,6 +331,12 @@ Schemas "disinterest" ] }, + "InterestReason": { + "type": "string", + "enum": [ + "playlist" + ] + }, "EntityDetailsFromApp": { "type": "object", "properties": { @@ -259,7 +357,9 @@ Schemas } ``` -Content.requestUserInterest (pull, use) +### 10.1. User Interest Pull + +Platform method: ```json { @@ -282,12 +382,19 @@ Content.requestUserInterest (pull, use) "schema": { "$ref": "#/components/schemas/InterestType" } + }, + { + "name": "reason", + "required": true, + "schema": { + "$ref": "#/components/schemas/InterestReason" + } } ], "result": { - "name": "interestedIn", + "name": "interest", "schema": { - "$ref": "#/components/schemas/EntityFromApp", + "$ref": "#/components/schemas/EntityDetailsFromApp", } } } @@ -295,7 +402,7 @@ Content.requestUserInterest (pull, use) } ``` -Discovery.onRequestUserInterest (1.0, pull, provide) +Provider method: ```json { @@ -305,13 +412,12 @@ Discovery.onRequestUserInterest (1.0, pull, provide) "tags": [ { "name": "capabilities", - "x-provides": "xrn:firebolt:capability:discovery:interest", - "x-lifecycle": ["foreground", "background"], + "x-provides": "xrn:firebolt:capability:discovery:interest" }, { "name": "event", "x-response": { - "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/Entity" + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/EntityDetails" } } ], @@ -322,6 +428,9 @@ Discovery.onRequestUserInterest (1.0, pull, provide) "properties": { "type": { "$ref": "#/components/schemas/InterestType", + }, + "reason": { + "$ref": "#/components/schemas/InterestReason", } } } @@ -331,7 +440,9 @@ Discovery.onRequestUserInterest (1.0, pull, provide) } ``` -Discovery.userInterest (2.0, pull, provide) +### 10.2. User Interest Push + +Provider method: ```json { @@ -341,7 +452,6 @@ Discovery.userInterest (2.0, pull, provide) "tags": [ { "name": "capabilities", - "x-lifecycle": ["foreground", "background"], "x-provides": "xrn:firebolt:capability:discovery:interest" } ], @@ -351,54 +461,32 @@ Discovery.userInterest (2.0, pull, provide) "schema": { "$ref": "#/components/schemas/InterestType", } - } - ], - "result": { - "name": "entity", - "schema": { - "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/Entity" - } - } - } - ] -} -``` - - -Discovery.userInterest (push) - -```json -{ - "methods": [ - { - "name": "userInterest", - "tags": [ - { - "name": "capabilities", - "x-provides": "xrn:firebolt:capability:discovery:interest", - "x-lifecycle": ["foreground", "background"], - } - ], - "params": [ + }, { - "name": "type", + "name": "reason", "schema": { - "$ref": "#/components/schemas/InterestType", + "$ref": "#/components/schemas/InterestReason", } }, { "name": "entity", "schema": { - "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/Entity" + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/EntityDetails" } } - ] + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + } } ] } ``` -Content.onUserInterest (push) +Platform Method: ```json { @@ -417,145 +505,28 @@ Content.onUserInterest (push) "name": "event" } ], + "params": [], "result": { - "name": "info", + "name": "interest", "schema": { - "$ref": "#/components/schemas/InterestedInfo", - } - } - } - ] -} -``` - -## 14. Example: Keyboard - -Keyboard *requires* the* `x-app-method` property because there are three methods in the same capability, so the mapping cannot be detected automatically via the capability string. - -Schemas - -```json -{ - "components": { - "schemas": { - - } - } -} -``` - -Keyboard.standard (use) - -```json -{ - "methods": [ - { - "name": "Keyboard.standard", - "tags": [ - { - "name": "capabilities", - "x-app-provided": true, - "x-app-method": "Keyboard.onRequestStandard", - "x-uses": [ - "xrn:firebolt:capability:input:keyboard" - ] - } - ], - "summary": "Show the standard platform keyboard, and return the submitted value", - "params": [ - { - "name": "message", - "summary": "The message to display while prompting", - "required": true, - "schema": { - "type": "string" - } - } - ], - "result": { - "name": "value", - "summary": "the selected or entered text", - "schema": { - "type": "string" - } - } - } - ] -} -``` - -Keyboard.onRequestStandard (1.0, provide) - -```json -{ - "methods": [ - { - "name": "Keyboard.onRequestStandard", - "params": [ - ], - "tags": [ - { - "name": "event", - "x-response": { - "$ref": "#/components/schemas/KeyboardResult", - "examples": [ - { - "text": "username" - } - ] - } - }, - { - "name": "capabilities", - "x-provides": "xrn:firebolt:capability:input:keyboard", - "x-allow-focus": true - } - ], - "result": { - "name": "sessionRequest", - "summary": "The request to start a keyboard session", - "schema": { - { - "$ref": "#/components/schemas/KeyboardProviderRequest" - } - } - } - } - ] -} -``` - -Keyboard.standard (2.0, provide in the app RPC doc): - -```json -{ - "methods": [ - { - "name": "Keyboard.standard", - "params": [ - { - "name": "message", - "schema": { - "type": "string" + "type": "object", + "properties": { + "appId": { + "type": "string" + }, + "type": { + "$ref": "#/components/schemas/InterestType" + }, + "reason": { + "$ref": "#/components/schemas/InterestReason" + }, + "entity": { + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/EntityDetails" + } } + } - ], - "tags": [ - { - "name": "capabilities", - "x-provides": "xrn:firebolt:capability:input:keyboard", - "x-allow-focus": true - } - ], - "result": { - "name": "value", - "summary": "The user entered string", - "schema": { - { - "type": "string" - } - } - } + } } ] } From ef3598f936aa7d094f48dde59b8a78376afa2c8d Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Fri, 12 Apr 2024 13:35:13 -0400 Subject: [PATCH 27/54] chore: Add Context Params spec --- .../general/context-parameters.md | 303 ++++++++++++++++++ 1 file changed, 303 insertions(+) create mode 100644 requirements/specifications/general/context-parameters.md diff --git a/requirements/specifications/general/context-parameters.md b/requirements/specifications/general/context-parameters.md new file mode 100644 index 000000000..b7868703c --- /dev/null +++ b/requirements/specifications/general/context-parameters.md @@ -0,0 +1,303 @@ +# Context Parameters +Document Status: Working Draft + +See [Firebolt Requirements Governance](../../governance.md) for more info. + +| Contributor | Organization | +| -------------- | -------------- | +| Jeremy LaCivita | Comcast | +| Yuri Pasquali | Sky | + +## 1. Overview + +**TODO**: This doc is old and need to be refreshed + +Context Parameters are parameters on an RPC method that provide context +for the call via a set of primitive types (string, number, integer, +boolean). This allows for sharing the context parameters across property +getters, setters, and subscribers, as well as filtering which events to +listen for by context. + +An example of a property method with context could be: + +```javascript +// get a context-driven property (context: appId=hulu) +const huluShare = await Privacy.shareWatchHistory('hulu') +``` + +```javascript +// set a context-driven property (context: appId=hulu) +Privacy.shareWatchHistory('hulu', false) +``` + +In the example above, 'hulu' is the context parameter for both the +shareWatchHistory getter and setter. + +Context parameters can also be applied to property subscribers, as well +as other, non-property events: + +```javascript +// subscribe to a context-driven property +Privacy.shareWatchHistory('hulu', (value) => { + console.log('hulu value changed to: ' + value) +}) + +Privacy.listen('shareWatchHistoryChanged', 'hulu', (value) => { + console.log('hulu value changed to: ' + value) +}) +``` + +For subscribers and events, the context parameters may be omitted, in +which case, all events will be dispatched to the listener: + +```javascript +// subscribe to a context-driven property w/out any context (get all of them) + +Privacy.shareWatchHistory((appId, value) => { + console.log(`App '${appId}' value changed to ${value}`) +}) + +Privacy.listen('shareWatchHistoryChanged', (appId, value) => { + console.log(`App '${appId}' value changed to: ${value}`) +}) +``` + +Context Parameters **MUST** be of a primitive type, to avoid complex +object-tree filtering. + +This document describes an OpenRPC pattern and JavaScript code +generation for a Firebolt method template that uses Context Parameters. + +## 2. Table of Contesnts +- [1. Overview](#1-overview) +- [2. Table of Contesnts](#2-table-of-contesnts) +- [3. Context Parameters Use Cases](#3-context-parameters-use-cases) +- [4. Context Parameters API](#4-context-parameters-api) + - [4.1. JSON-RPC API](#41-json-rpc-api) + - [4.1.1. Setter RPC generation](#411-setter-rpc-generation) + - [4.1.2. onChanged RPC generation](#412-onchanged-rpc-generation) + - [4.1.3. Temporal Set onAvailable / Unavailable RPC generation](#413-temporal-set-onavailable--unavailable-rpc-generation) + - [4.1.4. Event RPC Decoration](#414-event-rpc-decoration) + - [4.2. JavaScript API](#42-javascript-api) + - [4.2.1. Event Listener Signatures](#421-event-listener-signatures) + +## 3. Context Parameters Use Cases + +How each parameter affects it's corresponding API is out of scope for +this document. See each API spec for details on what each context +parameter does. + +Setting a context parameter to null is still setting it to a value. If a +context parameter is passed to the SDK with either a value of null or +undefined, then it **MUST** be explicitly set in the RPC request to the +value null. This is to avoid additional method signature permutations +being required for the SDK. + +An effort should be made to sort the context parameters in order of most +usefulness, since not all languages support undefined. + +## 4. Context Parameters API + +The section describes the RPC and JavaScript APIs. + +### 4.1. JSON-RPC API + +Simple getters and event listeners don't need any parameters. + +If a method is tagged as either a property (any kind) or an event, then +**all** the parameters in the RPC definition **MUST** be context +parameters. + +To facilitate this, the listen parameter that all events currently have +will be removed from the source module and inserted into the generated +RPC by the firebolt-openrpc tooling. + +If any Context Parameters have a type other than: + +- `string` +- `boolean` +- `number` +- `integer` + +Then the RPC method **MUST NOT** pass validation. This is to ensure that +implementing context parameters is not overly complicated. + +#### 4.1.1. Setter RPC generation + +When generating the setter for a property method, all the Context +Parameters **MUST** be copied to the setter. The context parameters +**MUST** be before the value parameter, which itself **MUST** be last. + +#### 4.1.2. onChanged RPC generation + +When generating the onChanged notification for a property +method, all the Context Parameters **MUST** be copied to the event +parameters. The context parameters **MUST** be before the listen +parameter, which itself **MUST** be last. + +#### 4.1.3. Temporal Set onAvailable / Unavailable RPC generation + +Generated Temporal Set events will treat the entire parameter list from +the original temporal-set method as Context Parameters and copy them to +the event parameters. The context parameters **MUST** be before the +listen parameter, which itself **MUST** be last. + +#### 4.1.4. Event RPC Decoration + +All RPC methods tagged as event **MUST** have the listen parameter, of +type boolean, automatically added when generating the final RPC. This +parameter will be added at the end of the parameters list. + +All RPC methods tagged as event that have context parameters **MUST** +have the result schema wrapped in an object. The original result schema +**MUST** be moved to a property called data. Each of the context +parameters **MUST** be copied to a property called context. + +So the following RPC event: + +```json +{ + "name": "onContextualEvent", + "tags": [ + { + "name": "event" + } + ], + "params": [ + { + "name": "a", + "required": true, + "schema": { + "type": "boolean" + } + }, + { + "name": "b", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "c", + "required": false, + "schema": { + "type": "number" + } + } + ], + "result": { + "name": "result", + "schema": { + "type": "object", + "properties": { + "foo": { + "type": "boolean" + } + } + } + } +} +``` + +Would have its result transformed to: + +```json +{ + "name": "result", + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "foo": { + "type": "boolean" + } + } + }, + "context": { + "type": "object", + "properties": { + "a": { + "type": "boolean" + }, + "b": { + "type": "string" + }, + "c": { + "type": "number" + } + }, + "required": [ + "a" + ] + } + } + } +} +``` + +### 4.2. JavaScript API + +TBD + +#### 4.2.1. Event Listener Signatures + +If any of the context parameters are optional, then a callback signature +must be generated for each left-to-right combination of the parameters. + +For example, the method: + +```json +{ + "name": "onFoo", + "tags": [ + { + "name": "event" + } + ], + "params": [ + { + "name": "a", + "required": true, + "schema": { + "type": "boolean" + } + }, + { + "name": "b", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "c", + "required": false, + "schema": { + "type": "number" + } + } + ] +} +``` + +Would result in the following method signatures: + +```typescript +listen(event: 'foo', a: boolean, callback: (b: string, c: number, data: any) => {}) + +listen(event: 'foo', a: boolean, b: string, callback: (c: number, data: any) => {}) + +listen(event: 'foo', a: boolean, b: string, c: number, callback: (data: any) => {}) +``` + +Which allows parameters to be omitted, from right-to-left, and included +as part of the result, instead. + +When invoking the callback, the SDK **MUST** pass the data portion of +the result to the data parameter of the callback, and each context +property to the corresponding callback parameter. + +This pattern also applies to property subscribers. From 32ffc39ba525c00d5f01aa65647cad1accbbbe29 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Wed, 8 May 2024 14:42:32 -0400 Subject: [PATCH 28/54] fix: KP's feedback --- .../specifications/general/context-parameters.md | 6 +++--- .../openrpc-extensions/app-passthrough-apis.md | 11 ++--------- .../openrpc-extensions/lifecycle-api-gating.md | 2 +- .../openrpc-extensions/push-pull-methods.md | 2 +- src/sdks/discovery/test/suite/content.test.ts | 2 -- 5 files changed, 7 insertions(+), 16 deletions(-) diff --git a/requirements/specifications/general/context-parameters.md b/requirements/specifications/general/context-parameters.md index b7868703c..761a03fd7 100644 --- a/requirements/specifications/general/context-parameters.md +++ b/requirements/specifications/general/context-parameters.md @@ -173,14 +173,14 @@ So the following RPC event: }, { "name": "b", - "required": false, + "required": true, "schema": { "type": "string" } }, { "name": "c", - "required": false, + "required": true, "schema": { "type": "number" } @@ -230,7 +230,7 @@ Would have its result transformed to: } }, "required": [ - "a" + "a", "b", "c" ] } } diff --git a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md index 58d39ac24..d725d0a41 100644 --- a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md +++ b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md @@ -11,7 +11,7 @@ See [Firebolt Requirements Governance](../../governance.md) for more info. | Yuri Pasquali | Sky | ## 1. Overview -This document describes how one Firebolt App can provide a capability that may be used by another Firebolt App, with the platform as a permission broker that passes the requests and respones to each app with out feature-specific logic. +This document describes how one Firebolt App can provide a capability that may be used by another Firebolt App, with the platform as a permission broker that passes the requests and responses to each app without feature-specific logic. This document covers the App Pass-through Firebolt OpenRPC extension as well as how Firebolt implementations should detect and execute app provided pass-through APIs. @@ -175,8 +175,6 @@ This section only applies to platform methods that have an `event` tag. App provided event registration **MUST** not return an availability error due to a lack of providers, since one may be launched at a future point. -**TODO**: do we want to search the catalog and return unavailable if none are possible? Seems overkill. - To ensure that event provider methods all behave the same the provider method **MUST** have a `result` schema with `"type"` set to `"null"`, since it will not expect any data in the response from the platform after pushing the notification. The platform method result schema **MUST** either: @@ -185,8 +183,6 @@ The platform method result schema **MUST** either: > > Have a property that matches the *last* parameter schema on the provider method so that the result can be passed through. -**TODO**: Find event context params spec and move into this branch - Example platform method with context: ```json { @@ -235,9 +231,6 @@ Matching provider method: { "name": "capabilities", "x-provides": "xrn:firebolt:capabilities:example:foo" - }, - { - "name": "event" } ], "params": [ @@ -272,7 +265,7 @@ Otherwise if the platform method result schema has a property that matches the * Finally the platform **MUST** dispatch the notification to the app that registered for the event via the original platform method, using all but the last parameter as context. ## 5. Provider Candidates -The Firebolt Device Manfist **MUST** have a list of `ProviderPolicy` configurations that map capabilities to policies for determining candidate providers: +The Firebolt Device Manifist **MUST** have a list of `ProviderPolicy` configurations that map capabilities to policies for determining candidate providers: ```json { diff --git a/requirements/specifications/openrpc-extensions/lifecycle-api-gating.md b/requirements/specifications/openrpc-extensions/lifecycle-api-gating.md index d32554dad..e54972840 100644 --- a/requirements/specifications/openrpc-extensions/lifecycle-api-gating.md +++ b/requirements/specifications/openrpc-extensions/lifecycle-api-gating.md @@ -14,7 +14,7 @@ This document describes the the `x-lifecycle` Firebolt OpenRPC extension. Some APIs require that they are only called when an app is in a certain Lifecycle state. -To facilitate these APIs, Firebolt denotes an OpenRPC extension to limit the states than ap app is allowed to be in when a method request is made. +To facilitate these APIs, Firebolt denotes an OpenRPC extension to limit the states that an app is allowed to be in when a method request is made. This document is written using the [IETF Best Common Practice 14](https://www.rfc-editor.org/rfc/rfc2119.txt) and should include the following summary in the Overview section: diff --git a/requirements/specifications/openrpc-extensions/push-pull-methods.md b/requirements/specifications/openrpc-extensions/push-pull-methods.md index fa4cfbb72..af15955f3 100644 --- a/requirements/specifications/openrpc-extensions/push-pull-methods.md +++ b/requirements/specifications/openrpc-extensions/push-pull-methods.md @@ -14,7 +14,7 @@ This document describes the Push / Pull Firebolt OpenRPC extension. Some APIs require both a push and a pull version so that data can be provided on request, or out of band. -To facilitate these APIs, Firebolt denotes an OpenRPC tag with OpenRPC extensions to auto-genrate the push notifcation, pull provider, and pull request APIs from the main push API. +To facilitate these APIs, Firebolt denotes an OpenRPC tag with OpenRPC extensions to auto-generate the push notifcation, pull provider, and pull request APIs from the main push API. This document is written using the [IETF Best Common Practice 14](https://www.rfc-editor.org/rfc/rfc2119.txt) and should include the following summary in the Overview section: diff --git a/src/sdks/discovery/test/suite/content.test.ts b/src/sdks/discovery/test/suite/content.test.ts index 5acdf0e41..5ee6c48fb 100644 --- a/src/sdks/discovery/test/suite/content.test.ts +++ b/src/sdks/discovery/test/suite/content.test.ts @@ -20,8 +20,6 @@ import { test, expect } from "@jest/globals"; import { Content } from "../../build/javascript/src/firebolt-discovery"; test("Content.requestUserInterest()", () => { - const expTime: number = new Date().getTime() + 100; - Content.requestDetails return Content.requestUserInterest(Content.InterestType.INTEREST, Content.InterestReason.PLAYLIST).then((entity:Content.EntityDetails) => { expect(entity).toBeDefined() expect(entity.info.title).toBe("Cool Runnings") From c76e9e38d18bc706ffd71ca8759709af921a01ab Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Thu, 9 May 2024 11:37:39 -0400 Subject: [PATCH 29/54] fix: Point to real firebolt-openrpc branch --- package-lock.json | 11 +++++++---- package.json | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index bf4b03029..ad316b864 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "devDependencies": { "@commitlint/cli": "^17.0.3", "@commitlint/config-conventional": "^17.0.3", - "@firebolt-js/openrpc": "../firebolt-openrpc", + "@firebolt-js/openrpc": "@firebolt-js/openrpc#feature/app-pass-through", "@firebolt-js/schemas": "2.0.0", "@saithodev/semantic-release-backmerge": "^3.2.0", "@semantic-release/changelog": "^6.0.1", @@ -40,7 +40,7 @@ "../firebolt-openrpc": { "name": "@firebolt-js/openrpc", "version": "2.3.0-next.1", - "dev": true, + "extraneous": true, "license": "Apache-2.0", "dependencies": { "ajv": "^8.12.0", @@ -69,6 +69,9 @@ "semantic-release": "^19.0.5" } }, + "@firebolt-js/openrpc": { + "dev": true + }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", @@ -1107,7 +1110,7 @@ "link": true }, "node_modules/@firebolt-js/openrpc": { - "resolved": "../firebolt-openrpc", + "resolved": "@firebolt-js/openrpc", "link": true }, "node_modules/@firebolt-js/schemas": { @@ -16749,7 +16752,7 @@ }, "src/sdks/discovery": { "name": "@firebolt-js/discovery-sdk", - "version": "1.0.0", + "version": "1.1.0", "license": "Apache-2.0", "devDependencies": { "jest": "^28.1.0", diff --git a/package.json b/package.json index ac381aa6c..f9c831702 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "devDependencies": { "@commitlint/cli": "^17.0.3", "@commitlint/config-conventional": "^17.0.3", - "@firebolt-js/openrpc": "../firebolt-openrpc", + "@firebolt-js/openrpc": "@firebolt-js/openrpc#feature/app-pass-through", "@firebolt-js/schemas": "2.0.0", "@saithodev/semantic-release-backmerge": "^3.2.0", "@semantic-release/changelog": "^6.0.1", From 6dbc159dc4144aff81e71865d57df5cb7c60c9e1 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Thu, 9 May 2024 11:42:45 -0400 Subject: [PATCH 30/54] fix: Fixing typo --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f9c831702..6b5f0b49a 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "devDependencies": { "@commitlint/cli": "^17.0.3", "@commitlint/config-conventional": "^17.0.3", - "@firebolt-js/openrpc": "@firebolt-js/openrpc#feature/app-pass-through", + "@firebolt-js/openrpc": "rdkcentral/firebolt-openrpc#feature/app-pass-through", "@firebolt-js/schemas": "2.0.0", "@saithodev/semantic-release-backmerge": "^3.2.0", "@semantic-release/changelog": "^6.0.1", From 98e554e32fb0efccf5746ec69954a044098afddd Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Thu, 9 May 2024 12:38:41 -0400 Subject: [PATCH 31/54] fix: Update package-lock for CI --- package-lock.json | 259 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 253 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index ad316b864..11ebbc805 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "devDependencies": { "@commitlint/cli": "^17.0.3", "@commitlint/config-conventional": "^17.0.3", - "@firebolt-js/openrpc": "@firebolt-js/openrpc#feature/app-pass-through", + "@firebolt-js/openrpc": "rdkcentral/firebolt-openrpc#feature/app-pass-through", "@firebolt-js/schemas": "2.0.0", "@saithodev/semantic-release-backmerge": "^3.2.0", "@semantic-release/changelog": "^6.0.1", @@ -69,9 +69,6 @@ "semantic-release": "^19.0.5" } }, - "@firebolt-js/openrpc": { - "dev": true - }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", @@ -1110,8 +1107,95 @@ "link": true }, "node_modules/@firebolt-js/openrpc": { - "resolved": "@firebolt-js/openrpc", - "link": true + "version": "2.3.0-next.1", + "resolved": "git+ssh://git@github.com/rdkcentral/firebolt-openrpc.git#b126834f640361eb14bb054b1dc279060d620d6b", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "ajv": "^8.12.0", + "ajv-formats": "^2.1.1", + "array.prototype.groupby": "^1.1.0", + "crocks": "^0.12.4", + "deepmerge": "^4.2.2", + "fs-extra": "^10.1.0", + "highland": "^2.13.5", + "mkdirp": "^0.5.6", + "node-fetch": "^3.2.10", + "nopt": "^5.0.0", + "util": "^0.12.4" + }, + "bin": { + "firebolt-openrpc": "src/cli.mjs" + } + }, + "node_modules/@firebolt-js/openrpc/node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/@firebolt-js/openrpc/node_modules/ajv": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@firebolt-js/openrpc/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@firebolt-js/openrpc/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/@firebolt-js/openrpc/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/@firebolt-js/openrpc/node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } }, "node_modules/@firebolt-js/schemas": { "version": "2.0.0", @@ -2684,6 +2768,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.groupby": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array.prototype.groupby/-/array.prototype.groupby-1.1.0.tgz", + "integrity": "sha512-p+QtvmnNEBqajQWLG3kPls8cLPBfJgvayzc/qplsX8Vchtevtq+TR2gyav5xs5h+mdUjfgOvYoCdTsVxu3b5sA==", + "deprecated": "This proposal has been altered; please use https://npmjs.com/object.groupby instead!", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.1" + } + }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", @@ -3309,6 +3407,12 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "node_modules/crocks": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/crocks/-/crocks-0.12.4.tgz", + "integrity": "sha512-paln6xJUrR9e/OWMFsyTi4dLyr+q99C5f7PQbGgSDHtwsfW0sCNZvnpHzvniI2dAE0uoBgeIP1Ukmme8Z0HxxA==", + "dev": true + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -3365,6 +3469,15 @@ "node": ">=8" } }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, "node_modules/data-urls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", @@ -4734,6 +4847,29 @@ "bser": "2.1.1" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/figures": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", @@ -4848,6 +4984,18 @@ "node": ">= 6" } }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -5305,6 +5453,15 @@ "node": ">= 0.4" } }, + "node_modules/highland": { + "version": "2.13.5", + "resolved": "https://registry.npmjs.org/highland/-/highland-2.13.5.tgz", + "integrity": "sha512-dn2flPapIIAa4BtkB2ahjshg8iSJtrJtdhEb9/oiOrS5HMQTR/GuhFpqJ+11YBdtnl3AwWKvbZd1Uxr8uAmA7A==", + "dev": true, + "dependencies": { + "util-deprecate": "^1.0.2" + } + }, "node_modules/hook-std": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", @@ -5563,6 +5720,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -5677,6 +5850,21 @@ "node": ">=6" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -7307,6 +7495,25 @@ "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", "dev": true }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-emoji": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", @@ -7316,6 +7523,24 @@ "lodash": "^4.17.21" } }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -16388,6 +16613,19 @@ "requires-port": "^1.0.0" } }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -16467,6 +16705,15 @@ "makeerror": "1.0.12" } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", From 3bff34486a5205eaf4946fdb2a50321c8aaf8b19 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Thu, 9 May 2024 12:52:13 -0400 Subject: [PATCH 32/54] fix: Okay, actually fixing build w/ #186 merged in --- package-lock.json | 12 ++++++------ src/sdks/discovery/package.json | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 11ebbc805..a036e827d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@firebolt-js/sdks", - "version": "1.1.0", + "version": "1.2.0-next.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@firebolt-js/sdks", - "version": "1.1.0", + "version": "1.2.0-next.2", "license": "Apache-2.0", "workspaces": [ "src/sdks/core", @@ -1107,8 +1107,8 @@ "link": true }, "node_modules/@firebolt-js/openrpc": { - "version": "2.3.0-next.1", - "resolved": "git+ssh://git@github.com/rdkcentral/firebolt-openrpc.git#b126834f640361eb14bb054b1dc279060d620d6b", + "version": "3.0.0-next.1", + "resolved": "git+ssh://git@github.com/rdkcentral/firebolt-openrpc.git#dd544f701f2d609076d3b157f745eb48e0163883", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -16988,7 +16988,7 @@ }, "src/sdks/core": { "name": "@firebolt-js/sdk", - "version": "1.1.0", + "version": "1.2.0-next.2", "license": "Apache-2.0", "devDependencies": { "jest": "^28.1.0", @@ -17010,7 +17010,7 @@ }, "src/sdks/manage": { "name": "@firebolt-js/manage-sdk", - "version": "1.1.0", + "version": "1.2.0-next.2", "license": "Apache-2.0", "devDependencies": { "jest": "^28.1.0", diff --git a/src/sdks/discovery/package.json b/src/sdks/discovery/package.json index 1b1b4e80c..40e4cd992 100644 --- a/src/sdks/discovery/package.json +++ b/src/sdks/discovery/package.json @@ -1,6 +1,6 @@ { "name": "@firebolt-js/discovery-sdk", - "version": "1.1.0", + "version": "1.2.0-next.2", "description": "The Firebolt Discovery JS SDK", "main": "./dist/lib/firebolt-discovery.mjs", "types": "./dist/lib/firebolt-discovery.d.ts", From 92716af8337b20976392e4c1053e06fd10d37fcd Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Thu, 9 May 2024 16:03:49 -0400 Subject: [PATCH 33/54] fix: KP's additional comments. --- package-lock.json | 260 +-------------- package.json | 2 +- .../specifications/discovery/user-interest.md | 300 ++++++++++++++++++ .../specifications/intents/user-interest.md | 286 +---------------- .../app-passthrough-apis.md | 10 +- .../lifecycle-api-gating.md | 65 ---- src/openrpc/content.json | 4 +- src/sdks/discovery/sdk.config.json | 1 - 8 files changed, 316 insertions(+), 612 deletions(-) create mode 100644 requirements/specifications/discovery/user-interest.md delete mode 100644 requirements/specifications/openrpc-extensions/lifecycle-api-gating.md diff --git a/package-lock.json b/package-lock.json index a036e827d..e1f34d496 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "devDependencies": { "@commitlint/cli": "^17.0.3", "@commitlint/config-conventional": "^17.0.3", - "@firebolt-js/openrpc": "rdkcentral/firebolt-openrpc#feature/app-pass-through", + "@firebolt-js/openrpc": "../firebolt-openrpc", "@firebolt-js/schemas": "2.0.0", "@saithodev/semantic-release-backmerge": "^3.2.0", "@semantic-release/changelog": "^6.0.1", @@ -40,7 +40,7 @@ "../firebolt-openrpc": { "name": "@firebolt-js/openrpc", "version": "2.3.0-next.1", - "extraneous": true, + "dev": true, "license": "Apache-2.0", "dependencies": { "ajv": "^8.12.0", @@ -1107,95 +1107,8 @@ "link": true }, "node_modules/@firebolt-js/openrpc": { - "version": "3.0.0-next.1", - "resolved": "git+ssh://git@github.com/rdkcentral/firebolt-openrpc.git#dd544f701f2d609076d3b157f745eb48e0163883", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "ajv": "^8.12.0", - "ajv-formats": "^2.1.1", - "array.prototype.groupby": "^1.1.0", - "crocks": "^0.12.4", - "deepmerge": "^4.2.2", - "fs-extra": "^10.1.0", - "highland": "^2.13.5", - "mkdirp": "^0.5.6", - "node-fetch": "^3.2.10", - "nopt": "^5.0.0", - "util": "^0.12.4" - }, - "bin": { - "firebolt-openrpc": "src/cli.mjs" - } - }, - "node_modules/@firebolt-js/openrpc/node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/@firebolt-js/openrpc/node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@firebolt-js/openrpc/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@firebolt-js/openrpc/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/@firebolt-js/openrpc/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/@firebolt-js/openrpc/node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } + "resolved": "../firebolt-openrpc", + "link": true }, "node_modules/@firebolt-js/schemas": { "version": "2.0.0", @@ -2768,20 +2681,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.groupby": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array.prototype.groupby/-/array.prototype.groupby-1.1.0.tgz", - "integrity": "sha512-p+QtvmnNEBqajQWLG3kPls8cLPBfJgvayzc/qplsX8Vchtevtq+TR2gyav5xs5h+mdUjfgOvYoCdTsVxu3b5sA==", - "deprecated": "This proposal has been altered; please use https://npmjs.com/object.groupby instead!", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.1" - } - }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", @@ -3407,12 +3306,6 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, - "node_modules/crocks": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/crocks/-/crocks-0.12.4.tgz", - "integrity": "sha512-paln6xJUrR9e/OWMFsyTi4dLyr+q99C5f7PQbGgSDHtwsfW0sCNZvnpHzvniI2dAE0uoBgeIP1Ukmme8Z0HxxA==", - "dev": true - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -3469,15 +3362,6 @@ "node": ">=8" } }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, "node_modules/data-urls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", @@ -4847,29 +4731,6 @@ "bser": "2.1.1" } }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, "node_modules/figures": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", @@ -4984,18 +4845,6 @@ "node": ">= 6" } }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dev": true, - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, "node_modules/from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -5453,15 +5302,6 @@ "node": ">= 0.4" } }, - "node_modules/highland": { - "version": "2.13.5", - "resolved": "https://registry.npmjs.org/highland/-/highland-2.13.5.tgz", - "integrity": "sha512-dn2flPapIIAa4BtkB2ahjshg8iSJtrJtdhEb9/oiOrS5HMQTR/GuhFpqJ+11YBdtnl3AwWKvbZd1Uxr8uAmA7A==", - "dev": true, - "dependencies": { - "util-deprecate": "^1.0.2" - } - }, "node_modules/hook-std": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", @@ -5720,22 +5560,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -5850,21 +5674,6 @@ "node": ">=6" } }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -7495,25 +7304,6 @@ "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", "dev": true }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } - }, "node_modules/node-emoji": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", @@ -7523,24 +7313,6 @@ "lodash": "^4.17.21" } }, - "node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "dev": true, - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -16613,19 +16385,6 @@ "requires-port": "^1.0.0" } }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -16705,15 +16464,6 @@ "makeerror": "1.0.12" } }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -16999,7 +16749,7 @@ }, "src/sdks/discovery": { "name": "@firebolt-js/discovery-sdk", - "version": "1.1.0", + "version": "1.2.0-next.2", "license": "Apache-2.0", "devDependencies": { "jest": "^28.1.0", diff --git a/package.json b/package.json index f38fe071a..0e50bf451 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "devDependencies": { "@commitlint/cli": "^17.0.3", "@commitlint/config-conventional": "^17.0.3", - "@firebolt-js/openrpc": "rdkcentral/firebolt-openrpc#feature/app-pass-through", + "@firebolt-js/openrpc": "../firebolt-openrpc", "@firebolt-js/schemas": "2.0.0", "@saithodev/semantic-release-backmerge": "^3.2.0", "@semantic-release/changelog": "^6.0.1", diff --git a/requirements/specifications/discovery/user-interest.md b/requirements/specifications/discovery/user-interest.md new file mode 100644 index 000000000..62c8bc2da --- /dev/null +++ b/requirements/specifications/discovery/user-interest.md @@ -0,0 +1,300 @@ +# User Interest + +Document Status: Candidate Specification + +See [Firebolt Requirements Governance](../../governance.md) for more info. + +| Contributor | Organization | +| -------------- | -------------- | +| Eugene Chung | Comcast | +| Tim Dibben | Sky | +| Mike Horwitz | Comcast | +| Jeremy LaCivita | Comcast | + +## 1. Overview + +In additional to traditional discovery APIs such as Watch History and +Watch Next, Firebolt provides a more abstract API that facilitates +impromptu content discovery connections between first-party Aggregated +Experiences and third-party Apps. + +The User Interest Capability enables Apps to provide meta-data on +content that the user has expressed an interest in to Aggregated +Experience Apps that have been given access to use this Capability. + +This allows for open ended design of Aggregated Experience App features +that present App-specific content to re-engage the user with the content +inside the originating App. + +While the functionality and UX is left to the Aggregated Experience App, +typically designed by each Firebolt Distributor, the Firebolt API +enables events to register user interest and pass entity meta-data: + +![Diagram Description automatically +generated](../../../requirements/images/specifications/intents/user-interest/media/image1.png) + +Which generally enables Aggregated Experiences to present that entity +meta-data in some way that leads to re-launching the original App at a +later point, using a `navigateTo` notification: + +![Diagram Description automatically +generated](../../../requirements/images/specifications/intents/user-interest/media/image2.png) + +This is just one example of what an Aggregated Experience App might do +with the User Interest API. + +Note that this API **SHOULD NOT** be used to implement Watch History or +Watch Next features. These concepts are much more fundamental to +Firebolt and have explicit APIs so that Firebolt Distributors can keep +track of which apps are using them separately. + +## 2. Table of Contents +- [1. Overview](#1-overview) +- [2. Table of Contents](#2-table-of-contents) +- [3. User Interest Flows](#3-user-interest-flows) + - [3.1. User Interest from an in-app UX](#31-user-interest-from-an-in-app-ux) + - [3.2. User Interest from a platform UX](#32-user-interest-from-a-platform-ux) + - [3.3. Upstream User Interest Intent](#33-upstream-user-interest-intent) + - [3.4. User Interest Bulk Updates](#34-user-interest-bulk-updates) +- [4. Core SDK APIs](#4-core-sdk-apis) + - [4.1. InterestType](#41-interesttype) + - [4.2. InterestReason](#42-interestreason) + - [4.3. Discovery.userInterest](#43-discoveryuserinterest) + - [4.4. Discovery Interest Provider](#44-discovery-interest-provider) + - [4.5. InterestIntent](#45-interestintent) +- [5. Discovery SDK APIs](#5-discovery-sdk-apis) + - [5.1. Content.requestUserInterest](#51-contentrequestuserinterest) + - [5.2. Content.onUserInterest](#52-contentonuserinterest) + + +## 3. User Interest Flows +### 3.1. User Interest from an in-app UX + +Some Apps will have a built-in user interface for users to express +interest in content from the App. This could be a "Favorite" button, +an in-app "My List" button, etc. + +If the App wants to leverage any additional exposure from the device's +Aggregated Experience, it can wire up its own UI to the Firebolt User +Interest API, in addition to any in-app features that it's already +invoking. + +By calling the `Discovery.userInterest` method with the relevant entity +meta-data, the device's Aggregated Experience will be notified of the +user's interest in that entity: + +```typescript +Discovery.userInterest(type:InterestType, reason: InterestReason, entity:EntityDetails) +``` + +The `type` parameter denotes the directionality of the interest: + +- `interest` +- `disinterest` + +The `reason` parameter denotes why or how the user has expressed interest: + +| Reason | Description | +| ------ | ----------- | +| `playlist` | Interested in adding to a list | +| `reaction` | Interested in submitting a reaction, e.g. like or dislike | +| `recording` | Interest in scheduling a recording | +| `share` | Interest in sharing the content on social media | + +**NOTE**: We can remove some of these (not `playlist`) these are here for now to illustrate the purpose for the reason paramater. + +An app **MUST** `provide` the `xrn:firebolt:capability:discovery:interest` +capability in order to call `Discovery.userInterest`. + +When this method is called with a valid `EntityDetails`, the platform +**MUST** dispatch a `Content.onUserInterest` notification to all Apps +that have registered for it (typically Aggregated Experience Apps) with +information about the app, interest type, and the entity. + +The `Content.onUserInterest` event has three context parameters: + +| context | type | description | +|---------|------|-------------| +| appid | string | The id of the app that pushed the user interest. | +| type | `InterestType` | the type of interest. | +| reason | `InterestReason` | the reason for the interest | + +The `Content.onUserInterest` event has a result type of `EntityDetails`. + +An Aggregated Experience can register for the `Content.onUserInterest` +notification, and it will receive notifications when an `EntityDetails` is +returned from the active App after a `Discovery.userInterest` call is +fulfilled. + +An app **MUST** have permissions to `use` the +`xrn:firebolt:capability:discovery:interest` capability in order to +listen to the `Content.onUserInterest` notification. + +If the result is `null` or is not a valid entity, i.e. does not match +the [EntityDetails](../entities/) schema, then no `Content.onUserInterestedIn` +notification will be dispatched. + +The `Discovery.userInterest` method **SHOULD NOT** be used in place of more +specific Discovery methods, e.g. `Discovery.watchNext` or +`Discovery.watched`. These methods facilitate specific UX flows that may +have separate legal opt-outs for each user. + +The `Discovery.userInterest` method **SHOULD NOT** be called unless the user +is activating a UI element in the app, or in a second screen experience +that is communicating with the app, that implies interest of some kind. + +### 3.2. User Interest from a platform UX + +Firebolt platforms may provide a platform UX, e.g. voice or and RCU, to +express user interest in content from an active App. To facilitate this +Apps will need to be told about the user's expressed interest in their +content. + +First, the Aggregated Experience (or some app with this +capability) detects that the user is interested in something. In this +picture the interest is triggered by an RCU button, but how this occurs +is outside the scope of this document. When this happens, the Aggregated +Experience app calls `Content.requestUserInterest()`, which will trigger the +platform to identify the best [Provider Candidate](../openrpc-extensions/app-passthrough-apis.md#5-provider-candidates) +and call that app's `userInterest` method via the Provider RPC method: +`Discovery.onRequestUserInterest`. + +![](../../../requirements/images/specifications/intents/user-interest/media/image3.png) + +Next, the provider app receives and responds to the request with an +EntityDetails, which is returned as the result to the pending +`Content.requestUserInterest` method: + +![](../../../requirements/images/specifications/intents/user-interest/media/image4.png) + +Once an App's callback is invoked, that app will have `interestTimeout` +milliseconds to return a value or throw an error. Values returned after +that time **MUST** be ignored. The timeout value is stored in the +device's configuration manifest. + +To be notified when a user expresses interest in the currently displayed +content, an App **MUST** provide the +`xrn:firebolt:capability:discovery:interest` capability by enabling the +`Discovery.onRequestUserInterest` notification. + +If there is a valid entity to return, then the method registered by the +App **MUST** return the currently displayed entity meta-data. + +If there is no valid entity to return, then the method **MUST** throw an +exception. + +If the provider app returns a valid `EntityDetails` before the timeout, +then, the returned value **MUST** be used. + +If there is no app registered the an error **MUST** be returned. + +### 3.3. Upstream User Interest Intent +In some cases, e.g. a voice assistant, some upstream component will inform +the platform that the user is interested in whatever is currently being presented. + +To do this, the upstream system **MUST** send a `Interest` intent, which describes the type of and reason for the interest. + +```json +{ + "action": "interest", + "data": { + "type": "interest", + "reason": "playlist" + } +} +``` + +When a Firebolt platform receives this intent, it **SHOULD** initiate the platform's [user interest flow](#4-user-interest-from-a-platform-ux). + +### 3.4. User Interest Bulk Updates + +Sending bulk interest updates, e.g. Entities the user expressed interest +in on a different platform, is not supported. + +## 4. Core SDK APIs + +The following APIs are exposed by the Firebolt Core SDK as part of the +`Discovery` module. + +### 4.1. InterestType +This is an enum with the following values: + +- `"interest"` +- `"disinterest"` + +### 4.2. InterestReason +This is an enum with the following values: + +| Reason | Description | +| ------ | ----------- | +| `playlist` | Interested in adding to a list | +| `reaction` | Interested in submitting a reaction, e.g. like or dislike | +| `recording` | Interest in scheduling a recording | +| `share` | Interest in sharing the content on social media | + +### 4.3. Discovery.userInterest + +This is a push API that allows Apps to push entities that the user has +expressed interest in to the platform. + +To push an entity that the user is interested in pass an `EntityDetails` +object to the method: + +```typescript +Discovery.userInterest(type: InterestType, reason: InterestReason, entity: EntityDetails): Promise +``` + +### 4.4. Discovery Interest Provider +To respond to requests for the current entity, because the user has +expressed interest in some way that the platform manages, register a +provider: + +```typescript +interface IDiscoveryInterestProvider { + function userInterest(type: InterestType, reason: InterestReason): Promise +} + +Discovery.provide("xrn:firbolt:capability:discovery:interest", IDiscoveryInterestProvider) +``` + +### 4.5. InterestIntent + +An `InterestIntent` denotes that the user has expressed interest in the +currently displayed and/or selected content: + +```typescript +type InterestIntent { + action: "interest" + data: { + type: "interest" | "disinterest", + reason: "playlist" | "reaction" | "recording" + }, + context: { + source: "rcu" | "voice" + } +} +``` + +## 5. Discovery SDK APIs + +The following APIs are exposed by the Firebolt Discovery SDK as part of the +`Content` module. + +### 5.1. Content.requestUserInterest +This method triggers the corresponding Discovery provider API for the +provider app. + +```typescript +Content.requestUserInterest(type: InterestType, reason: InterestReason): Promise +``` + +### 5.2. Content.onUserInterest + +This notification allows Aggregated Experience Apps to be informed when +a user expresses interest in some Content, and the content resolves to a +valid Entity from some App. + +`Content.listen('userInterest', UserInterestInfo => void): Promise` + +The callback will be passed an `UserInterestInfo` object with +the type, reason, and information about the entity that the user expressed interest in. diff --git a/requirements/specifications/intents/user-interest.md b/requirements/specifications/intents/user-interest.md index 10e3c61e0..eae60ecf7 100644 --- a/requirements/specifications/intents/user-interest.md +++ b/requirements/specifications/intents/user-interest.md @@ -12,288 +12,4 @@ See [Firebolt Requirements Governance](../../governance.md) for more info. | Jeremy LaCivita | Comcast | ## 1. Overview - -In additional to traditional discovery APIs such as Watch History and -Watch Next, Firebolt provides a more abstract API that facilitates -impromptu content discovery connections between first-party Aggregated -Experiences and third-party Apps. - -The User Interest Capability enables Apps to provide meta-data on -content that the user has expressed an interest in to Aggregated -Experience Apps that have been given access to use this Capability. - -This allows for open ended design of Aggregated Experience App features -that present App-specific content to re-engage the user with the content -inside the originating App. - -While the functionality and UX is left to the Aggregated Experience App, -typically designed by each Firebolt Distributor, the Firebolt API -enables events to register user interest and pass entity meta-data: - -![Diagram Description automatically -generated](../../../requirements/images/specifications/intents/user-interest/media/image1.png) - -Which generally enables Aggregated Experiences to present that entity -meta-data in some way that leads to re-launching the original App at a -later point, using a `navigateTo` notification: - -![Diagram Description automatically -generated](../../../requirements/images/specifications/intents/user-interest/media/image2.png) - -This is just one example of what an Aggregated Experience App might do -with the User Interest API. - -Note that this API **SHOULD NOT** be used to implement Watch History or -Watch Next features. These concepts are much more fundamental to -Firebolt and have explicit APIs so that Firebolt Distributors can keep -track of which apps are using them separately. - -## 2. Table of Contents -- [1. Overview](#1-overview) -- [2. Table of Contents](#2-table-of-contents) -- [3. User Interest Flows](#3-user-interest-flows) - - [3.1. User Interest from an in-app UX](#31-user-interest-from-an-in-app-ux) - - [3.2. User Interest from a platform UX](#32-user-interest-from-a-platform-ux) - - [3.3. Upstream User Interest Intent](#33-upstream-user-interest-intent) - - [3.4. User Interest Bulk Updates](#34-user-interest-bulk-updates) -- [4. Core SDK APIs](#4-core-sdk-apis) - - [4.1. InterestType](#41-interesttype) - - [4.2. InterestReason](#42-interestreason) - - [4.3. Discovery.userInterest](#43-discoveryuserinterest) - - [4.4. Discovery Interest Provider](#44-discovery-interest-provider) - - [4.5. InterestIntent](#45-interestintent) -- [5. Discovery SDK APIs](#5-discovery-sdk-apis) - - [5.1. Content.requestUserInterest](#51-contentrequestuserinterest) - - [5.2. Content.onUserInterest](#52-contentonuserinterest) - - -## 3. User Interest Flows -### 3.1. User Interest from an in-app UX - -Some Apps will have a built-in user interface for users to express -interest in content from the App. This could be a "Favorite" button, -an in-app "My List" button, etc. - -If the App wants to leverage any additional exposure from the device's -Aggregated Experience, it can wire up its own UI to the Firebolt User -Interest API, in addition to any in-app features that it's already -invoking. - -By calling the `Discovery.userInterest` method with the relevant entity -meta-data, the device's Aggregated Experience will be notified of the -user's interest in that entity: - -```typescript -Discovery.userInterest(type:InterestType, reason: InterestReason, entity:EntityDetails) -``` - -The `type` parameter denotes the directionality of the interest: - -- `interest` -- `disinterest` - -The `reason` parameter denotes why or how the user has expressed interest: - -| Reason | Description | -| ------ | ----------- | -| `playlist` | Interested in adding to a list | -| `reaction` | Interested in submitting a reaction, e.g. like or dislike | -| `recording` | Interest in scheduling a recording | -| `share` | Interest in sharing the content on social media | - -**NOTE**: We can remove some of these (not `playlist`) these are here for now to illustrate the purpose for the reason paramater. - -An app **MUST** `provide` the `xrn:firebolt:capability:discovery:interest` -capability in order to call `Discovery.userInterest`. - -When this method is called with a valid `EntityDetails`, the platform -**MUST** dispatch a `Content.onUserInterest` notification to all Apps -that have registered for it (typically Aggregated Experience Apps) with -information about the app, interest type, and the entity. - -The `Content.onUserInterest` event has three context parameters: - -| context | type | description | -|---------|------|-------------| -| appid | string | The id of the app that pushed the user interest. | -| type | `InterestType` | the type of interest. | -| reason | `InterestReason` | the reason for the interest | - -The `Content.onUserInterest` event has a result type of `EntityDetails`. - -An Aggregated Experience can register for the `Content.onUserInterest` -notification, and it will receive notifications when an `EntityDetails` is -returned from the active App after a `Discovery.userInterest` call is -fulfilled. - -An app **MUST** have permissions to `use` the -`xrn:firebolt:capability:discovery:interest` capability in order to -listen to the `Content.onUserInterest` notification. - -If the result is `null` or is not a valid entity, i.e. does not match -the [EntityDetails](../entities/) schema, then no `Content.onUserInterestedIn` -notification will be dispatched. - -The `Discovery.userInterest` method **SHOULD NOT** be used in place of more -specific Discovery methods, e.g. `Discovery.watchNext` or -`Discovery.watched`. These methods facilitate specific UX flows that may -have separate legal opt-outs for each user. - -The `Discovery.userInterest` method **SHOULD NOT** be called unless the user -is activating a UI element in the app, or in a second screen experience -that is communicating with the app, that implies interest of some kind. - -### 3.2. User Interest from a platform UX - -Firebolt platforms may provide a platform UX, e.g. voice or and RCU, to -express user interest in content from an active App. To facilitate this -Apps will need to be told about the user's expressed interest in their -content. - -First, the Aggregated Experience (or some app with this -capability) detects that the user is interested in something. In this -picture the interest is triggered by an RCU button, but how this occurs -is outside the scope of this document. When this happens, the Aggregated -Experience app calls `Content.requestUserInterest()`, which will trigger the -foreground app's UserInterest provider and call it's `userInterest` method -by invoking the RPC method `Discovery.onRequestUserInterest`. - -![](../../../requirements/images/specifications/intents/user-interest/media/image3.png) - -Next, the foreground app receives and responds to the request with an -EntityDetails, which is returned as the result to the pending -`Content.requestUserInterest` method: - -![](../../../requirements/images/specifications/intents/user-interest/media/image4.png) - -Once an App's callback is invoked, that app will have `interestTimeout` -milliseconds to return a value or throw an error. Values returned after -that time **MUST** be ignored. The timeout value is stored in the -device's configuration manifest. - -To be notified when a user expresses interest in the currently displayed -content, an App **MUST** provide the -`xrn:firebolt:capability:discovery:interest` capability by enabling the -`Discovery.onRequestUserInterest` notification. - -If there is a valid entity to return, then the method registered by the -App **MUST** return the currently displayed entity meta-data. - -If there is no valid entity to return, then the method **MUST** throw an -exception. - -If the foreground App returns a valid `EntityDetails` before the timeout, -then, the returned value **MUST** be used. - -If there is no app registered the an error **MUST** be returned. - -### 3.3. Upstream User Interest Intent -In some cases, e.g. a voice assistant, some upstream component will inform -the platform that the user is interested in whatever is currently being presented. - -To do this, the upstream system **MUST** send a `Interest` intent, which describes the type of and reason for the interest. - -```json -{ - "action": "interest", - "data": { - "type": "interest", - "reason": "playlist" - } -} -``` - -When a Firebolt platform receives this intent, it **SHOULD** initiate the platform's [user interest flow](#4-user-interest-from-a-platform-ux). - -### 3.4. User Interest Bulk Updates - -Sending bulk interest updates, e.g. Entities the user expressed interest -in on a different platform, is not supported. - -## 4. Core SDK APIs - -The following APIs are exposed by the Firebolt Core SDK as part of the -`Discovery` module. - -### 4.1. InterestType -This is an enum with the following values: - -- `"interest"` -- `"disinterest"` - -### 4.2. InterestReason -This is an enum with the following values: - -| Reason | Description | -| ------ | ----------- | -| `playlist` | Interested in adding to a list | -| `reaction` | Interested in submitting a reaction, e.g. like or dislike | -| `recording` | Interest in scheduling a recording | -| `share` | Interest in sharing the content on social media | - -### 4.3. Discovery.userInterest - -This is a push API that allows Apps to push entities that the user has -expressed interest in to the platform. - -To push an entity that the user is interested in pass an `EntityDetails` -object to the method: - -```typescript -Discovery.userInterest(type: InterestType, reason: InterestReason, entity: EntityDetails): Promise -``` - -### 4.4. Discovery Interest Provider -To respond to requests for the current entity, because the user has -expressed interest in some way that the platform manages, register a -provider: - -```typescript -interface IDiscoveryInterestProvider { - function userInterest(type: InterestType, reason: InterestReason): Promise -} - -Discovery.provide("xrn:firbolt:capability:discovery:interest", IDiscoveryInterestProvider) -``` - -### 4.5. InterestIntent - -An `InterestIntent` denotes that the user has expressed interest in the -currently displayed and/or selected content: - -```typescript -type InterestIntent { - action: "interest" - data: { - type: "interest" | "disinterest", - reason: "playlist" | "reaction" | "recording" - }, - context: { - source: "rcu" | "voice" - } -} -``` - -## 5. Discovery SDK APIs - -The following APIs are exposed by the Firebolt Discovery SDK as part of the -`Content` module. - -### 5.1. Content.requestUserInterest -This method triggers the corresponding Discovery provider API for the -foreground app. - -```typescript -Content.requestUserInterest(type: InterestType, reason: InterestReason): Promise -``` - -### 5.2. Content.onUserInterest - -This notification allows Aggregated Experience Apps to be informed when -a user expresses interest in some Content, and the content resolves to a -valid Entity from some App. - -`Content.listen('userInterest', UserInterestInfo => void): Promise` - -The callback will be passed an `UserInterestInfo` object with -the type, reason, and information about the entity that the user expressed interest in. +This document describes the intent to initiate a [User Interest](../discovery/user-interest.md) flow from an upstream system, e.g. a voice assistant. diff --git a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md index d725d0a41..b444690e3 100644 --- a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md +++ b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md @@ -77,7 +77,7 @@ To prevent compound methods a platform method **MUST** `use` a single capability The provider method **MUST** provide the same capability that the platform method either uses or manages. -If an platform method has no provider method then it is not a valid Firebolt OpenRPC method schema, and a validation error **MUST** be generated. +If a platform method has no provider method then it is not a valid Firebolt OpenRPC method schema, and a validation error **MUST** be generated. ### 3.2. Multiple Providers Extension Firebolt OpenRPC **MUST** support a `string` `x-multiple-providers` extension property on the `capabilities` tag that denotes a single method request may be provided by multiple apps on the device registering for the specified provider API, e.g.: @@ -119,12 +119,12 @@ When an app calls a platform method with an `x-provided-by` extension, the platf "id": 1, "error": { "code": -50300, - "message": "Capability is unavailable." + "message": "Capability is unavailable." } } ``` -**TODO**: formalize our messages and codes. +Where `` is the capability XRN string, e.g. `xrn:firebolt:capabilities:example:foo`. ### 4.2. Direct pass-through A direct pass-through is where a single app provides a single response to a single request by another app. @@ -168,6 +168,10 @@ If the platform method result `items` schema matches the `x-response` schema on Otherwise if the platform method result `items` schema has a property that matches the `x-response` schema on the provider method then each provider value **MUST** be composed into an object under the corresponding property name and the platform **MUST** apply any [result transformations](#9-result-transformations) to the composed result. +If some providers time out, the providers that did not time out **MUST** be returned, with the remaining providers omitted. + +Time out durations are out of scope for this document, and are specified on a per feature basis. + ### 4.4. Pass-through notifications Firebolt events have a synchronous subscriber registration method, e.g. `Lifecycle.onInactive(true)`, in addition to asynchronous notifications when the event actually happens. For events powered by an app pass-through, only the asynchronous notifications are passed in by the providing app. The initial event registration is handled by the platform, and the success response is not handled by the providing app. diff --git a/requirements/specifications/openrpc-extensions/lifecycle-api-gating.md b/requirements/specifications/openrpc-extensions/lifecycle-api-gating.md deleted file mode 100644 index e54972840..000000000 --- a/requirements/specifications/openrpc-extensions/lifecycle-api-gating.md +++ /dev/null @@ -1,65 +0,0 @@ -# App Pass-through APIs - -Document Status: Working Draft - -See [Firebolt Requirements Governance](../../governance.md) for more info. - -| Contributor | Organization | -|-----------------|----------------| -| Jeremy LaCivita | Comcast | -| Kevin Pearson | Comcast | - -## 1. Overview -This document describes the the `x-lifecycle` Firebolt OpenRPC extension. - -Some APIs require that they are only called when an app is in a certain Lifecycle state. - -To facilitate these APIs, Firebolt denotes an OpenRPC extension to limit the states that an app is allowed to be in when a method request is made. - -This document is written using the [IETF Best Common Practice 14](https://www.rfc-editor.org/rfc/rfc2119.txt) and should include the following summary in the Overview section: - -The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL NOT**", "**SHOULD**", "**SHOULD NOT**", "**RECOMMENDED**", "**NOT RECOMMENDED**", "**MAY**", and "**OPTIONAL**" in this document are to be interpreted as described in [BCP 14](https://www.rfc-editor.org/rfc/rfc2119.txt) [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here. - -## 2. Table of Contents -- [1. Overview](#1-overview) -- [2. Table of Contents](#2-table-of-contents) -- [3. Lifecycle Extension on the Capabilities tag](#3-lifecycle-extension-on-the-capabilities-tag) - - [Events](#events) - -## 3. Lifecycle Extension on the Capabilities tag -Firebolt OpenRPC **MUST** support an extension named `x-lifecycle` that denotes a method should not be requested when an app is in a particular state. - -The `x-lifecycle` extension **MUST** only be used on a method's `capabilities` tag. - -The `x-lifecycle` value **MUST** be an array with one or more of the following values: - - - initializing - - foreground - - background - - inactive - -If the `x-lifecycle` value is not provided, then it **MUST** default to: - -```json -[ - "initializing" - "foreground" - "background" - "inactive" -] -``` - -If a method has an `x-lifecycle` extension on the `capabilities` tag then that method **MUST NOT** return a success/result unless the app is in one of the listed lifecycle states during the time of the method request. - -If the app is not in one of the listed lifecycle states during the time of the request then the method **MUST** return an unavailable error. - -**TODO**: define the error? - -### Events -If a method with an `event` tag has the `x-lifecycle` extension set to a valid value then event notifications **MUST NOT** be sent to the app when it is not in one of the listed states during the time of the notification. - -The default behavior is that events not sent to an app due to `x-lifecycle` configuration **MUST NOT** be stored and sent to the app at a later point. - -An overriding requirement **MUST** exist in a specific feature document in order for a specific event to deviate from the default behavior. - -Registering for event notifications is possible in any lifecycle state and **MUST NOT** be prevented by a method's `x-lifecycle` value. diff --git a/src/openrpc/content.json b/src/openrpc/content.json index 65297ed58..7c2884db0 100644 --- a/src/openrpc/content.json +++ b/src/openrpc/content.json @@ -283,8 +283,8 @@ ] } ], - "summary": "Provide information about a program entity and its available watchable assets, such as entitlement status and price, via either a push or pull call flow.", - "description": "Provide information about a program entity and its available watchable assets, such as entitlement status and price, via either a push or pull call flow. Includes information about the program entity and its relevant associated entities, such as extras, previews, and, in the case of TV series, seasons and episodes.\n\nSee the `EntityInfo` and `WayToWatch` data structures below for more information.\n\nThe app only needs to implement Pull support for `entityInfo` at this time.", + "summary": "Provide information about the entity currently displayed or selected on the screen.", + "description": "Provide information about the entity currently displayed or selected on the screen.", "params": [ { "name": "type", diff --git a/src/sdks/discovery/sdk.config.json b/src/sdks/discovery/sdk.config.json index a610c6442..5d1bd42b3 100644 --- a/src/sdks/discovery/sdk.config.json +++ b/src/sdks/discovery/sdk.config.json @@ -6,7 +6,6 @@ { "module": "Content", "use": [ - "xrn:firebolt:capability:discovery:providers", "xrn:firebolt:capability:discovery:purchased-content", "xrn:firebolt:capability:discovery:entity-info", "xrn:firebolt:capability:discovery:user-interest" From 8446bc4be29493d6a8f3dc6c5117da290120722e Mon Sep 17 00:00:00 2001 From: "Shah, Kevin" Date: Tue, 14 May 2024 20:03:31 -0400 Subject: [PATCH 34/54] Debug discovery-sdk issue --- .github/workflows/release-github.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-github.yml b/.github/workflows/release-github.yml index 897303fae..087dd96aa 100644 --- a/.github/workflows/release-github.yml +++ b/.github/workflows/release-github.yml @@ -96,7 +96,7 @@ jobs: run: | npm --version echo "NPM DIST TAG :: " $NPM_DIST_TAG - npm publish --tag $NPM_DIST_TAG --workspaces + npm publish --tag $NPM_DIST_TAG --workspaces --verbose - name: Dry-run Firebolt SDKs to NPM if: steps.check_build.outputs.files_exists == 'true' && (github.ref_name == 'main' && github.event_name != 'workflow_dispatch') env: From 6ecf4a364f9b901bf63be6c2726eb042a9c03c4d Mon Sep 17 00:00:00 2001 From: "Shah, Kevin" Date: Tue, 14 May 2024 20:07:31 -0400 Subject: [PATCH 35/54] Debug discovery-sdk issue --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0e50bf451..f38fe071a 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "devDependencies": { "@commitlint/cli": "^17.0.3", "@commitlint/config-conventional": "^17.0.3", - "@firebolt-js/openrpc": "../firebolt-openrpc", + "@firebolt-js/openrpc": "rdkcentral/firebolt-openrpc#feature/app-pass-through", "@firebolt-js/schemas": "2.0.0", "@saithodev/semantic-release-backmerge": "^3.2.0", "@semantic-release/changelog": "^6.0.1", From 5f4af43c029fd4505423fd9f83c6600a28e9c2cd Mon Sep 17 00:00:00 2001 From: "Shah, Kevin" Date: Tue, 14 May 2024 20:14:28 -0400 Subject: [PATCH 36/54] Debug discovery-sdk issue - changed openrpc dependency --- package-lock.json | 2619 +++++++++++++++++++++++++++------------------ 1 file changed, 1561 insertions(+), 1058 deletions(-) diff --git a/package-lock.json b/package-lock.json index e1f34d496..0f64b14c1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "devDependencies": { "@commitlint/cli": "^17.0.3", "@commitlint/config-conventional": "^17.0.3", - "@firebolt-js/openrpc": "../firebolt-openrpc", + "@firebolt-js/openrpc": "rdkcentral/firebolt-openrpc#feature/app-pass-through", "@firebolt-js/schemas": "2.0.0", "@saithodev/semantic-release-backmerge": "^3.2.0", "@semantic-release/changelog": "^6.0.1", @@ -37,169 +37,57 @@ "typescript": "^4.6.4" } }, - "../firebolt-openrpc": { - "name": "@firebolt-js/openrpc", - "version": "2.3.0-next.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "ajv": "^8.12.0", - "ajv-formats": "^2.1.1", - "array.prototype.groupby": "^1.1.0", - "crocks": "^0.12.4", - "deepmerge": "^4.2.2", - "fs-extra": "^10.1.0", - "highland": "^2.13.5", - "mkdirp": "^0.5.6", - "node-fetch": "^3.2.10", - "nopt": "^5.0.0", - "util": "^0.12.4" - }, - "bin": { - "firebolt-openrpc": "src/cli.mjs" - }, - "devDependencies": { - "@commitlint/cli": "^17.1.2", - "@commitlint/config-conventional": "^17.1.0", - "@semantic-release/changelog": "^6.0.1", - "@semantic-release/git": "^10.0.1", - "@semantic-release/npm": "^9.0.1", - "husky": "^8.0.1", - "jest": "^27.3.1", - "semantic-release": "^19.0.5" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/compat-data": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", - "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", - "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", + "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.0", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.24.5", + "@babel/helpers": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -230,14 +118,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", + "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -245,14 +133,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -304,28 +192,28 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", - "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", + "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-simple-access": "^7.24.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -335,88 +223,89 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", + "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", + "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", - "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", + "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", + "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.5", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -494,9 +383,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -653,12 +542,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", - "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", + "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -668,34 +557,34 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", + "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/types": "^7.24.5", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -703,13 +592,13 @@ } }, "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -782,15 +671,15 @@ } }, "node_modules/@commitlint/config-validator/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -1107,8 +996,95 @@ "link": true }, "node_modules/@firebolt-js/openrpc": { - "resolved": "../firebolt-openrpc", - "link": true + "version": "3.0.0-next.1", + "resolved": "git+ssh://git@github.com/rdkcentral/firebolt-openrpc.git#76db0a471edc7b1e0edbb58f20bb8c7fd7da49df", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "ajv": "^8.12.0", + "ajv-formats": "^2.1.1", + "array.prototype.groupby": "^1.1.0", + "crocks": "^0.12.4", + "deepmerge": "^4.2.2", + "fs-extra": "^10.1.0", + "highland": "^2.13.5", + "mkdirp": "^0.5.6", + "node-fetch": "^3.2.10", + "nopt": "^5.0.0", + "util": "^0.12.4" + }, + "bin": { + "firebolt-openrpc": "src/cli.mjs" + } + }, + "node_modules/@firebolt-js/openrpc/node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/@firebolt-js/openrpc/node_modules/ajv": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@firebolt-js/openrpc/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@firebolt-js/openrpc/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/@firebolt-js/openrpc/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/@firebolt-js/openrpc/node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } }, "node_modules/@firebolt-js/schemas": { "version": "2.0.0", @@ -1122,15 +1098,15 @@ } }, "node_modules/@firebolt-js/schemas/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -1526,32 +1502,32 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" @@ -1564,9 +1540,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1618,16 +1594,16 @@ } }, "node_modules/@octokit/core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.0.1.tgz", - "integrity": "sha512-lyeeeZyESFo+ffI801SaBKmCfsvarO+dgV8/0gD8u1d87clbEdWsP5yC+dSj3zLhb2eIf5SJrn6vDz9AheETHw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.0.tgz", + "integrity": "sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==", "dev": true, "dependencies": { "@octokit/auth-token": "^4.0.0", - "@octokit/graphql": "^7.0.0", - "@octokit/request": "^8.0.2", - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^12.0.0", + "@octokit/graphql": "^7.1.0", + "@octokit/request": "^8.3.1", + "@octokit/request-error": "^5.1.0", + "@octokit/types": "^13.0.0", "before-after-hook": "^2.2.0", "universal-user-agent": "^6.0.0" }, @@ -1636,13 +1612,12 @@ } }, "node_modules/@octokit/endpoint": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.2.tgz", - "integrity": "sha512-qhKW8YLIi+Kmc92FQUFGr++DYtkx/1fBv+Thua6baqnjnOsgBYJDCvWZR1YcINuHGOEQt416WOfE+A/oG60NBQ==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.5.tgz", + "integrity": "sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==", "dev": true, "dependencies": { - "@octokit/types": "^12.0.0", - "is-plain-object": "^5.0.0", + "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" }, "engines": { @@ -1650,13 +1625,13 @@ } }, "node_modules/@octokit/graphql": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.0.2.tgz", - "integrity": "sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.0.tgz", + "integrity": "sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==", "dev": true, "dependencies": { - "@octokit/request": "^8.0.1", - "@octokit/types": "^12.0.0", + "@octokit/request": "^8.3.0", + "@octokit/types": "^13.0.0", "universal-user-agent": "^6.0.0" }, "engines": { @@ -1664,24 +1639,39 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "19.0.2", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.0.2.tgz", - "integrity": "sha512-8li32fUDUeml/ACRp/njCWTsk5t17cfTM1jp9n08pBrqs5cDFJubtjsSnuz56r5Tad6jdEPJld7LxNp9dNcyjQ==", + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", + "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==", "dev": true }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.1.2.tgz", - "integrity": "sha512-euDbNV6fxX6btsCDnZoZM4vw3zO1nj1Z7TskHAulO6mZ9lHoFTpwll6farf+wh31mlBabgU81bBYdflp0GLVAQ==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.1.tgz", + "integrity": "sha512-wfGhE/TAkXZRLjksFXuDZdmGnJQHvtU/joFQdweXUgzo1XwvBCD4o4+75NtFfjfLK5IwLf9vHTfSiU3sLRYpRw==", "dev": true, "dependencies": { - "@octokit/types": "^12.1.1" + "@octokit/types": "^12.6.0" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "@octokit/core": ">=5" + "@octokit/core": "5" + } + }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", + "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==", + "dev": true + }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", + "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^20.0.0" } }, "node_modules/@octokit/plugin-retry": { @@ -1701,13 +1691,28 @@ "@octokit/core": ">=5" } }, + "node_modules/@octokit/plugin-retry/node_modules/@octokit/openapi-types": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", + "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==", + "dev": true + }, + "node_modules/@octokit/plugin-retry/node_modules/@octokit/types": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", + "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^20.0.0" + } + }, "node_modules/@octokit/plugin-throttling": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-8.1.2.tgz", - "integrity": "sha512-oFba+ioR6HGb0fgqxMta7Kpk/MdffUTuUxNY856l1nXPvh7Qggp8w4AksRx1SDA8SGd+4cbrpkY4k1J/Xz8nZQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-8.2.0.tgz", + "integrity": "sha512-nOpWtLayKFpgqmgD0y3GqXafMFuKcA4tRPZIfu7BArd2lEZeb1988nhWhwx4aZWmjDmUfdgVf7W+Tt4AmvRmMQ==", "dev": true, "dependencies": { - "@octokit/types": "^12.0.0", + "@octokit/types": "^12.2.0", "bottleneck": "^2.15.3" }, "engines": { @@ -1717,16 +1722,30 @@ "@octokit/core": "^5.0.0" } }, + "node_modules/@octokit/plugin-throttling/node_modules/@octokit/openapi-types": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", + "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==", + "dev": true + }, + "node_modules/@octokit/plugin-throttling/node_modules/@octokit/types": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", + "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^20.0.0" + } + }, "node_modules/@octokit/request": { - "version": "8.1.4", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.4.tgz", - "integrity": "sha512-M0aaFfpGPEKrg7XoA/gwgRvc9MSXHRO2Ioki1qrPDbl1e9YhjIwVoHE7HIKmv/m3idzldj//xBujcFNqGX6ENA==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.0.tgz", + "integrity": "sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==", "dev": true, "dependencies": { - "@octokit/endpoint": "^9.0.0", - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^12.0.0", - "is-plain-object": "^5.0.0", + "@octokit/endpoint": "^9.0.1", + "@octokit/request-error": "^5.1.0", + "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" }, "engines": { @@ -1734,12 +1753,12 @@ } }, "node_modules/@octokit/request-error": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.1.tgz", - "integrity": "sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.0.tgz", + "integrity": "sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==", "dev": true, "dependencies": { - "@octokit/types": "^12.0.0", + "@octokit/types": "^13.1.0", "deprecation": "^2.0.0", "once": "^1.4.0" }, @@ -1748,12 +1767,12 @@ } }, "node_modules/@octokit/types": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.1.1.tgz", - "integrity": "sha512-qnJTldJ1NyGT5MTsCg/Zi+y2IFHZ1Jo5+njNCjJ9FcainV7LjuHgmB697kA0g4MjZeDAJsM3B45iqCVsCLVFZg==", + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz", + "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==", "dev": true, "dependencies": { - "@octokit/openapi-types": "^19.0.2" + "@octokit/openapi-types": "^22.2.0" } }, "node_modules/@pnpm/config.env-replace": { @@ -1958,9 +1977,9 @@ } }, "node_modules/@semantic-release/github": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-9.2.1.tgz", - "integrity": "sha512-fEn9uOe6jwWR6ro2Wh6YNBCBuZ5lRi8Myz+1j3KDTSt8OuUGlpVM4lFac/0bDrql2NOKrIEAMGCfWb9WMIdzIg==", + "version": "9.2.6", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-9.2.6.tgz", + "integrity": "sha512-shi+Lrf6exeNZF+sBhK+P011LSbhmIAoUEgEY6SsxF8irJ+J2stwI5jkyDQ+4gzYyDImzV6LCKdYB9FXnQRWKA==", "dev": true, "dependencies": { "@octokit/core": "^5.0.0", @@ -1971,13 +1990,13 @@ "aggregate-error": "^5.0.0", "debug": "^4.3.4", "dir-glob": "^3.0.1", - "globby": "^13.1.4", + "globby": "^14.0.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", "issue-parser": "^6.0.0", "lodash-es": "^4.17.21", - "mime": "^3.0.0", - "p-filter": "^3.0.0", + "mime": "^4.0.0", + "p-filter": "^4.0.0", "url-join": "^5.0.0" }, "engines": { @@ -1997,9 +2016,9 @@ } }, "node_modules/@semantic-release/github/node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, "dependencies": { "debug": "^4.3.4" @@ -2040,9 +2059,9 @@ } }, "node_modules/@semantic-release/github/node_modules/http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "dependencies": { "agent-base": "^7.1.0", @@ -2053,9 +2072,9 @@ } }, "node_modules/@semantic-release/github/node_modules/https-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", "dev": true, "dependencies": { "agent-base": "^7.0.2", @@ -2167,6 +2186,18 @@ "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", "dev": true }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@sinonjs/commons": { "version": "1.8.6", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", @@ -2195,9 +2226,9 @@ } }, "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", "dev": true }, "node_modules/@tsconfig/node12": { @@ -2219,9 +2250,9 @@ "dev": true }, "node_modules/@types/babel__core": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.3.tgz", - "integrity": "sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -2232,18 +2263,18 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.6", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.6.tgz", - "integrity": "sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==", + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.3.tgz", - "integrity": "sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -2251,42 +2282,42 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.3.tgz", - "integrity": "sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" } }, "node_modules/@types/graceful-fs": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.8.tgz", - "integrity": "sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true }, "node_modules/@types/istanbul-lib-report": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz", - "integrity": "sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz", - "integrity": "sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" @@ -2310,9 +2341,9 @@ "dev": true }, "node_modules/@types/minimist": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.4.tgz", - "integrity": "sha512-Kfe/D3hxHTusnPNRbycJE1N77WHDsdS4AjUYIzlDzhDrS47NrwuL3YW4VITxwR7KCVpzwgy4Rbj829KSSQmwXQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", "dev": true }, "node_modules/@types/node": { @@ -2322,9 +2353,9 @@ "dev": true }, "node_modules/@types/normalize-package-data": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.3.tgz", - "integrity": "sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true }, "node_modules/@types/parse5": { @@ -2340,36 +2371,37 @@ "dev": true }, "node_modules/@types/stack-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.2.tgz", - "integrity": "sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true }, "node_modules/@types/tough-cookie": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.4.tgz", - "integrity": "sha512-95Sfz4nvMAb0Nl9DTxN3j64adfwfbBPEYq14VN7zT5J5O2M9V6iZMIIQU1U+pJyl9agHYHNCqhCXgyEtIRRa5A==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", "dev": true }, "node_modules/@types/yargs": { - "version": "17.0.30", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.30.tgz", - "integrity": "sha512-3SJLzYk3yz3EgI9I8OLoH06B3PdXIoU2imrBZzaGqUtUXf5iUNDtmAfCGuQrny1bnmyjh/GM/YNts6WK5jR5Rw==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.2", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.2.tgz", - "integrity": "sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", "dev": true }, "node_modules/abbrev": { @@ -2382,9 +2414,9 @@ } }, "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -2492,15 +2524,15 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -2599,13 +2631,16 @@ "dev": true }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2618,15 +2653,16 @@ "dev": true }, "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -2681,18 +2717,33 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "node_modules/array.prototype.groupby": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array.prototype.groupby/-/array.prototype.groupby-1.1.0.tgz", + "integrity": "sha512-p+QtvmnNEBqajQWLG3kPls8cLPBfJgvayzc/qplsX8Vchtevtq+TR2gyav5xs5h+mdUjfgOvYoCdTsVxu3b5sA==", + "deprecated": "This proposal has been altered; please use https://npmjs.com/object.groupby instead!", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.1" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" }, "engines": { @@ -2727,10 +2778,13 @@ "dev": true }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -2876,9 +2930,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "funding": [ { @@ -2895,9 +2949,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, "bin": { @@ -2923,14 +2977,19 @@ "dev": true }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2972,9 +3031,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001561", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", - "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", + "version": "1.0.30001618", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001618.tgz", + "integrity": "sha512-p407+D1tIkDvsEAPS22lJxLQQaG8OTBEqo0KhzfABGk0TU4juBNDSfH0hyAp/HRyx+M8L17z/ltyhxh27FTfQg==", "dev": true, "funding": [ { @@ -3045,9 +3104,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", "dev": true }, "node_modules/clean-stack": { @@ -3060,9 +3119,9 @@ } }, "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", "dev": true, "dependencies": { "string-width": "^4.2.0" @@ -3306,6 +3365,12 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "node_modules/crocks": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/crocks/-/crocks-0.12.4.tgz", + "integrity": "sha512-paln6xJUrR9e/OWMFsyTi4dLyr+q99C5f7PQbGgSDHtwsfW0sCNZvnpHzvniI2dAE0uoBgeIP1Ukmme8Z0HxxA==", + "dev": true + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -3362,6 +3427,15 @@ "node": ">=8" } }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, "node_modules/data-urls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", @@ -3389,6 +3463,57 @@ "node": ">=12" } }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/dateformat": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", @@ -3486,17 +3611,20 @@ } }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-properties": { @@ -3643,6 +3771,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "deprecated": "Use your platform's native DOMException instead", "dev": true, "dependencies": { "webidl-conversions": "^7.0.0" @@ -3673,9 +3802,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.576", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.576.tgz", - "integrity": "sha512-yXsZyXJfAqzWk1WKryr0Wl0MN2D47xodPvEEwlVePBnhU5E7raevLQR+E6b9JAD3GfL/7MbAL9ZtWQQPcLx7wA==", + "version": "1.4.768", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.768.tgz", + "integrity": "sha512-z2U3QcvNuxdkk33YV7R1bVMNq7fL23vq3WfO5BHcqrm4TnDGReouBfYKLEFh5umoK1XACjEwp8mmnhXk2EJigw==", "dev": true }, "node_modules/emittery": { @@ -3779,9 +3908,9 @@ } }, "node_modules/env-ci/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "dependencies": { "path-key": "^4.0.0" @@ -3842,50 +3971,57 @@ } }, "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -3894,15 +4030,48 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -3935,9 +4104,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, "engines": { "node": ">=6" @@ -4101,9 +4270,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -4714,9 +4883,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -4731,6 +4900,29 @@ "bser": "2.1.1" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/figures": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", @@ -4803,9 +4995,9 @@ } }, "node_modules/flat-cache": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", - "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { "flatted": "^3.2.9", @@ -4813,13 +5005,13 @@ "rimraf": "^3.0.2" }, "engines": { - "node": ">=12.0.0" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/for-each": { @@ -4845,6 +5037,18 @@ "node": ">= 6" } }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -4856,9 +5060,9 @@ } }, "node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -4950,16 +5154,20 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4998,13 +5206,14 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -5119,12 +5328,13 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -5134,28 +5344,29 @@ } }, "node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz", + "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==", "dev": true, "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "node_modules/globby/node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", "dev": true, "engines": { "node": ">=12" @@ -5164,6 +5375,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globby/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -5240,21 +5463,21 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, "engines": { "node": ">= 0.4" @@ -5276,12 +5499,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -5291,9 +5514,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "dependencies": { "function-bind": "^1.1.2" @@ -5302,6 +5525,15 @@ "node": ">= 0.4" } }, + "node_modules/highland": { + "version": "2.13.5", + "resolved": "https://registry.npmjs.org/highland/-/highland-2.13.5.tgz", + "integrity": "sha512-dn2flPapIIAa4BtkB2ahjshg8iSJtrJtdhEb9/oiOrS5HMQTR/GuhFpqJ+11YBdtnl3AwWKvbZd1Uxr8uAmA7A==", + "dev": true, + "dependencies": { + "util-deprecate": "^1.0.2" + } + }, "node_modules/hook-std": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", @@ -5426,9 +5658,9 @@ } }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" @@ -5531,12 +5763,12 @@ "dev": true }, "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", + "es-errors": "^1.3.0", "hasown": "^2.0.0", "side-channel": "^1.0.4" }, @@ -5560,15 +5792,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5632,6 +5882,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -5674,6 +5939,21 @@ "node": ">=6" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -5687,9 +5967,9 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -5758,15 +6038,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -5790,12 +6061,15 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5856,12 +6130,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "dependencies": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -5923,9 +6197,9 @@ } }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.1.tgz", - "integrity": "sha512-opCrKqbthmq3SKZ10mFMQG9dk3fTa3quaOLD35kJa5ejwZHd9xAr+kLuziiZz2cG32s4lMZxNdmdcEQnTDP4+g==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "engines": { "node": ">=8" @@ -5985,9 +6259,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -7067,13 +7341,10 @@ } }, "node_modules/marked-terminal/node_modules/ansi-escapes": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", - "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", + "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", "dev": true, - "dependencies": { - "type-fest": "^3.0.0" - }, "engines": { "node": ">=14.16" }, @@ -7093,18 +7364,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/marked-terminal/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/meow": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", @@ -7171,15 +7430,18 @@ } }, "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.3.tgz", + "integrity": "sha512-KgUb15Oorc0NEKPbvfa0wRU+PItIEZmiv+pyAO2i0oTIVTJhlzMclU7w4RXWQrSOVH5ax/p/CkIO7KI4OyFJTQ==", "dev": true, + "funding": [ + "https://github.com/sponsors/broofa" + ], "bin": { - "mime": "cli.js" + "mime": "bin/cli.js" }, "engines": { - "node": ">=10.0.0" + "node": ">=16" } }, "node_modules/mime-db": { @@ -7304,6 +7566,25 @@ "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", "dev": true }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-emoji": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", @@ -7313,6 +7594,24 @@ "lodash": "^4.17.21" } }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -7320,15 +7619,15 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, "node_modules/nopt": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", - "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", "dev": true, "dependencies": { "abbrev": "^2.0.0" @@ -9955,9 +10254,9 @@ "license": "ISC" }, "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.10.tgz", + "integrity": "sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==", "dev": true }, "node_modules/object-assign": { @@ -9988,13 +10287,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -10006,28 +10305,29 @@ } }, "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -10037,27 +10337,31 @@ } }, "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", + "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", "dev": true, "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -10091,17 +10395,17 @@ } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -10120,15 +10424,15 @@ } }, "node_modules/p-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-3.0.0.tgz", - "integrity": "sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-4.1.0.tgz", + "integrity": "sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==", "dev": true, "dependencies": { - "p-map": "^5.1.0" + "p-map": "^7.0.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -10174,58 +10478,12 @@ } }, "node_modules/p-map": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", - "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", - "dev": true, - "dependencies": { - "aggregate-error": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map/node_modules/aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "dev": true, - "dependencies": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map/node_modules/clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.2.tgz", + "integrity": "sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q==", "dev": true, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -10328,9 +10586,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "node_modules/picomatch": { @@ -10586,6 +10844,15 @@ "node": ">=4" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -10596,9 +10863,9 @@ } }, "node_modules/prettier": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", - "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -10777,9 +11044,9 @@ } }, "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true }, "node_modules/read-pkg": { @@ -10949,14 +11216,15 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -11121,13 +11389,13 @@ } }, "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -11151,15 +11419,18 @@ "dev": true }, "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -11479,9 +11750,9 @@ } }, "node_modules/semantic-release/node_modules/hosted-git-info": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", - "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, "dependencies": { "lru-cache": "^10.0.1" @@ -11552,18 +11823,18 @@ } }, "node_modules/semantic-release/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/semantic-release/node_modules/lines-and-columns": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", - "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", "dev": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -11585,9 +11856,9 @@ } }, "node_modules/semantic-release/node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", "dev": true, "engines": { "node": "14 || >=16.14" @@ -11606,9 +11877,9 @@ } }, "node_modules/semantic-release/node_modules/normalize-package-data": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", - "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.1.tgz", + "integrity": "sha512-6rvCfeRW+OEZagAB4lMLSNuTNYZWLVtKccK79VSTf//yTY5VOCgcpH80O+bZK8Neps7pUnd5G+QlMg1yV/2iZQ==", "dev": true, "dependencies": { "hosted-git-info": "^7.0.0", @@ -11621,9 +11892,9 @@ } }, "node_modules/semantic-release/node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", + "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", "dev": true, "engines": { "node": ">=14.16" @@ -11633,9 +11904,9 @@ } }, "node_modules/semantic-release/node_modules/npm": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/npm/-/npm-9.9.0.tgz", - "integrity": "sha512-wkd7sjz4KmdmddYQcd0aTP73P1cEuPlekeulz4jTDeMVx/Zo5XZ5KQ1z3eUzV3Q/WZpEO0NJXTrD5FNFe6fhCA==", + "version": "9.9.3", + "resolved": "https://registry.npmjs.org/npm/-/npm-9.9.3.tgz", + "integrity": "sha512-Z1l+rcQ5kYb17F3hHtO601arEpvdRYnCLtg8xo3AGtyj3IthwaraEOexI9903uANkifFbqHC8hT53KIrozWg8A==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -11720,21 +11991,21 @@ "@npmcli/run-script": "^6.0.2", "abbrev": "^2.0.0", "archy": "~1.0.0", - "cacache": "^17.1.3", + "cacache": "^17.1.4", "chalk": "^5.3.0", - "ci-info": "^3.8.0", + "ci-info": "^4.0.0", "cli-columns": "^4.0.0", "cli-table3": "^0.6.3", "columnify": "^1.6.0", "fastest-levenshtein": "^1.0.16", - "fs-minipass": "^3.0.2", - "glob": "^10.2.7", + "fs-minipass": "^3.0.3", + "glob": "^10.3.10", "graceful-fs": "^4.2.11", "hosted-git-info": "^6.1.1", "ini": "^4.1.1", "init-package-json": "^5.0.0", "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^3.0.0", + "json-parse-even-better-errors": "^3.0.1", "libnpmaccess": "^7.0.2", "libnpmdiff": "^5.0.20", "libnpmexec": "^6.0.4", @@ -11742,20 +12013,20 @@ "libnpmhook": "^9.0.3", "libnpmorg": "^5.0.4", "libnpmpack": "^5.0.20", - "libnpmpublish": "^7.5.0", + "libnpmpublish": "^7.5.1", "libnpmsearch": "^6.0.2", "libnpmteam": "^5.0.3", "libnpmversion": "^4.0.2", "make-fetch-happen": "^11.1.1", "minimatch": "^9.0.3", - "minipass": "^5.0.0", + "minipass": "^7.0.4", "minipass-pipeline": "^1.2.4", "ms": "^2.1.2", - "node-gyp": "^9.4.0", + "node-gyp": "^9.4.1", "nopt": "^7.2.0", "normalize-package-data": "^5.0.0", "npm-audit-report": "^5.0.0", - "npm-install-checks": "^6.2.0", + "npm-install-checks": "^6.3.0", "npm-package-arg": "^10.1.0", "npm-pick-manifest": "^8.0.2", "npm-profile": "^7.0.1", @@ -11768,12 +12039,12 @@ "proc-log": "^3.0.0", "qrcode-terminal": "^0.12.0", "read": "^2.1.0", - "semver": "^7.5.4", + "semver": "^7.6.0", "sigstore": "^1.9.0", "spdx-expression-parse": "^3.0.1", - "ssri": "^10.0.4", + "ssri": "^10.0.5", "supports-color": "^9.4.0", - "tar": "^6.1.15", + "tar": "^6.2.0", "text-table": "~0.2.0", "tiny-relative-date": "^1.3.0", "treeverse": "^3.0.0", @@ -11790,9 +12061,9 @@ } }, "node_modules/semantic-release/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "dependencies": { "path-key": "^4.0.0" @@ -11814,6 +12085,12 @@ "node": ">=0.1.90" } }, + "node_modules/semantic-release/node_modules/npm/node_modules/@gar/promisify": { + "version": "1.1.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, "node_modules/semantic-release/node_modules/npm/node_modules/@isaacs/cliui": { "version": "8.0.2", "dev": true, @@ -11888,7 +12165,7 @@ "license": "ISC" }, "node_modules/semantic-release/node_modules/npm/node_modules/@npmcli/arborist": { - "version": "6.5.0", + "version": "6.5.1", "dev": true, "inBundle": true, "license": "ISC", @@ -11901,7 +12178,7 @@ "@npmcli/name-from-folder": "^2.0.0", "@npmcli/node-gyp": "^3.0.0", "@npmcli/package-json": "^4.0.0", - "@npmcli/query": "^3.0.0", + "@npmcli/query": "^3.1.0", "@npmcli/run-script": "^6.0.0", "bin-links": "^4.0.1", "cacache": "^17.0.4", @@ -11935,13 +12212,13 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/@npmcli/config": { - "version": "6.4.0", + "version": "6.4.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/map-workspaces": "^3.0.2", - "ci-info": "^3.8.0", + "ci-info": "^4.0.0", "ini": "^4.1.0", "nopt": "^7.0.0", "proc-log": "^3.0.0", @@ -12042,6 +12319,19 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/semantic-release/node_modules/npm/node_modules/@npmcli/move-file": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/semantic-release/node_modules/npm/node_modules/@npmcli/name-from-folder": { "version": "2.0.0", "dev": true, @@ -12091,7 +12381,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/@npmcli/query": { - "version": "3.0.0", + "version": "3.1.0", "dev": true, "inBundle": true, "license": "ISC", @@ -12216,18 +12506,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/semantic-release/node_modules/npm/node_modules/abort-controller": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/semantic-release/node_modules/npm/node_modules/agent-base": { "version": "6.0.2", "dev": true, @@ -12241,13 +12519,11 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/agentkeepalive": { - "version": "4.3.0", + "version": "4.5.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "debug": "^4.1.0", - "depd": "^2.0.0", "humanize-ms": "^1.2.1" }, "engines": { @@ -12304,14 +12580,10 @@ "license": "MIT" }, "node_modules/semantic-release/node_modules/npm/node_modules/are-we-there-yet": { - "version": "4.0.0", + "version": "4.0.2", "dev": true, "inBundle": true, "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^4.1.0" - }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -12322,28 +12594,8 @@ "inBundle": true, "license": "MIT" }, - "node_modules/semantic-release/node_modules/npm/node_modules/base64-js": { - "version": "1.5.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, "node_modules/semantic-release/node_modules/npm/node_modules/bin-links": { - "version": "4.0.2", + "version": "4.0.3", "dev": true, "inBundle": true, "license": "ISC", @@ -12375,30 +12627,6 @@ "balanced-match": "^1.0.0" } }, - "node_modules/semantic-release/node_modules/npm/node_modules/buffer": { - "version": "6.0.3", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/semantic-release/node_modules/npm/node_modules/builtins": { "version": "5.0.1", "dev": true, @@ -12409,7 +12637,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/cacache": { - "version": "17.1.3", + "version": "17.1.4", "dev": true, "inBundle": true, "license": "ISC", @@ -12418,7 +12646,7 @@ "fs-minipass": "^3.0.0", "glob": "^10.2.2", "lru-cache": "^7.7.1", - "minipass": "^5.0.0", + "minipass": "^7.0.3", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", @@ -12453,7 +12681,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/ci-info": { - "version": "3.8.0", + "version": "4.0.0", "dev": true, "funding": [ { @@ -12526,7 +12754,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/cmd-shim": { - "version": "6.0.1", + "version": "6.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -12674,17 +12902,8 @@ "inBundle": true, "license": "MIT" }, - "node_modules/semantic-release/node_modules/npm/node_modules/depd": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/semantic-release/node_modules/npm/node_modules/diff": { - "version": "5.1.0", + "version": "5.2.0", "dev": true, "inBundle": true, "license": "BSD-3-Clause", @@ -12729,24 +12948,6 @@ "inBundle": true, "license": "MIT" }, - "node_modules/semantic-release/node_modules/npm/node_modules/event-target-shim": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/semantic-release/node_modules/npm/node_modules/events": { - "version": "3.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, "node_modules/semantic-release/node_modules/npm/node_modules/exponential-backoff": { "version": "3.1.1", "dev": true, @@ -12779,12 +12980,12 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/fs-minipass": { - "version": "3.0.2", + "version": "3.0.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "minipass": "^5.0.0" + "minipass": "^7.0.3" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -12797,10 +12998,13 @@ "license": "ISC" }, "node_modules/semantic-release/node_modules/npm/node_modules/function-bind": { - "version": "1.1.1", + "version": "1.1.2", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/semantic-release/node_modules/npm/node_modules/gauge": { "version": "5.0.1", @@ -12822,19 +13026,19 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/glob": { - "version": "10.2.7", + "version": "10.3.10", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", + "jackspeak": "^2.3.5", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2", - "path-scurry": "^1.7.0" + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" }, "bin": { - "glob": "dist/cjs/src/bin.js" + "glob": "dist/esm/bin.mjs" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -12849,24 +13053,24 @@ "inBundle": true, "license": "ISC" }, - "node_modules/semantic-release/node_modules/npm/node_modules/has": { - "version": "1.0.3", + "node_modules/semantic-release/node_modules/npm/node_modules/has-unicode": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/semantic-release/node_modules/npm/node_modules/hasown": { + "version": "2.0.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.1" + "function-bind": "^1.1.2" }, "engines": { - "node": ">= 0.4.0" + "node": ">= 0.4" } }, - "node_modules/semantic-release/node_modules/npm/node_modules/has-unicode": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, "node_modules/semantic-release/node_modules/npm/node_modules/hosted-git-info": { "version": "6.1.1", "dev": true, @@ -12934,28 +13138,8 @@ "node": ">=0.10.0" } }, - "node_modules/semantic-release/node_modules/npm/node_modules/ieee754": { - "version": "1.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "BSD-3-Clause" - }, "node_modules/semantic-release/node_modules/npm/node_modules/ignore-walk": { - "version": "6.0.3", + "version": "6.0.4", "dev": true, "inBundle": true, "license": "ISC", @@ -12984,6 +13168,12 @@ "node": ">=8" } }, + "node_modules/semantic-release/node_modules/npm/node_modules/infer-owner": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "ISC" + }, "node_modules/semantic-release/node_modules/npm/node_modules/inflight": { "version": "1.0.6", "dev": true, @@ -13027,11 +13217,24 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/semantic-release/node_modules/npm/node_modules/ip": { - "version": "2.0.0", + "node_modules/semantic-release/node_modules/npm/node_modules/ip-address": { + "version": "9.0.5", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/semantic-release/node_modules/npm/node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "dev": true, + "inBundle": true, + "license": "BSD-3-Clause" }, "node_modules/semantic-release/node_modules/npm/node_modules/ip-regex": { "version": "4.3.0", @@ -13055,12 +13258,12 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/is-core-module": { - "version": "2.12.1", + "version": "2.13.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -13088,7 +13291,7 @@ "license": "ISC" }, "node_modules/semantic-release/node_modules/npm/node_modules/jackspeak": { - "version": "2.2.1", + "version": "2.3.6", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", @@ -13105,8 +13308,14 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/semantic-release/node_modules/npm/node_modules/jsbn": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, "node_modules/semantic-release/node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", + "version": "3.0.1", "dev": true, "inBundle": true, "license": "MIT", @@ -13145,7 +13354,7 @@ "license": "MIT" }, "node_modules/semantic-release/node_modules/npm/node_modules/libnpmaccess": { - "version": "7.0.2", + "version": "7.0.3", "dev": true, "inBundle": true, "license": "ISC", @@ -13158,7 +13367,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/libnpmdiff": { - "version": "5.0.20", + "version": "5.0.21", "dev": true, "inBundle": true, "license": "ISC", @@ -13178,14 +13387,14 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/libnpmexec": { - "version": "6.0.4", + "version": "6.0.5", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/arborist": "^6.5.0", "@npmcli/run-script": "^6.0.0", - "ci-info": "^3.7.1", + "ci-info": "^4.0.0", "npm-package-arg": "^10.1.0", "npmlog": "^7.0.1", "pacote": "^15.0.8", @@ -13200,7 +13409,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/libnpmfund": { - "version": "4.2.1", + "version": "4.2.2", "dev": true, "inBundle": true, "license": "ISC", @@ -13212,7 +13421,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/libnpmhook": { - "version": "9.0.3", + "version": "9.0.4", "dev": true, "inBundle": true, "license": "ISC", @@ -13225,7 +13434,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/libnpmorg": { - "version": "5.0.4", + "version": "5.0.5", "dev": true, "inBundle": true, "license": "ISC", @@ -13238,7 +13447,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/libnpmpack": { - "version": "5.0.20", + "version": "5.0.21", "dev": true, "inBundle": true, "license": "ISC", @@ -13253,12 +13462,12 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/libnpmpublish": { - "version": "7.5.0", + "version": "7.5.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "ci-info": "^3.6.1", + "ci-info": "^4.0.0", "normalize-package-data": "^5.0.0", "npm-package-arg": "^10.1.0", "npm-registry-fetch": "^14.0.3", @@ -13272,7 +13481,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/libnpmsearch": { - "version": "6.0.2", + "version": "6.0.3", "dev": true, "inBundle": true, "license": "ISC", @@ -13284,7 +13493,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/libnpmteam": { - "version": "5.0.3", + "version": "5.0.4", "dev": true, "inBundle": true, "license": "ISC", @@ -13297,7 +13506,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/libnpmversion": { - "version": "4.0.2", + "version": "4.0.3", "dev": true, "inBundle": true, "license": "ISC", @@ -13347,6 +13556,15 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/semantic-release/node_modules/npm/node_modules/make-fetch-happen/node_modules/minipass": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, "node_modules/semantic-release/node_modules/npm/node_modules/minimatch": { "version": "9.0.3", "dev": true, @@ -13363,12 +13581,12 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/minipass": { - "version": "5.0.0", + "version": "7.0.4", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/semantic-release/node_modules/npm/node_modules/minipass-collect": { @@ -13396,12 +13614,12 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/minipass-fetch": { - "version": "3.0.3", + "version": "3.0.4", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "minipass": "^5.0.0", + "minipass": "^7.0.3", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, @@ -13568,7 +13786,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp": { - "version": "9.4.0", + "version": "9.4.1", "dev": true, "inBundle": true, "license": "MIT", @@ -13577,7 +13795,7 @@ "exponential-backoff": "^3.1.1", "glob": "^7.1.4", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^11.0.3", + "make-fetch-happen": "^10.0.3", "nopt": "^6.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", @@ -13592,6 +13810,19 @@ "node": "^12.13 || ^14.13 || >=16" } }, + "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/@npmcli/fs": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/abbrev": { "version": "1.1.1", "dev": true, @@ -13615,10 +13846,91 @@ "version": "1.1.11", "dev": true, "inBundle": true, - "license": "MIT", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/cacache": { + "version": "16.1.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob": { + "version": "8.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch": { + "version": "5.1.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/fs-minipass": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" } }, "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/gauge": { @@ -13660,6 +13972,33 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/make-fetch-happen": { + "version": "10.2.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { "version": "3.1.2", "dev": true, @@ -13672,6 +14011,35 @@ "node": "*" } }, + "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/minipass-fetch": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/nopt": { "version": "6.0.0", "dev": true, @@ -13702,25 +14070,47 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/readable-stream": { - "version": "3.6.2", + "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/signal-exit": { + "version": "3.0.7", "dev": true, "inBundle": true, - "license": "MIT", + "license": "ISC" + }, + "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/ssri": { + "version": "9.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "minipass": "^3.1.1" }, "engines": { - "node": ">= 6" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/signal-exit": { - "version": "3.0.7", + "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/unique-filename": { + "version": "2.0.1", "dev": true, "inBundle": true, - "license": "ISC" + "license": "ISC", + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/unique-slug": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } }, "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/which": { "version": "2.0.2", @@ -13789,7 +14179,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/npm-install-checks": { - "version": "6.2.0", + "version": "6.3.0", "dev": true, "inBundle": true, "license": "BSD-2-Clause", @@ -13882,6 +14272,15 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/semantic-release/node_modules/npm/node_modules/npm-registry-fetch/node_modules/minipass": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, "node_modules/semantic-release/node_modules/npm/node_modules/npm-user-validate": { "version": "2.0.0", "dev": true, @@ -13962,6 +14361,15 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/semantic-release/node_modules/npm/node_modules/pacote/node_modules/minipass": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, "node_modules/semantic-release/node_modules/npm/node_modules/parse-conflict-json": { "version": "3.0.1", "dev": true, @@ -13995,13 +14403,13 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/path-scurry": { - "version": "1.9.2", + "version": "1.10.1", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^9.1.1", - "minipass": "^5.0.0 || ^6.0.2" + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -14011,7 +14419,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/path-scurry/node_modules/lru-cache": { - "version": "9.1.1", + "version": "10.2.0", "dev": true, "inBundle": true, "license": "ISC", @@ -14020,7 +14428,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.13", + "version": "6.0.15", "dev": true, "inBundle": true, "license": "MIT", @@ -14041,15 +14449,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/semantic-release/node_modules/npm/node_modules/process": { - "version": "0.11.10", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/semantic-release/node_modules/npm/node_modules/promise-all-reject-late": { "version": "1.0.1", "dev": true, @@ -14157,18 +14556,17 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/readable-stream": { - "version": "4.4.0", + "version": "3.6.2", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 6" } }, "node_modules/semantic-release/node_modules/npm/node_modules/retry": { @@ -14265,7 +14663,7 @@ "optional": true }, "node_modules/semantic-release/node_modules/npm/node_modules/semver": { - "version": "7.5.4", + "version": "7.6.0", "dev": true, "inBundle": true, "license": "ISC", @@ -14319,7 +14717,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/signal-exit": { - "version": "4.0.2", + "version": "4.1.0", "dev": true, "inBundle": true, "license": "ISC", @@ -14360,16 +14758,16 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/socks": { - "version": "2.7.1", + "version": "2.8.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "ip": "^2.0.0", + "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" }, "engines": { - "node": ">= 10.13.0", + "node": ">= 10.0.0", "npm": ">= 3.0.0" } }, @@ -14398,7 +14796,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.3.0", + "version": "2.5.0", "dev": true, "inBundle": true, "license": "CC-BY-3.0" @@ -14414,18 +14812,18 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.13", + "version": "3.0.17", "dev": true, "inBundle": true, "license": "CC0-1.0" }, "node_modules/semantic-release/node_modules/npm/node_modules/ssri": { - "version": "10.0.4", + "version": "10.0.5", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "minipass": "^5.0.0" + "minipass": "^7.0.3" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -14507,7 +14905,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/tar": { - "version": "6.1.15", + "version": "6.2.0", "dev": true, "inBundle": true, "license": "ISC", @@ -14547,6 +14945,15 @@ "node": ">=8" } }, + "node_modules/semantic-release/node_modules/npm/node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, "node_modules/semantic-release/node_modules/npm/node_modules/text-table": { "version": "0.2.0", "dev": true, @@ -15024,9 +15431,9 @@ } }, "node_modules/semantic-release/node_modules/type-fest": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.6.0.tgz", - "integrity": "sha512-rLjWJzQFOq4xw7MgJrCZ6T1jIOvvYElXT12r+y0CC6u67hegDHaxcPqb2fZHOGlqxugGQPNB1EnTezjBetkwkw==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.18.2.tgz", + "integrity": "sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg==", "dev": true, "engines": { "node": ">=16" @@ -15123,29 +15530,32 @@ "dev": true }, "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -15173,14 +15583,18 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -15357,9 +15771,9 @@ } }, "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true }, "node_modules/spdx-expression-parse": { @@ -15373,9 +15787,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", "dev": true }, "node_modules/split": { @@ -15682,34 +16096,41 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -15719,28 +16140,31 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -15844,9 +16268,9 @@ "dev": true }, "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", + "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", "dev": true, "dependencies": { "ajv": "^8.0.1", @@ -15860,15 +16284,15 @@ } }, "node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -16023,9 +16447,9 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "dev": true, "dependencies": { "psl": "^1.1.33", @@ -16059,10 +16483,18 @@ } }, "node_modules/traverse": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", - "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==", + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.9.tgz", + "integrity": "sha512-7bBrcF+/LQzSgFmT0X5YclVqQxtv7TDJ1f8Wj7ibBu/U6BMLeOpUxuZjV7rMc44UtKxlnMFigdhFAIszSX1DMg==", "dev": true, + "dependencies": { + "gopd": "^1.0.1", + "typedarray.prototype.slice": "^1.0.3", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -16077,9 +16509,9 @@ } }, "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -16120,18 +16552,18 @@ } }, "node_modules/ts-node/node_modules/acorn-walk": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", - "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "dev": true, "engines": { "node": ">=0.4.0" } }, "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "dependencies": { "@types/json5": "^0.0.29", @@ -16195,29 +16627,30 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -16227,16 +16660,17 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -16246,14 +16680,40 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.3.tgz", + "integrity": "sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-errors": "^1.3.0", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-offset": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -16300,6 +16760,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", @@ -16328,9 +16800,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", "dev": true, "funding": [ { @@ -16347,8 +16819,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -16385,6 +16857,19 @@ "requires-port": "^1.0.0" } }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -16404,9 +16889,9 @@ "dev": true }, "node_modules/v8-to-istanbul": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz", - "integrity": "sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", @@ -16464,6 +16949,15 @@ "makeerror": "1.0.12" } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -16539,16 +17033,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -16557,6 +17051,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -16600,9 +17103,9 @@ } }, "node_modules/ws": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", - "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", "dev": true, "engines": { "node": ">=10.0.0" From 165bda104ecfedd899812ddb71911968414b76da Mon Sep 17 00:00:00 2001 From: "Shah, Kevin" Date: Tue, 14 May 2024 21:19:11 -0400 Subject: [PATCH 37/54] Reverted debug changes --- .github/workflows/release-github.yml | 2 +- package-lock.json | 2625 +++++++++++--------------- package.json | 4 +- 3 files changed, 1064 insertions(+), 1567 deletions(-) diff --git a/.github/workflows/release-github.yml b/.github/workflows/release-github.yml index 087dd96aa..897303fae 100644 --- a/.github/workflows/release-github.yml +++ b/.github/workflows/release-github.yml @@ -96,7 +96,7 @@ jobs: run: | npm --version echo "NPM DIST TAG :: " $NPM_DIST_TAG - npm publish --tag $NPM_DIST_TAG --workspaces --verbose + npm publish --tag $NPM_DIST_TAG --workspaces - name: Dry-run Firebolt SDKs to NPM if: steps.check_build.outputs.files_exists == 'true' && (github.ref_name == 'main' && github.event_name != 'workflow_dispatch') env: diff --git a/package-lock.json b/package-lock.json index 0f64b14c1..003f9ba25 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "devDependencies": { "@commitlint/cli": "^17.0.3", "@commitlint/config-conventional": "^17.0.3", - "@firebolt-js/openrpc": "rdkcentral/firebolt-openrpc#feature/app-pass-through", + "@firebolt-js/openrpc": "../firebolt-openrpc", "@firebolt-js/schemas": "2.0.0", "@saithodev/semantic-release-backmerge": "^3.2.0", "@semantic-release/changelog": "^6.0.1", @@ -37,57 +37,169 @@ "typescript": "^4.6.4" } }, + "../firebolt-openrpc": { + "name": "@firebolt-js/openrpc", + "version": "2.3.0-next.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "ajv": "^8.12.0", + "ajv-formats": "^2.1.1", + "array.prototype.groupby": "^1.1.0", + "crocks": "^0.12.4", + "deepmerge": "^4.2.2", + "fs-extra": "^10.1.0", + "highland": "^2.13.5", + "mkdirp": "^0.5.6", + "node-fetch": "^3.2.10", + "nopt": "^5.0.0", + "util": "^0.12.4" + }, + "bin": { + "firebolt-openrpc": "src/cli.mjs" + }, + "devDependencies": { + "@commitlint/cli": "^17.1.2", + "@commitlint/config-conventional": "^17.1.0", + "@semantic-release/changelog": "^6.0.1", + "@semantic-release/git": "^10.0.1", + "@semantic-release/npm": "^9.0.1", + "husky": "^8.0.1", + "jest": "^27.3.1", + "semantic-release": "^19.0.5" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.24.2", - "picocolors": "^1.0.0" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", + "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", - "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.24.5", - "@babel/helpers": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -118,14 +230,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", - "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { - "@babel/types": "^7.24.5", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { @@ -133,14 +245,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -192,28 +304,28 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "dependencies": { - "@babel/types": "^7.24.0" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", - "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.24.3", - "@babel/helper-simple-access": "^7.24.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/helper-validator-identifier": "^7.24.5" + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -223,89 +335,88 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", - "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", - "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "dependencies": { - "@babel/types": "^7.24.5" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", - "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.24.5" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", - "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", - "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", "dev": true, "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", - "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.24.5", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "js-tokens": "^4.0.0" }, "engines": { "node": ">=6.9.0" @@ -383,9 +494,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", - "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -542,12 +653,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", - "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -557,34 +668,34 @@ } }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", - "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/types": "^7.24.5", - "debug": "^4.3.1", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", "globals": "^11.1.0" }, "engines": { @@ -592,13 +703,13 @@ } }, "node_modules/@babel/types": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", - "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.24.1", - "@babel/helper-validator-identifier": "^7.24.5", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -671,15 +782,15 @@ } }, "node_modules/@commitlint/config-validator/node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.3", + "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" + "uri-js": "^4.2.2" }, "funding": { "type": "github", @@ -996,95 +1107,8 @@ "link": true }, "node_modules/@firebolt-js/openrpc": { - "version": "3.0.0-next.1", - "resolved": "git+ssh://git@github.com/rdkcentral/firebolt-openrpc.git#76db0a471edc7b1e0edbb58f20bb8c7fd7da49df", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "ajv": "^8.12.0", - "ajv-formats": "^2.1.1", - "array.prototype.groupby": "^1.1.0", - "crocks": "^0.12.4", - "deepmerge": "^4.2.2", - "fs-extra": "^10.1.0", - "highland": "^2.13.5", - "mkdirp": "^0.5.6", - "node-fetch": "^3.2.10", - "nopt": "^5.0.0", - "util": "^0.12.4" - }, - "bin": { - "firebolt-openrpc": "src/cli.mjs" - } - }, - "node_modules/@firebolt-js/openrpc/node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/@firebolt-js/openrpc/node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@firebolt-js/openrpc/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@firebolt-js/openrpc/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/@firebolt-js/openrpc/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/@firebolt-js/openrpc/node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } + "resolved": "../firebolt-openrpc", + "link": true }, "node_modules/@firebolt-js/schemas": { "version": "2.0.0", @@ -1098,15 +1122,15 @@ } }, "node_modules/@firebolt-js/schemas/node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.3", + "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" + "uri-js": "^4.2.2" }, "funding": { "type": "github", @@ -1502,32 +1526,32 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.2.1", + "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true, "engines": { "node": ">=6.0.0" @@ -1540,9 +1564,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1594,16 +1618,16 @@ } }, "node_modules/@octokit/core": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.0.tgz", - "integrity": "sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.0.1.tgz", + "integrity": "sha512-lyeeeZyESFo+ffI801SaBKmCfsvarO+dgV8/0gD8u1d87clbEdWsP5yC+dSj3zLhb2eIf5SJrn6vDz9AheETHw==", "dev": true, "dependencies": { "@octokit/auth-token": "^4.0.0", - "@octokit/graphql": "^7.1.0", - "@octokit/request": "^8.3.1", - "@octokit/request-error": "^5.1.0", - "@octokit/types": "^13.0.0", + "@octokit/graphql": "^7.0.0", + "@octokit/request": "^8.0.2", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^12.0.0", "before-after-hook": "^2.2.0", "universal-user-agent": "^6.0.0" }, @@ -1612,12 +1636,13 @@ } }, "node_modules/@octokit/endpoint": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.5.tgz", - "integrity": "sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.2.tgz", + "integrity": "sha512-qhKW8YLIi+Kmc92FQUFGr++DYtkx/1fBv+Thua6baqnjnOsgBYJDCvWZR1YcINuHGOEQt416WOfE+A/oG60NBQ==", "dev": true, "dependencies": { - "@octokit/types": "^13.1.0", + "@octokit/types": "^12.0.0", + "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" }, "engines": { @@ -1625,13 +1650,13 @@ } }, "node_modules/@octokit/graphql": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.0.tgz", - "integrity": "sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.0.2.tgz", + "integrity": "sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==", "dev": true, "dependencies": { - "@octokit/request": "^8.3.0", - "@octokit/types": "^13.0.0", + "@octokit/request": "^8.0.1", + "@octokit/types": "^12.0.0", "universal-user-agent": "^6.0.0" }, "engines": { @@ -1639,39 +1664,24 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "22.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", - "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==", + "version": "19.0.2", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.0.2.tgz", + "integrity": "sha512-8li32fUDUeml/ACRp/njCWTsk5t17cfTM1jp9n08pBrqs5cDFJubtjsSnuz56r5Tad6jdEPJld7LxNp9dNcyjQ==", "dev": true }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.1.tgz", - "integrity": "sha512-wfGhE/TAkXZRLjksFXuDZdmGnJQHvtU/joFQdweXUgzo1XwvBCD4o4+75NtFfjfLK5IwLf9vHTfSiU3sLRYpRw==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.1.2.tgz", + "integrity": "sha512-euDbNV6fxX6btsCDnZoZM4vw3zO1nj1Z7TskHAulO6mZ9lHoFTpwll6farf+wh31mlBabgU81bBYdflp0GLVAQ==", "dev": true, "dependencies": { - "@octokit/types": "^12.6.0" + "@octokit/types": "^12.1.1" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "@octokit/core": "5" - } - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", - "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==", - "dev": true - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", - "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^20.0.0" + "@octokit/core": ">=5" } }, "node_modules/@octokit/plugin-retry": { @@ -1691,28 +1701,13 @@ "@octokit/core": ">=5" } }, - "node_modules/@octokit/plugin-retry/node_modules/@octokit/openapi-types": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", - "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==", - "dev": true - }, - "node_modules/@octokit/plugin-retry/node_modules/@octokit/types": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", - "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^20.0.0" - } - }, "node_modules/@octokit/plugin-throttling": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-8.2.0.tgz", - "integrity": "sha512-nOpWtLayKFpgqmgD0y3GqXafMFuKcA4tRPZIfu7BArd2lEZeb1988nhWhwx4aZWmjDmUfdgVf7W+Tt4AmvRmMQ==", + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-8.1.2.tgz", + "integrity": "sha512-oFba+ioR6HGb0fgqxMta7Kpk/MdffUTuUxNY856l1nXPvh7Qggp8w4AksRx1SDA8SGd+4cbrpkY4k1J/Xz8nZQ==", "dev": true, "dependencies": { - "@octokit/types": "^12.2.0", + "@octokit/types": "^12.0.0", "bottleneck": "^2.15.3" }, "engines": { @@ -1722,30 +1717,16 @@ "@octokit/core": "^5.0.0" } }, - "node_modules/@octokit/plugin-throttling/node_modules/@octokit/openapi-types": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", - "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==", - "dev": true - }, - "node_modules/@octokit/plugin-throttling/node_modules/@octokit/types": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", - "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^20.0.0" - } - }, "node_modules/@octokit/request": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.0.tgz", - "integrity": "sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==", + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.4.tgz", + "integrity": "sha512-M0aaFfpGPEKrg7XoA/gwgRvc9MSXHRO2Ioki1qrPDbl1e9YhjIwVoHE7HIKmv/m3idzldj//xBujcFNqGX6ENA==", "dev": true, "dependencies": { - "@octokit/endpoint": "^9.0.1", - "@octokit/request-error": "^5.1.0", - "@octokit/types": "^13.1.0", + "@octokit/endpoint": "^9.0.0", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^12.0.0", + "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" }, "engines": { @@ -1753,12 +1734,12 @@ } }, "node_modules/@octokit/request-error": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.0.tgz", - "integrity": "sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.1.tgz", + "integrity": "sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==", "dev": true, "dependencies": { - "@octokit/types": "^13.1.0", + "@octokit/types": "^12.0.0", "deprecation": "^2.0.0", "once": "^1.4.0" }, @@ -1767,12 +1748,12 @@ } }, "node_modules/@octokit/types": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz", - "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==", + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.1.1.tgz", + "integrity": "sha512-qnJTldJ1NyGT5MTsCg/Zi+y2IFHZ1Jo5+njNCjJ9FcainV7LjuHgmB697kA0g4MjZeDAJsM3B45iqCVsCLVFZg==", "dev": true, "dependencies": { - "@octokit/openapi-types": "^22.2.0" + "@octokit/openapi-types": "^19.0.2" } }, "node_modules/@pnpm/config.env-replace": { @@ -1977,9 +1958,9 @@ } }, "node_modules/@semantic-release/github": { - "version": "9.2.6", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-9.2.6.tgz", - "integrity": "sha512-shi+Lrf6exeNZF+sBhK+P011LSbhmIAoUEgEY6SsxF8irJ+J2stwI5jkyDQ+4gzYyDImzV6LCKdYB9FXnQRWKA==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-9.2.1.tgz", + "integrity": "sha512-fEn9uOe6jwWR6ro2Wh6YNBCBuZ5lRi8Myz+1j3KDTSt8OuUGlpVM4lFac/0bDrql2NOKrIEAMGCfWb9WMIdzIg==", "dev": true, "dependencies": { "@octokit/core": "^5.0.0", @@ -1990,13 +1971,13 @@ "aggregate-error": "^5.0.0", "debug": "^4.3.4", "dir-glob": "^3.0.1", - "globby": "^14.0.0", + "globby": "^13.1.4", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", "issue-parser": "^6.0.0", "lodash-es": "^4.17.21", - "mime": "^4.0.0", - "p-filter": "^4.0.0", + "mime": "^3.0.0", + "p-filter": "^3.0.0", "url-join": "^5.0.0" }, "engines": { @@ -2016,9 +1997,9 @@ } }, "node_modules/@semantic-release/github/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "dev": true, "dependencies": { "debug": "^4.3.4" @@ -2059,9 +2040,9 @@ } }, "node_modules/@semantic-release/github/node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", "dev": true, "dependencies": { "agent-base": "^7.1.0", @@ -2072,9 +2053,9 @@ } }, "node_modules/@semantic-release/github/node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", "dev": true, "dependencies": { "agent-base": "^7.0.2", @@ -2186,18 +2167,6 @@ "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", "dev": true }, - "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@sinonjs/commons": { "version": "1.8.6", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", @@ -2226,9 +2195,9 @@ } }, "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", "dev": true }, "node_modules/@tsconfig/node12": { @@ -2250,9 +2219,9 @@ "dev": true }, "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.3.tgz", + "integrity": "sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -2263,18 +2232,18 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "version": "7.6.6", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.6.tgz", + "integrity": "sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.3.tgz", + "integrity": "sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -2282,42 +2251,42 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.3.tgz", + "integrity": "sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" } }, "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.8.tgz", + "integrity": "sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==", "dev": true }, "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz", + "integrity": "sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz", + "integrity": "sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg==", "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" @@ -2341,9 +2310,9 @@ "dev": true }, "node_modules/@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.4.tgz", + "integrity": "sha512-Kfe/D3hxHTusnPNRbycJE1N77WHDsdS4AjUYIzlDzhDrS47NrwuL3YW4VITxwR7KCVpzwgy4Rbj829KSSQmwXQ==", "dev": true }, "node_modules/@types/node": { @@ -2353,9 +2322,9 @@ "dev": true }, "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.3.tgz", + "integrity": "sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg==", "dev": true }, "node_modules/@types/parse5": { @@ -2371,37 +2340,36 @@ "dev": true }, "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw==", "dev": true }, "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.4.tgz", + "integrity": "sha512-95Sfz4nvMAb0Nl9DTxN3j64adfwfbBPEYq14VN7zT5J5O2M9V6iZMIIQU1U+pJyl9agHYHNCqhCXgyEtIRRa5A==", "dev": true }, "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "version": "17.0.30", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.30.tgz", + "integrity": "sha512-3SJLzYk3yz3EgI9I8OLoH06B3PdXIoU2imrBZzaGqUtUXf5iUNDtmAfCGuQrny1bnmyjh/GM/YNts6WK5jR5Rw==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "version": "21.0.2", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.2.tgz", + "integrity": "sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==", "dev": true }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead", "dev": true }, "node_modules/abbrev": { @@ -2414,9 +2382,9 @@ } }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -2524,15 +2492,15 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.3", + "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" + "uri-js": "^4.2.2" }, "funding": { "type": "github", @@ -2631,16 +2599,13 @@ "dev": true }, "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2653,16 +2618,15 @@ "dev": true }, "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" }, "engines": { @@ -2717,33 +2681,18 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.groupby": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array.prototype.groupby/-/array.prototype.groupby-1.1.0.tgz", - "integrity": "sha512-p+QtvmnNEBqajQWLG3kPls8cLPBfJgvayzc/qplsX8Vchtevtq+TR2gyav5xs5h+mdUjfgOvYoCdTsVxu3b5sA==", - "deprecated": "This proposal has been altered; please use https://npmjs.com/object.groupby instead!", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.1" - } - }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", "is-shared-array-buffer": "^1.0.2" }, "engines": { @@ -2778,13 +2727,10 @@ "dev": true }, "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, "engines": { "node": ">= 0.4" }, @@ -2930,9 +2876,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, "funding": [ { @@ -2949,9 +2895,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", "update-browserslist-db": "^1.0.13" }, "bin": { @@ -2977,19 +2923,14 @@ "dev": true }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dev": true, "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3031,9 +2972,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001618", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001618.tgz", - "integrity": "sha512-p407+D1tIkDvsEAPS22lJxLQQaG8OTBEqo0KhzfABGk0TU4juBNDSfH0hyAp/HRyx+M8L17z/ltyhxh27FTfQg==", + "version": "1.0.30001561", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", + "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", "dev": true, "funding": [ { @@ -3104,9 +3045,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", - "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "dev": true }, "node_modules/clean-stack": { @@ -3119,9 +3060,9 @@ } }, "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "dev": true, "dependencies": { "string-width": "^4.2.0" @@ -3365,12 +3306,6 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, - "node_modules/crocks": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/crocks/-/crocks-0.12.4.tgz", - "integrity": "sha512-paln6xJUrR9e/OWMFsyTi4dLyr+q99C5f7PQbGgSDHtwsfW0sCNZvnpHzvniI2dAE0uoBgeIP1Ukmme8Z0HxxA==", - "dev": true - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -3427,15 +3362,6 @@ "node": ">=8" } }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, "node_modules/data-urls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", @@ -3463,57 +3389,6 @@ "node": ">=12" } }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/dateformat": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", @@ -3611,20 +3486,17 @@ } }, "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", "dev": true, "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-properties": { @@ -3771,7 +3643,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "deprecated": "Use your platform's native DOMException instead", "dev": true, "dependencies": { "webidl-conversions": "^7.0.0" @@ -3802,9 +3673,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.768", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.768.tgz", - "integrity": "sha512-z2U3QcvNuxdkk33YV7R1bVMNq7fL23vq3WfO5BHcqrm4TnDGReouBfYKLEFh5umoK1XACjEwp8mmnhXk2EJigw==", + "version": "1.4.576", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.576.tgz", + "integrity": "sha512-yXsZyXJfAqzWk1WKryr0Wl0MN2D47xodPvEEwlVePBnhU5E7raevLQR+E6b9JAD3GfL/7MbAL9ZtWQQPcLx7wA==", "dev": true }, "node_modules/emittery": { @@ -3908,9 +3779,9 @@ } }, "node_modules/env-ci/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, "dependencies": { "path-key": "^4.0.0" @@ -3971,57 +3842,50 @@ } }, "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", + "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", + "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" + "which-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -4030,48 +3894,15 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -4104,9 +3935,9 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, "engines": { "node": ">=6" @@ -4270,9 +4101,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -4883,9 +4714,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -4900,29 +4731,6 @@ "bser": "2.1.1" } }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, "node_modules/figures": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", @@ -4995,9 +4803,9 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", "dev": true, "dependencies": { "flatted": "^3.2.9", @@ -5005,13 +4813,13 @@ "rimraf": "^3.0.2" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12.0.0" } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, "node_modules/for-each": { @@ -5037,18 +4845,6 @@ "node": ">= 6" } }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dev": true, - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, "node_modules/from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -5060,9 +4856,9 @@ } }, "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -5154,20 +4950,16 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dev": true, "dependencies": { - "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5206,14 +4998,13 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -5328,13 +5119,12 @@ } }, "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" + "define-properties": "^1.1.3" }, "engines": { "node": ">= 0.4" @@ -5344,44 +5134,31 @@ } }, "node_modules/globby": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz", - "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.2", + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", "ignore": "^5.2.4", - "path-type": "^5.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" - }, - "engines": { - "node": ">=18" + "merge2": "^1.4.1", + "slash": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", - "dev": true, "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globby/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, "engines": { - "node": ">=14.16" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5463,21 +5240,21 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dev": true, "dependencies": { - "es-define-property": "^1.0.0" + "get-intrinsic": "^1.2.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "dev": true, "engines": { "node": ">= 0.4" @@ -5499,12 +5276,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, "dependencies": { - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5514,9 +5291,9 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", "dev": true, "dependencies": { "function-bind": "^1.1.2" @@ -5525,15 +5302,6 @@ "node": ">= 0.4" } }, - "node_modules/highland": { - "version": "2.13.5", - "resolved": "https://registry.npmjs.org/highland/-/highland-2.13.5.tgz", - "integrity": "sha512-dn2flPapIIAa4BtkB2ahjshg8iSJtrJtdhEb9/oiOrS5HMQTR/GuhFpqJ+11YBdtnl3AwWKvbZd1Uxr8uAmA7A==", - "dev": true, - "dependencies": { - "util-deprecate": "^1.0.2" - } - }, "node_modules/hook-std": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", @@ -5658,9 +5426,9 @@ } }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { "node": ">= 4" @@ -5763,12 +5531,12 @@ "dev": true }, "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dev": true, "dependencies": { - "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.2", "hasown": "^2.0.0", "side-channel": "^1.0.4" }, @@ -5792,33 +5560,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5882,21 +5632,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "dev": true, - "dependencies": { - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -5939,21 +5674,6 @@ "node": ">=6" } }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -5967,9 +5687,9 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, "engines": { "node": ">= 0.4" @@ -6038,6 +5758,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -6061,15 +5790,12 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6130,12 +5856,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, "dependencies": { - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -6197,9 +5923,9 @@ } }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.1.tgz", + "integrity": "sha512-opCrKqbthmq3SKZ10mFMQG9dk3fTa3quaOLD35kJa5ejwZHd9xAr+kLuziiZz2cG32s4lMZxNdmdcEQnTDP4+g==", "dev": true, "engines": { "node": ">=8" @@ -6259,9 +5985,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -7341,10 +7067,13 @@ } }, "node_modules/marked-terminal/node_modules/ansi-escapes": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", - "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", + "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", "dev": true, + "dependencies": { + "type-fest": "^3.0.0" + }, "engines": { "node": ">=14.16" }, @@ -7364,7 +7093,19 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/meow": { + "node_modules/marked-terminal/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", @@ -7430,18 +7171,15 @@ } }, "node_modules/mime": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.3.tgz", - "integrity": "sha512-KgUb15Oorc0NEKPbvfa0wRU+PItIEZmiv+pyAO2i0oTIVTJhlzMclU7w4RXWQrSOVH5ax/p/CkIO7KI4OyFJTQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", "dev": true, - "funding": [ - "https://github.com/sponsors/broofa" - ], "bin": { - "mime": "bin/cli.js" + "mime": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=10.0.0" } }, "node_modules/mime-db": { @@ -7566,25 +7304,6 @@ "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", "dev": true }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } - }, "node_modules/node-emoji": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", @@ -7594,24 +7313,6 @@ "lodash": "^4.17.21" } }, - "node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "dev": true, - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -7619,15 +7320,15 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "node_modules/nopt": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", - "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", "dev": true, "dependencies": { "abbrev": "^2.0.0" @@ -10254,9 +9955,9 @@ "license": "ISC" }, "node_modules/nwsapi": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.10.tgz", - "integrity": "sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==", + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", "dev": true }, "node_modules/object-assign": { @@ -10287,13 +9988,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -10305,29 +10006,28 @@ } }, "node_modules/object.entries": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", - "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -10337,31 +10037,27 @@ } }, "node_modules/object.hasown": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", - "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", "dev": true, "dependencies": { - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -10395,17 +10091,17 @@ } }, "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -10424,15 +10120,15 @@ } }, "node_modules/p-filter": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-4.1.0.tgz", - "integrity": "sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-3.0.0.tgz", + "integrity": "sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg==", "dev": true, "dependencies": { - "p-map": "^7.0.1" + "p-map": "^5.1.0" }, "engines": { - "node": ">=18" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -10478,12 +10174,58 @@ } }, "node_modules/p-map": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.2.tgz", - "integrity": "sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", + "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", + "dev": true, + "dependencies": { + "aggregate-error": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map/node_modules/aggregate-error": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", + "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", "dev": true, + "dependencies": { + "clean-stack": "^4.0.0", + "indent-string": "^5.0.0" + }, "engines": { - "node": ">=18" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map/node_modules/clean-stack": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", + "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -10586,9 +10328,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, "node_modules/picomatch": { @@ -10844,15 +10586,6 @@ "node": ">=4" } }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -10863,9 +10596,9 @@ } }, "node_modules/prettier": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", + "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -11044,9 +10777,9 @@ } }, "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, "node_modules/read-pkg": { @@ -11216,15 +10949,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -11389,13 +11121,13 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -11419,18 +11151,15 @@ "dev": true }, "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", "is-regex": "^1.1.4" }, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -11750,9 +11479,9 @@ } }, "node_modules/semantic-release/node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", + "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", "dev": true, "dependencies": { "lru-cache": "^10.0.1" @@ -11823,18 +11552,18 @@ } }, "node_modules/semantic-release/node_modules/json-parse-even-better-errors": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", - "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/semantic-release/node_modules/lines-and-columns": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", - "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", + "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", "dev": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -11856,9 +11585,9 @@ } }, "node_modules/semantic-release/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", "dev": true, "engines": { "node": "14 || >=16.14" @@ -11877,9 +11606,9 @@ } }, "node_modules/semantic-release/node_modules/normalize-package-data": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.1.tgz", - "integrity": "sha512-6rvCfeRW+OEZagAB4lMLSNuTNYZWLVtKccK79VSTf//yTY5VOCgcpH80O+bZK8Neps7pUnd5G+QlMg1yV/2iZQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", + "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", "dev": true, "dependencies": { "hosted-git-info": "^7.0.0", @@ -11892,9 +11621,9 @@ } }, "node_modules/semantic-release/node_modules/normalize-url": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", - "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", "dev": true, "engines": { "node": ">=14.16" @@ -11904,9 +11633,9 @@ } }, "node_modules/semantic-release/node_modules/npm": { - "version": "9.9.3", - "resolved": "https://registry.npmjs.org/npm/-/npm-9.9.3.tgz", - "integrity": "sha512-Z1l+rcQ5kYb17F3hHtO601arEpvdRYnCLtg8xo3AGtyj3IthwaraEOexI9903uANkifFbqHC8hT53KIrozWg8A==", + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-9.9.0.tgz", + "integrity": "sha512-wkd7sjz4KmdmddYQcd0aTP73P1cEuPlekeulz4jTDeMVx/Zo5XZ5KQ1z3eUzV3Q/WZpEO0NJXTrD5FNFe6fhCA==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -11991,21 +11720,21 @@ "@npmcli/run-script": "^6.0.2", "abbrev": "^2.0.0", "archy": "~1.0.0", - "cacache": "^17.1.4", + "cacache": "^17.1.3", "chalk": "^5.3.0", - "ci-info": "^4.0.0", + "ci-info": "^3.8.0", "cli-columns": "^4.0.0", "cli-table3": "^0.6.3", "columnify": "^1.6.0", "fastest-levenshtein": "^1.0.16", - "fs-minipass": "^3.0.3", - "glob": "^10.3.10", + "fs-minipass": "^3.0.2", + "glob": "^10.2.7", "graceful-fs": "^4.2.11", "hosted-git-info": "^6.1.1", "ini": "^4.1.1", "init-package-json": "^5.0.0", "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^3.0.1", + "json-parse-even-better-errors": "^3.0.0", "libnpmaccess": "^7.0.2", "libnpmdiff": "^5.0.20", "libnpmexec": "^6.0.4", @@ -12013,20 +11742,20 @@ "libnpmhook": "^9.0.3", "libnpmorg": "^5.0.4", "libnpmpack": "^5.0.20", - "libnpmpublish": "^7.5.1", + "libnpmpublish": "^7.5.0", "libnpmsearch": "^6.0.2", "libnpmteam": "^5.0.3", "libnpmversion": "^4.0.2", "make-fetch-happen": "^11.1.1", "minimatch": "^9.0.3", - "minipass": "^7.0.4", + "minipass": "^5.0.0", "minipass-pipeline": "^1.2.4", "ms": "^2.1.2", - "node-gyp": "^9.4.1", + "node-gyp": "^9.4.0", "nopt": "^7.2.0", "normalize-package-data": "^5.0.0", "npm-audit-report": "^5.0.0", - "npm-install-checks": "^6.3.0", + "npm-install-checks": "^6.2.0", "npm-package-arg": "^10.1.0", "npm-pick-manifest": "^8.0.2", "npm-profile": "^7.0.1", @@ -12039,12 +11768,12 @@ "proc-log": "^3.0.0", "qrcode-terminal": "^0.12.0", "read": "^2.1.0", - "semver": "^7.6.0", + "semver": "^7.5.4", "sigstore": "^1.9.0", "spdx-expression-parse": "^3.0.1", - "ssri": "^10.0.5", + "ssri": "^10.0.4", "supports-color": "^9.4.0", - "tar": "^6.2.0", + "tar": "^6.1.15", "text-table": "~0.2.0", "tiny-relative-date": "^1.3.0", "treeverse": "^3.0.0", @@ -12061,9 +11790,9 @@ } }, "node_modules/semantic-release/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, "dependencies": { "path-key": "^4.0.0" @@ -12085,12 +11814,6 @@ "node": ">=0.1.90" } }, - "node_modules/semantic-release/node_modules/npm/node_modules/@gar/promisify": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, "node_modules/semantic-release/node_modules/npm/node_modules/@isaacs/cliui": { "version": "8.0.2", "dev": true, @@ -12165,7 +11888,7 @@ "license": "ISC" }, "node_modules/semantic-release/node_modules/npm/node_modules/@npmcli/arborist": { - "version": "6.5.1", + "version": "6.5.0", "dev": true, "inBundle": true, "license": "ISC", @@ -12178,7 +11901,7 @@ "@npmcli/name-from-folder": "^2.0.0", "@npmcli/node-gyp": "^3.0.0", "@npmcli/package-json": "^4.0.0", - "@npmcli/query": "^3.1.0", + "@npmcli/query": "^3.0.0", "@npmcli/run-script": "^6.0.0", "bin-links": "^4.0.1", "cacache": "^17.0.4", @@ -12212,13 +11935,13 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/@npmcli/config": { - "version": "6.4.1", + "version": "6.4.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/map-workspaces": "^3.0.2", - "ci-info": "^4.0.0", + "ci-info": "^3.8.0", "ini": "^4.1.0", "nopt": "^7.0.0", "proc-log": "^3.0.0", @@ -12319,19 +12042,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/semantic-release/node_modules/npm/node_modules/@npmcli/move-file": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/semantic-release/node_modules/npm/node_modules/@npmcli/name-from-folder": { "version": "2.0.0", "dev": true, @@ -12381,7 +12091,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/@npmcli/query": { - "version": "3.1.0", + "version": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", @@ -12506,6 +12216,18 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/semantic-release/node_modules/npm/node_modules/abort-controller": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/semantic-release/node_modules/npm/node_modules/agent-base": { "version": "6.0.2", "dev": true, @@ -12519,11 +12241,13 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/agentkeepalive": { - "version": "4.5.0", + "version": "4.3.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { + "debug": "^4.1.0", + "depd": "^2.0.0", "humanize-ms": "^1.2.1" }, "engines": { @@ -12580,10 +12304,14 @@ "license": "MIT" }, "node_modules/semantic-release/node_modules/npm/node_modules/are-we-there-yet": { - "version": "4.0.2", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^4.1.0" + }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -12594,8 +12322,28 @@ "inBundle": true, "license": "MIT" }, + "node_modules/semantic-release/node_modules/npm/node_modules/base64-js": { + "version": "1.5.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, "node_modules/semantic-release/node_modules/npm/node_modules/bin-links": { - "version": "4.0.3", + "version": "4.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -12627,6 +12375,30 @@ "balanced-match": "^1.0.0" } }, + "node_modules/semantic-release/node_modules/npm/node_modules/buffer": { + "version": "6.0.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/semantic-release/node_modules/npm/node_modules/builtins": { "version": "5.0.1", "dev": true, @@ -12637,7 +12409,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/cacache": { - "version": "17.1.4", + "version": "17.1.3", "dev": true, "inBundle": true, "license": "ISC", @@ -12646,7 +12418,7 @@ "fs-minipass": "^3.0.0", "glob": "^10.2.2", "lru-cache": "^7.7.1", - "minipass": "^7.0.3", + "minipass": "^5.0.0", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", @@ -12681,7 +12453,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/ci-info": { - "version": "4.0.0", + "version": "3.8.0", "dev": true, "funding": [ { @@ -12754,7 +12526,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/cmd-shim": { - "version": "6.0.2", + "version": "6.0.1", "dev": true, "inBundle": true, "license": "ISC", @@ -12902,8 +12674,17 @@ "inBundle": true, "license": "MIT" }, + "node_modules/semantic-release/node_modules/npm/node_modules/depd": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/semantic-release/node_modules/npm/node_modules/diff": { - "version": "5.2.0", + "version": "5.1.0", "dev": true, "inBundle": true, "license": "BSD-3-Clause", @@ -12948,6 +12729,24 @@ "inBundle": true, "license": "MIT" }, + "node_modules/semantic-release/node_modules/npm/node_modules/event-target-shim": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/semantic-release/node_modules/npm/node_modules/events": { + "version": "3.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/semantic-release/node_modules/npm/node_modules/exponential-backoff": { "version": "3.1.1", "dev": true, @@ -12980,12 +12779,12 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/fs-minipass": { - "version": "3.0.3", + "version": "3.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "minipass": "^7.0.3" + "minipass": "^5.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -12998,13 +12797,10 @@ "license": "ISC" }, "node_modules/semantic-release/node_modules/npm/node_modules/function-bind": { - "version": "1.1.2", + "version": "1.1.1", "dev": true, "inBundle": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, "node_modules/semantic-release/node_modules/npm/node_modules/gauge": { "version": "5.0.1", @@ -13026,19 +12822,19 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/glob": { - "version": "10.3.10", + "version": "10.2.7", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", + "jackspeak": "^2.0.3", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minipass": "^5.0.0 || ^6.0.2", + "path-scurry": "^1.7.0" }, "bin": { - "glob": "dist/esm/bin.mjs" + "glob": "dist/cjs/src/bin.js" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -13053,24 +12849,24 @@ "inBundle": true, "license": "ISC" }, - "node_modules/semantic-release/node_modules/npm/node_modules/has-unicode": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/semantic-release/node_modules/npm/node_modules/hasown": { - "version": "2.0.1", + "node_modules/semantic-release/node_modules/npm/node_modules/has": { + "version": "1.0.3", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.2" + "function-bind": "^1.1.1" }, "engines": { - "node": ">= 0.4" + "node": ">= 0.4.0" } }, + "node_modules/semantic-release/node_modules/npm/node_modules/has-unicode": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, "node_modules/semantic-release/node_modules/npm/node_modules/hosted-git-info": { "version": "6.1.1", "dev": true, @@ -13138,8 +12934,28 @@ "node": ">=0.10.0" } }, + "node_modules/semantic-release/node_modules/npm/node_modules/ieee754": { + "version": "1.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "BSD-3-Clause" + }, "node_modules/semantic-release/node_modules/npm/node_modules/ignore-walk": { - "version": "6.0.4", + "version": "6.0.3", "dev": true, "inBundle": true, "license": "ISC", @@ -13168,12 +12984,6 @@ "node": ">=8" } }, - "node_modules/semantic-release/node_modules/npm/node_modules/infer-owner": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "ISC" - }, "node_modules/semantic-release/node_modules/npm/node_modules/inflight": { "version": "1.0.6", "dev": true, @@ -13217,24 +13027,11 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/semantic-release/node_modules/npm/node_modules/ip-address": { - "version": "9.0.5", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/semantic-release/node_modules/npm/node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", + "node_modules/semantic-release/node_modules/npm/node_modules/ip": { + "version": "2.0.0", "dev": true, "inBundle": true, - "license": "BSD-3-Clause" + "license": "MIT" }, "node_modules/semantic-release/node_modules/npm/node_modules/ip-regex": { "version": "4.3.0", @@ -13258,12 +13055,12 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/is-core-module": { - "version": "2.13.1", + "version": "2.12.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "has": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -13291,7 +13088,7 @@ "license": "ISC" }, "node_modules/semantic-release/node_modules/npm/node_modules/jackspeak": { - "version": "2.3.6", + "version": "2.2.1", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", @@ -13308,14 +13105,8 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/semantic-release/node_modules/npm/node_modules/jsbn": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, "node_modules/semantic-release/node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "3.0.1", + "version": "3.0.0", "dev": true, "inBundle": true, "license": "MIT", @@ -13354,7 +13145,7 @@ "license": "MIT" }, "node_modules/semantic-release/node_modules/npm/node_modules/libnpmaccess": { - "version": "7.0.3", + "version": "7.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -13367,7 +13158,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/libnpmdiff": { - "version": "5.0.21", + "version": "5.0.20", "dev": true, "inBundle": true, "license": "ISC", @@ -13387,14 +13178,14 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/libnpmexec": { - "version": "6.0.5", + "version": "6.0.4", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/arborist": "^6.5.0", "@npmcli/run-script": "^6.0.0", - "ci-info": "^4.0.0", + "ci-info": "^3.7.1", "npm-package-arg": "^10.1.0", "npmlog": "^7.0.1", "pacote": "^15.0.8", @@ -13409,7 +13200,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/libnpmfund": { - "version": "4.2.2", + "version": "4.2.1", "dev": true, "inBundle": true, "license": "ISC", @@ -13421,7 +13212,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/libnpmhook": { - "version": "9.0.4", + "version": "9.0.3", "dev": true, "inBundle": true, "license": "ISC", @@ -13434,7 +13225,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/libnpmorg": { - "version": "5.0.5", + "version": "5.0.4", "dev": true, "inBundle": true, "license": "ISC", @@ -13447,7 +13238,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/libnpmpack": { - "version": "5.0.21", + "version": "5.0.20", "dev": true, "inBundle": true, "license": "ISC", @@ -13462,12 +13253,12 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/libnpmpublish": { - "version": "7.5.2", + "version": "7.5.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "ci-info": "^4.0.0", + "ci-info": "^3.6.1", "normalize-package-data": "^5.0.0", "npm-package-arg": "^10.1.0", "npm-registry-fetch": "^14.0.3", @@ -13481,7 +13272,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/libnpmsearch": { - "version": "6.0.3", + "version": "6.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -13493,7 +13284,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/libnpmteam": { - "version": "5.0.4", + "version": "5.0.3", "dev": true, "inBundle": true, "license": "ISC", @@ -13506,7 +13297,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/libnpmversion": { - "version": "4.0.3", + "version": "4.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -13556,15 +13347,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/semantic-release/node_modules/npm/node_modules/make-fetch-happen/node_modules/minipass": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, "node_modules/semantic-release/node_modules/npm/node_modules/minimatch": { "version": "9.0.3", "dev": true, @@ -13581,12 +13363,12 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/minipass": { - "version": "7.0.4", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=8" } }, "node_modules/semantic-release/node_modules/npm/node_modules/minipass-collect": { @@ -13614,12 +13396,12 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/minipass-fetch": { - "version": "3.0.4", + "version": "3.0.3", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "minipass": "^7.0.3", + "minipass": "^5.0.0", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, @@ -13786,7 +13568,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp": { - "version": "9.4.1", + "version": "9.4.0", "dev": true, "inBundle": true, "license": "MIT", @@ -13795,7 +13577,7 @@ "exponential-backoff": "^3.1.1", "glob": "^7.1.4", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", + "make-fetch-happen": "^11.0.3", "nopt": "^6.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", @@ -13810,19 +13592,6 @@ "node": "^12.13 || ^14.13 || >=16" } }, - "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/@npmcli/fs": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/abbrev": { "version": "1.1.1", "dev": true, @@ -13843,94 +13612,13 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/cacache": { - "version": "16.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob": { - "version": "8.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch": { - "version": "5.1.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/fs-minipass": { - "version": "2.1.0", + "version": "1.1.11", "dev": true, "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/gauge": { @@ -13972,33 +13660,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/make-fetch-happen": { - "version": "10.2.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { "version": "3.1.2", "dev": true, @@ -14011,35 +13672,6 @@ "node": "*" } }, - "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/minipass-fetch": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/nopt": { "version": "6.0.0", "dev": true, @@ -14070,47 +13702,25 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/ssri": { - "version": "9.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/unique-filename": { - "version": "2.0.1", + "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/readable-stream": { + "version": "3.6.2", "dev": true, "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "unique-slug": "^3.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 6" } }, - "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/unique-slug": { - "version": "3.0.0", + "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/signal-exit": { + "version": "3.0.7", "dev": true, "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "license": "ISC" }, "node_modules/semantic-release/node_modules/npm/node_modules/node-gyp/node_modules/which": { "version": "2.0.2", @@ -14179,7 +13789,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/npm-install-checks": { - "version": "6.3.0", + "version": "6.2.0", "dev": true, "inBundle": true, "license": "BSD-2-Clause", @@ -14272,15 +13882,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/semantic-release/node_modules/npm/node_modules/npm-registry-fetch/node_modules/minipass": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, "node_modules/semantic-release/node_modules/npm/node_modules/npm-user-validate": { "version": "2.0.0", "dev": true, @@ -14361,15 +13962,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/semantic-release/node_modules/npm/node_modules/pacote/node_modules/minipass": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, "node_modules/semantic-release/node_modules/npm/node_modules/parse-conflict-json": { "version": "3.0.1", "dev": true, @@ -14403,13 +13995,13 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/path-scurry": { - "version": "1.10.1", + "version": "1.9.2", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "lru-cache": "^9.1.1", + "minipass": "^5.0.0 || ^6.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -14419,7 +14011,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", + "version": "9.1.1", "dev": true, "inBundle": true, "license": "ISC", @@ -14428,7 +14020,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.15", + "version": "6.0.13", "dev": true, "inBundle": true, "license": "MIT", @@ -14449,6 +14041,15 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/semantic-release/node_modules/npm/node_modules/process": { + "version": "0.11.10", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/semantic-release/node_modules/npm/node_modules/promise-all-reject-late": { "version": "1.0.1", "dev": true, @@ -14556,17 +14157,18 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/readable-stream": { - "version": "3.6.2", + "version": "4.4.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10" }, "engines": { - "node": ">= 6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/semantic-release/node_modules/npm/node_modules/retry": { @@ -14663,7 +14265,7 @@ "optional": true }, "node_modules/semantic-release/node_modules/npm/node_modules/semver": { - "version": "7.6.0", + "version": "7.5.4", "dev": true, "inBundle": true, "license": "ISC", @@ -14717,7 +14319,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/signal-exit": { - "version": "4.1.0", + "version": "4.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -14758,16 +14360,16 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/socks": { - "version": "2.8.1", + "version": "2.7.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "ip-address": "^9.0.5", + "ip": "^2.0.0", "smart-buffer": "^4.2.0" }, "engines": { - "node": ">= 10.0.0", + "node": ">= 10.13.0", "npm": ">= 3.0.0" } }, @@ -14796,7 +14398,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.5.0", + "version": "2.3.0", "dev": true, "inBundle": true, "license": "CC-BY-3.0" @@ -14812,18 +14414,18 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.17", + "version": "3.0.13", "dev": true, "inBundle": true, "license": "CC0-1.0" }, "node_modules/semantic-release/node_modules/npm/node_modules/ssri": { - "version": "10.0.5", + "version": "10.0.4", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "minipass": "^7.0.3" + "minipass": "^5.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -14905,7 +14507,7 @@ } }, "node_modules/semantic-release/node_modules/npm/node_modules/tar": { - "version": "6.2.0", + "version": "6.1.15", "dev": true, "inBundle": true, "license": "ISC", @@ -14945,15 +14547,6 @@ "node": ">=8" } }, - "node_modules/semantic-release/node_modules/npm/node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, "node_modules/semantic-release/node_modules/npm/node_modules/text-table": { "version": "0.2.0", "dev": true, @@ -15431,9 +15024,9 @@ } }, "node_modules/semantic-release/node_modules/type-fest": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.18.2.tgz", - "integrity": "sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.6.0.tgz", + "integrity": "sha512-rLjWJzQFOq4xw7MgJrCZ6T1jIOvvYElXT12r+y0CC6u67hegDHaxcPqb2fZHOGlqxugGQPNB1EnTezjBetkwkw==", "dev": true, "engines": { "node": ">=16" @@ -15530,32 +15123,29 @@ "dev": true }, "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", "dev": true, "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" + "has-property-descriptors": "^1.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", "dev": true, "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", + "define-data-property": "^1.0.1", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" + "has-property-descriptors": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -15583,18 +15173,14 @@ } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -15771,9 +15357,9 @@ } }, "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, "node_modules/spdx-expression-parse": { @@ -15787,9 +15373,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", - "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", "dev": true }, "node_modules/split": { @@ -16096,41 +15682,34 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", - "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", - "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", + "side-channel": "^1.0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -16140,31 +15719,28 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -16268,9 +15844,9 @@ "dev": true }, "node_modules/table": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", - "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", "dev": true, "dependencies": { "ajv": "^8.0.1", @@ -16284,15 +15860,15 @@ } }, "node_modules/table/node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.3", + "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" + "uri-js": "^4.2.2" }, "funding": { "type": "github", @@ -16447,9 +16023,9 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, "dependencies": { "psl": "^1.1.33", @@ -16483,18 +16059,10 @@ } }, "node_modules/traverse": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.9.tgz", - "integrity": "sha512-7bBrcF+/LQzSgFmT0X5YclVqQxtv7TDJ1f8Wj7ibBu/U6BMLeOpUxuZjV7rMc44UtKxlnMFigdhFAIszSX1DMg==", + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", + "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==", "dev": true, - "dependencies": { - "gopd": "^1.0.1", - "typedarray.prototype.slice": "^1.0.3", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -16509,9 +16077,9 @@ } }, "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "dev": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -16552,18 +16120,18 @@ } }, "node_modules/ts-node/node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", + "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", "dev": true, "engines": { "node": ">=0.4.0" } }, "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, "dependencies": { "@types/json5": "^0.0.29", @@ -16627,30 +16195,29 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.2", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" @@ -16660,17 +16227,16 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" @@ -16680,40 +16246,14 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.2", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typedarray.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.3.tgz", - "integrity": "sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-errors": "^1.3.0", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-offset": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "is-typed-array": "^1.1.9" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -16760,18 +16300,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", @@ -16800,9 +16328,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -16819,8 +16347,8 @@ } ], "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.1.1", + "picocolors": "^1.0.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -16857,19 +16385,6 @@ "requires-port": "^1.0.0" } }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -16889,9 +16404,9 @@ "dev": true }, "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz", + "integrity": "sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", @@ -16949,15 +16464,6 @@ "makeerror": "1.0.12" } }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -17033,16 +16539,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -17051,15 +16557,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -17103,9 +16600,9 @@ } }, "node_modules/ws": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", - "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", "dev": true, "engines": { "node": ">=10.0.0" @@ -17273,4 +16770,4 @@ } } } -} +} \ No newline at end of file diff --git a/package.json b/package.json index f38fe071a..50fdf2b90 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@firebolt-js/sdks", - "version": "1.2.0-next.2", + "version": "1.2.0-feature-user-interest.0", "description": "The Firebolt JS SDK", "type": "module", "bin": { @@ -45,7 +45,7 @@ "devDependencies": { "@commitlint/cli": "^17.0.3", "@commitlint/config-conventional": "^17.0.3", - "@firebolt-js/openrpc": "rdkcentral/firebolt-openrpc#feature/app-pass-through", + "@firebolt-js/openrpc": "../firebolt-openrpc", "@firebolt-js/schemas": "2.0.0", "@saithodev/semantic-release-backmerge": "^3.2.0", "@semantic-release/changelog": "^6.0.1", From 909b6b87cd4b28035f16f29d2268b0efcbccc144 Mon Sep 17 00:00:00 2001 From: "Shah, Kevin" Date: Tue, 14 May 2024 21:20:46 -0400 Subject: [PATCH 38/54] Reverted package json version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 50fdf2b90..0e50bf451 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@firebolt-js/sdks", - "version": "1.2.0-feature-user-interest.0", + "version": "1.2.0-next.2", "description": "The Firebolt JS SDK", "type": "module", "bin": { From 9a134839df485ca1fa141ac3d17e87c8bbbca734 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Thu, 16 May 2024 09:15:15 -0400 Subject: [PATCH 39/54] fix: Point to real firebolt-openrpc branch --- package-lock.json | 290 ++++++++++++++++++++++++++++++++++++++++------ package.json | 2 +- 2 files changed, 255 insertions(+), 37 deletions(-) diff --git a/package-lock.json b/package-lock.json index 003f9ba25..486ad4c8d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "devDependencies": { "@commitlint/cli": "^17.0.3", "@commitlint/config-conventional": "^17.0.3", - "@firebolt-js/openrpc": "../firebolt-openrpc", + "@firebolt-js/openrpc": "rdkcentral/firebolt-openrpc#feature/app-pass-through", "@firebolt-js/schemas": "2.0.0", "@saithodev/semantic-release-backmerge": "^3.2.0", "@semantic-release/changelog": "^6.0.1", @@ -37,38 +37,6 @@ "typescript": "^4.6.4" } }, - "../firebolt-openrpc": { - "name": "@firebolt-js/openrpc", - "version": "2.3.0-next.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "ajv": "^8.12.0", - "ajv-formats": "^2.1.1", - "array.prototype.groupby": "^1.1.0", - "crocks": "^0.12.4", - "deepmerge": "^4.2.2", - "fs-extra": "^10.1.0", - "highland": "^2.13.5", - "mkdirp": "^0.5.6", - "node-fetch": "^3.2.10", - "nopt": "^5.0.0", - "util": "^0.12.4" - }, - "bin": { - "firebolt-openrpc": "src/cli.mjs" - }, - "devDependencies": { - "@commitlint/cli": "^17.1.2", - "@commitlint/config-conventional": "^17.1.0", - "@semantic-release/changelog": "^6.0.1", - "@semantic-release/git": "^10.0.1", - "@semantic-release/npm": "^9.0.1", - "husky": "^8.0.1", - "jest": "^27.3.1", - "semantic-release": "^19.0.5" - } - }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", @@ -1107,8 +1075,95 @@ "link": true }, "node_modules/@firebolt-js/openrpc": { - "resolved": "../firebolt-openrpc", - "link": true + "version": "3.0.0-next.1", + "resolved": "git+ssh://git@github.com/rdkcentral/firebolt-openrpc.git#76db0a471edc7b1e0edbb58f20bb8c7fd7da49df", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "ajv": "^8.12.0", + "ajv-formats": "^2.1.1", + "array.prototype.groupby": "^1.1.0", + "crocks": "^0.12.4", + "deepmerge": "^4.2.2", + "fs-extra": "^10.1.0", + "highland": "^2.13.5", + "mkdirp": "^0.5.6", + "node-fetch": "^3.2.10", + "nopt": "^5.0.0", + "util": "^0.12.4" + }, + "bin": { + "firebolt-openrpc": "src/cli.mjs" + } + }, + "node_modules/@firebolt-js/openrpc/node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/@firebolt-js/openrpc/node_modules/ajv": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@firebolt-js/openrpc/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@firebolt-js/openrpc/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/@firebolt-js/openrpc/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/@firebolt-js/openrpc/node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } }, "node_modules/@firebolt-js/schemas": { "version": "2.0.0", @@ -2681,6 +2736,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.groupby": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array.prototype.groupby/-/array.prototype.groupby-1.1.0.tgz", + "integrity": "sha512-p+QtvmnNEBqajQWLG3kPls8cLPBfJgvayzc/qplsX8Vchtevtq+TR2gyav5xs5h+mdUjfgOvYoCdTsVxu3b5sA==", + "deprecated": "This proposal has been altered; please use https://npmjs.com/object.groupby instead!", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.1" + } + }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", @@ -3306,6 +3375,12 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "node_modules/crocks": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/crocks/-/crocks-0.12.4.tgz", + "integrity": "sha512-paln6xJUrR9e/OWMFsyTi4dLyr+q99C5f7PQbGgSDHtwsfW0sCNZvnpHzvniI2dAE0uoBgeIP1Ukmme8Z0HxxA==", + "dev": true + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -3362,6 +3437,15 @@ "node": ">=8" } }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, "node_modules/data-urls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", @@ -4731,6 +4815,29 @@ "bser": "2.1.1" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/figures": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", @@ -4845,6 +4952,18 @@ "node": ">= 6" } }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -5302,6 +5421,15 @@ "node": ">= 0.4" } }, + "node_modules/highland": { + "version": "2.13.5", + "resolved": "https://registry.npmjs.org/highland/-/highland-2.13.5.tgz", + "integrity": "sha512-dn2flPapIIAa4BtkB2ahjshg8iSJtrJtdhEb9/oiOrS5HMQTR/GuhFpqJ+11YBdtnl3AwWKvbZd1Uxr8uAmA7A==", + "dev": true, + "dependencies": { + "util-deprecate": "^1.0.2" + } + }, "node_modules/hook-std": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", @@ -5560,6 +5688,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -5674,6 +5818,21 @@ "node": ">=6" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -7304,6 +7463,25 @@ "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", "dev": true }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-emoji": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", @@ -7313,6 +7491,24 @@ "lodash": "^4.17.21" } }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -16385,6 +16581,19 @@ "requires-port": "^1.0.0" } }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -16464,6 +16673,15 @@ "makeerror": "1.0.12" } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -16770,4 +16988,4 @@ } } } -} \ No newline at end of file +} diff --git a/package.json b/package.json index 0e50bf451..f38fe071a 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "devDependencies": { "@commitlint/cli": "^17.0.3", "@commitlint/config-conventional": "^17.0.3", - "@firebolt-js/openrpc": "../firebolt-openrpc", + "@firebolt-js/openrpc": "rdkcentral/firebolt-openrpc#feature/app-pass-through", "@firebolt-js/schemas": "2.0.0", "@saithodev/semantic-release-backmerge": "^3.2.0", "@semantic-release/changelog": "^6.0.1", From ca615d145c5ce3f5df0810ac90e0df52f9a1f2e1 Mon Sep 17 00:00:00 2001 From: "Shah, Kevin" Date: Fri, 17 May 2024 09:11:25 -0400 Subject: [PATCH 40/54] package-lock.json points to latest commit --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 486ad4c8d..c4f43896e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1076,7 +1076,7 @@ }, "node_modules/@firebolt-js/openrpc": { "version": "3.0.0-next.1", - "resolved": "git+ssh://git@github.com/rdkcentral/firebolt-openrpc.git#76db0a471edc7b1e0edbb58f20bb8c7fd7da49df", + "resolved": "git+ssh://git@github.com/rdkcentral/firebolt-openrpc.git#3820cad9d0de87adc9055a4044aa1a6fa48bc103", "dev": true, "license": "Apache-2.0", "dependencies": { From 8ef85f699658636a29506ed8ddf8e6d207d7cf5f Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Wed, 22 May 2024 11:19:22 -0400 Subject: [PATCH 41/54] fix: Remove aggregated providers --- .../app-passthrough-apis.md | 55 ------------------- 1 file changed, 55 deletions(-) diff --git a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md index b444690e3..a9bc39812 100644 --- a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md +++ b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md @@ -28,11 +28,9 @@ The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL - [2. Table of Contents](#2-table-of-contents) - [3. Open RPC Extensions](#3-open-rpc-extensions) - [3.1. Provided By Extension](#31-provided-by-extension) - - [3.2. Multiple Providers Extension](#32-multiple-providers-extension) - [4. Routing App pass-through APIs](#4-routing-app-pass-through-apis) - [4.1. No available providers](#41-no-available-providers) - [4.2. Direct pass-through](#42-direct-pass-through) - - [4.3. Aggregated pass-through results](#43-aggregated-pass-through-results) - [4.4. Pass-through notifications](#44-pass-through-notifications) - [5. Provider Candidates](#5-provider-candidates) - [6. Best Candidate](#6-best-candidate) @@ -79,33 +77,6 @@ The provider method **MUST** provide the same capability that the platform metho If a platform method has no provider method then it is not a valid Firebolt OpenRPC method schema, and a validation error **MUST** be generated. -### 3.2. Multiple Providers Extension -Firebolt OpenRPC **MUST** support a `string` `x-multiple-providers` extension property on the `capabilities` tag that denotes a single method request may be provided by multiple apps on the device registering for the specified provider API, e.g.: - -```json -{ - "methods": [ - { - "name": "Content.search", - "tags": [ - { - "name": "capabilities", - "x-provided-by": "Discover.onRequestSearch", - "x-multiple-providers": true, - "x-uses": [ - "xrn:firebolt:capability:discovery:search" - ] - } - ] - } - ] -} -``` - -Setting `x-multiple-providers` to `true` means that all available apps that can provide the capability **MUST** be called and their results aggregated into an array for the final result. - -A platform method with `x-multiple-providers` set to `true` **MUST** have an `array` result type. - ## 4. Routing App pass-through APIs App pass-through APIs may be routed in one of several ways. @@ -146,32 +117,6 @@ If the platform method result schema matches the `x-response` schema on the prov Otherwise if the platform method result schema has a property that matches the `x-response` schema on the provider method then the value **MUST** be composed into an object under the corresponding property name and the platform **MUST** apply any [result transformations](#9-result-transformations) to the composed result. -### 4.3. Aggregated pass-through results -An aggregated pass-through is where many apps provide responses to a single request by another app. The results are aggregated inside of an array. - -This section only applies to app provider methods that do not have an `event` tag and do have the `x-multiple-providers` extension set to `true`. - -The platform method result schema **MUST** have a type of `array`. - -The platform method result schema **MUST** have an `items` sub-schema that either: - -> Matches the `x-response` schema on the provider method so that the result can be added to the final array. -> -> or -> -> Has a property that matches the `x-response` schema on the provider method so that the result can be composed -> and added to the final array. - -The platform **MUST** call the provider method from each [candidate app](#7-provider-candidates) and aggregated all of the results into an array. - -If the platform method result `items` schema matches the `x-response` schema on the provider method then each provier value **MUST** be used as-is. - -Otherwise if the platform method result `items` schema has a property that matches the `x-response` schema on the provider method then each provider value **MUST** be composed into an object under the corresponding property name and the platform **MUST** apply any [result transformations](#9-result-transformations) to the composed result. - -If some providers time out, the providers that did not time out **MUST** be returned, with the remaining providers omitted. - -Time out durations are out of scope for this document, and are specified on a per feature basis. - ### 4.4. Pass-through notifications Firebolt events have a synchronous subscriber registration method, e.g. `Lifecycle.onInactive(true)`, in addition to asynchronous notifications when the event actually happens. For events powered by an app pass-through, only the asynchronous notifications are passed in by the providing app. The initial event registration is handled by the platform, and the success response is not handled by the providing app. From 8b6a20727adfd66f644bfd233e5688b43de910e3 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Wed, 22 May 2024 13:34:31 -0400 Subject: [PATCH 42/54] chore: resolve package-lock --- package-lock.json | 288 ++++++---------------------------------------- 1 file changed, 35 insertions(+), 253 deletions(-) diff --git a/package-lock.json b/package-lock.json index c4f43896e..4762a3974 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "devDependencies": { "@commitlint/cli": "^17.0.3", "@commitlint/config-conventional": "^17.0.3", - "@firebolt-js/openrpc": "rdkcentral/firebolt-openrpc#feature/app-pass-through", + "@firebolt-js/openrpc": "../firebolt-openrpc", "@firebolt-js/schemas": "2.0.0", "@saithodev/semantic-release-backmerge": "^3.2.0", "@semantic-release/changelog": "^6.0.1", @@ -37,6 +37,38 @@ "typescript": "^4.6.4" } }, + "../firebolt-openrpc": { + "name": "@firebolt-js/openrpc", + "version": "3.0.0-next.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "ajv": "^8.12.0", + "ajv-formats": "^2.1.1", + "array.prototype.groupby": "^1.1.0", + "crocks": "^0.12.4", + "deepmerge": "^4.2.2", + "fs-extra": "^10.1.0", + "highland": "^2.13.5", + "mkdirp": "^0.5.6", + "node-fetch": "^3.2.10", + "nopt": "^5.0.0", + "util": "^0.12.4" + }, + "bin": { + "firebolt-openrpc": "src/cli.mjs" + }, + "devDependencies": { + "@commitlint/cli": "^17.1.2", + "@commitlint/config-conventional": "^17.1.0", + "@semantic-release/changelog": "^6.0.1", + "@semantic-release/git": "^10.0.1", + "@semantic-release/npm": "^9.0.1", + "husky": "^8.0.1", + "jest": "^27.3.1", + "semantic-release": "^19.0.5" + } + }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", @@ -1075,95 +1107,8 @@ "link": true }, "node_modules/@firebolt-js/openrpc": { - "version": "3.0.0-next.1", - "resolved": "git+ssh://git@github.com/rdkcentral/firebolt-openrpc.git#3820cad9d0de87adc9055a4044aa1a6fa48bc103", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "ajv": "^8.12.0", - "ajv-formats": "^2.1.1", - "array.prototype.groupby": "^1.1.0", - "crocks": "^0.12.4", - "deepmerge": "^4.2.2", - "fs-extra": "^10.1.0", - "highland": "^2.13.5", - "mkdirp": "^0.5.6", - "node-fetch": "^3.2.10", - "nopt": "^5.0.0", - "util": "^0.12.4" - }, - "bin": { - "firebolt-openrpc": "src/cli.mjs" - } - }, - "node_modules/@firebolt-js/openrpc/node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/@firebolt-js/openrpc/node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@firebolt-js/openrpc/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@firebolt-js/openrpc/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/@firebolt-js/openrpc/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/@firebolt-js/openrpc/node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } + "resolved": "../firebolt-openrpc", + "link": true }, "node_modules/@firebolt-js/schemas": { "version": "2.0.0", @@ -2736,20 +2681,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.groupby": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array.prototype.groupby/-/array.prototype.groupby-1.1.0.tgz", - "integrity": "sha512-p+QtvmnNEBqajQWLG3kPls8cLPBfJgvayzc/qplsX8Vchtevtq+TR2gyav5xs5h+mdUjfgOvYoCdTsVxu3b5sA==", - "deprecated": "This proposal has been altered; please use https://npmjs.com/object.groupby instead!", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.1" - } - }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", @@ -3375,12 +3306,6 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, - "node_modules/crocks": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/crocks/-/crocks-0.12.4.tgz", - "integrity": "sha512-paln6xJUrR9e/OWMFsyTi4dLyr+q99C5f7PQbGgSDHtwsfW0sCNZvnpHzvniI2dAE0uoBgeIP1Ukmme8Z0HxxA==", - "dev": true - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -3437,15 +3362,6 @@ "node": ">=8" } }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, "node_modules/data-urls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", @@ -4815,29 +4731,6 @@ "bser": "2.1.1" } }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, "node_modules/figures": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", @@ -4952,18 +4845,6 @@ "node": ">= 6" } }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dev": true, - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, "node_modules/from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -5421,15 +5302,6 @@ "node": ">= 0.4" } }, - "node_modules/highland": { - "version": "2.13.5", - "resolved": "https://registry.npmjs.org/highland/-/highland-2.13.5.tgz", - "integrity": "sha512-dn2flPapIIAa4BtkB2ahjshg8iSJtrJtdhEb9/oiOrS5HMQTR/GuhFpqJ+11YBdtnl3AwWKvbZd1Uxr8uAmA7A==", - "dev": true, - "dependencies": { - "util-deprecate": "^1.0.2" - } - }, "node_modules/hook-std": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", @@ -5688,22 +5560,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -5818,21 +5674,6 @@ "node": ">=6" } }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -7463,25 +7304,6 @@ "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", "dev": true }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } - }, "node_modules/node-emoji": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", @@ -7491,24 +7313,6 @@ "lodash": "^4.17.21" } }, - "node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "dev": true, - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -16581,19 +16385,6 @@ "requires-port": "^1.0.0" } }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -16673,15 +16464,6 @@ "makeerror": "1.0.12" } }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", From 803487463b98f893cb86e1e376c6d9b2a3b9fb02 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Wed, 22 May 2024 16:40:06 -0400 Subject: [PATCH 43/54] fix: Added previously generated methods, create Interest wrapper object --- .../specifications/discovery/user-interest.md | 44 ++- .../app-passthrough-apis.md | 2 +- src/openrpc/content.json | 320 ++++-------------- src/openrpc/discovery.json | 165 ++++++++- src/schemas/discovery.json | 66 ++-- src/schemas/entity.json | 3 +- src/sdks/core/test/suite/discovery.test.ts | 5 - src/sdks/discovery/test/suite/content.test.ts | 5 +- 8 files changed, 280 insertions(+), 330 deletions(-) diff --git a/requirements/specifications/discovery/user-interest.md b/requirements/specifications/discovery/user-interest.md index 62c8bc2da..d86814b32 100644 --- a/requirements/specifications/discovery/user-interest.md +++ b/requirements/specifications/discovery/user-interest.md @@ -63,8 +63,9 @@ track of which apps are using them separately. - [4.4. Discovery Interest Provider](#44-discovery-interest-provider) - [4.5. InterestIntent](#45-interestintent) - [5. Discovery SDK APIs](#5-discovery-sdk-apis) - - [5.1. Content.requestUserInterest](#51-contentrequestuserinterest) - - [5.2. Content.onUserInterest](#52-contentonuserinterest) + - [5.1. Interest Types](#51-interest-types) + - [5.2. Content.requestUserInterest](#52-contentrequestuserinterest) + - [5.3. Content.onUserInterest](#53-contentonuserinterest) ## 3. User Interest Flows @@ -84,7 +85,7 @@ meta-data, the device's Aggregated Experience will be notified of the user's interest in that entity: ```typescript -Discovery.userInterest(type:InterestType, reason: InterestReason, entity:EntityDetails) +Discovery.userInterest(type: InterestType, reason: InterestReason, entity: EntityDetails) ``` The `type` parameter denotes the directionality of the interest: @@ -111,15 +112,12 @@ When this method is called with a valid `EntityDetails`, the platform that have registered for it (typically Aggregated Experience Apps) with information about the app, interest type, and the entity. -The `Content.onUserInterest` event has three context parameters: +The `Content.onUserInterest` event has a result type of `Interest`: -| context | type | description | +| property | type | description | |---------|------|-------------| -| appid | string | The id of the app that pushed the user interest. | -| type | `InterestType` | the type of interest. | -| reason | `InterestReason` | the reason for the interest | - -The `Content.onUserInterest` event has a result type of `EntityDetails`. +| appId | string | The id of the app that pushed the user interest. | +| entity | `EntityDetails` | The entity the user expressed interest in. | An Aggregated Experience can register for the `Content.onUserInterest` notification, and it will receive notifications when an `EntityDetails` is @@ -280,21 +278,35 @@ type InterestIntent { The following APIs are exposed by the Firebolt Discovery SDK as part of the `Content` module. -### 5.1. Content.requestUserInterest +### 5.1. Interest Types +This type stores the various attributes of an Interest response or event: + +```typescript +type InterestType = "interest" | "disinterest" +type InterestReason = "playlist" | "reaction" | "recording" | "share" + +type Interest { + type: InterestType + reason: InterestReason + entity: EntityDetails +} +``` + +### 5.2. Content.requestUserInterest This method triggers the corresponding Discovery provider API for the provider app. ```typescript -Content.requestUserInterest(type: InterestType, reason: InterestReason): Promise +Content.requestUserInterest(type: InterestType, reason: InterestReason): Promise ``` -### 5.2. Content.onUserInterest +### 5.3. Content.onUserInterest This notification allows Aggregated Experience Apps to be informed when a user expresses interest in some Content, and the content resolves to a valid Entity from some App. -`Content.listen('userInterest', UserInterestInfo => void): Promise` +`Content.listen('userInterest', Interest => void): Promise` -The callback will be passed an `UserInterestInfo` object with -the type, reason, and information about the entity that the user expressed interest in. +The callback will be passed an `Interest` object with +the appId, type, reason, and information about the entity that the user expressed interest in. diff --git a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md index a9bc39812..53fb6dd6d 100644 --- a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md +++ b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md @@ -100,7 +100,7 @@ Where `` is the capability XRN string, e.g. `xrn:firebolt:capabilities:exam ### 4.2. Direct pass-through A direct pass-through is where a single app provides a single response to a single request by another app. -This section only applies to app provider methods that do not have an `event` tag and do not have the `x-multiple-providers` extension set to `true`. +This section only applies to app provider methods that do not have an `event` tag. The platform method result schema **MUST** either: diff --git a/src/openrpc/content.json b/src/openrpc/content.json index 7c2884db0..321d9c784 100644 --- a/src/openrpc/content.json +++ b/src/openrpc/content.json @@ -7,119 +7,62 @@ }, "methods": [ { - "name": "requestDetails", + "name": "requestUserInterest", "tags": [ { - "name": "push-pull", - "x-subscriber-type": "global" + "name": "push-pull" }, { "name": "capabilities", - "x-provided-by": "Discovery.onRequestDetails", + "x-provided-by": "Discovery.onRequestUserInterest", "x-uses": [ - "xrn:firebolt:capability:discovery:entity-info" + "xrn:firebolt:capability:discovery:user-interest" ] } ], - "summary": "Provide information about a program entity and its available watchable assets, such as entitlement status and price, via either a push or pull call flow.", - "description": "Provide information about a program entity and its available watchable assets, such as entitlement status and price, via either a push or pull call flow. Includes information about the program entity and its relevant associated entities, such as extras, previews, and, in the case of TV series, seasons and episodes.\n\nSee the `EntityInfo` and `WayToWatch` data structures below for more information.\n\nThe app only needs to implement Pull support for `entityInfo` at this time.", + "summary": "Provide information about the entity currently displayed or selected on the screen.", + "description": "Provide information about the entity currently displayed or selected on the screen.", "params": [ { - "name": "entityId", + "name": "type", "required": true, "schema": { - "type": "string" + "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/InterestType" + } + }, + { + "name": "reason", + "required": true, + "schema": { + "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/InterestReason" } } ], "result": { - "name": "details", + "name": "interest", "schema": { - "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/DetailsResult" + "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/Interest" }, - "summary": "The entityInfo data." + "summary": "The EntityDetails data." }, "examples": [ { - "name": "Send entity info for a movie to the platform.", + "name": "Default Example", "params": [ { - "name": "entityId", - "value": "345" - } - ], - "result": { - "name": "details", - "value": { - "expires": "2025-01-01T00:00:00.000Z", - "details": { - "identifiers": { - "entityId": "345", - "entityType": "program", - "programType": "movie" - }, - "info": { - "title": "Cool Runnings", - "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", - "releaseDate": "1993-01-01T00:00:00.000Z", - "contentRatings": [ - { - "scheme": "US-Movie", - "rating": "PG" - }, - { - "scheme": "CA-Movie", - "rating": "G" - } - ] - }, - "waysToWatch": [ - { - "identifiers": { - "assetId": "123" - }, - "expires": "2025-01-01T00:00:00.000Z", - "entitled": true, - "entitledExpires": "2025-01-01T00:00:00.000Z", - "offeringType": "buy", - "price": 2.99, - "videoQuality": [ - "UHD" - ], - "audioProfile": [ - "dolbyAtmos" - ], - "audioLanguages": [ - "en" - ], - "closedCaptions": [ - "en" - ], - "subtitles": [ - "es" - ], - "audioDescriptions": [ - "en" - ] - } - ] - } - } - } - }, - { - "name": "Send entity info for a movie with a trailer to the platform.", - "params": [ + "name": "type", + "value": "interest" + }, { - "name": "entityId", - "value": "345" + "name": "reason", + "value": "playlist" } ], "result": { - "name": "details", + "name": "interest", "value": { - "expires": "2025-01-01T00:00:00.000Z", - "details": { + "appId": "cool-app", + "entity": { "identifiers": { "entityId": "345", "entityType": "program", @@ -139,37 +82,7 @@ "rating": "G" } ] - }, - "waysToWatch": [ - { - "identifiers": { - "assetId": "123" - }, - "expires": "2025-01-01T00:00:00.000Z", - "entitled": true, - "entitledExpires": "2025-01-01T00:00:00.000Z", - "offeringType": "buy", - "price": 2.99, - "videoQuality": [ - "UHD" - ], - "audioProfile": [ - "dolbyAtmos" - ], - "audioLanguages": [ - "en" - ], - "closedCaptions": [ - "en" - ], - "subtitles": [ - "es" - ], - "audioDescriptions": [ - "en" - ] - } - ] + } } } } @@ -177,178 +90,65 @@ ] }, { - "name": "requestPurchases", + "name": "onUserInterest", "tags": [ { - "name": "push-pull" + "name": "event" }, { "name": "capabilities", - "x-provided-by": "Discovery.onRequestPurchases", + "x-provided-by": "Discovery.userInterest", "x-uses": [ - "xrn:firebolt:capability:discovery:purchased-content" + "xrn:firebolt:capability:discovery:user-interest" ] } ], - "summary": "Provide a list of purchased content for the authenticated account, such as rentals and electronic sell through purchases.", + "summary": "Provide information about the entity currently displayed or selected on the screen.", + "description": "Provide information about the entity currently displayed or selected on the screen.", "params": [], "result": { - "name": "purchases", - "required": true, + "name": "interest", "schema": { - "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/DetailsArrayResult" + "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/Interest" }, - "summary": "The data for the purchasedContent" + "summary": "The EntityDetails data." }, "examples": [ { - "name": "Inform the platform of the user's purchased content", + "name": "Default Example", "params": [], "result": { - "name": "purchases", + "name": "interest", "value": { - "totalCount": 10, - "expires": "2025-01-01T00:00:00.000Z", - "entries": [ - { - "identifiers": { - "entityId": "345", - "entityType": "program", - "programType": "movie" - }, - "info": { - "title": "Cool Runnings", - "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", - "releaseDate": "1993-01-01T00:00:00.000Z", - "contentRatings": [ - { - "scheme": "US-Movie", - "rating": "PG" - }, - { - "scheme": "CA-Movie", - "rating": "G" - } - ] - }, - "waysToWatch": [ + "appId": "cool-app", + "type": "interest", + "reason": "playlist", + "entity": { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ { - "identifiers": { - "assetId": "123" - }, - "expires": "2025-01-01T00:00:00.000Z", - "entitled": true, - "entitledExpires": "2025-01-01T00:00:00.000Z", - "offeringType": "buy", - "price": 2.99, - "videoQuality": [ - "UHD" - ], - "audioProfile": [ - "dolbyAtmos" - ], - "audioLanguages": [ - "en" - ], - "closedCaptions": [ - "en" - ], - "subtitles": [ - "es" - ], - "audioDescriptions": [ - "en" - ] + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" } ] } - ] - } - } - } - ], - "description": "Return content purchased by the user, such as rentals and electronic sell through purchases.\n\nThe app should return the user's 100 most recent purchases in `entries`. The total count of purchases must be provided in `count`. If `count` is greater than the total number of `entries`, the UI may provide a link into the app to see the complete purchase list.\n\nThe `EntityInfo` object returned is not required to have `waysToWatch` populated, but it is recommended that it do so in case the UI wants to surface additional information on the purchases screen.\n\nThe app should implement both Push and Pull methods for `purchasedContent`.\n\nThe app should actively push `purchasedContent` when:\n\n* The app becomes Active.\n* When the state of the purchasedContent set has changed.\n* The app goes into Inactive or Background state, if there is a chance a change event has been missed." - }, - { - "name": "requestUserInterest", - "tags": [ - { - "name": "push-pull" - }, - { - "name": "capabilities", - "x-provided-by": "Discovery.onRequestUserInterest", - "x-uses": [ - "xrn:firebolt:capability:discovery:user-interest" - ] - } - ], - "summary": "Provide information about the entity currently displayed or selected on the screen.", - "description": "Provide information about the entity currently displayed or selected on the screen.", - "params": [ - { - "name": "type", - "required": true, - "schema": { - "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/InterestType" - } - }, - { - "name": "reason", - "required": true, - "schema": { - "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/InterestReason" - } - } - ], - "result": { - "name": "entity", - "required": true, - "schema": { - "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/EntityDetails" - }, - "summary": "The EntityDetails data." - }, - "examples": [ - { - "name": "Default Example", - "params": [ - { - "name": "type", - "value": "interest" - }, - { - "name": "reason", - "value": "playlist" - } - ], - "result": { - "name": "entity", - "value": { - "identifiers": { - "entityId": "345", - "entityType": "program", - "programType": "movie" - }, - "info": { - "title": "Cool Runnings", - "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", - "releaseDate": "1993-01-01T00:00:00.000Z", - "contentRatings": [ - { - "scheme": "US-Movie", - "rating": "PG" - }, - { - "scheme": "CA-Movie", - "rating": "G" - } - ] } } } } ] - } + } ] } diff --git a/src/openrpc/discovery.json b/src/openrpc/discovery.json index 06ad4b12d..3dd597115 100644 --- a/src/openrpc/discovery.json +++ b/src/openrpc/discovery.json @@ -1475,7 +1475,158 @@ } } ] - } + }, + { + "name": "userInterest", + "summary": "Send an entity that the user has expressed interest in to the platform.", + "tags": [ + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:user-interest" + } + ], + "params": [ + { + "name": "type", + "required": true, + "schema": { + "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/InterestType" + } + }, + { + "name": "reason", + "required": true, + "schema": { + "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/InterestReason" + } + }, + { + "name": "entity", + "required": true, + "schema": { + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/EntityDetails" + } + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "type", + "value": "interest" + }, + { + "name": "reason", + "value": "playlist" + }, + { + "name": "entity", + "value": { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + + } + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Discovery.onRequestUserInterest", + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "event", + "x-response": { + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/EntityDetails", + "examples": [ + { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + } + } + ] + } + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:user-interest" + } + ], + "summary": "Provide information about the entity currently displayed or selected on the screen.", + "description": "Provide information about the entity currently displayed or selected on the screen.", + "params": [], + "result": { + "name": "request", + "schema": { + "type": "object", + "required": [ + "correlationId", + "parameters" + ], + "properties": { + "correlationId": { + "type": "string" + }, + "parameters": { + "$ref": "#/components/schemas/UserInterestProviderParameters" + } + }, + "additionalProperties": false + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "request", + "value": { + "correlationId": "xyz", + "parameters": { + "type": "interest", + "reason": "playlist" + } + } + } + } + ] + } ], "components": { "schemas": { @@ -1793,6 +1944,18 @@ "enum": [ "xrn:firebolt:channel:any" ] + }, + "UserInterestProviderParameters": { + "title": "UserInterestProviderParameters", + "type": "object", + "properties": { + "type": { + "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/InterestType" + }, + "reason": { + "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/InterestReason" + } + } } } } diff --git a/src/schemas/discovery.json b/src/schemas/discovery.json index b00d954a5..58ccb2c1f 100644 --- a/src/schemas/discovery.json +++ b/src/schemas/discovery.json @@ -58,50 +58,6 @@ ], "additionalProperties": false }, - "DetailsResult": { - "title": "DetailsResult", - "type": "object", - "additionalProperties": false, - "required": [ - "expires", - "details" - ], - "properties": { - "expires": { - "type": "string", - "format": "date-time" - }, - "details": { - "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/EntityDetails" - } - } - }, - "DetailsArrayResult": { - "title": "DetailsArrayResult", - "type": "object", - "additionalProperties": false, - "required": [ - "expires", - "entries", - "totalCount" - ], - "properties": { - "expires": { - "type": "string", - "format": "date-time" - }, - "totalCount": { - "type": "integer", - "minimum": 0 - }, - "entries": { - "type": "array", - "items": { - "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/EntityDetails" - } - } - } - }, "InterestType": { "title": "InterestType", "type": "string", @@ -118,6 +74,28 @@ "reaction", "recording" ] + }, + "Interest": { + "title": "Interest", + "type": "object", + "properties": { + "appId": { + "type": "string" + }, + "type": { + "$ref": "#/definitions/InterestType" + }, + "reason": { + "$ref": "#/definitions/InterestReason" + }, + "entity": { + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/EntityDetails" + } + }, + "required": [ + "appId", + "entity" + ] } } } diff --git a/src/schemas/entity.json b/src/schemas/entity.json index e385462c3..2e486e865 100644 --- a/src/schemas/entity.json +++ b/src/schemas/entity.json @@ -36,8 +36,7 @@ "title": "EntityDetails", "type": "object", "required": [ - "identifiers", - "info" + "identifiers" ], "properties": { "identifiers": { diff --git a/src/sdks/core/test/suite/discovery.test.ts b/src/sdks/core/test/suite/discovery.test.ts index dae97660b..7402dce42 100644 --- a/src/sdks/core/test/suite/discovery.test.ts +++ b/src/sdks/core/test/suite/discovery.test.ts @@ -152,11 +152,6 @@ test("clear()", () => { }); test("details() provider", () => { - class myDetailsProvider implements Discovery.DetailsProvider { - details(parameters?: object, session?: Discovery.ProviderSession): Promise { - return null - } - } class myUserInterestProvider implements Discovery.UserInterestProvider { userInterest(parameters?: object, session?: Discovery.ProviderSession): Promise { diff --git a/src/sdks/discovery/test/suite/content.test.ts b/src/sdks/discovery/test/suite/content.test.ts index 5ee6c48fb..810437f8b 100644 --- a/src/sdks/discovery/test/suite/content.test.ts +++ b/src/sdks/discovery/test/suite/content.test.ts @@ -20,7 +20,10 @@ import { test, expect } from "@jest/globals"; import { Content } from "../../build/javascript/src/firebolt-discovery"; test("Content.requestUserInterest()", () => { - return Content.requestUserInterest(Content.InterestType.INTEREST, Content.InterestReason.PLAYLIST).then((entity:Content.EntityDetails) => { + return Content.requestUserInterest(Content.InterestType.INTEREST, Content.InterestReason.PLAYLIST).then((interest: Content.Interest) => { + const entity = interest.entity + const appId = interest.appId + expect(appId).toBeDefined() expect(entity).toBeDefined() expect(entity.info.title).toBe("Cool Runnings") }) From 88b556fe068861915084b80a9d6c101074fa45c1 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Wed, 22 May 2024 16:42:41 -0400 Subject: [PATCH 44/54] fix: Required fields on Interest --- requirements/specifications/discovery/user-interest.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/requirements/specifications/discovery/user-interest.md b/requirements/specifications/discovery/user-interest.md index d86814b32..192ea35bc 100644 --- a/requirements/specifications/discovery/user-interest.md +++ b/requirements/specifications/discovery/user-interest.md @@ -117,6 +117,8 @@ The `Content.onUserInterest` event has a result type of `Interest`: | property | type | description | |---------|------|-------------| | appId | string | The id of the app that pushed the user interest. | +| type | `InterestType` | the type of interest. | +| reason | `InterestReason` | the reason for the interest | | entity | `EntityDetails` | The entity the user expressed interest in. | An Aggregated Experience can register for the `Content.onUserInterest` @@ -286,9 +288,10 @@ type InterestType = "interest" | "disinterest" type InterestReason = "playlist" | "reaction" | "recording" | "share" type Interest { - type: InterestType - reason: InterestReason + appId: string entity: EntityDetails + type?: InterestType + reason?: InterestReason } ``` From cf6f29f7d6662c3122eaa8ea8a4736d6ef510189 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Wed, 22 May 2024 16:50:23 -0400 Subject: [PATCH 45/54] Update package-lock.json --- package-lock.json | 288 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 253 insertions(+), 35 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4762a3974..adc594cde 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "devDependencies": { "@commitlint/cli": "^17.0.3", "@commitlint/config-conventional": "^17.0.3", - "@firebolt-js/openrpc": "../firebolt-openrpc", + "@firebolt-js/openrpc": "rdkcentral/firebolt-openrpc#feature/app-pass-through", "@firebolt-js/schemas": "2.0.0", "@saithodev/semantic-release-backmerge": "^3.2.0", "@semantic-release/changelog": "^6.0.1", @@ -37,38 +37,6 @@ "typescript": "^4.6.4" } }, - "../firebolt-openrpc": { - "name": "@firebolt-js/openrpc", - "version": "3.0.0-next.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "ajv": "^8.12.0", - "ajv-formats": "^2.1.1", - "array.prototype.groupby": "^1.1.0", - "crocks": "^0.12.4", - "deepmerge": "^4.2.2", - "fs-extra": "^10.1.0", - "highland": "^2.13.5", - "mkdirp": "^0.5.6", - "node-fetch": "^3.2.10", - "nopt": "^5.0.0", - "util": "^0.12.4" - }, - "bin": { - "firebolt-openrpc": "src/cli.mjs" - }, - "devDependencies": { - "@commitlint/cli": "^17.1.2", - "@commitlint/config-conventional": "^17.1.0", - "@semantic-release/changelog": "^6.0.1", - "@semantic-release/git": "^10.0.1", - "@semantic-release/npm": "^9.0.1", - "husky": "^8.0.1", - "jest": "^27.3.1", - "semantic-release": "^19.0.5" - } - }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", @@ -1107,8 +1075,95 @@ "link": true }, "node_modules/@firebolt-js/openrpc": { - "resolved": "../firebolt-openrpc", - "link": true + "version": "3.0.0-next.1", + "resolved": "git+ssh://git@github.com/rdkcentral/firebolt-openrpc.git#6d0ea39a20ee55d3534186f7095c3ae0a48ce3c4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "ajv": "^8.12.0", + "ajv-formats": "^2.1.1", + "array.prototype.groupby": "^1.1.0", + "crocks": "^0.12.4", + "deepmerge": "^4.2.2", + "fs-extra": "^10.1.0", + "highland": "^2.13.5", + "mkdirp": "^0.5.6", + "node-fetch": "^3.2.10", + "nopt": "^5.0.0", + "util": "^0.12.4" + }, + "bin": { + "firebolt-openrpc": "src/cli.mjs" + } + }, + "node_modules/@firebolt-js/openrpc/node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/@firebolt-js/openrpc/node_modules/ajv": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@firebolt-js/openrpc/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@firebolt-js/openrpc/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/@firebolt-js/openrpc/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/@firebolt-js/openrpc/node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } }, "node_modules/@firebolt-js/schemas": { "version": "2.0.0", @@ -2681,6 +2736,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.groupby": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array.prototype.groupby/-/array.prototype.groupby-1.1.0.tgz", + "integrity": "sha512-p+QtvmnNEBqajQWLG3kPls8cLPBfJgvayzc/qplsX8Vchtevtq+TR2gyav5xs5h+mdUjfgOvYoCdTsVxu3b5sA==", + "deprecated": "This proposal has been altered; please use https://npmjs.com/object.groupby instead!", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.1" + } + }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", @@ -3306,6 +3375,12 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "node_modules/crocks": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/crocks/-/crocks-0.12.4.tgz", + "integrity": "sha512-paln6xJUrR9e/OWMFsyTi4dLyr+q99C5f7PQbGgSDHtwsfW0sCNZvnpHzvniI2dAE0uoBgeIP1Ukmme8Z0HxxA==", + "dev": true + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -3362,6 +3437,15 @@ "node": ">=8" } }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, "node_modules/data-urls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", @@ -4731,6 +4815,29 @@ "bser": "2.1.1" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/figures": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", @@ -4845,6 +4952,18 @@ "node": ">= 6" } }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -5302,6 +5421,15 @@ "node": ">= 0.4" } }, + "node_modules/highland": { + "version": "2.13.5", + "resolved": "https://registry.npmjs.org/highland/-/highland-2.13.5.tgz", + "integrity": "sha512-dn2flPapIIAa4BtkB2ahjshg8iSJtrJtdhEb9/oiOrS5HMQTR/GuhFpqJ+11YBdtnl3AwWKvbZd1Uxr8uAmA7A==", + "dev": true, + "dependencies": { + "util-deprecate": "^1.0.2" + } + }, "node_modules/hook-std": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", @@ -5560,6 +5688,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -5674,6 +5818,21 @@ "node": ">=6" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -7304,6 +7463,25 @@ "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", "dev": true }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-emoji": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", @@ -7313,6 +7491,24 @@ "lodash": "^4.17.21" } }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -16385,6 +16581,19 @@ "requires-port": "^1.0.0" } }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -16464,6 +16673,15 @@ "makeerror": "1.0.12" } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", From 32415d964ce8d00df8fa7ae4396fa77fd8ca68fa Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Wed, 22 May 2024 18:44:30 -0400 Subject: [PATCH 46/54] fix: Split event and provider types --- src/openrpc/content.json | 54 +++++++++++++++++-- src/schemas/discovery.json | 24 +-------- src/sdks/discovery/test/suite/content.test.ts | 15 +++++- 3 files changed, 64 insertions(+), 29 deletions(-) diff --git a/src/openrpc/content.json b/src/openrpc/content.json index 321d9c784..63d2925be 100644 --- a/src/openrpc/content.json +++ b/src/openrpc/content.json @@ -41,7 +41,7 @@ "result": { "name": "interest", "schema": { - "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/Interest" + "$ref": "#/components/schemas/InterestResult" }, "summary": "The EntityDetails data." }, @@ -109,7 +109,7 @@ "result": { "name": "interest", "schema": { - "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/Interest" + "$ref": "#/components/schemas/InterestEvent" }, "summary": "The EntityDetails data." }, @@ -149,6 +149,50 @@ } } ] - } - ] -} + } + ], + "components": { + "schemas": { + "InterestResult": { + "title": "InterestResult", + "type": "object", + "properties": { + "appId": { + "type": "string" + }, + "entity": { + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/EntityDetails" + } + }, + "required": [ + "appId", + "entity" + ] + }, + "InterestEvent": { + "title": "InterestEvent", + "type": "object", + "properties": { + "appId": { + "type": "string" + }, + "type": { + "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/InterestType" + }, + "reason": { + "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/InterestReason" + }, + "entity": { + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/EntityDetails" + } + }, + "required": [ + "appId", + "entity", + "type", + "reason" + ] + } + } + } +} \ No newline at end of file diff --git a/src/schemas/discovery.json b/src/schemas/discovery.json index 58ccb2c1f..1c13435a7 100644 --- a/src/schemas/discovery.json +++ b/src/schemas/discovery.json @@ -74,28 +74,6 @@ "reaction", "recording" ] - }, - "Interest": { - "title": "Interest", - "type": "object", - "properties": { - "appId": { - "type": "string" - }, - "type": { - "$ref": "#/definitions/InterestType" - }, - "reason": { - "$ref": "#/definitions/InterestReason" - }, - "entity": { - "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/EntityDetails" - } - }, - "required": [ - "appId", - "entity" - ] } - } + } } diff --git a/src/sdks/discovery/test/suite/content.test.ts b/src/sdks/discovery/test/suite/content.test.ts index 810437f8b..1ab4e98c8 100644 --- a/src/sdks/discovery/test/suite/content.test.ts +++ b/src/sdks/discovery/test/suite/content.test.ts @@ -20,7 +20,7 @@ import { test, expect } from "@jest/globals"; import { Content } from "../../build/javascript/src/firebolt-discovery"; test("Content.requestUserInterest()", () => { - return Content.requestUserInterest(Content.InterestType.INTEREST, Content.InterestReason.PLAYLIST).then((interest: Content.Interest) => { + return Content.requestUserInterest(Content.InterestType.INTEREST, Content.InterestReason.PLAYLIST).then((interest: Content.InterestResult) => { const entity = interest.entity const appId = interest.appId expect(appId).toBeDefined() @@ -28,3 +28,16 @@ test("Content.requestUserInterest()", () => { expect(entity.info.title).toBe("Cool Runnings") }) }); + +test("Content.onUserInterest()", () => { + return Content.listen('userInterest', (interest: Content.InterestEvent) => { + const entity = interest.entity + const appId = interest.appId + const reason = interest.reason + expect(interest['type']).toBeDefined() + expect(reason).toBeDefined() + expect(appId).toBeDefined() + expect(entity).toBeDefined() + expect(entity.info.title).toBe("Cool Runnings") + }) +}); From 3e963b1ad4887278247c696f74e3cee784afe398 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Thu, 23 May 2024 11:48:49 -0400 Subject: [PATCH 47/54] fix: Turn on pass-through validation --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index adc594cde..296839864 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1076,7 +1076,7 @@ }, "node_modules/@firebolt-js/openrpc": { "version": "3.0.0-next.1", - "resolved": "git+ssh://git@github.com/rdkcentral/firebolt-openrpc.git#6d0ea39a20ee55d3534186f7095c3ae0a48ce3c4", + "resolved": "git+ssh://git@github.com/rdkcentral/firebolt-openrpc.git#7dfdf7decad12197f940cdf96edcf018efa40d0d", "dev": true, "license": "Apache-2.0", "dependencies": { diff --git a/package.json b/package.json index f38fe071a..ed7c4d60a 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "scripts": { "fs:setup": "npm run clean && mkdir -p dist", "validate:each": "npx firebolt-openrpc validate --input src/openrpc --schemas src/schemas --transformations", - "validate:compiled": "npx firebolt-openrpc validate --input dist/firebolt-open-rpc.json && npm run validate --workspaces", + "validate:compiled": "npx firebolt-openrpc validate --input dist/firebolt-open-rpc.json --pass-throughs && npm run validate --workspaces", "validate": "npm run validate:each && npm run validate:compiled ", "compile": "npx firebolt-openrpc openrpc --input src --template src/template/openrpc/template.json --output ./dist/firebolt-open-rpc.json --schemas src/schemas", "slice": "npm run slice --workspaces", From b9f628458a70c5809a489b00c5fd02d80404008b Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Thu, 23 May 2024 11:51:37 -0400 Subject: [PATCH 48/54] fix: Remove "push-pull" spec --- .../openrpc-extensions/push-pull-methods.md | 53 ------------------- src/openrpc/content.json | 3 -- 2 files changed, 56 deletions(-) delete mode 100644 requirements/specifications/openrpc-extensions/push-pull-methods.md diff --git a/requirements/specifications/openrpc-extensions/push-pull-methods.md b/requirements/specifications/openrpc-extensions/push-pull-methods.md deleted file mode 100644 index af15955f3..000000000 --- a/requirements/specifications/openrpc-extensions/push-pull-methods.md +++ /dev/null @@ -1,53 +0,0 @@ -# App Pass-through APIs - -Document Status: Working Draft - -See [Firebolt Requirements Governance](../../governance.md) for more info. - -| Contributor | Organization | -|-----------------|----------------| -| Jeremy LaCivita | Comcast | -| Kevin Pearson | Comcast | - -## 1. Overview -This document describes the Push / Pull Firebolt OpenRPC extension. - -Some APIs require both a push and a pull version so that data can be provided on request, or out of band. - -To facilitate these APIs, Firebolt denotes an OpenRPC tag with OpenRPC extensions to auto-generate the push notifcation, pull provider, and pull request APIs from the main push API. - -This document is written using the [IETF Best Common Practice 14](https://www.rfc-editor.org/rfc/rfc2119.txt) and should include the following summary in the Overview section: - -The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL NOT**", "**SHOULD**", "**SHOULD NOT**", "**RECOMMENDED**", "**NOT RECOMMENDED**", "**MAY**", and "**OPTIONAL**" in this document are to be interpreted as described in [BCP 14](https://www.rfc-editor.org/rfc/rfc2119.txt) [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here. - -## 2. Table of Contents -- [1. Overview](#1-overview) -- [2. Table of Contents](#2-table-of-contents) -- [3. Push / Pull Extension](#3-push--pull-extension) - -## 3. Push / Pull Extension -Firebolt OpenRPC **MUST** support a method tag named `push-pull` that denotes a method should have a set of pull APIs generated from the current method, which is referred to as the "push method" for the remainder of this section. - -If a *any* method has a `push-pull` tag then an additional method named `onRequest` **MUST** be auto-generated by the OpenRPC tooling; This new method is called the "pull provider method" for the remainder of this section. - -The pull provider method **MUST** have the `x-response` extension schema set to the schema of the last parameter of the push method. - -The pull provider method **MUST** have any remaining parameters (not the last one) from the push method, as these are context parameters used by both push and pull. - -The pull provider method **MUST** have the same capabilities tag as the push method. - -If a *any* method has a `push-pull` tag then an additional method named `request` **MUST** be auto-generated by the OpenRPC tooling; This new method is called the "pull request method" for the remainder of this section. - -The pull request method **MUST** have the `result` schema set to the schema of the last parameter of the push method. - -The pull request method **MUST** have any remaining parameters (not the last one) from the push method, as these are context parameters used by both push and pull. - -The pull request method **MUST** have the `x-manages` array contain the value of the `x-provides` value from the push method. - -If a *any* method has a `push-pull` tag then an additional method named `on` **MUST** be auto-generated by the OpenRPC tooling; This new method is called the "push notification method" for the remainder of this section. - -The push notification method **MUST** have the `result` schema set to the schema of the last parameter of the push method. - -The push notification method **MUST** have any remaining parameters (not the last one) from the push method, as these are context parameters used by both push and pull. - -The push notification method **MUST** have the `x-uses` array contain the value of the `x-provides` value from the push method. diff --git a/src/openrpc/content.json b/src/openrpc/content.json index 63d2925be..57f60dfa4 100644 --- a/src/openrpc/content.json +++ b/src/openrpc/content.json @@ -9,9 +9,6 @@ { "name": "requestUserInterest", "tags": [ - { - "name": "push-pull" - }, { "name": "capabilities", "x-provided-by": "Discovery.onRequestUserInterest", From 7ca8b2b730b79b17adfa812d155557313370b313 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Thu, 23 May 2024 13:48:13 -0400 Subject: [PATCH 49/54] fix: Added provider result name disambiguation --- package-lock.json | 2 +- .../openrpc-extensions/app-passthrough-apis.md | 8 +++++--- src/openrpc/discovery.json | 1 + 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 296839864..45c07c9bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1076,7 +1076,7 @@ }, "node_modules/@firebolt-js/openrpc": { "version": "3.0.0-next.1", - "resolved": "git+ssh://git@github.com/rdkcentral/firebolt-openrpc.git#7dfdf7decad12197f940cdf96edcf018efa40d0d", + "resolved": "git+ssh://git@github.com/rdkcentral/firebolt-openrpc.git#3cde3288a627e6f7a0f97f9b38e5c487da4ff2a1", "dev": true, "license": "Apache-2.0", "dependencies": { diff --git a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md index 53fb6dd6d..ec23922e6 100644 --- a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md +++ b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md @@ -108,8 +108,8 @@ The platform method result schema **MUST** either: > > or > -> Have a property that matches the `x-response` schema on the provider method so that the result can -> be composed and passed through. +> Have a property that matches the `x-response-name` string and `x-response` schema on the +> provider method so that the result can be composed and passed through. The platform **MUST** call the provider method from the [best candidate](#8-best-candidate) app and acquire the result. @@ -130,7 +130,7 @@ The platform method result schema **MUST** either: > Match the *last* parameter schema on the provider method so that the result can be passed through. > -> Have a property that matches the *last* parameter schema on the provider method so that the result can be passed through. +> Have a property that matches the *last* parameter name and schema on the provider method so that the result can be passed through. Example platform method with context: ```json @@ -211,6 +211,8 @@ If the platform method result schema matches the *last* parameter schema on the Otherwise if the platform method result schema has a property that matches the *last* parameter schema on the provider method then the value **MUST** be composed into an object under the corresponding property name and the platform **MUST** apply any [result transformations](#9-result-transformations) to the composed result. +If the value was composed into the platform method result under a matching property, then any context parameter values from the provider method that correspond to a property name and schema in the platform method result **MUST** also be composed into the platform method result under those properties. + Finally the platform **MUST** dispatch the notification to the app that registered for the event via the original platform method, using all but the last parameter as context. ## 5. Provider Candidates diff --git a/src/openrpc/discovery.json b/src/openrpc/discovery.json index 3dd597115..40b782cc3 100644 --- a/src/openrpc/discovery.json +++ b/src/openrpc/discovery.json @@ -1555,6 +1555,7 @@ }, { "name": "event", + "x-response-name": "entity", "x-response": { "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/EntityDetails", "examples": [ From 795e3682e4e578cc1e3151011224a65f2bd807a6 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Tue, 28 May 2024 15:52:21 -0400 Subject: [PATCH 50/54] Update package-lock.json --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 45c07c9bb..6f863feed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1076,7 +1076,7 @@ }, "node_modules/@firebolt-js/openrpc": { "version": "3.0.0-next.1", - "resolved": "git+ssh://git@github.com/rdkcentral/firebolt-openrpc.git#3cde3288a627e6f7a0f97f9b38e5c487da4ff2a1", + "resolved": "git+ssh://git@github.com/rdkcentral/firebolt-openrpc.git#ed4258c495c6c951aff52391381bc5d27478dcb8", "dev": true, "license": "Apache-2.0", "dependencies": { From 4066787041fd8a21442e98b5d2e588cf0a3ab8f3 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Tue, 28 May 2024 16:23:01 -0400 Subject: [PATCH 51/54] fix: Fixed capability string, added errors --- .../specifications/discovery/user-interest.md | 48 ++++++++++++++++++- src/openrpc/content.json | 4 +- src/openrpc/discovery.json | 4 +- src/sdks/core/sdk.config.json | 2 +- src/sdks/discovery/sdk.config.json | 2 +- 5 files changed, 53 insertions(+), 7 deletions(-) diff --git a/requirements/specifications/discovery/user-interest.md b/requirements/specifications/discovery/user-interest.md index 192ea35bc..1e17e7553 100644 --- a/requirements/specifications/discovery/user-interest.md +++ b/requirements/specifications/discovery/user-interest.md @@ -54,6 +54,7 @@ track of which apps are using them separately. - [3. User Interest Flows](#3-user-interest-flows) - [3.1. User Interest from an in-app UX](#31-user-interest-from-an-in-app-ux) - [3.2. User Interest from a platform UX](#32-user-interest-from-a-platform-ux) + - [User Interest Errors](#user-interest-errors) - [3.3. Upstream User Interest Intent](#33-upstream-user-interest-intent) - [3.4. User Interest Bulk Updates](#34-user-interest-bulk-updates) - [4. Core SDK APIs](#4-core-sdk-apis) @@ -130,7 +131,7 @@ An app **MUST** have permissions to `use` the `xrn:firebolt:capability:discovery:interest` capability in order to listen to the `Content.onUserInterest` notification. -If the result is `null` or is not a valid entity, i.e. does not match +If the result is not a valid entity, i.e. does not match the [EntityDetails](../entities/) schema, then no `Content.onUserInterestedIn` notification will be dispatched. @@ -188,6 +189,51 @@ then, the returned value **MUST** be used. If there is no app registered the an error **MUST** be returned. +#### User Interest Errors +An app is expected return either a valid result or an appriate error. + +If neither happens before `interestTimeout` expires then the platform **MUST** return a Provider timed-out error: + +```json +{ + "id": 1, + "error": { + "code": -50400, + "message": "Provider timed-out", + "data": { + "capability": "xrn:firebolt:capability:discovery:interest", + } + } +} +``` + +If an app recieves a request for user interest when there is nothing appropriate to return, e.g. nothing selected or presented that maps to an Entity, then the app **SHOULD** return an error with a valid JSON-RPC error response, e.g.: + +```json +{ + "id": 1, + "error": { + "code": -40400, + "message": "No entities currently presented." + } +} +``` + +The platform API Gateway **MUST** append, or overwrite, the `data.capability` value to any errors returned by the app, e.g.: + +```json +{ + "id": 1, + "error": { + "code": -40400, + "message": "No entities currently presented.", + "data": { + "capability": "xrn:firebolt:capability:discovery:interest", + } + } +} +``` + ### 3.3. Upstream User Interest Intent In some cases, e.g. a voice assistant, some upstream component will inform the platform that the user is interested in whatever is currently being presented. diff --git a/src/openrpc/content.json b/src/openrpc/content.json index 57f60dfa4..0ffbeadbf 100644 --- a/src/openrpc/content.json +++ b/src/openrpc/content.json @@ -13,7 +13,7 @@ "name": "capabilities", "x-provided-by": "Discovery.onRequestUserInterest", "x-uses": [ - "xrn:firebolt:capability:discovery:user-interest" + "xrn:firebolt:capability:discovery:interest" ] } ], @@ -96,7 +96,7 @@ "name": "capabilities", "x-provided-by": "Discovery.userInterest", "x-uses": [ - "xrn:firebolt:capability:discovery:user-interest" + "xrn:firebolt:capability:discovery:interest" ] } ], diff --git a/src/openrpc/discovery.json b/src/openrpc/discovery.json index 40b782cc3..314253fca 100644 --- a/src/openrpc/discovery.json +++ b/src/openrpc/discovery.json @@ -1482,7 +1482,7 @@ "tags": [ { "name": "capabilities", - "x-provides": "xrn:firebolt:capability:discovery:user-interest" + "x-provides": "xrn:firebolt:capability:discovery:interest" } ], "params": [ @@ -1586,7 +1586,7 @@ }, { "name": "capabilities", - "x-provides": "xrn:firebolt:capability:discovery:user-interest" + "x-provides": "xrn:firebolt:capability:discovery:interest" } ], "summary": "Provide information about the entity currently displayed or selected on the screen.", diff --git a/src/sdks/core/sdk.config.json b/src/sdks/core/sdk.config.json index 551cebfeb..14ba4d55c 100644 --- a/src/sdks/core/sdk.config.json +++ b/src/sdks/core/sdk.config.json @@ -70,7 +70,7 @@ "provide": [ "xrn:firebolt:capability:discovery:entity-info", "xrn:firebolt:capability:discovery:purchased-content", - "xrn:firebolt:capability:discovery:user-interest" + "xrn:firebolt:capability:discovery:interest" ] }, { diff --git a/src/sdks/discovery/sdk.config.json b/src/sdks/discovery/sdk.config.json index 5d1bd42b3..535d3bb12 100644 --- a/src/sdks/discovery/sdk.config.json +++ b/src/sdks/discovery/sdk.config.json @@ -8,7 +8,7 @@ "use": [ "xrn:firebolt:capability:discovery:purchased-content", "xrn:firebolt:capability:discovery:entity-info", - "xrn:firebolt:capability:discovery:user-interest" + "xrn:firebolt:capability:discovery:interest" ] } ] From 788743bcb8678ca34cd6e9fb82491f562c1cf45d Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Tue, 28 May 2024 16:30:49 -0400 Subject: [PATCH 52/54] fix: Both UserInterestProviderParams are required now --- src/openrpc/discovery.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/openrpc/discovery.json b/src/openrpc/discovery.json index 314253fca..6e4a30ddb 100644 --- a/src/openrpc/discovery.json +++ b/src/openrpc/discovery.json @@ -1949,6 +1949,10 @@ "UserInterestProviderParameters": { "title": "UserInterestProviderParameters", "type": "object", + "required": [ + "type", + "reason" + ], "properties": { "type": { "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/InterestType" From cb51c01fe9f6d933655bd91a3b187243bc6f2e8a Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Tue, 28 May 2024 16:38:06 -0400 Subject: [PATCH 53/54] fix: Typos --- .../specifications/discovery/user-interest.md | 2 +- src/openrpc/discovery.json | 126 +++++++++--------- 2 files changed, 63 insertions(+), 65 deletions(-) diff --git a/requirements/specifications/discovery/user-interest.md b/requirements/specifications/discovery/user-interest.md index 1e17e7553..f53e239ba 100644 --- a/requirements/specifications/discovery/user-interest.md +++ b/requirements/specifications/discovery/user-interest.md @@ -132,7 +132,7 @@ An app **MUST** have permissions to `use` the listen to the `Content.onUserInterest` notification. If the result is not a valid entity, i.e. does not match -the [EntityDetails](../entities/) schema, then no `Content.onUserInterestedIn` +the [EntityDetails](../entities/) schema, then no `Content.onUserInterest` notification will be dispatched. The `Discovery.userInterest` method **SHOULD NOT** be used in place of more diff --git a/src/openrpc/discovery.json b/src/openrpc/discovery.json index 6e4a30ddb..49b7e20aa 100644 --- a/src/openrpc/discovery.json +++ b/src/openrpc/discovery.json @@ -432,7 +432,7 @@ { "name": "deprecated", "x-alternative": "Discovery.purchases" - } + } ], "summary": "Provide a list of purchased content for the authenticated account, such as rentals and electronic sell through purchases.", "params": [ @@ -1534,9 +1534,7 @@ "entityType": "program", "programType": "movie" }, - "info": { - - } + "info": {} } } ], @@ -1547,19 +1545,19 @@ } ] }, - { - "name": "Discovery.onRequestUserInterest", - "tags": [ - { - "name": "rpc-only" - }, - { - "name": "event", + { + "name": "Discovery.onRequestUserInterest", + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "event", "x-response-name": "entity", - "x-response": { - "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/EntityDetails", - "examples": [ - { + "x-response": { + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/EntityDetails", + "examples": [ + { "identifiers": { "entityId": "345", "entityType": "program", @@ -1580,54 +1578,54 @@ } ] } - } - ] - } - }, - { - "name": "capabilities", - "x-provides": "xrn:firebolt:capability:discovery:interest" - } - ], - "summary": "Provide information about the entity currently displayed or selected on the screen.", - "description": "Provide information about the entity currently displayed or selected on the screen.", - "params": [], - "result": { - "name": "request", - "schema": { - "type": "object", - "required": [ - "correlationId", - "parameters" - ], - "properties": { - "correlationId": { - "type": "string" - }, - "parameters": { - "$ref": "#/components/schemas/UserInterestProviderParameters" - } - }, - "additionalProperties": false - } - }, - "examples": [ - { - "name": "Default Example", - "params": [], - "result": { - "name": "request", - "value": { - "correlationId": "xyz", - "parameters": { - "type": "interest", - "reason": "playlist" - } - } - } - } - ] - } + } + ] + } + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:interest" + } + ], + "summary": "Provide information about the entity currently displayed or selected on the screen.", + "description": "Provide information about the entity currently displayed or selected on the screen.", + "params": [], + "result": { + "name": "request", + "schema": { + "type": "object", + "required": [ + "correlationId", + "parameters" + ], + "properties": { + "correlationId": { + "type": "string" + }, + "parameters": { + "$ref": "#/components/schemas/UserInterestProviderParameters" + } + }, + "additionalProperties": false + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "request", + "value": { + "correlationId": "xyz", + "parameters": { + "type": "interest", + "reason": "playlist" + } + } + } + } + ] + } ], "components": { "schemas": { From b9f774dda580b27fcfe173a0a213dd07b769753e Mon Sep 17 00:00:00 2001 From: "Shah, Kevin" Date: Thu, 6 Jun 2024 13:08:24 -0400 Subject: [PATCH 54/54] feat: User Interest --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6f863feed..f9fe68d78 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "devDependencies": { "@commitlint/cli": "^17.0.3", "@commitlint/config-conventional": "^17.0.3", - "@firebolt-js/openrpc": "rdkcentral/firebolt-openrpc#feature/app-pass-through", + "@firebolt-js/openrpc": "3.0.0-next.4", "@firebolt-js/schemas": "2.0.0", "@saithodev/semantic-release-backmerge": "^3.2.0", "@semantic-release/changelog": "^6.0.1", @@ -1075,10 +1075,10 @@ "link": true }, "node_modules/@firebolt-js/openrpc": { - "version": "3.0.0-next.1", - "resolved": "git+ssh://git@github.com/rdkcentral/firebolt-openrpc.git#ed4258c495c6c951aff52391381bc5d27478dcb8", + "version": "3.0.0-next.4", + "resolved": "https://registry.npmjs.org/@firebolt-js/openrpc/-/openrpc-3.0.0-next.4.tgz", + "integrity": "sha512-Q3GZpaA2Gmhx5UOh7cOMpDjZZtbutVfTUUis0FrOKceVMVllRhHz/XeqZrpmKo4EX0hn4OPWOmVek34WO68jQg==", "dev": true, - "license": "Apache-2.0", "dependencies": { "ajv": "^8.12.0", "ajv-formats": "^2.1.1", @@ -1103,9 +1103,9 @@ "dev": true }, "node_modules/@firebolt-js/openrpc/node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", diff --git a/package.json b/package.json index ed7c4d60a..d27b2efd0 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "devDependencies": { "@commitlint/cli": "^17.0.3", "@commitlint/config-conventional": "^17.0.3", - "@firebolt-js/openrpc": "rdkcentral/firebolt-openrpc#feature/app-pass-through", + "@firebolt-js/openrpc": "3.0.0-next.4", "@firebolt-js/schemas": "2.0.0", "@saithodev/semantic-release-backmerge": "^3.2.0", "@semantic-release/changelog": "^6.0.1",