diff --git a/docs/api/assets/navigation.js b/docs/api/assets/navigation.js index 93a2ff84046..2f434fcdca7 100644 --- a/docs/api/assets/navigation.js +++ b/docs/api/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAA9S9bXPjuLWu/VdSPV8zJ5nOJDtJ7dr1+LXbabvtkezuveucKRcswhLSFKGAoLs1p85/fwqkKAEkAAJrLWc0nzLtCPd9AQRBvC787//7RvNv+s3f37Cv9fdsvSnF8/bN799smF69+fubtSyaktd/YF/rx93/+b9Wel2++f2bL6Iq3vz97e/fLFaiLBSv3vz9fx/ECrbRXH2/kIrH1Xa/fDS/TJL+zxl/5opXC/67++2G1/+Vof+4T/vYpn1McjzppM5KVtcHs4X5Z56ZLeQ6//D2r//v9wfDRq8I3HqVqFWnddvoTaPrk4qVWy0W9Z2SG6604BaCqDRXz2wBynPYYPAI/vyXMF2jV68G5minM50zzV6LydVOZ3rH5WshOdLpRB+lFs9iwbSQ1avVrYBJOuVcS8WW/LRZfOH6tSgDJtmUr8yXSNbo1VXBKy309k7K8kxWz2KJBvKqTnE81FyZX59UxesgRQ1S6ehxpv3P5LISWtKXSlA4gYa2QLyicQr5RfA5V4KV4hd+u2lbDTyGT3XE8fvuc/7m7290XXwv6u/5N81Vxco3NmFTa7m+U/JFFFyhyRy1WMlciyfF1Pbk7oqoUEaCKe6NXhHbHxQT/Gm90313rS+tvSsao7ht+4wkb6QlNdU2Dg21Ucju6fqs/vi3//jhz28HdnPNqoKp4kRrJZ4azT/wLdLcJ5mC8okr8SzYU8kJYfyiUzi7FrRvIdDPxKuXCJH4KYcy5XzIpxC7RDfPbK6Zbmo6uIHwJFbbvs8XcsMxDAeVKcNzuWjWvNImJcLRlpmyfM9ZwRWmjHcKU0YfZfWxKUvzCiHMLBWvYVIv4HY3MB10ArJhHJ2p/Lc/xtalg8iU3YyzQlYlpt3rJeAFvftIniwWvK6v+QsvEThjsQmwgm8UXzDNCw/TneLP4tuM17J8QVUCrx6QTImFfqiErFA8e5WpOmL99D0vN8hiGGhNmbc//cC3mKZnrzFl9omVomBaqsumWmhcAY+0/OY/jycb5lw5dW1yatVJ59r86J9WPZNV+19ZHU3XZicRH+i1P5lv+ILAycgkuN3LL7wisGt1Yn6zprrdcNXOeX0WbS/YLdOJKuO6BtSmK81u3Ns1LxmVxkmXVGlOuuR5Zeva7CSmZweSS9HV7/412aBx3f1wNNbLMhvKJL/gu+k+UCXdpY2OZ/mSLbaQoaSdMuawUJxpfvJ5fqZ424tnZW316K+Kca/pedcKRtyTVV20v/w4IvvAt59Y2fRP6lLJtfPoRjU5mS5ReZKwH2rUbTODKC6/UMRfNW374rQ+o6YrwT6iM3K33wHWL0NNtFX9z15lYXIvDlyV7NN3dfN5a57CVbVpEr6oEeuwbOxlvHgxYzjFFl9EtUyevYpg+ARjAHdsyT8J/pWSIaAZxRDVRopK70uxzQeOwiuZAmHeB7FIn0xMgHAlYxBzXtdCVpTPwy8Zg2gbJiWfhT2QBzhbOtHJzF6i+3o1ip80Wra8gxfT841PeScDupNTjX36UI0A4kRrw4jCblCQBB6pKfe2tLjaT4mCvUdCKd1jRHUAPvPIVyHmNtXqeyZvFlIVGQ5WgintxSjrk72Dvc04baQ/UojaneybUt8liEjyKk+x+31E8Lls6lXb9tfpqlaiiLSwHnq6tp0q1tdrn3e6bPf7iOAXUfFapHbdHnc/f9Uu3N4E1pXzvkNTn6mIZ/gVcz5XHzqBtnqYvUZJ72/Edqg33TBC6vQeIK1uZ1a/vXqgGv48rojfPwvFV7KemvgYWjz26f4tVfPg9ivU0Zh5tLJSVZYDwKvWmoNNQvXZcFXLqt0okvosrSSvW2lsI1h9uTsoZI6BJsyHwq9QaWyA16kvtkNKVdkNv5If3+73SU9qsnea4fVdWGw3rfvD33780x9/TOuo5hj7ZEKW3rYsx8wVCNnEuq85bl6dkKm3wue4uQIhG3+XMcdnoBAyGr5ZORb7tK74z+5c4EZMqG/EqzS2GwFsWt8ptln9dH2hlLTK3ntCwOthpx+dDUhaLL+W3TZriHufFuZ8+1Rz9eIOrdK9D6lh7jNe65ONAJe8nT52KmMuG7UA5bBLCcvdvHmqF0o8cVDeDqlR7htovbLTwwgGq7bp1p5l2lTP3dJFWyPumGLrhClSL8NYKDpTqZbttquPskiYGfUbWhKwHc6nUpacVe1aFgJkKAPcbs3Kci40FKJPDjSX67Ws7pqnUizOSsErnTxf7qcJ6cXqxLlQfKHFCz/nz6IS5veIpxJQg5XPXowCCIGx26yIobAkYBAXVbM2YiRPyS+GA7v4pnlV03A5WnCstm0gKzCPGhKNAgiOcSl4WZCUjkcJgYQFQdiXkmnsk3FFgCCKLU1zQfN0vGI4sPlGcYZ6UiMhGJA9qNm3GtDvp18MBbbfWOdumIdgOVKxL/r+9+23/9NfsLY7mUnLf5V2Z/yG17WzLTDf3CsYw7iqSlHxvm4hqudYCFYL2rmi26d/8oUm+3hHNUkwKT7lMUkEJN0nPSQHhUN/OGwJMERnR1jXgooEiDT1LCQIA7wWdVthEUi2BBwCW50cDSDGaL4vj2CX/PsfYPYf2RpTAH1yuHmBrAiOBhCjO02GBXFVgChNWWIrpaMBw+i+KUD/LjHGGDtEGahgUMhaedrOBG0/grQL0YlhK/FABYpSD85aZTLUniNXyeb9UIKm+vjVkGh0tTusiEGU4Ee3Sx4xP5y+/F0Cx/jEIIgncFgwsVDMrvnC9DmAFPv00d3lC1YyRVYzQnKwEjioUbR7ATUo2oqvGVGZjaUwUDRlNVICIvGSt+/AnGNmD4YyQJh2TRfZB3dFgCBaiWqJ/WoOVIAou9VmdydAHoclgYJoJ6WuxRckyF4GBvNQMbVFfgEcDSgG5Sc7oIZEo2hq/GJQsBpfnV0RGMgnptrAQSTPzi+GAyPAgUOczO9df882ef9WiS6hdz982v6Adg3ft6yRijBUQLC0MYJSYvH4QezkWIqbRrPpg2QRjr0AluSnhisxcagswrFLjqWwvyRgFkcEThRqQ1Jhos1GBke/lQBQHvukCPdvfNHoWJuaDBNQwrBpxRb6Rha8vOET538CTK4CnOVSfOOFeQu2M143ZfwsYWDJ31WYOlz4jldmuMuLvg3ItxxJJHu2nAjDNn2ym39rZbZpeIelx7tbM77heiULgKedPNFrxuuNrGpur3Nn+h0kEj37TkWNMLU0klzdxXDo6xKUmmK4YdsnQPPVJoO3D20TA2zGD2nh/h/5C1cX640GvLWHtFNl68xQwj4TIwl4nu+UXIuan8mq1qpZaKncQW4qkl8HxWVik2+nQqWGYPrEcIL9vA7sGTnJ4RT3nKlCfq2u5VIs8imc5AgKs/n9g6gK01sCUNjJERSRGYdklKl5hkyewDRDDk5sciGTBg6B955va83XFM/Hp0TBRvCsPEJwsofqSyW/VoN+ST6YX2fqO/TpL918Qb5fn3LSYTyJnGwRmDnOKF0TNMwsMdXtoCEfwU0/+VUfbFR46Tt8yUvMw40zf8psmmHe++Qg88fHdT8sfHyEATgSGRCD2DvVbg1GM/t4D6+a9Rhi8HPX9K/jAYAJcjw4DugXHv4+rJx+wDDlKOHhzXeGCZGpUydFbBE2rY1Iaw92pknjYvu3yWND3ajB1uuo+CFBokPOGNuTZMrFXkmckrd/i5hRvP348eLs/ur24+P8/uT+4vHs/cnHdxcpb3Ig6fANtswKO9x2IHjCRvyvYhhI2wnCsNxNVAzrZVjPTRGVTtSLiaw4mw4RYQ6bcxaLfyTqM1YteDloJMJ6ToKI8IbpxSpFsP1hTEjWScVlfheTadJUhoFjHJHh5qrAUfxH7y4q//n7wANIUP5umLTzGUc9yI8l0NsAQwrsXoRdCNX2dUg/jhz2DuvGPix9N/WObUtpvzMQhIHY9AftsEg2n89m/F8Nr6ea3LB7WBKzslJyzadD7sW4LI2pT0/30/28EtJyrzM9e61xWewFEozwmbNFsubG5/MZ3HQgNGVsVl1xZbpXSLHCl6qjkmI5vSQdN0u4HObOfPxwpXiQSDLDl6MrM2kqa+Srt1dIsSLInq0yadlgM9ck5q2hyFqTnrN+7oXgszWW8pv/nN2H7z2Ju/K9LHGP/iBL0LHf9wTj/fvUbngvR9Qb38tRdMr3Yp6++SD8VqNXE53bRg+yRxSAy+jCussnn+ft7VZiWV1V51wzUSZ0lP1+Pq3I/jT/fUw7ETcaG4hjHM13EDnIuRoDYWapRP3aux0Lfs5L8cLVFlvafrlpgupZqPWM11zfsbr+mh4LNcYREE2k6aoMFYalluH/sKH036kl+puqug/DToUxFp2i6cY1TroaTRMUnaYxIflx1kZhyudSqiXX3W/RuR2JTbl/5N+0897MNd9gCLyCKRQPm8JcGNQ/JAoOj+QUiUGviu4VMs0b+ol4BVMo6JrH/HbRSdFdUkUG0MlNEcx5VTgvbXcZb3fohuTBpDlMctJ8OjK+Gd1P8Q/F1knzNIu1M1604d+IcjySTCG5HQ08Yfa3/vGn15Pg85zxXe5+mhy6cMozIWah9WOSmtXrTHne397fzbluNgTd0aHWlHf3eSBrZj1yaQS03a+QJoAFXxWCogAafF8wKDpJYydBEdhCU67tB2m7r9Xo7Pv0Jhhk10x3bzSySzbSiq4g2WOp9grV9kjN2YqVJa9SgqD5OaZ0s5g+8q/9624m94TiCUtsiVwe7Sy2+c38LOmMXyLPTi+LwVQ1UoheMJHiYYOvuAG5dAIy72lXLaqGH0rr5vJkv4MFgRBRzePZtzx0MHvJGMm5rHZJMA/DVUnxwz18VyXm945r+5LdRq/Mf7ZTm5h5zAnZdKKHir0Ok0c4RvWPWlapsa789geFqM9XvdsjMdesKpgq2uBU4L5tSG9i5wfNnE7eXE439T2cOvOsmUWnzr0TZ+PLOBu9OimKdvc6K6+qZwlxHIkk2Zal/MqLm8uT6ZNUEV9XJcm42nr6oXmulkSKZT/Bf8MLMXEuJToLa4mk2F6W8uvkNtPIROgu+b/RahSUcbgTKbDi1LTfVATALnVKVs2sqO9TmOXniuTYDr+IIFvvB9FrO76JPcvQf/+63yrS3mZ5TjW3XvOM24hj86E5dxAfhtOBGfss7+mJ+giAO54fzlkAOHyCSTh2uqkzlYlzBKHTlTFraA1wRaZsu40h5khJMXXlaaA37whM2nnWeOEVPqKWCLKbPscSODIZ1p7ZYYh1aG54bN1Ok2D6HgOFKUPT1T5RikHeon3aFJM7JdbCXGcDNNqnnzTbd+MhTvvEUzY3lyd3qk8OcHLST5kNVzfhlTKglAJA0B5AGoLJBUQ4Tqr0JCKykcpqnbDNUlZ75FtYADuHxQAYNSlHnQjyiZWi6EIGw77GrsCknbuUAM+yX2h6j6znuKj3cKdxDRwVdY93dl3guk6eK7USTC5ymvO/idM/h9+nLEqla05NjtlTfVXRXQKst1eJCxqh1BDH8agN4hwYvDkEl1wvVtZzzFpwDySe9HO+rzkrrKHU0anIz/dp4v/4fB/TaWtk3oNxksS0u1bPyVjGUmcodXxpIrINNtB0Te91TRqyTJ+Y6MzSNrTGBydZXuEdSBMjoLTxtidN1mgnOy/+nTYTQ6rsvAS2uYRsYjs94maT+zkCpw2jOygClqlbZkeWbQvVTd6nzsOMkySZgOZ8giknLcNbdENWE/twfWcnrS9Zan/KmyrFqlGKV9qURWLZ+RLlDg7Tii5lw+z0ODQtV/5kWWPO9EzlteTRLbgpLml5yd1nG3AGbaYFjKjTyiFRZxpHP2zM0CTZ1vl92uA8sXzTv85Zn+Wc7/HkJuCox9ROX6/deKdvxCOwnTcwT5Gum9iTyOpC5PQdottUA/rTe1FTpjJyvPI7KAkbTtMdc4oS0idK3TqaNkMEzmZihyV7JSp3zalrUE3QomyrcNLMSae0B5ew6XVkxPabVQ/ygRO6xuLwc1fYOe678AzpktR9Cad9MvCdFGnKD5tc5YfNtHJgl/W0QWRXteNT8IUsuDMnEhHf/zqq2A+VEiX7nydp+lZ0k9RDq7iOz/NgAivJY5hoSn83tEvX3iWY0g2sck2pRxa3xh6AR+BJF3OxRolp8laCiO7SGawlKbtJItqKr/n6iasMajdJVNsdjiWqu4km9PMaX5XY6tZTI44kt0mVKMFu8JHotPt1TDH9E1JPfTvq0RggQ9dONuFxmxBUoxe+jYe7S//M1VPft2Y8R50k7Ek36ZJVvd0kk9r5H2hPujyXtGbXlzDi8+L2CZMsBmmivZllJbS1GTkUM+Vx98tBdzQQKWW04pck+52VrtMfx0iMLoekufglwoaTCyOptmGhCXPv7EuWq6uQZDcc+AH89hIJhqNZjmy/g0KSHTp/lsSEYWyiIsvWKxQyT1hUSTOPCYXMY8sraa5ehahddLU6w9SvE7WOz5lkeAeEgubh1Z5EU49AyCy+GJPmF9AIWU4sy6R5hkRSTWE5DarEbHGfmKxvS3TRBuA3mb/c5Zs0hmRVMBasbNJlw2CBJZ1UgGHyoBG8e5HWr8B0KBJ7EpMLPjluPpmY8XjpJ93NShuzAHaP0vpFmA5RYk9oeuNUml1EJ26Nalj9EnFDfKcvopNhDXusMaEMc1iHMyaUY06W9emOWHhpKdF0nD5klbKelWYaVYraB1e2MozHGiFL3xpXmpGTMiQfX+5KMwpoTFjCMjVMnGBizw5mm7SJJ0wC021ZXkONkKVvISvNyEk5Le+b2cs1cjRClv7lpzSrQdqoRWBaN8NoqBC1w5WhXyJo6F2fSnRy04YsQktVaSaj1CGb0KpVms0oddgmtICVajRKH7MCt6zDxCGTjGWtNOMUwTDMaIUr1fSQMCgO+mrUU5+L2LpXjsVAIWZ3m991OCSLCed/7+qpD110YSzNwy8RN4S+NqPUcRvU99svkWGY/W0IaIQsg4toaW7j5CEjwG0EeyvYrQRnXWpTFHdSlnXg9FPowGHEParsso2PJ7Y/vlWLFa+1YlqmHcSK0HhFYwen9gnmWqq0sH4p9q1azHdXbLCrIqYfx/S1Ec4SkOkEjONewAhctZhvf7QR69jrpHhdFSQPeiAXc75tAxoRFa4jNlWvP/Dt5IGbicpsJKb2llpVbngsONtzpDVl3v5qxp8Vr1fTYZEizq6Q3/ZnT66d20omTv1ONq/porGW9Zw/s6bUwSo/ieEXSLD0taSpbqF20zWKfDEmjSY+DK7R4LvmfNbcyGYpb/KUWuxV3mlYNWJcswIX7toIYRnX3Ll8d5HWb0i3T+knOASqeyV9rUt4b9PedZQ6updy8FszRJGNPudFs0naHBa2daSiex4TrqS1nHLupkVNtjhX1ebNuUAnRBzLiXkR9+Kw5FLMLb3MveW9fu4W8/z9go5T8q7B/F3V1qV3sc3V7uMwfZXa/Sj4nsj+Z0nPI3MMdRAHXutWb6vFmSxHwachZt+N1UIvz/9584eVXPM/qKaquPrDV6m+/GFn8/0/68B/btjiC1vy+g97kD8UotZ/4PX6D23H6P+8gWfg8dEAPXZAjwaoT/b4zzrwnz3Q41740QA98nr9qD0P4cfAQyjLNk5wd+2lVBPt16+Ui+98mKHne1KWx5+bpIx0yiagufnDcWZlyBjMjBllyYLPTT+RLyeWTH+17IwpUzM0vMD9mLO1Z03N3IzrRiGa6H9n5vasqZlzxx7HnLUdaSxjff//iGuijRjLilTil3bNZ9aUR/yAhpjhPenrjayF5t0kwLOY6k//Wpnyg8a22pdiod+zqiiPN0tDyEh2tJLlDa9rtuTH2zR4OYOZasPqHn29G1MGj1hczc9OZufHmY8DXBCfadbOy7XHS5ZHmo0R5GR25osVX7Mjz84ecjo7FdvUK3mkXW8fZvhIUjshfMdVLWptIqrLgpdm1cONBHtU+ZtijmSWK8WLM1aWT2zxZcZrWb5wNQqYdmS5nYAOZbeNWnvUX98BYTQjx/vFtfGCJ7UU26x+uj6TVXdb0HHmxEM5kaF28uWoM9MTTmak1Mf6mgwRJ7IyX7CSHfH74sMMZenYu6ZJndLDj04Vq470dRlDTmenm3pVhz8ML8g7zgyGsROz/ImVzZG+XAHSxIwdaR/IQ5maoUuprirx26iSFmwwe1XBv/H6eBt3FzCcDc1VxcpjHheOGCcz0zzVCyXafvlu+uXIc+YFDmXzAz/iCfEDXAj/2ly0dC/WXM3Ygu9GUV37eKSt3gRxKKM3rGJLXhx7z8mHGc6SXqzMpqfBhanHlZ8BYzAzuy2lt2o3kXGk+fFgTmVpxllxW5XbY+5LBFmDmTOzSyd1LReCHe/Q3UMZz1Da0ZJfNzsJZ1fcH5plt99Chnac6Zlqb3v+reSsh03P3p2SG670kW7+iPJmZXKwl/foM9nzpmXyWFv8EWQ8O7u9FUedG4txMjPHu0tiiBjNyhFPNTt805k43mHUiHE6M8f8mqT17Y53fsjGm8zCKauPuVZZiBNZqTWrfGckjzBLI9Ro1txDgkeXnR1eNAsmq0echR1eNAvdDuvjHsjZjNHM3ClemAAYx/zm24xpmTlZLhVfMs0vvmleHXeXOQqdlt3fUi6zM/fRlMlxv20+1rTM9ac1fguZs1iDmWu0mcFs0x1pllzCUEY+sjWvN4dZ8yN9QD7MYJZk9VsYQfgwp7JkfnYmq1qrZnG0L1MYNpK9j/yFq+Pt9g0IQxm5fWqPov7UcLU96r2SftBgtjbH+xrt2cLwJnusLLe/kfW+OHAom3dsKar2m5wQ1vTXytoYMpgdd8/ykWZnBJmYnaNvw6O8iZk87r3x+ZvirZ79Rg3jLRxV1rygk9k68v6Sl3MyU++UbDZH+hEeQ05mp9+QVE+GzP7VMzVAnczaMe+IHUNOZqduH+qRZ2cPGc6OXPC6NsOvY82KDRjJRtEsuPotzAQGWacy99voAQZhp7I3l0r/Rh7dEDWUtW74VR1pbiy6UAZmfNGoWrzw38KLFYbNzN5vZNI9gz6zAH6T+YZn97gn5qehM7N73FP109Dh7JZtiRzvEGdAOJWReiWOeGLOQxnKUHfA8TizsWcLwx/vyZzJEzndD454is0FTMjGkY71B4TxjOxXu445LzZkYnaO+tk4lBMZ2q1wHXV2DoxpmTnuh2NBBrPDdbvkfeTzmD7MYJak0uftbTRH2/0cIsaycuQDxNRhu/O7Y18MCMMmZe+YZ2X9oEnZOubZWT9oMFu/lbPUeWeo520s6i7k4JHmxyWMZaSNe3S8uejxolk49mZuyBjOTK35ug3QWfHqaOvWEDKUncEmqxt2pI2alzOUqYeaq2MeVjt8oUx8+vNvYVLcQxnMkImncOzZGTKGMrO7+6Td1HekI58hYigrj4/CjUj1+HicGfKDhrO17jfmHG+GXMRQVurfwAfUZfz+h1hk8dC1I4FLp36FLA0QB7ep/PkvzlUw5NeZNFqUx3SbieFJu8zk48nNxfzu5Oxifoz03zl4ucFrDznyXcr2789RiNN9UKMr7do0d0quhX2K9biytMOL5uTk/mR+fzu7OOTBf2Hbr5CLHs3ld26AO7+4PHm4vn+8m13dnMz+5/HDxf88fjq5frh4nF/cncxO7m9nR5ixaehIlq/Ojy9HV+dR4IuP91eXVxezNqdH/GBCpJHMmQp68u4I354dWAz9fz6eHSH3/3w8i0A/zC+OsOIYqgg0NzM7u8m2+vjoHbxINljbOX3hytrz7L8O8N+fhwObmwHnTsP2R8PA2UeVgw5uKgtzae8DPqoMGLQIftEuUe2CQl78q2Glc8f3sWTFixnJFq/NWqKoV/1um5OqcE9RHkvOQqSxzH1bsabW4oWfrfjiyxHmyQWMZkUrttAf+Pbq+eKbqPUxPqER43SG7pRYM7X9wLvokO0eiqPNmQ82J4vDELhHm70ONCdr5j7330z2DrDTWbxnasl1+6gvlVzP1eJoMzhGjWRvyXUbQPz4ctOTJcCbbHrjxR5bXgagCVk7zo+wTRfPxEc7iOoR4X+UX+Pg7X1eFTvGfqpNF8+EiWVea7beDAMHHlFWBoyRDInqhq+l2h7OfB1fhsaM0QwV/JtpqE27cJxv+ggxlp365PP83FnTPZps9Ggp+KZGHnEWDN5UNi7WTJRHmoeWbSoDV3cnRWEWEY80E3u+qYz8Y3778UjzYNCm8O9WsjrWl6Flm8rAEb/MKS/y/ut4xHlo+aYy8jC7PtIsPMyuo/BXxS5+0jHy7+EmsjAKBnWcmRlhRrMVjoF0PHkaMkYz1B9POfI8eTDj2WrK8lY9VAV/FtVxVr0BYjQ7d0q8MN0eHD7GrFh40WzM2TNTwmwOZpo9CbNCcKxZCqBGsveFb+t23eP4srNHi+CvuVryO3PB1THOpNp0sUzISmpZicVDKYpLZpqJI1wq81FGMrXpAgW1e+proflxDtt9lJFMKb40MezUvmE3u8COL1dezEi2aql022gofrnLwvFlygMZyZJWzGzjHkaMPpbMOHiRbLywUhRM+44BHEtWRog52RlcnXO0eWo54xlr+LF+SC24URbsfdknFSu3Wizqk0ETwKtmnZ6JgYxraW9JPdkIpFMvEPEwt77hTPYKYZczpvnS+WrnefTpww4mVmq7mIHLzEAm7Hep2JqbCgh12guEPd5xicvNXiDscVWdbDbdljdRLXF2Pq2wc9d2tO8/znYkFPFs6tVHaU78LLo9Pzhjr1rY3VQstkTWUEck8l7fXcFPTLRnGzqF3Vb5v/iaQayBpeOzQd0I2jnYl3U64vv3HOlg63hs3nGJNOgUPNLuy4Z0GYl5DTU320Jwlwis9teYH6Q8Zh8lJgrlandFQuCpWA0G0sNV8lk1T/PmCevSi3gN3DYIbTWS85ju2iCk10HFZ9FFZ3hCm1g6oUpdsfLk7mowVs09wDRUGp01+n0nafb+8o3iptdcvLHbu8/zk83GxA2YcVaa9ZDxtbOAA41h2fEhxBSY0TUipEw79Sha+745gQUgCL1K1Eoptu0jOSKz7EhFTXf7unhhDlzjTB2puOm2WlyZVvnJvnIW5GkpjSwPL4Gui+9F/T3/1r02b7wwzroFCma0tJAKc9bUWq4faq5OlrzS51wzUdbulZ0AsrBs7DFdVM3aE04M4O8oRS13m/5pXoORWsy65fPuxwQ4D8Vixu8U26x+uqZo6lypmGm7EZLC0haKGV5L+aXBtaKdRMzkhrXBVu9l+8SrApe1kVrU2rk93J7CxjEEZdNhaBmyrA/b1gkJDqIxkHalB+XaKsDa8d0R8MumfBZlyYsZr5tS42i8kii8Gf9ne96Kjs5VhMF1sYXMJwNFdJCJ1ZLDsQOqpt+rGEN4uLbPlgMcjQCw7/OVCW1vbWgDiKR3eLrkA+8//u0/fvjz2yT/UylLzirP1z4PZKjjJbK7WbIqhHku/Z0VUOOR0KSztycGtveqTTGcc775rIR2e995zrbGlN9Fd8IHarVLDq9l+17R6ELvPJChzlS+zfL17fO82XDl9qDzbAcyaa54wxSvj836yQyjka/vQGbK9XYtdL/lrjtP+8LB3l6xSYINph51qdM8/ogz+WOayw84lx/SXKwCvn3GOTpSU+53YvGFrL54xSYJut6RCX7t6QxmAni04G3jjP+rEQreBejTwwm6KyaIWhKv2NTTOfQUEb57iUk3rUS1xOfUlZlyNance+zy7Pr0Uz7DvoiZChyvx+d5xzSn37z+4qfS2guSHwLG1hnFavl53NnoKuJ9Rhz+UULXJhCybsn1P+auzdRGl7HRXiR+LvNTtw9HyCp/X5rXdCwY3xHT6JWZCZhrZZ7+1s12bGHblzKyEyL8CGMmo2Tf/xD2uBZr0R4iVTO24Lvgd6MgBDG7mELY151JaXfTlKV92jlmGUic4zZeZcoz9C8njTw9ff1Jn0C/3tb2BYiM6R5+H9YcXi8f0+t+G9vl4rmwNCZoJQirji9qjEn2v47sTPHf6xETdZJE9qGEYrPG11ej8VLdwI39Gs86S9skiKnuN3ZkLQu7qWL6bpTrM8Xdta64jTfxpJtzjwPE0ScQc524JTru6E2c5Jb8tA4povWrS3cmq/YP6dOCbsLo6uvgY3jHFFvnrJT4BaYs+5Y712mfbspAKvFL237PmqxV5VHamJEpXyXLXdi+zIXRceKY1eH1ltWzWGb4DFImmcwrtqlXMqfKjdJGjfgza0p9x1VtTkNU+qYPHm5kclyjQhMI3pDD+cugE0rxhdeugRne8DDp6SZMsohdjpPuN1aJmX/g28y3YpcifVExQ9tNmG7hbgfNtDGJ86zulNxwpXMWScMi09aNXmW2kU66SYPBOZI0dc+hjpB0ZgVzE05aXFW1ZtWCmyalyGubvOknDc0Pc01Mmphwf9gMUl6jtPFl9uFV9qk2g5RRE7ex9x40n/YLimRYAz5YgC/Vvq/Y3n+W82UapEwyGd5yl27SpUwyGd45l27SpYybdIuviLroV4iZ+i/UnnSyk8XkvXcTT6pbqabFxxe5Jur3CaMWsXsUp33GqaNmu2MqBdvorB3MbsKohfdKvmkDK9mU/OCivCTtNk1cOHDjW4K8kzK6hcVzZdmk/iFRdGRXdt+hzAWTUbKphYKTssy3SFcfDJkTHQapcl1mXDcqcZnan3Z6I81uQ+LV/m6rNDtPwoRNO+1r9J5VRZnu4yRK256TnZlBqskNOPuB8+CdiZkMEk1uujENQ1ZR2SmS1NP3mOx/PqW7W0PZb6tKkx+mSnQZDFMSHHxjlLC6e+FBkvz4GoKxfm7tTK+XV+4FdbnybaJ0j659Voc/DHsJaa4BmUyOdt0MZN2mzHRL/MIMU+W6XEp1VQlYifaJJz3N/n9ep7cFVoIp7V00tdwKP0o27aMXK7MfoF3sTzWx00w67OYCbtVu+jLRZJgs1WfGWXFblduc2uZPO+nYzgz59k5HvQap0lz62a7UDLmJ0jx23aAsiz5NkkPWIzkkSNJOf9v3P0/WdQ+hJWl7DpiF9Lsps9E6YYKNkzLJzQ1+NWkxjkIV0PWEBZoUD8TpmXI4WS4VXzLNL75pXhXJLWNcJI8BYw1z/Gho89qYUdo8x36AB3Hs0046Nu0u+sFUTNTHSjG5RdvcqLE57BBKzMoo2aTPbk7o3r3qPNHNnzjBs70fOv2FtlNMblp+qrl64d1+luESYczEkzB1g/Q+gmxunyciMLlF0p2fTvMbJErehum7CDrqM06Y7OVZ+0iyCq17+LZ1t7PGkNbfnzbV0ZkfzTN0kk75zfiiUbV44ZAsBhIDPYGfvFQ1IBUJDJIh77M4IQJkyPtQTohMM3RrKPVKbNLf72Gq6WMBZiNvmnb327SDBqmKwVm+qdgu1iJQ4hfLTpGWiX3/IMdgnyjTIysXh1SJLru+R55Jn2jSg+u2r5b5LRolm/TJ/yBkfQicH+d+xAOJszyH68fJft7l47FXbK9U1Gtye9TYy6zb5RahkybltI/Vj3bCF8VcxummnD79GdIzGKaadDFzrLkeTpopB3OmSDa6HRwktgROkskln6v52cks4w75XQJX17kX2hNVcFK0TxKRfXwU7oz+42O6gSdx1Grd74jJM7GSReRNvN2Me7/bn0fkRCX08As+dezpkMYVdgN+B9qDKXE33fC00eDwlKi+Z5vN9+u0GI6iemSbzeP+14Pq7T+L9p/7U3O/ayfF/yvTwx9Ub8rViibJT2UxvYcywXeoGd9te/it2eDNRJWwBSUTYi+cSvKes5RYfpkYnWoig6iWFy8pW07yIHrZdIrdVMjWbDhJ2xiWTTSyiNJZP06YWEqBGStOr9s5tSt1Z0V+vc3ZfmEntcK2DqoRmmoonYElquWcqxex4ERPLiI9OWlYBfJD8xyn5P14PwceZ/47Z6dObfZOG60T4jdFvTqNnCYf1Mh5RFI9r9boAm0lUv3meptwWiDq10rEN6ybBmxc44ANdlQuekhI1BuztN/W9IF5wms0Tp64acP3dUrwm/rwRJvYYWz4FL9R8hzDa7aVuRkcJc8xvOff9EkplvBM7hWSW+OuWO7ZFz6svAnWQRWI/W2jKfw7mWSAc1GvRV3zApF7VyPfGpPzgUiO+aZkW2y+LY18a2S+bZFk8xlfcPGCyrYjkW2MybSrkTCbO+jR5mc6oDFlvSg5UzvoyUvORqZO6shURGF/vrJdnNQRF2F9tLJN7MQxj0powUrxCw/dXZHqFxCKeFeBzke2d0go4i09DXi2r08kxXPfdMId9xKJfl2ThfLrJFL8+tYCbtcrxKYDRw1Ett1YYmL6Edyw2IkjHhtRbaSwm5SUGcHHPlnSRGCs557v9p1XrgP48Ye//finP/6Y1okHWPvUQs6J4yYAxZRyiCihIwygianmkAw7C0Qoe9lJllD3GAMy0kynoCyPsWgKh7fTjMRwNdMpiEtjIDrJEehKYyiGkskMlEUx0gxRTHawARRhzRBFoK8N8B4qhRwD/W6A41Ap5OjvgwMMB0JBv8n+OMQ7LBrimO6bAzgioiGOeD8dwBAQnPT39Nkx7rZcivew/4703stNeo/78hhrSy3kHOvXA6y9ckFvbx8f4uoKuX4/D3YcFPzblFnBv73O3gIjDNtQcCYL/o5XZ7KquniQU/E5Q2ZeIRfBDv13enF9+/Hd/PH+Fp637xyRzsO5gvD9yfzx5uTj/yAsLImAwe3HC6R+p+CRP7m7Opz2TomKF7IaCsXWhE7urma81njHg0rU7nAu0pygSwowEzQda8WsT5vFF66vqmcJdjxIxIzOZPXCFbZIHZWoXRuhwRMVONfQ1cmwPFHLZp22UJxk3evFENo+4Gnz/MwVsqBHSjHbtPBvIavJOHC717aPC4rMmVctZfcO0teVSTG8qLTQgte7o+DTUcGmrIeCKRBmOZQMwBabNtfba/bES6r8D+XS95MR1byYaBzmcJ/1Nf/26Qc0h1cvB+EtMcLbRISN4thPyEAnyZLmJfCpxew/iIrXor4Uiq9kzYlqYVQ1AYcWI92+ramnEvv4XZkpw7c0hm/TDGV3K/puUyDW16cWs8+MuRvyzYzAmx6vNGqYE+1VK1lvugFaYgy7qLVHML7vLTdQa8g9L2wrV7U5Ly5+oWpIgopRjN3kAhWDVy4K0B4Qaj88NEOSkGAiBFHvMqiYikH0dQ1LJoJQVYyQYhyjv2cYNSB2ZaKGTb1qV11F11ZTZT4qGwOaXczviSDGUjHj+Z+IbIdCUdP0i4eDdkmXDufE9o07UUf6jbslxf3dcL5YveNVd5Qf3U0O6MUQ7hWr9mdy0QBetUn7kmlOMkzwqk1MVg7fGd+uxOAcpfc9GYearVi51WJRI7xciUlHayaTl7Ja1vcSZOvRyfB+z+obVkUD+CY471TyfJ0ruKC2o5u5oq5TEQsSPFOiF5zoa85qDc3gPvWUT2AOdeIQV9Z87PTd4246Cu9Jz6ToE9EJ2ZSnOB3ZMGoxmYt3XMJbm33iSZduQrgP6gjyciWmD6wcZr/gGRyrTPnafUKEsUdmyvmOKbNvA+K2S+p1SLpv2FzgDDIWiy8IV2dYCCzpkchUOc/4QqpoHOdgd71NCc9v4p3K0/3oxCg+0yF8EjrSlBGD0nrSCbdFtxdUwOuMIzB9ZNeEe2zUgo9qabTbOkgV7Z52CQ/C/rAcne7ux67e4MLlTVOvvq/sNii+98D8/tH5/WtsQPG4wHajnGyq+q5k+lmqdepFdUnmHuHJteTrNuQjVzO+li8J4SWSQHzK0eXlxfpVCmSsmzNXkx9kIglq0iZrPokrszePrsgiBimLyYkBMJJQACEwbqshfx/mZDp+QhLTlME04L38wqt+byEdlk92ss82yMo7rk9ZYb4sTaWnj2CC6pPHA4B5zZpq4fzx9XBDXgDsw8s010w39etB+51ykW8r518bXiWcCQYhB50okF+pmMNWOOjD+Y5TtviyVLKp/i2lHvSlz86/5YmEjakydCkV/zWez8CXPjv/5uczNM7PkPP5e62HMTZBgr5aMXtcclGHXxByyqFBLuCM/6vhtfWlq1/nuQd8cnHTY4yBKPPijI1TW72y1ynGscX01MVQY3CdZjtpNc3mVXHNf3j714htaryzBO+E4Gf4Xjigj03Xp0b0mKl6yOD+b1bgLo9xduguqg42uPtM1l2Gd4Zfp/NL1LV9pa4sVUf1dTqmRN3OV+pmUnUiCTqNkC4hRRcQ1MGj6S8Be0PoDkZq9+FgubRTHNz8UXA8jk5618wJhLP0ffBgfmOduG+4j57jGu+Ig8N8ecyyA30Nu0+QHEbUIgzS8z0DmPtkkl193wU0g08UQHRobQmJDqJRIqfxA9k7ChEvNWrtAHZjkYhjjWy16sRWKy1819ggL4BXdCwDMfzOr9hBjIMkJA1roBwR5QjP1AgHShPUDbFkBjibZMgJcZYw7gExxHRzWEgeSlQ4jSZhNESAFnOBc75CGUZtckmDYyRS0LELnPNVS9RjEyaNjZyAVF7JRAKigvFrhhgmx1MgirBqiCM2tAIheAVD7oFRFsh4qBXxjI24oN5ezQhDePQFJfAohvzTg71NGmeHe4uMymAAUeUQT3yEBgIJSKYRxEdrBDwBg1w638iNlM4xCNMFRnFAlKFayDc2ogNZewVD7oHRHch4qOV6uoHb6m7LcNxx96PX2DvbSwM3zHYqCat/YR9bI7b2lxEuK2yWFjDrdKt5PWPVcrwonO841IoZn8n12jRvWFNHJ27YXoZkgjnKWuiUcF0x16FYdGOq5msTJg1h2EtEz8j2e/I327bHZG4S/cCnby4MuwYURxCTV0d3Ou+4flDlsKMMpbLVEoqF4CEMlBJMzf5zqvwetBKM94f4aGuCVxZaHcZid4buFSCNLqjQ7hR/Ft9eBalVRhfdruFLOxqQjmnLJhUcthl3hRIsHzalZIW5ebiFvGNb8288gV938mD+s+fIQTbCQCnF9J7VXwgcjUzM7rMSmuAp2zLZVd98hc55rUVlV9FR0zZeyY19xiOSE6cUw5Dz9tAaFZ9PDYR2Lr9Wfd1O2AEYpvIITa2De5KgCiasR1U0488RAZ/nOxQsKvfNhph7XmrvdjclN1yZiJ0UTyYiCHo0IT34s4kpJhSX6XNi3h5HIssP+1xGStAH4gqhnsRYanJ/pOZrVElYAqAC6NPD820rTGXX9PpPSpry9msBCAa9YiSDryec9igOQyJTpHCggwYBBv4ZjbVSntGdCfjLNCerKgFBKAuy0gQlQY9sxlmBasYtASCAOZGORLAkpnde1htZ1fxUFtsb8U1Ery6OeQ5kEiNNdLORME9HItHP7oD5p0AABCFRUAWIacLf2ylVQPFN7w7Owkm8Enc/x3foq5E9x6Aq5kH6RdFPMiybXoQPqqQsu4EcstBsNYrSGuolFhO8A2EJZHhRPAtsT3Yggy79nB6LNal96A6i3F2pDH+66jdSA1EgOkphPUwF8XS/0HgDvcSC6ro8ZI3ZWA7Gga44Hr1EknnzZGznWjHNl7jiGGglEgxmzCmei18SU4U9iuiHFtDMLrbR2gWKxb9iMaKwZ/7NRq9oRMq0BYRWZsr3AIpqSUYy2b6oehpSA1VRrxi8dgbl0ooIPu98SD99qn5XbTO209gpYptn+hp5p+RS8boe3H07sWblTR3fVrLbG5FSZvsfg9eW0gdjh1+DzfqKk5U/J9FUlbMT5GXNTZWz/pScm1Ei/NpSchYTR8w55tlPM5g4p7Tzn244ddZiVnI2x6kIFqqSc+tJhrfPftTh1Fllnv+wI8nT1sZystj/HLPulZOz0Pa0HEPIoxwmSytJ0MMbpUtcTUrOjv178OKMmRZIzpWTAGOZ/eh86RLLM//heRPmrO1kZctJBC7U/aRBVi7dVGhz0GP1Js4pbdgD9qeeXivaz0akGFk/xyyFJWfM/j3CMPs5epKllWT+s/OlSx/hJudokAQ7ek3O3jAN0jj7SQaSppdw/hMNpZ3yXMiNNUfhD8HQe5jfunpOuIXC6linStppItJLuxuXqu0kios/qDJD9UGVETlRn7FqwcvB3ENc1UkUES9FPRkxo9c0v41IqbYNSBXrfh2Raza5z/6QIiJb/ynp1NVj/aekY1ae6ZQE1e/sZKFzb77pk1TtyYPYkemSVI9h8hQraH5G6UNmkYmTFC9f8hQrSL686VPMEM8tJpNjjc1v8vOMTZGkmHrTJ5lBsugXSLJDPNSoTpY5Os85z3U8GZJoZyWMywOzY6eMG+AemkcgzQ6er+Tn45/2SDEapJwwgGRlmHTCAvGQAgqJhoi8ZT2nwARHqt0weYoVNGuj9ClmyAcYksmxxuY3+Xl6pzJS3NyEcXlIbgYp4waIJ+YXSLOD5yv5+QQnLVK8xomnbSB58qSeNkI8s7BIui0un8nPz52eSDHZpQgJ+icpUoQHKUMGgamKFIdh0oiFM2GRqN2lCYm6MwspkrsUIcHh/EKK5D5NSNQ3y5Ai7KRzxZ0YMly9TMWa2ku3v02adYBFkukdYAFlfLE1cuIfhN1DyuNtLD8H3+TozFBvPTHfCJkU7KVfZW7QEo9PEWbM4vWalJN5vWZgTs8Nq9RoUU60Y+1PXuNF6IRh9f9983TWzu9Hd3+FHPrUsZ1gVz/8tRreN5vjcUgfc+nfNrZYcZiPrZDq1IU9wvt1OjHXk4/vri8eRVVrMwFePDKl2HY6CETI3C83apqSboM+mV2dDM6y5dL0CkCAJ6n0XCwr+9LxXISDBhqi3a14wzYUML0WFKrW5tr4NhwYAsdSwYF8lupLwtXCUySdDAUKwbPyyQHRisK5Lzk11EuQza8HhOvMWkG3Z5lLNRCK7es9qcSaaXODONxuLwHMd5s+JVBdnMAXnS4P4OL5mS+mN1FPYnQ6WJikDd3TLN6d3QCUq0pQ4RgpCiRUszJUQgJdKrbmd0q+iALT/nrlkGh3Jds+scUXohrlyFGi0dSwkSQS8V6seSkqbPtoKQGBTA/ytHl+5uqT4F/hOK4OEKauxbLixUdZ7IMLwYk8YkAsrRHvntbQN60phOyKFO5+0EBDoB/ISAqBdKfkgte1qJbI9scjFsE6bKb7XSYhrhkKCEILUK8G+7eyeXYK0U5go1ducHuAy/iisUEIZmZOm8E/2Lv0sII85c9S8Yd24hxXDUdKQKBSPp2xsjRfKjiLJQLHQJZHr4AEQL11jgocZDcVuz1lSxSKpQOEkcV0FOMggSxisYojtmfnJ/cnc75ADcZsESDGfD5rEAPSXXqw+VxvSz5fcQ6vkI4KAQjq7RgpAYHcqd9ciPG07+CEcTdP685jQ0x8c9keKzcSDsTIEwrHb4Ptjw2FJk1/arjakrjaSohqs5uLx7HsRKAY1Qurz+S6u8mgwlSygRIG6Fyxr1drXNE4OliYpLXZaRbvQmwGyqUoy7lW8gtvmy5MLfbJIdE0VwRERgUD8k6xQmD6bq4MBqWteqhJ64EOGma+llKv8O+5K4bBumPa/F9Inp0KBmSGmeQ+SOAQqoIrUS3bG2a+6bfnaKChIC3enGvT1GPf+rAwBne+YoX8StJQ2lIoJDfWEozFE2gpC+Le/APHYCSwCOZ7KKolyfMZ6aHg2ihAUmH6wY4OBqa7y3jnjgRytIBQK2ZWnbnCfdVsFSiIKNupcQTETgEIUIrNk2QKOXHmylCg4AbFIykokqw5tmR6CSwCskRsGSCKXK9RRdGlB5v319QhH8hAiAYH93A8YnCsRvOi26RwL9aoPrJHDIpVmX0+ojqVsuSsumNmBRw30ApKIhHPb2/m2vTiKCE9olhM2TyVHLc1zSeGxHq4ltWSiOqgBYWSX0Q/sYT70g+VopN0arvR07eeBr3a5MAcN7WW64uSm3a2K8dmoRErjCFBArwZX4paK/hSiFcNBYb7rhw00BC4r4mrA4M5v725+LbgG9RqkS0Cxrhab7pHjNtGOFICA90wrRLu04yAdApIgLfnqFoy0EHC0KAQgLRX2lQlvFUZKYGB7swV4xiOu/0d5WB77HPZi+AwKJ6KIwTGQU2P7tKjzLFPpNdAQVA8D1sHDNN1ijFbfW0RIAbTrA+ZDcewRIAY/EUs+I3Ej3BHSkRAJ4sFL3eXK9PB2aqvAIp736aUiYBpIQnBZrLrLM0wE/5R1VcApS3NoTIG+FaJvvtJ8YoP5SjRCArRJwlElIsGNfXYC+DsT6piN9xs8/OeVUWJmR6a0H0VWPTZmkR9HDwZJQ3OpWJLkvrXC+FwblW3kjuTEo9ki+Gw0IdphkI0ONitcgE9JNx2Q1BO2w24jPCzx+hJ43PFkMdG9gpIANzHzlaBgVz89/3jU8mr4nEtqjWDTy4NheA4C1lK9fjUnhN6fC4lgxeQX44IbcXKZ2q+gyYcsk3ePQsUmKWDgFFs+VjwDWL3pysDR6ln705REEYAYb9iBVeP5i+N4o+lxD2dsRwcrRdZyPXGXNslZPX4tNELFGBIlBZTLV8B04jiMZ/brbiPrBK11EpuBA3oWBaISrFQj1+g3/Xk4QRdepT52Xx+VZkOVrv3DYviquHAzHbOSl8UAhdLwy+HQ1O8HV9j+7h+ORTaOX8WlSCEGwmi8NAjzIEOCqbdzlixEl1GeyEgjjlMjD656qggQHBjg4MEFgE1OnBlgCi4gkCUQR9lCPWiWCKxfTMEZU1QzH20JxxEr0IAcvv0T8yapUeLAgrbpJMF1uraX1mIZ2G2hWNrj62EALpnaok4YWxpACH6v4EJdgLoIByXAtFjMolhBWBSUpz4H+jAYebbGnMm+SCBRTgXipstfNuLCrP7LiRIhmf2FiCa4aAiFtDkUvAa3UsKKlIAUjxXksfZihCX1ZaqpC5Lhjj0N9ABwshFk3i9e5BjL4FFQH0+XRkECrZvYYtAMSp9iTmo1gvg7M95vVBioyViidmjhYOac32NjrPkE6PDQlZjvyASTzaKoD51MlAUtTajMOyTs1QIQJDPaqAEBDJHcmb8Xw2vNf5T5REDYjVlWS8U5+gJtJESDOgdW/MNgy+Y7NKjzE8brRG7Dx0VFAjuNbJF8Biol2gohMJ5zzZaLE4WumGYY0deNSAY1/sYreiuhU8MjGU23JiD2wRQAykgUimfdiHz0TvbPFpkUOiZ+4gmDPL9/c31SbVYSYVdRxspIYAUZyQ4Bx0EjImcSkJjCcFxTmcULHsVBAirOQnKQQcBI4stCcxBhwQG/cIH9BBwbf+BpKxsJThQFxmFAshRQgDJskTGGnVl4CjnZp2BomhsIQSOGbBQ0Bx0cDBkxeNqIaC4ZqIkqc2uFAJJsFIuSYhsJQxQP+lOwuSKoRd9OtEXGrYXdGFRcFBBnO8L8J4tP7I1x37YIrpoWJIvL9lXdydEW24kpbV+4gVJJbOE4DiXgpfFnJM06gMtBJSsaIAOOiTNVDtfRwJmCdGRUT1GV+s1+EjaioAmvNq9JxnpvceP9N5zRtJEWDo4GHOBCRHPQQqBpNclCc9BBwGz3XBViurLTulBC8TezKAiHPCKrNm6Smy3poBMJGUSHksIgWPujCbBsYTgONdXFCx7FQQIe+Ikr5kthMDhS16RNIuOEgLo8IbicA46cJgbtqFgOchgUNS/Gk7ygrtSJD2RG14IkjkVWwhRWJYKSa/IJ4jBqxqawtrrYGBoZsMsHRQMJ1nCsYUQOJKkaTzIwFFuqSYJb0lmCLt97CQ8thICaKPfKdmQtNcDLRSUoFmlcJQQQGr+6R0JjyWEwGk0US/RUYIDmeDAS8U2KwqmoRgOa02FtKb88N+JhTmNS8LmSCEKiwiHBEUuzWFqGh5HCw71UyM1SQnZQnCcebsrloLHUUIAlZIG56CDgGn3m5Lg2EoIoA0j+aBZOggYc7KchMYSguPcm9PkZ4zso+/Rw8LxkmTyYSiGxZKEVJIIioyIBmcmv5IRHbSQULuLaMnAXD0EHF9vSkbzmRtoYaC+aao9gQMtBJSgmcW2dDAwmui9s4QQOIotSCYjbSE4zgPVFMADyRTAQ/Wlkl9J3n1XCo70SRScZJOrLUSDQzIN6RME4rF6dbYykQNxxygGOiQwqMMUHi0glKjNhiw4SJceZn51fnrWqBpxgGOvgAT4LPTqEysb+NG5sRQYyWxwfGI1v6qe4df7DHTAMJdsgaogBwkwwlVVcHioyl4AbP+Bb3EBTC0NMMTthlfnp7vzfhgSR4gGB93ohwTBeATlhC0hwrKhKpX23giG2yzvylCgUJSQRw6M9okrExaSotvgVSMEQ3UhgopAwKLk55wVqMDctggcg+qItUcLDYU9hDmWAiKZ7U+nQq8xL95BAw2BLpeRFBppeM06BdtQkxwSfcV8gjYCGnU75l4BCUBTRrYSEKiquDIDXjhIrwAFMKvJuE/cXgKLgPuYOTIIlGuJvCrAURmB2HaaK1SY314AmNtd6vZ/MTEUhkIIHDQG2n7GdaOqGa+bElEFPGI4rP8xp2OIqCwtGNSH97PHDVOsLHnZB6Y38dQxARgjmkBIvn2STCHDpzgqBCCoNm6kBAZ6NlvxMRytAM5+H98E2/MLCeLwulD3VGyOGgzM7PTGBazfKwAB5AJ3I2MvALVfLhFhOrvkse+x+YWolndKvghMQNCBTsyy229dLcxN7BzZVHm0YAXtEUI1WwE9DJwJdY7kMRIIhA98e8PrmmFniHxidFj45+YRxOHNu0tX0FQ7HRIY9AxkQA8HB//q7BUQAD81XG3NAjqOYi9DgULwqrlaZFD4F22sRwaHrtkjOQQaMkCppYGGoCkcVwsDpRVn8MDtlgYagqhkHC00VLu7iIKoFaLBIWiRhmqEYPhWyadICEhUxRxBBF6rc8Y27EmUQguO/AKP5NBosqq1YqIyM/EUbLYeHRxJsR3UsGDo2f6xFBSp7UjfSYV5eHsNNATBKzjSAkLJpsYOpPYSWARcq+nIAFGaUosztljxtuOFnYPyy0HRNNtvskAQWSro83kmHjEYxSSGFYVJiV60sEWgGJV9S/fZSpQFskT8gmC83UbeO6Z4pbFoIzEY1u3F/JF3Uo/CbA58bASiQvvl4GjPT/JRtYvvj2uxwWzR8KrBwWrNqoKp4tHsC3hhWrwgOkkhQTie7i/NRV3TPVIiAno0u5oYvLEICeLxCO4298tRolEW30gVDvrClebfHplSbPsocXcoBvSAcJ9mj2vz7X8R/OtbOJMjA0R5fjbF3MZUP5PrTcnxnYiIJjkkqks4oQuG7S5a6cJoY+BsHRIY9LgioEcCN9zT9vacCnOsDASuDlf57q6N+Cirj01ZwkmDkkDEdgzBSpJL5X1iMKw7tuTtTnCBb148WmRQqOYkoAeFQ3fKsV3xO6ZXiJewSw613pou+1mjjOT2ZC0bVI3xqKHAdkHlzZ0bWCpLigKpv72YCKuXo0B72BRMU5VXJ4bCusLcxmtpoCBuuF7JguJIS0iQFg/ZQoZFUZi7cxddpSApxrEiMSBFQfpVgaBcPUu1ZhViDdjSQEPg7jAeCuFxsF1njxYa6oYp+LrrQIcEBjsj7pfDo3FWN4qkXu+kqJAoC8xRRAN+ZC9iidtW6lVDrypYqsjxzUgJz9aFELyq+liCuE+RTw34YH1SuE9QSJEG8LOoCvmVjK6To0TDfxCiskBU2UIgq50lgsfAVbKBEBRnM9f4jqGtQgCCLJiBEhBIyYXZGVstr8yujgYXgcCrBgbrgo3iHpmtQgCCe2RDJTDQWtT8WnxB9GcOGiiIGf8nXxDM6PnUCMGwj82vCAbccKW3beAbXvTHkBA9wIAgDO+nhjeiWs61Ypov4eOvgQ4JzFz8Aq/yHi0Y1Oz+7Pz+5vJeVpxi1sYvR4mGqv1hSTgi08xoVRy+bOLKUKDgn+JAiwwK/fw8emRwmA6wXw6Opsu6XX7ZYLZxDoVocEjKyicIxsOd1OsFcPbod+6gQgCCfc9cJRwQCQsK42rBz1hVCNSSzUCHBAZbNEMtDBRJc2PrkMBQNDY+PTDcHefqTFZV14G+WnCatz8i+xqo2Io3IU2ITF+wxGX6OsWJLsmZXmzaC2rM3V3wEdlICQG0ITn0NJZCIcmCL/Zi8DGiVw0NRvUAh2o4sEor8dSYI0rIY7YhQQyeucCXq4tvmldt0EmqRxvUJYQle9xBXQwsGR0NzowvuHjhZFQjPQI41KDEksGgzLfVYqVkJX5plyxJXlmvJhiS4Iyzo0IAgv2gU5xlxkUDR8QBn/G11PyuZFtUXFtXhgLl5IWJctfsosPuTktTIOPHL145KBouXjkqWPkuMe7NOmhAIeqNrBAbXXsBnD2yEA4iMIz5p3cn2ItdLA04RLVEBJrrBRD2JpQf+oqkkRIW6EZSXAMW0MPCtTMpZqcRHd9QEotYENQrSwiNcyplyRl8K8JYCo10UTVrcx4cs0PCL4dGu6o0x4RgHEuhka55tdQrCqJOiQgIFTfNq4YG+9isn2ieXadEBERVUgc1NFi7Gww+Zh0p4YEUr7l64Sf1hi/0zLzMJHRjWTTqDHP6eaCDhplrhdm3O1JCA+0/p1S13hFE4lF2bAg6NaeyqQpRLU/lN+zuda8aGOxMqAX+9s6hEBynFBtzBpICyJWCI8n1RlYmfkxbPbm6bCqS+3MTtMHQ5/wZfX+9K4NAqRckKHsZMAoBBhECerpmLIVFumfLj2zNaaAOYgisUmxqiqbJVQIDXV6clrwqCIBcJQTQmSylumFaiW8kWGM9FNygcSNC9KtiQWtBMkMzVkOBVS+yfOGkT9gjiUA8F8/PjdkVv1yZdVUSRr8mCrLelGzRytywDRGkTxMHqVml21xTEQ4FMXhKbuYrZk5bkcAN5RBol6WUNM2yrYQBaqoFxcS3q4QEOiUDOqUBouiOuUpIoBkZ0AwP9I41dS1YdVo2NB9OjyACr70zkITLVkIA3XBFBGQrYYFMICE6KEsNAybVZiVLudzSkA3lEGgmBhmn+fo5UgikdtaT7qM8kkOgzTd80ZRMkXa+AqIoTElYgEM1BNi9IJn5coQwOI16akojTgM1lIOjiVLTjN5sISTOnRJrYQLszncxd090t7sTseU3RRyBre/lJ8G/nspvOMKDDhxGKi6W1W0bkJXiyXr0wHAUHUN0l/Adl2uuFcU3ciAFR1KsEGbGjwDJlcIgbVZiQTHXPJACI1H1TEn6pfgVfeRK/rWoKArDkkGhMEVYib2CYLwbonWnG4pFJxPIi+ST6wghcOovJDB7GTgK16xgmlHguFJgJPxmFOQmFKKaS1Fx75g2f6ehsZTgQLLcLkkWa10lFFBJ0yoPpOBItFtyKLfizFghWEn40fAKwvFous8zgl4zzfo2wRI37So34UL3fKHEhuJxOUJwHJKZrjl+kmuuJcWamCWDQNmSzMnYOnCYr0IvKD6sjhAcZ7t+kiUFji0ExrmfbxjFZ9XWgcPwGrfJtRVA2H/T7T0ZJJ+osRoKjIiIAoWoozqQwiHJ7uoJmvlzvyIcUGiS5tDWgcP023NRJL0IGONhdrUXxpDYOnAYkg1qD/jNaWZCmIDEkgGitFcIwRHa5BjrW2X69cgTR0MlIiB8fzikCAaUZXlV6XY9Ab0x3aeGAaMBIgC5lzQoex0gDF80SujtnSzFYvtJyJLg9tqYKD0m6kDylDAUt+S4EM57BSiAehEL/lmamVoEhKVCAIJvq3xqQLB2o+BMSkTd2UtgEfAFM5LCIuHeKkcGiFJKrdkT5jB0rwAEaCPDnDbPz5hXyBLBY+DriUcMiLXhfLGabyu94rVAfMVcHRIYgrCGQUViQNxrFlOlASUtRLryIy86+lJDvaZ+PRK4B7MEhrpdLCRIi0ddiCNhEtxPUtCVZCsGxDJjtwUu7JalgYbAvZyuDhRGKoYqjTY9yhzZfFoieAzkE3GFoDjmLppG8WLOlWCl+AV971pYEoq4Lfl8xTmmrHoJIELztBYaWXUOGmgIXMVxdWAwZgYcTGASw21vuFZiAa+flgYcoo3IiEJoFZAAZw28MbVF8BjoroFPDIlFx4QEEmvefjkRdXYvAUSQzQK+P7VNjTDGNZwHCSwCqtl0ZRAoeAoEAD42LjYwLlFUXIqQuPtVyrlWnMEXPAc6JDDn/Jk1ZbtBwKwpIOa7poSRuBRkBBCXZVOv0FF8Q4JovLlmSlPiOYJovP1/UiKORBGYAr8ENtAhgcE2YUMtKBTnn1mJWVc6SMAQHq5wD2eXHmWOehiWBhDiWlZL3GzPQQKIMLuGe8+ugaZVwVW5NbdtiArebrgyFCgnT5KgyY1oUkCelbLmxJCOJgUkzccrokkB+VkJTV2SjiYM8hMrRSH0tr2SGozlqBCAXJZsCR+NjqWASKLg8tJckNKXcX9WC44WlMQi7i4LQNewoCICsL/P4aeGoe4m8olBseqGlWaHGOoOQFeGAgU9KeSXA6JJUfSxQOFAlggM4/PF6bvrx4WJCvj41G5EeHwuJYM/tpAgDm+9MXfE8+LR/L1R/JHVeoFm9KoSg/LX4OSvgfnDq3D+QAxa/+k1CtSovgLoY62WT69D20pjkAv+1CwfFTe9Hq4eRfUMPxIaVMQD1itzAR28w+LRwkFt9Kp/EGgoSwsDZTr9jwtzngixMjeWAiLxp3fXb2dtLRDV8gyL5ZVDoJ0sTNifK1R1d3UQMMj9jJYGAmJXpgThlfxyeDTcBNNIiQgINenkVUOAtcOKJ4LqZAkhcO6UXCrEuootgsD4qeEKPiY6SCAQuqaL4snYSmggqqaZsGWeG0NsIe1EMBhtLwFJ0WqgIe4UXwhz7+6lVGvMoCwoiUHcVoieeK+AALjH9sIsEQxGv9Z1yXmBmh/yyyHQHirR3rYjF7jjkj4xBNYnrjT/dqIU23bxBHFgIzlKtNuLOTHd7cUcCLjivER2hfYSWARc58eRAaKIqpBf4Qhtcox1y/+eVUWJGp+Otcig0BOeEU00JBEXEsW0ZiV2c/pYCoN0q7oTle9K+cTK+UJusGQeRQzgnaz1Da9rtkRvGA8JYvDmvDb9G5qH6ooBsZRoDz4it5q5MhQodBvNJnQJYdt1WWLQThMG+d831+dy0aDCclgaQIg2Vs4LKxumpTpliGvJx1IYpG/t1DWm6znQQcDMeN2UiId00IBB7K+aNKusgz0B2ngkYYxVBjR//Nt//PDnt3lEM97edISHsoUQXJsNr4obWcBg9qkRBKa73k2sXosvMAxXAsHS6NX75qnt7Zw7GyQyYAYaXhrL81RUTG2hbofU8Fx3GkYQTmD+gSAo5dMds3cwZPjv0iLcZbF1x1gZ7ru0CPe23nbxCUAEVno4xRlrWzmjOWy801FGIiieF1afCzUMJ5NFY0tgWS5FWc6aEvSMXAU0iaz0B64q5wbrbJiDCJanDe4Pr8AjESyPCWV/Zg95c1l2AhQc/5ACUXl7BSyJmXk9KcUSgbKXoGAxfV0TaxuH06sgiMzeqfmGLbi5ypOrGtrUeHQwVLtLT283XDFw8zdSoSS6VSeNljRcnRaGrqq1YqI6lbLkDFhargYBzfntzVwraCM9UqEgks0T8APmShCwtKcwUCitApyknwaYcVbAx4hjFTzRJ1GLJ1GOt7PnYw2k4GwXVXH73M3ktNGWIFBDDRSNqJbQEcshNYLADO+uRa15xdWtcv85WGjLIJtURRB/W5QNbJi/Swr3Nj1f6BxDnxbhbjZF/+mtKUgQwCE5gkFW+pIt+LVkhXkVmxqEMlJBEDVlWbchcD+yF7Fsv8QPVyAqrxKc7N31YF98OsouKcZbVEBnMZpSzvJtwMYNzpmt+YYVN2yzQbSpYxUEUbt2RtMLDmnB6d7f31zfquDdeOloXiECrsDNLACw2NUsOWS83QsOnWKzkiMYmqfxmbIMhkPyqfnc983THduWkhVAo13qKZ+r89OzRtVSoSbJxirwMr46P90dtsP1qX06KKp2nxdrc3feKNZ1iIFkXi0qOmgfaayCImpPnn7g0CLqkyMYTIt4KvSabeDziiMRJI/3MoRMnPA1CLk087WUeiWq5eg0aibSUAjBVdVc7W9sAQE5ChgSRH9/nxjhr3fdDJpOTEQOyygVfLnHVYCT3PBCsA98u9uXBO2CemTwTLtNSW2wh2LGWQ17ghE5MkZsuVkySKY7JV+Es7E/k6YXQHJ0c01tDDNwZ8QrBOf6KAt+KUoNK5xDajjB7fNzN1gPH05JBwqKvQLfFahDHZFDMK5hQxmTDuFaHQLd7/YIgyDGMgimQ4fmWi6+QNsgjwwJEwEPjuWOK3OSow2/Xmm1hXZKfDoIql3wEdTQcSSC4FG84M+i4sVhJRWE5NFBUa2bUotNuT0pNyvQ/qyhBpxmdn9mtnmdrVhV8RL8PfPI4Jh0WbdjTxOnBUU1EkJxtW3cOddMlNBGYKyCIrpa8DNWFaJgGtzH9cigmcyYogJOFQ4ksCzvmF6ZgBaYejSUwTLdKanlQpZwnF4BS3K/2BBVoKESmoyiARjpIKhQ848Us46tqOKqu14PRmErYEjWUvP+Y40olJEMhgk/9KAbcewjxC1WwKI5pMdTmC5MpQUrQSvEYxU00TmvtajAk1djFTSRG1EmG8UTSCafATpVbyVHM8x40fa9ERy9BIalFr9wxCy0I4Di2Miqhn8ZrfRwijlb87mANbF92qmVv+7+21O+Yi8CthPLVUDkttW5lkuxYCVm4t8rhOWa8dqcJcUxWSIInshlu+ei3mBKLk0aw767kBfa4jkCGA7rClxwN2asgiDaX/YKLhpHAUFSSn1S12JZmZ0aYJqRCoLIc0PnGZQroIWg03LT76vEbAvx6Uy13vf8G/LAjKsAL4X9xUsfTFIYyEGAgANacR0BBIdYc4WYWLfTIyjM3UPQTsw+McK/DYrEFQMeFbDTwykeBGYJ/5AaTtCFxZNf2zheO30Ii08HTvXfN9fvtd7seu+Yk6t+JQSZObT/cT7jtSxfYC/QQAJxjttcIDEXS/PnPccLU8JUysRj3AeJ7weBlf+UCmHOqSz04LaSXAxLBArShwwAQ/QCWICL52dnuArE6GTQMG54LyiLUcGi9NNqNEiOGhbNfNTco5pAql4ICqS1AjNoraC2TSHkMHRwpvtBAgNxp+TC7NCplrha4tGKYRV8o/iCaV78LhbEgKk7JTdQqF1yYPGc8mep+ENldk2jymYkBAUq5RMOpBcAApydn9yfzIdL+3kMtgYUYz53IyZkEnTJ4ea+O62zEQ4iUBCzLjAKkZbJYWmAMcy5+XeKFQJRM10VFMod0+b/wpHsRFAgw5Wkt+c4prEeFG/FTN+PKzc6UCaTLQIFKcXmSTKFa15dFTCKrDkSo1eAIsj1GuPfJYeb93O6uFIY6EBx1HZjx4HIhGhTQ62bWsv17nTajC9Fre0A9JkkPjEcGOrpHCSAEOe3NxffFnyD6QLYGnCMKxMlfj0+OpPN4grBgW6YVuIbAqQTwAKYbSa3VQmusiMhONCdFPC62qdH2hMUh6MDx5kh5ih2yXHmBEVhy8BhusgzTvjobJK9BhSDadbPKYMxLA0oBjfrhjcS/eEdCaGArI3qBFRDNSjaKEpvJswuPdL+UrElBUavg8TBzqQNdbA4zhITEGW7AWMohpvI2gsAAUYBEvLsd8lx5ldV93/VSIq9DhRnfyAIDLJXgCKg3LHG90wt4bNElgQUov8blGCXHj+TeyngE3YmLbAATNL5ttZ8jTHvFNAI3YkmqbbtUSs8kKtHhzfj7vVZaL5OEA1IVGyo0pKLpka1KQcFMEIXrAsO0KVH2s+5vsYujPi0wFhqbbrjSB5LBAiyi1gFRdglx5mfNlrDp0QcERwI6mnYGjiM92yjxeJkodsbMZA8rhgQzMTCOqkWK6mQ/cWREAZIcUaBc5DBwJgFZQoaSweBczojYNmLYEBYPY4OB0A5yGBgZLGlgDnIYGDaBosCxxZCAHXLdgRAjhAGyFzlhFq9d1UQKOdmFyVB0dg6GBzz1SegOcggYaiKx5XCQLWn1Slqs6uEQRKslEsKIlsIBdQPyCiYXC38ELxTfSFhe8EXFgEHAcT6iRcUJJYOAudS8LKYc4o3fyCFgZIVCdBBhqYut9fcU4BZOoRkRI/RlaLhe0/RmX1P0Jk1MXgpUA4ySBizdZWG56CEQdLrkoLnIIOAuaJ64a5S37gpIG+kbACPpYPBqTYNxStv6yBwrq8IWPYiGBD2xClqsa2DweFLXlG0Oo4QBkhUXyhwDjIImBu2IWA5qKBQ1L8aTvGCu0o039A2gCcFm6WDKSxeNSQ0exkUDMlo2pLBwXCKWVZbB4MjKdqegwoC5ZZokuGWZoahu4mIgscWwgBt9DslG4oGcSCFgxIks5yOEAao0TT9HkcIAXTHFFsqtlkRMA21kFhrIqQ16afsTix0oyg+tK4SprBocGhQ5NJcXU/C40ghoH5qpKYoIVsHgRO4GyifxxHCAJWSBOcgg4FpA6pQ4NhCGKANo/iCWDIYGHMQkoLG0kHg3BvXM0b1lfXIoeF4STGcHmqhsSQdlaSCoiIiwpnJr1REByks1O4wNhWYK4eB4+tNyUg+cwMpFNQ3TbRPZiCFgRIk87KWDApG07x3lg4GxwTwosCxdBA4D0Rj7geaMfdD9aWSXynefVcJgfRJFJxi45etA8Vh9crcaLDEnQwfyEBhhIkYCt7/vEsONN/f5wi13wtgAT4LvfrEyga8/3msBEe6ZAvMMzkowBGuqoKDDx336eH2H/gWFYjMkoBD3G54tb/cE0Hi6MBx8CBoBOvaTgSGpQJH+cRVezcdvh31ikHBipKfc1ZgTk7aGlCMw2WiYIqDBB4ifIMCGGooiYHEBKzZC0AB2mV5VP3dKwARPvAtPlyOIwIEuZYLVNSNPj3QvlszrRYmzAvHlYZHCgVlzqviWIwCBuFwVSm+YAZaSKzdTaBYop0MEgZ8NnovgAH4qeHDS/sAFHsVEhR8dXGlMFDDKOYAmE4CBdFez4qDaCXwEO3sAwFJq0OEg68vQzEwWNtE3UmFwNlLQCFkgwwgd1CAIjQEEVscEfz68kcn9n4eikkLLArffcj55p0CAqG/yhwD0WsAMW6fn834pD0GaYLzlRxdRSKScMjuNuXupBsCzJahgaEL4zkpDAS+M9fSm6E6PnyjRwoMpVfwoupSg623ZtL3huuVLAjmHUJ6OLzdHM/DxtyWScE3FoQCHi6FBiMdJPAQqLgfQx08zg1T4K7YQIYAhrO6URTPaaeER/rIXsQSNT3gFcP3RSzZe7EW1ZKArxMiYOt2zl1V/RY6VIPgE4M+2IHWZ1EV8isVWacGRTNxOTkuwJitAcbYtDe+ITksESjI/vqFq6rWqkFN/3vF4GDdvkdUCdkicJC1qPmM/3O3SQUJNBYDgpmL6u9vLu9lxQk6LH41BBrTzAhVvMQgHVRIUNBFNJBCQOmy3t8xjiGydeA4qEnoPj3SHvtw0IEfu5vf99fRI1BsGRQMRRWxZeAwd5yrM1lVXcN1teAkzyyiSolKTokDnJnL7hZcvMDnmlwVOAp+WtYRgYJg9oNgdoLM+Fpq3l9TBiZwVMAoqC0guP0f/ZXjcPcuPdB+/undCXL/niWBgKiW8JizfXqMvbmhDrsTdiSEBtqFiKfCcuTQcF00famwB+XCimjEAl+vLB08zqmUJWfgcd5YCY90UTVrrlBTQH41PJoJab6Ef6nHSnika14t9YqAqBOiAsLsTvCK4cE+NusnkmfXCVEBEZXUQQwPdqd4zdULP6k35sYW8/IQEHpU8aiYa3EGMniY7lYZApxOCA+0/3wRVTJHD4tH2I+g6EOcCbVAHz0a6iBwSrEx65gEQK4SAsnczleZWyV2txZdNhXF4b8EaTj0OX/GHr53VTAo9YICZa8CR8FjECCUYoOORj0SggNdXpyW+NheIyEM0Jksperu06PAGsvh4AbvLA2iXxQNWguK0fRYDAdWvcjyhVM+YY8iBvFcPD83Nb8Wy5XGh7eMSOIg603JFq0OPgRdRBIJqVml22wTEQ71UHhKbuYrVqBjDPjVMGiXpUSHPRsJoYCaakEwSekKYYFOqYBOiYAIOhmuEBYIG7d4JIQBeseauhasOi0bkg+nRw+DRxEddySEAbrhigbIFkIDmS3WZFCWGApMqs1KlnKJvUjAr4ZBM3uY0YHNx0oYpHYLF9lHeaSGQZtv+KIpmaLsfAU0cZiSrgCHYhiwe0Exn+PooHAa9dSURp0EaqiGQGsPqhBA2ToIHKm4WFYkAV0DcnA4gk4Nvjvzjss11+iLYsZKCCTFCnNNNwGSq4RC2qzEgmD2b6AERyLqVdH0qdArh9gVw2tRERSGpYJDYYquEnv14Hg3NCsBNyTLAOboCcXnwtHB4NTYCG2uCgKFa1bg74IbK8GR0Ive2MVumppLUnHvmDZ/J6GxhBBAstwuKZbPXCEcUEnSKg+UEEikexFI9yDMWCFYSffR8Ooh8Ei6zzOKXjPJiiPFoiNJqPGhDgKHYjIEfU2f0dCSYNnEUsGg4CN6D2QQMF+FXhB8vxwdBM52/YQOlD3UgePcE4SCH8ggYPg33cZCoGiKx2I4MBoiEhSaDtlACYkku4gRJHOcfkEEIEFE6oEMAqbfgIch6TXgGA8U+3YeCPbsfBKcYL3aUoGitJFZwAhtapT1rTJ9Rtym+aEQFIgvGiX09k6WYrH9JGSJjysV0wRjIm+z3wuAAdSLWPDP0kyDwCEsEShIu1FjJiX88ewVoAhtuL3T5vkZURSWBhRjw/liNd9WesVrAY4kNZChgcEfsg0KEgFSstFhPZi5Gkw0opAeDd4nKcjQWi0olmnzF6jTt5YEGEIqhgFok+PMcdXY0gBjbEs+X3GOgOgVoAjN01rgIrpaEkAI04+Hut/DI4WbpDdcK7EAN/+WBAICFbR1L4AFOINflWFrQDHEmrftCfxZ7BWgCLJZgBdJ28QYY9Q7eFCAIqAjQqDDQewHq7hwygMZGphz/syasp0nUrIs4T3XKV0MLj6qJ01Ez3vF+WdWIoY6BwUgwsMVqhx2yaHms2uw8ewaaPqJlaIQetsGh4PaOyJQEHOdVh8V5aeGlUKDY3L6tMBYdcNKM/2DCazkqgBRPvOnd9dvqW5Q8ath0E4WWrzwq+oZvPw6kMHA4CYKLAkMxK5QUW3KSAgDdKnYmj/hi8bSweC0IRfhn2xbA4PRXiuBgmgVMAjde0jwZGwhPBBRM0PZysyNI7KQdhoojBUrsBStBB7iTvGFMDfWXJqYwbgn5VVEIW6rBY5oWy0wAGaMiQhgbWugMPoO/CXnBSZ8nF8Ng/ZQiTZgB/LOLZ8WBusTV5p/O1GKbbud+SiwkRoUbcWRkWEPClAEVIRsVETsz0poY4UbarsqJChkA+0JWUpY80di0E4SCPnfN9fnctFgVsotCShEu2Xk20bh7nIbyGBgZrxuSniJHCSyIH62MM5kVcuSX8ulE1muTevFcBK4pj+8/aujLL8IPlpTiSlbCWLKVz/8tUoRNL+L6QSWwMOCToKY8vvm6Yxt6saOtdjG6n9mC6/yIYEr+/bPf7FkP/Bte+nzroyuesVEk1DymOUZW6wSOzjtT4fV0C2UNKH3zVNEpuiao6zFOjdNRLzu3ukscTdNTHzFlIm9eMPXUm3zPHxJI1Ybpmp+0kmcyepZWHHhnnfBrXw+43SuyV9+/H8/O+3H/8e+1t/vNN78/s1iJcpC8erN3//3/idLbk3arGXRmCw+Wt6PSy4HddCvJNz7woNa7e+SFP9z36j+rm1U/ytZfdwcp/i94/KsbZZHrU2yTS8Ra3/ecfls0pyy2t845LjtlWLtRN8r3zWRwzoHsfZKxhhO9DVntb61b8XWRivd8yAxMPrj3/7jhz/bb9jFt0XZFHCnXXqvTVIH4nYtNNjdJIZb3zGlBSvB7rv0CABhD3Jz3cXiC9x6xhdSFWDzLnmuvd3inqzZL7IavBw3bNPuu8h546JCsffsnJdc875lqLseaJ1j7VeIeb7j8k7JF+FMjE0bWckm1FuSwe0jSfqHhCkO7T3qEIc2YYrD7ab9uEM8dkmj7byodf9zwIP3JI+5Qap1Sg2+K0O95oBom2BSsY9nkK3cJ4w6dKcsQR5u0pjLnL2g3mxf+qgfZ2qxOt2eSakKUTHNa0AFDqukeJsp2N3PcztMAYlM189Cr04Fq/uDI0iCoRyApvvzieLMjPe1YqLKrAcZutN8l1LNm+WS163QcNYklcanEvOud3loX9GrAlAv/QrRPqzvo3zK9GIV+EZF+x+JalN93USZ3UXkNS1crwqCnOqq5AMmdV3S4HoRDE6vgQIY1Ww4h7+K5+GYrT4NCU2nBIKxeyoE5eORm8I6lU1ViGp5Kr8lOlsppsStL2WiuJViStxMUQwmAKLS+98nCOe8Makvx76PnTquOyRIld51wTL1d6mmTK6ZFjp9MqL/+aRsG0Zo5lwqERfeJ5iWhr5dgBfpWlbLrPLpfz8l/PEis+QPCRKkM6mtFFPi88+Z3IcECdKZ3FaKSfFxpzLVZJwyzczXZ8wz9SokNBu+hYFwczFaC7CnjDa7KZD6D2W/eaLuPkt/8H6sxjMtwcnwvfRjL/24k36MSr/a7DwYCDah3/ZX3T7hmVyvWVXcNjp5qocQegpoNPhImvX0qGbMlb1u9vxzb9BsjS+g/PVy1rMgMnel+fpXfFJ7e0QW7hp9RK9WiIYmg7/ioxpS0GRodxvsRZU8ZfmK+bJhqLL3a7YWHhCabM2bxYLXiVNdr5irHQcsU91VaP/2PHS2MOQ+33mT/ITwQwBYNvr4oaecqdT1OsJMuPawLPTvU6/1b8/EEICiD3AmE0Zlr9YFMO7kC9/joUpwQw04YxkDGbMNx90g1VYXthgMVr3DF/unZPuhHNH0jVFXQOyDw3cDic7uxx/+9uOf/vijvY+lMpeamW7vYG3cUz89VoPk06P6qgD57BOmOAw7qOkW3s7kzsOuViX/9v3LDzlPpuTfHl9+eJVxt88HNpy+8te7UJubZuyIxhbf7N8FqyWSJWyRSuapwnRMoWoepOnCjbRLdK/BY8mnErVxiF4RydZPZRrhTLUISSR+iFGL5K9zZ6ws3cNiJExjgxy88XiKBCowOoqiQNrx5Fcs1sxn7TVMs8fvOgR/pXdMr/+Z3hm96nfa8kh7gv7PWWBC32cV/nTZR3wKvlF8Ye5IfzPuJbzN/nq/TfpWB6tElst3Y5lQT9FTKfKsbIGYybBa5LvsFUI2+C7W21+ri+Uznuhi/Uz3SryNvhKDwddG8UIkDWKsX75KF9nWhz23tigqe9c9wKgXcR1/DH8E/CztEeOLtdB6cpEwg+e7gazz7iR+p0hLaXiqMruczptNOTlCz2L5bi+ZWjq/H9CMFs7JoA7K+Wwzzgrz/pNiWaJwotcor7F2Pt/wnDwB1l4yn6Y/Mk7KY4nmE92xur5fKdksrQCK3snBZChLcjTtlxfCj4poLwjjuRObhCFyevmIDXDhY5+P5E3W+UUU2n2dVb/p+QbKOXjO7HjBNpqrT1x1h5HdLbS8atZZgD45Fy2thp1orcRTY8f/y2fpNUAAzdKEjODFDavEM6913UeRMOrDsEb5bAnyMGwtHzYFwxXcXgSCcFrKxRejhCDYa/zqAMO+XCKCLLbmtCqGYCcBsT/jJX8yN0+YCZxl1Z7mmUulT7cIoLAoCLG7p6g9ki6ehT0eyCcbah0dEKwW7WRuZMFVu4Z4slwqvmSa4x5kRJYEE1/V/IoguKbWci1+aWUuOXMDr+WTeeQgWOdMs5pr8z/ob8lICwGE7gA4OkcDAnv/HIndoom7FwJHZUki8JBfOkvlKCCAj4prvtDX7ImX9e61/MjWKCS/IghOqO7OpUEE6XwmRwiGUm9Ktr1m1bIhqM1jNRDUrut7+F7StIsRWSJMyiFBijwN9g3yqXsFMWhmXutkcK0ZGOsghkXavfatPhGYLYnFI3qMvRQGB9v8WzIQjIu1NNLIFt9SAUFUxUaKCt9zcYVgKEtRoYqiFYBZ68MQ8ReiljwsCkdEVtmDyBEgwPpMl2zB93NkmArrCkFRumOP6LHjUAqEc2ilMSQHFRBEuf1q4jJf6X4QjG1YAooYODImBIppCJAd670GBOBde5UAwr0TgFsj6+lBBILQboxBt/CWCgTiH/IJXRP3Gr86AKw5p0V4C0H4UMmvFUmdHChBYNqhezeKJ5s6DWriAdEfPp8cDKsq1kxhV1BsGSAGxRQFdm7iFTBgr/e1eOEVr+t5HzYa+ap79SBgN7wQ7KRi5bYW9T/k0yUTZaOwBRZRpYBEF59fEIQmC4J+lKUChkC+8XsNCMCtErzSba/0/6/u7HvjxrF8/VUGM//ewU6nc/vuLhYLOI7T8bQdu11O+i52B4Es0WWOVVI1xUpcDdzvfkGpVKUXklKd8zt28sdgpntcz3lEHVIUxZfT0pjhIfdHy3h5JLF6Si67g9PFUDSuk2W9mXbmWZF5tMwYxlL6LTFFfZIWRqqDo2mZJM9VDhl5GMO4SuyaPoYRlezVfXMU+22yZFZ9D40kpUxVFvXxu7pYsntEPhxJS+t6rEWrat+/ukyqR+YAbAwL0xRQZOpxh716HJKIKd1pW5CpUiMWQ4jfMnQ5DBHUZEAfjqhV594Xdfb7Rq8BHxwCRIrc7izfdzq3rEGgHocicqOSitVlagC00Hnd06oe9Jp5Z4Yois5CLQE50qHQJPLdmzi3Gg1INJnCakiZdDgkkbqLcMkfXuiDaCq55nQN69+TAtfLJa5N6fYoKo3rz62UVea2bLZx4zhNoAG6/HT28Uhi28ImT6ABmjGMonSbmKWyKtvXE0iPJ0KlSVaP7Lt4gJAUVPpQ6DTJTzfcr2xDFE3HrHRR5uVyC3lr9PJoYk/cJrtFvHB42qBn+2tWprYMkkD5pNPddGRuSQxQFJ2PRXM0hMrcZ252j8+HI2o1O+7db/J6MkBVlamu+3EIxzgbIVw/HSVs+2CIqq4SweL14UnaleJ3FQ4QisInnbkDAvLS3CTFklN1BySyDOLDQx9EUnEbEXXPLDjeoSGQFqgte2c5E5ax1gTaulVQ8OGzbHb4ekPAk/PTsviijL0+RJq5HeGE2yR+pO2RO89cL/N+K2UX4c/Scytg10aJlV4sQEzwNNfc5GoQtNxym+EY9aCKDCEygNGUhrtYEEQaBC28f7MRgkQX9A2pUFuh99audztas1w6HI7IcOM2solvq7a5KudFWq50sRztt0ewGbCoQvan10wN+9Nr4vYOZZ5vAc1Ih0MUOeDnHH89Nebfh8Ua8/G2MoSALYR27TfqsV1lDbgVIxpNalGmj4pn0iCI4Qd711DC1wjiNizqybodxAD3o49i7AqTJ1YhfPosmtB4Mx+CSQuhKYz38SIo7HdZefUtSPxIfNn4bXFqVN3ZTnL2xjN92mizmW7cu9LY90mR5XO28J+I2mHR9t+pCQu97N0NhkyD+pZcht3Ans1hg88/zROrO5iXyRoo2CKphVaV+caqdht9vlifR7RqtjliyzQYlsPVF3ewgPoKcmlxLKfdjI/dqv7hmZ4sPx8a4Xr2Jck3dUZcKmt0itUd0hHG4Bs/oLIMK+gtr3h3OasbIHf+pyqUAW3EFsASHZdqMEJNlNpxyBbF+HhMskkRODDzhW2ij8uYj5vq/4fa733QnOE28zyFCb0wGuk69/Q7iiznLLsBcTQ0BfH0DlSRDece3nakIucoth3s7GmtikoJpKeHDDSFJqcPjXDFpmYfivGDJuaAyjI8fyuQkn0oxg+aiAMq03A/A5//QBwjmW7YqrHnsa2gFeIAJHqt17lWWWd2GFtsRCSaGZNs32zu75X5hHil6OMYThf6kX/3WhDRo6oUP7EdhBy/no6j3PScCtqMBslAU1CDGkYjXFHNlw+K8QM1ZF4q07CePAgzq2lEo02my/knr04IdWF0H3u+mnWe3LRMQ6KaDLcbdwMX7ohVvlmITDT9Wh0+NDRzhSz/MemD0vzqs2mbbtNb95k/Kexh0QCuaZ4ZRuoaMI323Djwq3Dpd6OqTS55CYcgcH/Q42g6goA55kE1IwTbvV3ZLFRvfXi0M7yeevkwa5F6OYbDfPH1cEAGmsLr3RDNdv1Fba8fTFKJ1Th/ALw3vNYFIgDNRWqeDw90xte+ERtqC6+BYzjbd7+EVKgKevlwa3gF9AfAeYtUPw8dZ4yvfEM00hVe9UZsvm29wFyq2o3gWF98hRvTQcYyVW2ABrkKVLIuF2aJr149MNtztEGCUDWLxhG7CnjliwfCX4dIlYxEwV8BvqKGQki4w6tvMAbD3t2+ejtKiOeeRjRSicnYIg5CjJ8n6eM70zvPhCixJ1FNyrtrU66Vsds3CXtK5wBHdkofASbp40vHp85GrH+8R0JU9v+WaFRm2wtVLO3DaZKnmzyxgJrsYVLtNkWmi+Wb8okvtUfFlsHIRCTni4zNq2/K5keiTT1PhS1SU9hLcd5sdJ6BVk91WdSiORBOzLKepsqefOaF8v1Ac8U9SIAbpgc/IjLMLnWW5eprYvhPjz6O6LS1qlqUGwN4mh1QsQZ6f5w1N94eRLvy/c/fKpto9srAAY7p1DnqGybWYVLtjNX3Ou3t3EyV2qOILg8qfaw27Gk0LYdncVoWlTWbFND38iCpbjrPID3mA4lokrfnlQ6X47GfGhE01xU1n21MZJltJVZCxdhQW8wDOQrH+IIGngJYlCNmgCnEpVr2N8WgOmnPhm/HObxV98km53ec+7Rvz+hbLCXqK6qoE/FFVdTpNcepbqDbY4v3m46DFAPw782XVztexJhVd17EmFWzXsSYXO/KStU7EPD1WhLX5LzQQBtHIxqVeT1UDBoRGuCoTnXXkO9SY8gO68Tgl5GFuDBLUG89BOZ7XrpPjki/Gsj3Qr09jJEIN9Bbg4fJsoMsZ+uyeDbNSGa99gspNsDSHbv7BGO2/fFTMYY3qirzLyqTMe3TqcZFoVKrsvflSi2UtbpYAp5hHijQ711phkfpAUX3dJax29wK1SMYAMleNtFF1TlkEftYjuLRzqiHdJwPs4Y9GkNkoCnqQRlE010RLyANJvqtrvkTd/KoqcfW9/uWgIJ7yKwyue0dFcRSux0dFTTfZb3tH8GJbV5idLAxqnGJ4lHOsKYlAMZ5ohqWEJlq+kWZyk3+csdK8+26NKKRUYlVu+0ooZUoBMZ5gqpOkAwwRVUYDxNiB6omPijAT6Jtn+DDrQWSFNjCe7ASKQtp5b1AgQTGtPQ10Q2wNn0ufA772VBbZO4G4BhfaM6OsChHZK6OuRzL/Z7j6CT1gL8XT/JXTQ8QWZF85O/HFFKq0OreZ37bdqDSQzZEA+i37scswXY63H7GoUBTFI0hYg+t9PEgWH9sVQvh0c7Q9A7yOdbtbA58dvvIQFNkJnvRCFdo1g6gGD9khg6pPEN7WGbxh0TrG4sgYI7N10gIpDs4f71wrC82n/10jrGbp3Chv6hCVdVCVTKDXhNBZPyRCT4VBXwF0DQP82WsYdMrZsaBXwWyykYCsLzz7dcHpXKBquohA02hldKHRrhiq18fivGDpuiAyjF0c7DzXOXu1RefmyE62BiZo0E8yhmaqx4wzhOZsz4yy7T50i6QsmMwzhOaqB4ywBSbnj0mxA6alH0owE/sKzR8jlGYKpCk6K/QMjONwmikq0ACA79CL6xRyeralKmqqlJg0CQSAO+NTOVYBKA5NJn9bKgtMp0DcI7vx0pi5G9IBRki03WE5TpCE7MD5HshU7BLJJptKluuLpI7xd/F6IDiuOg/6jnd71RiN0aB1vwEyVDT/qx0UXVfKNq1uHechUo3bpsnjPKYSDerlJU7B20yAMv79MGd684ep+zTWEZvVZUavUaswRgTeWajj731k6oZ1kDl5Jw4rKsYfkA5KYrSJpDla9MRoOZtOUl57/lQ6+afXeUV0j4EgHrL5PpEFNYVvNO55W922oOxfGRKEFlidb8I3wAPsXzHhU1g1f4AZHmhttMb4FhOuw3RNewBfwCyvDD7sfZgPB9gOnEySaWut8wWaTBUh1yJrEgLgnGemJf9MBlgCnrl9zEhdpgXfy8U4CfwLWCKD7cWSFLctwAfViJlEd8C/ECBBIZ8C2iIMivSYmyoLTJ3oSvShkhozoJWpI1hyFxFrUhraAIrvYJgnCcyPXHrvHo8aGIi1k4NSMiUhKxN2qFEV/7MiSFiD01YiZU/ITQ2jbErf8JQaHKDV/40VImVP2Ey0BSZycCVP30gNGshK3+GKGSGYlb+tCy5lT/TEQTMsfkKX/njB4PzF7jyJ4TE5jNy5U/DhG9ZHMCiHJFpi9qvuEODJih/V+AeB5mKgD2BdyCBNSxhMtAUmoi4NSx9IDYdEWtYhihoUkLWsDSsC/WkU4lBKg8Y54lMSh8ZYIovSlQZChQev9Sk1lLF6WBjZMmC11KNodA2E7aWyodDtp24tVQ7Hn4tVRCM84QmKmwtVY93XeY63YqV6xiPdhYoYw8fZo1tDjxkoCm0QfChAa4S5YkrSZEyBJae2Pd/9FrACFWgAUB//xdZCxhBI10FEhj4/d+d4+Jmq0k9xsJ8uDUyjyMBcN7QPPaika7IPPazObaCa1onA+C9kamMX9Pq5UKTGbmmNUBEpjN0TWuDvFVmpYsyL5cCjXIAjvVF5nCIDjKG5u6Yy7FEr232U0GGyFsOWtt8gEFvMnttcxeDbIr4a5ubZTF3YjNDY3SwMSofo3iUMyw/A2CcJypfQ2SeqchM0SD6e3Kl7nXuR2IrF3J268vYgkoX3AxgZuQ+nyGsFLGNFGjm8HM6sktyMJ80rRfM/728E2mt5gSTvR5wCzErmtAVoWvoRByxqwDXj6lA2OtAv7fNiSJ0BbJVA/SeF4ILVwb2e2AYK5v+qPfEt+VKF0lhL5JiuUmWan+ssNijYl488atC14qZAeWuC15TJkNJXgu69kzH4l2NzEqbMBtqi60L0PU2fSQ4x0FrboYwbO6i1t20NKvdfivS7fxUHLGrQOfyRCD8dcBzPBhCwh2d++EYAHuxFWjTMUTsBXIfvQ7Nj5bIedxatBBUINeB69F21C9ux0Hx1j4aRegKwNkeD4O+BnTGhwLgvcFZH4zAM5dZCRdmQ22xmQ1dD9dHntv9ZsxyxewNIuMvU/D+KOArADcoIT7cGtucBANgvIUKGVq2UkWKKclf1Pb6wSSV/BvodCTBK8E2JDNCSVwLONujQWT8sTUhHoV3BddaP9fQzIxQkteCrRpzYolcDbhyxKMIXQG2ekyEYV5Db+0MeI+VyRAS7uB6EIkBtUfnvZcONgbnuR8PcZZMbHxGi6ayQA4LJS80a6XSFZSnkisOpyIImGMzV2DdoQ8MzmLo2kM/EpvR2PWHDXOhCqvdBBvp3vdkILnrwCb7dCSBKwGnfiyGiD22IkSDMP0lV+ROhpBwB2e/wLpcLxmd8dC1uQEmOMux63Mb6G1ilsqq7Nna/dkB5a8LWxPmRxS8MnAtmRNL9GqwNWhWMOb1qCd7a5KiyiUXmsSjCF0BuLrEw6CvAV0xQgHw3uAqEIzANC/XOhUfso9HEboCcN7Hw6CvAZ33oQB4b3DeByPwzD+VGr7VeYgMNMXmtAeNcBUoTlg5ShQgs+SU0Umu/1DvkyLLEcddDokosxOzBB0wHUajXK/qk3UFTHdgmCcqH71ctuWlzrJcfU0MokEfQ6l+7mlwuqlsuapPKwa34zE62Bh1+6N4lDOsTxIA4zxRfZAQmWParoR1PXp83oboYGNk3gbxKGdo3nrAOE9k3vrIPNP+GlSJ3A1HEDDH5nAkBNIdnMteONYXm9N+Ose4nfOFz2cfGWiKzF8vGuEKzdcBFOOHzM8hlWMocBabF4tyRKYj7iy2PQ2aiIiz2DocZApCzmJzoMNscXwS+tlQW2Q6BuAYX2hijrAoR2SKjrkcS6kRAOy7v9hbP/h9v8Gdr5KlepOkj0tTbooMaTpAg1zflUYJuR7QINdrU66Vcd0EuOsBDXddKGt1sZR0bkOA3H/dJLm2W7jwjsu3hLb8sJE0iTE03OhZQ5JIRkT2XZbZbt2u1FMpFkHAHPmkioZAukPrVQCO9UXWtRCdY+zOg1yBalvDGtmMYx6W4+GrUQDOKqMREll5QnSQMbTKjLkwS2RF8YBZnqasJ6l8UWe/b/S63uwUn7fxIDL+0DyeiAK+AmxeB/lwa2iehwNwvPeTcfFZ7kUjXZEZ7WdDbKHZO6SCDJGZOsKyHLeFTZ4EknPEhVlC03IM5ntiE7KLRLhBU7HH5NiNFi/gUzIaQsIdmajxGFB7aPqG6GBjZFIH8SxnkXlMyPlLQvOWoPOVHOydzq0yoNfsDpDrha02mHlT+PlSqHlSt+WTTk/Lwso09QE62BhaT0J4lDM2P8dgnCc0Xz1kjqnKFnpZJHaDmOs9AHK8dFk07RjGao8jOukqqaoy1YlV+Bk6MTjWF1TBo3SQMap6B7gwS1DlDoH5npnjIf1qINnLGn23se3BgQCvPhDkdVZYg/4EMSOGiD2s0k8HwfrjmoAYHu0MaxCifKL1bnUA227H+TYsyKeOdk+nQ8nUMIDP/rDI07K410uo3oCNtP17eQfqt8XxYGfg7KzpEBh3Zdp/A3fuoFGuMknRclGW9UPYNbgylW4UAOXdPH0lxYcRUOZyFa/LRtkuNqtVYviTC0NgnufPptysUW41jOdTz0RC+dQwpk/ZNMYwpR2PZ3WpbJIlNkFZtbxv04rbV7tRSeYOdUO2cl0mz86BL3Rlz61aoey6TKpds37ytMxLwCO4A+P5tOs5UUotD2O1HzgEdmmnIuDNkc/XOVGIV7BZ5+oJtXtLF0bzOVuViAfFDkN0KFI3p5ft0GDIDmZbF+Qvit3r6cGoPs2pwnyVhhOxyNTaqNQNd/5phhCmgejTeEVUv2lgnpMeJM+tngyuEF+9x8Rv14za9XkWt1ffsNuP37Dba6Yb7PE8JvLMPr1CGX0i59b4WCZUOxsi40yRdzZGZxgDnuiWvCSy+e3JUt0kBf8VoE+LLTNq/hIyNNFBccrgIimyVWIeUToNbboMUK/4fdp03N1h4bhvGwEs554cDjQ/KYrSJpAXkwga4wr7IBAEYzx3mar533bDZJDplyTf1LfoUlmjU3jJjgJgvIHPyREVYwj+1DKBxzhjW8wxF2vZ/Ps6JGpM8ohQmGtBf9ia4mOswX0/LxljCvqgFcByHGuyUPPrZ7NtsbUMUZvalZ/7Vwe22ohINDOmKM+eUrWGWPVoZKPS4G5hj0Y0GiQo22nA41rdqGqT83twAx7VCjCfrIYw4p8XGuPgQAwPl3aqAHT/ujCAz9WdO9IVatUgEW6Yb08+JsOuWboHkWpQDBeJcbgAF2UJ7IdF2ETbp7UqKnW6MS4QvwfWx7GccL2FAY9nBZo1PMCxnN5plbP3HuyyWDb1lK1dXqISqsdk2TkuSMr9E9XFmsQtUjt9SOr/AezyhdEsV0g9bElEk616qw2oTeiwyDZXa4UQcRiyw9L9FeDJsifRTBCru+gLutwvT+xupQq7LPo0z/fyQeS3yiaa/RnnQKKXAeyR2YPRfS4Tmz4gXGoQ3eMqTfNNptjPyC6LbuMGqAzEpSHRTRYqMekDakPTMZFopmz68N7aNfY4tQCW6Khzfnunc2p7p/N26+Ltm4Q9HD3A0Z0W5cYAngN7UrTl1QXy5MIBjloGhciZhSEuxBKzMNcL5fntVsaCW4EYHOKLO7YwCCZ65tuvD0rlmFGTPo1ndG53uwZj1QZYkCNuOCeC5rm6bZhz+FerOJ1njC9UVFmCvk0OcDSnn1UBmIvfUKjzgH92Y8pJjt0L3wul+pUrZfk3rOV8Gxb0uwX2IM6i/VnZkyxZW7fADbeZiZ8KMsT0iwJYriNoU5IRkO+F2XhkTOSafVKmqidlSqSfB471RSejjw4yhqdmnwuzRCfqAEz2PFW5ujPabs+L+xKcrkE21BaWrGE4xheXqj4syhGWqF4u37I35V0mXQMhJNzxyRuKAbUXSOUxHWyMT2wPnu7cbG96ONIIndwxPtwal9bRADhvYEIH0HBX1MT8GSGQ7rhqGGKTbdvpMSdFkm8rDd0JcwKPdoZVwCgfZo2rfgEy0BSWwCE029Xt777/ni6UxMEYIvbwdA4HwfrjE9uHRzvDU9zLJ1vvZsQJNdMROtgYltUxPMoZl8l+MM4Tlr0BMtm0N88JnLVBNtQWlrFhOMYXl60+LMoRlqleLsvyQn9Rhaqqhaqq/ToldFM7L5DcdUDTeUYkgSvBJno0hog9tArEg7D8m6mGAvk/BuM8ofntIQNMsfnbY0LsoPnZh5L96okLUh2JMBzrC8vNCB1kjMtRLxdrCRwWjPJh1rAa5gfTPVWR6WIp9JYZoYONcRUtgkc5A6uaF4zzxKWtn4wy3U0BlE1fTxAZf6lk9kUBX4FYavf5cGupRB8EYHg/6RTfDRpTQYbAFB5juY7g4oOUG7rAmCV1qTKdtEn89/IOnHgxPNoZVrJRPswa14IGyEBTWKsZQpNd3UbOea7yZgM4aO6G0EhXWM4G2RBbXK56qCBDWI76sHRHZaqyuDVJ+qiLJTpDg3CsLy5Lw3SQMTBTfVyYJS5bvWCy50Ite5sDgjM2hkc7w7I2yodZ4zI3QAaawrI3hKa7rpVKHxbbwj6oSle3SfWITuF4BAFzXCJPhEC6CxY3vJwlC5hZsrfKrHRR5uUSPegVIANNYcUaQiNccc3uGIrxgzW2HirDUG5WJn42pugsTIHZl0KzLqGzLaVmWSJnV5pyU2S3ZmMfLpNC3yNKcYykue12Tzl7UummSZyi/n+YfgEsyxG0fQxiv5j3ScXeFM0xItHnHRvoIKdlUVmzSS3/TNYBjq9XVvZ9fSgu8BRBL5R4H/eoG1WV+ReVoRX7XKIlfCM11B5qjnOpqgpw9m4HRXcBPaM6KOquHQ0C8zTqssg+m1VSXJTl+iS1+ku9tAvT8wiCvxdPdomCmow+7lt0YpeUG8rGbfIawH4PjtSSPM9UYfX9tl0tDdhsy4OM7dnY/nl7liQqfMubHZu9H1KfNifuO1OuTss8x2zQ66dOe6CunLoLe/tr1Db6Qx7GCrKhvhfK87s25RcN2AFuyCNarQA9txoSzVtYFHK76X786ybJEbWnw6LarEtTr7HPkUNWASzKEdMNC3HZlqCu/5gIMMO8BniQHDehIf0oHOuLzEjs2P6ICc1O1Ai/h4bMVNg4/3mRlitdLOtRi3pUhd/tHCOpbpl6csuQoGsZ/FSQIaja+LFcR1RFGQL5XqCqMSJSzbTVyN3zR0CQF2wH/TAZZAoaWw1xUZag2uvFch1xG+f7mFQ76MHPkPPAZZ3Ib0lFZZOCf/pHy6Fa2J9e8xXsT6/p5WCVWZvmG/BJngNkerzou3L3b+v7epEUyw3iBTpInu1zZR8gfa8RMm7wpXxU7zYFZtStRyPmxzpdlOljvVteoVJ7tQY83TxMop07iuKOf7ZRy+FZNAdj8L9MD3kMK5QN2+JG2Y0BnX7tY/Ls/ssNdmLlOkia29/Lu+aAPXZ9O5BoJr+o7fWDSfgvBHtQrA3ER6M+G/cAgVOcY2ykLe6kmik+2fpTkm8QN7vmRDNLF26KsOs8LqxRCfv02hGQWAYN5pPOVAkV6xBRZgubGLtQ7gse/9EygSc6F+XXAnP0UAdFc6l3FOFa1BBG/JNcJ+zafyAxTE4Tq5Yl/3ifHozhAzuAtk9DGKGOqvJTqYZFtkrMI9+p4ZAtIO+IwTfCeRbNXhS4DBrweFag6QoDHMsJMkmhy2LZYPr6PRjLB3RsX59GNao3ueCr1BiWA25u2gjI8nqrqtToNabeD4lEM13szmPnnxveZcX60+7vzq1a1dWRf4t6NHopOIZbMrJGCdUwqk81OG8L+ul0Ao92xnyOmeLDrEGfV8NkoCnmg2sEzXaVSlxsxoqlKjhHBZITlpUS6QjIw8O8YXgqBtBIV1xChtgQW2BajqkgQ1xyerB0RzcKWCl7VlijsTOk4nSwMS5RI3iUMzBdvWCcJy5p/WS2aXOYuVDajuFYX3jSeuggY3zK9rgwS3jC9sFsT6lUxWapWIKCc1MgLWEZKZGMiDzcjYqeuj/X9zpNdp9E8Zk5K5LglQCzd14oiWtBZvhUEBl/YC2YjIK7AmWa4WiJTvG8UJLXIlc1QrFErkawcoyjCF2BXPXwhEFewzPUC7H68Bz1QC7/ZfNeIt+F8xyS3ytdJMV+xnV3tphAps8MJns9yOyfG03oiqA1YjqO2FUga8mMQPTrOCuydakL/AutF4zzxOW8nwwwBebykAmxw+XoCMrxa3anEW23J4PI+CNzdioK+AqguRzmw62ROR4JwPTe3qi0XBb6D8G31VmB5K4DnPuTkQSuBF0HIjFE7MF1IRYE5y9eD4TyXz7vpfJdMs/x+S2a14h8/uL2TZDtzcRDSLgDs3oiBtQemdlBOtgYmN1hPN0ZviGPF4rxw2UtajeePQuYmfy9eDoUXPYBduKpMfn264NSebPQWZfFe13ZEntA8Nw4YlcBTNQ5gfDXgUzneAgJd2DST8Tg2+PbXh8Y54lPbVg73PIEkhfQHh9I+PQEtMv+9fnw7JwRRuoacJk7Jw78KoBZHY8gYI7L+IkQdPf28ww8471gnCcuq/1kgCkwc4dMiB0uO0dQhl+zshOfjh4uzBKYjD4w3xNejKDywxcct8SG577DEzEaAO+NK+F4BKA5sN0MsaG2uHY0CKf7ds+IR6dyiA21xSVwEI7xBaatB4tyxCWrj8uw1PpZplDMiSN2FcBcnhMIfx3IHI+HkHAH5v5EDIa9Kf+pUntd5joVmE0RwaOdgcke4cOskantJQNNgYnsR9NdF+7QKTc7WrQVn44idAW4pJ4RBn0NwBSPBsB74xI+HoFhvlYqfVhsC/vgNue8TapHfNZPxBCxB2b8VBCsv2ixC5S3bEGzS7jeaPbalKmqqhI/vS3Gh1sDizoWAOeNbLn9aKQrsLUOsOm2t8myelfWh65vTKrQaRzBf4/O1D3gX9j61Xdp/SPaGtfMxfjfpzU+s5/JG57bz+SNy27gw9BP/n5MgVks74rLXHlXZLbiukMB9PfkCs1YeVtkzsrbsrLWLJVV2fOM382PJnxFyIff7HBS1wRtFmcEkrsOZFWZE4lxJfsjrAW+1gThWF9gJQjSQcbIFPdwYZbABPaBOZ5P9tYkRZWLbbw3EULCHZnB8RhQe2g2h+hgY2RmB/EM53KtU9kpJBMhJNyB+T0RA2qPzO8gHWwMzO8wnu78sRLYW2AExfjhsnZMZRoCM7PLY1vhsq8HpHp9UYWqdt8OMQfR+5hEu3K55B9W2VCoBuXjZn1VqKv6CCr+WU4DHssKqsTxuUxs+qAyl49cmw6K6NKdYN20zJdltlvj2u5ej0jz2YEA1wF5DIyJALP6CG3YoW8RNMb1XaLzjVGg88PjdIDxZVLoe1VZ0CmIMTbCtsxU3p6vhXXtkgGmV+tdPZVoC4ZwhC/w8RwEAzybAz+x937HZNgt6iF0iFSDYrvU+91cJuyTGD1Iqlth62OQd0OofLE+j2plkyyxyRuVGEDXokcjGuksy9XXxKiFTVL2gc8DHNGp3+tgO/VxVKeNfbhaK36PoAURPTaVTdIHfuXfcWgWH8pMvdnc3/Nz+ECKmGRqbVSaWJX9aULqvbXr90mR5cqA3ib8VGqxmVWS6z9U9inJN+x7OMBRnez+WJDTh6Qo+BXOg/yW3aif96/u3DIUrlBDIRoAe1H8jpOUDfn+1Ixm5SzO6cD7Nq2opXWdLFX/kCCu2ZhINeuugUaU2ZjIN3P/uShRJefn8i2vTblWxq0BRToeqGRDQBe9oZAN7NV9swjlNkEkWBdHdFLKnLpirasPu7cwwFGdTFUWzXgQX+jAYto0X6tgQg2O41SP+mJ8ahTRxb/k+53OLb/nHoVDfYGN1lQAnjd7PHMPInuguxceJNEt3yyXyV3Ob8daENHDHZ7CdnCQUXyRKOT+HM6AOKEYaECcJHxd5vn2NNfu4DNMbRgC2V5uPnT+RWVwvz6Y6sn/ru8YxOh7Ltth//9STeodJ4DfBcdEllm9Fwb/6dOFsXx2X7bwBTYGkz3rx/8Xdfb7Rq/diP6bMtu6fjvANISGuTY9QwHTBgzz3B1W80f99npirdF3Gwvoxs2OBL4SRBULkMmmX3QG6MzvOESLTbuXJXKWn58KMsTM8wtguY7g4oOUG7rAmCXVe1aBsy7IhtrCCjQMx/iC5p0GsChHzCzUEJds2a53FEnUMBzrC0vVCB1kjEtWLxdmCUtXP5jm+etGNYc7It5FezC6D7vLVUNo8W9UkrmRJtBUggGO59RsM4RSamhUo90ZfqcqV3emHl1FNnRTfLg1prmbDIDzBjV6ETTSFdP0xdhU2yypw2HavwGO6rTUuw48ymoA5Hhd3Z87CUjq9XlUq0eXE3WhA0d9A1iQI3YEeAJPdW6Wu1YPmj3Dt8vi21Ru2di5VYAHoQfK8fuiULNBhjyqVd2Q76Yx8p26NIRRO5kZa9ZSWYYLvSxgRdbA2D66WJ6Y5cYNIAL6pV4s1bF5BuPuZ59HtbJme2ZMac6L+5Lv1KUxjKAP9j6PYbWwJrFqyX7z6sEAPp9eQY0+Eb9r15Db8pG/FuBAYpi417dbk2hAH6xLIxpt6vUxZ09WFRXi2TfgfZtW1Dka4l7UDJf2Is7nEPd6jfECjaAFsN+DI6pGCFuC6oewJai2CFsS687ix7eqsrqAvCr1YFQfzLqelhObJYiORa11cA9ivVpkj81A9KV+0vxk6NGIRiox6cM7F/rN9nzlVrQAR7bjdLAxZlR7Ao9yBo1oB8E4T8xodpjMNhVKWGimSqUoNjfxSYnKRoE0RORfvZ+XWLsZooONkUkZxKOcoSnqAeM8kQnrI7NNhRIWmqlSKYrNTXxSorJRIA0R+acy1wRjpBoW3wa0w5gHyXND7NHXZVFt0o1Rp2VR/zNbpwMD+ICmL/mYVLtlb1t7vlmfx7JyTMRHogGO6uQ5AgCzfjeCBrri1u5O4JnOi7Q0gBa3S6MaGV1v6gP6Uj/kYaxg356DYIwnrOnzYkGOoN6bj8o0PGznBtM7IIluD6XdNa1spwOK6KKXRWI39QapoCfZiMg0+/T61GzXtjwv+B+IvVC2H9iM54ScVoOZT7NYaf6eCTWEHN8+bJtvPBuD+UozRnLczp5SBVljPMBFnOZtSLgo00flpuNU1mxSW7rHBj+rfFBi8dULRzD7OHZZfBvUdrI+JtFunWv7tkw3kAdPF0b0sYmx7dT37W4yfDPbHDhsNSeIjD+oUzQrCvgKUMNdE3y4NWgobCoAx9uNPRSdUwnwyR6LIGCOTPNoCKQ7NMEDcKwvMrVDdIZx+yhod4iHp3UsAN4bmNTRCEBzZEoH2FBbYEKH4ADf/u6vfy/vxBI7GknwSgRSPR5K4lokkj8URMZfoDoEowCuwJ0iuR/gEasTwShCVyBQF8Jh0NcgUQd8AfDeArnvjcAyX+kiKexFUiw3yVJ1v+AIpP+8YLLXA60MM6MJXRG2akzGEbsKaEWZDsS4Dt8exfB6MhVExh9YLyajgK8AWQ8ifLg1MO9jATjebmhWONujISTckZkejwG1h2Z5iA42RmZ4EM9xflqrolJiwzsRPtwamdaRADhvaEJ70UhXZCr72Qzb3aRNoffWIB1sDMzgMB7ljMxeHxjnCcxcL5lp2szxFUnaMRrpCk5XDxtii07UHhVkCE7RPpbjmG+/PiiVn1up75rRCALmyKSNhkC6Q1M4AMf6IhM6RGcY/6K21w8mqYRHMqbDSF0DMM1nxIFfBTLhoxEEzIGpHw/BcK/Pm5brMIfxaGdgnkf4MGtkXnvJQFNgHvvRHFdVZG4Gs9S4RYQPt0amcCQAzhuaxF400hWZxn42w/ZSZTppeRI9kFgAvDcwlaMRgObIZA6wobbAdA7BGb7NKV23JkkfdbGEZ3MYj3YGZnKED7NGZrGXDDQFZrAfzXH1H8OLT+TpOGJXgUztGYHw1wFN9mgICXdk+sdjcOx7h1ri0z+IRzsjkz3Mh1lDU9tHBpoiE9mLZrgO992AZ3AsAN4bmMXRCEDzZr8O/qLSCBtoi6x3ATbUFlj3QnCWr2dDFIEqOBFF6AqglXEqDPoasIkeDoD3hqZ8JALH/KEcNlIY3zGXY7lWKn1YbAv7oCpd3SbVI75uxmOI2CPr5UQQrL9osQuUt2xB80u43lr72pSpqqrS4HM7zIdbI4s6EgDnDX2+eNFIV+Qzxc9m2N4mZqmsyp6nNzU7mvAVATN+fjipa0LWhjmB5K4DWFNmReJciUofCp0m+elGSfTGInyWteTKW4kVt8IrbUVW2PagyCEKHxjlCW1FsCt/5Vb8olf6Ot6tSYoqF9vyIR5Cwh1c3SIxoPbohPbSwcbg1PbjOc7lWqeyHy3jISTckfkdjwG1h+Z3iA42RuZ3EE91LtfPt1HD/FiiV4NK/SOCyVwPrDLMCiN1DajqMS8O/SrkZ69MxxCxx9UHsRkrfjQw/wVmqoSguHyXmKFSrqU3ZpiKIGAOzHCZXRl8YGR2o/dk8COBmQ3fkaFcP8fCtDlRhK4Al+OCq9JCcGCui6xJC2NxOS+zIq1cP8vE21lhpK4Bl/qSs26DdGDyy8y5jXBx6S8047ZcS064jdHBxsAkx8+2HUKRKY2cazvGARMYOtO2XD/Dx+kZQWT8ccks9wU6wAamtsT35iAVl+giX5fLtejkoige7QzMboGZRSMqMqOh84o8PGAWY2cVletnnFR0RDDZ68FluvyMookYwFogOZ9oko6rIaKzicq19LSBqQgC5sDqIDNnwAdGJj56xoAfCUxx+HyBcn1rEu3OgBweKqHgXZp5kQSvBJjv80JJXAsy/6eCyPgD68NkFP4V1KM87SFxf8jVilgcsavA14hoIPx1CNSGQAgJd3xNCMUg25tkqZojSgGaB9jIpxfVveqclnmu3OGx/Lg9HLUkOq9fuljuVg8iDQNwlK8bCJHSPbABtmBBkNPbxCaLh8ToYnlt2oBgUW8MiD3oaTVmQuw+lHZ/itnpQ1IUKge7eiJAzFHPTw8U4rdQ1upiCVjZ4MVCHd+V5uM6Syy6Vo34ZGtdLH8zyXqNWD7UgRF9NqtVYrZskwZDdSiW7q8UP8H2JKLJtrDJ0235qAq2ygFFd9kvYkbY7GE8nz9Us8ga+gYTYUNtQS1tDI7xFSlWYHnKFCSnBG+Tu5zd6NeQ2FtF/QenKmd3LfageLQlP86SWp6I2H/9gRz9RlX1Sx6yoQlgvwfH76Mk//rqu7D8EWWJaQdD3O/DEpeZwp6w3BT25GcnaEBzTPx2zQBZKOfGzzw5N0S2YYagPchv2Q2ScXJ2iJyTsyNnXWR6BmZTlhkhBNyvTblWxk0EF/U/hAFdQ/OpCO7cYEGOl+5/lOwhnRCXauk2ASzuNeA1qyURTdL1okwflT0ti0Kl9mpt+UnoYRLtOtsj7faWZcuNkVQ3s+LLmBU9ui7KvFxu3TcfhEgHB3G6KJuvJWC3Fst2BLa6PijVr3KfGjD3dI9iu9yoapMD6t4ASPXqbOfEd+rAAD6okhoh6W7tKjOEVMuKjlyqJwtrrfco+vXvn9kYmx1ssgTqj0CQkDVpKl5/VieoOxzg0u9Fn4ZsgsNsuq1JUnuaazcvENNb8zARdu4NK/+iMgnLPptoq1fqJimWgPu8JxFNRvtJgWpKgIuyBNaUCJtq+6TT07KwiCa2w2LY1IeEAopqjyK6tLOLEd25DotvA+qmjIhks6JKjb5ToJLq0KLPzd0TQ0EbeR+UUS4HFLiZj8GZvvvp9MjveTE41hf0jSdKBxmjvg0EuDBL0GhyCMz0dF0ekVwdgnGe4BwdkQGm6NzsMCF24JzsQpl+WZvfMLk9kWemywI1I9iDpLl9vLnguny8uSDGLrK6J62yhV4Wid0Ydj55kFQ3XWTqSWXvEv5Cgx6M6lOpxKQPKKEujWy0Sd0c7/tN7ignVVWmGjJqHUFjXN+qXEmItlyQpa4SuULt06nGVmb+WRD8vXhS5zi8gClxvsMLmBLnPviAmB5gmPz9mCIzVdwVmKvirohsBb0F+Jjfth0kKyX9EJko6YfJPsxbnhf6rfuBMlDSEJODkobULKxXip5kydpit/wIgnGeoOdKkAwwRbU7HibEDpSRPijHr94gQKUbo+0W8xkhxOVaVspNNjFaVfjKE+bDrZFVKRIA5w2tWF400hVZzfxsju1Zka1Ljf0MFiYDTZFZ60UjXKGZOoBi/JDZOaRyDN/l268PSuX4vPSRgabIvPSiEa7QvBxAMX7IvBxSOYbXiUnyXOWuJcbnZogONkbmaBCPcobmqgeM80TmrI/MMRXcyX0yAN4bmcD4/dy9XGgaI/d0DxCRyQzd1/2jya8TU/EnxO5BRA+EAiv6yVIVtq5hoPdkD5Nph50PGMDSHS8Tmz4grGoQzeNTkuus/jqMmFnapxGNdKZKtoiDMOJfKptkiALpwog+peZPBqkhxPjrFFN/9iCax2+JcVOpuRY7DMuhutCVPbeKvb51yCNaqbtmPTFbpwUxPerDOi+TNcynBRK9SpOxVUqTxWbK/2a0dbuWNZ0NdrQejXbVJ+u1KrLLMus0HtbhjxE5QAYSf/u3//PD/341T8SYZPtmc3+vzIV+ZNn0SQylr9WpUZlbqpjk5/V/W7c0+YvOut2q4wVjXLruG10kZvteJZkyn5J8wynDEYur5bhsH/cPDJG8vLtauwhJztUZoHhS14mxTBmHYEiUZa6SApQ6IxhDzJRfK2VuNvVq4aad08WyueJtXia7d+A6NMf5mDgilyN4BVzpuiUdHj1wvGAHw5DZWgVK0z6JrnT6oNLHarNqeq0bU7/YXKhlkm4ZehHqhGqm1kalbq3Cn2LWvdVq7VcRN6K3UlYZTipOoRlF/XLSozlA34n2cGLQd6I9nC30nWi/ZmiXq7VRD6rIugtemf2UMBQn2h/nAguP4Rzx4osy1jX8rCToYLwynZBvE6sG3y+Ojrdn0K/8rbpPNrmtmK95XQxd5qzIru6bDsqZMSXnRWqIYknpgpu8BwhLpG5Uru7coeC7PSU4HQk/kC8IaVA9Tej/Zqi58R83SKYKZa5M/x/ry+eoTsIZ4k9pvmFVzR2BrvA+KbKcNaqxIzAU6t74m+6m+cdLtAyuBvf1AvJq8d7a9a5Y3Qcc7pPEh+PJ7T7qNkMhnIZgDOOKNZ9vUWY9Gl2tGey733L7ID3OVCek/WP2K3wfNBm2sGqpDKY6jWGMm2CVSWz9ib+3ec/xUj0QXegXtb1+MEnFSokDZOrGXJTFEnNXBiR6CVyU5eNm/W5TpP31zQSjLogudKmqKlmChprGMIaYzrJcfU2MYnZW+yC60IcyU3+vxEdojwkjcTFy/kzlq5XmtGHu5/Tg7rODTnJG/B2BoaDTR058nQ5PczsmeJnnW+B4jZcH0YOO0kS5LN3tktX87whTT8Bro0ujWa/VLYJxtbtX8V8Uz2NPoav8ulFmu38H572BjVh0rRuVZIf5DaBPt2EoT3S7sL0jU0liDYQjkvZmsRAk0vEUlqMEHt2B5w4PbBYjVKAqtImcQeeo5wmzo9wiuBJf1KEjyX/ZDjI5mvWowm7cYzgpn2A4xvHktFG8GtsgOBLWbOvxc3bOd0F0oUX2yP0y0CIg38oX2eNwwh5FyDtN75hiUeaLTptvQdzXkRHrG9XifHaXFWN8WJcVY3w6lxVjfBzfwTBDCWPYNysGSH8xNX4FEFPjVwExNU4leCiNxYxIDlEMqfCxZ8dbTRx3dpSW+0TRX6xE8GkhDBGr1hwFq4bLGY4KLjUcKzYCCx10RY6zLqzRqO8mIxZdy3cWDrMbH0KiJKHv2VNohrReqcomqzXmnvtwDDnf6RjcogwxYZrYOz/Fpmt/LJIvic7dMCFDsENhqLTLiTkiLQOgcZ1oznt5j8PQ2egMUy0HJMZisbvS2Hqr+c7nsC+J0e7+H7c87EAadrJ/PGbJBlOjgQzfQGYanOZlpeo5ckyLA4hogpBgx2/OPUZYNCSiyzvdbdBIEg5BjH6pMp0MJyGRJDokostwOihJo4EQDRp9SE3toog2vqMFSS4HENGkdwwJSeHjzQUxtmeJPMlgzznK4x+eOXvtQbGETZC8iNji9OEPKBsY+RlzojYHBDKuswOYH49zjV3CnIjuVYVxffufz43FubbD76PRHHFtlKVe2uj3s6ORLm4MiMVbrJVKH25L4sWNfj43FuXSxr+PRauP+S2b3xCubPTzubEoVzb+fTRa9xQxyqWNfj87GunixoBYvOvDT496QnV+N3we9Z46681dtbk7oFdlthmD6z8aaP6vP6cPOs+MKv787/+956X1m7lz9f2/urTzQu0wn3U5LB0/+Hpzt5h7GUP2X/Y/bkK8/uHfXv/4t9fdm1D/wWiuAyHIgdGP1b0lq9/tkaXkfjGrmP5j32/5U91v+U9CnHHfZ05kN8uoHuQfvJypYrMiBe0D+w7/2ntJr+rRwmGG1H0y2vX2kf3QP7z61947cQ36daO6IxaM0F1gNHBTNu6EQDe97LIstO3OruAoeNExmau7Spkv/aE1hsABNwo6e8ZcewnIgvFwY6Wy2Nw1Zy1joh9wtFLZ/X7dn2TGF1qPp5zNVbrQxWM9utvNtzmnZ87y89Njz+Im8WZtr3lEIlO32rxaN0uRYDY7XsRm3typFjRe24MRDCz1mVls18lD2bSiKK8DMd6RK1e6Uv2NzpiBD0hiWdQPsDfJrA115yntidGy8PenEKH9k0eH0XNdzX4Lmht8z4y+9O1a6f7DkBe7y6Tlwf7ZAS2TPnVGqdS3DllBhlxa6bjxTVgrW8NoHh/dfnjoRrUHpXpVAlndp9LMvI/4+JdDetdhcg1u/aP3KsntA1akw5xcBjVn9d7Mpx53FV/z9Doti8qaTWrLGZuAHvNYHIAZovWD5bQs7OQ3+SMeVDve5A3r/vG4A4qRCHRERzJz1hrNflXirDm6VYnJyq/FRbnUKcCnxztW6x+j20V4f5oeSwB0mia6SP/oXUp9av288aH6T2cNA51efbi9ubr4fLn4ec4YUAPu/Cg8zhNs5SfpsWZ8fAPm3dsGLXVTu/QZHd7Tqw8fzk5vz68+fF7cntyefT59f/Lh57Pp8eTBTfBBRoPL/XHM23Kt08FxBve73kYsWv+3/SA/vR5katKc8vjXQj3Zf06Nz+7++HPzx7OSNlnr46DJWosMx3rC0EZjT8tM/ayKQ+r3J+Z5qsys0F5suEK9Obu4+vDz4vPtFeq6/9JD7ipctyq8P1l8vjz58F+wgB1gINzVhzNotIbnCfazSdYPv14M1tF5W6lZEbs84gBemSYzxhNn2bQsmsnsIehZLtwR6OGMKLqJb1+mI0d8pweg55k83/jzMT6M4efb8lFBVGoQzeHk+nxXDecetTLLaIiN9R5Ors9vVDX7LKe58Q/MaHCz3KxUYT/0tjHlxe4gacMKJ1VVprpujdxIZ//ZyXMbk6Ols7EP+8MkyjLH3iMvfErHzfZ2f31SZKJm0ThzJcWspjV2RybUM9CByT3E0hL8zcbNZDwv7mcctzVPaw+Mvqckeb7QFlUWLY5WBqf1Xh6lWBIH+dESan4kkr9edlym3hUbLNFhxoOXj+4o93p4o957aMbr80yFETkqsqlsuWq+Tc4al58n0aceIdA+3mREWvq00PjQJIBH4MSkXvi32riXzy/qrbrXzXY8wAY2QKe1MXuYhCBDq0zRna4ukiZ1VmxWDiZyV/1wnujZk1VFJePZY9M1626CWIF66ExVCUGGlpt42CzBgT4DR9xYa/dOq3zGGYazAtesyWAi+eIh025KDUKLMXTyMrHo3O1DiWImWboGWeZueuE80cXaqAR6Z0dgmmB3mHTfLqM6o344S3TflwOOW/jQsYZk//f1d6BPP6E1dtgZCm2PEtqCe9kzZIbb0yMkvDvVj4P/nncHTHfblyNNvAHmrGuD3pk+9Jilke1JSGCRIX7uSj8hnS56WsXuFkSKyAzh8XWCJ+t1k1O6WIrU6ViIuFquC9U+bIDPrzGY9lioZ2c269rF3q+iMSDaEm9bsRAMabm3rhCeKgvvuXaRZCnl1l65B/yFevr0A7iSe+mTS5Q7P3klKvRqppCLJ1ibgxEYN7UFytTkUACGsFtWjr/ZB+rshfHox6+PHZP5RReq0tU7bdRDWSmRx280xgw5San5MnWb8qbEpk0fOhX+lUT4V/PC66p+kAIrdhdJXSNQwR9zPSZRazR1ime0w412Fz5SZ7e9LTaBfOxYHrnDaPMTa42+28C+Fvehk+HrcUHgCEofOhn+vLCmrNa7ecvpg1olSBEPPqb0IVkhq0+Lo6Wq+3UGbmZ6TKKWWxQukDgjbvRGlcWHTZ6jS6dPJZbPJs/R7XCPSVxl7ab1QJu7DjG+2Ny9d6I/ZwyoxDKRHSzAjhPIDhFARwcaGLoSDKhUtblbHxwxgZq384EuC5n089OZqnK1JRxBel+JI/xeZFuJo/y4u0osVea6/SCrPS+6kYEylTvJTv8h884d5EeldLEudWFljLzw+LYb+33QJOYrhvAzlUS+cQX5c6VEBrfCAWZqySRUiB+X0qvEuPM3gVOk+9D4/iXVw4fS6nvdvDfLFEw0SEzv5mxxK6I0Bkc11O8Ck4MH1LhAVS/OqrCF0KdGd1X5UeQ2DLFRhTTJEyPW9wnhac/wA03iTSFAp6q6IRmhMh2jOZJuoiVUzQHjOVf/lcgtHJE5JVMP20DVauJ02bRDRtDYLTQaXuW7IUWFnAkxxBJvSt2ugsfd+1CiWL0R8s+qaF5UwF/7AvTobazPskKPUwyoxLI6aieqoxY2s7dXO2J7s6NXODN2N3P7UbcYcG552bHM6m2OLSEzZMdkjtxvbZYEZLs1yeGkAJ2pKvE09sOposdtYTdTkL+D3afdzjwi99oP54kK6DEW6l+fD199PFuEzd2xwPu6M9oj7WRx2y8DcsQG5I037+qLJN9anY5eQMlGfeBkSXQ2M1B5WSyr2xIg4aEeYfI+qS6TYgv12DGPs7gqEDkyRB7hcDt1FuOxBp6Pz+P49kIllcVc/J41GdXzDZccNfT11ht1YZMiS0y2n1jyi0LkXoA8x+iTMvq+blfxTn72lFUzoHZY3bRY3OzW4POtwmx6u+ph3qjfN6qKbw5K9d2xGb7Nxg6hwUCyqg87ea/7m0xM7BLDVDtmj5gp0+ZHl/eJ2yRyg8jMKH/Srt4OoTnFFCHTxTEyrcZcbmwy2M+S57UHcs1G21jAFMfkeXdw/zu8yUyDXzfKYJraLo57pxZpieiddGBTpRF6w6KGjr5UHVEe7c4ZmO5alzZVIu1mE4Dc2KPo5XD2pNKNjb0Lk+UCZI5rfT5UPR5+qWyCcOwT6W6e+adUqdCU01Em1X8ISKOGMx3tSWWuHdoO11PT4/aJUwa70XSVtU8uvsIIOduh9gYK1LzZ0f3berIlwrt7+lxKVMdyj5qM2Sy+dy9Fl5BGagCcGf9S2YcyvmH/MdEb3FGxF4sbcPjF4mamASrzO7SZkW9UtS6LSnV3tmCGPyBnOoBr3hg606Mdxq2AhdFhzrLobz6BeiwE0VNO3VW9qKZpzJyyuEy2d4CWqcbQ+yN1lwbUzTyw6D4f1BdlzlZrC2g5Dqype7FbQtP/+kQOe4AxyqEz+Q+WpB7oVMnUy2XGm0lSDXq4WbFBr6IH1mTU7ox+zCvOCEnPi/6MZ0hWjJBTJUQ4OmqmCPbkqMOENUDj1oFNlU9nNhgscEObF7mdCwYLvgdOxm+ngmHqTQ/HyANbmmQ5WjVNturiJkvEGp3aerIEIvIedkTc9ypfI9ruEXLKYf4xYfNmEHFOCetYueMgftFF1p8aS7bq4hhWkRlFZLWpeURH+gWmEXH0YpOHjrTDSfFdFtvKqpXE/fSREa4C99YDppvWzc4vagt4pu1RU+3Xx+KxKL8WgxEAhICPO2Xz6afm6zTy+/yYeYQF7Kv7mDlpMZ78TA4emPF8RG7+pu2DWyxa1QPVfKU+b/Ip2z6ADoEDBwoe9zzrx/1xXlF8/rxqv5F8/owR6iGPkOoeUdjk18dKF0t69fFC5s2uaX90o37nRb1Rv09FXO4G6Rf1Ev/Oz0eXHTgJ0iMxxew7/fR6js6N+v0GbNMgRzLHHqs6CDn/eFXmgZJNoHENmBP6f/5clJn698oalaz+JS2LarNSpvqfP2MUPjv654b+eU8fqL0O18bAyZ7GJNtmq/1j8+BY0U6oYX7Matju8vJO2tHFoMk9SxHe0Uvvn1X39VdGz8UgydX/JSznYhwh122x+jV73YyRyVTsFs6t1+7lpHrodoWApXqQbMOQ7vpar5XbwVnYsQ1DvPn1YSRnK21tt35zbniXyLzNJ3elsf1vJlCzv3QD7Bx/+LfXP/5t3h1+hrL7yyAGT/Kk2hZpu8PAwXjOyaezjIOx+nkw93DUIG72eerQiwidxH70tbTxdbEM3BGp6wlFPuaa+p3dff0FZH9LY7YabzfrnNYFn1D6y558fDVsfjpKXLTbIcDxijcqyXCNbd+uw6aLCZbeOMTxmov60SxhtydTpQRLbhjgeMXfjAY+5Pt2HTZdTLD0xiGO1xx3hiF+/s7v0a3x511f1Sl8RvWFx5K9MMS+8LjHDilIfw/9GyvIvSSiIK+Tqrp9MOVm+YDpZe41O2Ran7LeJeK+NCuw2J5L03q3y2N0z3bvNwhA68Rea8K21tP3VHs2tZ7t45JWrNQGARg7sLjUENMcRuCVpjtX/S5JH4/5kDC7JFs4Y4LajvRWVVYXRy+/mG3a4UNlz9083rtcjXeekZEfxoNezG5G3XNdyyAc/1J2QBHvHZsvuRiMDgAdF77Xf7KiaBr0Q/CVPT0BoG2gP8ASFcyDQQzGhJ8WJPIUGdHpovtvJ8dOIpiU3JNJExzakX24VgsmWSVZVo+VL/SyN9wHevvo40mfW9CfhEavmMOjlWZ6LVW7Gd17vXz4LbHKXCbmEa4ZiENy1lV9ILVAYe7JRK/xGCVMrEV/Ex/7Ru/lxOyrnin7AnGI4wcC36kAn6Pe9GZocGTejOZhzHUYftvgWDQs/qc5/IfEYbLPtTr/4V8/jJeScay6RKJTkZYrXSxHR66ztPpQmtkH9WRHU2w5Vh0gx2g4C5qv5Jv/fIzTx5sLnM7HmwuaydXGLkt0Jg2gNLPxU5mj5H8QH+vyJkHlUJdIdaorxWh+LM+qy6R6NTUDLNaD0syambfYtqDPJHqV6aMCNZcNi+gx+NbM8qhZNI/xt1uOSUvjueBqfpdIcxpPkEF8baL2jzzz6ZifIPZE2ieHkywzqqpIxywFlQ5MolQT72pj1xvC7vRBrx52pBYU2O/KfG3KtTK211BDnTyRjtBs9l0QNuwFmS/3NrGJuFw/yHy5n1Up7taLMV+tt5+HuGQg2nzd3cL5Nxv3YBXXDUQ7Wve5RGcqHtaxfNLqK06pzyU2zQ5COmIlqkU/XaX+Ofq7fhdK1HKjXfszf3BiPSxCjXz8yjxF3kksNav9fI41bKkAsfq/4Xd5SOeKygjyxKSWE+BWDbiBYrRdh0mUGiwG5Pp4Vv0dp9LZzwls1SHTBE/LolCpvVoDXyQ6TLKU+1+LtUqRUi0z1rvY/Vm9BwA6dg2NB3cjUm7jg3Orjj+0Mhy+i6XeEsdYKKPr47jRdd6Pp6m+1enxp6AHv0HpdHwE+kyNal1W0CfzAUlUKleJLtxhkEipDpSo5V96xPXqUolr4owpyrOnVK2hXcA+lqwGfJjUNP66QZH1gX99xReTXI/JyjD3+ZZ4OHbsi3DgYOyjvge/t3Y9Ot+F6zZmEyXXafN1QqL/4oMTNdHvZrzXMrE3MszLmIwWW+dG2Y0Z7dkNUuvCeZr/5c6mELLssGmSF2qZpFtwS9eFxrrVTd+k/nhQuWl00CLywYllVJaPm/Xu6xDQr0PliKGfoT0qTexSZ1muviZGtR/NzwuNu7V+PFG1zPS9VtloPhPXsc+lyblZP++UTR/2czag9dSPp6le3f1TAV/vGhxRpXATb6A9jwOSqASuo6za2c7ckuhIetjENYWJqVT20eSDs1qYfn0sUa1ZDwH9mtRh0qR+3aiN24jRuu0Hl7gCG3Ahcgv9B67kPGyapKvhbt6OGk6RYgoOuHS5ekLRtuW4sUtT5jnw7T4WBK89XuclqB9Y9nXkZaCb8QGXJyeQtgfsN6w2nNNGk3vzX1dvbuoHlpDmIQBCd7dmRrARCMQByrt/+bYsFPjFb0Ys8EXUG3U/11V0goEvQzqJcNlfD4uLPT88MRDS9dwSnYqWdC8GQvpZ6ii+cj5PrYRWx3bK+HWi8dnRhVM16yEC6DhOh0mVEhhd4o8pLR4So7IT3xbiTLcRGSQoMREmFoSo3X78aTHQMR4vnSjqTmJOux8j2wF79BvEZCTUBciLM4W9u1WyJTtUjpjbLUVGrkMmbjKWruW+2PrgNM2PRaZMvtXFsn69x2577INzNRe6wHVN+1iEWr3+Ct6FjsRASJ/mZeXZZQ4q3YuBkF7YRLykezEQ0vWApbB0LwZbWqpFALUGNeU0KVKVSxarJwxG/XqTy4t3g2C0xSvfOApNPLhlNFN1wOXJgcdx+9hvWI06xNynyI3ZTsQBytdttrB4E4O4PKfY3hx58mNwMU6DGngcsVHgiVkedZJfeFXf0n+Y3/yFhs0L+LFnoc9Ykck7Bj24ZBTi5pCjmnuE3RtdJGaLKrQDjWFUZtv+WBfDZ8di2NSlfFakZaaLo04vj6+daolcM9yup10e3eq0XK3LSr0rrhOTQDaP7RPpZruGtx6NuUzWCLUBku6GlALYPKX55rjDfYMyDYrusptfhWoQOji6k1vk0Cw8gjz6OjiG035Kd/9bEEOrR6Sb/aK2CJ1f1HBe1nEOr0ASwwVBR1i4RZDu2yXCpGUxbHpzx0evZAw1H5jj6aZqIzdP7xPpZm5qcWgKJ91uTOUZ1gh3fHeW2AQl2IPS/a5WmGbdcRgWo/m8EKcRlW54nRiru/uk0bV2KIaLxmxb7zgMi2a7ni3o6dLB0Z36Eyd8QyB0wRAbZduZvoTrQkyEQLlLSqNsyyKHJGrL4tuEtl3lu8U2Xz3ONC1NhjFzJI7JvTJGmesy1ynoPnaJHLOmrJP0AfLC1uXxreoMQGrVQL6XUZkq3GMQlPdDKtsQfHzXmMo27O9KylbzbEh6vNNliRm16ODYTjcq06a3apDt1SI5bt1dqDFqXSLfzGGRXu4f6VaRyUN0talJQ0f7uefv1s05g5TckEm3c8BmjiTC60CjG/2m7cO5C5tqe1oqk4LaWR+Xbvl/Ly/cy+Ou1iO/i/jJ3G8RBzPeoVwNbfhVa+ZZXIO9iXgmNYwoMlwszjNpaESVeQsreYKxGEzt4bQHjOhu1sMrgJpvXR1S8sCHlGRkjgbSehQGKS9Z3L0QROnI8gie6ghMFAzNKeLZDaYU0SrX7BlFSFdUts6aUSQg3oQ4Srp7qJwb1G+OgDlYrspsM8/x8Ot+eHek3YPOM6OKP//7fx8mCRiVWLU7cWZTFMqcF+sNdXVTJ3gAHNufafyTZl94CZmGHLP5We1+vdBZvSV9tdu+la8TRMd8OoeWnRRZ97wwmNdkiPl+wm5HeN1sCvcusPtLUHZ7oDGH5lf19JlCFRZWKH5utI4NQ899c+nWJm+Y5h0lWp15UUe4KYGbTXG1djMndNm9WyyLAHNKpfn1Sf2VG6Hh4fkVug+WNHJDjjledczpx/7pdS/sxuru4O6cR1n9k8EF+Z9fjcuuOu5OE2lrxaCY511iE3oS67ni7jW7b/GVLY36a9WcafLXXZiJctj/7vPud63erMI4e1qXi18vtFUnza/+ZfRvyPFHpM+jfzPL8T/2fag/1X2o/xQ1GvfY5jh+OLk8W1yfnJ4tDnKq2KyE1Q5h+5b/2tvZrT8c+wxaTciwUj0B5ap4Xqk2aFhrURr7th6c740oPoNbL3JY8PzD4uzm9gXS/y/7yI3UD90Owsfrtye3Zy9htY/ssTotV6uyCLRk9VuVtKLHoH9rf3jVvbkjyVAXD+3pb4vHJ2c1vZhyzl6McMVe/KhpVZWpTqzK3HP4BUx78eOm2yI9daMVM4+Jwqv2BCZd529JLmKKOldq1g4iclfAOG/n0Jy48xjvemfBPteF+CximbMb4LpWpqonPdff5XM3+fRtb0brc/nHfWJXclZsVu/cbub97tRziffCRz1/3yS5ti/ZXI8UYr7n7g1x9qJitGo3etyyqZGL9EGtXiBv+/GjpqTDB+C+L3tKgdTlsI8z+EVtX6b92AWOZc5lUr+33ZZ1vS2yF6iOI4Wor2u6T6w1+m5jX6BI+/EnTevW+4Us69jzDF8mPfvxJ03Pi8q6PUTGS2OeVXioMent/vCFXF3o6NeYsnjpJBgpxHyvk+VuOuzMLzRo24FA1LXf3TxqM0O4dtDliCt4uQ48oed+bVTmzl5XP5tys36Bp9pAYJbr3ONKxFwDB5z4XKv6ul7QtRGIux5xJAbek3l2xo3K64bmZZrlbvToN+v63cS9qD6/4yH2tGHdcLyUYh182rF9FL6UZhs/arqtrFrt5xK8gGpfIOZ6m5ilsh+SlWpHaF9kzNWrEfP+WCnzUmMOh9gxwzdlmauk8Aw3eWYpoBWHwSdnmNT70WirzuvVXvd6YoqJwPDpMP6k8qay5eqlfAfBp2TfKrVuZzg+q2g38JTknC1y4EOi3L10zp6sSSZWouGl65iMjW1eJmvn5+vhL9+44aYXsqxjz1etX4+ft50dBj9W9l1pJpc/STvvHCbV3RcBVU2uYRT5EtHEnVScv1+U3Lg+e2Op6up+sVkr8+wlPYg9VdrNn7+Q5RzBy6RIlip7ocZ2FH1SdzdYemV2H2OfV3cYfa5ufb5qkW9foPX1K0yK158nfG87z6E8CD5Ptv2W8szF2489S/UlsuAQd5bisz9w91Fn673pzWF5TsU343krIc3+J556lfjzdhQjHrMuwT1Jnl/YRZ2ltx/FfX7HfehJ0U39ZjkYknsOzU7gKUk3rFStk9Sd9lbmX565HzCKPqlbFh82ef7sQwWduIzNGTerO3ci1EsMeg1iT5Xz5D6N8On/vA0dV9o2E7KSvPny8OWZ+wNeg8lSHv7g6v55pcfx5yrn25d9g4h4TF1Cva24ssroP1RW73Sz6n2JeAZ7v8IM8clNQQVMmbuH9r+9P698P/Zk+U5tdAr34+2IqtPHl230vAaTpdz2n86e1kZV1XO/ZXriTy7xnbOfJ/4LOn/jz8ntNPHS3H03m2kD1YNeP/vo2TD4dFr8vtFGPXcJN0EZe8elSZ6Yl+yMeg0mF7fvZ2s8t+w+7jzF+lnzEo5N4HmS+zevF/Dcxz5S9SXK9BB8puxuDsyLuLaxp/eJsPUIgWfa7nPIDqNP6pbGvsyATy/yUZov1LkJOEyqW6OL5Qs9DPqxp1Tdr1ylfFbHNuiU3OfPq3aC8efPk7t/oS170YfbgvU3Dhl+RBMxzHwfywYmvV/8S++fyLsD9L36TnM25uCXTsxgTqnUO+CQr7/ZP2fOlWLK+xDvL0Pgble4H/7t9Y9/a3av+cf/+8f/ByEoIgZRvAoA" \ No newline at end of file +window.navigationData = "data:application/octet-stream;base64,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" \ No newline at end of file diff --git a/docs/api/assets/search.js b/docs/api/assets/search.js index e7380ba25ab..64d3774df34 100644 --- a/docs/api/assets/search.js +++ b/docs/api/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file +window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file diff --git a/docs/api/interfaces/_aws_amplify_adapter_nextjs.api._Reference_Types_.CustomOperationArgument.html b/docs/api/interfaces/_aws_amplify_adapter_nextjs.api._Reference_Types_.CustomOperationArgument.html index 6cbe35e3722..d8d06354057 100644 --- a/docs/api/interfaces/_aws_amplify_adapter_nextjs.api._Reference_Types_.CustomOperationArgument.html +++ b/docs/api/interfaces/_aws_amplify_adapter_nextjs.api._Reference_Types_.CustomOperationArgument.html @@ -1,7 +1,7 @@ CustomOperationArgument | Amplify JS API Documentation -
interface CustomOperationArgument {
    isArray: boolean;
    isArrayNullable?: boolean;
    isRequired: boolean;
    name: string;
    type: FieldType;
}

Properties

isArray +
interface CustomOperationArgument {
    isArray: boolean;
    isArrayNullable?: boolean;
    isRequired: boolean;
    name: string;
    type: InputFieldType;
}

Properties

isArray: boolean
isArrayNullable?: boolean
isRequired: boolean
name: string
type: FieldType
\ No newline at end of file +

Properties

isArray: boolean
isArrayNullable?: boolean
isRequired: boolean
name: string
\ No newline at end of file diff --git a/docs/api/interfaces/_aws_amplify_adapter_nextjs.api._Reference_Types_.EnumType.html b/docs/api/interfaces/_aws_amplify_adapter_nextjs.api._Reference_Types_.EnumType.html new file mode 100644 index 00000000000..a5ebf6562e1 --- /dev/null +++ b/docs/api/interfaces/_aws_amplify_adapter_nextjs.api._Reference_Types_.EnumType.html @@ -0,0 +1,3 @@ +EnumType | Amplify JS API Documentation +
interface EnumType {
    enum: string;
}

Properties

Properties

enum: string
\ No newline at end of file diff --git a/docs/api/interfaces/_aws_amplify_adapter_nextjs.api._Reference_Types_.InputType.html b/docs/api/interfaces/_aws_amplify_adapter_nextjs.api._Reference_Types_.InputType.html new file mode 100644 index 00000000000..99f56ed01c5 --- /dev/null +++ b/docs/api/interfaces/_aws_amplify_adapter_nextjs.api._Reference_Types_.InputType.html @@ -0,0 +1,3 @@ +InputType | Amplify JS API Documentation +
interface InputType {
    input: string;
}

Properties

Properties

input: string
\ No newline at end of file diff --git a/docs/api/interfaces/_aws_amplify_adapter_nextjs.api._Reference_Types_.ModelIntrospectionSchema.html b/docs/api/interfaces/_aws_amplify_adapter_nextjs.api._Reference_Types_.ModelIntrospectionSchema.html index 75983470829..bd71784e221 100644 --- a/docs/api/interfaces/_aws_amplify_adapter_nextjs.api._Reference_Types_.ModelIntrospectionSchema.html +++ b/docs/api/interfaces/_aws_amplify_adapter_nextjs.api._Reference_Types_.ModelIntrospectionSchema.html @@ -1,11 +1,13 @@ ModelIntrospectionSchema | Amplify JS API Documentation
interface ModelIntrospectionSchema {
    enums: SchemaEnums;
    models: SchemaModels;
    mutations?: CustomOperations;
    nonModels: SchemaNonModels;
    queries?: CustomOperations;
    subscriptions?: CustomOperations;
    version: 1;
}

Properties

interface ModelIntrospectionSchema {
    conversations?: SchemaConversationRoutes;
    enums: SchemaEnums;
    generations?: SchemaGenerationRoutes;
    models: SchemaModels;
    mutations?: CustomOperations;
    nonModels: SchemaNonModels;
    queries?: CustomOperations;
    subscriptions?: CustomOperations;
    version: 1;
}

Properties

models: SchemaModels
mutations?: CustomOperations
nonModels: SchemaNonModels
subscriptions?: CustomOperations
version: 1
\ No newline at end of file +

Properties

conversations?: SchemaConversationRoutes
models: SchemaModels
mutations?: CustomOperations
nonModels: SchemaNonModels
subscriptions?: CustomOperations
version: 1
\ No newline at end of file diff --git a/docs/api/interfaces/_aws_amplify_adapter_nextjs.api._Reference_Types_.SchemaConversation.html b/docs/api/interfaces/_aws_amplify_adapter_nextjs.api._Reference_Types_.SchemaConversation.html new file mode 100644 index 00000000000..d6370f1a59c --- /dev/null +++ b/docs/api/interfaces/_aws_amplify_adapter_nextjs.api._Reference_Types_.SchemaConversation.html @@ -0,0 +1,3 @@ +SchemaConversation | Amplify JS API Documentation +
interface SchemaConversation {
    modelName: string;
}

Properties

Properties

modelName: string
\ No newline at end of file diff --git a/docs/api/interfaces/_aws_amplify_adapter_nextjs.api._Reference_Types_.SchemaConversationMessage.html b/docs/api/interfaces/_aws_amplify_adapter_nextjs.api._Reference_Types_.SchemaConversationMessage.html new file mode 100644 index 00000000000..875e81123cb --- /dev/null +++ b/docs/api/interfaces/_aws_amplify_adapter_nextjs.api._Reference_Types_.SchemaConversationMessage.html @@ -0,0 +1,5 @@ +SchemaConversationMessage | Amplify JS API Documentation +
interface SchemaConversationMessage {
    modelName: string;
    send: CustomOperation;
    subscribe: CustomOperation;
}

Properties

Properties

modelName: string
subscribe: CustomOperation
\ No newline at end of file diff --git a/docs/api/interfaces/_aws_amplify_adapter_nextjs.api._Reference_Types_.SchemaConversationRoute.html b/docs/api/interfaces/_aws_amplify_adapter_nextjs.api._Reference_Types_.SchemaConversationRoute.html new file mode 100644 index 00000000000..0a04c622ced --- /dev/null +++ b/docs/api/interfaces/_aws_amplify_adapter_nextjs.api._Reference_Types_.SchemaConversationRoute.html @@ -0,0 +1,8 @@ +SchemaConversationRoute | Amplify JS API Documentation +
interface SchemaConversationRoute {
    conversation: SchemaConversation;
    enums: SchemaEnums;
    message: SchemaConversationMessage;
    models: SchemaModels;
    name: string;
    nonModels: SchemaNonModels;
}

Properties

conversation: SchemaConversation
models: SchemaModels
name: string
nonModels: SchemaNonModels
\ No newline at end of file diff --git a/docs/api/interfaces/aws_amplify.index._Reference_Types_.CustomOperationArgument.html b/docs/api/interfaces/aws_amplify.index._Reference_Types_.CustomOperationArgument.html index e7dc8ad4f78..957cce39925 100644 --- a/docs/api/interfaces/aws_amplify.index._Reference_Types_.CustomOperationArgument.html +++ b/docs/api/interfaces/aws_amplify.index._Reference_Types_.CustomOperationArgument.html @@ -1,7 +1,7 @@ CustomOperationArgument | Amplify JS API Documentation -
interface CustomOperationArgument {
    isArray: boolean;
    isArrayNullable?: boolean;
    isRequired: boolean;
    name: string;
    type: FieldType;
}

Properties

isArray +
interface CustomOperationArgument {
    isArray: boolean;
    isArrayNullable?: boolean;
    isRequired: boolean;
    name: string;
    type: InputFieldType;
}

Properties

isArray: boolean
isArrayNullable?: boolean
isRequired: boolean
name: string
type: FieldType
\ No newline at end of file +

Properties

isArray: boolean
isArrayNullable?: boolean
isRequired: boolean
name: string
\ No newline at end of file diff --git a/docs/api/interfaces/aws_amplify.index._Reference_Types_.EnumType.html b/docs/api/interfaces/aws_amplify.index._Reference_Types_.EnumType.html new file mode 100644 index 00000000000..bc92c593fff --- /dev/null +++ b/docs/api/interfaces/aws_amplify.index._Reference_Types_.EnumType.html @@ -0,0 +1,3 @@ +EnumType | Amplify JS API Documentation +
interface EnumType {
    enum: string;
}

Properties

Properties

enum: string
\ No newline at end of file diff --git a/docs/api/interfaces/aws_amplify.index._Reference_Types_.InputType.html b/docs/api/interfaces/aws_amplify.index._Reference_Types_.InputType.html new file mode 100644 index 00000000000..89124e2dedf --- /dev/null +++ b/docs/api/interfaces/aws_amplify.index._Reference_Types_.InputType.html @@ -0,0 +1,3 @@ +InputType | Amplify JS API Documentation +
interface InputType {
    input: string;
}

Properties

Properties

input: string
\ No newline at end of file diff --git a/docs/api/interfaces/aws_amplify.index._Reference_Types_.ModelIntrospectionSchema.html b/docs/api/interfaces/aws_amplify.index._Reference_Types_.ModelIntrospectionSchema.html index 30a48c6059c..fd8bfc48f4d 100644 --- a/docs/api/interfaces/aws_amplify.index._Reference_Types_.ModelIntrospectionSchema.html +++ b/docs/api/interfaces/aws_amplify.index._Reference_Types_.ModelIntrospectionSchema.html @@ -1,11 +1,13 @@ ModelIntrospectionSchema | Amplify JS API Documentation
interface ModelIntrospectionSchema {
    enums: SchemaEnums;
    models: SchemaModels;
    mutations?: CustomOperations;
    nonModels: SchemaNonModels;
    queries?: CustomOperations;
    subscriptions?: CustomOperations;
    version: 1;
}

Properties

interface ModelIntrospectionSchema {
    conversations?: SchemaConversationRoutes;
    enums: SchemaEnums;
    generations?: SchemaGenerationRoutes;
    models: SchemaModels;
    mutations?: CustomOperations;
    nonModels: SchemaNonModels;
    queries?: CustomOperations;
    subscriptions?: CustomOperations;
    version: 1;
}

Properties

models: SchemaModels
mutations?: CustomOperations
nonModels: SchemaNonModels
subscriptions?: CustomOperations
version: 1
\ No newline at end of file +

Properties

conversations?: SchemaConversationRoutes
models: SchemaModels
mutations?: CustomOperations
nonModels: SchemaNonModels
subscriptions?: CustomOperations
version: 1
\ No newline at end of file diff --git a/docs/api/interfaces/aws_amplify.index._Reference_Types_.SchemaConversation.html b/docs/api/interfaces/aws_amplify.index._Reference_Types_.SchemaConversation.html new file mode 100644 index 00000000000..ecce961cbce --- /dev/null +++ b/docs/api/interfaces/aws_amplify.index._Reference_Types_.SchemaConversation.html @@ -0,0 +1,3 @@ +SchemaConversation | Amplify JS API Documentation +
interface SchemaConversation {
    modelName: string;
}

Properties

Properties

modelName: string
\ No newline at end of file diff --git a/docs/api/interfaces/aws_amplify.index._Reference_Types_.SchemaConversationMessage.html b/docs/api/interfaces/aws_amplify.index._Reference_Types_.SchemaConversationMessage.html new file mode 100644 index 00000000000..afa62925ee3 --- /dev/null +++ b/docs/api/interfaces/aws_amplify.index._Reference_Types_.SchemaConversationMessage.html @@ -0,0 +1,5 @@ +SchemaConversationMessage | Amplify JS API Documentation +
interface SchemaConversationMessage {
    modelName: string;
    send: CustomOperation;
    subscribe: CustomOperation;
}

Properties

Properties

modelName: string
subscribe: CustomOperation
\ No newline at end of file diff --git a/docs/api/interfaces/aws_amplify.index._Reference_Types_.SchemaConversationRoute.html b/docs/api/interfaces/aws_amplify.index._Reference_Types_.SchemaConversationRoute.html new file mode 100644 index 00000000000..8253f72e272 --- /dev/null +++ b/docs/api/interfaces/aws_amplify.index._Reference_Types_.SchemaConversationRoute.html @@ -0,0 +1,8 @@ +SchemaConversationRoute | Amplify JS API Documentation +
interface SchemaConversationRoute {
    conversation: SchemaConversation;
    enums: SchemaEnums;
    message: SchemaConversationMessage;
    models: SchemaModels;
    name: string;
    nonModels: SchemaNonModels;
}

Properties

conversation: SchemaConversation
models: SchemaModels
name: string
nonModels: SchemaNonModels
\ No newline at end of file diff --git a/docs/api/modules/_aws_amplify_adapter_nextjs.api._Reference_Types_.html b/docs/api/modules/_aws_amplify_adapter_nextjs.api._Reference_Types_.html index 898f549b6fd..32fff701935 100644 --- a/docs/api/modules/_aws_amplify_adapter_nextjs.api._Reference_Types_.html +++ b/docs/api/modules/_aws_amplify_adapter_nextjs.api._Reference_Types_.html @@ -30,6 +30,7 @@ DirectiveDefinitionNode DirectiveNode DocumentNode +EnumType EnumTypeDefinitionNode EnumTypeExtensionNode EnumValueDefinitionNode @@ -55,6 +56,7 @@ InlineFragmentNode InputObjectTypeDefinitionNode InputObjectTypeExtensionNode +InputType InputValueDefinitionNode IntValueNode InteractionsLexV1Config @@ -104,6 +106,9 @@ S3ProviderConfig ScalarTypeDefinitionNode ScalarTypeExtensionNode +SchemaConversation +SchemaConversationMessage +SchemaConversationRoute SchemaDefinitionNode SchemaEnum SchemaExtensionNode @@ -165,6 +170,7 @@ GraphQLSubscription GraphQLVariablesV6 GraphqlSubscriptionResult +InputFieldType InteractionsConfig Maybe ModelTypes @@ -176,7 +182,10 @@ OperationTypeNode PredictionsConfig PromiseConstructorLike +ScalarType +SchemaConversationRoutes SchemaEnums +SchemaGenerationRoutes SchemaModels SchemaNonModels SelectionNode diff --git a/docs/api/modules/_aws_amplify_adapter_nextjs.html b/docs/api/modules/_aws_amplify_adapter_nextjs.html index 1ed6caaeb92..5f547379ee5 100644 --- a/docs/api/modules/_aws_amplify_adapter_nextjs.html +++ b/docs/api/modules/_aws_amplify_adapter_nextjs.html @@ -1,5 +1,5 @@ -@aws-amplify/adapter-nextjs - v1.2.17 | Amplify JS API Documentation -

Module @aws-amplify/adapter-nextjs - v1.2.17

This package contains the AWS Amplify Next.js Adapter. For more information on using Next.js in your application please reference the Amplify Dev Center.

+@aws-amplify/adapter-nextjs - v1.2.19 | Amplify JS API Documentation +

Module @aws-amplify/adapter-nextjs - v1.2.19

This package contains the AWS Amplify Next.js Adapter. For more information on using Next.js in your application please reference the Amplify Dev Center.

Index

Modules

api index utils diff --git a/docs/api/modules/_aws_amplify_datastore_storage_adapter.html b/docs/api/modules/_aws_amplify_datastore_storage_adapter.html index 44d0c2fe117..d5ba4855913 100644 --- a/docs/api/modules/_aws_amplify_datastore_storage_adapter.html +++ b/docs/api/modules/_aws_amplify_datastore_storage_adapter.html @@ -1,5 +1,5 @@ -@aws-amplify/datastore-storage-adapter - v2.1.49 | Amplify JS API Documentation -

Module @aws-amplify/datastore-storage-adapter - v2.1.49

This package contains the AWS Amplify DataStore storage adapter. For more information on using the DataStore storage adapter in your application please reference the Amplify Dev Center.

+@aws-amplify/datastore-storage-adapter - v2.1.51 | Amplify JS API Documentation +

Module @aws-amplify/datastore-storage-adapter - v2.1.51

This package contains the AWS Amplify DataStore storage adapter. For more information on using the DataStore storage adapter in your application please reference the Amplify Dev Center.

Index

Modules

ExpoSQLiteAdapter/ExpoSQLiteAdapter SQLiteAdapter/SQLiteAdapter index diff --git a/docs/api/modules/_aws_amplify_geo.html b/docs/api/modules/_aws_amplify_geo.html index 66383451311..8ce5e20a24d 100644 --- a/docs/api/modules/_aws_amplify_geo.html +++ b/docs/api/modules/_aws_amplify_geo.html @@ -1,5 +1,5 @@ -@aws-amplify/geo - v3.0.47 | Amplify JS API Documentation -

Module @aws-amplify/geo - v3.0.47

This package contains the AWS Amplify Geo category. For more information on using Geo in your application please reference the Amplify Dev Center.

+@aws-amplify/geo - v3.0.49 | Amplify JS API Documentation +

Module @aws-amplify/geo - v3.0.49

This package contains the AWS Amplify Geo category. For more information on using Geo in your application please reference the Amplify Dev Center.

Index

Modules

\ No newline at end of file diff --git a/docs/api/modules/_aws_amplify_interactions.html b/docs/api/modules/_aws_amplify_interactions.html index 85a698f2c4f..7ac801f91b0 100644 --- a/docs/api/modules/_aws_amplify_interactions.html +++ b/docs/api/modules/_aws_amplify_interactions.html @@ -1,5 +1,5 @@ -@aws-amplify/interactions - v6.0.46 | Amplify JS API Documentation -

Module @aws-amplify/interactions - v6.0.46

This package contains the AWS Amplify Interactions category. For more information on using Interactions in your application please reference the Amplify Dev Center.

+@aws-amplify/interactions - v6.0.48 | Amplify JS API Documentation +

Module @aws-amplify/interactions - v6.0.48

This package contains the AWS Amplify Interactions category. For more information on using Interactions in your application please reference the Amplify Dev Center.

Index

Modules

index lex-v1 lex-v2 diff --git a/docs/api/modules/_aws_amplify_predictions.html b/docs/api/modules/_aws_amplify_predictions.html index 66fee9cc27a..784fe1cf826 100644 --- a/docs/api/modules/_aws_amplify_predictions.html +++ b/docs/api/modules/_aws_amplify_predictions.html @@ -1,5 +1,5 @@ -@aws-amplify/predictions - v6.1.22 | Amplify JS API Documentation -

Module @aws-amplify/predictions - v6.1.22

This package contains the AWS Amplify Predictions category. For more information on using Predictions in your application please reference the Amplify Dev Center.

+@aws-amplify/predictions - v6.1.24 | Amplify JS API Documentation +

Module @aws-amplify/predictions - v6.1.24

This package contains the AWS Amplify Predictions category. For more information on using Predictions in your application please reference the Amplify Dev Center.

Index

Modules

Interfaces

IdentifyEntitiesInput IdentifyEntitiesOutput diff --git a/docs/api/modules/_aws_amplify_pubsub.html b/docs/api/modules/_aws_amplify_pubsub.html index 0f49860a3f3..7ea9c8e179d 100644 --- a/docs/api/modules/_aws_amplify_pubsub.html +++ b/docs/api/modules/_aws_amplify_pubsub.html @@ -1,5 +1,5 @@ -@aws-amplify/pubsub - v6.1.22 | Amplify JS API Documentation -

Module @aws-amplify/pubsub - v6.1.22

This package contains the AWS Amplify PubSub category. For more information on using PubSub in your application please reference the Amplify Dev Center.

+@aws-amplify/pubsub - v6.1.24 | Amplify JS API Documentation +

Module @aws-amplify/pubsub - v6.1.24

This package contains the AWS Amplify PubSub category. For more information on using PubSub in your application please reference the Amplify Dev Center.

Index

Modules

clients/iot clients/mqtt index diff --git a/docs/api/modules/aws_amplify.html b/docs/api/modules/aws_amplify.html index 13dc39c24b9..a7615c10fbb 100644 --- a/docs/api/modules/aws_amplify.html +++ b/docs/api/modules/aws_amplify.html @@ -1,5 +1,5 @@ -aws-amplify - v6.6.0 | Amplify JS API Documentation -

Module aws-amplify - v6.6.0

AWS Amplify Package - aws-amplify

AWS Amplify is a JavaScript library for frontend and mobile developers building cloud-enabled applications. The library is a declarative interface across different categories of operations in order to make common tasks easier to add into your application. The default implementation works with Amazon Web Services (AWS) resources but is designed to be open and pluggable for usage with other cloud services that wish to provide an implementation or custom backends.

+aws-amplify - v6.6.2 | Amplify JS API Documentation +

Module aws-amplify - v6.6.2

AWS Amplify Package - aws-amplify

AWS Amplify is a JavaScript library for frontend and mobile developers building cloud-enabled applications. The library is a declarative interface across different categories of operations in order to make common tasks easier to add into your application. The default implementation works with Amazon Web Services (AWS) resources but is designed to be open and pluggable for usage with other cloud services that wish to provide an implementation or custom backends.

Documentation is available here.

Index

Modules

adapter-core analytics diff --git a/docs/api/modules/aws_amplify.index._Reference_Types_.html b/docs/api/modules/aws_amplify.index._Reference_Types_.html index 198e7105463..314878e6a95 100644 --- a/docs/api/modules/aws_amplify.index._Reference_Types_.html +++ b/docs/api/modules/aws_amplify.index._Reference_Types_.html @@ -10,6 +10,7 @@ ConvertConfig CustomOperation CustomOperationArgument +EnumType EventBufferConfig Field GraphQLProviderConfig @@ -18,6 +19,7 @@ IdentifyTextDefaults IdentityLabelsDefaults InAppMessagingProviderConfig +InputType InteractionsLexV1Config InteractionsLexV2Config InterpretConfig @@ -41,6 +43,9 @@ PushNotificationProviderConfig RESTProviderConfig S3ProviderConfig +SchemaConversation +SchemaConversationMessage +SchemaConversationRoute SchemaEnum SchemaModel SchemaNonModel @@ -60,13 +65,17 @@ Fields GeoConfig GraphQLAuthMode +InputFieldType InteractionsConfig NotificationsConfig Partial Pick PredictionsConfig Record +ScalarType +SchemaConversationRoutes SchemaEnums +SchemaGenerationRoutes SchemaModels SchemaNonModels StorageConfig diff --git a/docs/api/types/_aws_amplify_adapter_nextjs.api._Reference_Types_.FieldType.html b/docs/api/types/_aws_amplify_adapter_nextjs.api._Reference_Types_.FieldType.html index 985f5888607..7c97ed889f9 100644 --- a/docs/api/types/_aws_amplify_adapter_nextjs.api._Reference_Types_.FieldType.html +++ b/docs/api/types/_aws_amplify_adapter_nextjs.api._Reference_Types_.FieldType.html @@ -1,2 +1,2 @@ FieldType | Amplify JS API Documentation -
FieldType: "ID" | "String" | "Int" | "Float" | "AWSDate" | "AWSTime" | "AWSDateTime" | "AWSTimestamp" | "AWSEmail" | "AWSURL" | "AWSIPAddress" | "Boolean" | "AWSJSON" | "AWSPhone" | {
    enum: string;
} | ModelFieldType | NonModelFieldType

Type declaration

  • enum: string
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/api/types/_aws_amplify_adapter_nextjs.api._Reference_Types_.InputFieldType.html b/docs/api/types/_aws_amplify_adapter_nextjs.api._Reference_Types_.InputFieldType.html new file mode 100644 index 00000000000..ae8877fd113 --- /dev/null +++ b/docs/api/types/_aws_amplify_adapter_nextjs.api._Reference_Types_.InputFieldType.html @@ -0,0 +1,2 @@ +InputFieldType | Amplify JS API Documentation +
\ No newline at end of file diff --git a/docs/api/types/_aws_amplify_adapter_nextjs.api._Reference_Types_.ScalarType.html b/docs/api/types/_aws_amplify_adapter_nextjs.api._Reference_Types_.ScalarType.html new file mode 100644 index 00000000000..304cc4425a9 --- /dev/null +++ b/docs/api/types/_aws_amplify_adapter_nextjs.api._Reference_Types_.ScalarType.html @@ -0,0 +1,2 @@ +ScalarType | Amplify JS API Documentation +
ScalarType: "ID" | "String" | "Int" | "Float" | "AWSDate" | "AWSTime" | "AWSDateTime" | "AWSTimestamp" | "AWSEmail" | "AWSURL" | "AWSIPAddress" | "Boolean" | "AWSJSON" | "AWSPhone"
\ No newline at end of file diff --git a/docs/api/types/_aws_amplify_adapter_nextjs.api._Reference_Types_.SchemaConversationRoutes.html b/docs/api/types/_aws_amplify_adapter_nextjs.api._Reference_Types_.SchemaConversationRoutes.html new file mode 100644 index 00000000000..f75c9601692 --- /dev/null +++ b/docs/api/types/_aws_amplify_adapter_nextjs.api._Reference_Types_.SchemaConversationRoutes.html @@ -0,0 +1,2 @@ +SchemaConversationRoutes | Amplify JS API Documentation +
\ No newline at end of file diff --git a/docs/api/types/_aws_amplify_adapter_nextjs.api._Reference_Types_.SchemaGenerationRoutes.html b/docs/api/types/_aws_amplify_adapter_nextjs.api._Reference_Types_.SchemaGenerationRoutes.html new file mode 100644 index 00000000000..4d15cc9e08b --- /dev/null +++ b/docs/api/types/_aws_amplify_adapter_nextjs.api._Reference_Types_.SchemaGenerationRoutes.html @@ -0,0 +1,2 @@ +SchemaGenerationRoutes | Amplify JS API Documentation +
\ No newline at end of file diff --git a/docs/api/types/aws_amplify.index._Reference_Types_.FieldType.html b/docs/api/types/aws_amplify.index._Reference_Types_.FieldType.html index 1f490bc0577..4ed26cca63a 100644 --- a/docs/api/types/aws_amplify.index._Reference_Types_.FieldType.html +++ b/docs/api/types/aws_amplify.index._Reference_Types_.FieldType.html @@ -1,2 +1,2 @@ FieldType | Amplify JS API Documentation -
FieldType: "ID" | "String" | "Int" | "Float" | "AWSDate" | "AWSTime" | "AWSDateTime" | "AWSTimestamp" | "AWSEmail" | "AWSURL" | "AWSIPAddress" | "Boolean" | "AWSJSON" | "AWSPhone" | {
    enum: string;
} | ModelFieldType | NonModelFieldType

Type declaration

  • enum: string
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/api/types/aws_amplify.index._Reference_Types_.InputFieldType.html b/docs/api/types/aws_amplify.index._Reference_Types_.InputFieldType.html new file mode 100644 index 00000000000..04549210e36 --- /dev/null +++ b/docs/api/types/aws_amplify.index._Reference_Types_.InputFieldType.html @@ -0,0 +1,2 @@ +InputFieldType | Amplify JS API Documentation +
\ No newline at end of file diff --git a/docs/api/types/aws_amplify.index._Reference_Types_.ScalarType.html b/docs/api/types/aws_amplify.index._Reference_Types_.ScalarType.html new file mode 100644 index 00000000000..feece45fe8a --- /dev/null +++ b/docs/api/types/aws_amplify.index._Reference_Types_.ScalarType.html @@ -0,0 +1,2 @@ +ScalarType | Amplify JS API Documentation +
ScalarType: "ID" | "String" | "Int" | "Float" | "AWSDate" | "AWSTime" | "AWSDateTime" | "AWSTimestamp" | "AWSEmail" | "AWSURL" | "AWSIPAddress" | "Boolean" | "AWSJSON" | "AWSPhone"
\ No newline at end of file diff --git a/docs/api/types/aws_amplify.index._Reference_Types_.SchemaConversationRoutes.html b/docs/api/types/aws_amplify.index._Reference_Types_.SchemaConversationRoutes.html new file mode 100644 index 00000000000..18b0096022d --- /dev/null +++ b/docs/api/types/aws_amplify.index._Reference_Types_.SchemaConversationRoutes.html @@ -0,0 +1,2 @@ +SchemaConversationRoutes | Amplify JS API Documentation +
\ No newline at end of file diff --git a/docs/api/types/aws_amplify.index._Reference_Types_.SchemaGenerationRoutes.html b/docs/api/types/aws_amplify.index._Reference_Types_.SchemaGenerationRoutes.html new file mode 100644 index 00000000000..8170049841b --- /dev/null +++ b/docs/api/types/aws_amplify.index._Reference_Types_.SchemaGenerationRoutes.html @@ -0,0 +1,2 @@ +SchemaGenerationRoutes | Amplify JS API Documentation +
\ No newline at end of file diff --git a/packages/adapter-nextjs/CHANGELOG.md b/packages/adapter-nextjs/CHANGELOG.md index f6189b7fd38..4c2e0b811c3 100644 --- a/packages/adapter-nextjs/CHANGELOG.md +++ b/packages/adapter-nextjs/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.2.19](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/adapter-nextjs@1.2.18...@aws-amplify/adapter-nextjs@1.2.19) (2024-09-17) + +**Note:** Version bump only for package @aws-amplify/adapter-nextjs + +## [1.2.18](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/adapter-nextjs@1.2.17...@aws-amplify/adapter-nextjs@1.2.18) (2024-09-16) + +**Note:** Version bump only for package @aws-amplify/adapter-nextjs + ## [1.2.17](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/adapter-nextjs@1.2.16...@aws-amplify/adapter-nextjs@1.2.17) (2024-09-04) **Note:** Version bump only for package @aws-amplify/adapter-nextjs diff --git a/packages/adapter-nextjs/package.json b/packages/adapter-nextjs/package.json index ca1d9909000..ca7c63c084d 100644 --- a/packages/adapter-nextjs/package.json +++ b/packages/adapter-nextjs/package.json @@ -1,7 +1,7 @@ { "author": "Amazon Web Services", "name": "@aws-amplify/adapter-nextjs", - "version": "1.2.17", + "version": "1.2.19", "description": "The adapter for the supporting of using Amplify APIs in Next.js.", "peerDependencies": { "aws-amplify": "^6.0.7", @@ -16,7 +16,7 @@ "@types/node": "^20.3.1", "@types/react": "^18.2.13", "@types/react-dom": "^18.2.6", - "aws-amplify": "6.6.0", + "aws-amplify": "6.6.2", "jest-fetch-mock": "3.0.3", "next": ">= 13.5.0 < 15.0.0", "typescript": "5.0.2" diff --git a/packages/analytics/CHANGELOG.md b/packages/analytics/CHANGELOG.md index 18dfc9a627c..158c642f74f 100644 --- a/packages/analytics/CHANGELOG.md +++ b/packages/analytics/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [7.0.49](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/analytics@7.0.48...@aws-amplify/analytics@7.0.49) (2024-09-17) + +**Note:** Version bump only for package @aws-amplify/analytics + +## [7.0.48](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/analytics@7.0.47...@aws-amplify/analytics@7.0.48) (2024-09-16) + +**Note:** Version bump only for package @aws-amplify/analytics + ## [7.0.47](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/analytics@7.0.46...@aws-amplify/analytics@7.0.47) (2024-09-04) **Note:** Version bump only for package @aws-amplify/analytics diff --git a/packages/analytics/package.json b/packages/analytics/package.json index 49e5b49d96d..36044ebe240 100644 --- a/packages/analytics/package.json +++ b/packages/analytics/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/analytics", - "version": "7.0.47", + "version": "7.0.49", "description": "Analytics category of aws-amplify", "main": "./dist/cjs/index.js", "module": "./dist/esm/index.mjs", @@ -103,7 +103,7 @@ "@aws-amplify/core": "^6.1.0" }, "devDependencies": { - "@aws-amplify/core": "6.4.0", + "@aws-amplify/core": "6.4.2", "@aws-amplify/react-native": "1.1.5", "@aws-sdk/types": "3.398.0", "typescript": "5.0.2" diff --git a/packages/api-graphql/CHANGELOG.md b/packages/api-graphql/CHANGELOG.md index 2635af8b137..227ea1276da 100644 --- a/packages/api-graphql/CHANGELOG.md +++ b/packages/api-graphql/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.3.2](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/api-graphql@4.3.1...@aws-amplify/api-graphql@4.3.2) (2024-09-17) + +**Note:** Version bump only for package @aws-amplify/api-graphql + +## [4.3.1](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/api-graphql@4.3.0...@aws-amplify/api-graphql@4.3.1) (2024-09-16) + +**Note:** Version bump only for package @aws-amplify/api-graphql + # [4.3.0](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/api-graphql@4.2.1...@aws-amplify/api-graphql@4.3.0) (2024-09-04) ### Features diff --git a/packages/api-graphql/package.json b/packages/api-graphql/package.json index ae98edafa95..cc1c3061b6b 100644 --- a/packages/api-graphql/package.json +++ b/packages/api-graphql/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/api-graphql", - "version": "4.3.0", + "version": "4.3.2", "description": "Api-graphql category of aws-amplify", "main": "./dist/cjs/index.js", "module": "./dist/esm/index.mjs", @@ -84,9 +84,9 @@ "server" ], "dependencies": { - "@aws-amplify/api-rest": "4.0.47", - "@aws-amplify/core": "6.4.0", - "@aws-amplify/data-schema": "^1.0.0", + "@aws-amplify/api-rest": "4.0.49", + "@aws-amplify/core": "6.4.2", + "@aws-amplify/data-schema": "^1.5.0", "@aws-sdk/types": "3.387.0", "graphql": "15.8.0", "rxjs": "^7.8.1", diff --git a/packages/api-rest/CHANGELOG.md b/packages/api-rest/CHANGELOG.md index 378344c8fe6..56840cb1fe0 100644 --- a/packages/api-rest/CHANGELOG.md +++ b/packages/api-rest/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.0.49](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/api-rest@4.0.48...@aws-amplify/api-rest@4.0.49) (2024-09-17) + +**Note:** Version bump only for package @aws-amplify/api-rest + +## [4.0.48](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/api-rest@4.0.47...@aws-amplify/api-rest@4.0.48) (2024-09-16) + +**Note:** Version bump only for package @aws-amplify/api-rest + ## [4.0.47](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/api-rest@4.0.46...@aws-amplify/api-rest@4.0.47) (2024-09-04) **Note:** Version bump only for package @aws-amplify/api-rest diff --git a/packages/api-rest/package.json b/packages/api-rest/package.json index 8a7874ad183..d64fbd67fea 100644 --- a/packages/api-rest/package.json +++ b/packages/api-rest/package.json @@ -1,7 +1,7 @@ { "name": "@aws-amplify/api-rest", "private": false, - "version": "4.0.47", + "version": "4.0.49", "description": "Api-rest category of aws-amplify", "main": "./dist/cjs/index.js", "module": "./dist/esm/index.mjs", @@ -87,7 +87,7 @@ "@aws-amplify/core": "^6.1.0" }, "devDependencies": { - "@aws-amplify/core": "6.4.0", + "@aws-amplify/core": "6.4.2", "@aws-amplify/react-native": "1.1.5", "typescript": "5.0.2" }, diff --git a/packages/api/CHANGELOG.md b/packages/api/CHANGELOG.md index e58e7bbd920..dc714d5e55c 100644 --- a/packages/api/CHANGELOG.md +++ b/packages/api/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [6.0.51](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/api@6.0.50...@aws-amplify/api@6.0.51) (2024-09-17) + +**Note:** Version bump only for package @aws-amplify/api + +## [6.0.50](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/api@6.0.49...@aws-amplify/api@6.0.50) (2024-09-16) + +**Note:** Version bump only for package @aws-amplify/api + ## [6.0.49](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/api@6.0.48...@aws-amplify/api@6.0.49) (2024-09-04) **Note:** Version bump only for package @aws-amplify/api diff --git a/packages/api/package.json b/packages/api/package.json index 35451cfa83a..b1b3253549b 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/api", - "version": "6.0.49", + "version": "6.0.51", "description": "Api category of aws-amplify", "main": "./dist/cjs/index.js", "module": "./dist/esm/index.mjs", @@ -79,8 +79,8 @@ "server" ], "dependencies": { - "@aws-amplify/api-graphql": "4.3.0", - "@aws-amplify/api-rest": "4.0.47", + "@aws-amplify/api-graphql": "4.3.2", + "@aws-amplify/api-rest": "4.0.49", "tslib": "^2.5.0" } } diff --git a/packages/auth/CHANGELOG.md b/packages/auth/CHANGELOG.md index 9441a03a56a..7abc1e1a0a5 100644 --- a/packages/auth/CHANGELOG.md +++ b/packages/auth/CHANGELOG.md @@ -3,6 +3,16 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [6.4.2](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/auth@6.4.1...@aws-amplify/auth@6.4.2) (2024-09-17) + +**Note:** Version bump only for package @aws-amplify/auth + +## [6.4.1](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/auth@6.4.0...@aws-amplify/auth@6.4.1) (2024-09-16) + +### Bug Fixes + +- **auth:** custom `userPoolEndpoint` cannot be applied on the server-side ([#13739](https://github.com/aws-amplify/amplify-js/issues/13739)) ([a76b594](https://github.com/aws-amplify/amplify-js/commit/a76b594562430a85fd37f00bb2788959f7a69d6a)) + # [6.4.0](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/auth@6.3.17...@aws-amplify/auth@6.4.0) (2024-09-04) ### Features diff --git a/packages/auth/__tests__/foundation/cognitoUserPoolEndpointResolver.test.ts b/packages/auth/__tests__/foundation/cognitoUserPoolEndpointResolver.test.ts new file mode 100644 index 00000000000..04bbff52546 --- /dev/null +++ b/packages/auth/__tests__/foundation/cognitoUserPoolEndpointResolver.test.ts @@ -0,0 +1,16 @@ +import { AmplifyUrl } from '@aws-amplify/core/internals/utils'; + +import { cognitoUserPoolEndpointResolver } from '../../src/foundation/cognitoUserPoolEndpointResolver'; +import { COGNITO_IDP_SERVICE_NAME } from '../../src/foundation/constants'; + +describe('cognitoUserPoolEndpointResolver', () => { + it('should return the Cognito User Pool endpoint', () => { + const region = 'us-west-2'; + const { url } = cognitoUserPoolEndpointResolver({ region }); + + expect(url instanceof AmplifyUrl).toBe(true); + expect(url.toString()).toEqual( + `https://${COGNITO_IDP_SERVICE_NAME}.us-west-2.amazonaws.com/`, + ); + }); +}); diff --git a/packages/auth/__tests__/foundation/factories/serviceClients/cognitoIdentityProvider/index.test.ts b/packages/auth/__tests__/foundation/factories/serviceClients/cognitoIdentityProvider/index.test.ts new file mode 100644 index 00000000000..9138718bb58 --- /dev/null +++ b/packages/auth/__tests__/foundation/factories/serviceClients/cognitoIdentityProvider/index.test.ts @@ -0,0 +1,41 @@ +import { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers'; + +import * as serviceClients from '../../../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { DEFAULT_SERVICE_CLIENT_API_CONFIG } from '../../../../../src/foundation/factories/serviceClients/cognitoIdentityProvider/constants'; + +import { mockServiceClientAPIConfig } from './testUtils/data'; + +jest.mock('@aws-amplify/core/internals/aws-client-utils/composers', () => ({ + ...jest.requireActual( + '@aws-amplify/core/internals/aws-client-utils/composers', + ), + composeServiceApi: jest.fn(), +})); + +export const mockComposeServiceApi = jest.mocked(composeServiceApi); + +describe('service clients', () => { + const serviceClientFactories = Object.keys(serviceClients); + + afterEach(() => { + mockComposeServiceApi.mockClear(); + }); + + test.each(serviceClientFactories)( + 'factory `%s` should invoke composeServiceApi with expected parameters', + serviceClientFactory => { + // eslint-disable-next-line import/namespace + serviceClients[serviceClientFactory](mockServiceClientAPIConfig); + + expect(mockComposeServiceApi).toHaveBeenCalledWith( + expect.any(Function), + expect.any(Function), + expect.any(Function), + expect.objectContaining({ + ...DEFAULT_SERVICE_CLIENT_API_CONFIG, + ...mockServiceClientAPIConfig, + }), + ); + }, + ); +}); diff --git a/packages/auth/__tests__/foundation/factories/serviceClients/cognitoIdentityProvider/shared/handler/cognitoUserPoolTransferHandler.test.ts b/packages/auth/__tests__/foundation/factories/serviceClients/cognitoIdentityProvider/shared/handler/cognitoUserPoolTransferHandler.test.ts new file mode 100644 index 00000000000..8f5bbc8c7f9 --- /dev/null +++ b/packages/auth/__tests__/foundation/factories/serviceClients/cognitoIdentityProvider/shared/handler/cognitoUserPoolTransferHandler.test.ts @@ -0,0 +1,43 @@ +import { unauthenticatedHandler } from '@aws-amplify/core/internals/aws-client-utils'; +import { composeTransferHandler } from '@aws-amplify/core/internals/aws-client-utils/composers'; + +import { cognitoUserPoolTransferHandler } from '../../../../../../../src/foundation/factories/serviceClients/cognitoIdentityProvider/shared/handler'; + +jest.mock('@aws-amplify/core/internals/aws-client-utils/composers'); +jest.mock('@aws-amplify/core/internals/aws-client-utils'); + +const mockComposeTransferHandler = jest.mocked(composeTransferHandler); +const mockUnauthenticatedHandler = jest.mocked(unauthenticatedHandler); + +describe('cognitoUserPoolTransferHandler', () => { + beforeAll(() => { + // need to make sure cognitoUserPoolTransferHandler is imported and used in + // the scope of the test + const _ = cognitoUserPoolTransferHandler; + }); + + it('adds the disableCacheMiddlewareFactory at module loading', () => { + expect(mockComposeTransferHandler).toHaveBeenCalledTimes(1); + + const [core, middleware] = mockComposeTransferHandler.mock.calls[0]; + + expect(core).toStrictEqual(mockUnauthenticatedHandler); + expect(middleware).toHaveLength(1); + + const disableCacheMiddlewareFactory = middleware[0] as any; + const disableCacheMiddlewarePendingNext = disableCacheMiddlewareFactory(); + + const mockNext = jest.fn(); + const disableCacheMiddleware = disableCacheMiddlewarePendingNext(mockNext); + const mockRequest = { + headers: {}, + }; + + disableCacheMiddleware(mockRequest); + + expect(mockNext).toHaveBeenCalledWith(mockRequest); + expect(mockRequest.headers).toEqual({ + 'cache-control': 'no-store', + }); + }); +}); diff --git a/packages/auth/__tests__/foundation/factories/serviceClients/cognitoIdentityProvider/shared/serde/createEmptyResponseDeserializer.test.ts b/packages/auth/__tests__/foundation/factories/serviceClients/cognitoIdentityProvider/shared/serde/createEmptyResponseDeserializer.test.ts new file mode 100644 index 00000000000..80f9ddfedb7 --- /dev/null +++ b/packages/auth/__tests__/foundation/factories/serviceClients/cognitoIdentityProvider/shared/serde/createEmptyResponseDeserializer.test.ts @@ -0,0 +1,55 @@ +import { + HttpResponse, + parseJsonError, +} from '@aws-amplify/core/internals/aws-client-utils'; + +import { createEmptyResponseDeserializer } from '../../../../../../../src/foundation/factories/serviceClients/cognitoIdentityProvider/shared/serde/createEmptyResponseDeserializer'; +import { AuthError } from '../../../../../../../src/errors/AuthError'; + +jest.mock('@aws-amplify/core/internals/aws-client-utils'); + +const mockParseJsonError = jest.mocked(parseJsonError); + +describe('createEmptyResponseDeserializer created response deserializer', () => { + const deserializer = createEmptyResponseDeserializer(); + + it('returns undefined for 2xx status code', async () => { + const response: HttpResponse = { + statusCode: 200, + body: { + json: () => Promise.resolve({}), + blob: () => Promise.resolve(new Blob()), + text: () => Promise.resolve(''), + }, + headers: {}, + }; + const output = await deserializer(response); + + expect(output).toBeUndefined(); + }); + + it('throws AuthError for 4xx status code', async () => { + const expectedErrorName = 'TestError'; + const expectedErrorMessage = 'TestErrorMessage'; + const expectedError = new Error(expectedErrorMessage); + expectedError.name = expectedErrorName; + + mockParseJsonError.mockReturnValueOnce(expectedError as any); + const response: HttpResponse = { + statusCode: 400, + body: { + json: () => Promise.resolve({}), + blob: () => Promise.resolve(new Blob()), + text: () => Promise.resolve(''), + }, + headers: {}, + }; + + expect(deserializer(response as any)).rejects.toThrow( + new AuthError({ + name: expectedErrorName, + message: expectedErrorMessage, + }), + ); + }); +}); diff --git a/packages/auth/__tests__/foundation/factories/serviceClients/cognitoIdentityProvider/shared/serde/createUserPoolDeserializer.test.ts b/packages/auth/__tests__/foundation/factories/serviceClients/cognitoIdentityProvider/shared/serde/createUserPoolDeserializer.test.ts new file mode 100644 index 00000000000..18bc775caca --- /dev/null +++ b/packages/auth/__tests__/foundation/factories/serviceClients/cognitoIdentityProvider/shared/serde/createUserPoolDeserializer.test.ts @@ -0,0 +1,59 @@ +import { + HttpResponse, + parseJsonBody, + parseJsonError, +} from '@aws-amplify/core/internals/aws-client-utils'; + +import { createUserPoolDeserializer } from '../../../../../../../src/foundation/factories/serviceClients/cognitoIdentityProvider/shared/serde/createUserPoolDeserializer'; +import { AuthError } from '../../../../../../../src/errors/AuthError'; + +jest.mock('@aws-amplify/core/internals/aws-client-utils'); + +const mockParseJsonBody = jest.mocked(parseJsonBody); +const mockParseJsonError = jest.mocked(parseJsonError); + +describe('buildUserPoolDeserializer created response deserializer', () => { + const deserializer = createUserPoolDeserializer(); + + it('returns body for 2xx status code', async () => { + const expectedBody = { test: 'test' }; + mockParseJsonBody.mockResolvedValueOnce(expectedBody); + const response: HttpResponse = { + statusCode: 200, + body: { + json: () => Promise.resolve({}), + blob: () => Promise.resolve(new Blob()), + text: () => Promise.resolve(''), + }, + headers: {}, + }; + const output = await deserializer(response); + + expect(output).toStrictEqual(expectedBody); + }); + + it('throws AuthError for 4xx status code', async () => { + const expectedErrorName = 'TestError'; + const expectedErrorMessage = 'TestErrorMessage'; + const expectedError = new Error(expectedErrorMessage); + expectedError.name = expectedErrorName; + + mockParseJsonError.mockReturnValueOnce(expectedError as any); + const response: HttpResponse = { + statusCode: 400, + body: { + json: () => Promise.resolve({}), + blob: () => Promise.resolve(new Blob()), + text: () => Promise.resolve(''), + }, + headers: {}, + }; + + expect(deserializer(response as any)).rejects.toThrow( + new AuthError({ + name: expectedErrorName, + message: expectedErrorMessage, + }), + ); + }); +}); diff --git a/packages/auth/__tests__/foundation/factories/serviceClients/cognitoIdentityProvider/shared/serde/createUserPoolSerializer.test.ts b/packages/auth/__tests__/foundation/factories/serviceClients/cognitoIdentityProvider/shared/serde/createUserPoolSerializer.test.ts new file mode 100644 index 00000000000..70d9a054a42 --- /dev/null +++ b/packages/auth/__tests__/foundation/factories/serviceClients/cognitoIdentityProvider/shared/serde/createUserPoolSerializer.test.ts @@ -0,0 +1,27 @@ +import { AmplifyUrl } from '@aws-amplify/core/internals/utils'; + +import { createUserPoolSerializer } from '../../../../../../../src/foundation/factories/serviceClients/cognitoIdentityProvider/shared/serde/createUserPoolSerializer'; + +describe('createUserPoolSerializer created request serializer', () => { + test.each(['SignUp', 'InitiateAuth', 'RevokeToken'] as const)( + `it serializes requests from operation %s`, + operation => { + const testInput = { testBody: 'testBody' }; + const testEndpoint = { + url: new AmplifyUrl('http://test.com'), + }; + const serializer = createUserPoolSerializer(operation); + const result = serializer(testInput, testEndpoint); + + expect(result).toEqual({ + method: 'POST', + url: testEndpoint.url, + headers: { + 'content-type': 'application/x-amz-json-1.1', + 'x-amz-target': `AWSCognitoIdentityProviderService.${operation}`, + }, + body: JSON.stringify(testInput), + }); + }, + ); +}); diff --git a/packages/auth/__tests__/foundation/factories/serviceClients/cognitoIdentityProvider/testUtils/data.ts b/packages/auth/__tests__/foundation/factories/serviceClients/cognitoIdentityProvider/testUtils/data.ts new file mode 100644 index 00000000000..33a9a3d5534 --- /dev/null +++ b/packages/auth/__tests__/foundation/factories/serviceClients/cognitoIdentityProvider/testUtils/data.ts @@ -0,0 +1,7 @@ +import { ServiceClientFactoryInput } from '../../../../../../src/foundation/factories/serviceClients/cognitoIdentityProvider/types'; + +export const mockServiceClientAPIConfig: ServiceClientFactoryInput = { + endpointResolver: jest.fn() as jest.MockedFunction< + ServiceClientFactoryInput['endpointResolver'] + >, +}; diff --git a/packages/auth/__tests__/foundation/parsers/regionParsers.test.ts b/packages/auth/__tests__/foundation/parsers/regionParsers.test.ts new file mode 100644 index 00000000000..978ac7d8029 --- /dev/null +++ b/packages/auth/__tests__/foundation/parsers/regionParsers.test.ts @@ -0,0 +1,47 @@ +import { AuthError } from '../../../src/errors/AuthError'; +import { + getRegionFromIdentityPoolId, + getRegionFromUserPoolId, +} from '../../../src/foundation/parsers/regionParsers'; + +describe('getRegionFromIdentityPoolId()', () => { + it('returns the region from the identity pool id', () => { + const identityPoolId = 'us-west-2:12345678-1234-1234-1234-123456789012'; + const region = getRegionFromIdentityPoolId(identityPoolId); + expect(region).toEqual('us-west-2'); + }); + + test.each([undefined, 'invalid-id-123'])( + `throws an error when the identity pool id is invalid as %p`, + identityPoolId => { + expect(() => getRegionFromIdentityPoolId(identityPoolId)).toThrow( + new AuthError({ + name: 'InvalidIdentityPoolIdException', + message: 'Invalid identity pool id provided.', + recoverySuggestion: + 'Make sure a valid identityPoolId is given in the config.', + }), + ); + }, + ); +}); + +describe('getRegionFromUserPoolId()', () => { + it('should return the region from the user pool id', () => { + const userPoolId = 'us-west-2_12345678'; + const region = getRegionFromUserPoolId(userPoolId); + expect(region).toEqual('us-west-2'); + }); + + test.each([undefined, 'invalid-id-123'])( + `throws an error when the user pool id is invalid as %p`, + userPoolId => { + expect(() => getRegionFromUserPoolId(userPoolId)).toThrow( + new AuthError({ + name: 'InvalidUserPoolId', + message: 'Invalid user pool id provided.', + }), + ); + }, + ); +}); diff --git a/packages/auth/__tests__/providers/cognito/autoSignIn.test.ts b/packages/auth/__tests__/providers/cognito/autoSignIn.test.ts index 783fc2e9699..d787c2cdedf 100644 --- a/packages/auth/__tests__/providers/cognito/autoSignIn.test.ts +++ b/packages/auth/__tests__/providers/cognito/autoSignIn.test.ts @@ -8,13 +8,10 @@ import { signUp, } from '../../../src/providers/cognito'; import { autoSignIn } from '../../../src/providers/cognito/apis/autoSignIn'; -import * as signUpClient from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; -import { - RespondToAuthChallengeCommandOutput, - SignUpCommandOutput, -} from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider/types'; import * as initiateAuthHelpers from '../../../src/providers/cognito/utils/signInHelpers'; import { AuthError } from '../../../src/errors/AuthError'; +import { createSignUpClient } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { RespondToAuthChallengeCommandOutput } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider/types'; import { authAPITestParams } from './testUtils/authApiTestParams'; @@ -23,6 +20,9 @@ jest.mock('@aws-amplify/core/internals/utils', () => ({ ...jest.requireActual('@aws-amplify/core/internals/utils'), isBrowser: jest.fn(() => false), })); +jest.mock( + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', +); const authConfig = { Cognito: { @@ -35,27 +35,30 @@ Amplify.configure({ Auth: authConfig, }); describe('Auto sign-in API Happy Path Cases:', () => { - let signUpSpy; - let handleUserSRPAuthflowSpy; + let handleUserSRPAuthFlowSpy: jest.SpyInstance; + + const mockSignUp = jest.fn(); + const mockCreateSignUpClient = jest.mocked(createSignUpClient); + const { user1 } = authAPITestParams; beforeEach(async () => { - signUpSpy = jest - .spyOn(signUpClient, 'signUp') - .mockImplementationOnce( - async () => ({ UserConfirmed: true }) as SignUpCommandOutput, - ); + mockSignUp.mockResolvedValueOnce({ UserConfirmed: true }); + mockCreateSignUpClient.mockReturnValueOnce(mockSignUp); - handleUserSRPAuthflowSpy = jest + handleUserSRPAuthFlowSpy = jest .spyOn(initiateAuthHelpers, 'handleUserSRPAuthFlow') .mockImplementationOnce( async (): Promise => authAPITestParams.RespondToAuthChallengeCommandOutput, ); }); + afterEach(() => { - signUpSpy.mockClear(); - handleUserSRPAuthflowSpy.mockClear(); + mockSignUp.mockClear(); + mockCreateSignUpClient.mockClear(); + handleUserSRPAuthFlowSpy.mockClear(); }); + test('signUp should enable autoSignIn and return COMPLETE_AUTO_SIGN_IN step', async () => { const resp = await signUp({ username: user1.username, @@ -71,13 +74,13 @@ describe('Auto sign-in API Happy Path Cases:', () => { signUpStep: 'COMPLETE_AUTO_SIGN_IN', }, }); - expect(signUpSpy).toHaveBeenCalledTimes(1); + expect(mockSignUp).toHaveBeenCalledTimes(1); }); test('Auto sign-in should resolve to a signIn output', async () => { const signInOutput = await autoSignIn(); expect(signInOutput).toEqual(authAPITestParams.signInResult()); - expect(handleUserSRPAuthflowSpy).toHaveBeenCalledTimes(1); + expect(handleUserSRPAuthFlowSpy).toHaveBeenCalledTimes(1); }); }); diff --git a/packages/auth/__tests__/providers/cognito/confirmResetPassword.test.ts b/packages/auth/__tests__/providers/cognito/confirmResetPassword.test.ts index df8167e5030..d07979c5d9c 100644 --- a/packages/auth/__tests__/providers/cognito/confirmResetPassword.test.ts +++ b/packages/auth/__tests__/providers/cognito/confirmResetPassword.test.ts @@ -7,7 +7,8 @@ import { AuthError } from '../../../src/errors/AuthError'; import { AuthValidationErrorCode } from '../../../src/errors/types/validation'; import { confirmResetPassword } from '../../../src/providers/cognito'; import { ConfirmForgotPasswordException } from '../../../src/providers/cognito/types/errors'; -import { confirmForgotPassword } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; +import { createConfirmForgotPasswordClient } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../../../src/providers/cognito/factories'; import { authAPITestParams } from './testUtils/authApiTestParams'; import { getMockError } from './testUtils/data'; @@ -22,12 +23,19 @@ jest.mock('@aws-amplify/core/internals/utils', () => ({ isBrowser: jest.fn(() => false), })); jest.mock( - '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider', + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', ); +jest.mock('../../../src/providers/cognito/factories'); describe('confirmResetPassword', () => { // assert mocks - const mockConfirmForgotPassword = confirmForgotPassword as jest.Mock; + const mockConfirmForgotPassword = jest.fn(); + const mockCreateConfirmResetPasswordClient = jest.mocked( + createConfirmForgotPasswordClient, + ); + const mockCreateCognitoUserPoolEndpointResolver = jest.mocked( + createCognitoUserPoolEndpointResolver, + ); beforeAll(() => { setUpGetConfig(Amplify); @@ -37,10 +45,15 @@ describe('confirmResetPassword', () => { mockConfirmForgotPassword.mockResolvedValue( authAPITestParams.confirmResetPasswordHttpCallResult, ); + mockCreateConfirmResetPasswordClient.mockReturnValueOnce( + mockConfirmForgotPassword, + ); }); afterEach(() => { mockConfirmForgotPassword.mockReset(); + mockCreateConfirmResetPasswordClient.mockClear(); + mockCreateCognitoUserPoolEndpointResolver.mockClear(); }); it('should call the confirmForgotPassword and return void', async () => { @@ -50,6 +63,26 @@ describe('confirmResetPassword', () => { expect(mockConfirmForgotPassword).toHaveBeenCalled(); }); + it('invokes createCognitoUserPoolEndpointResolver with expected endpointOverride', async () => { + const expectedUserPoolEndpoint = 'https://my-custom-endpoint.com'; + jest.mocked(Amplify.getConfig).mockReturnValueOnce({ + Auth: { + Cognito: { + userPoolClientId: '111111-aaaaa-42d8-891d-ee81a1549398', + userPoolId: 'us-west-2_zzzzz', + identityPoolId: 'us-west-2:xxxxxx', + userPoolEndpoint: expectedUserPoolEndpoint, + }, + }, + }); + + await confirmResetPassword(authAPITestParams.confirmResetPasswordRequest); + + expect(mockCreateCognitoUserPoolEndpointResolver).toHaveBeenCalledWith({ + endpointOverride: expectedUserPoolEndpoint, + }); + }); + it('should contain clientMetadata from request', async () => { await confirmResetPassword({ username: 'username', diff --git a/packages/auth/__tests__/providers/cognito/confirmSignInErrorCases.test.ts b/packages/auth/__tests__/providers/cognito/confirmSignInErrorCases.test.ts index 0f20b1703f3..a2d561799d9 100644 --- a/packages/auth/__tests__/providers/cognito/confirmSignInErrorCases.test.ts +++ b/packages/auth/__tests__/providers/cognito/confirmSignInErrorCases.test.ts @@ -4,8 +4,8 @@ import { AuthError } from '../../../src/errors/AuthError'; import { AuthValidationErrorCode } from '../../../src/errors/types/validation'; import { confirmSignIn } from '../../../src/providers/cognito/apis/confirmSignIn'; import { RespondToAuthChallengeException } from '../../../src/providers/cognito/types/errors'; -import { respondToAuthChallenge } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; import { signInStore } from '../../../src/providers/cognito/utils/signInStore'; +import { createRespondToAuthChallengeClient } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; import { getMockError } from './testUtils/data'; import { setUpGetConfig } from './testUtils/setUpGetConfig'; @@ -15,10 +15,11 @@ jest.mock('@aws-amplify/core', () => ({ ...(jest.createMockFromModule('@aws-amplify/core') as object), Amplify: { getConfig: jest.fn(() => ({})) }, })); +jest.mock('../../../src/providers/cognito/utils/signInStore'); jest.mock( - '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider', + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', ); -jest.mock('../../../src/providers/cognito/utils/signInStore'); +jest.mock('../../../src/providers/cognito/factories'); describe('confirmSignIn API error path cases:', () => { const challengeName = 'SELECT_MFA_TYPE'; @@ -26,7 +27,10 @@ describe('confirmSignIn API error path cases:', () => { const { username } = authAPITestParams.user1; // assert mocks const mockStoreGetState = signInStore.getState as jest.Mock; - const mockRespondToAuthChallenge = respondToAuthChallenge as jest.Mock; + const mockRespondToAuthChallenge = jest.fn(); + const mockCreateRespondToAuthChallengeClient = jest.mocked( + createRespondToAuthChallengeClient, + ); beforeAll(() => { setUpGetConfig(Amplify); @@ -37,8 +41,15 @@ describe('confirmSignIn API error path cases:', () => { }); }); + beforeEach(() => { + mockCreateRespondToAuthChallengeClient.mockReturnValueOnce( + mockRespondToAuthChallenge, + ); + }); + afterEach(() => { mockRespondToAuthChallenge.mockReset(); + mockCreateRespondToAuthChallengeClient.mockClear(); }); it('confirmSignIn API should throw an error when challengeResponse is empty', async () => { diff --git a/packages/auth/__tests__/providers/cognito/confirmSignInHappyCases.test.ts b/packages/auth/__tests__/providers/cognito/confirmSignInHappyCases.test.ts index ddeb3c368fd..ddfcc9c2d8e 100644 --- a/packages/auth/__tests__/providers/cognito/confirmSignInHappyCases.test.ts +++ b/packages/auth/__tests__/providers/cognito/confirmSignInHappyCases.test.ts @@ -9,16 +9,22 @@ import { signIn, } from '../../../src/providers/cognito/'; import * as signInHelpers from '../../../src/providers/cognito/utils/signInHelpers'; -import { RespondToAuthChallengeCommandOutput } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider/types'; import { cognitoUserPoolsTokenProvider, tokenOrchestrator, } from '../../../src/providers/cognito/tokenProvider'; -import * as clients from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; +import { + createInitiateAuthClient, + createRespondToAuthChallengeClient, +} from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { RespondToAuthChallengeCommandOutput } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider/types'; import { authAPITestParams } from './testUtils/authApiTestParams'; jest.mock('../../../src/providers/cognito/apis/getCurrentUser'); +jest.mock( + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', +); const authConfig = { Cognito: { @@ -35,6 +41,9 @@ describe('confirmSignIn API happy path cases', () => { let handleChallengeNameSpy: jest.SpyInstance; const { username, password } = authAPITestParams.user1; + const mockInitiateAuth = jest.fn(); + const mockCreateInitiateAuthClient = jest.mocked(createInitiateAuthClient); + beforeEach(async () => { cognitoUserPoolsTokenProvider.setAuthConfig(authConfig); @@ -56,10 +65,14 @@ describe('confirmSignIn API happy path cases', () => { $metadata: {}, }), ); + + mockCreateInitiateAuthClient.mockReturnValueOnce(mockInitiateAuth); }); afterEach(() => { handleChallengeNameSpy.mockClear(); + mockInitiateAuth.mockClear(); + mockCreateInitiateAuthClient.mockClear(); }); afterAll(() => { @@ -234,20 +247,16 @@ describe('confirmSignIn API happy path cases', () => { const mockedUserSub = '1111-2222-3333-4444'; const activeSignInSession = '1234234232'; const activeChallengeName = 'SMS_MFA'; - const initiateAuthSpy = jest - .spyOn(clients, 'initiateAuth') - .mockImplementationOnce( - async (): Promise => ({ - ChallengeName: activeChallengeName, - Session: activeSignInSession, - $metadata: {}, - ChallengeParameters: { - USER_ID_FOR_SRP: mockedUserSub, - CODE_DELIVERY_DELIVERY_MEDIUM: 'SMS', - CODE_DELIVERY_DESTINATION: '*******9878', - }, - }), - ); + mockInitiateAuth.mockResolvedValueOnce({ + ChallengeName: activeChallengeName, + Session: activeSignInSession, + $metadata: {}, + ChallengeParameters: { + USER_ID_FOR_SRP: mockedUserSub, + CODE_DELIVERY_DELIVERY_MEDIUM: 'SMS', + CODE_DELIVERY_DESTINATION: '*******9878', + }, + }); await signIn({ username, password, @@ -260,6 +269,7 @@ describe('confirmSignIn API happy path cases', () => { options: authAPITestParams.configWithClientMetadata, }); const options = authAPITestParams.configWithClientMetadata; + expect(handleChallengeNameSpy).toHaveBeenCalledWith( mockedUserSub, activeChallengeName, @@ -270,14 +280,17 @@ describe('confirmSignIn API happy path cases', () => { authAPITestParams.configWithClientMetadata.clientMetadata, options, ); - initiateAuthSpy.mockClear(); }); }); describe('Cognito ASF', () => { - let respondToAuthChallengeSpy: jest.SpyInstance; let handleUserSRPAuthFlowSpy: jest.SpyInstance; + const mockRespondToAuthChallenge = jest.fn(); + const mockCreateRespondToAuthChallengeClient = jest.mocked( + createRespondToAuthChallengeClient, + ); + const { username } = authAPITestParams.user1; const { password } = authAPITestParams.user1; beforeEach(() => { @@ -292,30 +305,28 @@ describe('Cognito ASF', () => { }, }; - respondToAuthChallengeSpy = jest - .spyOn(clients, 'respondToAuthChallenge') - .mockImplementation( - async (): Promise => { - return { - Session: '1234234232', - $metadata: {}, - ChallengeName: undefined, - ChallengeParameters: {}, - AuthenticationResult: { - AccessToken: - 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJleHAiOjE3MTAyOTMxMzB9.YzDpgJsrB3z-ZU1XxMcXSQsMbgCzwH_e-_76rnfehh0', - ExpiresIn: 1000, - IdToken: - 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJleHAiOjE3MTAyOTMxMzB9.YzDpgJsrB3z-ZU1XxMcXSQsMbgCzwH_e-_76rnfehh0', - RefreshToken: 'qwersfsafsfssfasf', - }, - }; - }, - ); + mockRespondToAuthChallenge.mockResolvedValueOnce({ + Session: '1234234232', + $metadata: {}, + ChallengeName: undefined, + ChallengeParameters: {}, + AuthenticationResult: { + AccessToken: + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJleHAiOjE3MTAyOTMxMzB9.YzDpgJsrB3z-ZU1XxMcXSQsMbgCzwH_e-_76rnfehh0', + ExpiresIn: 1000, + IdToken: + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJleHAiOjE3MTAyOTMxMzB9.YzDpgJsrB3z-ZU1XxMcXSQsMbgCzwH_e-_76rnfehh0', + RefreshToken: 'qwersfsafsfssfasf', + }, + }); + mockCreateRespondToAuthChallengeClient.mockReturnValueOnce( + mockRespondToAuthChallenge, + ); }); afterEach(() => { - respondToAuthChallengeSpy.mockClear(); + mockRespondToAuthChallenge.mockClear(); + mockCreateRespondToAuthChallengeClient.mockClear(); handleUserSRPAuthFlowSpy.mockClear(); (window as any).AmazonCognitoAdvancedSecurityData = undefined; }); @@ -342,15 +353,11 @@ describe('Cognito ASF', () => { expect(result.isSignedIn).toBe(false); expect(result.nextStep.signInStep).toBe('CONFIRM_SIGN_IN_WITH_SMS_CODE'); - try { - await confirmSignIn({ - challengeResponse: '777', - }); - } catch (err) { - console.log(err); - } - - expect(respondToAuthChallengeSpy).toHaveBeenCalledWith( + await confirmSignIn({ + challengeResponse: '777', + }); + + expect(mockRespondToAuthChallenge).toHaveBeenCalledWith( expect.objectContaining({ region: 'us-west-2', }), @@ -384,15 +391,11 @@ describe('Cognito ASF', () => { expect(result.nextStep.signInStep).toBe( 'CONTINUE_SIGN_IN_WITH_MFA_SELECTION', ); - try { - await confirmSignIn({ - challengeResponse: 'SMS', - }); - } catch (err) { - console.log(err); - } - - expect(respondToAuthChallengeSpy).toHaveBeenCalledWith( + await confirmSignIn({ + challengeResponse: 'SMS', + }); + + expect(mockRespondToAuthChallenge).toHaveBeenCalledWith( expect.objectContaining({ region: 'us-west-2', }), @@ -427,15 +430,11 @@ describe('Cognito ASF', () => { expect(result.isSignedIn).toBe(false); expect(result.nextStep.signInStep).toBe('CONFIRM_SIGN_IN_WITH_TOTP_CODE'); - try { - await confirmSignIn({ - challengeResponse: '123456', - }); - } catch (err) { - console.log(err); - } - - expect(respondToAuthChallengeSpy).toHaveBeenCalledWith( + await confirmSignIn({ + challengeResponse: '123456', + }); + + expect(mockRespondToAuthChallenge).toHaveBeenCalledWith( expect.objectContaining({ region: 'us-west-2', }), @@ -472,15 +471,11 @@ describe('Cognito ASF', () => { expect(result.nextStep.signInStep).toBe( 'CONFIRM_SIGN_IN_WITH_NEW_PASSWORD_REQUIRED', ); - try { - await confirmSignIn({ - challengeResponse: 'password', - }); - } catch (err) { - console.log(err); - } - - expect(respondToAuthChallengeSpy).toHaveBeenCalledWith( + await confirmSignIn({ + challengeResponse: 'password', + }); + + expect(mockRespondToAuthChallenge).toHaveBeenCalledWith( expect.objectContaining({ region: 'us-west-2', }), @@ -516,15 +511,11 @@ describe('Cognito ASF', () => { expect(result.nextStep.signInStep).toBe( 'CONFIRM_SIGN_IN_WITH_CUSTOM_CHALLENGE', ); - try { - await confirmSignIn({ - challengeResponse: 'secret-answer', - }); - } catch (err) { - console.log(err); - } - - expect(respondToAuthChallengeSpy).toHaveBeenCalledWith( + await confirmSignIn({ + challengeResponse: 'secret-answer', + }); + + expect(mockRespondToAuthChallenge).toHaveBeenCalledWith( expect.objectContaining({ region: 'us-west-2', }), diff --git a/packages/auth/__tests__/providers/cognito/confirmSignUp.test.ts b/packages/auth/__tests__/providers/cognito/confirmSignUp.test.ts index e6528e4b1ed..3523f9495aa 100644 --- a/packages/auth/__tests__/providers/cognito/confirmSignUp.test.ts +++ b/packages/auth/__tests__/providers/cognito/confirmSignUp.test.ts @@ -4,16 +4,22 @@ import { Amplify } from '@aws-amplify/core'; import { confirmSignUp } from '../../../src/providers/cognito'; -import { confirmSignUp as providerConfirmSignUp } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; import { AuthValidationErrorCode } from '../../../src/errors/types/validation'; import { AuthError } from '../../../src/errors/AuthError'; import { ConfirmSignUpException } from '../../../src/providers/cognito/types/errors'; -import { ConfirmSignUpCommandOutput } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider/types'; +import { createConfirmSignUpClient } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../../../src/providers/cognito/factories'; +import { ConfirmSignUpCommandOutput } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider/types'; import { authAPITestParams } from './testUtils/authApiTestParams'; import { getMockError } from './testUtils/data'; import { setUpGetConfig } from './testUtils/setUpGetConfig'; +jest.mock( + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', +); +jest.mock('../../../src/providers/cognito/factories'); + jest.mock('@aws-amplify/core', () => ({ ...(jest.createMockFromModule('@aws-amplify/core') as object), Amplify: { getConfig: jest.fn(() => ({})) }, @@ -22,15 +28,16 @@ jest.mock('@aws-amplify/core/internals/utils', () => ({ ...jest.requireActual('@aws-amplify/core/internals/utils'), isBrowser: jest.fn(() => false), })); -jest.mock( - '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider', -); describe('confirmSignUp', () => { const { user1 } = authAPITestParams; const confirmationCode = '123456'; // assert mocks - const mockConfirmSignUp = providerConfirmSignUp as jest.Mock; + const mockConfirmSignUp = jest.fn(); + const mockCreateConfirmSignUpClient = jest.mocked(createConfirmSignUpClient); + const mockCreateCognitoUserPoolEndpointResolver = jest.mocked( + createCognitoUserPoolEndpointResolver, + ); beforeAll(() => { setUpGetConfig(Amplify); @@ -38,10 +45,13 @@ describe('confirmSignUp', () => { beforeEach(() => { mockConfirmSignUp.mockResolvedValue({} as ConfirmSignUpCommandOutput); + mockCreateConfirmSignUpClient.mockReturnValueOnce(mockConfirmSignUp); }); afterEach(() => { mockConfirmSignUp.mockReset(); + mockCreateConfirmSignUpClient.mockClear(); + mockCreateCognitoUserPoolEndpointResolver.mockClear(); }); it('should call confirmSignUp and return a SignUpResult', async () => { @@ -68,6 +78,29 @@ describe('confirmSignUp', () => { expect(mockConfirmSignUp).toHaveBeenCalledTimes(1); }); + it('invokes mockCreateCognitoUserPoolEndpointResolver with expected endpointOverride', async () => { + const expectedUserPoolEndpoint = 'https://my-custom-endpoint.com'; + jest.mocked(Amplify.getConfig).mockReturnValueOnce({ + Auth: { + Cognito: { + userPoolClientId: '111111-aaaaa-42d8-891d-ee81a1549398', + userPoolId: 'us-west-2_zzzzz', + identityPoolId: 'us-west-2:xxxxxx', + userPoolEndpoint: expectedUserPoolEndpoint, + }, + }, + }); + + await confirmSignUp({ + username: user1.username, + confirmationCode, + }); + + expect(mockCreateCognitoUserPoolEndpointResolver).toHaveBeenCalledWith({ + endpointOverride: expectedUserPoolEndpoint, + }); + }); + it('should contain force alias creation', async () => { await confirmSignUp({ username: user1.username, diff --git a/packages/auth/__tests__/providers/cognito/confirmUserAttribute.test.ts b/packages/auth/__tests__/providers/cognito/confirmUserAttribute.test.ts index 3c7961d125a..56608241897 100644 --- a/packages/auth/__tests__/providers/cognito/confirmUserAttribute.test.ts +++ b/packages/auth/__tests__/providers/cognito/confirmUserAttribute.test.ts @@ -7,8 +7,9 @@ import { decodeJWT } from '@aws-amplify/core/internals/utils'; import { AuthError } from '../../../src/errors/AuthError'; import { confirmUserAttribute } from '../../../src/providers/cognito'; import { VerifyUserAttributeException } from '../../../src/providers/cognito/types/errors'; -import { verifyUserAttribute } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; import { AuthValidationErrorCode } from '../../../src/errors/types/validation'; +import { createVerifyUserAttributeClient } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../../../src/providers/cognito/factories'; import { getMockError, mockAccessToken } from './testUtils/data'; import { setUpGetConfig } from './testUtils/setUpGetConfig'; @@ -22,14 +23,21 @@ jest.mock('@aws-amplify/core/internals/utils', () => ({ isBrowser: jest.fn(() => false), })); jest.mock( - '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider', + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', ); +jest.mock('../../../src/providers/cognito/factories'); describe('confirmUserAttribute', () => { const confirmationCode = '123456'; // assert mocks const mockFetchAuthSession = fetchAuthSession as jest.Mock; - const mockVerifyUserAttribute = verifyUserAttribute as jest.Mock; + const mockVerifyUserAttribute = jest.fn(); + const mockCreateVerifyUserAttributeClient = jest.mocked( + createVerifyUserAttributeClient, + ); + const mockCreateCognitoUserPoolEndpointResolver = jest.mocked( + createCognitoUserPoolEndpointResolver, + ); beforeAll(() => { setUpGetConfig(Amplify); @@ -40,11 +48,15 @@ describe('confirmUserAttribute', () => { beforeEach(() => { mockVerifyUserAttribute.mockResolvedValue({ $metadata: {} }); + mockCreateVerifyUserAttributeClient.mockReturnValueOnce( + mockVerifyUserAttribute, + ); }); afterEach(() => { mockVerifyUserAttribute.mockReset(); mockFetchAuthSession.mockClear(); + mockCreateVerifyUserAttributeClient.mockClear(); }); it('should call the service', async () => { @@ -63,6 +75,28 @@ describe('confirmUserAttribute', () => { ); }); + it('invokes mockCreateCognitoUserPoolEndpointResolver with expected endpointOverride', async () => { + const expectedUserPoolEndpoint = 'https://my-custom-endpoint.com'; + jest.mocked(Amplify.getConfig).mockReturnValueOnce({ + Auth: { + Cognito: { + userPoolClientId: '111111-aaaaa-42d8-891d-ee81a1549398', + userPoolId: 'us-west-2_zzzzz', + identityPoolId: 'us-west-2:xxxxxx', + userPoolEndpoint: expectedUserPoolEndpoint, + }, + }, + }); + await confirmUserAttribute({ + userAttributeKey: 'email', + confirmationCode, + }); + + expect(mockCreateCognitoUserPoolEndpointResolver).toHaveBeenCalledWith({ + endpointOverride: expectedUserPoolEndpoint, + }); + }); + it('should throw an error when confirmationCode is not defined', async () => { try { await confirmUserAttribute({ diff --git a/packages/auth/__tests__/providers/cognito/credentialsProvider/IdentityIdStore.test.ts b/packages/auth/__tests__/providers/cognito/credentialsProvider/IdentityIdStore.test.ts new file mode 100644 index 00000000000..94475367ec3 --- /dev/null +++ b/packages/auth/__tests__/providers/cognito/credentialsProvider/IdentityIdStore.test.ts @@ -0,0 +1,125 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { Identity, ResourcesConfig } from '@aws-amplify/core'; + +import { DefaultIdentityIdStore } from '../../../../src/providers/cognito/credentialsProvider/IdentityIdStore'; + +const mockKeyValueStorage = { + setItem: jest.fn(), + getItem: jest.fn(), + removeItem: jest.fn(), + clear: jest.fn(), +}; + +const validAuthConfig: ResourcesConfig = { + Auth: { + Cognito: { + userPoolId: 'us-east-1_test-id', + identityPoolId: 'us-east-1:test-id', + userPoolClientId: 'test-id', + allowGuestAccess: true, + }, + }, +}; +const validAuthKey = { + identityId: `com.amplify.Cognito.${ + validAuthConfig.Auth!.Cognito!.identityPoolId + }.identityId`, +}; +const validGuestIdentityId: Identity = { type: 'guest', id: 'guest-id' }; +const validPrimaryIdentityId: Identity = { type: 'primary', id: 'primary-id' }; + +const noIdentityPoolIdAuthConfig: ResourcesConfig = { + Auth: { + Cognito: { + userPoolId: 'us-east-1_test-id', + userPoolClientId: 'test-id', + }, + }, +}; + +describe('DefaultIdentityIdStore', () => { + const defaultIdStore = new DefaultIdentityIdStore(mockKeyValueStorage); + beforeAll(() => { + defaultIdStore.setAuthConfig(validAuthConfig.Auth!); + }); + + afterEach(() => { + mockKeyValueStorage.setItem.mockClear(); + mockKeyValueStorage.getItem.mockClear(); + mockKeyValueStorage.removeItem.mockClear(); + mockKeyValueStorage.clear.mockClear(); + }); + + it('should set the Auth config required to form the storage keys', async () => { + expect(defaultIdStore._authKeys).toEqual(validAuthKey); + }); + + it('should store guest identityId in keyValueStorage', async () => { + defaultIdStore.storeIdentityId(validGuestIdentityId); + expect(mockKeyValueStorage.setItem).toHaveBeenCalledWith( + validAuthKey.identityId, + validGuestIdentityId.id, + ); + expect(defaultIdStore._primaryIdentityId).toBeUndefined(); + expect(defaultIdStore._hasGuestIdentityId).toBe(true); + }); + + it('should load guest identityId from keyValueStorage', async () => { + mockKeyValueStorage.getItem.mockReturnValue(validGuestIdentityId.id); + + expect(await defaultIdStore.loadIdentityId()).toEqual(validGuestIdentityId); + }); + + it('should store primary identityId in keyValueStorage', async () => { + defaultIdStore.storeIdentityId(validPrimaryIdentityId); + expect(mockKeyValueStorage.removeItem).toHaveBeenCalledWith( + validAuthKey.identityId, + ); + expect(defaultIdStore._primaryIdentityId).toEqual( + validPrimaryIdentityId.id, + ); + expect(defaultIdStore._hasGuestIdentityId).toBe(false); + }); + + it('should load primary identityId from keyValueStorage', async () => { + expect(await defaultIdStore.loadIdentityId()).toEqual( + validPrimaryIdentityId, + ); + }); + + it('should clear the cached identityId', async () => { + defaultIdStore.clearIdentityId(); + expect(mockKeyValueStorage.removeItem).toHaveBeenCalledWith( + validAuthKey.identityId, + ); + expect(defaultIdStore._primaryIdentityId).toBeUndefined(); + }); + + it('should throw when identityPoolId is not present while setting the auth config', async () => { + expect(() => { + defaultIdStore.setAuthConfig(noIdentityPoolIdAuthConfig.Auth!); + }).toThrow('Invalid identity pool id provided.'); + }); + + it('should return null when the underlying keyValueStorage method returns null', async () => { + mockKeyValueStorage.getItem.mockReturnValue(null); + expect(await defaultIdStore.loadIdentityId()).toBeNull(); + }); + + it('should return null when the underlying keyValueStorage method throws', async () => { + mockKeyValueStorage.getItem.mockRejectedValue(new Error('Error')); + expect(await defaultIdStore.loadIdentityId()).toBeNull(); + }); + + it('should not call keyValueStorage.removeItem when there is no guest identityId to clear', async () => { + const refreshIdentityIdStore = new DefaultIdentityIdStore( + mockKeyValueStorage, + ); + refreshIdentityIdStore.setAuthConfig(validAuthConfig.Auth!); + + refreshIdentityIdStore.storeIdentityId(validPrimaryIdentityId); + expect(mockKeyValueStorage.removeItem).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/auth/__tests__/providers/cognito/deleteUser.test.ts b/packages/auth/__tests__/providers/cognito/deleteUser.test.ts index ec1cf3a90d9..b56e9736e12 100644 --- a/packages/auth/__tests__/providers/cognito/deleteUser.test.ts +++ b/packages/auth/__tests__/providers/cognito/deleteUser.test.ts @@ -7,9 +7,10 @@ import { decodeJWT } from '@aws-amplify/core/internals/utils'; import { AuthError } from '../../../src/errors/AuthError'; import { deleteUser } from '../../../src/providers/cognito'; import { tokenOrchestrator } from '../../../src/providers/cognito/tokenProvider'; -import { deleteUser as providerDeleteUser } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; import { DeleteUserException } from '../../../src/providers/cognito/types/errors'; import { signOut } from '../../../src/providers/cognito/apis/signOut'; +import { createDeleteUserClient } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../../../src/providers/cognito/factories'; import { getMockError, mockAccessToken } from './testUtils/data'; import { setUpGetConfig } from './testUtils/setUpGetConfig'; @@ -23,18 +24,23 @@ jest.mock('@aws-amplify/core/internals/utils', () => ({ isBrowser: jest.fn(() => false), })); jest.mock('../../../src/providers/cognito/apis/signOut'); +jest.mock('../../../src/providers/cognito/tokenProvider'); jest.mock( - '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider', + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', ); -jest.mock('../../../src/providers/cognito/tokenProvider'); +jest.mock('../../../src/providers/cognito/factories'); describe('deleteUser', () => { // assert mocks const mockFetchAuthSession = fetchAuthSession as jest.Mock; - const mockDeleteUser = providerDeleteUser as jest.Mock; + const mockDeleteUser = jest.fn(); + const mockCreateDeleteUserClient = jest.mocked(createDeleteUserClient); const mockSignOut = signOut as jest.Mock; const mockClearDeviceMetadata = tokenOrchestrator.clearDeviceMetadata as jest.Mock; + const mockCreateCognitoUserPoolEndpointResolver = jest.mocked( + createCognitoUserPoolEndpointResolver, + ); beforeAll(() => { setUpGetConfig(Amplify); @@ -45,12 +51,14 @@ describe('deleteUser', () => { beforeEach(() => { mockDeleteUser.mockResolvedValue({ $metadata: {} }); + mockCreateDeleteUserClient.mockReturnValueOnce(mockDeleteUser); }); afterEach(() => { mockDeleteUser.mockReset(); mockClearDeviceMetadata.mockClear(); mockFetchAuthSession.mockClear(); + mockCreateDeleteUserClient.mockClear(); }); it('should delete user, sign out and clear device tokens', async () => { @@ -72,6 +80,25 @@ describe('deleteUser', () => { ); }); + it('invokes mockCreateCognitoUserPoolEndpointResolver with expected endpointOverride', async () => { + const expectedUserPoolEndpoint = 'https://my-custom-endpoint.com'; + jest.mocked(Amplify.getConfig).mockReturnValueOnce({ + Auth: { + Cognito: { + userPoolClientId: '111111-aaaaa-42d8-891d-ee81a1549398', + userPoolId: 'us-west-2_zzzzz', + identityPoolId: 'us-west-2:xxxxxx', + userPoolEndpoint: expectedUserPoolEndpoint, + }, + }, + }); + await deleteUser(); + + expect(mockCreateCognitoUserPoolEndpointResolver).toHaveBeenCalledWith({ + endpointOverride: expectedUserPoolEndpoint, + }); + }); + it('should throw an error when service returns an error response', async () => { expect.assertions(2); mockDeleteUser.mockImplementation(() => { diff --git a/packages/auth/__tests__/providers/cognito/deleteUserAttributes.test.ts b/packages/auth/__tests__/providers/cognito/deleteUserAttributes.test.ts index 959592a5b87..c791b224fdb 100644 --- a/packages/auth/__tests__/providers/cognito/deleteUserAttributes.test.ts +++ b/packages/auth/__tests__/providers/cognito/deleteUserAttributes.test.ts @@ -7,7 +7,8 @@ import { decodeJWT } from '@aws-amplify/core/internals/utils'; import { AuthError } from '../../../src/errors/AuthError'; import { deleteUserAttributes } from '../../../src/providers/cognito'; import { DeleteUserAttributesException } from '../../../src/providers/cognito/types/errors'; -import { deleteUserAttributes as providerDeleteUserAttributes } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; +import { createDeleteUserAttributesClient } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../../../src/providers/cognito/factories'; import { getMockError, mockAccessToken } from './testUtils/data'; import { setUpGetConfig } from './testUtils/setUpGetConfig'; @@ -21,13 +22,20 @@ jest.mock('@aws-amplify/core/internals/utils', () => ({ isBrowser: jest.fn(() => false), })); jest.mock( - '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider', + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', ); +jest.mock('../../../src/providers/cognito/factories'); describe('deleteUserAttributes', () => { // assert mocks const mockFetchAuthSession = fetchAuthSession as jest.Mock; - const mockDeleteUserAttributes = providerDeleteUserAttributes as jest.Mock; + const mockDeleteUserAttributes = jest.fn(); + const mockCreateDeleteUserAttributesClient = jest.mocked( + createDeleteUserAttributesClient, + ); + const mockCreateCognitoUserPoolEndpointResolver = jest.mocked( + createCognitoUserPoolEndpointResolver, + ); beforeAll(() => { setUpGetConfig(Amplify); @@ -38,11 +46,15 @@ describe('deleteUserAttributes', () => { beforeEach(() => { mockDeleteUserAttributes.mockResolvedValue({ $metadata: {} }); + mockCreateDeleteUserAttributesClient.mockReturnValueOnce( + mockDeleteUserAttributes, + ); }); afterEach(() => { mockDeleteUserAttributes.mockReset(); mockFetchAuthSession.mockClear(); + mockCreateDeleteUserAttributesClient.mockClear(); }); it('should delete user attributes', async () => { @@ -60,6 +72,27 @@ describe('deleteUserAttributes', () => { expect(mockDeleteUserAttributes).toHaveBeenCalledTimes(1); }); + it('invokes mockCreateCognitoUserPoolEndpointResolver with expected endpointOverride', async () => { + const expectedUserPoolEndpoint = 'https://my-custom-endpoint.com'; + jest.mocked(Amplify.getConfig).mockReturnValueOnce({ + Auth: { + Cognito: { + userPoolClientId: '111111-aaaaa-42d8-891d-ee81a1549398', + userPoolId: 'us-west-2_zzzzz', + identityPoolId: 'us-west-2:xxxxxx', + userPoolEndpoint: expectedUserPoolEndpoint, + }, + }, + }); + await deleteUserAttributes({ + userAttributeKeys: ['given_name', 'address'], + }); + + expect(mockCreateCognitoUserPoolEndpointResolver).toHaveBeenCalledWith({ + endpointOverride: expectedUserPoolEndpoint, + }); + }); + it('should throw an error when service returns an error response', async () => { expect.assertions(2); mockDeleteUserAttributes.mockImplementation(() => { diff --git a/packages/auth/__tests__/providers/cognito/factories/createCognitoUserPoolEndpointResolver.test.ts b/packages/auth/__tests__/providers/cognito/factories/createCognitoUserPoolEndpointResolver.test.ts new file mode 100644 index 00000000000..1c499146921 --- /dev/null +++ b/packages/auth/__tests__/providers/cognito/factories/createCognitoUserPoolEndpointResolver.test.ts @@ -0,0 +1,55 @@ +import { AmplifyUrl } from '@aws-amplify/core/internals/utils'; + +import { cognitoUserPoolEndpointResolver } from '../../../../src/foundation/cognitoUserPoolEndpointResolver'; +import { createCognitoUserPoolEndpointResolver } from '../../../../src/providers/cognito/factories/createCognitoUserPoolEndpointResolver'; + +jest.mock('../../../../src/foundation/cognitoUserPoolEndpointResolver'); + +const mockCognitoUserPoolEndpointResolver = jest.mocked( + cognitoUserPoolEndpointResolver, +); + +describe('createCognitoUserPoolEndpointResolver()', () => { + afterEach(() => { + mockCognitoUserPoolEndpointResolver.mockClear(); + }); + + describe('creating a resolver with overrideEndpoint as `undefined`', () => { + const resolver = createCognitoUserPoolEndpointResolver({ + endpointOverride: undefined, + }); + + it('invokes cognitoUserPoolEndpointResolver with the expected region', () => { + const expectedReturningUrl = { + url: new AmplifyUrl('https://cognito-idp.us-west-2.amazonaws.com/'), + }; + mockCognitoUserPoolEndpointResolver.mockReturnValueOnce( + expectedReturningUrl, + ); + + const expectedRegion = 'us-west-2'; + const { url } = resolver({ region: expectedRegion }); + + expect(mockCognitoUserPoolEndpointResolver).toHaveBeenCalledWith({ + region: expectedRegion, + }); + expect(url).toStrictEqual(expectedReturningUrl.url); + }); + }); + + describe('creating a resolver with overrideEndpoint', () => { + const endpointOverride = 'https://cognito-idp.example.com'; + const resolver = createCognitoUserPoolEndpointResolver({ + endpointOverride, + }); + + it('returns the endpoint override', () => { + const expectedRegion = 'us-west-2'; + const { url } = resolver({ region: expectedRegion }); + expect(mockCognitoUserPoolEndpointResolver).not.toHaveBeenCalled(); + expect(url).toStrictEqual( + new AmplifyUrl('https://cognito-idp.example.com'), + ); + }); + }); +}); diff --git a/packages/auth/__tests__/providers/cognito/fetchDevices.test.ts b/packages/auth/__tests__/providers/cognito/fetchDevices.test.ts index 1e8a48ab84e..4cdb79a13bd 100644 --- a/packages/auth/__tests__/providers/cognito/fetchDevices.test.ts +++ b/packages/auth/__tests__/providers/cognito/fetchDevices.test.ts @@ -6,8 +6,9 @@ import { decodeJWT } from '@aws-amplify/core/internals/utils'; import { AuthError } from '../../../src/errors/AuthError'; import { fetchDevices } from '../../../src/providers/cognito'; -import { listDevices } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; import { ListDevicesException } from '../../../src/providers/cognito/types/errors'; +import { createListDevicesClient } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../../../src/providers/cognito/factories'; import { getMockError, mockAccessToken } from './testUtils/data'; import { setUpGetConfig } from './testUtils/setUpGetConfig'; @@ -21,8 +22,9 @@ jest.mock('@aws-amplify/core/internals/utils', () => ({ isBrowser: jest.fn(() => false), })); jest.mock( - '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider', + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', ); +jest.mock('../../../src/providers/cognito/factories'); describe('fetchDevices', () => { const dateEpoch = 1.696296885807e9; @@ -51,7 +53,11 @@ describe('fetchDevices', () => { }; // assert mocks const mockFetchAuthSession = fetchAuthSession as jest.Mock; - const mockListDevices = listDevices as jest.Mock; + const mockListDevices = jest.fn(); + const mockCreateListDevicesClient = jest.mocked(createListDevicesClient); + const mockCreateCognitoUserPoolEndpointResolver = jest.mocked( + createCognitoUserPoolEndpointResolver, + ); beforeAll(() => { setUpGetConfig(Amplify); @@ -65,11 +71,13 @@ describe('fetchDevices', () => { Devices: [clientResponseDevice], $metadata: {}, }); + mockCreateListDevicesClient.mockReturnValueOnce(mockListDevices); }); afterEach(() => { mockListDevices.mockReset(); mockFetchAuthSession.mockClear(); + mockCreateListDevicesClient.mockClear(); }); it('should fetch devices and parse client response correctly', async () => { @@ -84,6 +92,25 @@ describe('fetchDevices', () => { expect(mockListDevices).toHaveBeenCalledTimes(1); }); + it('invokes mockCreateCognitoUserPoolEndpointResolver with expected endpointOverride', async () => { + const expectedUserPoolEndpoint = 'https://my-custom-endpoint.com'; + jest.mocked(Amplify.getConfig).mockReturnValueOnce({ + Auth: { + Cognito: { + userPoolClientId: '111111-aaaaa-42d8-891d-ee81a1549398', + userPoolId: 'us-west-2_zzzzz', + identityPoolId: 'us-west-2:xxxxxx', + userPoolEndpoint: expectedUserPoolEndpoint, + }, + }, + }); + await fetchDevices(); + + expect(mockCreateCognitoUserPoolEndpointResolver).toHaveBeenCalledWith({ + endpointOverride: expectedUserPoolEndpoint, + }); + }); + it('should throw an error when service returns an error response', async () => { expect.assertions(2); mockListDevices.mockImplementation(() => { diff --git a/packages/auth/__tests__/providers/cognito/fetchMFAPreference.test.ts b/packages/auth/__tests__/providers/cognito/fetchMFAPreference.test.ts index ed2517a358e..c4d8a7a9efa 100644 --- a/packages/auth/__tests__/providers/cognito/fetchMFAPreference.test.ts +++ b/packages/auth/__tests__/providers/cognito/fetchMFAPreference.test.ts @@ -4,10 +4,11 @@ import { Amplify, fetchAuthSession } from '@aws-amplify/core'; import { decodeJWT } from '@aws-amplify/core/internals/utils'; -import { getUser } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; import { AuthError } from '../../../src/errors/AuthError'; import { fetchMFAPreference } from '../../../src/providers/cognito/apis/fetchMFAPreference'; import { GetUserException } from '../../../src/providers/cognito/types/errors'; +import { createGetUserClient } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../../../src/providers/cognito/factories'; import { getMockError, mockAccessToken } from './testUtils/data'; import { setUpGetConfig } from './testUtils/setUpGetConfig'; @@ -17,13 +18,18 @@ jest.mock('@aws-amplify/core', () => ({ Amplify: { getConfig: jest.fn(() => ({})) }, })); jest.mock( - '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider', + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', ); +jest.mock('../../../src/providers/cognito/factories'); describe('fetchMFAPreference', () => { // assert mocks const mockFetchAuthSession = fetchAuthSession as jest.Mock; - const mockGetUser = getUser as jest.Mock; + const mockGetUser = jest.fn(); + const mockCreateGetUserClient = jest.mocked(createGetUserClient); + const mockCreateCognitoUserPoolEndpointResolver = jest.mocked( + createCognitoUserPoolEndpointResolver, + ); beforeAll(() => { setUpGetConfig(Amplify); @@ -40,6 +46,7 @@ describe('fetchMFAPreference', () => { UserMFASettingList: ['SMS_MFA', 'SOFTWARE_TOKEN_MFA'], $metadata: {}, }); + mockCreateGetUserClient.mockReturnValueOnce(mockGetUser); }); afterEach(() => { @@ -62,6 +69,25 @@ describe('fetchMFAPreference', () => { ); }); + it('invokes mockCreateCognitoUserPoolEndpointResolver with expected endpointOverride', async () => { + const expectedUserPoolEndpoint = 'https://my-custom-endpoint.com'; + jest.mocked(Amplify.getConfig).mockReturnValueOnce({ + Auth: { + Cognito: { + userPoolClientId: '111111-aaaaa-42d8-891d-ee81a1549398', + userPoolId: 'us-west-2_zzzzz', + identityPoolId: 'us-west-2:xxxxxx', + userPoolEndpoint: expectedUserPoolEndpoint, + }, + }, + }); + await fetchMFAPreference(); + + expect(mockCreateCognitoUserPoolEndpointResolver).toHaveBeenCalledWith({ + endpointOverride: expectedUserPoolEndpoint, + }); + }); + it('should throw an error when service returns an error response', async () => { expect.assertions(2); mockGetUser.mockImplementation(() => { diff --git a/packages/auth/__tests__/providers/cognito/fetchUserAttributes.test.ts b/packages/auth/__tests__/providers/cognito/fetchUserAttributes.test.ts index cff5ff01b64..87cf79e715d 100644 --- a/packages/auth/__tests__/providers/cognito/fetchUserAttributes.test.ts +++ b/packages/auth/__tests__/providers/cognito/fetchUserAttributes.test.ts @@ -4,10 +4,11 @@ import { Amplify } from '@aws-amplify/core'; import { decodeJWT, fetchAuthSession } from '@aws-amplify/core/internals/utils'; -import { getUser } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; import { AuthError } from '../../../src/errors/AuthError'; import { GetUserException } from '../../../src/providers/cognito/types/errors'; import { fetchUserAttributes } from '../../../src/providers/cognito/apis/fetchUserAttributes'; +import { createGetUserClient } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../../../src/providers/cognito/factories'; import { getMockError, mockAccessToken } from './testUtils/data'; import { setUpGetConfig } from './testUtils/setUpGetConfig'; @@ -21,13 +22,18 @@ jest.mock('@aws-amplify/core/internals/utils', () => ({ fetchAuthSession: jest.fn(), })); jest.mock( - '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider', + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', ); +jest.mock('../../../src/providers/cognito/factories'); describe('fetchUserAttributes', () => { // assert mocks const mockFetchAuthSession = fetchAuthSession as jest.Mock; - const mockGetUser = getUser as jest.Mock; + const mockGetUser = jest.fn(); + const mockCreateGetUserClient = jest.mocked(createGetUserClient); + const mockCreateCognitoUserPoolEndpointResolver = jest.mocked( + createCognitoUserPoolEndpointResolver, + ); beforeAll(() => { setUpGetConfig(Amplify); @@ -47,11 +53,13 @@ describe('fetchUserAttributes', () => { UserMFASettingList: ['SMS_MFA', 'SOFTWARE_TOKEN_MFA'], $metadata: {}, }); + mockCreateGetUserClient.mockReturnValueOnce(mockGetUser); }); afterEach(() => { mockGetUser.mockReset(); mockFetchAuthSession.mockClear(); + mockCreateGetUserClient.mockClear(); }); it('should return the current user attributes into a map format', async () => { @@ -71,6 +79,25 @@ describe('fetchUserAttributes', () => { ); }); + it('invokes mockCreateCognitoUserPoolEndpointResolver with expected endpointOverride', async () => { + const expectedUserPoolEndpoint = 'https://my-custom-endpoint.com'; + jest.mocked(Amplify.getConfig).mockReturnValueOnce({ + Auth: { + Cognito: { + userPoolClientId: '111111-aaaaa-42d8-891d-ee81a1549398', + userPoolId: 'us-west-2_zzzzz', + identityPoolId: 'us-west-2:xxxxxx', + userPoolEndpoint: expectedUserPoolEndpoint, + }, + }, + }); + await fetchUserAttributes(); + + expect(mockCreateCognitoUserPoolEndpointResolver).toHaveBeenCalledWith({ + endpointOverride: expectedUserPoolEndpoint, + }); + }); + it('should throw an error when service returns an error response', async () => { expect.assertions(2); mockGetUser.mockImplementation(() => { diff --git a/packages/auth/__tests__/providers/cognito/forgetDevice.test.ts b/packages/auth/__tests__/providers/cognito/forgetDevice.test.ts index 6371e2b41a8..cc0a2d37407 100644 --- a/packages/auth/__tests__/providers/cognito/forgetDevice.test.ts +++ b/packages/auth/__tests__/providers/cognito/forgetDevice.test.ts @@ -8,8 +8,9 @@ import { AuthError } from '../../../src/errors/AuthError'; import { DEVICE_METADATA_NOT_FOUND_EXCEPTION } from '../../../src/errors/constants'; import { forgetDevice } from '../../../src/providers/cognito'; import { ForgetDeviceException } from '../../../src/providers/cognito/types/errors'; -import { forgetDevice as providerForgetDevice } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; import { tokenOrchestrator } from '../../../src/providers/cognito/tokenProvider'; +import { createForgetDeviceClient } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../../../src/providers/cognito/factories'; import { getMockError, mockAccessToken } from './testUtils/data'; import { setUpGetConfig } from './testUtils/setUpGetConfig'; @@ -22,10 +23,11 @@ jest.mock('@aws-amplify/core/internals/utils', () => ({ ...jest.requireActual('@aws-amplify/core/internals/utils'), isBrowser: jest.fn(() => false), })); +jest.mock('../../../src/providers/cognito/tokenProvider'); jest.mock( - '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider', + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', ); -jest.mock('../../../src/providers/cognito/tokenProvider'); +jest.mock('../../../src/providers/cognito/factories'); describe('fetchMFAPreference', () => { const mockDeviceMetadata = { @@ -35,11 +37,15 @@ describe('fetchMFAPreference', () => { }; // assert mocks const mockFetchAuthSession = fetchAuthSession as jest.Mock; - const mockForgetDevice = providerForgetDevice as jest.Mock; + const mockForgetDevice = jest.fn(); + const mockCreateForgetDeviceClient = jest.mocked(createForgetDeviceClient); const mockClearDeviceMetadata = tokenOrchestrator.clearDeviceMetadata as jest.Mock; const mockGetDeviceMetadata = tokenOrchestrator.getDeviceMetadata as jest.Mock; + const mockCreateCognitoUserPoolEndpointResolver = jest.mocked( + createCognitoUserPoolEndpointResolver, + ); beforeAll(() => { setUpGetConfig(Amplify); @@ -51,6 +57,7 @@ describe('fetchMFAPreference', () => { beforeEach(() => { mockForgetDevice.mockResolvedValue({ $metadata: {} }); mockGetDeviceMetadata.mockResolvedValue(mockDeviceMetadata); + mockCreateForgetDeviceClient.mockReturnValueOnce(mockForgetDevice); }); afterEach(() => { @@ -58,6 +65,7 @@ describe('fetchMFAPreference', () => { mockGetDeviceMetadata.mockReset(); mockFetchAuthSession.mockClear(); mockClearDeviceMetadata.mockClear(); + mockCreateForgetDeviceClient.mockClear(); }); it(`should forget 'external device' 'with' inputParams when tokenStore deviceMetadata 'present'`, async () => { @@ -74,6 +82,25 @@ describe('fetchMFAPreference', () => { expect(mockClearDeviceMetadata).not.toHaveBeenCalled(); }); + it('invokes mockCreateCognitoUserPoolEndpointResolver with expected endpointOverride', async () => { + const expectedUserPoolEndpoint = 'https://my-custom-endpoint.com'; + jest.mocked(Amplify.getConfig).mockReturnValueOnce({ + Auth: { + Cognito: { + userPoolClientId: '111111-aaaaa-42d8-891d-ee81a1549398', + userPoolId: 'us-west-2_zzzzz', + identityPoolId: 'us-west-2:xxxxxx', + userPoolEndpoint: expectedUserPoolEndpoint, + }, + }, + }); + await forgetDevice({ device: { id: 'externalDeviceKey' } }); + + expect(mockCreateCognitoUserPoolEndpointResolver).toHaveBeenCalledWith({ + endpointOverride: expectedUserPoolEndpoint, + }); + }); + it(`should forget 'current device' 'with' inputParams when tokenStore deviceMetadata 'present'`, async () => { expect.assertions(3); await forgetDevice({ device: { id: mockDeviceMetadata.deviceKey } }); diff --git a/packages/auth/__tests__/providers/cognito/getNewDeviceMetadata.test.ts b/packages/auth/__tests__/providers/cognito/getNewDeviceMetadata.test.ts index cb600ce133e..6058fc363b7 100644 --- a/packages/auth/__tests__/providers/cognito/getNewDeviceMetadata.test.ts +++ b/packages/auth/__tests__/providers/cognito/getNewDeviceMetadata.test.ts @@ -5,11 +5,17 @@ import { Amplify } from '@aws-amplify/core'; import { AuthError } from '../../../src/errors/AuthError'; import { ConfirmDeviceException } from '../../../src/providers/cognito/types/errors'; -import * as clients from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; -import { ConfirmDeviceCommandOutput } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider/types'; -import { getNewDeviceMetatada } from '../../../src/providers/cognito/utils/signInHelpers'; +import { getNewDeviceMetadata } from '../../../src/providers/cognito/utils/signInHelpers'; +import { createCognitoUserPoolEndpointResolver } from '../../../src/providers/cognito/factories'; +import { createConfirmDeviceClient } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; + +jest.mock('../../../src/providers/cognito/factories'); +jest.mock( + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', +); const userPoolId = 'us-west-2_zzzzz'; + Amplify.configure({ Auth: { Cognito: { @@ -22,66 +28,95 @@ Amplify.configure({ const mockedAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'; +const mockCreateCognitoUserPoolEndpointResolver = jest.mocked( + createCognitoUserPoolEndpointResolver, +); + describe('test getNewDeviceMetadata API', () => { + const mockConfirmDevice = jest.fn(); + const mockCreateConfirmDeviceClient = jest.mocked(createConfirmDeviceClient); + + beforeEach(() => { + mockCreateConfirmDeviceClient.mockReturnValueOnce(mockConfirmDevice); + }); + + afterEach(() => { + mockConfirmDevice.mockClear(); + mockCreateConfirmDeviceClient.mockClear(); + }); + test('getNewDeviceMetadata should call confirmDevice and return DeviceMetadata', async () => { - const confirmDeviceClientSpy = jest - .spyOn(clients, 'confirmDevice') - .mockImplementationOnce(async (): Promise => { - return { UserConfirmationNecessary: true, $metadata: {} }; - }); + mockConfirmDevice.mockResolvedValueOnce({ + UserConfirmationNecessary: true, + $metadata: {}, + }); + const mockedDeviceKey = 'mockedDeviceKey'; const mockedGroupDeviceKey = 'mockedGroupDeviceKey'; - const deviceMetadata = await getNewDeviceMetatada( + const deviceMetadata = await getNewDeviceMetadata({ userPoolId, - { + userPoolEndpoint: undefined, + newDeviceMetadata: { DeviceKey: mockedDeviceKey, DeviceGroupKey: mockedGroupDeviceKey, }, - mockedAccessToken, - ); + accessToken: mockedAccessToken, + }); expect(deviceMetadata?.deviceKey).toBe(mockedDeviceKey); expect(deviceMetadata?.deviceGroupKey).toBe(mockedGroupDeviceKey); - expect(confirmDeviceClientSpy).toHaveBeenCalledWith( + expect(mockConfirmDevice).toHaveBeenCalledWith( expect.objectContaining({ region: 'us-west-2' }), expect.objectContaining({ AccessToken: mockedAccessToken, DeviceKey: mockedDeviceKey, }), ); - - confirmDeviceClientSpy.mockClear(); }); test('getNewDeviceMetadata should return undefined when ConfirmDevice throws an error', async () => { - const confirmDeviceClientSpy = jest - .spyOn(clients, 'confirmDevice') - .mockImplementationOnce(async (): Promise => { - throw new AuthError({ - name: ConfirmDeviceException.InternalErrorException, - message: 'error while calling confirmDevice', - }); - }); + mockConfirmDevice.mockRejectedValueOnce( + new AuthError({ + name: ConfirmDeviceException.InternalErrorException, + message: 'error while calling confirmDevice', + }), + ); const mockedDeviceKey = 'mockedDeviceKey'; const mockedGroupDeviceKey = 'mockedGroupDeviceKey'; - const deviceMetadata = await getNewDeviceMetatada( + const deviceMetadata = await getNewDeviceMetadata({ userPoolId, - { + userPoolEndpoint: undefined, + newDeviceMetadata: { DeviceKey: mockedDeviceKey, DeviceGroupKey: mockedGroupDeviceKey, }, - mockedAccessToken, - ); + accessToken: mockedAccessToken, + }); expect(deviceMetadata).toBeUndefined(); - expect(confirmDeviceClientSpy).toHaveBeenCalledWith( + expect(mockConfirmDevice).toHaveBeenCalledWith( expect.objectContaining({ region: 'us-west-2' }), expect.objectContaining({ AccessToken: mockedAccessToken, DeviceKey: mockedDeviceKey, }), ); + }); + + it('invokes createCognitoUserPoolEndpointResolver with expected userPoolEndpoint parameter', async () => { + const expectedEndpoint = 'https://custom-endpoint.com'; + await getNewDeviceMetadata({ + userPoolId, + userPoolEndpoint: expectedEndpoint, + newDeviceMetadata: { + DeviceKey: 'devicekey', + DeviceGroupKey: 'groupkey', + }, + accessToken: mockedAccessToken, + }); - confirmDeviceClientSpy.mockClear(); + expect(mockCreateCognitoUserPoolEndpointResolver).toHaveBeenCalledWith({ + endpointOverride: expectedEndpoint, + }); }); }); diff --git a/packages/auth/__tests__/providers/cognito/identityIdStore.test.ts b/packages/auth/__tests__/providers/cognito/identityIdStore.test.ts deleted file mode 100644 index 8eeb1fef5e3..00000000000 --- a/packages/auth/__tests__/providers/cognito/identityIdStore.test.ts +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -import { Identity, ResourcesConfig } from '@aws-amplify/core'; - -import { DefaultIdentityIdStore } from '../../../src/providers/cognito'; - -const mockKeyValueStorage = { - setItem: jest.fn(), - getItem: jest.fn(), - removeItem: jest.fn(), - clear: jest.fn(), -}; - -const validAuthConfig: ResourcesConfig = { - Auth: { - Cognito: { - userPoolId: 'us-east-1_test-id', - identityPoolId: 'us-east-1:test-id', - userPoolClientId: 'test-id', - allowGuestAccess: true, - }, - }, -}; -const validAuthKey = { - identityId: `com.amplify.Cognito.${ - validAuthConfig.Auth!.Cognito!.identityPoolId - }.identityId`, -}; -const validGuestIdentityId: Identity = { type: 'guest', id: 'guest-id' }; -const validPrimaryIdentityId: Identity = { type: 'primary', id: 'primary-id' }; - -const noIdentityPoolIdAuthConfig: ResourcesConfig = { - Auth: { - Cognito: { - userPoolId: 'us-east-1_test-id', - userPoolClientId: 'test-id', - }, - }, -}; - -describe('DefaultIdentityIdStore', () => { - const defaultIdStore = new DefaultIdentityIdStore(mockKeyValueStorage); - describe('Happy Path Cases:', () => { - beforeAll(() => { - defaultIdStore.setAuthConfig(validAuthConfig.Auth!); - }); - it('Should set the Auth config required to form the storage keys', async () => { - expect(defaultIdStore._authKeys).toEqual(validAuthKey); - }); - it('Should store guest identityId in keyValueStorage', async () => { - defaultIdStore.storeIdentityId(validGuestIdentityId); - expect(mockKeyValueStorage.setItem).toHaveBeenCalledWith( - validAuthKey.identityId, - validGuestIdentityId.id, - ); - expect(defaultIdStore._primaryIdentityId).toBeUndefined(); - }); - it('Should load guest identityId from keyValueStorage', async () => { - mockKeyValueStorage.getItem.mockReturnValue(validGuestIdentityId.id); - - expect(await defaultIdStore.loadIdentityId()).toEqual( - validGuestIdentityId, - ); - }); - it('Should store primary identityId in keyValueStorage', async () => { - defaultIdStore.storeIdentityId(validPrimaryIdentityId); - expect(mockKeyValueStorage.removeItem).toHaveBeenCalledWith( - validAuthKey.identityId, - ); - expect(defaultIdStore._primaryIdentityId).toEqual( - validPrimaryIdentityId.id, - ); - }); - it('Should load primary identityId from keyValueStorage', async () => { - expect(await defaultIdStore.loadIdentityId()).toEqual( - validPrimaryIdentityId, - ); - }); - it('Should clear the cached identityId', async () => { - defaultIdStore.clearIdentityId(); - expect(mockKeyValueStorage.removeItem).toHaveBeenCalledWith( - validAuthKey.identityId, - ); - expect(defaultIdStore._primaryIdentityId).toBeUndefined(); - }); - }); - describe('Error Path Cases:', () => { - it('Should assert when identityPoolId is not present while setting the auth config', async () => { - try { - defaultIdStore.setAuthConfig(noIdentityPoolIdAuthConfig.Auth!); - } catch (e: any) { - expect(e.name).toEqual('InvalidIdentityPoolIdException'); - } - }); - }); -}); diff --git a/packages/auth/__tests__/providers/cognito/refreshToken.test.ts b/packages/auth/__tests__/providers/cognito/refreshToken.test.ts index 86ac80a1fee..bef5cb28d61 100644 --- a/packages/auth/__tests__/providers/cognito/refreshToken.test.ts +++ b/packages/auth/__tests__/providers/cognito/refreshToken.test.ts @@ -2,23 +2,39 @@ import { decodeJWT } from '@aws-amplify/core/internals/utils'; import { refreshAuthTokens } from '../../../src/providers/cognito/utils/refreshAuthTokens'; import { CognitoAuthTokens } from '../../../src/providers/cognito/tokenProvider/types'; -import { initiateAuth } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; import { oAuthTokenRefreshException, tokenRefreshException, } from '../../../src/providers/cognito/utils/types'; +import { createInitiateAuthClient } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../../../src/providers/cognito/factories'; import { mockAccessToken, mockRequestId } from './testUtils/data'; jest.mock( - '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider', + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', +); +jest.mock('../../../src/providers/cognito/factories'); + +const mockCreateInitiateAuthClient = jest.mocked(createInitiateAuthClient); +const mockCreateCognitoUserPoolEndpointResolver = jest.mocked( + createCognitoUserPoolEndpointResolver, ); describe('refreshToken', () => { const mockedUsername = 'mockedUsername'; const mockedRefreshToken = 'mockedRefreshToken'; - // assert mocks - const mockInitiateAuth = initiateAuth as jest.Mock; + const mockInitiateAuth = jest.fn(); + + beforeEach(() => { + mockCreateInitiateAuthClient.mockReturnValueOnce(mockInitiateAuth); + }); + + afterEach(() => { + mockCreateInitiateAuthClient.mockClear(); + mockCreateCognitoUserPoolEndpointResolver.mockClear(); + }); + describe('positive cases', () => { beforeEach(() => { mockInitiateAuth.mockResolvedValue({ @@ -119,6 +135,39 @@ describe('refreshToken', () => { ); (window as any).AmazonCognitoAdvancedSecurityData = undefined; }); + + it('invokes mockCreateCognitoUserPoolEndpointResolver with expected parameters', async () => { + const expectedParam = 'https://my-custom-endpoint.com'; + const expectedEndpointResolver = jest.fn(); + mockCreateCognitoUserPoolEndpointResolver.mockReturnValueOnce( + expectedEndpointResolver, + ); + + await refreshAuthTokens({ + username: 'username', + tokens: { + accessToken: { payload: {} }, + idToken: { payload: {} }, + clockDrift: 0, + refreshToken: 'refreshtoken', + username: 'username', + }, + authConfig: { + Cognito: { + userPoolId: 'us-east-1_aaaaaaa', + userPoolClientId: 'aaaaaaaaaaaa', + userPoolEndpoint: expectedParam, + }, + }, + }); + + expect(mockCreateCognitoUserPoolEndpointResolver).toHaveBeenCalledWith({ + endpointOverride: expectedParam, + }); + expect(mockCreateInitiateAuthClient).toHaveBeenCalledWith({ + endpointResolver: expectedEndpointResolver, + }); + }); }); describe('negative cases', () => { @@ -153,6 +202,7 @@ describe('refreshToken', () => { }), ).rejects.toThrow(oAuthTokenRefreshException); }); + it('should throw an exception when cognito tokens are not available', async () => { await expect( refreshAuthTokens({ diff --git a/packages/auth/__tests__/providers/cognito/rememberDevice.test.ts b/packages/auth/__tests__/providers/cognito/rememberDevice.test.ts index 820b2a1ef5f..0521e928654 100644 --- a/packages/auth/__tests__/providers/cognito/rememberDevice.test.ts +++ b/packages/auth/__tests__/providers/cognito/rememberDevice.test.ts @@ -7,9 +7,10 @@ import { Amplify, fetchAuthSession } from '@aws-amplify/core'; import { AuthError } from '../../../src/errors/AuthError'; import { rememberDevice } from '../../../src/providers/cognito'; import { UpdateDeviceStatusException } from '../../../src/providers/cognito/types/errors'; -import { updateDeviceStatus } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; import { tokenOrchestrator } from '../../../src/providers/cognito/tokenProvider'; import { DeviceMetadata } from '../../../src/providers/cognito/tokenProvider/types'; +import { createUpdateDeviceStatusClient } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../../../src/providers/cognito/factories'; import { getMockError, mockAccessToken } from './testUtils/data'; import { setUpGetConfig } from './testUtils/setUpGetConfig'; @@ -23,8 +24,9 @@ jest.mock('@aws-amplify/core/internals/utils', () => ({ isBrowser: jest.fn(() => false), })); jest.mock( - '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider', + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', ); +jest.mock('../../../src/providers/cognito/factories'); jest.mock('../../../src/providers/cognito/tokenProvider'); describe('rememberDevice', () => { @@ -35,7 +37,13 @@ describe('rememberDevice', () => { }; // assert mocks const mockFetchAuthSession = fetchAuthSession as jest.Mock; - const mockUpdateDeviceStatus = updateDeviceStatus as jest.Mock; + const mockUpdateDeviceStatus = jest.fn(); + const mockCreateUpdateDeviceStatusClient = jest.mocked( + createUpdateDeviceStatusClient, + ); + const mockCreateCognitoUserPoolEndpointResolver = jest.mocked( + createCognitoUserPoolEndpointResolver, + ); const mockGetDeviceMetadata = tokenOrchestrator.getDeviceMetadata as jest.Mock; @@ -49,12 +57,16 @@ describe('rememberDevice', () => { beforeEach(() => { mockGetDeviceMetadata.mockResolvedValue(mockDeviceMetadata); mockUpdateDeviceStatus.mockResolvedValue({ $metadata: {} }); + mockCreateUpdateDeviceStatusClient.mockReturnValueOnce( + mockUpdateDeviceStatus, + ); }); afterEach(() => { mockGetDeviceMetadata.mockReset(); mockUpdateDeviceStatus.mockReset(); mockFetchAuthSession.mockClear(); + mockCreateUpdateDeviceStatusClient.mockClear(); }); it('should call updateDeviceStatus client with correct request', async () => { @@ -71,6 +83,25 @@ describe('rememberDevice', () => { expect(mockUpdateDeviceStatus).toHaveBeenCalledTimes(1); }); + it('invokes mockCreateCognitoUserPoolEndpointResolver with expected endpointOverride', async () => { + const expectedUserPoolEndpoint = 'https://my-custom-endpoint.com'; + jest.mocked(Amplify.getConfig).mockReturnValueOnce({ + Auth: { + Cognito: { + userPoolClientId: '111111-aaaaa-42d8-891d-ee81a1549398', + userPoolId: 'us-west-2_zzzzz', + identityPoolId: 'us-west-2:xxxxxx', + userPoolEndpoint: expectedUserPoolEndpoint, + }, + }, + }); + await rememberDevice(); + + expect(mockCreateCognitoUserPoolEndpointResolver).toHaveBeenCalledWith({ + endpointOverride: expectedUserPoolEndpoint, + }); + }); + it('should throw an error when service returns an error response', async () => { expect.assertions(2); mockUpdateDeviceStatus.mockImplementation(() => { diff --git a/packages/auth/__tests__/providers/cognito/resendSignUpCode.test.ts b/packages/auth/__tests__/providers/cognito/resendSignUpCode.test.ts index d723a69eda8..d351a950484 100644 --- a/packages/auth/__tests__/providers/cognito/resendSignUpCode.test.ts +++ b/packages/auth/__tests__/providers/cognito/resendSignUpCode.test.ts @@ -7,7 +7,8 @@ import { resendSignUpCode } from '../../../src/providers/cognito'; import { AuthValidationErrorCode } from '../../../src/errors/types/validation'; import { AuthError } from '../../../src/errors/AuthError'; import { ResendConfirmationException } from '../../../src/providers/cognito/types/errors'; -import { resendConfirmationCode } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; +import { createResendConfirmationCodeClient } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../../../src/providers/cognito/factories'; import { authAPITestParams } from './testUtils/authApiTestParams'; import { getMockError } from './testUtils/data'; @@ -22,13 +23,20 @@ jest.mock('@aws-amplify/core/internals/utils', () => ({ isBrowser: jest.fn(() => false), })); jest.mock( - '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider', + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', ); +jest.mock('../../../src/providers/cognito/factories'); describe('resendSignUpCode', () => { const { user1 } = authAPITestParams; // assert mocks - const mockResendConfirmationCode = resendConfirmationCode as jest.Mock; + const mockResendConfirmationCode = jest.fn(); + const mockCreateResendConfirmationCodeClient = jest.mocked( + createResendConfirmationCodeClient, + ); + const mockCreateCognitoUserPoolEndpointResolver = jest.mocked( + createCognitoUserPoolEndpointResolver, + ); beforeAll(() => { setUpGetConfig(Amplify); @@ -38,6 +46,9 @@ describe('resendSignUpCode', () => { mockResendConfirmationCode.mockResolvedValue( authAPITestParams.resendSignUpClientResult, ); + mockCreateResendConfirmationCodeClient.mockReturnValueOnce( + mockResendConfirmationCode, + ); }); afterEach(() => { @@ -63,6 +74,26 @@ describe('resendSignUpCode', () => { expect(mockResendConfirmationCode).toHaveBeenCalledTimes(1); }); + it('invokes createCognitoUserPoolEndpointResolver with expected endpointOverride', async () => { + const expectedUserPoolEndpoint = 'https://my-custom-endpoint.com'; + jest.mocked(Amplify.getConfig).mockReturnValueOnce({ + Auth: { + Cognito: { + userPoolClientId: '111111-aaaaa-42d8-891d-ee81a1549398', + userPoolId: 'us-west-2_zzzzz', + identityPoolId: 'us-west-2:xxxxxx', + userPoolEndpoint: expectedUserPoolEndpoint, + }, + }, + }); + await resendSignUpCode({ + username: user1.username, + }); + expect(mockCreateCognitoUserPoolEndpointResolver).toHaveBeenCalledWith({ + endpointOverride: expectedUserPoolEndpoint, + }); + }); + it('should throw an error when username is empty', async () => { expect.assertions(2); try { diff --git a/packages/auth/__tests__/providers/cognito/resetPassword.test.ts b/packages/auth/__tests__/providers/cognito/resetPassword.test.ts index 3432ae17c0a..41deeeb170a 100644 --- a/packages/auth/__tests__/providers/cognito/resetPassword.test.ts +++ b/packages/auth/__tests__/providers/cognito/resetPassword.test.ts @@ -6,7 +6,8 @@ import { AuthError } from '../../../src/errors/AuthError'; import { AuthValidationErrorCode } from '../../../src/errors/types/validation'; import { resetPassword } from '../../../src/providers/cognito'; import { ForgotPasswordException } from '../../../src/providers/cognito/types/errors'; -import { forgotPassword } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; +import { createForgotPasswordClient } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../../../src/providers/cognito/factories'; import { authAPITestParams } from './testUtils/authApiTestParams'; import { getMockError } from './testUtils/data'; @@ -21,12 +22,19 @@ jest.mock('@aws-amplify/core/internals/utils', () => ({ isBrowser: jest.fn(() => false), })); jest.mock( - '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider', + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', ); +jest.mock('../../../src/providers/cognito/factories'); describe('resetPassword', () => { // assert mocks - const mockForgotPassword = forgotPassword as jest.Mock; + const mockForgotPassword = jest.fn(); + const mockCreateForgotPasswordClient = jest.mocked( + createForgotPasswordClient, + ); + const mockCreateCognitoUserPoolEndpointResolver = jest.mocked( + createCognitoUserPoolEndpointResolver, + ); beforeAll(() => { setUpGetConfig(Amplify); @@ -36,10 +44,13 @@ describe('resetPassword', () => { mockForgotPassword.mockResolvedValue( authAPITestParams.resetPasswordHttpCallResult, ); + mockCreateForgotPasswordClient.mockReturnValueOnce(mockForgotPassword); }); afterEach(() => { mockForgotPassword.mockReset(); + mockCreateForgotPasswordClient.mockClear(); + mockCreateCognitoUserPoolEndpointResolver.mockClear(); }); it('should call forgotPassword and return a result', async () => { @@ -47,6 +58,26 @@ describe('resetPassword', () => { expect(result).toEqual(authAPITestParams.resetPasswordResult); }); + it('invokes createCognitoUserPoolEndpointResolver with expected endpointOverride', async () => { + const expectedUserPoolEndpoint = 'https://my-custom-endpoint.com'; + jest.mocked(Amplify.getConfig).mockReturnValueOnce({ + Auth: { + Cognito: { + userPoolClientId: '111111-aaaaa-42d8-891d-ee81a1549398', + userPoolId: 'us-west-2_zzzzz', + identityPoolId: 'us-west-2:xxxxxx', + userPoolEndpoint: expectedUserPoolEndpoint, + }, + }, + }); + + await resetPassword(authAPITestParams.resetPasswordRequest); + + expect(mockCreateCognitoUserPoolEndpointResolver).toHaveBeenCalledWith({ + endpointOverride: expectedUserPoolEndpoint, + }); + }); + it('should contain clientMetadata from request', async () => { await resetPassword({ username: 'username', diff --git a/packages/auth/__tests__/providers/cognito/sendUserAttributeVerificationCode.test.ts b/packages/auth/__tests__/providers/cognito/sendUserAttributeVerificationCode.test.ts index 2b236d1db5a..31376edf642 100644 --- a/packages/auth/__tests__/providers/cognito/sendUserAttributeVerificationCode.test.ts +++ b/packages/auth/__tests__/providers/cognito/sendUserAttributeVerificationCode.test.ts @@ -7,7 +7,8 @@ import { decodeJWT } from '@aws-amplify/core/internals/utils'; import { AuthError } from '../../../src/errors/AuthError'; import { sendUserAttributeVerificationCode } from '../../../src/providers/cognito'; import { GetUserAttributeVerificationException } from '../../../src/providers/cognito/types/errors'; -import { getUserAttributeVerificationCode } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; +import { createGetUserAttributeVerificationCodeClient } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../../../src/providers/cognito/factories'; import { authAPITestParams } from './testUtils/authApiTestParams'; import { getMockError, mockAccessToken } from './testUtils/data'; @@ -22,14 +23,20 @@ jest.mock('@aws-amplify/core/internals/utils', () => ({ isBrowser: jest.fn(() => false), })); jest.mock( - '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider', + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', ); +jest.mock('../../../src/providers/cognito/factories'); describe('sendUserAttributeVerificationCode', () => { // assert mocks const mockFetchAuthSession = fetchAuthSession as jest.Mock; - const mockGetUserAttributeVerificationCode = - getUserAttributeVerificationCode as jest.Mock; + const mockGetUserAttributeVerificationCode = jest.fn(); + const mockCreateGetUserAttributeVerificationCodeClient = jest.mocked( + createGetUserAttributeVerificationCodeClient, + ); + const mockCreateCognitoUserPoolEndpointResolver = jest.mocked( + createCognitoUserPoolEndpointResolver, + ); beforeAll(() => { setUpGetConfig(Amplify); @@ -42,11 +49,15 @@ describe('sendUserAttributeVerificationCode', () => { mockGetUserAttributeVerificationCode.mockResolvedValue( authAPITestParams.resendSignUpClientResult, ); + mockCreateGetUserAttributeVerificationCodeClient.mockReturnValueOnce( + mockGetUserAttributeVerificationCode, + ); }); afterEach(() => { mockGetUserAttributeVerificationCode.mockReset(); mockFetchAuthSession.mockClear(); + mockCreateGetUserAttributeVerificationCodeClient.mockClear(); }); it('should return a result', async () => { @@ -69,6 +80,30 @@ describe('sendUserAttributeVerificationCode', () => { expect(mockGetUserAttributeVerificationCode).toHaveBeenCalledTimes(1); }); + it('invokes mockCreateCognitoUserPoolEndpointResolver with expected endpointOverride', async () => { + const expectedUserPoolEndpoint = 'https://my-custom-endpoint.com'; + jest.mocked(Amplify.getConfig).mockReturnValueOnce({ + Auth: { + Cognito: { + userPoolClientId: '111111-aaaaa-42d8-891d-ee81a1549398', + userPoolId: 'us-west-2_zzzzz', + identityPoolId: 'us-west-2:xxxxxx', + userPoolEndpoint: expectedUserPoolEndpoint, + }, + }, + }); + await sendUserAttributeVerificationCode({ + userAttributeKey: 'email', + options: { + clientMetadata: { foo: 'bar' }, + }, + }); + + expect(mockCreateCognitoUserPoolEndpointResolver).toHaveBeenCalledWith({ + endpointOverride: expectedUserPoolEndpoint, + }); + }); + it('should throw an error when service returns an error response', async () => { expect.assertions(2); mockGetUserAttributeVerificationCode.mockImplementation(() => { diff --git a/packages/auth/__tests__/providers/cognito/setUpTOTP.test.ts b/packages/auth/__tests__/providers/cognito/setUpTOTP.test.ts index 1f7399093cc..1a7d0cfbc4b 100644 --- a/packages/auth/__tests__/providers/cognito/setUpTOTP.test.ts +++ b/packages/auth/__tests__/providers/cognito/setUpTOTP.test.ts @@ -6,8 +6,9 @@ import { decodeJWT } from '@aws-amplify/core/internals/utils'; import { AuthError } from '../../../src/errors/AuthError'; import { AssociateSoftwareTokenException } from '../../../src/providers/cognito/types/errors'; -import { associateSoftwareToken } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; import { setUpTOTP } from '../../../src/providers/cognito'; +import { createAssociateSoftwareTokenClient } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../../../src/providers/cognito/factories'; import { getMockError, mockAccessToken } from './testUtils/data'; import { setUpGetConfig } from './testUtils/setUpGetConfig'; @@ -21,14 +22,21 @@ jest.mock('@aws-amplify/core/internals/utils', () => ({ isBrowser: jest.fn(() => false), })); jest.mock( - '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider', + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', ); +jest.mock('../../../src/providers/cognito/factories'); describe('setUpTOTP', () => { const secretCode = 'secret-code'; // assert mocks const mockFetchAuthSession = fetchAuthSession as jest.Mock; - const mockAssociateSoftwareToken = associateSoftwareToken as jest.Mock; + const mockAssociateSoftwareToken = jest.fn(); + const mockCreateAssociateSoftwareTokenClient = jest.mocked( + createAssociateSoftwareTokenClient, + ); + const mockCreateCognitoUserPoolEndpointResolver = jest.mocked( + createCognitoUserPoolEndpointResolver, + ); beforeAll(() => { setUpGetConfig(Amplify); @@ -42,11 +50,15 @@ describe('setUpTOTP', () => { SecretCode: secretCode, $metadata: {}, }); + mockCreateAssociateSoftwareTokenClient.mockReturnValueOnce( + mockAssociateSoftwareToken, + ); }); afterEach(() => { mockAssociateSoftwareToken.mockReset(); mockFetchAuthSession.mockClear(); + mockCreateAssociateSoftwareTokenClient.mockClear(); }); it('setUpTOTP API should call the UserPoolClient and should return a TOTPSetupDetails', async () => { @@ -64,6 +76,26 @@ describe('setUpTOTP', () => { expect(result.getSetupUri('appName', 'amplify')).toBeInstanceOf(URL); }); + it('invokes mockCreateCognitoUserPoolEndpointResolver with expected endpointOverride', async () => { + const expectedUserPoolEndpoint = 'https://my-custom-endpoint.com'; + jest.mocked(Amplify.getConfig).mockReturnValueOnce({ + Auth: { + Cognito: { + userPoolClientId: '111111-aaaaa-42d8-891d-ee81a1549398', + userPoolId: 'us-west-2_zzzzz', + identityPoolId: 'us-west-2:xxxxxx', + userPoolEndpoint: expectedUserPoolEndpoint, + }, + }, + }); + + await setUpTOTP(); + + expect(mockCreateCognitoUserPoolEndpointResolver).toHaveBeenCalledWith({ + endpointOverride: expectedUserPoolEndpoint, + }); + }); + it('should throw an error when service returns an error response', async () => { expect.assertions(2); mockAssociateSoftwareToken.mockImplementation(() => { diff --git a/packages/auth/__tests__/providers/cognito/signInErrorCases.test.ts b/packages/auth/__tests__/providers/cognito/signInErrorCases.test.ts index b4e8453b17d..f66241497f3 100644 --- a/packages/auth/__tests__/providers/cognito/signInErrorCases.test.ts +++ b/packages/auth/__tests__/providers/cognito/signInErrorCases.test.ts @@ -6,9 +6,9 @@ import { Amplify } from '@aws-amplify/core'; import { AuthError } from '../../../src/errors/AuthError'; import { AuthValidationErrorCode } from '../../../src/errors/types/validation'; import { getCurrentUser, signIn } from '../../../src/providers/cognito'; -import { initiateAuth } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; import { InitiateAuthException } from '../../../src/providers/cognito/types/errors'; import { USER_ALREADY_AUTHENTICATED_EXCEPTION } from '../../../src/errors/constants'; +import { createInitiateAuthClient } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; import { authAPITestParams } from './testUtils/authApiTestParams'; import { getMockError } from './testUtils/data'; @@ -24,18 +24,23 @@ jest.mock('@aws-amplify/core/internals/utils', () => ({ })); jest.mock('../../../src/providers/cognito/apis/getCurrentUser'); jest.mock( - '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider', + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', ); describe('signIn API error path cases:', () => { // assert mocks - const mockInitiateAuth = initiateAuth as jest.Mock; + const mockCreateInitiateAuthClient = jest.mocked(createInitiateAuthClient); + const mockInitiateAuth = jest.fn(); const mockedGetCurrentUser = getCurrentUser as jest.Mock; beforeAll(() => { setUpGetConfig(Amplify); }); + beforeEach(() => { + mockCreateInitiateAuthClient.mockReturnValueOnce(mockInitiateAuth); + }); + afterEach(() => { mockedGetCurrentUser.mockReset(); mockInitiateAuth.mockClear(); diff --git a/packages/auth/__tests__/providers/cognito/signInStateManagement.test.ts b/packages/auth/__tests__/providers/cognito/signInStateManagement.test.ts index dcefb80a121..80006cbf675 100644 --- a/packages/auth/__tests__/providers/cognito/signInStateManagement.test.ts +++ b/packages/auth/__tests__/providers/cognito/signInStateManagement.test.ts @@ -6,8 +6,8 @@ import { Amplify } from '@aws-amplify/core'; import { getCurrentUser, signIn } from '../../../src/providers/cognito'; import * as signInHelpers from '../../../src/providers/cognito/utils/signInHelpers'; import { signInStore } from '../../../src/providers/cognito/utils/signInStore'; -import { RespondToAuthChallengeCommandOutput } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider/types'; import { cognitoUserPoolsTokenProvider } from '../../../src/providers/cognito/tokenProvider'; +import { RespondToAuthChallengeCommandOutput } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider/types'; import { authAPITestParams } from './testUtils/authApiTestParams'; diff --git a/packages/auth/__tests__/providers/cognito/signInWithCustomAuth.test.ts b/packages/auth/__tests__/providers/cognito/signInWithCustomAuth.test.ts index 87828e427f8..c9e5ec7ab68 100644 --- a/packages/auth/__tests__/providers/cognito/signInWithCustomAuth.test.ts +++ b/packages/auth/__tests__/providers/cognito/signInWithCustomAuth.test.ts @@ -6,12 +6,12 @@ import { Amplify } from 'aws-amplify'; import { signIn } from '../../../src/providers/cognito'; import { signInWithCustomAuth } from '../../../src/providers/cognito/apis/signInWithCustomAuth'; import * as initiateAuthHelpers from '../../../src/providers/cognito/utils/signInHelpers'; -import { InitiateAuthCommandOutput } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider/types'; import { cognitoUserPoolsTokenProvider, tokenOrchestrator, } from '../../../src/providers/cognito/tokenProvider'; -import * as clients from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; +import { createInitiateAuthClient } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { InitiateAuthCommandOutput } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider/types'; import { authAPITestParams } from './testUtils/authApiTestParams'; @@ -19,6 +19,9 @@ jest.mock('@aws-amplify/core/internals/utils', () => ({ ...jest.requireActual('@aws-amplify/core/internals/utils'), isBrowser: jest.fn(() => false), })); +jest.mock( + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', +); const authConfig = { Cognito: { @@ -85,25 +88,23 @@ describe('signIn API happy path cases', () => { }); describe('Cognito ASF', () => { - let initiateAuthSpy: jest.SpyInstance; + const mockInitiateAuth = jest.fn(); + const mockCreateInitiateAuthClient = jest.mocked(createInitiateAuthClient); afterAll(() => { jest.restoreAllMocks(); }); beforeEach(() => { - initiateAuthSpy = jest - .spyOn(clients, 'initiateAuth') - .mockImplementationOnce( - async (): Promise => ({ - ChallengeName: 'SMS_MFA', - Session: '1234234232', - $metadata: {}, - ChallengeParameters: { - CODE_DELIVERY_DELIVERY_MEDIUM: 'SMS', - CODE_DELIVERY_DESTINATION: '*******9878', - }, - }), - ); + mockInitiateAuth.mockResolvedValueOnce({ + ChallengeName: 'SMS_MFA', + Session: '1234234232', + $metadata: {}, + ChallengeParameters: { + CODE_DELIVERY_DELIVERY_MEDIUM: 'SMS', + CODE_DELIVERY_DESTINATION: '*******9878', + }, + }); + mockCreateInitiateAuthClient.mockReturnValueOnce(mockInitiateAuth); // load Cognito ASF polyfill (window as any).AmazonCognitoAdvancedSecurityData = { getData() { @@ -113,7 +114,7 @@ describe('Cognito ASF', () => { }); afterEach(() => { - initiateAuthSpy.mockClear(); + mockInitiateAuth.mockClear(); (window as any).AmazonCognitoAdvancedSecurityData = undefined; }); @@ -124,7 +125,7 @@ describe('Cognito ASF', () => { authFlowType: 'CUSTOM_WITHOUT_SRP', }, }); - expect(initiateAuthSpy).toHaveBeenCalledWith( + expect(mockInitiateAuth).toHaveBeenCalledWith( expect.objectContaining({ region: 'us-west-2', }), diff --git a/packages/auth/__tests__/providers/cognito/signInWithCustomSRPAuth.test.ts b/packages/auth/__tests__/providers/cognito/signInWithCustomSRPAuth.test.ts index 108e928d683..5d6aa8a1740 100644 --- a/packages/auth/__tests__/providers/cognito/signInWithCustomSRPAuth.test.ts +++ b/packages/auth/__tests__/providers/cognito/signInWithCustomSRPAuth.test.ts @@ -6,12 +6,12 @@ import { Amplify } from 'aws-amplify'; import { signIn } from '../../../src/providers/cognito'; import * as initiateAuthHelpers from '../../../src/providers/cognito/utils/signInHelpers'; import { signInWithCustomSRPAuth } from '../../../src/providers/cognito/apis/signInWithCustomSRPAuth'; -import { RespondToAuthChallengeCommandOutput } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider/types'; import { cognitoUserPoolsTokenProvider, tokenOrchestrator, } from '../../../src/providers/cognito/tokenProvider'; -import * as clients from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; +import { createInitiateAuthClient } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { RespondToAuthChallengeCommandOutput } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider/types'; import { authAPITestParams } from './testUtils/authApiTestParams'; @@ -20,6 +20,10 @@ jest.mock('@aws-amplify/core/internals/utils', () => ({ isBrowser: jest.fn(() => false), })); +jest.mock( + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', +); + const authConfig = { Cognito: { userPoolClientId: '111111-aaaaa-42d8-891d-ee81a1549398', @@ -92,22 +96,23 @@ describe('signIn API happy path cases', () => { }); describe('Cognito ASF', () => { - let initiateAuthSpy: jest.SpyInstance; + const mockInitiateAuth = jest.fn(); + const mockCreateInitiateAuthClient = jest.mocked(createInitiateAuthClient); afterAll(() => { jest.restoreAllMocks(); }); beforeEach(() => { - initiateAuthSpy = jest - .spyOn(clients, 'initiateAuth') - .mockImplementationOnce(async () => ({ - ChallengeName: 'SRP_AUTH', - Session: '1234234232', - $metadata: {}, - ChallengeParameters: { - USER_ID_FOR_SRP: authAPITestParams.user1.username, - }, - })); + mockInitiateAuth.mockResolvedValueOnce({ + ChallengeName: 'SRP_AUTH', + Session: '1234234232', + $metadata: {}, + ChallengeParameters: { + USER_ID_FOR_SRP: authAPITestParams.user1.username, + }, + }); + mockCreateInitiateAuthClient.mockReturnValueOnce(mockInitiateAuth); + // load Cognito ASF polyfill (window as any).AmazonCognitoAdvancedSecurityData = { getData() { @@ -117,7 +122,8 @@ describe('Cognito ASF', () => { }); afterEach(() => { - initiateAuthSpy.mockClear(); + mockInitiateAuth.mockClear(); + mockCreateInitiateAuthClient.mockClear(); (window as any).AmazonCognitoAdvancedSecurityData = undefined; }); @@ -133,7 +139,7 @@ describe('Cognito ASF', () => { } catch (_) { // only want to test the contents } - expect(initiateAuthSpy).toHaveBeenCalledWith( + expect(mockInitiateAuth).toHaveBeenCalledWith( expect.objectContaining({ region: 'us-west-2', }), diff --git a/packages/auth/__tests__/providers/cognito/signInWithSRP.test.ts b/packages/auth/__tests__/providers/cognito/signInWithSRP.test.ts index c43e773f1d7..36c8d3c118a 100644 --- a/packages/auth/__tests__/providers/cognito/signInWithSRP.test.ts +++ b/packages/auth/__tests__/providers/cognito/signInWithSRP.test.ts @@ -6,14 +6,17 @@ import { Amplify } from 'aws-amplify'; import { signIn } from '../../../src/providers/cognito'; import { signInWithSRP } from '../../../src/providers/cognito/apis/signInWithSRP'; import * as initiateAuthHelpers from '../../../src/providers/cognito/utils/signInHelpers'; -import { RespondToAuthChallengeCommandOutput } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider/types'; import { cognitoUserPoolsTokenProvider, tokenOrchestrator, } from '../../../src/providers/cognito/tokenProvider'; import { AuthError } from '../../../src'; import { createKeysForAuthStorage } from '../../../src/providers/cognito/tokenProvider/TokenStore'; -import * as clients from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; +import { + createInitiateAuthClient, + createRespondToAuthChallengeClient, +} from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { RespondToAuthChallengeCommandOutput } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider/types'; import { authAPITestParams } from './testUtils/authApiTestParams'; @@ -33,6 +36,9 @@ jest.mock('@aws-amplify/core/internals/utils', () => ({ ...jest.requireActual('@aws-amplify/core/internals/utils'), isBrowser: jest.fn(() => false), })); +jest.mock( + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', +); const authConfig = { Cognito: { @@ -193,15 +199,17 @@ describe('signIn API happy path cases', () => { }); describe('sign in with device keys', () => { - const initiateAuthSpy = jest.spyOn(clients, 'initiateAuth'); - const respondToAuthChallengeAuthSpy = jest.spyOn( - clients, - 'respondToAuthChallenge', + const mockInitiateAuth = jest.fn(); + const mockCreateInitiateAuthClient = jest.mocked(createInitiateAuthClient); + const mockRespondToAuthChallenge = jest.fn(); + const mockCreateRespondToAuthChallengeClient = jest.mocked( + createRespondToAuthChallengeClient, ); + beforeEach(() => { setDeviceKeys(); handleUserSRPAuthflowSpy.mockRestore(); - initiateAuthSpy.mockResolvedValueOnce({ + mockInitiateAuth.mockResolvedValueOnce({ ChallengeName: 'SRP_AUTH', Session: '1234234232', $metadata: {}, @@ -209,14 +217,20 @@ describe('signIn API happy path cases', () => { USER_ID_FOR_SRP: lastAuthUser, }, }); - respondToAuthChallengeAuthSpy.mockResolvedValueOnce( + mockCreateInitiateAuthClient.mockReturnValueOnce(mockInitiateAuth); + mockRespondToAuthChallenge.mockResolvedValueOnce( authAPITestParams.RespondToAuthChallengeCommandOutput, ); + mockCreateRespondToAuthChallengeClient.mockReturnValueOnce( + mockRespondToAuthChallenge, + ); }); afterEach(() => { - initiateAuthSpy.mockClear(); - respondToAuthChallengeAuthSpy.mockClear(); + mockInitiateAuth.mockClear(); + mockCreateInitiateAuthClient.mockClear(); + mockRespondToAuthChallenge.mockClear(); + mockCreateRespondToAuthChallengeClient.mockClear(); }); test('respondToAuthChallenge should include device key in the request', async () => { @@ -225,9 +239,9 @@ describe('signIn API happy path cases', () => { password: 'XXXXXXXX', }); - expect(respondToAuthChallengeAuthSpy).toHaveBeenCalledTimes(1); + expect(mockRespondToAuthChallenge).toHaveBeenCalledTimes(1); const deviceKeyFromRequest = - respondToAuthChallengeAuthSpy.mock.calls[0][1].ChallengeResponses + mockRespondToAuthChallenge.mock.calls[0][1].ChallengeResponses ?.DEVICE_KEY; expect(deviceKeyFromRequest).toBe('mockedKey'); }); @@ -245,9 +259,9 @@ describe('signIn API happy path cases', () => { password: 'XXXXXXXX', }); - expect(respondToAuthChallengeAuthSpy).toHaveBeenCalledTimes(1); + expect(mockRespondToAuthChallenge).toHaveBeenCalledTimes(1); const deviceKeyFromRequest = - respondToAuthChallengeAuthSpy.mock.calls[0][1].ChallengeResponses + mockRespondToAuthChallenge.mock.calls[0][1].ChallengeResponses ?.DEVICE_KEY; expect(deviceKeyFromRequest).toBe(undefined); }, @@ -256,22 +270,23 @@ describe('signIn API happy path cases', () => { }); describe('Cognito ASF', () => { - let initiateAuthSpy: jest.SpyInstance; + const mockInitiateAuth = jest.fn(); + const mockCreateInitiateAuthClient = jest.mocked(createInitiateAuthClient); beforeAll(() => { jest.restoreAllMocks(); }); + beforeEach(() => { - initiateAuthSpy = jest - .spyOn(clients, 'initiateAuth') - .mockImplementationOnce(async () => ({ - ChallengeName: 'SRP_AUTH', - Session: '1234234232', - $metadata: {}, - ChallengeParameters: { - USER_ID_FOR_SRP: authAPITestParams.user1.username, - }, - })); + mockInitiateAuth.mockResolvedValueOnce({ + ChallengeName: 'SRP_AUTH', + Session: '1234234232', + $metadata: {}, + ChallengeParameters: { + USER_ID_FOR_SRP: authAPITestParams.user1.username, + }, + }); + mockCreateInitiateAuthClient.mockReturnValueOnce(mockInitiateAuth); // load Cognito ASF polyfill (window as any).AmazonCognitoAdvancedSecurityData = { getData() { @@ -281,7 +296,8 @@ describe('Cognito ASF', () => { }); afterEach(() => { - initiateAuthSpy.mockClear(); + mockInitiateAuth.mockClear(); + mockCreateInitiateAuthClient.mockClear(); (window as any).AmazonCognitoAdvancedSecurityData = undefined; }); @@ -294,7 +310,7 @@ describe('Cognito ASF', () => { } catch (_) { // only want to test the contents } - expect(initiateAuthSpy).toHaveBeenCalledWith( + expect(mockInitiateAuth).toHaveBeenCalledWith( expect.objectContaining({ region: 'us-west-2', }), diff --git a/packages/auth/__tests__/providers/cognito/signInWithUserPassword.test.ts b/packages/auth/__tests__/providers/cognito/signInWithUserPassword.test.ts index 83f3a7d2813..d675ace40a2 100644 --- a/packages/auth/__tests__/providers/cognito/signInWithUserPassword.test.ts +++ b/packages/auth/__tests__/providers/cognito/signInWithUserPassword.test.ts @@ -6,12 +6,12 @@ import { Amplify } from 'aws-amplify'; import { signIn } from '../../../src/providers/cognito'; import * as initiateAuthHelpers from '../../../src/providers/cognito/utils/signInHelpers'; import { signInWithUserPassword } from '../../../src/providers/cognito/apis/signInWithUserPassword'; -import { RespondToAuthChallengeCommandOutput } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider/types'; import { cognitoUserPoolsTokenProvider, tokenOrchestrator, } from '../../../src/providers/cognito/tokenProvider'; -import * as clients from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; +import { createInitiateAuthClient } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { RespondToAuthChallengeCommandOutput } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider/types'; import { authAPITestParams } from './testUtils/authApiTestParams'; @@ -20,21 +20,28 @@ jest.mock('@aws-amplify/core/internals/utils', () => ({ ...jest.requireActual('@aws-amplify/core/internals/utils'), isBrowser: jest.fn(() => false), })); +jest.mock( + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', +); const authConfig = { Cognito: { userPoolClientId: '111111-aaaaa-42d8-891d-ee81a1549398', userPoolId: 'us-west-2_zzzzz', + userPoolEndpoint: 'https://custom-endpoint.com', }, }; -cognitoUserPoolsTokenProvider.setAuthConfig(authConfig); -Amplify.configure({ - Auth: authConfig, -}); describe('signIn API happy path cases', () => { let handleUserPasswordFlowSpy: jest.SpyInstance; + beforeAll(() => { + Amplify.configure({ + Auth: authConfig, + }); + cognitoUserPoolsTokenProvider.setAuthConfig(authConfig); + }); + beforeEach(() => { handleUserPasswordFlowSpy = jest .spyOn(initiateAuthHelpers, 'handleUserPasswordAuthFlow') @@ -60,7 +67,7 @@ describe('signIn API happy path cases', () => { expect(handleUserPasswordFlowSpy).toHaveBeenCalledTimes(1); }); - test('handleUserPasswordAuthFlow should be called with clientMetada from request', async () => { + test('handleUserPasswordAuthFlow should be called with clientMetadata from request', async () => { const { username } = authAPITestParams.user1; const { password } = authAPITestParams.user1; await signInWithUserPassword({ @@ -79,22 +86,19 @@ describe('signIn API happy path cases', () => { }); describe('Cognito ASF', () => { - let initiateAuthSpy: jest.SpyInstance; + const mockInitiateAuth = jest.fn(); + const mockCreateInitiateAuthClient = jest.mocked(createInitiateAuthClient); - afterAll(() => { - jest.restoreAllMocks(); - }); beforeEach(() => { - initiateAuthSpy = jest - .spyOn(clients, 'initiateAuth') - .mockImplementationOnce(async () => ({ - ChallengeName: 'SRP_AUTH', - Session: '1234234232', - $metadata: {}, - ChallengeParameters: { - USER_ID_FOR_SRP: authAPITestParams.user1.username, - }, - })); + mockInitiateAuth.mockResolvedValueOnce({ + ChallengeName: 'SRP_AUTH', + Session: '1234234232', + $metadata: {}, + ChallengeParameters: { + USER_ID_FOR_SRP: authAPITestParams.user1.username, + }, + }); + mockCreateInitiateAuthClient.mockReturnValueOnce(mockInitiateAuth); // load Cognito ASF polyfill (window as any).AmazonCognitoAdvancedSecurityData = { getData() { @@ -104,7 +108,8 @@ describe('Cognito ASF', () => { }); afterEach(() => { - initiateAuthSpy.mockClear(); + mockInitiateAuth.mockClear(); + mockCreateInitiateAuthClient.mockClear(); (window as any).AmazonCognitoAdvancedSecurityData = undefined; }); @@ -120,7 +125,7 @@ describe('Cognito ASF', () => { } catch (_) { // only want to test the contents } - expect(initiateAuthSpy).toHaveBeenCalledWith( + expect(mockInitiateAuth).toHaveBeenCalledWith( expect.objectContaining({ region: 'us-west-2', }), diff --git a/packages/auth/__tests__/providers/cognito/signOut.test.ts b/packages/auth/__tests__/providers/cognito/signOut.test.ts index 4992b4a3a5c..49779a748ca 100644 --- a/packages/auth/__tests__/providers/cognito/signOut.test.ts +++ b/packages/auth/__tests__/providers/cognito/signOut.test.ts @@ -11,26 +11,26 @@ import { AMPLIFY_SYMBOL } from '@aws-amplify/core/internals/utils'; import { signOut } from '../../../src/providers/cognito/apis/signOut'; import { tokenOrchestrator } from '../../../src/providers/cognito/tokenProvider'; -import { - globalSignOut, - revokeToken, -} from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; -import { getRegion } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider/utils'; import { DefaultOAuthStore } from '../../../src/providers/cognito/utils/signInWithRedirectStore'; import { handleOAuthSignOut } from '../../../src/providers/cognito/utils/oauth'; import { AuthTokenStore } from '../../../src/providers/cognito/tokenProvider/types'; +import { + createGlobalSignOutClient, + createRevokeTokenClient, +} from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { getRegionFromUserPoolId } from '../../../src/foundation/parsers'; +import { createCognitoUserPoolEndpointResolver } from '../../../src/providers/cognito/factories'; jest.mock('@aws-amplify/core'); jest.mock('../../../src/providers/cognito/tokenProvider'); -jest.mock( - '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider', -); -jest.mock( - '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider/utils', -); jest.mock('../../../src/providers/cognito/utils/oauth'); jest.mock('../../../src/providers/cognito/utils/signInWithRedirectStore'); jest.mock('../../../src/utils'); +jest.mock( + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', +); +jest.mock('../../../src/foundation/parsers'); +jest.mock('../../../src/providers/cognito/factories'); describe('signOut', () => { // eslint-disable-next-line camelcase @@ -54,15 +54,20 @@ describe('signOut', () => { // assert mocks const mockAmplify = Amplify as jest.Mocked; const mockClearCredentials = clearCredentials as jest.Mock; - const mockGetRegion = getRegion as jest.Mock; - const mockGlobalSignOut = globalSignOut as jest.Mock; + const mockGetRegionFromUserPoolId = jest.mocked(getRegionFromUserPoolId); + const mockGlobalSignOut = jest.fn(); + const mockCreateGlobalSignOutClient = jest.mocked(createGlobalSignOutClient); const mockHandleOAuthSignOut = handleOAuthSignOut as jest.Mock; const mockHub = Hub as jest.Mocked; - const mockRevokeToken = revokeToken as jest.Mock; + const mockRevokeToken = jest.fn(); + const mockedRevokeTokenClient = jest.mocked(createRevokeTokenClient); const mockTokenOrchestrator = tokenOrchestrator as jest.Mocked< typeof tokenOrchestrator >; const MockDefaultOAuthStore = DefaultOAuthStore as jest.Mock; + const mockCreateCognitoUserPoolEndpointResolver = jest.mocked( + createCognitoUserPoolEndpointResolver, + ); // create mocks const mockLoadTokens = jest.fn(); const mockAuthTokenStore = { @@ -95,7 +100,7 @@ describe('signOut', () => { }); beforeAll(() => { - mockGetRegion.mockReturnValue(region); + mockGetRegionFromUserPoolId.mockReturnValue(region); MockDefaultOAuthStore.mockImplementation( () => mockDefaultOAuthStoreInstance, ); @@ -104,7 +109,9 @@ describe('signOut', () => { beforeEach(() => { mockAmplify.getConfig.mockReturnValue({ Auth: { Cognito: cognitoConfig } }); mockGlobalSignOut.mockResolvedValue({ $metadata: {} }); + mockCreateGlobalSignOutClient.mockReturnValueOnce(mockGlobalSignOut); mockRevokeToken.mockResolvedValue({}); + mockedRevokeTokenClient.mockReturnValueOnce(mockRevokeToken); mockTokenOrchestrator.getTokenStore.mockReturnValue(mockAuthTokenStore); mockLoadTokens.mockResolvedValue(cognitoAuthTokens); }); @@ -114,10 +121,11 @@ describe('signOut', () => { mockGlobalSignOut.mockReset(); mockRevokeToken.mockReset(); mockClearCredentials.mockClear(); - mockGetRegion.mockClear(); + mockGetRegionFromUserPoolId.mockClear(); mockHub.dispatch.mockClear(); mockTokenOrchestrator.clearTokens.mockClear(); loggerDebugSpy.mockClear(); + mockCreateCognitoUserPoolEndpointResolver.mockClear(); }); describe('Without OAuth configured', () => { @@ -128,11 +136,36 @@ describe('signOut', () => { { region }, { ClientId: cognitoConfig.userPoolClientId, Token: refreshToken }, ); - expect(mockGetRegion).toHaveBeenCalledTimes(1); + expect(mockGetRegionFromUserPoolId).toHaveBeenCalledTimes(1); expect(mockGlobalSignOut).not.toHaveBeenCalled(); expectSignOut().toComplete(); }); + it('invokes createCognitoUserPoolEndpointResolver with the userPoolEndpoint for creating the revokeToken client', async () => { + const expectedUserPoolEndpoint = 'https://my-custom-endpoint.com'; + const expectedEndpointResolver = jest.fn(); + mockAmplify.getConfig.mockReturnValueOnce({ + Auth: { + Cognito: { + ...cognitoConfig, + userPoolEndpoint: expectedUserPoolEndpoint, + }, + }, + }); + mockCreateCognitoUserPoolEndpointResolver.mockReturnValueOnce( + expectedEndpointResolver, + ); + + await signOut(); + + expect(mockCreateCognitoUserPoolEndpointResolver).toHaveBeenCalledWith({ + endpointOverride: expectedUserPoolEndpoint, + }); + expect(mockedRevokeTokenClient).toHaveBeenCalledWith({ + endpointResolver: expectedEndpointResolver, + }); + }); + it('should perform client sign out on an irrevocable session', async () => { mockLoadTokens.mockResolvedValue({ ...cognitoAuthTokens, @@ -143,7 +176,7 @@ describe('signOut', () => { expect(mockRevokeToken).not.toHaveBeenCalled(); expect(mockGlobalSignOut).not.toHaveBeenCalled(); - expect(mockGetRegion).not.toHaveBeenCalled(); + expect(mockGetRegionFromUserPoolId).not.toHaveBeenCalled(); expectSignOut().toComplete(); }); @@ -154,11 +187,36 @@ describe('signOut', () => { { region: 'us-west-2' }, { AccessToken: accessToken.toString() }, ); - expect(mockGetRegion).toHaveBeenCalledTimes(1); + expect(mockGetRegionFromUserPoolId).toHaveBeenCalledTimes(1); expect(mockRevokeToken).not.toHaveBeenCalled(); expectSignOut().toComplete(); }); + it('invokes createCognitoUserPoolEndpointResolver with the userPoolEndpoint for creating the globalSignOut client', async () => { + const expectedUserPoolEndpoint = 'https://my-custom-endpoint.com'; + const expectedEndpointResolver = jest.fn(); + mockAmplify.getConfig.mockReturnValueOnce({ + Auth: { + Cognito: { + ...cognitoConfig, + userPoolEndpoint: expectedUserPoolEndpoint, + }, + }, + }); + mockCreateCognitoUserPoolEndpointResolver.mockReturnValueOnce( + expectedEndpointResolver, + ); + + await signOut({ global: true }); + + expect(mockCreateCognitoUserPoolEndpointResolver).toHaveBeenCalledWith({ + endpointOverride: expectedUserPoolEndpoint, + }); + expect(mockCreateGlobalSignOutClient).toHaveBeenCalledWith({ + endpointResolver: expectedEndpointResolver, + }); + }); + it('should still perform client sign out if token revoke fails', async () => { mockRevokeToken.mockRejectedValue(new Error()); @@ -167,7 +225,7 @@ describe('signOut', () => { expect(loggerDebugSpy).toHaveBeenCalledWith( expect.stringContaining('Client signOut error caught'), ); - expect(mockGetRegion).toHaveBeenCalledTimes(1); + expect(mockGetRegionFromUserPoolId).toHaveBeenCalledTimes(1); expectSignOut().toComplete(); }); @@ -179,7 +237,7 @@ describe('signOut', () => { expect(loggerDebugSpy).toHaveBeenCalledWith( expect.stringContaining('Global signOut error caught'), ); - expect(mockGetRegion).toHaveBeenCalledTimes(1); + expect(mockGetRegionFromUserPoolId).toHaveBeenCalledTimes(1); expectSignOut().toComplete(); }); }); diff --git a/packages/auth/__tests__/providers/cognito/signUp.test.ts b/packages/auth/__tests__/providers/cognito/signUp.test.ts index 87e0dda27c6..cb2b9b84d64 100644 --- a/packages/auth/__tests__/providers/cognito/signUp.test.ts +++ b/packages/auth/__tests__/providers/cognito/signUp.test.ts @@ -4,10 +4,11 @@ import { Amplify } from '@aws-amplify/core'; import { signUp } from '../../../src/providers/cognito'; -import { signUp as providerSignUp } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; import { AuthValidationErrorCode } from '../../../src/errors/types/validation'; import { AuthError } from '../../../src/errors/AuthError'; import { SignUpException } from '../../../src/providers/cognito/types/errors'; +import { createSignUpClient } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../../../src/providers/cognito/factories'; import { authAPITestParams } from './testUtils/authApiTestParams'; import { getMockError } from './testUtils/data'; @@ -21,21 +22,35 @@ jest.mock('@aws-amplify/core/internals/utils', () => ({ ...jest.requireActual('@aws-amplify/core/internals/utils'), isBrowser: jest.fn(() => false), })); + jest.mock( - '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider', + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', ); - -const userId = '1234567890'; +jest.mock('../../../src/providers/cognito/factories'); describe('signUp', () => { + const userId = '1234567890'; const { user1 } = authAPITestParams; // assert mocks - const mockSignUp = providerSignUp as jest.Mock; + const mockSignUp = jest.fn(); + const mockCreateSignUpClient = jest.mocked(createSignUpClient); + const mockCreateCognitoUserPoolEndpointResolver = jest.mocked( + createCognitoUserPoolEndpointResolver, + ); beforeAll(() => { setUpGetConfig(Amplify); }); + beforeEach(() => { + mockCreateSignUpClient.mockReturnValueOnce(mockSignUp); + }); + + afterEach(() => { + mockCreateSignUpClient.mockClear(); + mockCreateCognitoUserPoolEndpointResolver.mockClear(); + }); + describe('Happy Path Cases:', () => { beforeEach(() => { mockSignUp.mockResolvedValue(authAPITestParams.signUpHttpCallResult); @@ -70,6 +85,31 @@ describe('signUp', () => { expect(mockSignUp).toHaveBeenCalledTimes(1); }); + it('invokes mockCreateCognitoUserPoolEndpointResolver with expected endpointOverride', async () => { + const expectedUserPoolEndpoint = 'https://my-custom-endpoint.com'; + jest.mocked(Amplify.getConfig).mockReturnValueOnce({ + Auth: { + Cognito: { + userPoolClientId: '111111-aaaaa-42d8-891d-ee81a1549398', + userPoolId: 'us-west-2_zzzzz', + identityPoolId: 'us-west-2:xxxxxx', + userPoolEndpoint: expectedUserPoolEndpoint, + }, + }, + }); + await signUp({ + username: user1.username, + password: user1.password, + options: { + userAttributes: { email: user1.email }, + }, + }); + + expect(mockCreateCognitoUserPoolEndpointResolver).toHaveBeenCalledWith({ + endpointOverride: expectedUserPoolEndpoint, + }); + }); + it('should return `CONFIRM_SIGN_UP` step when user isn`t confirmed yet', async () => { const result = await signUp({ username: user1.username, diff --git a/packages/auth/__tests__/providers/cognito/updateMFAPreference.test.ts b/packages/auth/__tests__/providers/cognito/updateMFAPreference.test.ts index dbaeca398f6..a9d4d6c9e65 100644 --- a/packages/auth/__tests__/providers/cognito/updateMFAPreference.test.ts +++ b/packages/auth/__tests__/providers/cognito/updateMFAPreference.test.ts @@ -8,10 +8,11 @@ import { UpdateMFAPreferenceInput, updateMFAPreference, } from '../../../src/providers/cognito'; -import { setUserMFAPreference } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; import { AuthError } from '../../../src/errors/AuthError'; import { SetUserMFAPreferenceException } from '../../../src/providers/cognito/types/errors'; import { getMFASettings } from '../../../src/providers/cognito/apis/updateMFAPreference'; +import { createSetUserMFAPreferenceClient } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../../../src/providers/cognito/factories'; import { getMockError, mockAccessToken } from './testUtils/data'; import { setUpGetConfig } from './testUtils/setUpGetConfig'; @@ -25,8 +26,9 @@ jest.mock('@aws-amplify/core/internals/utils', () => ({ isBrowser: jest.fn(() => false), })); jest.mock( - '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider', + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', ); +jest.mock('../../../src/providers/cognito/factories'); const mfaChoices: UpdateMFAPreferenceInput[] = [ { sms: 'DISABLED', totp: 'DISABLED' }, @@ -51,7 +53,13 @@ const mfaChoices: UpdateMFAPreferenceInput[] = [ describe('updateMFAPreference', () => { // assert mocks const mockFetchAuthSession = fetchAuthSession as jest.Mock; - const mockSetUserMFAPreference = setUserMFAPreference as jest.Mock; + const mockSetUserMFAPreference = jest.fn(); + const mockCreateSetUserMFAPreferenceClient = jest.mocked( + createSetUserMFAPreferenceClient, + ); + const mockCreateCognitoUserPoolEndpointResolver = jest.mocked( + createCognitoUserPoolEndpointResolver, + ); beforeAll(() => { setUpGetConfig(Amplify); @@ -62,11 +70,15 @@ describe('updateMFAPreference', () => { beforeEach(() => { mockSetUserMFAPreference.mockResolvedValue({}); + mockCreateSetUserMFAPreferenceClient.mockReturnValueOnce( + mockSetUserMFAPreference, + ); }); afterEach(() => { mockSetUserMFAPreference.mockReset(); mockFetchAuthSession.mockClear(); + mockCreateSetUserMFAPreferenceClient.mockClear(); }); it.each(mfaChoices)( @@ -88,6 +100,25 @@ describe('updateMFAPreference', () => { }, ); + it('invokes mockCreateCognitoUserPoolEndpointResolver with expected endpointOverride', async () => { + const expectedUserPoolEndpoint = 'https://my-custom-endpoint.com'; + jest.mocked(Amplify.getConfig).mockReturnValueOnce({ + Auth: { + Cognito: { + userPoolClientId: '111111-aaaaa-42d8-891d-ee81a1549398', + userPoolId: 'us-west-2_zzzzz', + identityPoolId: 'us-west-2:xxxxxx', + userPoolEndpoint: expectedUserPoolEndpoint, + }, + }, + }); + await updateMFAPreference(mfaChoices[0]); + + expect(mockCreateCognitoUserPoolEndpointResolver).toHaveBeenCalledWith({ + endpointOverride: expectedUserPoolEndpoint, + }); + }); + it('should throw an error when service returns an error response', async () => { expect.assertions(2); mockSetUserMFAPreference.mockImplementation(() => { diff --git a/packages/auth/__tests__/providers/cognito/updatePassword.test.ts b/packages/auth/__tests__/providers/cognito/updatePassword.test.ts index 42c0869a9a3..72dfe80119e 100644 --- a/packages/auth/__tests__/providers/cognito/updatePassword.test.ts +++ b/packages/auth/__tests__/providers/cognito/updatePassword.test.ts @@ -8,7 +8,8 @@ import { AuthError } from '../../../src/errors/AuthError'; import { AuthValidationErrorCode } from '../../../src/errors/types/validation'; import { updatePassword } from '../../../src/providers/cognito'; import { ChangePasswordException } from '../../../src/providers/cognito/types/errors'; -import { changePassword } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; +import { createChangePasswordClient } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../../../src/providers/cognito/factories'; import { getMockError, mockAccessToken } from './testUtils/data'; import { setUpGetConfig } from './testUtils/setUpGetConfig'; @@ -22,15 +23,22 @@ jest.mock('@aws-amplify/core/internals/utils', () => ({ isBrowser: jest.fn(() => false), })); jest.mock( - '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider', + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', ); +jest.mock('../../../src/providers/cognito/factories'); describe('updatePassword', () => { const oldPassword = 'oldPassword'; const newPassword = 'newPassword'; // assert mocks const mockFetchAuthSession = fetchAuthSession as jest.Mock; - const mockChangePassword = changePassword as jest.Mock; + const mockChangePassword = jest.fn(); + const mockCreateChangePasswordClient = jest.mocked( + createChangePasswordClient, + ); + const mockCreateCognitoUserPoolEndpointResolver = jest.mocked( + createCognitoUserPoolEndpointResolver, + ); beforeAll(() => { setUpGetConfig(Amplify); @@ -41,11 +49,13 @@ describe('updatePassword', () => { beforeEach(() => { mockChangePassword.mockResolvedValue({}); + mockCreateChangePasswordClient.mockReturnValueOnce(mockChangePassword); }); afterEach(() => { mockChangePassword.mockReset(); mockFetchAuthSession.mockClear(); + mockCreateChangePasswordClient.mockClear(); }); it('should call changePassword', async () => { @@ -61,6 +71,25 @@ describe('updatePassword', () => { ); }); + it('invokes mockCreateCognitoUserPoolEndpointResolver with expected endpointOverride', async () => { + const expectedUserPoolEndpoint = 'https://my-custom-endpoint.com'; + jest.mocked(Amplify.getConfig).mockReturnValueOnce({ + Auth: { + Cognito: { + userPoolClientId: '111111-aaaaa-42d8-891d-ee81a1549398', + userPoolId: 'us-west-2_zzzzz', + identityPoolId: 'us-west-2:xxxxxx', + userPoolEndpoint: expectedUserPoolEndpoint, + }, + }, + }); + await updatePassword({ oldPassword, newPassword }); + + expect(mockCreateCognitoUserPoolEndpointResolver).toHaveBeenCalledWith({ + endpointOverride: expectedUserPoolEndpoint, + }); + }); + it('should throw an error when oldPassword is empty', async () => { expect.assertions(2); try { diff --git a/packages/auth/__tests__/providers/cognito/updateUserAttributes.test.ts b/packages/auth/__tests__/providers/cognito/updateUserAttributes.test.ts index 3b1ca0f9d99..bfa9643b76d 100644 --- a/packages/auth/__tests__/providers/cognito/updateUserAttributes.test.ts +++ b/packages/auth/__tests__/providers/cognito/updateUserAttributes.test.ts @@ -7,8 +7,9 @@ import { decodeJWT } from '@aws-amplify/core/internals/utils'; import { AuthError } from '../../../src/errors/AuthError'; import { updateUserAttributes } from '../../../src/providers/cognito'; import { UpdateUserAttributesException } from '../../../src/providers/cognito/types/errors'; -import { updateUserAttributes as providerUpdateUserAttributes } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; import { toAttributeType } from '../../../src/providers/cognito/utils/apiHelpers'; +import { createUpdateUserAttributesClient } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../../../src/providers/cognito/factories'; import { getMockError, mockAccessToken } from './testUtils/data'; import { setUpGetConfig } from './testUtils/setUpGetConfig'; @@ -22,13 +23,20 @@ jest.mock('@aws-amplify/core/internals/utils', () => ({ isBrowser: jest.fn(() => false), })); jest.mock( - '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider', + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', ); +jest.mock('../../../src/providers/cognito/factories'); describe('updateUserAttributes', () => { // assert mocks const mockFetchAuthSession = fetchAuthSession as jest.Mock; - const mockUpdateUserAttributes = providerUpdateUserAttributes as jest.Mock; + const mockUpdateUserAttributes = jest.fn(); + const mockCreateUpdateUserAttributesClient = jest.mocked( + createUpdateUserAttributesClient, + ); + const mockCreateCognitoUserPoolEndpointResolver = jest.mocked( + createCognitoUserPoolEndpointResolver, + ); beforeAll(() => { setUpGetConfig(Amplify); @@ -52,11 +60,15 @@ describe('updateUserAttributes', () => { }, ], }); + mockCreateUpdateUserAttributesClient.mockReturnValueOnce( + mockUpdateUserAttributes, + ); }); afterEach(() => { mockUpdateUserAttributes.mockReset(); mockFetchAuthSession.mockClear(); + mockCreateUpdateUserAttributesClient.mockClear(); }); it('should return a map with updated and not updated attributes', async () => { @@ -121,6 +133,30 @@ describe('updateUserAttributes', () => { ); }); + it('invokes mockCreateCognitoUserPoolEndpointResolver with expected endpointOverride', async () => { + const expectedUserPoolEndpoint = 'https://my-custom-endpoint.com'; + jest.mocked(Amplify.getConfig).mockReturnValueOnce({ + Auth: { + Cognito: { + userPoolClientId: '111111-aaaaa-42d8-891d-ee81a1549398', + userPoolId: 'us-west-2_zzzzz', + identityPoolId: 'us-west-2:xxxxxx', + userPoolEndpoint: expectedUserPoolEndpoint, + }, + }, + }); + await updateUserAttributes({ + userAttributes: {}, + options: { + clientMetadata: { foo: 'bar' }, + }, + }); + + expect(mockCreateCognitoUserPoolEndpointResolver).toHaveBeenCalledWith({ + endpointOverride: expectedUserPoolEndpoint, + }); + }); + it('updateUserAttributes API should return a map with updated attributes only', async () => { mockUpdateUserAttributes.mockResolvedValue({}); const userAttributes = { diff --git a/packages/auth/__tests__/providers/cognito/verifyTOTPSetup.test.ts b/packages/auth/__tests__/providers/cognito/verifyTOTPSetup.test.ts index aceb6ed480a..0f7c5bcb109 100644 --- a/packages/auth/__tests__/providers/cognito/verifyTOTPSetup.test.ts +++ b/packages/auth/__tests__/providers/cognito/verifyTOTPSetup.test.ts @@ -8,7 +8,8 @@ import { AuthError } from '../../../src/errors/AuthError'; import { AuthValidationErrorCode } from '../../../src/errors/types/validation'; import { VerifySoftwareTokenException } from '../../../src/providers/cognito/types/errors'; import { verifyTOTPSetup } from '../../../src/providers/cognito'; -import { verifySoftwareToken } from '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider'; +import { createVerifySoftwareTokenClient } from '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../../../src/providers/cognito/factories'; import { getMockError, mockAccessToken } from './testUtils/data'; import { setUpGetConfig } from './testUtils/setUpGetConfig'; @@ -22,15 +23,22 @@ jest.mock('@aws-amplify/core/internals/utils', () => ({ isBrowser: jest.fn(() => false), })); jest.mock( - '../../../src/providers/cognito/utils/clients/CognitoIdentityProvider', + '../../../src/foundation/factories/serviceClients/cognitoIdentityProvider', ); +jest.mock('../../../src/providers/cognito/factories'); describe('verifyTOTPSetup', () => { const code = '123456'; const friendlyDeviceName = 'FriendlyDeviceName'; // assert mocks const mockFetchAuthSession = fetchAuthSession as jest.Mock; - const mockVerifySoftwareToken = verifySoftwareToken as jest.Mock; + const mockVerifySoftwareToken = jest.fn(); + const mockCreateVerifySoftwareTokenClient = jest.mocked( + createVerifySoftwareTokenClient, + ); + const mockCreateCognitoUserPoolEndpointResolver = jest.mocked( + createCognitoUserPoolEndpointResolver, + ); beforeAll(() => { setUpGetConfig(Amplify); @@ -41,11 +49,15 @@ describe('verifyTOTPSetup', () => { beforeEach(() => { mockVerifySoftwareToken.mockResolvedValue({}); + mockCreateVerifySoftwareTokenClient.mockReturnValueOnce( + mockVerifySoftwareToken, + ); }); afterEach(() => { mockVerifySoftwareToken.mockReset(); mockFetchAuthSession.mockClear(); + mockCreateVerifySoftwareTokenClient.mockClear(); }); it('should return successful response', async () => { @@ -64,6 +76,29 @@ describe('verifyTOTPSetup', () => { ); }); + it('invokes mockCreateCognitoUserPoolEndpointResolver with expected endpointOverride', async () => { + const expectedUserPoolEndpoint = 'https://my-custom-endpoint.com'; + jest.mocked(Amplify.getConfig).mockReturnValueOnce({ + Auth: { + Cognito: { + userPoolClientId: '111111-aaaaa-42d8-891d-ee81a1549398', + userPoolId: 'us-west-2_zzzzz', + identityPoolId: 'us-west-2:xxxxxx', + userPoolEndpoint: expectedUserPoolEndpoint, + }, + }, + }); + + await verifyTOTPSetup({ + code, + options: { friendlyDeviceName }, + }); + + expect(mockCreateCognitoUserPoolEndpointResolver).toHaveBeenCalledWith({ + endpointOverride: expectedUserPoolEndpoint, + }); + }); + it('should throw an error when code is empty', async () => { expect.assertions(2); try { diff --git a/packages/auth/package.json b/packages/auth/package.json index 81032ed1b5e..705e909d167 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/auth", - "version": "6.4.0", + "version": "6.4.2", "description": "Auth category of aws-amplify", "main": "./dist/cjs/index.js", "module": "./dist/esm/index.mjs", @@ -97,7 +97,7 @@ "@aws-amplify/core": "^6.1.0" }, "devDependencies": { - "@aws-amplify/core": "6.4.0", + "@aws-amplify/core": "6.4.2", "@aws-amplify/react-native": "1.1.5", "@jest/test-sequencer": "^29.7.0", "typescript": "5.0.2" diff --git a/packages/auth/src/foundation/cognitoUserPoolEndpointResolver.ts b/packages/auth/src/foundation/cognitoUserPoolEndpointResolver.ts new file mode 100644 index 00000000000..dc57e2e0ce4 --- /dev/null +++ b/packages/auth/src/foundation/cognitoUserPoolEndpointResolver.ts @@ -0,0 +1,17 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { + EndpointResolverOptions, + getDnsSuffix, +} from '@aws-amplify/core/internals/aws-client-utils'; +import { AmplifyUrl } from '@aws-amplify/core/internals/utils'; + +import { COGNITO_IDP_SERVICE_NAME } from './constants'; + +export const cognitoUserPoolEndpointResolver = ({ + region, +}: EndpointResolverOptions): { url: URL } => ({ + url: new AmplifyUrl( + `https://${COGNITO_IDP_SERVICE_NAME}.${region}.${getDnsSuffix(region)}`, + ), +}); diff --git a/packages/auth/src/foundation/constants.ts b/packages/auth/src/foundation/constants.ts new file mode 100644 index 00000000000..56814b3e66f --- /dev/null +++ b/packages/auth/src/foundation/constants.ts @@ -0,0 +1,6 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +/** + * The service name used to sign requests if the API requires authentication. + */ +export const COGNITO_IDP_SERVICE_NAME = 'cognito-idp'; diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/constants.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/constants.ts new file mode 100644 index 00000000000..8898f8bc32a --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/constants.ts @@ -0,0 +1,19 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { + getRetryDecider, + jitteredBackoff, + parseJsonError, +} from '@aws-amplify/core/internals/aws-client-utils'; +import { getAmplifyUserAgent } from '@aws-amplify/core/internals/utils'; + +import { COGNITO_IDP_SERVICE_NAME } from '../../../constants'; + +export const DEFAULT_SERVICE_CLIENT_API_CONFIG = { + service: COGNITO_IDP_SERVICE_NAME, + retryDecider: getRetryDecider(parseJsonError), + computeDelay: jitteredBackoff, + userAgentValue: getAmplifyUserAgent(), + cache: 'no-store', +}; diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createAssociateSoftwareTokenClient.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createAssociateSoftwareTokenClient.ts new file mode 100644 index 00000000000..4fa07c8a217 --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createAssociateSoftwareTokenClient.ts @@ -0,0 +1,30 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers'; + +import { + AssociateSoftwareTokenCommandInput, + AssociateSoftwareTokenCommandOutput, + ServiceClientFactoryInput, +} from './types'; +import { cognitoUserPoolTransferHandler } from './shared/handler'; +import { + createUserPoolDeserializer, + createUserPoolSerializer, +} from './shared/serde'; +import { DEFAULT_SERVICE_CLIENT_API_CONFIG } from './constants'; + +export const createAssociateSoftwareTokenClient = ( + config: ServiceClientFactoryInput, +) => + composeServiceApi( + cognitoUserPoolTransferHandler, + createUserPoolSerializer( + 'AssociateSoftwareToken', + ), + createUserPoolDeserializer(), + { + ...DEFAULT_SERVICE_CLIENT_API_CONFIG, + ...config, + }, + ); diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createChangePasswordClient.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createChangePasswordClient.ts new file mode 100644 index 00000000000..f8e76959850 --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createChangePasswordClient.ts @@ -0,0 +1,26 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers'; + +import { cognitoUserPoolTransferHandler } from './shared/handler'; +import { + createUserPoolDeserializer, + createUserPoolSerializer, +} from './shared/serde'; +import { + ChangePasswordCommandInput, + ChangePasswordCommandOutput, + ServiceClientFactoryInput, +} from './types'; +import { DEFAULT_SERVICE_CLIENT_API_CONFIG } from './constants'; + +export const createChangePasswordClient = (config: ServiceClientFactoryInput) => + composeServiceApi( + cognitoUserPoolTransferHandler, + createUserPoolSerializer('ChangePassword'), + createUserPoolDeserializer(), + { + ...DEFAULT_SERVICE_CLIENT_API_CONFIG, + ...config, + }, + ); diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createConfirmDeviceClient.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createConfirmDeviceClient.ts new file mode 100644 index 00000000000..3d9ced2e060 --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createConfirmDeviceClient.ts @@ -0,0 +1,26 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers'; + +import { cognitoUserPoolTransferHandler } from './shared/handler'; +import { + createUserPoolDeserializer, + createUserPoolSerializer, +} from './shared/serde'; +import { + ConfirmDeviceCommandInput, + ConfirmDeviceCommandOutput, + ServiceClientFactoryInput, +} from './types'; +import { DEFAULT_SERVICE_CLIENT_API_CONFIG } from './constants'; + +export const createConfirmDeviceClient = (config: ServiceClientFactoryInput) => + composeServiceApi( + cognitoUserPoolTransferHandler, + createUserPoolSerializer('ConfirmDevice'), + createUserPoolDeserializer(), + { + ...DEFAULT_SERVICE_CLIENT_API_CONFIG, + ...config, + }, + ); diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createConfirmForgotPasswordClient.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createConfirmForgotPasswordClient.ts new file mode 100644 index 00000000000..a300a4ccadb --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createConfirmForgotPasswordClient.ts @@ -0,0 +1,30 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers'; + +import { + ConfirmForgotPasswordCommandInput, + ConfirmForgotPasswordCommandOutput, + ServiceClientFactoryInput, +} from './types'; +import { cognitoUserPoolTransferHandler } from './shared/handler'; +import { + createUserPoolDeserializer, + createUserPoolSerializer, +} from './shared/serde'; +import { DEFAULT_SERVICE_CLIENT_API_CONFIG } from './constants'; + +export const createConfirmForgotPasswordClient = ( + config: ServiceClientFactoryInput, +) => + composeServiceApi( + cognitoUserPoolTransferHandler, + createUserPoolSerializer( + 'ConfirmForgotPassword', + ), + createUserPoolDeserializer(), + { + ...DEFAULT_SERVICE_CLIENT_API_CONFIG, + ...config, + }, + ); diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createConfirmSignUpClient.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createConfirmSignUpClient.ts new file mode 100644 index 00000000000..d5a712af669 --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createConfirmSignUpClient.ts @@ -0,0 +1,26 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers'; + +import { DEFAULT_SERVICE_CLIENT_API_CONFIG } from './constants'; +import { cognitoUserPoolTransferHandler } from './shared/handler'; +import { + createUserPoolDeserializer, + createUserPoolSerializer, +} from './shared/serde'; +import { + ConfirmSignUpCommandInput, + ConfirmSignUpCommandOutput, + ServiceClientFactoryInput, +} from './types'; + +export const createConfirmSignUpClient = (config: ServiceClientFactoryInput) => + composeServiceApi( + cognitoUserPoolTransferHandler, + createUserPoolSerializer('ConfirmSignUp'), + createUserPoolDeserializer(), + { + ...DEFAULT_SERVICE_CLIENT_API_CONFIG, + ...config, + }, + ); diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createDeleteUserAttributesClient.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createDeleteUserAttributesClient.ts new file mode 100644 index 00000000000..052ff8c9b0a --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createDeleteUserAttributesClient.ts @@ -0,0 +1,30 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers'; + +import { + DeleteUserAttributesCommandInput, + DeleteUserAttributesCommandOutput, + ServiceClientFactoryInput, +} from './types'; +import { cognitoUserPoolTransferHandler } from './shared/handler'; +import { + createUserPoolDeserializer, + createUserPoolSerializer, +} from './shared/serde'; +import { DEFAULT_SERVICE_CLIENT_API_CONFIG } from './constants'; + +export const createDeleteUserAttributesClient = ( + config: ServiceClientFactoryInput, +) => + composeServiceApi( + cognitoUserPoolTransferHandler, + createUserPoolSerializer( + 'DeleteUserAttributes', + ), + createUserPoolDeserializer(), + { + ...DEFAULT_SERVICE_CLIENT_API_CONFIG, + ...config, + }, + ); diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createDeleteUserClient.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createDeleteUserClient.ts new file mode 100644 index 00000000000..70cb9860ee2 --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createDeleteUserClient.ts @@ -0,0 +1,26 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers'; + +import { + DeleteUserCommandInput, + DeleteUserCommandOutput, + ServiceClientFactoryInput, +} from './types'; +import { cognitoUserPoolTransferHandler } from './shared/handler'; +import { + createEmptyResponseDeserializer, + createUserPoolSerializer, +} from './shared/serde'; +import { DEFAULT_SERVICE_CLIENT_API_CONFIG } from './constants'; + +export const createDeleteUserClient = (config: ServiceClientFactoryInput) => + composeServiceApi( + cognitoUserPoolTransferHandler, + createUserPoolSerializer('DeleteUser'), + createEmptyResponseDeserializer(), + { + ...DEFAULT_SERVICE_CLIENT_API_CONFIG, + ...config, + }, + ); diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createForgetDeviceClient.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createForgetDeviceClient.ts new file mode 100644 index 00000000000..f2851a80f78 --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createForgetDeviceClient.ts @@ -0,0 +1,26 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers'; + +import { cognitoUserPoolTransferHandler } from './shared/handler'; +import { + createEmptyResponseDeserializer, + createUserPoolSerializer, +} from './shared/serde'; +import { + ForgetDeviceCommandInput, + ForgetDeviceCommandOutput, + ServiceClientFactoryInput, +} from './types'; +import { DEFAULT_SERVICE_CLIENT_API_CONFIG } from './constants'; + +export const createForgetDeviceClient = (config: ServiceClientFactoryInput) => + composeServiceApi( + cognitoUserPoolTransferHandler, + createUserPoolSerializer('ForgetDevice'), + createEmptyResponseDeserializer(), + { + ...DEFAULT_SERVICE_CLIENT_API_CONFIG, + ...config, + }, + ); diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createForgotPasswordClient.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createForgotPasswordClient.ts new file mode 100644 index 00000000000..965e8475d83 --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createForgotPasswordClient.ts @@ -0,0 +1,26 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers'; + +import { + ForgotPasswordCommandInput, + ForgotPasswordCommandOutput, + ServiceClientFactoryInput, +} from './types'; +import { cognitoUserPoolTransferHandler } from './shared/handler'; +import { + createUserPoolDeserializer, + createUserPoolSerializer, +} from './shared/serde'; +import { DEFAULT_SERVICE_CLIENT_API_CONFIG } from './constants'; + +export const createForgotPasswordClient = (config: ServiceClientFactoryInput) => + composeServiceApi( + cognitoUserPoolTransferHandler, + createUserPoolSerializer('ForgotPassword'), + createUserPoolDeserializer(), + { + ...DEFAULT_SERVICE_CLIENT_API_CONFIG, + ...config, + }, + ); diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createGetUserAttributeVerificationCodeClient.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createGetUserAttributeVerificationCodeClient.ts new file mode 100644 index 00000000000..4b699383ffe --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createGetUserAttributeVerificationCodeClient.ts @@ -0,0 +1,30 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers'; + +import { + GetUserAttributeVerificationCodeCommandInput, + GetUserAttributeVerificationCodeCommandOutput, + ServiceClientFactoryInput, +} from './types'; +import { cognitoUserPoolTransferHandler } from './shared/handler'; +import { + createUserPoolDeserializer, + createUserPoolSerializer, +} from './shared/serde'; +import { DEFAULT_SERVICE_CLIENT_API_CONFIG } from './constants'; + +export const createGetUserAttributeVerificationCodeClient = ( + config: ServiceClientFactoryInput, +) => + composeServiceApi( + cognitoUserPoolTransferHandler, + createUserPoolSerializer( + 'GetUserAttributeVerificationCode', + ), + createUserPoolDeserializer(), + { + ...DEFAULT_SERVICE_CLIENT_API_CONFIG, + ...config, + }, + ); diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createGetUserClient.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createGetUserClient.ts new file mode 100644 index 00000000000..0a0eed9f070 --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createGetUserClient.ts @@ -0,0 +1,26 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers'; + +import { + GetUserCommandInput, + GetUserCommandOutput, + ServiceClientFactoryInput, +} from './types'; +import { cognitoUserPoolTransferHandler } from './shared/handler'; +import { + createUserPoolDeserializer, + createUserPoolSerializer, +} from './shared/serde'; +import { DEFAULT_SERVICE_CLIENT_API_CONFIG } from './constants'; + +export const createGetUserClient = (config: ServiceClientFactoryInput) => + composeServiceApi( + cognitoUserPoolTransferHandler, + createUserPoolSerializer('GetUser'), + createUserPoolDeserializer(), + { + ...DEFAULT_SERVICE_CLIENT_API_CONFIG, + ...config, + }, + ); diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createGlobalSignOutClient.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createGlobalSignOutClient.ts new file mode 100644 index 00000000000..3ef65818bbf --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createGlobalSignOutClient.ts @@ -0,0 +1,26 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers'; + +import { + GlobalSignOutCommandInput, + GlobalSignOutCommandOutput, + ServiceClientFactoryInput, +} from './types'; +import { cognitoUserPoolTransferHandler } from './shared/handler'; +import { + createUserPoolDeserializer, + createUserPoolSerializer, +} from './shared/serde'; +import { DEFAULT_SERVICE_CLIENT_API_CONFIG } from './constants'; + +export const createGlobalSignOutClient = (config: ServiceClientFactoryInput) => + composeServiceApi( + cognitoUserPoolTransferHandler, + createUserPoolSerializer('GlobalSignOut'), + createUserPoolDeserializer(), + { + ...DEFAULT_SERVICE_CLIENT_API_CONFIG, + ...config, + }, + ); diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createInitiateAuthClient.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createInitiateAuthClient.ts new file mode 100644 index 00000000000..b505144933e --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createInitiateAuthClient.ts @@ -0,0 +1,27 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers'; + +import { + InitiateAuthCommandInput, + InitiateAuthCommandOutput, + ServiceClientFactoryInput, +} from './types'; +import { + createUserPoolDeserializer, + createUserPoolSerializer, +} from './shared/serde'; +import { cognitoUserPoolTransferHandler } from './shared/handler'; +import { DEFAULT_SERVICE_CLIENT_API_CONFIG } from './constants'; + +export const createInitiateAuthClient = (config: ServiceClientFactoryInput) => + composeServiceApi( + cognitoUserPoolTransferHandler, + createUserPoolSerializer('InitiateAuth'), + createUserPoolDeserializer(), + { + ...DEFAULT_SERVICE_CLIENT_API_CONFIG, + ...config, + }, + ); diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createListDevicesClient.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createListDevicesClient.ts new file mode 100644 index 00000000000..b6ec1ffd385 --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createListDevicesClient.ts @@ -0,0 +1,26 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers'; + +import { + ListDevicesCommandInput, + ListDevicesCommandOutput, + ServiceClientFactoryInput, +} from './types'; +import { cognitoUserPoolTransferHandler } from './shared/handler'; +import { + createUserPoolDeserializer, + createUserPoolSerializer, +} from './shared/serde'; +import { DEFAULT_SERVICE_CLIENT_API_CONFIG } from './constants'; + +export const createListDevicesClient = (config: ServiceClientFactoryInput) => + composeServiceApi( + cognitoUserPoolTransferHandler, + createUserPoolSerializer('ListDevices'), + createUserPoolDeserializer(), + { + ...DEFAULT_SERVICE_CLIENT_API_CONFIG, + ...config, + }, + ); diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createResendConfirmationCodeClient.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createResendConfirmationCodeClient.ts new file mode 100644 index 00000000000..7fda8d140c5 --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createResendConfirmationCodeClient.ts @@ -0,0 +1,30 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers'; + +import { + ResendConfirmationCodeCommandInput, + ResendConfirmationCodeCommandOutput, + ServiceClientFactoryInput, +} from './types'; +import { cognitoUserPoolTransferHandler } from './shared/handler'; +import { + createUserPoolDeserializer, + createUserPoolSerializer, +} from './shared/serde'; +import { DEFAULT_SERVICE_CLIENT_API_CONFIG } from './constants'; + +export const createResendConfirmationCodeClient = ( + config: ServiceClientFactoryInput, +) => + composeServiceApi( + cognitoUserPoolTransferHandler, + createUserPoolSerializer( + 'ResendConfirmationCode', + ), + createUserPoolDeserializer(), + { + ...DEFAULT_SERVICE_CLIENT_API_CONFIG, + ...config, + }, + ); diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createRespondToAuthChallengeClient.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createRespondToAuthChallengeClient.ts new file mode 100644 index 00000000000..736fdfd0ed7 --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createRespondToAuthChallengeClient.ts @@ -0,0 +1,30 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers'; + +import { + RespondToAuthChallengeCommandInput, + RespondToAuthChallengeCommandOutput, + ServiceClientFactoryInput, +} from './types'; +import { cognitoUserPoolTransferHandler } from './shared/handler'; +import { + createUserPoolDeserializer, + createUserPoolSerializer, +} from './shared/serde'; +import { DEFAULT_SERVICE_CLIENT_API_CONFIG } from './constants'; + +export const createRespondToAuthChallengeClient = ( + config: ServiceClientFactoryInput, +) => + composeServiceApi( + cognitoUserPoolTransferHandler, + createUserPoolSerializer( + 'RespondToAuthChallenge', + ), + createUserPoolDeserializer(), + { + ...DEFAULT_SERVICE_CLIENT_API_CONFIG, + ...config, + }, + ); diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createRevokeTokenClient.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createRevokeTokenClient.ts new file mode 100644 index 00000000000..4deb8a8faf3 --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createRevokeTokenClient.ts @@ -0,0 +1,29 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers'; + +import { cognitoUserPoolTransferHandler } from './shared/handler'; +import { + createUserPoolDeserializer, + createUserPoolSerializer, +} from './shared/serde'; +import { ServiceClientFactoryInput } from './types'; +import { DEFAULT_SERVICE_CLIENT_API_CONFIG } from './constants'; + +interface RevokeTokenInput { + Token: string; + ClientId: string; +} + +type RevokeTokenOutput = Record; + +export const createRevokeTokenClient = (config: ServiceClientFactoryInput) => + composeServiceApi( + cognitoUserPoolTransferHandler, + createUserPoolSerializer('RevokeToken'), + createUserPoolDeserializer(), + { + ...DEFAULT_SERVICE_CLIENT_API_CONFIG, + ...config, + }, + ); diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createSetUserMFAPreferenceClient.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createSetUserMFAPreferenceClient.ts new file mode 100644 index 00000000000..60b0f4bfddd --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createSetUserMFAPreferenceClient.ts @@ -0,0 +1,30 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers'; + +import { + ServiceClientFactoryInput, + SetUserMFAPreferenceCommandInput, + SetUserMFAPreferenceCommandOutput, +} from './types'; +import { cognitoUserPoolTransferHandler } from './shared/handler'; +import { + createUserPoolDeserializer, + createUserPoolSerializer, +} from './shared/serde'; +import { DEFAULT_SERVICE_CLIENT_API_CONFIG } from './constants'; + +export const createSetUserMFAPreferenceClient = ( + config: ServiceClientFactoryInput, +) => + composeServiceApi( + cognitoUserPoolTransferHandler, + createUserPoolSerializer( + 'SetUserMFAPreference', + ), + createUserPoolDeserializer(), + { + ...DEFAULT_SERVICE_CLIENT_API_CONFIG, + ...config, + }, + ); diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createSignUpClient.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createSignUpClient.ts new file mode 100644 index 00000000000..e77676bab1d --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createSignUpClient.ts @@ -0,0 +1,26 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers'; + +import { + ServiceClientFactoryInput, + SignUpCommandInput, + SignUpCommandOutput, +} from './types'; +import { DEFAULT_SERVICE_CLIENT_API_CONFIG } from './constants'; +import { cognitoUserPoolTransferHandler } from './shared/handler'; +import { + createUserPoolDeserializer, + createUserPoolSerializer, +} from './shared/serde'; + +export const createSignUpClient = (config: ServiceClientFactoryInput) => + composeServiceApi( + cognitoUserPoolTransferHandler, + createUserPoolSerializer('SignUp'), + createUserPoolDeserializer(), + { + ...DEFAULT_SERVICE_CLIENT_API_CONFIG, + ...config, + }, + ); diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createUpdateDeviceStatusClient.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createUpdateDeviceStatusClient.ts new file mode 100644 index 00000000000..9e511187ba5 --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createUpdateDeviceStatusClient.ts @@ -0,0 +1,30 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers'; + +import { + ServiceClientFactoryInput, + UpdateDeviceStatusCommandInput, + UpdateDeviceStatusCommandOutput, +} from './types'; +import { cognitoUserPoolTransferHandler } from './shared/handler'; +import { + createUserPoolDeserializer, + createUserPoolSerializer, +} from './shared/serde'; +import { DEFAULT_SERVICE_CLIENT_API_CONFIG } from './constants'; + +export const createUpdateDeviceStatusClient = ( + config: ServiceClientFactoryInput, +) => + composeServiceApi( + cognitoUserPoolTransferHandler, + createUserPoolSerializer( + 'UpdateDeviceStatus', + ), + createUserPoolDeserializer(), + { + ...DEFAULT_SERVICE_CLIENT_API_CONFIG, + ...config, + }, + ); diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createUpdateUserAttributesClient.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createUpdateUserAttributesClient.ts new file mode 100644 index 00000000000..5c71001c41d --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createUpdateUserAttributesClient.ts @@ -0,0 +1,30 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers'; + +import { + ServiceClientFactoryInput, + UpdateUserAttributesCommandInput, + UpdateUserAttributesCommandOutput, +} from './types'; +import { cognitoUserPoolTransferHandler } from './shared/handler'; +import { + createUserPoolDeserializer, + createUserPoolSerializer, +} from './shared/serde'; +import { DEFAULT_SERVICE_CLIENT_API_CONFIG } from './constants'; + +export const createUpdateUserAttributesClient = ( + config: ServiceClientFactoryInput, +) => + composeServiceApi( + cognitoUserPoolTransferHandler, + createUserPoolSerializer( + 'UpdateUserAttributes', + ), + createUserPoolDeserializer(), + { + ...DEFAULT_SERVICE_CLIENT_API_CONFIG, + ...config, + }, + ); diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createVerifySoftwareTokenClient.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createVerifySoftwareTokenClient.ts new file mode 100644 index 00000000000..c5b63486c42 --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createVerifySoftwareTokenClient.ts @@ -0,0 +1,30 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers'; + +import { + ServiceClientFactoryInput, + VerifySoftwareTokenCommandInput, + VerifySoftwareTokenCommandOutput, +} from './types'; +import { cognitoUserPoolTransferHandler } from './shared/handler'; +import { + createUserPoolDeserializer, + createUserPoolSerializer, +} from './shared/serde'; +import { DEFAULT_SERVICE_CLIENT_API_CONFIG } from './constants'; + +export const createVerifySoftwareTokenClient = ( + config: ServiceClientFactoryInput, +) => + composeServiceApi( + cognitoUserPoolTransferHandler, + createUserPoolSerializer( + 'VerifySoftwareToken', + ), + createUserPoolDeserializer(), + { + ...DEFAULT_SERVICE_CLIENT_API_CONFIG, + ...config, + }, + ); diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createVerifyUserAttributeClient.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createVerifyUserAttributeClient.ts new file mode 100644 index 00000000000..ad24b27c97a --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/createVerifyUserAttributeClient.ts @@ -0,0 +1,30 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers'; + +import { + ServiceClientFactoryInput, + VerifyUserAttributeCommandInput, + VerifyUserAttributeCommandOutput, +} from './types'; +import { cognitoUserPoolTransferHandler } from './shared/handler'; +import { + createUserPoolDeserializer, + createUserPoolSerializer, +} from './shared/serde'; +import { DEFAULT_SERVICE_CLIENT_API_CONFIG } from './constants'; + +export const createVerifyUserAttributeClient = ( + config: ServiceClientFactoryInput, +) => + composeServiceApi( + cognitoUserPoolTransferHandler, + createUserPoolSerializer( + 'VerifyUserAttribute', + ), + createUserPoolDeserializer(), + { + ...DEFAULT_SERVICE_CLIENT_API_CONFIG, + ...config, + }, + ); diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/index.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/index.ts new file mode 100644 index 00000000000..2b93cd09150 --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/index.ts @@ -0,0 +1,26 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +export { createInitiateAuthClient } from './createInitiateAuthClient'; +export { createRevokeTokenClient } from './createRevokeTokenClient'; +export { createSignUpClient } from './createSignUpClient'; +export { createConfirmSignUpClient } from './createConfirmSignUpClient'; +export { createForgotPasswordClient } from './createForgotPasswordClient'; +export { createConfirmForgotPasswordClient } from './createConfirmForgotPasswordClient'; +export { createRespondToAuthChallengeClient } from './createRespondToAuthChallengeClient'; +export { createResendConfirmationCodeClient } from './createResendConfirmationCodeClient'; +export { createVerifySoftwareTokenClient } from './createVerifySoftwareTokenClient'; +export { createAssociateSoftwareTokenClient } from './createAssociateSoftwareTokenClient'; +export { createSetUserMFAPreferenceClient } from './createSetUserMFAPreferenceClient'; +export { createGetUserClient } from './createGetUserClient'; +export { createChangePasswordClient } from './createChangePasswordClient'; +export { createConfirmDeviceClient } from './createConfirmDeviceClient'; +export { createForgetDeviceClient } from './createForgetDeviceClient'; +export { createDeleteUserClient } from './createDeleteUserClient'; +export { createGetUserAttributeVerificationCodeClient } from './createGetUserAttributeVerificationCodeClient'; +export { createGlobalSignOutClient } from './createGlobalSignOutClient'; +export { createUpdateUserAttributesClient } from './createUpdateUserAttributesClient'; +export { createVerifyUserAttributeClient } from './createVerifyUserAttributeClient'; +export { createUpdateDeviceStatusClient } from './createUpdateDeviceStatusClient'; +export { createListDevicesClient } from './createListDevicesClient'; +export { createDeleteUserAttributesClient } from './createDeleteUserAttributesClient'; diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/shared/handler/cognitoUserPoolTransferHandler.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/shared/handler/cognitoUserPoolTransferHandler.ts new file mode 100644 index 00000000000..b1b917f0a08 --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/shared/handler/cognitoUserPoolTransferHandler.ts @@ -0,0 +1,37 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { composeTransferHandler } from '@aws-amplify/core/internals/aws-client-utils/composers'; +import { + HttpRequest, + Middleware, + unauthenticatedHandler, +} from '@aws-amplify/core/internals/aws-client-utils'; +import { HttpResponse } from '@aws-amplify/core/src/clients/types'; + +/** + * A Cognito Identity-specific middleware that disables caching for all requests. + */ +const disableCacheMiddlewareFactory: Middleware< + HttpRequest, + HttpResponse, + Record +> = () => (next, _) => + async function disableCacheMiddleware(request) { + request.headers['cache-control'] = 'no-store'; + + return next(request); + }; + +/** + * A Cognito Identity-specific transfer handler that does NOT sign requests, and + * disables caching. + * + * @internal + */ +export const cognitoUserPoolTransferHandler = composeTransferHandler< + [Parameters[0]], + HttpRequest, + HttpResponse, + typeof unauthenticatedHandler +>(unauthenticatedHandler, [disableCacheMiddlewareFactory]); diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/shared/handler/index.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/shared/handler/index.ts new file mode 100644 index 00000000000..c0df8483e89 --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/shared/handler/index.ts @@ -0,0 +1,4 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +export { cognitoUserPoolTransferHandler } from './cognitoUserPoolTransferHandler'; diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/shared/serde/createEmptyResponseDeserializer.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/shared/serde/createEmptyResponseDeserializer.ts new file mode 100644 index 00000000000..a27f4ef0564 --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/shared/serde/createEmptyResponseDeserializer.ts @@ -0,0 +1,21 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { + HttpResponse, + parseJsonError, +} from '@aws-amplify/core/internals/aws-client-utils'; + +import { assertServiceError } from '../../../../../../errors/utils/assertServiceError'; +import { AuthError } from '../../../../../../errors/AuthError'; + +export const createEmptyResponseDeserializer = + (): ((response: HttpResponse) => Promise) => + async (response: HttpResponse): Promise => { + if (response.statusCode >= 300) { + const error = await parseJsonError(response); + assertServiceError(error); + throw new AuthError({ name: error.name, message: error.message }); + } else { + return undefined; + } + }; diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/shared/serde/createUserPoolDeserializer.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/shared/serde/createUserPoolDeserializer.ts new file mode 100644 index 00000000000..dc9c16d7d9f --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/shared/serde/createUserPoolDeserializer.ts @@ -0,0 +1,23 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { + HttpResponse, + parseJsonBody, + parseJsonError, +} from '@aws-amplify/core/internals/aws-client-utils'; + +import { assertServiceError } from '../../../../../../errors/utils/assertServiceError'; +import { AuthError } from '../../../../../../errors/AuthError'; + +export const createUserPoolDeserializer = + (): ((response: HttpResponse) => Promise) => + async (response: HttpResponse): Promise => { + if (response.statusCode >= 300) { + const error = await parseJsonError(response); + assertServiceError(error); + throw new AuthError({ name: error.name, message: error.message }); + } + + return parseJsonBody(response); + }; diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/shared/serde/createUserPoolSerializer.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/shared/serde/createUserPoolSerializer.ts new file mode 100644 index 00000000000..81f22df9312 --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/shared/serde/createUserPoolSerializer.ts @@ -0,0 +1,58 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { + Endpoint, + Headers, + HttpRequest, +} from '@aws-amplify/core/internals/aws-client-utils'; + +type ClientOperation = + | 'SignUp' + | 'ConfirmSignUp' + | 'ForgotPassword' + | 'ConfirmForgotPassword' + | 'InitiateAuth' + | 'RespondToAuthChallenge' + | 'ResendConfirmationCode' + | 'VerifySoftwareToken' + | 'AssociateSoftwareToken' + | 'SetUserMFAPreference' + | 'GetUser' + | 'ChangePassword' + | 'ConfirmDevice' + | 'ForgetDevice' + | 'DeleteUser' + | 'GetUserAttributeVerificationCode' + | 'GlobalSignOut' + | 'UpdateUserAttributes' + | 'VerifyUserAttribute' + | 'DeleteUserAttributes' + | 'UpdateDeviceStatus' + | 'ListDevices' + | 'RevokeToken'; + +export const createUserPoolSerializer = + (operation: ClientOperation) => + (input: Input, endpoint: Endpoint): HttpRequest => { + const headers = getSharedHeaders(operation); + const body = JSON.stringify(input); + + return buildHttpRpcRequest(endpoint, headers, body); + }; + +const getSharedHeaders = (operation: string): Headers => ({ + 'content-type': 'application/x-amz-json-1.1', + 'x-amz-target': `AWSCognitoIdentityProviderService.${operation}`, +}); + +const buildHttpRpcRequest = ( + { url }: Endpoint, + headers: Headers, + body: string, +): HttpRequest => ({ + headers, + url, + body, + method: 'POST', +}); diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/shared/serde/index.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/shared/serde/index.ts new file mode 100644 index 00000000000..bb805866e28 --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/shared/serde/index.ts @@ -0,0 +1,6 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +export { createUserPoolSerializer } from './createUserPoolSerializer'; +export { createUserPoolDeserializer } from './createUserPoolDeserializer'; +export { createEmptyResponseDeserializer } from './createEmptyResponseDeserializer'; diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/types/index.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/types/index.ts new file mode 100644 index 00000000000..3374c6b6194 --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/types/index.ts @@ -0,0 +1,4 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +export * from './sdk'; +export * from './serviceClient'; diff --git a/packages/auth/src/providers/cognito/utils/clients/CognitoIdentityProvider/types.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/types/sdk.ts similarity index 100% rename from packages/auth/src/providers/cognito/utils/clients/CognitoIdentityProvider/types.ts rename to packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/types/sdk.ts diff --git a/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/types/serviceClient.ts b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/types/serviceClient.ts new file mode 100644 index 00000000000..0f358133832 --- /dev/null +++ b/packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/types/serviceClient.ts @@ -0,0 +1,8 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { EndpointResolverOptions } from '@aws-amplify/core/internals/aws-client-utils'; + +export interface ServiceClientFactoryInput { + endpointResolver(options: EndpointResolverOptions): { url: URL }; +} diff --git a/packages/auth/src/foundation/parsers/index.ts b/packages/auth/src/foundation/parsers/index.ts new file mode 100644 index 00000000000..901f99a010e --- /dev/null +++ b/packages/auth/src/foundation/parsers/index.ts @@ -0,0 +1,6 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +export { + getRegionFromUserPoolId, + getRegionFromIdentityPoolId, +} from './regionParsers'; diff --git a/packages/auth/src/providers/cognito/utils/clients/CognitoIdentityProvider/utils.ts b/packages/auth/src/foundation/parsers/regionParsers.ts similarity index 86% rename from packages/auth/src/providers/cognito/utils/clients/CognitoIdentityProvider/utils.ts rename to packages/auth/src/foundation/parsers/regionParsers.ts index 2202f2dcd37..193ddee374d 100644 --- a/packages/auth/src/providers/cognito/utils/clients/CognitoIdentityProvider/utils.ts +++ b/packages/auth/src/foundation/parsers/regionParsers.ts @@ -1,9 +1,8 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 +import { AuthError } from '../../errors/AuthError'; -import { AuthError } from '../../../../../errors/AuthError'; - -export function getRegion(userPoolId?: string): string { +export function getRegionFromUserPoolId(userPoolId?: string): string { const region = userPoolId?.split('_')[0]; if ( !userPoolId || diff --git a/packages/auth/src/providers/cognito/apis/confirmResetPassword.ts b/packages/auth/src/providers/cognito/apis/confirmResetPassword.ts index 29081093e5c..5c4edc100cf 100644 --- a/packages/auth/src/providers/cognito/apis/confirmResetPassword.ts +++ b/packages/auth/src/providers/cognito/apis/confirmResetPassword.ts @@ -10,11 +10,12 @@ import { import { AuthValidationErrorCode } from '../../../errors/types/validation'; import { assertValidationError } from '../../../errors/utils/assertValidationError'; import { ConfirmResetPasswordInput } from '../types'; -import { confirmForgotPassword } from '../utils/clients/CognitoIdentityProvider'; -import { getRegion } from '../utils/clients/CognitoIdentityProvider/utils'; import { ConfirmForgotPasswordException } from '../../cognito/types/errors'; import { getAuthUserAgentValue } from '../../../utils'; import { getUserContextData } from '../utils/userContextData'; +import { createConfirmForgotPasswordClient } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../factories'; +import { getRegionFromUserPoolId } from '../../../foundation/parsers'; /** * Confirms the new password and verification code to reset the password. * @@ -30,7 +31,7 @@ export async function confirmResetPassword( ): Promise { const authConfig = Amplify.getConfig().Auth?.Cognito; assertTokenProviderConfig(authConfig); - const { userPoolClientId, userPoolId } = authConfig; + const { userPoolClientId, userPoolId, userPoolEndpoint } = authConfig; const { username, newPassword } = input; assertValidationError( !!username, @@ -53,10 +54,14 @@ export async function confirmResetPassword( userPoolId, userPoolClientId, }); - + const confirmForgotPassword = createConfirmForgotPasswordClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); await confirmForgotPassword( { - region: getRegion(authConfig.userPoolId), + region: getRegionFromUserPoolId(authConfig.userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.ConfirmResetPassword), }, { diff --git a/packages/auth/src/providers/cognito/apis/confirmSignIn.ts b/packages/auth/src/providers/cognito/apis/confirmSignIn.ts index 6aad224af30..b8e8475aa42 100644 --- a/packages/auth/src/providers/cognito/apis/confirmSignIn.ts +++ b/packages/auth/src/providers/cognito/apis/confirmSignIn.ts @@ -17,7 +17,7 @@ import { } from '../utils/signInStore'; import { AuthError } from '../../../errors/AuthError'; import { - getNewDeviceMetatada, + getNewDeviceMetadata, getSignInResult, getSignInResultFromError, handleChallengeName, @@ -27,12 +27,12 @@ import { assertValidationError } from '../../../errors/utils/assertValidationErr import { AuthValidationErrorCode } from '../../../errors/types/validation'; import { AuthErrorCodes } from '../../../common/AuthErrorStrings'; import { cacheCognitoTokens } from '../tokenProvider/cacheTokens'; +import { tokenOrchestrator } from '../tokenProvider'; +import { dispatchSignedInHubEvent } from '../utils/dispatchSignedInHubEvent'; import { ChallengeName, ChallengeParameters, -} from '../utils/clients/CognitoIdentityProvider/types'; -import { tokenOrchestrator } from '../tokenProvider'; -import { dispatchSignedInHubEvent } from '../utils/dispatchSignedInHubEvent'; +} from '../../../foundation/factories/serviceClients/cognitoIdentityProvider/types'; /** * Continues or completes the sign in process when required by the initial call to `signIn`. @@ -113,11 +113,12 @@ export async function confirmSignIn( await cacheCognitoTokens({ username, ...AuthenticationResult, - NewDeviceMetadata: await getNewDeviceMetatada( - authConfig.userPoolId, - AuthenticationResult.NewDeviceMetadata, - AuthenticationResult.AccessToken, - ), + NewDeviceMetadata: await getNewDeviceMetadata({ + userPoolId: authConfig.userPoolId, + userPoolEndpoint: authConfig.userPoolEndpoint, + newDeviceMetadata: AuthenticationResult.NewDeviceMetadata, + accessToken: AuthenticationResult.AccessToken, + }), signInDetails, }); diff --git a/packages/auth/src/providers/cognito/apis/confirmSignUp.ts b/packages/auth/src/providers/cognito/apis/confirmSignUp.ts index 62fdf93a82c..92adf180210 100644 --- a/packages/auth/src/providers/cognito/apis/confirmSignUp.ts +++ b/packages/auth/src/providers/cognito/apis/confirmSignUp.ts @@ -12,8 +12,7 @@ import { ConfirmSignUpInput, ConfirmSignUpOutput } from '../types'; import { assertValidationError } from '../../../errors/utils/assertValidationError'; import { AuthValidationErrorCode } from '../../../errors/types/validation'; import { ConfirmSignUpException } from '../types/errors'; -import { confirmSignUp as confirmSignUpClient } from '../utils/clients/CognitoIdentityProvider'; -import { getRegion } from '../utils/clients/CognitoIdentityProvider/utils'; +import { getRegionFromUserPoolId } from '../../../foundation/parsers'; import { AutoSignInEventData } from '../types/models'; import { isAutoSignInStarted, @@ -22,6 +21,8 @@ import { } from '../utils/signUpHelpers'; import { getAuthUserAgentValue } from '../../../utils'; import { getUserContextData } from '../utils/userContextData'; +import { createConfirmSignUpClient } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../factories'; /** * Confirms a new user account. @@ -41,7 +42,7 @@ export async function confirmSignUp( const authConfig = Amplify.getConfig().Auth?.Cognito; assertTokenProviderConfig(authConfig); - const { userPoolId, userPoolClientId } = authConfig; + const { userPoolId, userPoolClientId, userPoolEndpoint } = authConfig; const clientMetadata = options?.clientMetadata; assertValidationError( !!username, @@ -58,9 +59,15 @@ export async function confirmSignUp( userPoolClientId, }); + const confirmSignUpClient = createConfirmSignUpClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); + await confirmSignUpClient( { - region: getRegion(authConfig.userPoolId), + region: getRegionFromUserPoolId(authConfig.userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.ConfirmSignUp), }, { diff --git a/packages/auth/src/providers/cognito/apis/confirmUserAttribute.ts b/packages/auth/src/providers/cognito/apis/confirmUserAttribute.ts index 951a97f2822..8c0c4dba1ad 100644 --- a/packages/auth/src/providers/cognito/apis/confirmUserAttribute.ts +++ b/packages/auth/src/providers/cognito/apis/confirmUserAttribute.ts @@ -9,12 +9,13 @@ import { import { AuthValidationErrorCode } from '../../../errors/types/validation'; import { assertValidationError } from '../../../errors/utils/assertValidationError'; -import { verifyUserAttribute } from '../utils/clients/CognitoIdentityProvider'; import { VerifyUserAttributeException } from '../types/errors'; -import { getRegion } from '../utils/clients/CognitoIdentityProvider/utils'; +import { getRegionFromUserPoolId } from '../../../foundation/parsers'; import { assertAuthTokens } from '../utils/types'; import { ConfirmUserAttributeInput } from '../types'; import { getAuthUserAgentValue } from '../../../utils'; +import { createVerifyUserAttributeClient } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../factories'; /** * Confirms a user attribute with the confirmation code. @@ -30,6 +31,7 @@ export async function confirmUserAttribute( ): Promise { const authConfig = Amplify.getConfig().Auth?.Cognito; assertTokenProviderConfig(authConfig); + const { userPoolEndpoint, userPoolId } = authConfig; const { confirmationCode, userAttributeKey } = input; assertValidationError( !!confirmationCode, @@ -37,9 +39,14 @@ export async function confirmUserAttribute( ); const { tokens } = await fetchAuthSession({ forceRefresh: false }); assertAuthTokens(tokens); + const verifyUserAttribute = createVerifyUserAttributeClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); await verifyUserAttribute( { - region: getRegion(authConfig.userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.ConfirmUserAttribute), }, { diff --git a/packages/auth/src/providers/cognito/apis/deleteUser.ts b/packages/auth/src/providers/cognito/apis/deleteUser.ts index e14bde07f09..53c0c18c6dd 100644 --- a/packages/auth/src/providers/cognito/apis/deleteUser.ts +++ b/packages/auth/src/providers/cognito/apis/deleteUser.ts @@ -7,12 +7,13 @@ import { assertTokenProviderConfig, } from '@aws-amplify/core/internals/utils'; -import { getRegion } from '../utils/clients/CognitoIdentityProvider/utils'; +import { getRegionFromUserPoolId } from '../../../foundation/parsers'; import { assertAuthTokens } from '../utils/types'; -import { deleteUser as serviceDeleteUser } from '../utils/clients/CognitoIdentityProvider'; import { DeleteUserException } from '../types/errors'; import { tokenOrchestrator } from '../tokenProvider'; import { getAuthUserAgentValue } from '../../../utils'; +import { createDeleteUserClient } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../factories'; import { signOut } from './signOut'; @@ -25,13 +26,17 @@ import { signOut } from './signOut'; export async function deleteUser(): Promise { const authConfig = Amplify.getConfig().Auth?.Cognito; assertTokenProviderConfig(authConfig); - + const { userPoolEndpoint, userPoolId } = authConfig; const { tokens } = await fetchAuthSession(); assertAuthTokens(tokens); - + const serviceDeleteUser = createDeleteUserClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); await serviceDeleteUser( { - region: getRegion(authConfig.userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.DeleteUser), }, { diff --git a/packages/auth/src/providers/cognito/apis/deleteUserAttributes.ts b/packages/auth/src/providers/cognito/apis/deleteUserAttributes.ts index 5812b656d60..b958dfacc1f 100644 --- a/packages/auth/src/providers/cognito/apis/deleteUserAttributes.ts +++ b/packages/auth/src/providers/cognito/apis/deleteUserAttributes.ts @@ -7,12 +7,13 @@ import { assertTokenProviderConfig, } from '@aws-amplify/core/internals/utils'; -import { deleteUserAttributes as deleteUserAttributesClient } from '../utils/clients/CognitoIdentityProvider'; -import { getRegion } from '../utils/clients/CognitoIdentityProvider/utils'; +import { getRegionFromUserPoolId } from '../../../foundation/parsers'; import { assertAuthTokens } from '../utils/types'; import { DeleteUserAttributesInput } from '../types'; import { DeleteUserAttributesException } from '../types/errors'; import { getAuthUserAgentValue } from '../../../utils'; +import { createDeleteUserAttributesClient } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../factories'; /** * Deletes user attributes. @@ -27,11 +28,17 @@ export async function deleteUserAttributes( const authConfig = Amplify.getConfig().Auth?.Cognito; assertTokenProviderConfig(authConfig); const { userAttributeKeys } = input; + const { userPoolEndpoint, userPoolId } = authConfig; const { tokens } = await fetchAuthSession({ forceRefresh: false }); assertAuthTokens(tokens); + const deleteUserAttributesClient = createDeleteUserAttributesClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); await deleteUserAttributesClient( { - region: getRegion(authConfig.userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.DeleteUserAttributes), }, { diff --git a/packages/auth/src/providers/cognito/apis/fetchDevices.ts b/packages/auth/src/providers/cognito/apis/fetchDevices.ts index 29be20e7a78..c0dc69f22f4 100644 --- a/packages/auth/src/providers/cognito/apis/fetchDevices.ts +++ b/packages/auth/src/providers/cognito/apis/fetchDevices.ts @@ -8,12 +8,13 @@ import { } from '@aws-amplify/core/internals/utils'; import { FetchDevicesOutput } from '../types'; -import { listDevices } from '../utils/clients/CognitoIdentityProvider'; -import { DeviceType } from '../utils/clients/CognitoIdentityProvider/types'; +import { DeviceType } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider/types'; import { assertAuthTokens } from '../utils/types'; -import { getRegion } from '../utils/clients/CognitoIdentityProvider/utils'; +import { getRegionFromUserPoolId } from '../../../foundation/parsers'; import { rememberDevice } from '..'; import { getAuthUserAgentValue } from '../../../utils'; +import { createListDevicesClient } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../factories'; // Cognito Documentation for max device // https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListDevices.html#API_ListDevices_RequestSyntax @@ -30,13 +31,17 @@ const MAX_DEVICES = 60; export async function fetchDevices(): Promise { const authConfig = Amplify.getConfig().Auth?.Cognito; assertTokenProviderConfig(authConfig); - + const { userPoolEndpoint, userPoolId } = authConfig; const { tokens } = await fetchAuthSession(); assertAuthTokens(tokens); - + const listDevices = createListDevicesClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); const response = await listDevices( { - region: getRegion(authConfig.userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.FetchDevices), }, { diff --git a/packages/auth/src/providers/cognito/apis/fetchMFAPreference.ts b/packages/auth/src/providers/cognito/apis/fetchMFAPreference.ts index ef42d34f72f..e6da216ba81 100644 --- a/packages/auth/src/providers/cognito/apis/fetchMFAPreference.ts +++ b/packages/auth/src/providers/cognito/apis/fetchMFAPreference.ts @@ -10,10 +10,11 @@ import { import { FetchMFAPreferenceOutput } from '../types'; import { getMFAType, getMFATypes } from '../utils/signInHelpers'; import { GetUserException } from '../types/errors'; -import { getUser } from '../utils/clients/CognitoIdentityProvider'; -import { getRegion } from '../utils/clients/CognitoIdentityProvider/utils'; +import { getRegionFromUserPoolId } from '../../../foundation/parsers'; import { assertAuthTokens } from '../utils/types'; import { getAuthUserAgentValue } from '../../../utils'; +import { createGetUserClient } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../factories'; /** * Fetches the preferred MFA setting and enabled MFA settings for the user. @@ -26,11 +27,17 @@ import { getAuthUserAgentValue } from '../../../utils'; export async function fetchMFAPreference(): Promise { const authConfig = Amplify.getConfig().Auth?.Cognito; assertTokenProviderConfig(authConfig); + const { userPoolEndpoint, userPoolId } = authConfig; const { tokens } = await fetchAuthSession({ forceRefresh: false }); assertAuthTokens(tokens); + const getUser = createGetUserClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); const { PreferredMfaSetting, UserMFASettingList } = await getUser( { - region: getRegion(authConfig.userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.FetchMFAPreference), }, { diff --git a/packages/auth/src/providers/cognito/apis/forgetDevice.ts b/packages/auth/src/providers/cognito/apis/forgetDevice.ts index 66dd3488f7b..b1ca574e1e4 100644 --- a/packages/auth/src/providers/cognito/apis/forgetDevice.ts +++ b/packages/auth/src/providers/cognito/apis/forgetDevice.ts @@ -7,13 +7,14 @@ import { assertTokenProviderConfig, } from '@aws-amplify/core/internals/utils'; -import { forgetDevice as serviceForgetDevice } from '../utils/clients/CognitoIdentityProvider'; import { assertAuthTokens, assertDeviceMetadata } from '../utils/types'; -import { getRegion } from '../utils/clients/CognitoIdentityProvider/utils'; +import { getRegionFromUserPoolId } from '../../../foundation/parsers'; import { tokenOrchestrator } from '../tokenProvider'; import { ForgetDeviceInput } from '../types'; import { ForgetDeviceException } from '../../cognito/types/errors'; import { getAuthUserAgentValue } from '../../../utils'; +import { createForgetDeviceClient } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../factories'; /** * Forget a remembered device while authenticated. @@ -27,17 +28,21 @@ export async function forgetDevice(input?: ForgetDeviceInput): Promise { const { device: { id: externalDeviceKey } = { id: undefined } } = input ?? {}; const authConfig = Amplify.getConfig().Auth?.Cognito; assertTokenProviderConfig(authConfig); - + const { userPoolEndpoint, userPoolId } = authConfig; const { tokens } = await fetchAuthSession(); assertAuthTokens(tokens); const deviceMetadata = await tokenOrchestrator.getDeviceMetadata(); const currentDeviceKey = deviceMetadata?.deviceKey; if (!externalDeviceKey) assertDeviceMetadata(deviceMetadata); - + const serviceForgetDevice = createForgetDeviceClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); await serviceForgetDevice( { - region: getRegion(authConfig.userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.ForgetDevice), }, { diff --git a/packages/auth/src/providers/cognito/apis/internal/fetchUserAttributes.ts b/packages/auth/src/providers/cognito/apis/internal/fetchUserAttributes.ts index c1e4e9dd008..01230bf5153 100644 --- a/packages/auth/src/providers/cognito/apis/internal/fetchUserAttributes.ts +++ b/packages/auth/src/providers/cognito/apis/internal/fetchUserAttributes.ts @@ -8,26 +8,32 @@ import { fetchAuthSession, } from '@aws-amplify/core/internals/utils'; -import { getUser } from '../../utils/clients/CognitoIdentityProvider'; -import { getRegion } from '../../utils/clients/CognitoIdentityProvider/utils'; +import { getRegionFromUserPoolId } from '../../../../foundation/parsers'; import { assertAuthTokens } from '../../utils/types'; import { FetchUserAttributesOutput } from '../../types'; import { toAuthUserAttribute } from '../../utils/apiHelpers'; import { getAuthUserAgentValue } from '../../../../utils'; +import { createGetUserClient } from '../../../../foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../../factories'; export const fetchUserAttributes = async ( amplify: AmplifyClassV6, ): Promise => { const authConfig = amplify.getConfig().Auth?.Cognito; assertTokenProviderConfig(authConfig); + const { userPoolEndpoint, userPoolId } = authConfig; const { tokens } = await fetchAuthSession(amplify, { forceRefresh: false, }); assertAuthTokens(tokens); - + const getUser = createGetUserClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); const { UserAttributes } = await getUser( { - region: getRegion(authConfig.userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.FetchUserAttributes), }, { diff --git a/packages/auth/src/providers/cognito/apis/rememberDevice.ts b/packages/auth/src/providers/cognito/apis/rememberDevice.ts index 218b7b533e6..eb24022096e 100644 --- a/packages/auth/src/providers/cognito/apis/rememberDevice.ts +++ b/packages/auth/src/providers/cognito/apis/rememberDevice.ts @@ -7,12 +7,13 @@ import { assertTokenProviderConfig, } from '@aws-amplify/core/internals/utils'; -import { updateDeviceStatus } from '../utils/clients/CognitoIdentityProvider'; import { assertAuthTokens, assertDeviceMetadata } from '../utils/types'; -import { getRegion } from '../utils/clients/CognitoIdentityProvider/utils'; +import { getRegionFromUserPoolId } from '../../../foundation/parsers'; import { tokenOrchestrator } from '../tokenProvider'; import { UpdateDeviceStatusException } from '../../cognito/types/errors'; import { getAuthUserAgentValue } from '../../../utils'; +import { createUpdateDeviceStatusClient } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../factories'; /** * Marks device as remembered while authenticated. @@ -24,16 +25,20 @@ import { getAuthUserAgentValue } from '../../../utils'; export async function rememberDevice(): Promise { const authConfig = Amplify.getConfig().Auth?.Cognito; assertTokenProviderConfig(authConfig); - + const { userPoolEndpoint, userPoolId } = authConfig; const { tokens } = await fetchAuthSession(); assertAuthTokens(tokens); const deviceMetadata = await tokenOrchestrator?.getDeviceMetadata(); assertDeviceMetadata(deviceMetadata); - + const updateDeviceStatus = createUpdateDeviceStatusClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); await updateDeviceStatus( { - region: getRegion(authConfig.userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.RememberDevice), }, { diff --git a/packages/auth/src/providers/cognito/apis/resendSignUpCode.ts b/packages/auth/src/providers/cognito/apis/resendSignUpCode.ts index 99ef3996f52..cdda7b980eb 100644 --- a/packages/auth/src/providers/cognito/apis/resendSignUpCode.ts +++ b/packages/auth/src/providers/cognito/apis/resendSignUpCode.ts @@ -12,11 +12,12 @@ import { AuthDeliveryMedium } from '../../../types'; import { assertValidationError } from '../../../errors/utils/assertValidationError'; import { AuthValidationErrorCode } from '../../../errors/types/validation'; import { ResendSignUpCodeInput, ResendSignUpCodeOutput } from '../types'; -import { getRegion } from '../utils/clients/CognitoIdentityProvider/utils'; -import { resendConfirmationCode } from '../utils/clients/CognitoIdentityProvider'; +import { getRegionFromUserPoolId } from '../../../foundation/parsers'; import { getAuthUserAgentValue } from '../../../utils'; import { getUserContextData } from '../utils/userContextData'; import { ResendConfirmationException } from '../types/errors'; +import { createResendConfirmationCodeClient } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../factories'; /** * Resend the confirmation code while signing up @@ -37,7 +38,7 @@ export async function resendSignUpCode( ); const authConfig = Amplify.getConfig().Auth?.Cognito; assertTokenProviderConfig(authConfig); - const { userPoolClientId, userPoolId } = authConfig; + const { userPoolClientId, userPoolId, userPoolEndpoint } = authConfig; const clientMetadata = input.options?.clientMetadata; const UserContextData = getUserContextData({ @@ -45,10 +46,14 @@ export async function resendSignUpCode( userPoolId, userPoolClientId, }); - + const resendConfirmationCode = createResendConfirmationCodeClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); const { CodeDeliveryDetails } = await resendConfirmationCode( { - region: getRegion(authConfig.userPoolId), + region: getRegionFromUserPoolId(authConfig.userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.ResendSignUpCode), }, { diff --git a/packages/auth/src/providers/cognito/apis/resetPassword.ts b/packages/auth/src/providers/cognito/apis/resetPassword.ts index 273a77d413d..cd6d37a39ca 100644 --- a/packages/auth/src/providers/cognito/apis/resetPassword.ts +++ b/packages/auth/src/providers/cognito/apis/resetPassword.ts @@ -12,11 +12,12 @@ import { AuthValidationErrorCode } from '../../../errors/types/validation'; import { assertValidationError } from '../../../errors/utils/assertValidationError'; import { AuthDeliveryMedium } from '../../../types'; import { ResetPasswordInput, ResetPasswordOutput } from '../types'; -import { forgotPassword } from '../utils/clients/CognitoIdentityProvider'; -import { getRegion } from '../utils/clients/CognitoIdentityProvider/utils'; +import { getRegionFromUserPoolId } from '../../../foundation/parsers'; import { ForgotPasswordException } from '../../cognito/types/errors'; import { getAuthUserAgentValue } from '../../../utils'; import { getUserContextData } from '../utils/userContextData'; +import { createForgotPasswordClient } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../factories'; /** * Resets a user's password. @@ -39,7 +40,7 @@ export async function resetPassword( ); const authConfig = Amplify.getConfig().Auth?.Cognito; assertTokenProviderConfig(authConfig); - const { userPoolClientId, userPoolId } = authConfig; + const { userPoolClientId, userPoolId, userPoolEndpoint } = authConfig; const clientMetadata = input.options?.clientMetadata; const UserContextData = getUserContextData({ @@ -48,15 +49,20 @@ export async function resetPassword( userPoolClientId, }); + const forgotPassword = createForgotPasswordClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); const res = await forgotPassword( { - region: getRegion(authConfig.userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.ResetPassword), }, { Username: username, ClientMetadata: clientMetadata, - ClientId: authConfig.userPoolClientId, + ClientId: userPoolClientId, UserContextData, }, ); diff --git a/packages/auth/src/providers/cognito/apis/sendUserAttributeVerificationCode.ts b/packages/auth/src/providers/cognito/apis/sendUserAttributeVerificationCode.ts index 55e5a8b5a84..4b04b2a85d1 100644 --- a/packages/auth/src/providers/cognito/apis/sendUserAttributeVerificationCode.ts +++ b/packages/auth/src/providers/cognito/apis/sendUserAttributeVerificationCode.ts @@ -13,11 +13,12 @@ import { SendUserAttributeVerificationCodeInput, SendUserAttributeVerificationCodeOutput, } from '../types'; -import { getUserAttributeVerificationCode } from '../utils/clients/CognitoIdentityProvider'; import { assertAuthTokens } from '../utils/types'; -import { getRegion } from '../utils/clients/CognitoIdentityProvider/utils'; +import { getRegionFromUserPoolId } from '../../../foundation/parsers'; import { GetUserAttributeVerificationException } from '../types/errors'; import { getAuthUserAgentValue } from '../../../utils'; +import { createGetUserAttributeVerificationCodeClient } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../factories'; /** * Resends user's confirmation code when updating attributes while authenticated. @@ -34,11 +35,18 @@ export const sendUserAttributeVerificationCode = async ( const authConfig = Amplify.getConfig().Auth?.Cognito; const clientMetadata = options?.clientMetadata; assertTokenProviderConfig(authConfig); + const { userPoolEndpoint, userPoolId } = authConfig; const { tokens } = await fetchAuthSession({ forceRefresh: false }); assertAuthTokens(tokens); + const getUserAttributeVerificationCode = + createGetUserAttributeVerificationCodeClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); const { CodeDeliveryDetails } = await getUserAttributeVerificationCode( { - region: getRegion(authConfig.userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue( AuthAction.SendUserAttributeVerificationCode, ), diff --git a/packages/auth/src/providers/cognito/apis/setUpTOTP.ts b/packages/auth/src/providers/cognito/apis/setUpTOTP.ts index e99b8618995..43dac4c787b 100644 --- a/packages/auth/src/providers/cognito/apis/setUpTOTP.ts +++ b/packages/auth/src/providers/cognito/apis/setUpTOTP.ts @@ -14,10 +14,11 @@ import { } from '../types/errors'; import { SetUpTOTPOutput } from '../types'; import { getTOTPSetupDetails } from '../utils/signInHelpers'; -import { associateSoftwareToken } from '../utils/clients/CognitoIdentityProvider'; -import { getRegion } from '../utils/clients/CognitoIdentityProvider/utils'; +import { getRegionFromUserPoolId } from '../../../foundation/parsers'; import { assertAuthTokens } from '../utils/types'; import { getAuthUserAgentValue } from '../../../utils'; +import { createAssociateSoftwareTokenClient } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../factories'; /** * Sets up TOTP for the user. @@ -30,12 +31,18 @@ import { getAuthUserAgentValue } from '../../../utils'; export async function setUpTOTP(): Promise { const authConfig = Amplify.getConfig().Auth?.Cognito; assertTokenProviderConfig(authConfig); + const { userPoolEndpoint, userPoolId } = authConfig; const { tokens } = await fetchAuthSession({ forceRefresh: false }); assertAuthTokens(tokens); const username = tokens.idToken?.payload['cognito:username'] ?? ''; + const associateSoftwareToken = createAssociateSoftwareTokenClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); const { SecretCode } = await associateSoftwareToken( { - region: getRegion(authConfig.userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.SetUpTOTP), }, { diff --git a/packages/auth/src/providers/cognito/apis/signInWithCustomAuth.ts b/packages/auth/src/providers/cognito/apis/signInWithCustomAuth.ts index e55e3f0a50d..a666fba0acb 100644 --- a/packages/auth/src/providers/cognito/apis/signInWithCustomAuth.ts +++ b/packages/auth/src/providers/cognito/apis/signInWithCustomAuth.ts @@ -9,7 +9,7 @@ import { assertValidationError } from '../../../errors/utils/assertValidationErr import { assertServiceError } from '../../../errors/utils/assertServiceError'; import { getActiveSignInUsername, - getNewDeviceMetatada, + getNewDeviceMetadata, getSignInResult, getSignInResultFromError, handleCustomAuthFlowWithoutSRP, @@ -29,7 +29,7 @@ import { cacheCognitoTokens } from '../tokenProvider/cacheTokens'; import { ChallengeName, ChallengeParameters, -} from '../utils/clients/CognitoIdentityProvider/types'; +} from '../../../foundation/factories/serviceClients/cognitoIdentityProvider/types'; import { tokenOrchestrator } from '../tokenProvider'; import { dispatchSignedInHubEvent } from '../utils/dispatchSignedInHubEvent'; @@ -89,11 +89,12 @@ export async function signInWithCustomAuth( await cacheCognitoTokens({ username: activeUsername, ...AuthenticationResult, - NewDeviceMetadata: await getNewDeviceMetatada( - authConfig.userPoolId, - AuthenticationResult.NewDeviceMetadata, - AuthenticationResult.AccessToken, - ), + NewDeviceMetadata: await getNewDeviceMetadata({ + userPoolId: authConfig.userPoolId, + userPoolEndpoint: authConfig.userPoolEndpoint, + newDeviceMetadata: AuthenticationResult.NewDeviceMetadata, + accessToken: AuthenticationResult.AccessToken, + }), signInDetails, }); diff --git a/packages/auth/src/providers/cognito/apis/signInWithCustomSRPAuth.ts b/packages/auth/src/providers/cognito/apis/signInWithCustomSRPAuth.ts index a67fa9f861c..a22f98b3804 100644 --- a/packages/auth/src/providers/cognito/apis/signInWithCustomSRPAuth.ts +++ b/packages/auth/src/providers/cognito/apis/signInWithCustomSRPAuth.ts @@ -9,7 +9,7 @@ import { assertValidationError } from '../../../errors/utils/assertValidationErr import { assertServiceError } from '../../../errors/utils/assertServiceError'; import { getActiveSignInUsername, - getNewDeviceMetatada, + getNewDeviceMetadata, getSignInResult, getSignInResultFromError, handleCustomSRPAuthFlow, @@ -31,7 +31,7 @@ import { cacheCognitoTokens } from '../tokenProvider/cacheTokens'; import { ChallengeName, ChallengeParameters, -} from '../utils/clients/CognitoIdentityProvider/types'; +} from '../../../foundation/factories/serviceClients/cognitoIdentityProvider/types'; import { tokenOrchestrator } from '../tokenProvider'; import { dispatchSignedInHubEvent } from '../utils/dispatchSignedInHubEvent'; @@ -92,11 +92,12 @@ export async function signInWithCustomSRPAuth( await cacheCognitoTokens({ username: activeUsername, ...AuthenticationResult, - NewDeviceMetadata: await getNewDeviceMetatada( - authConfig.userPoolId, - AuthenticationResult.NewDeviceMetadata, - AuthenticationResult.AccessToken, - ), + NewDeviceMetadata: await getNewDeviceMetadata({ + userPoolId: authConfig.userPoolId, + userPoolEndpoint: authConfig.userPoolEndpoint, + newDeviceMetadata: AuthenticationResult.NewDeviceMetadata, + accessToken: AuthenticationResult.AccessToken, + }), signInDetails, }); cleanActiveSignInState(); diff --git a/packages/auth/src/providers/cognito/apis/signInWithSRP.ts b/packages/auth/src/providers/cognito/apis/signInWithSRP.ts index 32f0ca11b99..9bb8d4deca7 100644 --- a/packages/auth/src/providers/cognito/apis/signInWithSRP.ts +++ b/packages/auth/src/providers/cognito/apis/signInWithSRP.ts @@ -10,14 +10,14 @@ import { assertServiceError } from '../../../errors/utils/assertServiceError'; import { ChallengeName, ChallengeParameters, -} from '../utils/clients/CognitoIdentityProvider/types'; +} from '../../../foundation/factories/serviceClients/cognitoIdentityProvider/types'; import { InitiateAuthException, RespondToAuthChallengeException, } from '../types/errors'; import { getActiveSignInUsername, - getNewDeviceMetatada, + getNewDeviceMetadata, getSignInResult, getSignInResultFromError, handleUserSRPAuthFlow, @@ -93,11 +93,12 @@ export async function signInWithSRP( await cacheCognitoTokens({ username: activeUsername, ...AuthenticationResult, - NewDeviceMetadata: await getNewDeviceMetatada( - authConfig.userPoolId, - AuthenticationResult.NewDeviceMetadata, - AuthenticationResult.AccessToken, - ), + NewDeviceMetadata: await getNewDeviceMetadata({ + userPoolId: authConfig.userPoolId, + userPoolEndpoint: authConfig.userPoolEndpoint, + newDeviceMetadata: AuthenticationResult.NewDeviceMetadata, + accessToken: AuthenticationResult.AccessToken, + }), signInDetails, }); diff --git a/packages/auth/src/providers/cognito/apis/signInWithUserPassword.ts b/packages/auth/src/providers/cognito/apis/signInWithUserPassword.ts index e1de730cb1c..071f54f8313 100644 --- a/packages/auth/src/providers/cognito/apis/signInWithUserPassword.ts +++ b/packages/auth/src/providers/cognito/apis/signInWithUserPassword.ts @@ -10,10 +10,10 @@ import { assertValidationError } from '../../../errors/utils/assertValidationErr import { ChallengeName, ChallengeParameters, -} from '../utils/clients/CognitoIdentityProvider/types'; +} from '../../../foundation/factories/serviceClients/cognitoIdentityProvider/types'; import { getActiveSignInUsername, - getNewDeviceMetatada, + getNewDeviceMetadata, getSignInResult, getSignInResultFromError, handleUserPasswordAuthFlow, @@ -87,11 +87,12 @@ export async function signInWithUserPassword( await cacheCognitoTokens({ ...AuthenticationResult, username: activeUsername, - NewDeviceMetadata: await getNewDeviceMetatada( - authConfig.userPoolId, - AuthenticationResult.NewDeviceMetadata, - AuthenticationResult.AccessToken, - ), + NewDeviceMetadata: await getNewDeviceMetadata({ + userPoolId: authConfig.userPoolId, + userPoolEndpoint: authConfig.userPoolEndpoint, + newDeviceMetadata: AuthenticationResult.NewDeviceMetadata, + accessToken: AuthenticationResult.AccessToken, + }), signInDetails, }); cleanActiveSignInState(); diff --git a/packages/auth/src/providers/cognito/apis/signOut.ts b/packages/auth/src/providers/cognito/apis/signOut.ts index e073129ca10..2fa52b73ee4 100644 --- a/packages/auth/src/providers/cognito/apis/signOut.ts +++ b/packages/auth/src/providers/cognito/apis/signOut.ts @@ -20,11 +20,7 @@ import { import { getAuthUserAgentValue } from '../../../utils'; import { SignOutInput } from '../types'; import { tokenOrchestrator } from '../tokenProvider'; -import { - globalSignOut as globalSignOutClient, - revokeToken, -} from '../utils/clients/CognitoIdentityProvider'; -import { getRegion } from '../utils/clients/CognitoIdentityProvider/utils'; +import { getRegionFromUserPoolId } from '../../../foundation/parsers'; import { assertAuthTokens, assertAuthTokensWithRefreshToken, @@ -33,6 +29,11 @@ import { handleOAuthSignOut } from '../utils/oauth'; import { DefaultOAuthStore } from '../utils/signInWithRedirectStore'; import { AuthError } from '../../../errors/AuthError'; import { OAUTH_SIGNOUT_EXCEPTION } from '../../../errors/constants'; +import { + createGlobalSignOutClient, + createRevokeTokenClient, +} from '../../../foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../factories'; const logger = new ConsoleLogger('Auth'); @@ -86,16 +87,23 @@ export async function signOut(input?: SignOutInput): Promise { async function clientSignOut(cognitoConfig: CognitoUserPoolConfig) { try { + const { userPoolEndpoint, userPoolId, userPoolClientId } = cognitoConfig; const authTokens = await tokenOrchestrator.getTokenStore().loadTokens(); assertAuthTokensWithRefreshToken(authTokens); if (isSessionRevocable(authTokens.accessToken)) { + const revokeToken = createRevokeTokenClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); + await revokeToken( { - region: getRegion(cognitoConfig.userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.SignOut), }, { - ClientId: cognitoConfig.userPoolClientId, + ClientId: userPoolClientId, Token: authTokens.refreshToken, }, ); @@ -110,11 +118,17 @@ async function clientSignOut(cognitoConfig: CognitoUserPoolConfig) { async function globalSignOut(cognitoConfig: CognitoUserPoolConfig) { try { + const { userPoolEndpoint, userPoolId } = cognitoConfig; const authTokens = await tokenOrchestrator.getTokenStore().loadTokens(); assertAuthTokens(authTokens); + const globalSignOutClient = createGlobalSignOutClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); await globalSignOutClient( { - region: getRegion(cognitoConfig.userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.SignOut), }, { diff --git a/packages/auth/src/providers/cognito/apis/signUp.ts b/packages/auth/src/providers/cognito/apis/signUp.ts index ef9aef32fa2..3ec246648f5 100644 --- a/packages/auth/src/providers/cognito/apis/signUp.ts +++ b/packages/auth/src/providers/cognito/apis/signUp.ts @@ -10,11 +10,10 @@ import { import { AuthDeliveryMedium } from '../../../types'; import { SignInInput, SignUpInput, SignUpOutput } from '../types'; -import { signUp as signUpClient } from '../utils/clients/CognitoIdentityProvider'; import { assertValidationError } from '../../../errors/utils/assertValidationError'; import { AuthValidationErrorCode } from '../../../errors/types/validation'; import { SignUpException } from '../types/errors'; -import { getRegion } from '../utils/clients/CognitoIdentityProvider/utils'; +import { getRegionFromUserPoolId } from '../../../foundation/parsers'; import { toAttributeType } from '../utils/apiHelpers'; import { autoSignInUserConfirmed, @@ -27,6 +26,8 @@ import { } from '../utils/signUpHelpers'; import { getUserContextData } from '../utils/userContextData'; import { getAuthUserAgentValue } from '../../../utils'; +import { createSignUpClient } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../factories'; import { setAutoSignIn } from './autoSignIn'; @@ -72,11 +73,15 @@ export async function signUp(input: SignUpInput): Promise { setAutoSignInStarted(true); } - const { userPoolId, userPoolClientId } = authConfig; - + const { userPoolId, userPoolClientId, userPoolEndpoint } = authConfig; + const signUpClient = createSignUpClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); const clientOutput = await signUpClient( { - region: getRegion(userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.SignUp), }, { diff --git a/packages/auth/src/providers/cognito/apis/updateMFAPreference.ts b/packages/auth/src/providers/cognito/apis/updateMFAPreference.ts index 790cc82f8bd..5f87522af5a 100644 --- a/packages/auth/src/providers/cognito/apis/updateMFAPreference.ts +++ b/packages/auth/src/providers/cognito/apis/updateMFAPreference.ts @@ -10,11 +10,12 @@ import { import { UpdateMFAPreferenceInput } from '../types'; import { SetUserMFAPreferenceException } from '../types/errors'; import { MFAPreference } from '../types/models'; -import { setUserMFAPreference } from '../utils/clients/CognitoIdentityProvider'; -import { getRegion } from '../utils/clients/CognitoIdentityProvider/utils'; -import { CognitoMFASettings } from '../utils/clients/CognitoIdentityProvider/types'; +import { getRegionFromUserPoolId } from '../../../foundation/parsers'; +import { CognitoMFASettings } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider/types'; import { assertAuthTokens } from '../utils/types'; import { getAuthUserAgentValue } from '../../../utils'; +import { createSetUserMFAPreferenceClient } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../factories'; /** * Updates the MFA preference of the user. @@ -29,11 +30,17 @@ export async function updateMFAPreference( const { sms, totp } = input; const authConfig = Amplify.getConfig().Auth?.Cognito; assertTokenProviderConfig(authConfig); + const { userPoolEndpoint, userPoolId } = authConfig; const { tokens } = await fetchAuthSession({ forceRefresh: false }); assertAuthTokens(tokens); + const setUserMFAPreference = createSetUserMFAPreferenceClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); await setUserMFAPreference( { - region: getRegion(authConfig.userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.UpdateMFAPreference), }, { diff --git a/packages/auth/src/providers/cognito/apis/updatePassword.ts b/packages/auth/src/providers/cognito/apis/updatePassword.ts index 0f83fc9f1df..f8c8c4bdeae 100644 --- a/packages/auth/src/providers/cognito/apis/updatePassword.ts +++ b/packages/auth/src/providers/cognito/apis/updatePassword.ts @@ -10,11 +10,12 @@ import { import { AuthValidationErrorCode } from '../../../errors/types/validation'; import { assertValidationError } from '../../../errors/utils/assertValidationError'; import { UpdatePasswordInput } from '../types'; -import { changePassword } from '../utils/clients/CognitoIdentityProvider'; import { ChangePasswordException } from '../../cognito/types/errors'; -import { getRegion } from '../utils/clients/CognitoIdentityProvider/utils'; +import { getRegionFromUserPoolId } from '../../../foundation/parsers'; import { assertAuthTokens } from '../utils/types'; import { getAuthUserAgentValue } from '../../../utils'; +import { createChangePasswordClient } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../factories'; /** * Updates user's password while authenticated. @@ -29,6 +30,7 @@ export async function updatePassword( ): Promise { const authConfig = Amplify.getConfig().Auth?.Cognito; assertTokenProviderConfig(authConfig); + const { userPoolEndpoint, userPoolId } = authConfig; const { oldPassword, newPassword } = input; assertValidationError( !!oldPassword, @@ -41,9 +43,14 @@ export async function updatePassword( ); const { tokens } = await fetchAuthSession({ forceRefresh: false }); assertAuthTokens(tokens); + const changePassword = createChangePasswordClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); await changePassword( { - region: getRegion(authConfig.userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.UpdatePassword), }, { diff --git a/packages/auth/src/providers/cognito/apis/updateUserAttributes.ts b/packages/auth/src/providers/cognito/apis/updateUserAttributes.ts index b0e6cc7f3f7..5076e3145a5 100644 --- a/packages/auth/src/providers/cognito/apis/updateUserAttributes.ts +++ b/packages/auth/src/providers/cognito/apis/updateUserAttributes.ts @@ -16,13 +16,14 @@ import { UpdateUserAttributesInput, UpdateUserAttributesOutput, } from '../types'; -import { updateUserAttributes as updateUserAttributesClient } from '../utils/clients/CognitoIdentityProvider'; import { assertAuthTokens } from '../utils/types'; -import { getRegion } from '../utils/clients/CognitoIdentityProvider/utils'; +import { getRegionFromUserPoolId } from '../../../foundation/parsers'; import { toAttributeType } from '../utils/apiHelpers'; -import { CodeDeliveryDetailsType } from '../utils/clients/CognitoIdentityProvider/types'; +import { CodeDeliveryDetailsType } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider/types'; import { UpdateUserAttributesException } from '../types/errors'; import { getAuthUserAgentValue } from '../../../utils'; +import { createUpdateUserAttributesClient } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../factories'; /** * Updates user's attributes while authenticated. @@ -39,11 +40,17 @@ export const updateUserAttributes = async ( const authConfig = Amplify.getConfig().Auth?.Cognito; const clientMetadata = options?.clientMetadata; assertTokenProviderConfig(authConfig); + const { userPoolEndpoint, userPoolId } = authConfig; const { tokens } = await fetchAuthSession({ forceRefresh: false }); assertAuthTokens(tokens); + const updateUserAttributesClient = createUpdateUserAttributesClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); const { CodeDeliveryDetailsList } = await updateUserAttributesClient( { - region: getRegion(authConfig.userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.UpdateUserAttributes), }, { diff --git a/packages/auth/src/providers/cognito/apis/verifyTOTPSetup.ts b/packages/auth/src/providers/cognito/apis/verifyTOTPSetup.ts index 66c68fe9690..c5c1212c194 100644 --- a/packages/auth/src/providers/cognito/apis/verifyTOTPSetup.ts +++ b/packages/auth/src/providers/cognito/apis/verifyTOTPSetup.ts @@ -10,11 +10,12 @@ import { import { AuthValidationErrorCode } from '../../../errors/types/validation'; import { assertValidationError } from '../../../errors/utils/assertValidationError'; import { VerifyTOTPSetupInput } from '../types'; -import { verifySoftwareToken } from '../utils/clients/CognitoIdentityProvider'; import { VerifySoftwareTokenException } from '../types/errors'; -import { getRegion } from '../utils/clients/CognitoIdentityProvider/utils'; +import { getRegionFromUserPoolId } from '../../../foundation/parsers'; import { assertAuthTokens } from '../utils/types'; import { getAuthUserAgentValue } from '../../../utils'; +import { createVerifySoftwareTokenClient } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../factories'; /** * Verifies an OTP code retrieved from an associated authentication app. @@ -31,6 +32,7 @@ export async function verifyTOTPSetup( ): Promise { const authConfig = Amplify.getConfig().Auth?.Cognito; assertTokenProviderConfig(authConfig); + const { userPoolEndpoint, userPoolId } = authConfig; const { code, options } = input; assertValidationError( !!code, @@ -38,9 +40,14 @@ export async function verifyTOTPSetup( ); const { tokens } = await fetchAuthSession({ forceRefresh: false }); assertAuthTokens(tokens); + const verifySoftwareToken = createVerifySoftwareTokenClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); await verifySoftwareToken( { - region: getRegion(authConfig.userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.VerifyTOTPSetup), }, { diff --git a/packages/auth/src/providers/cognito/credentialsProvider/IdentityIdProvider.ts b/packages/auth/src/providers/cognito/credentialsProvider/IdentityIdProvider.ts index 4a8614a3db0..b96adf08fbc 100644 --- a/packages/auth/src/providers/cognito/credentialsProvider/IdentityIdProvider.ts +++ b/packages/auth/src/providers/cognito/credentialsProvider/IdentityIdProvider.ts @@ -5,7 +5,7 @@ import { AuthTokens, ConsoleLogger, Identity, getId } from '@aws-amplify/core'; import { CognitoIdentityPoolConfig } from '@aws-amplify/core/internals/utils'; import { AuthError } from '../../../errors/AuthError'; -import { getRegionFromIdentityPoolId } from '../utils/clients/CognitoIdentityProvider/utils'; +import { getRegionFromIdentityPoolId } from '../../../foundation/parsers'; import { GetIdException } from '../types/errors'; import { IdentityIdStore } from './types'; diff --git a/packages/auth/src/providers/cognito/credentialsProvider/IdentityIdStore.ts b/packages/auth/src/providers/cognito/credentialsProvider/IdentityIdStore.ts index ec4bc9ef6b4..283b0e9cd3f 100644 --- a/packages/auth/src/providers/cognito/credentialsProvider/IdentityIdStore.ts +++ b/packages/auth/src/providers/cognito/credentialsProvider/IdentityIdStore.ts @@ -23,6 +23,8 @@ export class DefaultIdentityIdStore implements IdentityIdStore { // Used as in-memory storage _primaryIdentityId: string | undefined; _authKeys: AuthKeys = {}; + _hasGuestIdentityId = false; + setAuthConfig(authConfigParam: AuthConfig) { assertIdentityPoolIdConfig(authConfigParam.Cognito); this.authConfig = authConfigParam; @@ -48,7 +50,10 @@ export class DefaultIdentityIdStore implements IdentityIdStore { const storedIdentityId = await this.keyValueStorage.getItem( this._authKeys.identityId, ); + if (storedIdentityId) { + this._hasGuestIdentityId = true; + return { id: storedIdentityId, type: 'guest', @@ -71,10 +76,14 @@ export class DefaultIdentityIdStore implements IdentityIdStore { this.keyValueStorage.setItem(this._authKeys.identityId, identity.id); // Clear in-memory storage of primary identityId this._primaryIdentityId = undefined; + this._hasGuestIdentityId = true; } else { this._primaryIdentityId = identity.id; // Clear locally stored guest id - this.keyValueStorage.removeItem(this._authKeys.identityId); + if (this._hasGuestIdentityId) { + this.keyValueStorage.removeItem(this._authKeys.identityId); + this._hasGuestIdentityId = false; + } } } diff --git a/packages/auth/src/providers/cognito/credentialsProvider/credentialsProvider.ts b/packages/auth/src/providers/cognito/credentialsProvider/credentialsProvider.ts index fd02d349513..6356ff0fd09 100644 --- a/packages/auth/src/providers/cognito/credentialsProvider/credentialsProvider.ts +++ b/packages/auth/src/providers/cognito/credentialsProvider/credentialsProvider.ts @@ -15,7 +15,7 @@ import { } from '@aws-amplify/core/internals/utils'; import { AuthError } from '../../../errors/AuthError'; -import { getRegionFromIdentityPoolId } from '../utils/clients/CognitoIdentityProvider/utils'; +import { getRegionFromIdentityPoolId } from '../../../foundation/parsers'; import { assertIdTokenInAuthTokens } from '../utils/types'; import { IdentityIdStore } from './types'; diff --git a/packages/auth/src/providers/cognito/factories/createCognitoUserPoolEndpointResolver.ts b/packages/auth/src/providers/cognito/factories/createCognitoUserPoolEndpointResolver.ts new file mode 100644 index 00000000000..42a5b979402 --- /dev/null +++ b/packages/auth/src/providers/cognito/factories/createCognitoUserPoolEndpointResolver.ts @@ -0,0 +1,16 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { EndpointResolverOptions } from '@aws-amplify/core/internals/aws-client-utils'; +import { AmplifyUrl } from '@aws-amplify/core/internals/utils'; + +import { cognitoUserPoolEndpointResolver } from '../../../foundation/cognitoUserPoolEndpointResolver'; + +export const createCognitoUserPoolEndpointResolver = + ({ endpointOverride }: { endpointOverride: string | undefined }) => + (input: EndpointResolverOptions): { url: URL } => { + if (endpointOverride) { + return { url: new AmplifyUrl(endpointOverride) }; + } + + return cognitoUserPoolEndpointResolver(input); + }; diff --git a/packages/auth/src/providers/cognito/factories/index.ts b/packages/auth/src/providers/cognito/factories/index.ts new file mode 100644 index 00000000000..7f8050064d3 --- /dev/null +++ b/packages/auth/src/providers/cognito/factories/index.ts @@ -0,0 +1,3 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +export { createCognitoUserPoolEndpointResolver } from './createCognitoUserPoolEndpointResolver'; diff --git a/packages/auth/src/providers/cognito/tokenProvider/cacheTokens.ts b/packages/auth/src/providers/cognito/tokenProvider/cacheTokens.ts index 198ec6c4283..0be44aeb697 100644 --- a/packages/auth/src/providers/cognito/tokenProvider/cacheTokens.ts +++ b/packages/auth/src/providers/cognito/tokenProvider/cacheTokens.ts @@ -3,7 +3,7 @@ import { AmplifyError, decodeJWT } from '@aws-amplify/core/internals/utils'; import { CognitoAuthSignInDetails } from '../types'; -import { AuthenticationResultType } from '../utils/clients/CognitoIdentityProvider/types'; +import { AuthenticationResultType } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider/types'; import { tokenOrchestrator } from './tokenProvider'; import { CognitoAuthTokens, DeviceMetadata } from './types'; diff --git a/packages/auth/src/providers/cognito/utils/apiHelpers.ts b/packages/auth/src/providers/cognito/utils/apiHelpers.ts index 5ddd544513c..70da22165a5 100644 --- a/packages/auth/src/providers/cognito/utils/apiHelpers.ts +++ b/packages/auth/src/providers/cognito/utils/apiHelpers.ts @@ -2,8 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { AuthUserAttributes } from '../../../types'; - -import { AttributeType } from './clients/CognitoIdentityProvider/types'; +import { AttributeType } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider/types'; /** * Transforms a user attributes object into an array of AttributeType objects. diff --git a/packages/auth/src/providers/cognito/utils/clients/CognitoIdentityProvider/base.ts b/packages/auth/src/providers/cognito/utils/clients/CognitoIdentityProvider/base.ts deleted file mode 100644 index cff58009b87..00000000000 --- a/packages/auth/src/providers/cognito/utils/clients/CognitoIdentityProvider/base.ts +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -import { Amplify } from '@aws-amplify/core'; -import { - Endpoint, - EndpointResolverOptions, - Headers, - HttpRequest, - HttpResponse, - Middleware, - getDnsSuffix, - getRetryDecider, - jitteredBackoff, - parseJsonError, - unauthenticatedHandler, -} from '@aws-amplify/core/internals/aws-client-utils'; -import { - AmplifyUrl, - getAmplifyUserAgent, -} from '@aws-amplify/core/internals/utils'; -import { composeTransferHandler } from '@aws-amplify/core/internals/aws-client-utils/composers'; - -/** - * The service name used to sign requests if the API requires authentication. - */ -const SERVICE_NAME = 'cognito-idp'; - -/** - * The endpoint resolver function that returns the endpoint URL for a given region. - */ -const endpointResolver = ({ region }: EndpointResolverOptions) => { - const authConfig = Amplify.getConfig().Auth?.Cognito; - const customURL = authConfig?.userPoolEndpoint; - const defaultURL = new AmplifyUrl( - `https://${SERVICE_NAME}.${region}.${getDnsSuffix(region)}`, - ); - - return { - url: customURL ? new AmplifyUrl(customURL) : defaultURL, - }; -}; - -/** - * A Cognito Identity-specific middleware that disables caching for all requests. - */ -const disableCacheMiddlewareFactory: Middleware< - HttpRequest, - HttpResponse, - Record -> = () => (next, _) => - async function disableCacheMiddleware(request) { - request.headers['cache-control'] = 'no-store'; - - return next(request); - }; - -/** - * A Cognito Identity-specific transfer handler that does NOT sign requests, and - * disables caching. - * - * @internal - */ -export const cognitoUserPoolTransferHandler = composeTransferHandler< - [Parameters[0]], - HttpRequest, - HttpResponse, - typeof unauthenticatedHandler ->(unauthenticatedHandler, [disableCacheMiddlewareFactory]); - -/** - * @internal - */ -export const defaultConfig = { - service: SERVICE_NAME, - endpointResolver, - retryDecider: getRetryDecider(parseJsonError), - computeDelay: jitteredBackoff, - userAgentValue: getAmplifyUserAgent(), - cache: 'no-store', -}; - -/** - * @internal - */ -export const getSharedHeaders = (operation: string): Headers => ({ - 'content-type': 'application/x-amz-json-1.1', - 'x-amz-target': `AWSCognitoIdentityProviderService.${operation}`, -}); - -/** - * @internal - */ -export const buildHttpRpcRequest = ( - { url }: Endpoint, - headers: Headers, - body: string, -): HttpRequest => ({ - headers, - url, - body, - method: 'POST', -}); diff --git a/packages/auth/src/providers/cognito/utils/clients/CognitoIdentityProvider/index.ts b/packages/auth/src/providers/cognito/utils/clients/CognitoIdentityProvider/index.ts deleted file mode 100644 index 4ea8c01b599..00000000000 --- a/packages/auth/src/providers/cognito/utils/clients/CognitoIdentityProvider/index.ts +++ /dev/null @@ -1,286 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -import { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers'; -import { - Endpoint, - HttpRequest, - HttpResponse, - parseJsonBody, - parseJsonError, -} from '@aws-amplify/core/internals/aws-client-utils'; - -import { assertServiceError } from '../../../../../errors/utils/assertServiceError'; -import { AuthError } from '../../../../../errors/AuthError'; - -import { - buildHttpRpcRequest, - cognitoUserPoolTransferHandler, - defaultConfig, - getSharedHeaders, -} from './base'; -import type { - AssociateSoftwareTokenCommandInput as AssociateSoftwareTokenInput, - AssociateSoftwareTokenCommandOutput as AssociateSoftwareTokenOutput, - ChangePasswordCommandInput as ChangePasswordInput, - ChangePasswordCommandOutput as ChangePasswordOutput, - ConfirmDeviceCommandInput as ConfirmDeviceInput, - ConfirmDeviceCommandOutput as ConfirmDeviceOutput, - ConfirmForgotPasswordCommandInput as ConfirmForgotPasswordInput, - ConfirmForgotPasswordCommandOutput as ConfirmForgotPasswordOutput, - ConfirmSignUpCommandInput as ConfirmSignUpInput, - ConfirmSignUpCommandOutput as ConfirmSignUpOutput, - DeleteUserAttributesCommandInput as DeleteUserAttributesInput, - DeleteUserAttributesCommandOutput as DeleteUserAttributesOutput, - DeleteUserCommandInput as DeleteUserInput, - DeleteUserCommandOutput as DeleteUserOutput, - ForgetDeviceCommandInput as ForgetDeviceInput, - ForgetDeviceCommandOutput as ForgetDeviceOutput, - ForgotPasswordCommandInput as ForgotPasswordInput, - ForgotPasswordCommandOutput as ForgotPasswordOutput, - GetUserAttributeVerificationCodeCommandInput as GetUserAttributeVerificationCodeInput, - GetUserAttributeVerificationCodeCommandOutput as GetUserAttributeVerificationCodeOutput, - GetUserCommandInput as GetUserInput, - GetUserCommandOutput as GetUserOutput, - GlobalSignOutCommandInput as GlobalSignOutInput, - GlobalSignOutCommandOutput as GlobalSignOutOutput, - InitiateAuthCommandInput as InitiateAuthInput, - InitiateAuthCommandOutput as InitiateAuthOutput, - ListDevicesCommandInput as ListDevicesInput, - ListDevicesCommandOutput as ListDevicesOutput, - ResendConfirmationCodeCommandInput as ResendConfirmationCodeInput, - ResendConfirmationCodeCommandOutput as ResendConfirmationCodeOutput, - RespondToAuthChallengeCommandInput as RespondToAuthChallengeInput, - RespondToAuthChallengeCommandOutput as RespondToAuthChallengeOutput, - SetUserMFAPreferenceCommandInput as SetUserMFAPreferenceInput, - SetUserMFAPreferenceCommandOutput as SetUserMFAPreferenceOutput, - SignUpCommandInput as SignUpInput, - SignUpCommandOutput as SignUpOutput, - UpdateDeviceStatusCommandInput as UpdateDeviceStatusInput, - UpdateDeviceStatusCommandOutput as UpdateDeviceStatusOutput, - UpdateUserAttributesCommandInput as UpdateUserAttributesInput, - UpdateUserAttributesCommandOutput as UpdateUserAttributesOutput, - VerifySoftwareTokenCommandInput as VerifySoftwareTokenInput, - VerifySoftwareTokenCommandOutput as VerifySoftwareTokenOutput, - VerifyUserAttributeCommandInput as VerifyUserAttributeInput, - VerifyUserAttributeCommandOutput as VerifyUserAttributeOutput, -} from './types'; - -interface RevokeTokenInput { - Token: string; - ClientId: string; -} - -type RevokeTokenOutput = Record; - -type ClientOperation = - | 'SignUp' - | 'ConfirmSignUp' - | 'ForgotPassword' - | 'ConfirmForgotPassword' - | 'InitiateAuth' - | 'RespondToAuthChallenge' - | 'ResendConfirmationCode' - | 'VerifySoftwareToken' - | 'AssociateSoftwareToken' - | 'SetUserMFAPreference' - | 'GetUser' - | 'ChangePassword' - | 'ConfirmDevice' - | 'ForgetDevice' - | 'DeleteUser' - | 'GetUserAttributeVerificationCode' - | 'GlobalSignOut' - | 'UpdateUserAttributes' - | 'VerifyUserAttribute' - | 'DeleteUserAttributes' - | 'UpdateDeviceStatus' - | 'ListDevices' - | 'RevokeToken'; - -const buildUserPoolSerializer = - (operation: ClientOperation) => - (input: Input, endpoint: Endpoint): HttpRequest => { - const headers = getSharedHeaders(operation); - const body = JSON.stringify(input); - - return buildHttpRpcRequest(endpoint, headers, body); - }; - -const buildUserPoolDeserializer = (): (( - response: HttpResponse, -) => Promise) => { - return async (response: HttpResponse): Promise => { - if (response.statusCode >= 300) { - const error = await parseJsonError(response); - assertServiceError(error); - throw new AuthError({ name: error.name, message: error.message }); - } else { - const body = await parseJsonBody(response); - - return body; - } - }; -}; - -const handleEmptyResponseDeserializer = (): (( - response: HttpResponse, -) => Promise) => { - return async (response: HttpResponse): Promise => { - if (response.statusCode >= 300) { - const error = await parseJsonError(response); - assertServiceError(error); - throw new AuthError({ name: error.name, message: error.message }); - } else { - return undefined as any; - } - }; -}; - -export const initiateAuth = composeServiceApi( - cognitoUserPoolTransferHandler, - buildUserPoolSerializer('InitiateAuth'), - buildUserPoolDeserializer(), - defaultConfig, -); - -export const revokeToken = composeServiceApi( - cognitoUserPoolTransferHandler, - buildUserPoolSerializer('RevokeToken'), - buildUserPoolDeserializer(), - defaultConfig, -); - -export const signUp = composeServiceApi( - cognitoUserPoolTransferHandler, - buildUserPoolSerializer('SignUp'), - buildUserPoolDeserializer(), - defaultConfig, -); -export const confirmSignUp = composeServiceApi( - cognitoUserPoolTransferHandler, - buildUserPoolSerializer('ConfirmSignUp'), - buildUserPoolDeserializer(), - defaultConfig, -); -export const forgotPassword = composeServiceApi( - cognitoUserPoolTransferHandler, - buildUserPoolSerializer('ForgotPassword'), - buildUserPoolDeserializer(), - defaultConfig, -); -export const confirmForgotPassword = composeServiceApi( - cognitoUserPoolTransferHandler, - buildUserPoolSerializer('ConfirmForgotPassword'), - buildUserPoolDeserializer(), - defaultConfig, -); -export const respondToAuthChallenge = composeServiceApi( - cognitoUserPoolTransferHandler, - buildUserPoolSerializer( - 'RespondToAuthChallenge', - ), - buildUserPoolDeserializer(), - defaultConfig, -); -export const resendConfirmationCode = composeServiceApi( - cognitoUserPoolTransferHandler, - buildUserPoolSerializer( - 'ResendConfirmationCode', - ), - buildUserPoolDeserializer(), - defaultConfig, -); -export const verifySoftwareToken = composeServiceApi( - cognitoUserPoolTransferHandler, - buildUserPoolSerializer('VerifySoftwareToken'), - buildUserPoolDeserializer(), - defaultConfig, -); -export const associateSoftwareToken = composeServiceApi( - cognitoUserPoolTransferHandler, - buildUserPoolSerializer( - 'AssociateSoftwareToken', - ), - buildUserPoolDeserializer(), - defaultConfig, -); -export const setUserMFAPreference = composeServiceApi( - cognitoUserPoolTransferHandler, - buildUserPoolSerializer('SetUserMFAPreference'), - buildUserPoolDeserializer(), - defaultConfig, -); -export const getUser = composeServiceApi( - cognitoUserPoolTransferHandler, - buildUserPoolSerializer('GetUser'), - buildUserPoolDeserializer(), - defaultConfig, -); -export const changePassword = composeServiceApi( - cognitoUserPoolTransferHandler, - buildUserPoolSerializer('ChangePassword'), - buildUserPoolDeserializer(), - defaultConfig, -); -export const confirmDevice = composeServiceApi( - cognitoUserPoolTransferHandler, - buildUserPoolSerializer('ConfirmDevice'), - buildUserPoolDeserializer(), - defaultConfig, -); -export const forgetDevice = composeServiceApi( - cognitoUserPoolTransferHandler, - buildUserPoolSerializer('ForgetDevice'), - handleEmptyResponseDeserializer(), - defaultConfig, -); -export const deleteUser = composeServiceApi( - cognitoUserPoolTransferHandler, - buildUserPoolSerializer('DeleteUser'), - handleEmptyResponseDeserializer(), - defaultConfig, -); -export const getUserAttributeVerificationCode = composeServiceApi( - cognitoUserPoolTransferHandler, - buildUserPoolSerializer( - 'GetUserAttributeVerificationCode', - ), - buildUserPoolDeserializer(), - defaultConfig, -); -export const globalSignOut = composeServiceApi( - cognitoUserPoolTransferHandler, - buildUserPoolSerializer('GlobalSignOut'), - buildUserPoolDeserializer(), - defaultConfig, -); -export const updateUserAttributes = composeServiceApi( - cognitoUserPoolTransferHandler, - buildUserPoolSerializer('UpdateUserAttributes'), - buildUserPoolDeserializer(), - defaultConfig, -); -export const verifyUserAttribute = composeServiceApi( - cognitoUserPoolTransferHandler, - buildUserPoolSerializer('VerifyUserAttribute'), - buildUserPoolDeserializer(), - defaultConfig, -); -export const updateDeviceStatus = composeServiceApi( - cognitoUserPoolTransferHandler, - buildUserPoolSerializer('UpdateDeviceStatus'), - buildUserPoolDeserializer(), - defaultConfig, -); -export const listDevices = composeServiceApi( - cognitoUserPoolTransferHandler, - buildUserPoolSerializer('ListDevices'), - buildUserPoolDeserializer(), - defaultConfig, -); -export const deleteUserAttributes = composeServiceApi( - cognitoUserPoolTransferHandler, - buildUserPoolSerializer('DeleteUserAttributes'), - buildUserPoolDeserializer(), - defaultConfig, -); diff --git a/packages/auth/src/providers/cognito/utils/clients/base.ts b/packages/auth/src/providers/cognito/utils/clients/base.ts deleted file mode 100644 index a6a5fb6aca0..00000000000 --- a/packages/auth/src/providers/cognito/utils/clients/base.ts +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -import { - Endpoint, - EndpointResolverOptions, - Headers, - HttpRequest, - HttpResponse, - Middleware, - getDnsSuffix, - getRetryDecider, - jitteredBackoff, - parseJsonError, - unauthenticatedHandler, -} from '@aws-amplify/core/internals/aws-client-utils'; -import { - AmplifyUrl, - getAmplifyUserAgent, -} from '@aws-amplify/core/internals/utils'; -import { composeTransferHandler } from '@aws-amplify/core/internals/aws-client-utils/composers'; - -/** - * The service name used to sign requests if the API requires authentication. - */ -const SERVICE_NAME = 'cognito-idp'; - -/** - * The endpoint resolver function that returns the endpoint URL for a given region. - */ -const endpointResolver = ({ region }: EndpointResolverOptions) => ({ - url: new AmplifyUrl( - `https://${SERVICE_NAME}.${region}.${getDnsSuffix(region)}`, - ), -}); - -/** - * A Cognito Identity-specific middleware that disables caching for all requests. - */ -const disableCacheMiddlewareFactory: Middleware< - HttpRequest, - HttpResponse, - Record -> = () => (next, _) => - async function disableCacheMiddleware(request) { - request.headers['cache-control'] = 'no-store'; - - return next(request); - }; - -/** - * A Cognito Identity-specific transfer handler that does NOT sign requests, and - * disables caching. - * - * @internal - */ -export const cognitoUserPoolTransferHandler = composeTransferHandler< - [Parameters[0]], - HttpRequest, - HttpResponse, - typeof unauthenticatedHandler ->(unauthenticatedHandler, [disableCacheMiddlewareFactory]); - -/** - * @internal - */ -export const defaultConfig = { - service: SERVICE_NAME, - endpointResolver, - retryDecider: getRetryDecider(parseJsonError), - computeDelay: jitteredBackoff, - userAgentValue: getAmplifyUserAgent(), -}; - -/** - * @internal - */ -export const getSharedHeaders = (operation: string): Headers => ({ - 'content-type': 'application/x-amz-json-1.1', - 'x-amz-target': `AWSCognitoIdentityProviderService.${operation}`, -}); - -/** - * @internal - */ -export const buildHttpRpcRequest = ( - { url }: Endpoint, - headers: Headers, - body: any, -): HttpRequest => ({ - headers, - url, - body, - method: 'POST', -}); diff --git a/packages/auth/src/providers/cognito/utils/refreshAuthTokens.ts b/packages/auth/src/providers/cognito/utils/refreshAuthTokens.ts index 6c3df620492..01f35a40b2b 100644 --- a/packages/auth/src/providers/cognito/utils/refreshAuthTokens.ts +++ b/packages/auth/src/providers/cognito/utils/refreshAuthTokens.ts @@ -9,10 +9,11 @@ import { } from '@aws-amplify/core/internals/utils'; import { CognitoAuthTokens, TokenRefresher } from '../tokenProvider/types'; -import { initiateAuth } from '../utils/clients/CognitoIdentityProvider'; -import { getRegion } from '../utils/clients/CognitoIdentityProvider/utils'; +import { getRegionFromUserPoolId } from '../../../foundation/parsers'; import { assertAuthTokensWithRefreshToken } from '../utils/types'; import { AuthError } from '../../../errors/AuthError'; +import { createInitiateAuthClient } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../factories'; import { getUserContextData } from './userContextData'; @@ -26,7 +27,8 @@ const refreshAuthTokensFunction: TokenRefresher = async ({ username: string; }): Promise => { assertTokenProviderConfig(authConfig?.Cognito); - const region = getRegion(authConfig.Cognito.userPoolId); + const { userPoolId, userPoolClientId, userPoolEndpoint } = authConfig.Cognito; + const region = getRegionFromUserPoolId(userPoolId); assertAuthTokensWithRefreshToken(tokens); const refreshTokenString = tokens.refreshToken; @@ -39,14 +41,20 @@ const refreshAuthTokensFunction: TokenRefresher = async ({ const UserContextData = getUserContextData({ username, - userPoolId: authConfig.Cognito.userPoolId, - userPoolClientId: authConfig.Cognito.userPoolClientId, + userPoolId, + userPoolClientId, + }); + + const initiateAuth = createInitiateAuthClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), }); const { AuthenticationResult } = await initiateAuth( { region }, { - ClientId: authConfig?.Cognito?.userPoolClientId, + ClientId: userPoolClientId, AuthFlow: 'REFRESH_TOKEN_AUTH', AuthParameters, UserContextData, diff --git a/packages/auth/src/providers/cognito/utils/signInHelpers.ts b/packages/auth/src/providers/cognito/utils/signInHelpers.ts index 13edcd84e62..ef4c1422bf3 100644 --- a/packages/auth/src/providers/cognito/utils/signInHelpers.ts +++ b/packages/auth/src/providers/cognito/utils/signInHelpers.ts @@ -31,15 +31,14 @@ import { USER_ALREADY_AUTHENTICATED_EXCEPTION } from '../../../errors/constants' import { getCurrentUser } from '../apis/getCurrentUser'; import { AuthTokenOrchestrator, DeviceMetadata } from '../tokenProvider/types'; import { getAuthUserAgentValue } from '../../../utils'; - -import { signInStore } from './signInStore'; import { - associateSoftwareToken, - confirmDevice, - initiateAuth, - respondToAuthChallenge, - verifySoftwareToken, -} from './clients/CognitoIdentityProvider'; + createAssociateSoftwareTokenClient, + createConfirmDeviceClient, + createInitiateAuthClient, + createRespondToAuthChallengeClient, + createVerifySoftwareTokenClient, +} from '../../../foundation/factories/serviceClients/cognitoIdentityProvider'; +import { createCognitoUserPoolEndpointResolver } from '../factories'; import { ChallengeName, ChallengeParameters, @@ -49,8 +48,10 @@ import { NewDeviceMetadataType, RespondToAuthChallengeCommandInput, RespondToAuthChallengeCommandOutput, -} from './clients/CognitoIdentityProvider/types'; -import { getRegion } from './clients/CognitoIdentityProvider/utils'; +} from '../../../foundation/factories/serviceClients/cognitoIdentityProvider/types'; +import { getRegionFromUserPoolId } from '../../../foundation/parsers'; + +import { signInStore } from './signInStore'; import { assertDeviceMetadata } from './types'; import { getAuthenticationHelper, @@ -92,7 +93,7 @@ export async function handleCustomChallenge({ }: HandleAuthChallengeRequest & { tokenOrchestrator: AuthTokenOrchestrator; }): Promise { - const { userPoolId, userPoolClientId } = config; + const { userPoolId, userPoolClientId, userPoolEndpoint } = config; const challengeResponses: Record = { USERNAME: username, ANSWER: challengeResponse, @@ -118,9 +119,14 @@ export async function handleCustomChallenge({ UserContextData, }; + const respondToAuthChallenge = createRespondToAuthChallengeClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); const response = await respondToAuthChallenge( { - region: getRegion(userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.ConfirmSignIn), }, jsonReq, @@ -147,14 +153,18 @@ export async function handleMFASetupChallenge({ deviceName, config, }: HandleAuthChallengeRequest): Promise { - const { userPoolId, userPoolClientId } = config; + const { userPoolId, userPoolClientId, userPoolEndpoint } = config; const challengeResponses = { USERNAME: username, }; - + const verifySoftwareToken = createVerifySoftwareTokenClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); const { Session } = await verifySoftwareToken( { - region: getRegion(userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.ConfirmSignIn), }, { @@ -177,7 +187,16 @@ export async function handleMFASetupChallenge({ ClientId: userPoolClientId, }; - return respondToAuthChallenge({ region: getRegion(userPoolId) }, jsonReq); + const respondToAuthChallenge = createRespondToAuthChallengeClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); + + return respondToAuthChallenge( + { region: getRegionFromUserPoolId(userPoolId) }, + jsonReq, + ); } export async function handleSelectMFATypeChallenge({ @@ -187,7 +206,7 @@ export async function handleSelectMFATypeChallenge({ session, config, }: HandleAuthChallengeRequest): Promise { - const { userPoolId, userPoolClientId } = config; + const { userPoolId, userPoolClientId, userPoolEndpoint } = config; assertValidationError( challengeResponse === 'TOTP' || challengeResponse === 'SMS', AuthValidationErrorCode.IncorrectMFAMethod, @@ -213,9 +232,15 @@ export async function handleSelectMFATypeChallenge({ UserContextData, }; + const respondToAuthChallenge = createRespondToAuthChallengeClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); + return respondToAuthChallenge( { - region: getRegion(userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.ConfirmSignIn), }, jsonReq, @@ -229,7 +254,7 @@ export async function handleSMSMFAChallenge({ username, config, }: HandleAuthChallengeRequest): Promise { - const { userPoolId, userPoolClientId } = config; + const { userPoolId, userPoolClientId, userPoolEndpoint } = config; const challengeResponses = { USERNAME: username, SMS_MFA_CODE: challengeResponse, @@ -248,9 +273,15 @@ export async function handleSMSMFAChallenge({ UserContextData, }; + const respondToAuthChallenge = createRespondToAuthChallengeClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); + return respondToAuthChallenge( { - region: getRegion(userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.ConfirmSignIn), }, jsonReq, @@ -263,7 +294,7 @@ export async function handleSoftwareTokenMFAChallenge({ username, config, }: HandleAuthChallengeRequest): Promise { - const { userPoolId, userPoolClientId } = config; + const { userPoolId, userPoolClientId, userPoolEndpoint } = config; const challengeResponses = { USERNAME: username, SOFTWARE_TOKEN_MFA_CODE: challengeResponse, @@ -284,9 +315,15 @@ export async function handleSoftwareTokenMFAChallenge({ UserContextData, }; + const respondToAuthChallenge = createRespondToAuthChallengeClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); + return respondToAuthChallenge( { - region: getRegion(userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.ConfirmSignIn), }, jsonReq, @@ -300,7 +337,7 @@ export async function handleCompleteNewPasswordChallenge({ requiredAttributes, config, }: HandleAuthChallengeRequest): Promise { - const { userPoolId, userPoolClientId } = config; + const { userPoolId, userPoolClientId, userPoolEndpoint } = config; const challengeResponses = { ...createAttributes(requiredAttributes), NEW_PASSWORD: challengeResponse, @@ -322,9 +359,15 @@ export async function handleCompleteNewPasswordChallenge({ UserContextData, }; + const respondToAuthChallenge = createRespondToAuthChallengeClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); + return respondToAuthChallenge( { - region: getRegion(userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.ConfirmSignIn), }, jsonReq, @@ -338,7 +381,7 @@ export async function handleUserPasswordAuthFlow( config: CognitoUserPoolConfig, tokenOrchestrator: AuthTokenOrchestrator, ): Promise { - const { userPoolClientId, userPoolId } = config; + const { userPoolClientId, userPoolId, userPoolEndpoint } = config; const authParameters: Record = { USERNAME: username, PASSWORD: password, @@ -363,9 +406,15 @@ export async function handleUserPasswordAuthFlow( UserContextData, }; + const initiateAuth = createInitiateAuthClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); + const response = await initiateAuth( { - region: getRegion(userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.SignIn), }, jsonReq, @@ -397,7 +446,7 @@ export async function handleUserSRPAuthFlow( config: CognitoUserPoolConfig, tokenOrchestrator: AuthTokenOrchestrator, ): Promise { - const { userPoolId, userPoolClientId } = config; + const { userPoolId, userPoolClientId, userPoolEndpoint } = config; const userPoolName = userPoolId?.split('_')[1] || ''; const authenticationHelper = await getAuthenticationHelper(userPoolName); @@ -420,9 +469,15 @@ export async function handleUserSRPAuthFlow( UserContextData, }; + const initiateAuth = createInitiateAuthClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); + const resp = await initiateAuth( { - region: getRegion(userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.SignIn), }, jsonReq, @@ -453,7 +508,7 @@ export async function handleCustomAuthFlowWithoutSRP( config: CognitoUserPoolConfig, tokenOrchestrator: AuthTokenOrchestrator, ): Promise { - const { userPoolClientId, userPoolId } = config; + const { userPoolClientId, userPoolId, userPoolEndpoint } = config; const authParameters: Record = { USERNAME: username, }; @@ -477,9 +532,15 @@ export async function handleCustomAuthFlowWithoutSRP( UserContextData, }; + const initiateAuth = createInitiateAuthClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); + const response = await initiateAuth( { - region: getRegion(userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.SignIn), }, jsonReq, @@ -506,7 +567,7 @@ export async function handleCustomSRPAuthFlow( tokenOrchestrator: AuthTokenOrchestrator, ) { assertTokenProviderConfig(config); - const { userPoolId, userPoolClientId } = config; + const { userPoolId, userPoolClientId, userPoolEndpoint } = config; const userPoolName = userPoolId?.split('_')[1] || ''; const authenticationHelper = await getAuthenticationHelper(userPoolName); @@ -531,10 +592,16 @@ export async function handleCustomSRPAuthFlow( UserContextData, }; + const initiateAuth = createInitiateAuthClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); + const { ChallengeParameters: challengeParameters, Session: session } = await initiateAuth( { - region: getRegion(userPoolId), + region: getRegionFromUserPoolId(userPoolId), userAgentValue: getAuthUserAgentValue(AuthAction.SignIn), }, jsonReq, @@ -565,7 +632,7 @@ async function handleDeviceSRPAuth({ session, tokenOrchestrator, }: HandleDeviceSRPInput): Promise { - const { userPoolId } = config; + const { userPoolId, userPoolEndpoint } = config; const clientId = config.userPoolClientId; const deviceMetadata = await tokenOrchestrator?.getDeviceMetadata(username); assertDeviceMetadata(deviceMetadata); @@ -585,9 +652,14 @@ async function handleDeviceSRPAuth({ ClientMetadata: clientMetadata, Session: session, }; + const respondToAuthChallenge = createRespondToAuthChallengeClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); const { ChallengeParameters: respondedChallengeParameters, Session } = await respondToAuthChallenge( - { region: getRegion(userPoolId) }, + { region: getRegionFromUserPoolId(userPoolId) }, jsonReqResponseChallenge, ); @@ -608,7 +680,7 @@ async function handleDevicePasswordVerifier( clientMetadata: ClientMetadata | undefined, session: string | undefined, authenticationHelper: AuthenticationHelper, - { userPoolId, userPoolClientId }: CognitoUserPoolConfig, + { userPoolId, userPoolClientId, userPoolEndpoint }: CognitoUserPoolConfig, tokenOrchestrator?: AuthTokenOrchestrator, ): Promise { const deviceMetadata = await tokenOrchestrator?.getDeviceMetadata(username); @@ -654,9 +726,14 @@ async function handleDevicePasswordVerifier( ClientMetadata: clientMetadata, UserContextData, }; + const respondToAuthChallenge = createRespondToAuthChallengeClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); return respondToAuthChallenge( - { region: getRegion(userPoolId) }, + { region: getRegionFromUserPoolId(userPoolId) }, jsonReqResponseChallenge, ); } @@ -670,7 +747,7 @@ export async function handlePasswordVerifierChallenge( config: CognitoUserPoolConfig, tokenOrchestrator: AuthTokenOrchestrator, ): Promise { - const { userPoolId, userPoolClientId } = config; + const { userPoolId, userPoolClientId, userPoolEndpoint } = config; const userPoolName = userPoolId?.split('_')[1] || ''; const serverBValue = new (BigInteger as any)(challengeParameters?.SRP_B, 16); const salt = new (BigInteger as any)(challengeParameters?.SALT, 16); @@ -722,8 +799,14 @@ export async function handlePasswordVerifierChallenge( UserContextData, }; + const respondToAuthChallenge = createRespondToAuthChallengeClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); + const response = await respondToAuthChallenge( - { region: getRegion(userPoolId) }, + { region: getRegionFromUserPoolId(userPoolId) }, jsonReqResponseChallenge, ); @@ -766,8 +849,14 @@ export async function getSignInResult(params: { parseMFATypes(challengeParameters.MFAS_CAN_SETUP), )}`, }); + + const associateSoftwareToken = createAssociateSoftwareTokenClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: authConfig.userPoolEndpoint, + }), + }); const { Session, SecretCode: secretCode } = await associateSoftwareToken( - { region: getRegion(authConfig.userPoolId) }, + { region: getRegionFromUserPoolId(authConfig.userPoolId) }, { Session: signInSession, }, @@ -1037,11 +1126,17 @@ export async function assertUserNotAuthenticated() { * * @returns DeviceMetadata | undefined */ -export async function getNewDeviceMetatada( - userPoolId: string, - newDeviceMetadata?: NewDeviceMetadataType, - accessToken?: string, -): Promise { +export async function getNewDeviceMetadata({ + userPoolId, + userPoolEndpoint, + newDeviceMetadata, + accessToken, +}: { + userPoolId: string; + userPoolEndpoint: string | undefined; + newDeviceMetadata?: NewDeviceMetadataType; + accessToken?: string; +}): Promise { if (!newDeviceMetadata) return undefined; const userPoolName = userPoolId.split('_')[1] || ''; const authenticationHelper = await getAuthenticationHelper(userPoolName); @@ -1069,8 +1164,13 @@ export async function getNewDeviceMetatada( const randomPassword = authenticationHelper.getRandomPassword(); try { + const confirmDevice = createConfirmDeviceClient({ + endpointResolver: createCognitoUserPoolEndpointResolver({ + endpointOverride: userPoolEndpoint, + }), + }); await confirmDevice( - { region: getRegion(userPoolId) }, + { region: getRegionFromUserPoolId(userPoolId) }, { AccessToken: accessToken, DeviceName: await getDeviceName(), diff --git a/packages/auth/src/providers/cognito/utils/signInStore.ts b/packages/auth/src/providers/cognito/utils/signInStore.ts index 0028ab71067..fd07cb15e6d 100644 --- a/packages/auth/src/providers/cognito/utils/signInStore.ts +++ b/packages/auth/src/providers/cognito/utils/signInStore.ts @@ -2,8 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { CognitoAuthSignInDetails } from '../types'; - -import { ChallengeName } from './clients/CognitoIdentityProvider/types'; +import { ChallengeName } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider/types'; // TODO: replace all of this implementation with state machines interface SignInState { diff --git a/packages/auth/src/providers/cognito/utils/signUpHelpers.ts b/packages/auth/src/providers/cognito/utils/signUpHelpers.ts index 73e59c78406..8ab2943ce2a 100644 --- a/packages/auth/src/providers/cognito/utils/signUpHelpers.ts +++ b/packages/auth/src/providers/cognito/utils/signUpHelpers.ts @@ -10,8 +10,7 @@ import { AutoSignInCallback } from '../../../types/models'; import { AuthError } from '../../../errors/AuthError'; import { resetAutoSignIn, setAutoSignIn } from '../apis/autoSignIn'; import { AUTO_SIGN_IN_EXCEPTION } from '../../../errors/constants'; - -import { SignUpCommandOutput } from './clients/CognitoIdentityProvider/types'; +import { SignUpCommandOutput } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider/types'; const MAX_AUTOSIGNIN_POLLING_MS = 3 * 60 * 1000; diff --git a/packages/aws-amplify/CHANGELOG.md b/packages/aws-amplify/CHANGELOG.md index 50cf7bd31d8..815d5baa26a 100644 --- a/packages/aws-amplify/CHANGELOG.md +++ b/packages/aws-amplify/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [6.6.2](https://github.com/aws-amplify/amplify-js/compare/aws-amplify@6.6.1...aws-amplify@6.6.2) (2024-09-17) + +**Note:** Version bump only for package aws-amplify + +## [6.6.1](https://github.com/aws-amplify/amplify-js/compare/aws-amplify@6.6.0...aws-amplify@6.6.1) (2024-09-16) + +**Note:** Version bump only for package aws-amplify + # [6.6.0](https://github.com/aws-amplify/amplify-js/compare/aws-amplify@6.5.4...aws-amplify@6.6.0) (2024-09-04) ### Features diff --git a/packages/aws-amplify/package.json b/packages/aws-amplify/package.json index 77ab285a487..5dc6691e9cb 100644 --- a/packages/aws-amplify/package.json +++ b/packages/aws-amplify/package.json @@ -1,6 +1,6 @@ { "name": "aws-amplify", - "version": "6.6.0", + "version": "6.6.2", "description": "AWS Amplify is a JavaScript library for Frontend and mobile developers building cloud-enabled applications.", "main": "./dist/cjs/index.js", "module": "./dist/esm/index.mjs", @@ -276,13 +276,13 @@ "utils" ], "dependencies": { - "@aws-amplify/analytics": "7.0.47", - "@aws-amplify/api": "6.0.49", - "@aws-amplify/auth": "6.4.0", - "@aws-amplify/core": "6.4.0", - "@aws-amplify/datastore": "5.0.49", - "@aws-amplify/notifications": "2.0.47", - "@aws-amplify/storage": "6.6.5", + "@aws-amplify/analytics": "7.0.49", + "@aws-amplify/api": "6.0.51", + "@aws-amplify/auth": "6.4.2", + "@aws-amplify/core": "6.4.2", + "@aws-amplify/datastore": "5.0.51", + "@aws-amplify/notifications": "2.0.49", + "@aws-amplify/storage": "6.6.7", "tslib": "^2.5.0" }, "devDependencies": { @@ -335,7 +335,7 @@ "name": "[API] generateClient (AppSync)", "path": "./dist/esm/api/index.mjs", "import": "{ generateClient }", - "limit": "41.5 kB" + "limit": "43.17 kB" }, { "name": "[API] REST API handlers", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index a067fe29edd..9cb66e815c7 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,16 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [6.4.2](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/core@6.4.1...@aws-amplify/core@6.4.2) (2024-09-17) + +### Reverts + +- Revert "Reapply "feat(core): resolve webcrypto from node:crypto for Node18 (#13599)" (#13775)" ([953d578](https://github.com/aws-amplify/amplify-js/commit/953d578fabd69ab8eb7bf494a50c5a15ebf0b74c)), closes [#13599](https://github.com/aws-amplify/amplify-js/issues/13599) [#13775](https://github.com/aws-amplify/amplify-js/issues/13775) + +## [6.4.1](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/core@6.4.0...@aws-amplify/core@6.4.1) (2024-09-16) + +**Note:** Version bump only for package @aws-amplify/core + # [6.4.0](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/core@6.3.13...@aws-amplify/core@6.4.0) (2024-09-04) ### Features diff --git a/packages/core/metadata b/packages/core/metadata index 2243de0562d..5a9cb296e96 100644 --- a/packages/core/metadata +++ b/packages/core/metadata @@ -1 +1 @@ -af85cb83f +3ef5df5f7 diff --git a/packages/core/package.json b/packages/core/package.json index 44e700c068d..453774ab5ea 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/core", - "version": "6.4.0", + "version": "6.4.2", "description": "Core category of aws-amplify", "main": "./dist/cjs/index.js", "module": "./dist/esm/index.mjs", diff --git a/packages/core/src/singleton/API/types.ts b/packages/core/src/singleton/API/types.ts index 20dd5bd3dfc..3909d264180 100644 --- a/packages/core/src/singleton/API/types.ts +++ b/packages/core/src/singleton/API/types.ts @@ -111,6 +111,8 @@ export interface ModelIntrospectionSchema { queries?: CustomOperations; mutations?: CustomOperations; subscriptions?: CustomOperations; + conversations?: SchemaConversationRoutes; + generations?: SchemaGenerationRoutes; } /** @@ -120,6 +122,27 @@ export type SchemaModels = Record; export type SchemaNonModels = Record; export type SchemaEnums = Record; export type CustomOperations = Record; +type SchemaConversationRoutes = Record; +type SchemaGenerationRoutes = Record; + +interface SchemaConversationRoute { + name: string; + models: SchemaModels; + nonModels: SchemaNonModels; + enums: SchemaEnums; + conversation: SchemaConversation; + message: SchemaConversationMessage; +} + +interface SchemaConversation { + modelName: string; +} + +interface SchemaConversationMessage { + modelName: string; + subscribe: CustomOperation; + send: CustomOperation; +} export interface SchemaModel { name: string; @@ -164,7 +187,7 @@ export type CustomOperationArguments = Record; export interface CustomOperationArgument { name: string; - type: FieldType; + type: InputFieldType; isArray: boolean; isRequired: boolean; isArrayNullable?: boolean; @@ -192,7 +215,15 @@ export interface NonModelFieldType { nonModel: string; } -export type FieldType = +interface EnumType { + enum: string; +} + +interface InputType { + input: string; +} + +type ScalarType = | 'ID' | 'String' | 'Int' @@ -206,10 +237,12 @@ export type FieldType = | 'AWSIPAddress' | 'Boolean' | 'AWSJSON' - | 'AWSPhone' - | { enum: string } - | ModelFieldType - | NonModelFieldType; + | 'AWSPhone'; + +type FieldType = ScalarType | EnumType | ModelFieldType | NonModelFieldType; + +type InputFieldType = ScalarType | EnumType | InputType; + export type FieldAttribute = ModelAttribute; /** diff --git a/packages/datastore-storage-adapter/CHANGELOG.md b/packages/datastore-storage-adapter/CHANGELOG.md index 938a74baa18..70ea3a88d99 100644 --- a/packages/datastore-storage-adapter/CHANGELOG.md +++ b/packages/datastore-storage-adapter/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.1.51](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/datastore-storage-adapter@2.1.50...@aws-amplify/datastore-storage-adapter@2.1.51) (2024-09-17) + +**Note:** Version bump only for package @aws-amplify/datastore-storage-adapter + +## [2.1.50](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/datastore-storage-adapter@2.1.49...@aws-amplify/datastore-storage-adapter@2.1.50) (2024-09-16) + +**Note:** Version bump only for package @aws-amplify/datastore-storage-adapter + ## [2.1.49](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/datastore-storage-adapter@2.1.48...@aws-amplify/datastore-storage-adapter@2.1.49) (2024-09-04) **Note:** Version bump only for package @aws-amplify/datastore-storage-adapter diff --git a/packages/datastore-storage-adapter/package.json b/packages/datastore-storage-adapter/package.json index cdfb7b16dfe..2df8924bcd0 100644 --- a/packages/datastore-storage-adapter/package.json +++ b/packages/datastore-storage-adapter/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/datastore-storage-adapter", - "version": "2.1.49", + "version": "2.1.51", "description": "SQLite storage adapter for Amplify DataStore ", "main": "./dist/cjs/index.js", "module": "./dist/esm/index.mjs", @@ -36,8 +36,8 @@ "@aws-amplify/core": "^6.1.0" }, "devDependencies": { - "@aws-amplify/core": "6.4.0", - "@aws-amplify/datastore": "5.0.49", + "@aws-amplify/core": "6.4.2", + "@aws-amplify/datastore": "5.0.51", "@types/react-native-sqlite-storage": "5.0.1", "expo-file-system": "13.1.4", "expo-sqlite": "10.1.0", diff --git a/packages/datastore/CHANGELOG.md b/packages/datastore/CHANGELOG.md index 4ed6212011c..33ddbed03e7 100644 --- a/packages/datastore/CHANGELOG.md +++ b/packages/datastore/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.51](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/datastore@5.0.50...@aws-amplify/datastore@5.0.51) (2024-09-17) + +**Note:** Version bump only for package @aws-amplify/datastore + +## [5.0.50](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/datastore@5.0.49...@aws-amplify/datastore@5.0.50) (2024-09-16) + +**Note:** Version bump only for package @aws-amplify/datastore + ## [5.0.49](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/datastore@5.0.48...@aws-amplify/datastore@5.0.49) (2024-09-04) **Note:** Version bump only for package @aws-amplify/datastore diff --git a/packages/datastore/package.json b/packages/datastore/package.json index a5f9e320ba0..266a67ab709 100644 --- a/packages/datastore/package.json +++ b/packages/datastore/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/datastore", - "version": "5.0.49", + "version": "5.0.51", "description": "AppSyncLocal support for aws-amplify", "main": "./dist/cjs/index.js", "module": "./dist/esm/index.mjs", @@ -44,7 +44,7 @@ "src" ], "dependencies": { - "@aws-amplify/api": "6.0.49", + "@aws-amplify/api": "6.0.51", "buffer": "4.9.2", "idb": "5.0.6", "immer": "9.0.6", @@ -55,7 +55,7 @@ "@aws-amplify/core": "^6.1.0" }, "devDependencies": { - "@aws-amplify/core": "6.4.0", + "@aws-amplify/core": "6.4.2", "@aws-amplify/react-native": "1.1.5", "@types/uuid-validate": "^0.0.1", "dexie": "3.2.2", diff --git a/packages/geo/CHANGELOG.md b/packages/geo/CHANGELOG.md index a0ec1fda10c..274012c9430 100644 --- a/packages/geo/CHANGELOG.md +++ b/packages/geo/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.49](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/geo@3.0.48...@aws-amplify/geo@3.0.49) (2024-09-17) + +**Note:** Version bump only for package @aws-amplify/geo + +## [3.0.48](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/geo@3.0.47...@aws-amplify/geo@3.0.48) (2024-09-16) + +**Note:** Version bump only for package @aws-amplify/geo + ## [3.0.47](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/geo@3.0.46...@aws-amplify/geo@3.0.47) (2024-09-04) **Note:** Version bump only for package @aws-amplify/geo diff --git a/packages/geo/package.json b/packages/geo/package.json index 517bd975c51..d0a2ef0bfe6 100644 --- a/packages/geo/package.json +++ b/packages/geo/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/geo", - "version": "3.0.47", + "version": "3.0.49", "description": "Geo category for aws-amplify", "main": "./dist/cjs/index.js", "module": "./dist/esm/index.mjs", @@ -76,7 +76,7 @@ "@aws-amplify/core": "^6.1.0" }, "devDependencies": { - "@aws-amplify/core": "6.4.0", + "@aws-amplify/core": "6.4.2", "typescript": "5.0.2" }, "size-limit": [ diff --git a/packages/interactions/CHANGELOG.md b/packages/interactions/CHANGELOG.md index 4ec6748dccc..bba981b2cb8 100644 --- a/packages/interactions/CHANGELOG.md +++ b/packages/interactions/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [6.0.48](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/interactions@6.0.47...@aws-amplify/interactions@6.0.48) (2024-09-17) + +**Note:** Version bump only for package @aws-amplify/interactions + +## [6.0.47](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/interactions@6.0.46...@aws-amplify/interactions@6.0.47) (2024-09-16) + +**Note:** Version bump only for package @aws-amplify/interactions + ## [6.0.46](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/interactions@6.0.45...@aws-amplify/interactions@6.0.46) (2024-09-04) **Note:** Version bump only for package @aws-amplify/interactions diff --git a/packages/interactions/package.json b/packages/interactions/package.json index 80606ac6e14..2cba2e3b832 100644 --- a/packages/interactions/package.json +++ b/packages/interactions/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/interactions", - "version": "6.0.46", + "version": "6.0.48", "description": "Interactions category of aws-amplify", "main": "./dist/cjs/index.js", "module": "./dist/esm/index.mjs", @@ -81,7 +81,7 @@ "uuid": "^9.0.0" }, "devDependencies": { - "@aws-amplify/core": "6.4.0", + "@aws-amplify/core": "6.4.2", "typescript": "^5.0.2" }, "size-limit": [ diff --git a/packages/notifications/CHANGELOG.md b/packages/notifications/CHANGELOG.md index ed1872cad49..c53699d38b7 100644 --- a/packages/notifications/CHANGELOG.md +++ b/packages/notifications/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.0.49](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/notifications@2.0.48...@aws-amplify/notifications@2.0.49) (2024-09-17) + +**Note:** Version bump only for package @aws-amplify/notifications + +## [2.0.48](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/notifications@2.0.47...@aws-amplify/notifications@2.0.48) (2024-09-16) + +**Note:** Version bump only for package @aws-amplify/notifications + ## [2.0.47](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/notifications@2.0.46...@aws-amplify/notifications@2.0.47) (2024-09-04) **Note:** Version bump only for package @aws-amplify/notifications diff --git a/packages/notifications/package.json b/packages/notifications/package.json index 176dd2da556..b5165be75f9 100644 --- a/packages/notifications/package.json +++ b/packages/notifications/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/notifications", - "version": "2.0.47", + "version": "2.0.49", "description": "Notifications category of aws-amplify", "main": "./dist/cjs/index.js", "module": "./dist/esm/index.mjs", @@ -98,7 +98,7 @@ "@aws-amplify/core": "^6.1.0" }, "devDependencies": { - "@aws-amplify/core": "6.4.0", + "@aws-amplify/core": "6.4.2", "@aws-amplify/react-native": "1.1.5", "typescript": "5.0.2" } diff --git a/packages/predictions/CHANGELOG.md b/packages/predictions/CHANGELOG.md index ca05ca840e3..3779351617a 100644 --- a/packages/predictions/CHANGELOG.md +++ b/packages/predictions/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [6.1.24](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/predictions@6.1.23...@aws-amplify/predictions@6.1.24) (2024-09-17) + +**Note:** Version bump only for package @aws-amplify/predictions + +## [6.1.23](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/predictions@6.1.22...@aws-amplify/predictions@6.1.23) (2024-09-16) + +**Note:** Version bump only for package @aws-amplify/predictions + ## [6.1.22](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/predictions@6.1.21...@aws-amplify/predictions@6.1.22) (2024-09-04) **Note:** Version bump only for package @aws-amplify/predictions diff --git a/packages/predictions/package.json b/packages/predictions/package.json index 4d605881b28..69904a9fd29 100644 --- a/packages/predictions/package.json +++ b/packages/predictions/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/predictions", - "version": "6.1.22", + "version": "6.1.24", "description": "Machine learning category of aws-amplify", "main": "./dist/cjs/index.js", "module": "./dist/esm/index.mjs", @@ -43,7 +43,7 @@ "src" ], "dependencies": { - "@aws-amplify/storage": "6.6.5", + "@aws-amplify/storage": "6.6.7", "@aws-sdk/client-comprehend": "3.621.0", "@aws-sdk/client-polly": "3.621.0", "@aws-sdk/client-rekognition": "3.621.0", @@ -59,7 +59,7 @@ "@aws-amplify/core": "^6.1.0" }, "devDependencies": { - "@aws-amplify/core": "6.4.0", + "@aws-amplify/core": "6.4.2", "typescript": "5.0.2" }, "size-limit": [ diff --git a/packages/pubsub/CHANGELOG.md b/packages/pubsub/CHANGELOG.md index c76f43577f2..bb73137f569 100644 --- a/packages/pubsub/CHANGELOG.md +++ b/packages/pubsub/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [6.1.24](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/pubsub@6.1.23...@aws-amplify/pubsub@6.1.24) (2024-09-17) + +**Note:** Version bump only for package @aws-amplify/pubsub + +## [6.1.23](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/pubsub@6.1.22...@aws-amplify/pubsub@6.1.23) (2024-09-16) + +**Note:** Version bump only for package @aws-amplify/pubsub + ## [6.1.22](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/pubsub@6.1.21...@aws-amplify/pubsub@6.1.22) (2024-09-04) **Note:** Version bump only for package @aws-amplify/pubsub diff --git a/packages/pubsub/package.json b/packages/pubsub/package.json index 043eba118a2..76d5f6997cd 100644 --- a/packages/pubsub/package.json +++ b/packages/pubsub/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/pubsub", - "version": "6.1.22", + "version": "6.1.24", "description": "Pubsub category of aws-amplify", "main": "./dist/cjs/index.js", "module": "./dist/esm/index.mjs", @@ -73,7 +73,7 @@ "mqtt" ], "dependencies": { - "@aws-amplify/auth": "6.4.0", + "@aws-amplify/auth": "6.4.2", "buffer": "4.9.2", "graphql": "15.8.0", "rxjs": "^7.8.1", @@ -84,7 +84,7 @@ "@aws-amplify/core": "^6.1.0" }, "devDependencies": { - "@aws-amplify/core": "6.4.0", + "@aws-amplify/core": "6.4.2", "typescript": "5.0.2" }, "size-limit": [ diff --git a/packages/rtn-web-browser/android/src/main/kotlin/com/amazonaws/amplify/rtnwebbrowser/WebBrowserModule.kt b/packages/rtn-web-browser/android/src/main/kotlin/com/amazonaws/amplify/rtnwebbrowser/WebBrowserModule.kt index eaa7fe5eaba..e883b90a20b 100644 --- a/packages/rtn-web-browser/android/src/main/kotlin/com/amazonaws/amplify/rtnwebbrowser/WebBrowserModule.kt +++ b/packages/rtn-web-browser/android/src/main/kotlin/com/amazonaws/amplify/rtnwebbrowser/WebBrowserModule.kt @@ -44,6 +44,7 @@ class WebBrowserModule( getCustomTabsPackageName(reactApplicationContext)?.let { val customTabsIntent = CustomTabsIntent.Builder(connection?.getSession()).build() customTabsIntent.intent.setPackage(it).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + customTabsIntent.intent.setPackage(it).addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) customTabsIntent.launchUrl(reactApplicationContext, Uri.parse(uriStr)) } ?: run { promise.reject(Throwable("No eligible browser found on device")) diff --git a/packages/storage/CHANGELOG.md b/packages/storage/CHANGELOG.md index 0abef255db5..1e3f7c7d995 100644 --- a/packages/storage/CHANGELOG.md +++ b/packages/storage/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [6.6.7](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/storage@6.6.6...@aws-amplify/storage@6.6.7) (2024-09-17) + +**Note:** Version bump only for package @aws-amplify/storage + +## [6.6.6](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/storage@6.6.5...@aws-amplify/storage@6.6.6) (2024-09-16) + +**Note:** Version bump only for package @aws-amplify/storage + ## [6.6.5](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/storage@6.6.4...@aws-amplify/storage@6.6.5) (2024-09-04) **Note:** Version bump only for package @aws-amplify/storage diff --git a/packages/storage/__tests__/providers/s3/apis/uploadData/byteLength.test.ts b/packages/storage/__tests__/providers/s3/apis/uploadData/byteLength.test.ts new file mode 100644 index 00000000000..24b46ac4f0d --- /dev/null +++ b/packages/storage/__tests__/providers/s3/apis/uploadData/byteLength.test.ts @@ -0,0 +1,39 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { byteLength } from '../../../../../src/providers/s3/apis/uploadData/byteLength'; + +describe('byteLength', () => { + it('returns 0 for null or undefined', () => { + expect(byteLength(undefined)).toBe(0); + expect(byteLength(null)).toBe(0); + }); + + it('calculates byte length correctly for ASCII strings', () => { + expect(byteLength('hello')).toBe(5); + }); + + it('calculates byte length correctly for multi-byte characters', () => { + expect(byteLength('èちは')).toBe(8); + }); + + it('handles Uint8Array correctly', () => { + const input = new Uint8Array([1, 2, 3]); + expect(byteLength(input)).toBe(3); + }); + + it('handles ArrayBuffer correctly', () => { + const buffer = new ArrayBuffer(8); + expect(byteLength(buffer)).toBe(8); + }); + + it('handles File object correctly', () => { + const file = new Blob(['hello']); + expect(byteLength(file)).toBe(5); + }); + + it('returns undefined for unsupported types', () => { + const input = { unsupportedType: true }; + expect(byteLength(input)).toBeUndefined(); + }); +}); diff --git a/packages/storage/__tests__/providers/s3/utils/md5.native.test.ts b/packages/storage/__tests__/providers/s3/utils/md5.native.test.ts index aea1eab7743..ec70d0a8e14 100644 --- a/packages/storage/__tests__/providers/s3/utils/md5.native.test.ts +++ b/packages/storage/__tests__/providers/s3/utils/md5.native.test.ts @@ -69,23 +69,23 @@ describe('calculateContentMd5 (native)', () => { mockMd5.mockReset(); }); - it('calculates MD5 for content type: string', async () => { - await calculateContentMd5(stringContent); - const [mockMd5Instance] = mockMd5.mock.instances; - expect(mockMd5Instance.update.mock.calls[0][0]).toBe(stringContent); - expect(mockToBase64).toHaveBeenCalled(); - }); - it.each([ + { type: 'string', content: stringContent }, { type: 'ArrayBuffer view', content: new Uint8Array() }, { type: 'ArrayBuffer', content: new ArrayBuffer(8) }, - { type: 'Blob', content: new Blob([stringContent]) }, ])('calculates MD5 for content type: $type', async ({ content }) => { + await calculateContentMd5(content); + const [mockMd5Instance] = mockMd5.mock.instances; + expect(mockMd5Instance.update.mock.calls[0][0]).toBe(content); + expect(mockToBase64).toHaveBeenCalled(); + }); + + it('calculates MD5 for content type: blob', async () => { Object.defineProperty(global, 'FileReader', { writable: true, value: jest.fn(() => mockSuccessfulFileReader), }); - await calculateContentMd5(content); + await calculateContentMd5(new Blob([stringContent])); const [mockMd5Instance] = mockMd5.mock.instances; expect(mockMd5Instance.update.mock.calls[0][0]).toBe(fileReaderResult); expect(mockSuccessfulFileReader.readAsArrayBuffer).toHaveBeenCalled(); diff --git a/packages/storage/__tests__/providers/s3/utils/md5.test.ts b/packages/storage/__tests__/providers/s3/utils/md5.test.ts index 2de7f7dfd0e..7412d58e571 100644 --- a/packages/storage/__tests__/providers/s3/utils/md5.test.ts +++ b/packages/storage/__tests__/providers/s3/utils/md5.test.ts @@ -46,23 +46,23 @@ describe('calculateContentMd5', () => { mockMd5.mockReset(); }); - it('calculates MD5 for content type: string', async () => { - await calculateContentMd5(stringContent); - const [mockMd5Instance] = mockMd5.mock.instances; - expect(mockMd5Instance.update.mock.calls[0][0]).toBe(stringContent); - expect(mockToBase64).toHaveBeenCalled(); - }); - it.each([ + { type: 'string', content: stringContent }, { type: 'ArrayBuffer view', content: new Uint8Array() }, { type: 'ArrayBuffer', content: new ArrayBuffer(8) }, - { type: 'Blob', content: new Blob([stringContent]) }, ])('calculates MD5 for content type: $type', async ({ content }) => { + await calculateContentMd5(content); + const [mockMd5Instance] = mockMd5.mock.instances; + expect(mockMd5Instance.update.mock.calls[0][0]).toBe(content); + expect(mockToBase64).toHaveBeenCalled(); + }); + + it('calculates MD5 for content type: blob', async () => { Object.defineProperty(global, 'FileReader', { writable: true, value: jest.fn(() => mockSuccessfulFileReader), }); - await calculateContentMd5(content); + await calculateContentMd5(new Blob([stringContent])); const [mockMd5Instance] = mockMd5.mock.instances; expect(mockMd5Instance.update.mock.calls[0][0]).toBe(fileReaderResult); expect(mockSuccessfulFileReader.readAsArrayBuffer).toHaveBeenCalled(); diff --git a/packages/storage/package.json b/packages/storage/package.json index 9511ddceb5f..47507f61619 100644 --- a/packages/storage/package.json +++ b/packages/storage/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/storage", - "version": "6.6.5", + "version": "6.6.7", "description": "Storage category of aws-amplify", "main": "./dist/cjs/index.js", "module": "./dist/esm/index.mjs", @@ -110,9 +110,9 @@ "@aws-amplify/core": "^6.1.0" }, "devDependencies": { - "@types/node": "20.14.12", - "@aws-amplify/core": "6.4.0", - "@aws-amplify/react-native": "1.1.5", + "@aws-amplify/core": "6.4.2", + "@types/node": "20.14.12", + "@aws-amplify/react-native": "1.1.5", "typescript": "5.0.2" } } diff --git a/packages/storage/src/providers/s3/apis/internal/list.ts b/packages/storage/src/providers/s3/apis/internal/list.ts index 13a37316094..4a2fcc0b9e8 100644 --- a/packages/storage/src/providers/s3/apis/internal/list.ts +++ b/packages/storage/src/providers/s3/apis/internal/list.ts @@ -21,8 +21,8 @@ import { validateStorageOperationInputWithPrefix, } from '../../utils'; import { - ListAllOptionsWithPath, - ListPaginateOptionsWithPath, + ListAllWithPathOptions, + ListPaginateWithPathOptions, ResolvedS3Config, } from '../../types/options'; import { @@ -267,7 +267,7 @@ const mapCommonPrefixesToExcludedSubpaths = ( }; const getDelimiter = ( - options?: ListAllOptionsWithPath | ListPaginateOptionsWithPath, + options?: ListAllWithPathOptions | ListPaginateWithPathOptions, ): string | undefined => { if (options?.subpathStrategy?.strategy === 'exclude') { return options?.subpathStrategy?.delimiter ?? DEFAULT_DELIMITER; diff --git a/packages/storage/src/providers/s3/apis/uploadData/multipart/uploadHandlers.ts b/packages/storage/src/providers/s3/apis/uploadData/multipart/uploadHandlers.ts index 0c3379d04d2..f1869ac618a 100644 --- a/packages/storage/src/providers/s3/apis/uploadData/multipart/uploadHandlers.ts +++ b/packages/storage/src/providers/s3/apis/uploadData/multipart/uploadHandlers.ts @@ -17,7 +17,7 @@ import { } from '../../../utils/constants'; import { ResolvedS3Config, - UploadDataOptionsWithKey, + UploadDataWithKeyOptions, } from '../../../types/options'; import { StorageError } from '../../../../../errors/StorageError'; import { CanceledError } from '../../../../../errors/CanceledError'; @@ -102,7 +102,7 @@ export const getMultipartUploadHandlers = ( // Resolve "key" specific options if (inputType === STORAGE_INPUT_KEY) { - const accessLevel = (uploadDataOptions as UploadDataOptionsWithKey) + const accessLevel = (uploadDataOptions as UploadDataWithKeyOptions) ?.accessLevel; resolvedKeyPrefix = resolvedS3Options.keyPrefix; diff --git a/packages/storage/src/providers/s3/types/errors.ts b/packages/storage/src/providers/s3/types/errors.ts deleted file mode 100644 index 9d757af7b6f..00000000000 --- a/packages/storage/src/providers/s3/types/errors.ts +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -export enum S3Exception { - NotFoundException = 'NotFoundException', - ForbiddenException = 'ForbiddenException', - BadRequestException = 'BadRequestException', -} diff --git a/packages/storage/src/providers/s3/types/index.ts b/packages/storage/src/providers/s3/types/index.ts index 4efd666fb33..d38e3b8b523 100644 --- a/packages/storage/src/providers/s3/types/index.ts +++ b/packages/storage/src/providers/s3/types/index.ts @@ -2,23 +2,21 @@ // SPDX-License-Identifier: Apache-2.0 export { - GetUrlOptionsWithKey, - GetUrlOptionsWithPath, - UploadDataOptionsWithPath, - UploadDataOptionsWithKey, - GetPropertiesOptionsWithKey, - GetPropertiesOptionsWithPath, - ListAllOptionsWithPrefix, - ListPaginateOptionsWithPrefix, - ListAllOptionsWithPath, - ListPaginateOptionsWithPath, + GetUrlWithKeyOptions, + GetUrlWithPathOptions, + UploadDataWithPathOptions, + UploadDataWithKeyOptions, + GetPropertiesWithKeyOptions, + GetPropertiesWithPathOptions, + ListAllWithPrefixOptions, + ListPaginateWithPrefixOptions, + ListAllWithPathOptions, + ListPaginateWithPathOptions, RemoveOptions, - DownloadDataOptionsWithPath, - DownloadDataOptionsWithKey, - CopyDestinationOptionsWithKey, - CopySourceOptionsWithKey, - CopyWithPathSourceOptions, - CopyWithPathDestinationOptions, + DownloadDataWithPathOptions, + DownloadDataWithKeyOptions, + CopyDestinationWithKeyOptions, + CopySourceWithKeyOptions, } from './options'; export { UploadDataOutput, @@ -58,4 +56,3 @@ export { ListAllWithPathInput, ListPaginateWithPathInput, } from './inputs'; -export { S3Exception } from './errors'; diff --git a/packages/storage/src/providers/s3/types/inputs.ts b/packages/storage/src/providers/s3/types/inputs.ts index 98d978d9539..041451fbfd5 100644 --- a/packages/storage/src/providers/s3/types/inputs.ts +++ b/packages/storage/src/providers/s3/types/inputs.ts @@ -19,21 +19,21 @@ import { } from '../../../types'; import { StorageOperationOptionsInput } from '../../../types/inputs'; import { - CopyDestinationOptionsWithKey, - CopySourceOptionsWithKey, - DownloadDataOptionsWithKey, - DownloadDataOptionsWithPath, - GetPropertiesOptionsWithKey, - GetPropertiesOptionsWithPath, - GetUrlOptionsWithKey, - GetUrlOptionsWithPath, - ListAllOptionsWithPath, - ListAllOptionsWithPrefix, - ListPaginateOptionsWithPath, - ListPaginateOptionsWithPrefix, + CopyDestinationWithKeyOptions, + CopySourceWithKeyOptions, + DownloadDataWithKeyOptions, + DownloadDataWithPathOptions, + GetPropertiesWithKeyOptions, + GetPropertiesWithPathOptions, + GetUrlWithKeyOptions, + GetUrlWithPathOptions, + ListAllWithPathOptions, + ListAllWithPrefixOptions, + ListPaginateWithPathOptions, + ListPaginateWithPrefixOptions, RemoveOptions, - UploadDataOptionsWithKey, - UploadDataOptionsWithPath, + UploadDataWithKeyOptions, + UploadDataWithPathOptions, } from '../types'; import { LocationCredentialsProvider } from './options'; @@ -44,8 +44,8 @@ import { LocationCredentialsProvider } from './options'; * Input type for S3 copy API. */ export type CopyInput = StorageCopyInputWithKey< - CopySourceOptionsWithKey, - CopyDestinationOptionsWithKey + CopySourceWithKeyOptions, + CopyDestinationWithKeyOptions >; /** * Input type with path for S3 copy API. @@ -60,48 +60,48 @@ export type CopyWithPathInput = StorageCopyInputWithPath & * Input type for S3 getProperties API. */ export type GetPropertiesInput = - StorageGetPropertiesInputWithKey; + StorageGetPropertiesInputWithKey; /** * Input type with for S3 getProperties API. */ export type GetPropertiesWithPathInput = - StorageGetPropertiesInputWithPath; + StorageGetPropertiesInputWithPath; /** * @deprecated Use {@link GetUrlWithPathInput} instead. * Input type for S3 getUrl API. */ -export type GetUrlInput = StorageGetUrlInputWithKey; +export type GetUrlInput = StorageGetUrlInputWithKey; /** * Input type with path for S3 getUrl API. */ export type GetUrlWithPathInput = - StorageGetUrlInputWithPath; + StorageGetUrlInputWithPath; /** * Input type with path for S3 list API. Lists all bucket objects. */ export type ListAllWithPathInput = - StorageListInputWithPath; + StorageListInputWithPath; /** * Input type with path for S3 list API. Lists bucket objects with pagination. */ export type ListPaginateWithPathInput = - StorageListInputWithPath; + StorageListInputWithPath; /** * @deprecated Use {@link ListAllWithPathInput} instead. * Input type for S3 list API. Lists all bucket objects. */ -export type ListAllInput = StorageListInputWithPrefix; +export type ListAllInput = StorageListInputWithPrefix; /** * @deprecated Use {@link ListPaginateWithPathInput} instead. * Input type for S3 list API. Lists bucket objects with pagination. */ export type ListPaginateInput = - StorageListInputWithPrefix; + StorageListInputWithPrefix; /** * @deprecated Use {@link RemoveWithPathInput} instead. @@ -121,23 +121,23 @@ export type RemoveWithPathInput = StorageRemoveInputWithPath< * Input type for S3 downloadData API. */ export type DownloadDataInput = - StorageDownloadDataInputWithKey; + StorageDownloadDataInputWithKey; /** * Input type with path for S3 downloadData API. */ export type DownloadDataWithPathInput = - StorageDownloadDataInputWithPath; + StorageDownloadDataInputWithPath; /** * @deprecated Use {@link UploadDataWithPathInput} instead. * Input type for S3 uploadData API. */ export type UploadDataInput = - StorageUploadDataInputWithKey; + StorageUploadDataInputWithKey; /** * Input type with path for S3 uploadData API. */ export type UploadDataWithPathInput = - StorageUploadDataInputWithPath; + StorageUploadDataInputWithPath; diff --git a/packages/storage/src/providers/s3/types/options.ts b/packages/storage/src/providers/s3/types/options.ts index d19baf69476..3afeded1b0c 100644 --- a/packages/storage/src/providers/s3/types/options.ts +++ b/packages/storage/src/providers/s3/types/options.ts @@ -103,9 +103,9 @@ interface TransferOptions { /** * Input options type for S3 getProperties API. */ -/** @deprecated Use {@link GetPropertiesOptionsWithPath} instead. */ -export type GetPropertiesOptionsWithKey = ReadOptions & CommonOptions; -export type GetPropertiesOptionsWithPath = CommonOptions; +/** @deprecated Use {@link GetPropertiesWithPathOptions} instead. */ +export type GetPropertiesWithKeyOptions = ReadOptions & CommonOptions; +export type GetPropertiesWithPathOptions = CommonOptions; /** * Input options type for S3 getProperties API. @@ -113,25 +113,25 @@ export type GetPropertiesOptionsWithPath = CommonOptions; export type RemoveOptions = WriteOptions & CommonOptions; /** - * @deprecated Use {@link ListAllOptionsWithPath} instead. + * @deprecated Use {@link ListAllWithPathOptions} instead. * Input options type with prefix for S3 list all API. */ -export type ListAllOptionsWithPrefix = StorageListAllOptions & +export type ListAllWithPrefixOptions = StorageListAllOptions & ReadOptions & CommonOptions; /** - * @deprecated Use {@link ListPaginateOptionsWithPath} instead. + * @deprecated Use {@link ListPaginateWithPathOptions} instead. * Input options type with prefix for S3 list API to paginate items. */ -export type ListPaginateOptionsWithPrefix = StorageListPaginateOptions & +export type ListPaginateWithPrefixOptions = StorageListPaginateOptions & ReadOptions & CommonOptions; /** * Input options type with path for S3 list all API. */ -export type ListAllOptionsWithPath = Omit< +export type ListAllWithPathOptions = Omit< StorageListAllOptions, 'accessLevel' > & @@ -142,7 +142,7 @@ export type ListAllOptionsWithPath = Omit< /** * Input options type with path for S3 list API to paginate items. */ -export type ListPaginateOptionsWithPath = Omit< +export type ListPaginateWithPathOptions = Omit< StorageListPaginateOptions, 'accessLevel' > & @@ -179,9 +179,9 @@ export type GetUrlOptions = CommonOptions & { contentType?: string; }; -/** @deprecated Use {@link GetUrlOptionsWithPath} instead. */ -export type GetUrlOptionsWithKey = ReadOptions & GetUrlOptions; -export type GetUrlOptionsWithPath = GetUrlOptions; +/** @deprecated Use {@link GetUrlWithPathOptions} instead. */ +export type GetUrlWithKeyOptions = ReadOptions & GetUrlOptions; +export type GetUrlWithPathOptions = GetUrlOptions; /** * Input options type for S3 downloadData API. @@ -190,9 +190,9 @@ export type DownloadDataOptions = CommonOptions & TransferOptions & BytesRangeOptions; -/** @deprecated Use {@link DownloadDataOptionsWithPath} instead. */ -export type DownloadDataOptionsWithKey = ReadOptions & DownloadDataOptions; -export type DownloadDataOptionsWithPath = DownloadDataOptions; +/** @deprecated Use {@link DownloadDataWithPathOptions} instead. */ +export type DownloadDataWithKeyOptions = ReadOptions & DownloadDataOptions; +export type DownloadDataWithPathOptions = DownloadDataOptions; export type UploadDataOptions = CommonOptions & TransferOptions & { @@ -226,19 +226,19 @@ export type UploadDataOptions = CommonOptions & preventOverwrite?: boolean; }; -/** @deprecated Use {@link UploadDataOptionsWithPath} instead. */ -export type UploadDataOptionsWithKey = WriteOptions & UploadDataOptions; -export type UploadDataOptionsWithPath = UploadDataOptions; +/** @deprecated Use {@link UploadDataWithPathOptions} instead. */ +export type UploadDataWithKeyOptions = WriteOptions & UploadDataOptions; +export type UploadDataWithPathOptions = UploadDataOptions; /** @deprecated This may be removed in the next major version. */ -export type CopySourceOptionsWithKey = ReadOptions & { +export type CopySourceWithKeyOptions = ReadOptions & { /** @deprecated This may be removed in the next major version. */ key: string; bucket?: StorageBucket; }; /** @deprecated This may be removed in the next major version. */ -export type CopyDestinationOptionsWithKey = WriteOptions & { +export type CopyDestinationWithKeyOptions = WriteOptions & { /** @deprecated This may be removed in the next major version. */ key: string; bucket?: StorageBucket; diff --git a/packages/storage/src/providers/s3/utils/md5.native.ts b/packages/storage/src/providers/s3/utils/md5.native.ts index 6c43cad24b0..a0c5a2365d8 100644 --- a/packages/storage/src/providers/s3/utils/md5.native.ts +++ b/packages/storage/src/providers/s3/utils/md5.native.ts @@ -14,16 +14,8 @@ export const calculateContentMd5 = async ( content: Blob | string | ArrayBuffer | ArrayBufferView, ): Promise => { const hasher = new Md5(); - if (typeof content === 'string') { - hasher.update(content); - } else if (ArrayBuffer.isView(content) || content instanceof ArrayBuffer) { - const blob = new Blob([content]); - const buffer = await readFile(blob); - hasher.update(buffer); - } else { - const buffer = await readFile(content); - hasher.update(buffer); - } + const buffer = content instanceof Blob ? await readFile(content) : content; + hasher.update(buffer); const digest = await hasher.digest(); return toBase64(digest); diff --git a/packages/storage/src/providers/s3/utils/md5.ts b/packages/storage/src/providers/s3/utils/md5.ts index 80292d95eea..98e04fdaf99 100644 --- a/packages/storage/src/providers/s3/utils/md5.ts +++ b/packages/storage/src/providers/s3/utils/md5.ts @@ -9,16 +9,8 @@ export const calculateContentMd5 = async ( content: Blob | string | ArrayBuffer | ArrayBufferView, ): Promise => { const hasher = new Md5(); - if (typeof content === 'string') { - hasher.update(content); - } else if (ArrayBuffer.isView(content) || content instanceof ArrayBuffer) { - const blob = new Blob([content]); - const buffer = await readFile(blob); - hasher.update(buffer); - } else { - const buffer = await readFile(content); - hasher.update(buffer); - } + const buffer = content instanceof Blob ? await readFile(content) : content; + hasher.update(buffer); const digest = await hasher.digest(); return toBase64(digest); diff --git a/scripts/dts-bundler/dts-bundler.config.js b/scripts/dts-bundler/dts-bundler.config.js index b72769224d2..9c1cb91b5ad 100644 --- a/scripts/dts-bundler/dts-bundler.config.js +++ b/scripts/dts-bundler/dts-bundler.config.js @@ -44,12 +44,15 @@ const authPackageSrcClientsPath = join( 'packages', 'auth', 'src', - 'providers', - 'cognito', - 'utils', - 'clients', + 'foundation', + 'factories', + 'serviceClients', + 'cognitoIdentityProvider', + 'types', ); +// packages/auth/src/foundation/factories/serviceClients/cognitoIdentityProvider/types/Sdk.ts + /** @type import('dts-bundle-generator/config-schema').BundlerConfig */ const config = { compilationOptions: { @@ -84,8 +87,7 @@ const config = { filePath: './cognito-identity-provider.d.ts', outFile: join( authPackageSrcClientsPath, - 'CognitoIdentityProvider', - 'types.ts', + 'Sdk.ts', ), libraries: { inlinedLibraries: ['@aws-sdk/client-cognito-identity-provider'], diff --git a/scripts/tsc-compliance-test/CHANGELOG.md b/scripts/tsc-compliance-test/CHANGELOG.md index 0ec07419208..781daba852a 100644 --- a/scripts/tsc-compliance-test/CHANGELOG.md +++ b/scripts/tsc-compliance-test/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.54](https://github.com/aws-amplify/amplify-js/compare/tsc-compliance-test@0.1.53...tsc-compliance-test@0.1.54) (2024-09-17) + +**Note:** Version bump only for package tsc-compliance-test + +## [0.1.53](https://github.com/aws-amplify/amplify-js/compare/tsc-compliance-test@0.1.52...tsc-compliance-test@0.1.53) (2024-09-16) + +**Note:** Version bump only for package tsc-compliance-test + ## [0.1.52](https://github.com/aws-amplify/amplify-js/compare/tsc-compliance-test@0.1.51...tsc-compliance-test@0.1.52) (2024-09-04) **Note:** Version bump only for package tsc-compliance-test diff --git a/scripts/tsc-compliance-test/package.json b/scripts/tsc-compliance-test/package.json index 85be6d5064a..6ba25acf486 100644 --- a/scripts/tsc-compliance-test/package.json +++ b/scripts/tsc-compliance-test/package.json @@ -1,11 +1,11 @@ { "name": "tsc-compliance-test", - "version": "0.1.52", + "version": "0.1.54", "license": "MIT", "private": true, "devDependencies": { "@types/node": "16.18.82", - "aws-amplify": "6.6.0", + "aws-amplify": "6.6.2", "typescript": "4.2.x" }, "scripts": { diff --git a/yarn.lock b/yarn.lock index 7c06d94b98c..d7164b02f2a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18,13 +18,15 @@ graphql "15.8.0" rxjs "^7.8.1" -"@aws-amplify/data-schema@^1.0.0": - version "1.3.10" - resolved "https://registry.yarnpkg.com/@aws-amplify/data-schema/-/data-schema-1.3.10.tgz#e83ef1d8d11efb821b282e499c373f64f3bf60ae" - integrity sha512-rUo6wb+DO6aGCSeSiB8wb92O4cEuN4sZBXn7TgqaYc8Bv4HutrLaIlptgXCYJMkaAp/h9rxyi6wIFJ7bEyD/6g== +"@aws-amplify/data-schema@^1.5.0": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@aws-amplify/data-schema/-/data-schema-1.5.1.tgz#d9f2e263e10f7bd8dc9c1908a4ac0e795e581b7c" + integrity sha512-hFDqqwHqdoFazmvGOApCX8kqrdoum9YJikmAQN5tP2sgnCT++lqznFw2F4PPqDJRxhQP1AYuwhbbRBvGLMbs/w== dependencies: "@aws-amplify/data-schema-types" "*" + "@smithy/util-base64" "^3.0.0" "@types/aws-lambda" "^8.10.134" + "@types/json-schema" "^7.0.15" rxjs "^7.8.1" "@aws-crypto/crc32@3.0.0": @@ -2859,55 +2861,55 @@ write-pkg "4.0.0" yargs "16.2.0" -"@next/env@14.2.6": - version "14.2.6" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.6.tgz#4f8ab1ca549a90bf0c83454b798b0ebae7098b15" - integrity sha512-bs5DFKV+08EjWrl8EB+KKqev1ZTNONH1vFCaHh911aaB362NnP32UDTbE9VQhyiAgbFqJsfDkSxFERNDDb3j0g== - -"@next/swc-darwin-arm64@14.2.6": - version "14.2.6" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.6.tgz#38dfd8716e52dd1f52cfd3e461721d3e984887c6" - integrity sha512-BtJZb+hYXGaVJJivpnDoi3JFVn80SHKCiiRUW3kk1SY6UCUy5dWFFSbh+tGi5lHAughzeduMyxbLt3pspvXNSg== - -"@next/swc-darwin-x64@14.2.6": - version "14.2.6" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.6.tgz#605a6fafbdd672d72728db86aae0fea67e3338f9" - integrity sha512-ZHRbGpH6KHarzm6qEeXKSElSXh8dS2DtDPjQt3IMwY8QVk7GbdDYjvV4NgSnDA9huGpGgnyy3tH8i5yHCqVkiQ== - -"@next/swc-linux-arm64-gnu@14.2.6": - version "14.2.6" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.6.tgz#2a4d3c6d159c70ded6b415cbf6d7082bd823e37d" - integrity sha512-O4HqUEe3ZvKshXHcDUXn1OybN4cSZg7ZdwHJMGCXSUEVUqGTJVsOh17smqilIjooP/sIJksgl+1kcf2IWMZWHg== - -"@next/swc-linux-arm64-musl@14.2.6": - version "14.2.6" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.6.tgz#db4850182cef343a6539d646d613f2f0333a4dc1" - integrity sha512-xUcdhr2hfalG8RDDGSFxQ75yOG894UlmFS4K2M0jLrUhauRBGOtUOxoDVwiIIuZQwZ3Y5hDsazNjdYGB0cQ9yQ== - -"@next/swc-linux-x64-gnu@14.2.6": - version "14.2.6" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.6.tgz#dbd75f0c3b3b3fb5c4ace0b5b52b050409701b3e" - integrity sha512-InosKxw8UMcA/wEib5n2QttwHSKHZHNSbGcMepBM0CTcNwpxWzX32KETmwbhKod3zrS8n1vJ+DuJKbL9ZAB0Ag== - -"@next/swc-linux-x64-musl@14.2.6": - version "14.2.6" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.6.tgz#b045235257e78c87878b3651cb9c7b553a20005b" - integrity sha512-d4QXfJmt5pGJ7cG8qwxKSBnO5AXuKAFYxV7qyDRHnUNvY/dgDh+oX292gATpB2AAHgjdHd5ks1wXxIEj6muLUQ== - -"@next/swc-win32-arm64-msvc@14.2.6": - version "14.2.6" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.6.tgz#be6ec8b97db574d9c2625fd181b6fa3e4625c29d" - integrity sha512-AlgIhk4/G+PzOG1qdF1b05uKTMsuRatFlFzAi5G8RZ9h67CVSSuZSbqGHbJDlcV1tZPxq/d4G0q6qcHDKWf4aQ== - -"@next/swc-win32-ia32-msvc@14.2.6": - version "14.2.6" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.6.tgz#bc215a8488f10042c21890a83e79eee9e84cff6d" - integrity sha512-hNukAxq7hu4o5/UjPp5jqoBEtrpCbOmnUqZSKNJG8GrUVzfq0ucdhQFVrHcLRMvQcwqqDh1a5AJN9ORnNDpgBQ== - -"@next/swc-win32-x64-msvc@14.2.6": - version "14.2.6" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.6.tgz#6b63a7b4ff3b7b410a038e3ee839c951a3136dc9" - integrity sha512-NANtw+ead1rSDK1jxmzq3TYkl03UNK2KHqUYf1nIhNci6NkeqBD4s1njSzYGIlSHxCK+wSaL8RXZm4v+NF/pMw== +"@next/env@14.2.10": + version "14.2.10" + resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.10.tgz#1d3178340028ced2d679f84140877db4f420333c" + integrity sha512-dZIu93Bf5LUtluBXIv4woQw2cZVZ2DJTjax5/5DOs3lzEOeKLy7GxRSr4caK9/SCPdaW6bCgpye6+n4Dh9oJPw== + +"@next/swc-darwin-arm64@14.2.10": + version "14.2.10" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.10.tgz#49d10ca4086fbd59ee68e204f75d7136eda2aa80" + integrity sha512-V3z10NV+cvMAfxQUMhKgfQnPbjw+Ew3cnr64b0lr8MDiBJs3eLnM6RpGC46nhfMZsiXgQngCJKWGTC/yDcgrDQ== + +"@next/swc-darwin-x64@14.2.10": + version "14.2.10" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.10.tgz#0ebeae3afb8eac433882b79543295ab83624a1a8" + integrity sha512-Y0TC+FXbFUQ2MQgimJ/7Ina2mXIKhE7F+GUe1SgnzRmwFY3hX2z8nyVCxE82I2RicspdkZnSWMn4oTjIKz4uzA== + +"@next/swc-linux-arm64-gnu@14.2.10": + version "14.2.10" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.10.tgz#7e602916d2fb55a3c532f74bed926a0137c16f20" + integrity sha512-ZfQ7yOy5zyskSj9rFpa0Yd7gkrBnJTkYVSya95hX3zeBG9E55Z6OTNPn1j2BTFWvOVVj65C3T+qsjOyVI9DQpA== + +"@next/swc-linux-arm64-musl@14.2.10": + version "14.2.10" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.10.tgz#6b143f628ccee490b527562e934f8de578d4be47" + integrity sha512-n2i5o3y2jpBfXFRxDREr342BGIQCJbdAUi/K4q6Env3aSx8erM9VuKXHw5KNROK9ejFSPf0LhoSkU/ZiNdacpQ== + +"@next/swc-linux-x64-gnu@14.2.10": + version "14.2.10" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.10.tgz#086f2f16a0678890a1eb46518c4dda381b046082" + integrity sha512-GXvajAWh2woTT0GKEDlkVhFNxhJS/XdDmrVHrPOA83pLzlGPQnixqxD8u3bBB9oATBKB//5e4vpACnx5Vaxdqg== + +"@next/swc-linux-x64-musl@14.2.10": + version "14.2.10" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.10.tgz#1befef10ed8dbcc5047b5d637a25ae3c30a0bfc3" + integrity sha512-opFFN5B0SnO+HTz4Wq4HaylXGFV+iHrVxd3YvREUX9K+xfc4ePbRrxqOuPOFjtSuiVouwe6uLeDtabjEIbkmDA== + +"@next/swc-win32-arm64-msvc@14.2.10": + version "14.2.10" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.10.tgz#731f52c3ae3c56a26cf21d474b11ae1529531209" + integrity sha512-9NUzZuR8WiXTvv+EiU/MXdcQ1XUvFixbLIMNQiVHuzs7ZIFrJDLJDaOF1KaqttoTujpcxljM/RNAOmw1GhPPQQ== + +"@next/swc-win32-ia32-msvc@14.2.10": + version "14.2.10" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.10.tgz#32723ef7f04e25be12af357cc72ddfdd42fd1041" + integrity sha512-fr3aEbSd1GeW3YUMBkWAu4hcdjZ6g4NBl1uku4gAn661tcxd1bHs1THWYzdsbTRLcCKLjrDZlNp6j2HTfrw+Bg== + +"@next/swc-win32-x64-msvc@14.2.10": + version "14.2.10" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.10.tgz#ee1d036cb5ec871816f96baee7991035bb242455" + integrity sha512-UjeVoRGKNL2zfbcQ6fscmgjBAS/inHBh63mjIlfPg/NG8Yn2ztqylXt5qilYb6hoHIwaU2ogHknHWWmahJjgZQ== "@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": version "2.1.8-no-fsevents.3" @@ -4102,85 +4104,85 @@ estree-walker "^2.0.2" picomatch "^2.3.1" -"@rollup/rollup-android-arm-eabi@4.21.1": - version "4.21.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.1.tgz#c3a7938551273a2b72820cf5d22e54cf41dc206e" - integrity sha512-2thheikVEuU7ZxFXubPDOtspKn1x0yqaYQwvALVtEcvFhMifPADBrgRPyHV0TF3b+9BgvgjgagVyvA/UqPZHmg== - -"@rollup/rollup-android-arm64@4.21.1": - version "4.21.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.1.tgz#fa3693e4674027702c42fcbbb86bbd0c635fd3b9" - integrity sha512-t1lLYn4V9WgnIFHXy1d2Di/7gyzBWS8G5pQSXdZqfrdCGTwi1VasRMSS81DTYb+avDs/Zz4A6dzERki5oRYz1g== - -"@rollup/rollup-darwin-arm64@4.21.1": - version "4.21.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.1.tgz#e19922f4ac1e4552a230ff8f49d5688c5c07d284" - integrity sha512-AH/wNWSEEHvs6t4iJ3RANxW5ZCK3fUnmf0gyMxWCesY1AlUj8jY7GC+rQE4wd3gwmZ9XDOpL0kcFnCjtN7FXlA== - -"@rollup/rollup-darwin-x64@4.21.1": - version "4.21.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.1.tgz#897f8d47b115ea84692a29cf2366899499d4d915" - integrity sha512-dO0BIz/+5ZdkLZrVgQrDdW7m2RkrLwYTh2YMFG9IpBtlC1x1NPNSXkfczhZieOlOLEqgXOFH3wYHB7PmBtf+Bg== - -"@rollup/rollup-linux-arm-gnueabihf@4.21.1": - version "4.21.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.1.tgz#7d1e2a542f3a5744f5c24320067bd5af99ec9d62" - integrity sha512-sWWgdQ1fq+XKrlda8PsMCfut8caFwZBmhYeoehJ05FdI0YZXk6ZyUjWLrIgbR/VgiGycrFKMMgp7eJ69HOF2pQ== - -"@rollup/rollup-linux-arm-musleabihf@4.21.1": - version "4.21.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.1.tgz#88bec1c9df85fc5e24d49f783e19934717dd69b5" - integrity sha512-9OIiSuj5EsYQlmwhmFRA0LRO0dRRjdCVZA3hnmZe1rEwRk11Jy3ECGGq3a7RrVEZ0/pCsYWx8jG3IvcrJ6RCew== - -"@rollup/rollup-linux-arm64-gnu@4.21.1": - version "4.21.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.1.tgz#6dc60f0fe7bd49ed07a2d4d9eab15e671b3bd59d" - integrity sha512-0kuAkRK4MeIUbzQYu63NrJmfoUVicajoRAL1bpwdYIYRcs57iyIV9NLcuyDyDXE2GiZCL4uhKSYAnyWpjZkWow== - -"@rollup/rollup-linux-arm64-musl@4.21.1": - version "4.21.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.1.tgz#a03b78775c129e8333aca9e1e420e8e217ee99b9" - integrity sha512-/6dYC9fZtfEY0vozpc5bx1RP4VrtEOhNQGb0HwvYNwXD1BBbwQ5cKIbUVVU7G2d5WRE90NfB922elN8ASXAJEA== - -"@rollup/rollup-linux-powerpc64le-gnu@4.21.1": - version "4.21.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.1.tgz#ee3810647faf2c105a5a4e71260bb90b96bf87bc" - integrity sha512-ltUWy+sHeAh3YZ91NUsV4Xg3uBXAlscQe8ZOXRCVAKLsivGuJsrkawYPUEyCV3DYa9urgJugMLn8Z3Z/6CeyRQ== - -"@rollup/rollup-linux-riscv64-gnu@4.21.1": - version "4.21.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.1.tgz#385d76a088c27db8054d9f3f28d64d89294f838e" - integrity sha512-BggMndzI7Tlv4/abrgLwa/dxNEMn2gC61DCLrTzw8LkpSKel4o+O+gtjbnkevZ18SKkeN3ihRGPuBxjaetWzWg== - -"@rollup/rollup-linux-s390x-gnu@4.21.1": - version "4.21.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.1.tgz#daa2b62a6e6f737ebef6700a12a93c9764e18583" - integrity sha512-z/9rtlGd/OMv+gb1mNSjElasMf9yXusAxnRDrBaYB+eS1shFm6/4/xDH1SAISO5729fFKUkJ88TkGPRUh8WSAA== - -"@rollup/rollup-linux-x64-gnu@4.21.1": - version "4.21.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.1.tgz#790ae96118cc892464e9f10da358c0c8a6b9acdd" - integrity sha512-kXQVcWqDcDKw0S2E0TmhlTLlUgAmMVqPrJZR+KpH/1ZaZhLSl23GZpQVmawBQGVhyP5WXIsIQ/zqbDBBYmxm5w== - -"@rollup/rollup-linux-x64-musl@4.21.1": - version "4.21.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.1.tgz#d613147f7ac15fafe2a0b6249e8484e161ca2847" - integrity sha512-CbFv/WMQsSdl+bpX6rVbzR4kAjSSBuDgCqb1l4J68UYsQNalz5wOqLGYj4ZI0thGpyX5kc+LLZ9CL+kpqDovZA== - -"@rollup/rollup-win32-arm64-msvc@4.21.1": - version "4.21.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.1.tgz#18349db8250559a5460d59eb3575f9781be4ab98" - integrity sha512-3Q3brDgA86gHXWHklrwdREKIrIbxC0ZgU8lwpj0eEKGBQH+31uPqr0P2v11pn0tSIxHvcdOWxa4j+YvLNx1i6g== - -"@rollup/rollup-win32-ia32-msvc@4.21.1": - version "4.21.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.1.tgz#199648b68271f7ab9d023f5c077725d51d12d466" - integrity sha512-tNg+jJcKR3Uwe4L0/wY3Ro0H+u3nrb04+tcq1GSYzBEmKLeOQF2emk1whxlzNqb6MMrQ2JOcQEpuuiPLyRcSIw== - -"@rollup/rollup-win32-x64-msvc@4.21.1": - version "4.21.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.1.tgz#4d3ec02dbf280c20bfeac7e50cd5669b66f9108f" - integrity sha512-xGiIH95H1zU7naUyTKEyOA/I0aexNMUdO9qRv0bLKN3qu25bBdrxZHqA3PTJ24YNN/GdMzG4xkDcd/GvjuhfLg== +"@rollup/rollup-android-arm-eabi@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz#8b613b9725e8f9479d142970b106b6ae878610d5" + integrity sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w== + +"@rollup/rollup-android-arm64@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz#654ca1049189132ff602bfcf8df14c18da1f15fb" + integrity sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA== + +"@rollup/rollup-darwin-arm64@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz#6d241d099d1518ef0c2205d96b3fa52e0fe1954b" + integrity sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q== + +"@rollup/rollup-darwin-x64@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz#42bd19d292a57ee11734c980c4650de26b457791" + integrity sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw== + +"@rollup/rollup-linux-arm-gnueabihf@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz#f23555ee3d8fe941c5c5fd458cd22b65eb1c2232" + integrity sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ== + +"@rollup/rollup-linux-arm-musleabihf@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz#f3bbd1ae2420f5539d40ac1fde2b38da67779baa" + integrity sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg== + +"@rollup/rollup-linux-arm64-gnu@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz#7abe900120113e08a1f90afb84c7c28774054d15" + integrity sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw== + +"@rollup/rollup-linux-arm64-musl@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz#9e655285c8175cd44f57d6a1e8e5dedfbba1d820" + integrity sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA== + +"@rollup/rollup-linux-powerpc64le-gnu@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz#9a79ae6c9e9d8fe83d49e2712ecf4302db5bef5e" + integrity sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg== + +"@rollup/rollup-linux-riscv64-gnu@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz#67ac70eca4ace8e2942fabca95164e8874ab8128" + integrity sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA== + +"@rollup/rollup-linux-s390x-gnu@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz#9f883a7440f51a22ed7f99e1d070bd84ea5005fc" + integrity sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q== + +"@rollup/rollup-linux-x64-gnu@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz#70116ae6c577fe367f58559e2cffb5641a1dd9d0" + integrity sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg== + +"@rollup/rollup-linux-x64-musl@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz#f473f88219feb07b0b98b53a7923be716d1d182f" + integrity sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g== + +"@rollup/rollup-win32-arm64-msvc@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz#4349482d17f5d1c58604d1c8900540d676f420e0" + integrity sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw== + +"@rollup/rollup-win32-ia32-msvc@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz#a6fc39a15db618040ec3c2a24c1e26cb5f4d7422" + integrity sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g== + +"@rollup/rollup-win32-x64-msvc@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz#3dd5d53e900df2a40841882c02e56f866c04d202" + integrity sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q== "@semantic-ui-react/event-stack@^3.1.0": version "3.1.3" @@ -5169,7 +5171,7 @@ "@types/tough-cookie" "*" parse5 "^7.0.0" -"@types/json-schema@*", "@types/json-schema@^7.0.12", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8": +"@types/json-schema@*", "@types/json-schema@^7.0.12", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -7525,6 +7527,11 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + encoding@^0.1.12, encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" @@ -12103,11 +12110,11 @@ neo-async@^2.5.0, neo-async@^2.6.2: integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== "next@>= 13.5.0 < 15.0.0": - version "14.2.6" - resolved "https://registry.yarnpkg.com/next/-/next-14.2.6.tgz#2d294fe1ac806231cffd52ae2cf2e469b940536d" - integrity sha512-57Su7RqXs5CBKKKOagt8gPhMM3CpjgbeQhrtei2KLAA1vTNm7jfKS+uDARkSW8ZETUflDCBIsUKGSyQdRs4U4g== + version "14.2.10" + resolved "https://registry.yarnpkg.com/next/-/next-14.2.10.tgz#331981a4fecb1ae8af1817d4db98fc9687ee1cb6" + integrity sha512-sDDExXnh33cY3RkS9JuFEKaS4HmlWmDKP1VJioucCG6z5KuA008DPsDZOzi8UfqEk3Ii+2NCQSJrfbEWtZZfww== dependencies: - "@next/env" "14.2.6" + "@next/env" "14.2.10" "@swc/helpers" "0.5.5" busboy "1.6.0" caniuse-lite "^1.0.30001579" @@ -12115,15 +12122,15 @@ neo-async@^2.5.0, neo-async@^2.6.2: postcss "8.4.31" styled-jsx "5.1.1" optionalDependencies: - "@next/swc-darwin-arm64" "14.2.6" - "@next/swc-darwin-x64" "14.2.6" - "@next/swc-linux-arm64-gnu" "14.2.6" - "@next/swc-linux-arm64-musl" "14.2.6" - "@next/swc-linux-x64-gnu" "14.2.6" - "@next/swc-linux-x64-musl" "14.2.6" - "@next/swc-win32-arm64-msvc" "14.2.6" - "@next/swc-win32-ia32-msvc" "14.2.6" - "@next/swc-win32-x64-msvc" "14.2.6" + "@next/swc-darwin-arm64" "14.2.10" + "@next/swc-darwin-x64" "14.2.10" + "@next/swc-linux-arm64-gnu" "14.2.10" + "@next/swc-linux-arm64-musl" "14.2.10" + "@next/swc-linux-x64-gnu" "14.2.10" + "@next/swc-linux-x64-musl" "14.2.10" + "@next/swc-win32-arm64-msvc" "14.2.10" + "@next/swc-win32-ia32-msvc" "14.2.10" + "@next/swc-win32-x64-msvc" "14.2.10" nice-try@^1.0.4: version "1.0.5" @@ -13873,28 +13880,28 @@ rimraf@~2.6.2: glob "^7.1.3" rollup@^4.9.6: - version "4.21.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.21.1.tgz#65b9b9e9de9a64604fab083fb127f3e9eac2935d" - integrity sha512-ZnYyKvscThhgd3M5+Qt3pmhO4jIRR5RGzaSovB6Q7rGNrK5cUncrtLmcTTJVSdcKXyZjW8X8MB0JMSuH9bcAJg== + version "4.22.4" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.22.4.tgz#4135a6446671cd2a2453e1ad42a45d5973ec3a0f" + integrity sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A== dependencies: "@types/estree" "1.0.5" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.21.1" - "@rollup/rollup-android-arm64" "4.21.1" - "@rollup/rollup-darwin-arm64" "4.21.1" - "@rollup/rollup-darwin-x64" "4.21.1" - "@rollup/rollup-linux-arm-gnueabihf" "4.21.1" - "@rollup/rollup-linux-arm-musleabihf" "4.21.1" - "@rollup/rollup-linux-arm64-gnu" "4.21.1" - "@rollup/rollup-linux-arm64-musl" "4.21.1" - "@rollup/rollup-linux-powerpc64le-gnu" "4.21.1" - "@rollup/rollup-linux-riscv64-gnu" "4.21.1" - "@rollup/rollup-linux-s390x-gnu" "4.21.1" - "@rollup/rollup-linux-x64-gnu" "4.21.1" - "@rollup/rollup-linux-x64-musl" "4.21.1" - "@rollup/rollup-win32-arm64-msvc" "4.21.1" - "@rollup/rollup-win32-ia32-msvc" "4.21.1" - "@rollup/rollup-win32-x64-msvc" "4.21.1" + "@rollup/rollup-android-arm-eabi" "4.22.4" + "@rollup/rollup-android-arm64" "4.22.4" + "@rollup/rollup-darwin-arm64" "4.22.4" + "@rollup/rollup-darwin-x64" "4.22.4" + "@rollup/rollup-linux-arm-gnueabihf" "4.22.4" + "@rollup/rollup-linux-arm-musleabihf" "4.22.4" + "@rollup/rollup-linux-arm64-gnu" "4.22.4" + "@rollup/rollup-linux-arm64-musl" "4.22.4" + "@rollup/rollup-linux-powerpc64le-gnu" "4.22.4" + "@rollup/rollup-linux-riscv64-gnu" "4.22.4" + "@rollup/rollup-linux-s390x-gnu" "4.22.4" + "@rollup/rollup-linux-x64-gnu" "4.22.4" + "@rollup/rollup-linux-x64-musl" "4.22.4" + "@rollup/rollup-win32-arm64-msvc" "4.22.4" + "@rollup/rollup-win32-ia32-msvc" "4.22.4" + "@rollup/rollup-win32-x64-msvc" "4.22.4" fsevents "~2.3.2" run-async@^2.4.0: @@ -14056,10 +14063,10 @@ semver@^7.0.0, semver@^7.1.1, semver@^7.1.3, semver@^7.3.4, semver@^7.3.5, semve resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== +send@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== dependencies: debug "2.6.9" depd "2.0.0" @@ -14088,14 +14095,14 @@ serialize-javascript@^6.0.1: randombytes "^2.1.0" serve-static@^1.13.1: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + version "1.16.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== dependencies: - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.18.0" + send "0.19.0" set-blocking@^2.0.0: version "2.0.0" @@ -14517,7 +14524,16 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -14595,7 +14611,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -14609,6 +14625,13 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -15746,7 +15769,7 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -15773,6 +15796,15 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"