From 62d252857d713cdf147ccebd649688606bf324cd Mon Sep 17 00:00:00 2001 From: DevPS-513 Date: Sat, 13 Jan 2024 10:57:55 -0500 Subject: [PATCH 01/21] changed README description to test repo --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index cdd50e544e..4d74d0e017 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ # Final Project Template -The final project for this course has several steps that you must complete. -To give you an overview of the whole project, all the high-level steps are listed below. +A final project template forked from the captstone coursera course, all the high-level steps are listed below. The project is then divided into several smaller labs that give the detailed instructions for each step. You must complete all the labs to successfully complete the project. From 7ecc7627a8550cb8f954d15a3ae0f8a06c7c562b Mon Sep 17 00:00:00 2001 From: DevPS-513 Date: Sat, 13 Jan 2024 13:08:48 -0500 Subject: [PATCH 02/21] added about,contact us and signup page --- server/db.sqlite3 | Bin 0 -> 131072 bytes server/djangoapp/forms.py | 14 ++++ .../djangoapp/templates/djangoapp/about.html | 8 +++ .../djangoapp/templates/djangoapp/base.html | 67 ++++++++++++++++++ .../templates/djangoapp/contact.html | 26 +++++++ .../djangoapp/templates/djangoapp/index.html | 27 ++----- .../templates/djangoapp/register.html | 9 +++ .../templates/djangoapp/registration.html | 11 --- .../templates/registration/login.html | 8 +++ server/djangoapp/urls.py | 10 ++- server/djangoapp/views.py | 28 +++++++- server/djangobackend/settings.py | 14 +++- server/djangobackend/urls.py | 3 + 13 files changed, 185 insertions(+), 40 deletions(-) create mode 100644 server/db.sqlite3 create mode 100644 server/djangoapp/forms.py create mode 100644 server/djangoapp/templates/djangoapp/about.html create mode 100644 server/djangoapp/templates/djangoapp/base.html create mode 100644 server/djangoapp/templates/djangoapp/contact.html create mode 100644 server/djangoapp/templates/djangoapp/register.html delete mode 100644 server/djangoapp/templates/djangoapp/registration.html create mode 100644 server/djangoapp/templates/registration/login.html diff --git a/server/db.sqlite3 b/server/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..2387cdf841ce9c8167c122d611339d4e98182207 GIT binary patch literal 131072 zcmeI5Yit`=cE>p)MT(Nh(Zlk%n>ZTLQDUyFh;NEcw;RP~Y&EtV%W@L|4W>hKB-7zT zCMiF#KwBzKc9Crhbc0o|k0V zGPnrvlPji$c3uu9dXA>Tc_XvfI=e%66l^yVKOy z%O!nNp_N=JnT{1>MP;{EzU4HZKDVA<*~rV+*H*7y&&#W8=kssK5vSDwP9yS_wcbJz z`E-N}E0-c?F#lMkmODQ zQhQSzk=ovzuy<-8xwc@HSh18$qzf^#<@6Am=-+;NY|SRQ&uIpZjhd9r4F&sbn5t&M zRy7urV!hVVYAvO8Z%1QIDzTNyX0%j+SB+^Wy3~nzRO#o%qT94)?Z;7oWL^seq$ ztCv^SH|1CJoAS!_jVr5byUAj(b42%IV*zP#QMfd8qvbR4O3`n!H!n>#J$hwVhv=5|1(b-X(%{%o5waD9Qqj*DYoQ@}!qupjnjijPB zTS}$AU9LsslG@T*<*H^qUT!MQU1}Jtkw)Y~yYDTHf^4X$}^!Yb!)3vBpp$Ut@3SB>D136R&LhIHH{GUgddHM`lbA= z;Njh2^Hzl(*A%KKvZv=8wq`uw#Jj6wdut;BDVG!OXU+Q6+md;8=@&-N-k?j(_ZS_j z8R%XfdSfQ)W>D+_>QVGD?FoNCnwt~aZ#jT+<~*`MKX8YFWp9Jaz3n-g4EUuBbNe<6 zow(jE`1%MvMYI1sd(RFBq=g0H?VmE^F)8w(%uT;bWaiO_5MJ669#yCFkzoG{E!|XW z+jZN`+mLkd&8d5THhZR+MN71O(HD^FNum82ezCcnN>O)ql!{u=DoT}}L@G))Qz#`% z$pU{2aVaotz_hV!GAZos@)~z3>9WgbuXz`X zhfw=*D{>NSs&}uIZcOfnqpuD5S<~L+aT@()Q@gdR)ry*9(`$>*aqu*|2G3B*XnRu# zNJ~q?o@!-REpIo}7JC^pxR^VJY#}7q~xS02yMB0AivG*6wqg1p~?zy{AKQJ>L zqUF@sYaa2>#V?5^aW4G#;hzb=9Qru)mC&6~YW$<|_s4&1d~)pTWABg=en0>OKmY_l z00ck)1V8`;Yy^^1!=97#D@{!wr-{X4aiv@DY<1L0`yC`GmP%z)ua1+SH#>f^hM(JNrA&P44NA_HN{ZHK z)Ei2bs!rY3ToGlLbJ()5nFd~Sq1bm}^mw0huq z&I8b9Q?X<%YJrZduRm(MUkz~nb8r*8!Hs&Q4^IaGFb_khFCLPZ#4G~i+!8?Tgdyq^z z7LO;g0->9CqTByWaXMEjB>slSFW&Zu{~>-u{EB#6{Ji)};$2&ph7Aw^0T2KI5C8!X z009sH0T2KI5CDNg5t#OQ7X-&Nn-ig+cW#95(-lX6% zC&NEIx>A?`f$iMGsDveEJNT6`(`A* z#nT7gY2VBo-|Qv~YD1Gg>12?n1UeHU*!=$!<3HgM|5^M!@pEE9JS&ce|0Vnf;V*?7 z;kED!;i=Gnh5jb=JE3<%8=+I<-y8qN_-~Kjrvmr^0T2KI5C8!X009sH0T2KI2Z6|m zVUIAs=)Yao?kL7f%{jFuvu)Yfeoi8rXxvZV&ujF{Ei6|0p03?--Hv{TNNw9@r|;?5 z$unekYQfLu^jnL7!X*C+B@kOy@9D!PcLl&nSessF$Cezh-t%&$lA*EoOI z!VsX_(5DZ~#!%3;F(mNqr|HuMiqgw8bPbpYzHyp9TM!nKLtKUVcH5O=?m817%cbm) zp~pPHYze>was;djEd@Q;TtgcDQ%KOg`C zAOHd&00JNY0w4eaAOHeKiNKUkm=|oxn-j-;LR4_%Y9xK9@lI;wT#irrgj0ew3o~=v zCoBp*S(jrcd_r7s$*)Z72Mo8C%*fP?PgoF~`I1S|C(H_FYGi^7uqH!9eUIUgWi-NJ zpKwy>CObkCK4DI<m;7A>K`A)-U=k@n7fQ|ptFa5_42!H?x zfB*=900@8p2!H?xfB*=9z!4_E#{Z4?|G*Ir6QO|s2!H?xfB*=900@8p2!H?xfWQ+? z0OS8pboC>65C8!X009sH0T2KI5C8!X0D&ij0N($fkcvi_AOHd&00JNY0w4eaAOHd& z00K`m0n7Y{0w4eaAOHd&00JNY0w4eaAaFzpVEq4xRxH8-0T2KI5C8!X z009sH0T2KI5C8!S0lfcPU|#dj-LNf-fb$JkFOhY&m?4FQ@r(iZ3VG(l^1EB4392 zGQ^hNalRbm%Tc}zvgObSUk3Qn&zHkKZ&2{Dg_kXcyxw3C|{XN&IxVRj6grSqcy7KX0u$cH5GH61+kneri;0R#`X6Y zPq|?3G3w*dBEF{x18>to;uj_Y(wijy@_yoVPo%pLPsECat(?2=$$@nDI6FvkrvRzF zDUL{OZ%)`dHIQ6euu800N+!~UnAviA2u<{FKRvekMZ;=ypVJH+8#O7L8w&Q>FjdWh zt!gYL#d@u!)mlpH-j2pZB(_r7jF!@`S<_B*sT1?4($9-Uw`tAVkD~y|ycP=JA~qU> z$*PHqxZC-$c4J<|d$F;Aw74kTpKhszirxiUZbHs3ecWik8!Ing%Ddl8=sqHs>1x>4 z8uHqe4SDVQrAzW_>#LVn);Hx>^PBR@^^Gg5Yvky1er$*TGdSd$(ZS0*6-bPmaTGwPSfAABV=C-t*VwQ=9#i-^GsBp z32mucTfHLbh+1rwZ<9)=eipHEvtF)ggs3O{XnfQ!!- zXRdg6b!=~KBp~H-!u_mSzdiRGZr-yu=u-1NMu%z!x);}LtLG}=wu3chqHgw*bmMZl zbbH*J1qM4ul%9M4R+^g=+HX04nh*p1z#R&fy$vq+w&!Rv;Fm7U?b|GL;(EK_>mw9L zkUhiiJ&sTAPtwEK-W%fqX=O#Y|DxHT_+5lA%=X#rUex-_kmX3orNOznI8+1Vo(8*` znCW2G(f`Y}`r43RT38S^Ias5=Y-+c5wOUbgY84uSt}E5@c0+Bkm$9B5LpHyWp5uqA5p`$ByzeB^_8X7Azi=L~#N@J{Ft$NzowqtPD@{^rOxN2dJW zqIm$-q2KpzdjDkTr-k>1&XL(;^z(LZF(5^w!n=z+D^t_%C}uX?zGctNwvWXF(zU42 z&hZqwk)3I3d}LkG?(UQun!=OvYPy(7WHL#+iELzdj9ClzgRbTE(NDV}%K=%=MFXFi zB_7Y-^VTerA^m;LdIDSo;J{p z*&J|>S^6xZV!wK9!v)dy#o2&VPYUhNSZ|M3AqtHrC>6D!Rg@~#eMQM;3Z-NzS>P4# zqTJ_N`7Vb0d$!$1t%4YtuBHgZ$7Rtib@iEmluQbHIqNOeTGB9INF{#X`O3n$Wlwya*a)$=+2carZXw6pk|x~Pa9#`pIZ8tx54h3vCun1gVFZs zrvs8gb1ko0TT0iq_i9cRirTVPa7ugX0BP0=V^hyh$o1(G1q3zHhYG;B>!g0N_sU!88vQ<&HBXYB< zRw^_toA?hDLEEpUEvKHx73s>J?N_2G!Mo3nCFCM zc2I2o)5GeVI<3d_-kD)#Jp=EKA826N2$@YCa+^id{!xi~wH2X#%e<#?DSTme?arCC z@vTB3y_G0-1@(->f5P5+`x`pub#^>k?q;rnSYtEwvGx;fFCPy`MG9u~pkTO1x@6Q` zT2o7L%M5I1+&?sM7*3yq1YndQ>33#m%588(*jpM@yDfMno>DV~Ofq3UWN_cka84NE zxIAyT+IRcUea`kEfztJ6^F)zP9}7rVskcl!0_QI#O>_EhE}Ks0(y5f$l5~sX{c5P6 z1E*fyjV00ck) z1V8`;KmY_l00ck)1VG?1B7pb*$EY$O1q46<1V8`;KmY_l00ck)1V8`;9uWb&|34zI za0>z;00JNY0w4eaAOHd&00JNY0*?^^y#GH&l>sRr00JNY0w4eaAOHd&00JNY0wC~+ z2!zP5UwqFaep~zp@h`20{D1%mfB*=900@8p2!H?xfB*=900=xH0@Hq<=j2ny zUt((-|2{SB^UR+z{xV1F-j3F^tdIMAo|zf;X9C!tGzfWVOJZC6xBE{G(dHc6H2)64 zq~P;NC;6W-p+6a;)mn{v?ET*}@rXi#TMz&N5C8!X009sH0T2KI5C8!X0D;GXfMx!_ z_*e*n2oL}P5C8!X009sH0T2KI5C8!X0D*^2!1Dh8(0#)p2!H?xfB*=900@8p2!H?x NfB*=9z~e#S{{X=9pxOWc literal 0 HcmV?d00001 diff --git a/server/djangoapp/forms.py b/server/djangoapp/forms.py new file mode 100644 index 0000000000..c45f03e8e9 --- /dev/null +++ b/server/djangoapp/forms.py @@ -0,0 +1,14 @@ +from django import forms +from django.contrib.auth.forms import UserCreationForm +from django.contrib.auth.models import User + + +class RegisterForm(UserCreationForm): + email = forms.EmailField(required=True) + first_name = forms.CharField(max_length=30,required=True) + last_name = forms.CharField(max_length=30,required=True) + + class Meta: + model=User + fields=['username','email','first_name','last_name', + 'password1','password2'] \ No newline at end of file diff --git a/server/djangoapp/templates/djangoapp/about.html b/server/djangoapp/templates/djangoapp/about.html new file mode 100644 index 0000000000..3a01fd9c3d --- /dev/null +++ b/server/djangoapp/templates/djangoapp/about.html @@ -0,0 +1,8 @@ +{% extends 'djangoapp/base.html' %} + +{%block title %} About Us {% endblock %} + + +{%block content %} +

Started in 1966, BestCars dealer is a great platform to review car dealerships +{% endblock %} \ No newline at end of file diff --git a/server/djangoapp/templates/djangoapp/base.html b/server/djangoapp/templates/djangoapp/base.html new file mode 100644 index 0000000000..82fa86a4d0 --- /dev/null +++ b/server/djangoapp/templates/djangoapp/base.html @@ -0,0 +1,67 @@ + + + + + + + + {% block title %}My Site{% endblock %} + + +

+
{% block content %} {% endblock %}
+ + + + + + \ No newline at end of file diff --git a/server/djangoapp/templates/djangoapp/contact.html b/server/djangoapp/templates/djangoapp/contact.html new file mode 100644 index 0000000000..bf99af7ac2 --- /dev/null +++ b/server/djangoapp/templates/djangoapp/contact.html @@ -0,0 +1,26 @@ +{% extends 'djangoapp/base.html' %} + +{%block title %} contact {% endblock %} + + +{% block content %} +
+

Contact Us

+
+ {% csrf_token %} +
+ + +
+
+ + +
+
+ + +
+ +
+
+{% endblock %} \ No newline at end of file diff --git a/server/djangoapp/templates/djangoapp/index.html b/server/djangoapp/templates/djangoapp/index.html index 1a9ee6e39a..8130b99a90 100644 --- a/server/djangoapp/templates/djangoapp/index.html +++ b/server/djangoapp/templates/djangoapp/index.html @@ -1,25 +1,8 @@ - - - - - Dealership Review - - - - - - - +{% extends 'djangoapp/base.html' %} - +{%block title %} Home {% endblock %} - - - This is the index page of your Django app! - - - - - - +{%block content %} +

Home Page!

+{% endblock %} \ No newline at end of file diff --git a/server/djangoapp/templates/djangoapp/register.html b/server/djangoapp/templates/djangoapp/register.html new file mode 100644 index 0000000000..c4e077d5d0 --- /dev/null +++ b/server/djangoapp/templates/djangoapp/register.html @@ -0,0 +1,9 @@ +{% extends 'djangoapp/base.html' %} + {% block title %}Register{% endblock %} +{% load crispy_forms_tags %} {% block content %} +
+ {% csrf_token %}{{form|crispy}} +

Don't have an account? Login Here!

+ +
+{% endblock %} \ No newline at end of file diff --git a/server/djangoapp/templates/djangoapp/registration.html b/server/djangoapp/templates/djangoapp/registration.html deleted file mode 100644 index ae11ea4b71..0000000000 --- a/server/djangoapp/templates/djangoapp/registration.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - {% load static %} - - - - - - \ No newline at end of file diff --git a/server/djangoapp/templates/registration/login.html b/server/djangoapp/templates/registration/login.html new file mode 100644 index 0000000000..36aa27ab66 --- /dev/null +++ b/server/djangoapp/templates/registration/login.html @@ -0,0 +1,8 @@ +{% extends 'djangoapp/base.html' %} {% block title %}Login{% endblock %} +{% load crispy_forms_tags %} {% block content %} +
+ {% csrf_token %}{{form|crispy}} +

Don't have an account? Create one Here!

+ +
+{% endblock %} \ No newline at end of file diff --git a/server/djangoapp/urls.py b/server/djangoapp/urls.py index 37b1c89d01..a808df55e7 100644 --- a/server/djangoapp/urls.py +++ b/server/djangoapp/urls.py @@ -9,17 +9,23 @@ # view refers to the view function # name the URL + path('',views.home,name="home"), + path('home/',views.home,name="home"), # path for about view - + path('about/',views.about,name="about"), # path for contact us view + path('contact/',views.contact,name="contact"), # path for registration + path('register/', views.register, name='register'), + # path for login + # path('login/',views.login,name='sign_up'), # path for logout - path(route='', view=views.get_dealerships, name='index'), + # path(route='/', view=views.get_dealerships, name='home'), # path for dealer reviews view diff --git a/server/djangoapp/views.py b/server/djangoapp/views.py index 61cc664da0..79e9ff9342 100644 --- a/server/djangoapp/views.py +++ b/server/djangoapp/views.py @@ -9,6 +9,8 @@ from datetime import datetime import logging import json +from .forms import RegisterForm + # Get an instance of a logger logger = logging.getLogger(__name__) @@ -16,14 +18,23 @@ # Create your views here. +def home(request): + return render(request, 'djangoapp/index.html', {}) + # Create an `about` view to render a static about page # def about(request): # ... +def about(request): + return render(request, 'djangoapp/about.html', {}) + # Create a `contact` view to return a static contact page -#def contact(request): + +def contact(request): + return render(request, 'djangoapp/contact.html', {}) + # Create a `login_request` view to handle sign in request # def login_request(request): @@ -34,8 +45,19 @@ # ... # Create a `registration_request` view to handle sign up request -# def registration_request(request): -# ... +def register(request): + + if request.method == 'POST': + form = RegisterForm(request.POST) + if form.is_valid(): + user= form.save() + login(request,user) + return redirect('/home') + else: + form = RegisterForm() + + return render(request,'djangoapp/register.html',{"form":form}) + # Update the `get_dealerships` view to render the index page with a list of dealerships def get_dealerships(request): diff --git a/server/djangobackend/settings.py b/server/djangobackend/settings.py index 6c6fe6a78b..5694b0af42 100644 --- a/server/djangobackend/settings.py +++ b/server/djangobackend/settings.py @@ -27,9 +27,9 @@ APPEND_SLASH = True -ALLOWED_HOSTS = ['localhost',''] +ALLOWED_HOSTS = ['127.0.0.1'] -CSRF_TRUSTED_ORIGINS = [''] +CSRF_TRUSTED_ORIGINS = ['https://127.0.0.1'] # Application definition @@ -42,8 +42,13 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'crispy_forms', + 'crispy_bootstrap5' ] +CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap5" +CRISPY_TEMPLATE_PACK="bootstrap5" + MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', @@ -122,6 +127,11 @@ # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/3.1/howto/static-files/ + +LOGIN_REDIRECT_URL = '/home' +LOGOUT_REDIRECT_URL = "/login" + + STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'static') MEDIA_ROOT = os.path.join(STATIC_ROOT, 'media') diff --git a/server/djangobackend/urls.py b/server/djangobackend/urls.py index 6e110cad6d..bf64d0b1ce 100644 --- a/server/djangobackend/urls.py +++ b/server/djangobackend/urls.py @@ -21,4 +21,7 @@ urlpatterns = [ path('admin/', admin.site.urls), path('djangoapp/', include('djangoapp.urls')), + path('',include('django.contrib.auth.urls')), + + ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) From 28b1a7fedd93c4747fa0b441a8ea34887ace628f Mon Sep 17 00:00:00 2001 From: DevPS-513 Date: Sat, 13 Jan 2024 13:52:39 -0500 Subject: [PATCH 03/21] logout appears to be working now --- server/db.sqlite3 | Bin 131072 -> 131072 bytes .../djangoapp/templates/djangoapp/base.html | 4 ++-- .../templates/registration/login.html | 2 +- server/djangoapp/urls.py | 1 + server/djangoapp/views.py | 8 ++++---- server/djangobackend/settings.py | 4 +--- 6 files changed, 9 insertions(+), 10 deletions(-) diff --git a/server/db.sqlite3 b/server/db.sqlite3 index 2387cdf841ce9c8167c122d611339d4e98182207..27476cd7dc49a215a2e633b24a2d9368f72d5cd8 100644 GIT binary patch delta 2465 zcmcJRJCEbm700EK63o~m(}^8S;jDLdGf1QShp42H~3M-`vAZI%fm<>L5~rth`~jK zDBu*bpeA^_xBT5j*+%MR^m9!x^<_b_%@_CL1)9c4lDypd@TZw43T_=CuT+39 zRS>PDxEe8--2`(A$R+|#(2Z>x)5=<;?s*e#xRl&T8oT&ht?VGwke;T~%{FfV%0u3W1462)*fW6lX5Lwk4bX8HAYpet; z%0-+r&pDxOnHtE9Z%^U6fh;0cMXO~Mxp&_tIwZlzScP_LLU+yAvFFZ@f+9v1HWZ2i zn!Y+SxGn&^O29UM052c}yp_I7!29Xl`45hAxq|~H_tFxYyF(x|qC(@N&}AFWz~bVz zda|)w1`B)+S6yx}XsJ^cy*I6t$uZmX7rIS0mSNo)*B!YAnCAo_#I}qIBu3*HEy$*B z-7FIXFXBXjzzIMiZ)}~Bg}zKdUqatN|Azj)4X?(gJ?Fmo&YG>MsO z0odEm93AXl_33%`?ZeFBXp$tQtfN3 zpEMJ6s?|_`()aOr+|q|&I&oyRH`mpmhv{9hqSUZW-giB}HLET#f%nuAwF&`k<=GzZ zO@}mFjirU5DbcbH*Zeb!DfeYsx5!4xU{*ZAmkhYi;Z1HVn6h3gmAxcLl9CMO?RB+? zxE(#56p59RpP{E?JK&UtJX6TzD+8k>lnhyK!pHC^oZ14RWPv?@-j?$*Q_@b57*qW?6cK!=d>&j*KMTk zl=ux7I!oNdbga1;1zm|=Puc3Qw_N9ajECa@W@arOnB`tuoLX$1p-(NBZ{{f;SNTv5 zu}&jYFl0LN8nrxH*CMsX35pR8hFxT}HfO>Ry zZ->b>DbWe%XlzSh8Hp0^sexi^Yub%S&k50Im^RnS>A!LMe_`7EkDQ)hvV@}R(CS%P zcaw%J#qLt5`HE$7OR@%6`Tl6667_nX4REejwO_ylg942Z2!%enlip(D7~9_jh8_Ec zt5be}3b?qE6-C2|g%r7%<6Uv8Ry&c-a6M&K26Kkf=U_}O;7V;YsjYg>S>N?ybO}Vc z!HP4QB%ABudOUEXfLgC7)^NnnkzF+zO}n(sBi$YVzZrH0bVIZ^)_6*b{iGY`$(`%) zVMrQMg_oEH&-QBA+0Z{r%36Qnaq-BO^3~zo)r=Cu;~cI`T3Xy^1eeCtnM`5C6G{?Q zbd`8<*7NgD*K9B5RKyCU*0e0bPOnvO58`N%Fiy0Z=+sZt!A(q8-zXeGU~t(3GtlD{ z^ceaY`V883EciocbCPMLU)Qa&my2HK)y(Ch*H!A?k20+T+y76R-hEk~w$1hUqwH6I z$bOYRKFmO$q@aI7UqGKgzr6U~g8=%)`xz#EQ|8s*#ICnwU!1<~smx2KpViXdtqgN; J^WoPSehX%0=g$BD delta 151 zcmZo@;Am*zm>|t4H&Mo!QEp?xB6*P&3~c;m4E!(ouki2YFXQj#pT%FXSn>10|SFFgjbMSl$%*xoS84q%xug!`5=$*=F9qq2Af$PunRD< qZx(EL&p$DMbLogged in as {{user.username}} {% else %} diff --git a/server/djangoapp/templates/registration/login.html b/server/djangoapp/templates/registration/login.html index 36aa27ab66..2e57a21f56 100644 --- a/server/djangoapp/templates/registration/login.html +++ b/server/djangoapp/templates/registration/login.html @@ -1,6 +1,6 @@ {% extends 'djangoapp/base.html' %} {% block title %}Login{% endblock %} {% load crispy_forms_tags %} {% block content %} -
+ {% csrf_token %}{{form|crispy}}

Don't have an account? Create one Here!

diff --git a/server/djangoapp/urls.py b/server/djangoapp/urls.py index a808df55e7..d6b21532cc 100644 --- a/server/djangoapp/urls.py +++ b/server/djangoapp/urls.py @@ -24,6 +24,7 @@ # path('login/',views.login,name='sign_up'), # path for logout + path('logout/', views.logout_view, name='logout'), # path(route='/', view=views.get_dealerships, name='home'), diff --git a/server/djangoapp/views.py b/server/djangoapp/views.py index 79e9ff9342..a91e0f08b1 100644 --- a/server/djangoapp/views.py +++ b/server/djangoapp/views.py @@ -41,9 +41,9 @@ def contact(request): # ... # Create a `logout_request` view to handle sign out request -# def logout_request(request): -# ... - +def logout_view(request): + logout(request) + return redirect('djangoapp:home') # Create a `registration_request` view to handle sign up request def register(request): @@ -52,7 +52,7 @@ def register(request): if form.is_valid(): user= form.save() login(request,user) - return redirect('/home') + return redirect('djangoapp/home') else: form = RegisterForm() diff --git a/server/djangobackend/settings.py b/server/djangobackend/settings.py index 5694b0af42..7077d6c918 100644 --- a/server/djangobackend/settings.py +++ b/server/djangobackend/settings.py @@ -127,9 +127,7 @@ # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/3.1/howto/static-files/ - -LOGIN_REDIRECT_URL = '/home' -LOGOUT_REDIRECT_URL = "/login" +LOGOUT_REDIRECT_URL = '/your_desired_path/' STATIC_URL = '/static/' From 566fb5f10485e67bc86df11b6220e9e3334f05be Mon Sep 17 00:00:00 2001 From: DevPS-513 Date: Sat, 13 Jan 2024 14:17:02 -0500 Subject: [PATCH 04/21] added manual dispatch to linter --- .github/workflows/linter.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index 05ca50d23b..b8431f1bf6 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -5,6 +5,7 @@ on: branches: [master, main] pull_request: branches: [master, main] + workflow_dispatch: jobs: # list of things to do lint_function_js: From ba0cbd8f1705c15926e524034dc7e861d997c1a1 Mon Sep 17 00:00:00 2001 From: DevPS-513 Date: Sat, 13 Jan 2024 14:55:42 -0500 Subject: [PATCH 05/21] added echo statement to output the date to see timestamp that is generated from github linter --- .github/workflows/linter.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index b8431f1bf6..323d2bad1d 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -45,6 +45,7 @@ jobs: # list of things to do if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - name: Lint with Pylint run: pylint *.py + echo "The date is" $(date) working-directory: functions/sample/python lint_django_server: From d561408c12436e26642a3dd2045f9597b3876ca5 Mon Sep 17 00:00:00 2001 From: DevPS-513 Date: Sat, 13 Jan 2024 15:00:28 -0500 Subject: [PATCH 06/21] fixing echo statement in lint file --- .github/workflows/linter.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index 323d2bad1d..bf837f72b5 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -45,7 +45,7 @@ jobs: # list of things to do if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - name: Lint with Pylint run: pylint *.py - echo "The date is" $(date) + run: echo "The date is" $(date) working-directory: functions/sample/python lint_django_server: From a57b89b7474ec6f3b255a3fcc97cdaf37f5e16c9 Mon Sep 17 00:00:00 2001 From: DevPS-513 Date: Sat, 13 Jan 2024 15:07:07 -0500 Subject: [PATCH 07/21] trying to debug syntax difference with local terminal --- .github/workflows/linter.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index bf837f72b5..4969070df6 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -44,8 +44,7 @@ jobs: # list of things to do pip install pylint if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - name: Lint with Pylint - run: pylint *.py - run: echo "The date is" $(date) + run: pylint *.py ; echo "The date is" $(date) working-directory: functions/sample/python lint_django_server: From 636657a94527ef23b2b1b8deb4c5c2f163f8796b Mon Sep 17 00:00:00 2001 From: DevPS-513 Date: Mon, 15 Jan 2024 10:43:57 -0500 Subject: [PATCH 08/21] commiting after testing endpoints to get all dealerships, and endpoint to only get dealerships within a specified state --- .github/workflows/linter.yml | 2 +- functions/.creds-sample.json | 4 +- functions/sample/nodejs/index-promise.js | 79 +- functions/sample/nodejs/package-lock.json | 2872 ++++++++++++++++++++- functions/sample/nodejs/package.json | 6 +- functions/sample/python/main.py | 17 +- 6 files changed, 2909 insertions(+), 71 deletions(-) diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index 4969070df6..4ddc276946 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -44,7 +44,7 @@ jobs: # list of things to do pip install pylint if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - name: Lint with Pylint - run: pylint *.py ; echo "The date is" $(date) + run: pylint *.py working-directory: functions/sample/python lint_django_server: diff --git a/functions/.creds-sample.json b/functions/.creds-sample.json index f4d2fdbe1e..829a7bcfc6 100644 --- a/functions/.creds-sample.json +++ b/functions/.creds-sample.json @@ -1,4 +1,4 @@ { - "COUCH_URL": "", - "IAM_API_KEY": "" + "COUCH_URL": "https://72144af7-975a-4c8a-b653-48177d4a207d-bluemix.cloudantnosqldb.appdomain.cloud" , + "IAM_API_KEY": "8QlH7-SI_k4q2an8qH8Bl24W4mBB-vYgagvrw9heNk55" } \ No newline at end of file diff --git a/functions/sample/nodejs/index-promise.js b/functions/sample/nodejs/index-promise.js index 135d73385a..850b47a682 100644 --- a/functions/sample/nodejs/index-promise.js +++ b/functions/sample/nodejs/index-promise.js @@ -1,11 +1,22 @@ /** * Get all dealerships */ +const express = require('express'); +const app=express() +const PORT = 8080; +const bodyParser = require('body-parser'); const { CloudantV1 } = require('@ibm-cloud/cloudant'); const { IamAuthenticator } = require('ibm-cloud-sdk-core'); -function main(params) { +const params={ + COUCH_URL: "https://72144af7-975a-4c8a-b653-48177d4a207d-bluemix.cloudantnosqldb.appdomain.cloud/" , + IAM_API_KEY: "ySahisbUPABXdqzJc77nAytbcIFLdzMAiLeGuTPRWw5l", + COUCH_USERNAME: "72144af7-975a-4c8a-b653-48177d4a207d-bluemix", +} + + +function get_dealerships(params) { const authenticator = new IamAuthenticator({ apikey: params.IAM_API_KEY }) const cloudant = CloudantV1.newInstance({ @@ -14,14 +25,22 @@ function main(params) { cloudant.setServiceUrl(params.COUCH_URL); let dbListPromise = getDbs(cloudant); - return dbListPromise; + + return getAllRecords(cloudant,"dealerships"); } + + + + + function getDbs(cloudant) { return new Promise((resolve, reject) => { cloudant.getAllDbs() .then(body => { + console.log(body.result) resolve({ dbs: body.result }); + }) .catch(err => { console.log(err); @@ -52,6 +71,9 @@ function getDbs(cloudant) { /* Sample implementation to get all the records in a db. */ + + + function getAllRecords(cloudant,dbname) { return new Promise((resolve, reject) => { cloudant.postAllDocs({ db: dbname, includeDocs: true, limit: 10 }) @@ -64,3 +86,56 @@ function getDbs(cloudant) { }); }) } + + + + app.listen( + PORT, + () => console.log(`its alive on http://localhost:${PORT}`) + + ) + + + app.get('/api/dealership',(req,res)=> { + + let state = req.query.state; + if(state){ + state=state.replace(/"/g,''); + state=state.replace(/`/g,''); + } + + + get_dealerships(params) + .then(result => { + if (state) { + + let filteredResult = result.result.filter(dealership=> dealership.doc.state === state); + res.status(200).send(filteredResult); + } else { + res.status(200).send(result); + } + }) + .catch(err=>res.status(500).send(err)); + + }); + + + app.get('/api/review',(req,res)=> { + + let dealerID = req.query.dealerID; + console.log(dealerID) + + + get_reviews(params) + .then(result => { + if (state) { + + let filteredResult = result.result.filter(dealership=> dealership.doc.state === state); + res.status(200).send(filteredResult); + } else { + res.status(200).send(result); + } + }) + .catch(err=>res.status(500).send(err)); + + }); \ No newline at end of file diff --git a/functions/sample/nodejs/package-lock.json b/functions/sample/nodejs/package-lock.json index a74c9ce34a..3fbd8be0f0 100644 --- a/functions/sample/nodejs/package-lock.json +++ b/functions/sample/nodejs/package-lock.json @@ -9,12 +9,177 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@cloudant/cloudant": "^4.4.0" + "@cloudant/cloudant": "^4.4.0", + "@ibm-cloud/cloudant": "^0.8.2", + "dotenv": "^16.3.1", + "express": "^4.18.2", + "ibm-cloud-sdk-core": "^4.2.2" }, "devDependencies": { "eslint": "^8.27.0" } }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@cloudant/cloudant": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/@cloudant/cloudant/-/cloudant-4.5.1.tgz", @@ -137,6 +302,38 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@ibm-cloud/cloudant": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@ibm-cloud/cloudant/-/cloudant-0.8.2.tgz", + "integrity": "sha512-lUMV3Ma4PmIqP25HIgXXZfED25ANzLJreleeS7wVfzYlPjKSrgR8vAOqsGkcrRg/J4ySiF0BCABNP3T4MSnyZQ==", + "dependencies": { + "@types/node": "18.19.4", + "ibm-cloud-sdk-core": "4.2.2" + }, + "engines": { + "node": "^18 || ^20" + }, + "peerDependencies": { + "@types/tough-cookie": "^4.0.0", + "extend": "^3.0.2", + "tough-cookie": "^4.0.0" + } + }, + "node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -172,15 +369,70 @@ "node": ">= 8" } }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + }, "node_modules/@types/caseless": { "version": "0.12.2", "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/file-type": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@types/file-type/-/file-type-5.2.2.tgz", + "integrity": "sha512-GWtM4fyqfb+bec4ocpo51/y4x0b83Je+iA6eV131LT9wL0//G+1UgwbkMg7w61ceOwR+KkZXK00z44jrrNljWg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-EE11Sn7gzHEF9FGkYHTkFpPuDEamLudLvaGnBciNgH55fTYboWZHINR6MP8+CfCOjPJX08l4teRrjCY11gz1CA==" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, "node_modules/@types/node": { - "version": "18.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==" + "version": "18.19.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.4.tgz", + "integrity": "sha512-xNzlUhzoHotIsnFoXmJB+yWmBvFZgKCI9TtPIEdYIMM1KWfwuY8zh7wvc1u1OAXlC7dlf6mZVx/s+Y5KfFz19A==", + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/request": { "version": "2.48.8", @@ -193,11 +445,41 @@ "form-data": "^2.5.0" } }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" + }, "node_modules/@types/tough-cookie": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==" }, + "node_modules/@types/yargs": { + "version": "15.0.19", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", + "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", @@ -238,7 +520,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -247,7 +528,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -264,6 +544,11 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -306,6 +591,29 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, + "node_modules/axios": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.4.tgz", + "integrity": "sha512-heJnIs6N4aa1eSthhN9M5ioILu8Wi8vmQW9iHQ9NUvfkJb0lEEDUiIdQNAuBtfUt3FxReaKdpQA5DbmMOqzF/A==", + "dependencies": { + "follow-redirects": "^1.15.4", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -320,6 +628,56 @@ "tweetnacl": "^0.14.3" } }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -330,6 +688,17 @@ "concat-map": "0.0.1" } }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/browser-request": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/browser-request/-/browser-request-0.3.3.tgz", @@ -338,11 +707,37 @@ "node" ] }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -352,6 +747,14 @@ "node": ">=6" } }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -361,7 +764,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -415,7 +817,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -426,8 +827,7 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -460,6 +860,44 @@ "typedarray": "^0.0.6" } }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/cookie": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", @@ -468,6 +906,11 @@ "node": ">= 0.6" } }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -512,6 +955,19 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -520,6 +976,31 @@ "node": ">=0.4.0" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "engines": { + "node": ">= 10.14.2" + } + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -532,6 +1013,17 @@ "node": ">=6.0.0" } }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -541,6 +1033,27 @@ "safer-buffer": "^2.1.0" } }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/errs": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/errs/-/errs-0.3.2.tgz", @@ -549,6 +1062,11 @@ "node": ">= 0.4.0" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -748,16 +1266,135 @@ "node": ">=0.10.0" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ + "node_modules/expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ "node >=0.6.0" ] }, @@ -798,6 +1435,63 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/file-type": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", + "dependencies": { + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.2.4", + "token-types": "^4.1.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -833,6 +1527,25 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -854,12 +1567,50 @@ "node": ">= 0.12" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -915,6 +1666,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, "node_modules/grapheme-splitter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", @@ -946,11 +1713,69 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -965,6 +1790,99 @@ "npm": ">=1.3.7" } }, + "node_modules/ibm-cloud-sdk-core": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/ibm-cloud-sdk-core/-/ibm-cloud-sdk-core-4.2.2.tgz", + "integrity": "sha512-Vy240CVrZy0jKQsKqpf9qq5ceXsmCUX1o6ZzxW1SWLd1QkiRzm+diNRoHPz2wkQuV2ILnGTchYv0fbm6UM5JdA==", + "dependencies": { + "@types/debug": "^4.1.12", + "@types/file-type": "~5.2.1", + "@types/isstream": "^0.1.0", + "@types/node": "~10.14.19", + "@types/tough-cookie": "^4.0.0", + "axios": "1.6.4", + "camelcase": "^5.3.1", + "debug": "^4.3.4", + "dotenv": "^6.2.0", + "expect": "^26.1.0", + "extend": "^3.0.2", + "file-type": "16.5.4", + "form-data": "^2.3.3", + "isstream": "~0.1.2", + "jsonwebtoken": "^9.0.0", + "lodash.isempty": "^4.4.0", + "mime-types": "^2.1.35", + "retry-axios": "^2.6.0", + "tough-cookie": "^4.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/ibm-cloud-sdk-core/node_modules/@types/node": { + "version": "10.14.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.22.tgz", + "integrity": "sha512-9taxKC944BqoTVjE+UT3pQH0nHZlTvITwfsOZqyc+R3sfJuxaTtxWjfn1K2UlxyPcKHf0rnaXcVFrS9F9vf0bw==" + }, + "node_modules/ibm-cloud-sdk-core/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/ibm-cloud-sdk-core/node_modules/dotenv": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", + "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ibm-cloud-sdk-core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", @@ -1014,6 +1932,14 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1035,6 +1961,14 @@ "node": ">=0.10.0" } }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -1065,12 +1999,80 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, + "node_modules/jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "engines": { + "node": ">= 10.14.2" + } + }, "node_modules/js-sdsl": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", "dev": true }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -1109,6 +2111,27 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, "node_modules/jsprim": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", @@ -1123,6 +2146,25 @@ "node": ">=0.6.0" } }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -1161,12 +2203,107 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isempty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "integrity": "sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -1245,6 +2382,14 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -1253,6 +2398,25 @@ "node": "*" } }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -1329,6 +2493,14 @@ "node": ">=6" } }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -1356,11 +2528,39 @@ "node": ">=8" } }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/peek-readable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", + "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -1370,11 +2570,42 @@ "node": ">= 0.8.0" } }, + "node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -1396,6 +2627,11 @@ "node": ">=0.6" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -1416,6 +2652,33 @@ } ] }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, "node_modules/readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -1430,6 +2693,34 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/readable-web-to-node-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -1486,6 +2777,23 @@ "node": ">= 0.12" } }, + "node_modules/request/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -1495,6 +2803,17 @@ "node": ">=4" } }, + "node_modules/retry-axios": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/retry-axios/-/retry-axios-2.6.0.tgz", + "integrity": "sha512-pOLi+Gdll3JekwuFjXO3fTq+L9lzMQGcSq7M5gIjExcl3Gu1hd4XXuf5o3+LuSBsaULQH7DiNbsqPd1chVpQGQ==", + "engines": { + "node": ">=10.7.0" + }, + "peerDependencies": { + "axios": "*" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -1553,6 +2872,90 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "dependencies": { + "define-data-property": "^1.1.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -1574,6 +2977,27 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, "node_modules/sshpk": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", @@ -1595,7 +3019,34 @@ "sshpk-verify": "bin/sshpk-verify" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.10.0" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" } }, "node_modules/string_decoder": { @@ -1630,11 +3081,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strtok3": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", + "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^4.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -1659,16 +3125,53 @@ "node": ">=0.6.0" } }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/token-types": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", + "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "engines": { - "node": ">=0.8" + "node": ">=6" } }, "node_modules/tunnel-agent": { @@ -1711,11 +3214,44 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -1724,11 +3260,28 @@ "punycode": "^2.1.0" } }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -1738,6 +3291,14 @@ "uuid": "bin/uuid" } }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -1772,9 +3333,9 @@ } }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -1786,6 +3347,11 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -1800,6 +3366,132 @@ } }, "dependencies": { + "@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "requires": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" + }, + "@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "requires": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "@cloudant/cloudant": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/@cloudant/cloudant/-/cloudant-4.5.1.tgz", @@ -1890,6 +3582,27 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@ibm-cloud/cloudant": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@ibm-cloud/cloudant/-/cloudant-0.8.2.tgz", + "integrity": "sha512-lUMV3Ma4PmIqP25HIgXXZfED25ANzLJreleeS7wVfzYlPjKSrgR8vAOqsGkcrRg/J4ySiF0BCABNP3T4MSnyZQ==", + "requires": { + "@types/node": "18.19.4", + "ibm-cloud-sdk-core": "4.2.2" + } + }, + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1916,15 +3629,70 @@ "fastq": "^1.6.0" } }, + "@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + }, "@types/caseless": { "version": "0.12.2", "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" }, + "@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "requires": { + "@types/ms": "*" + } + }, + "@types/file-type": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@types/file-type/-/file-type-5.2.2.tgz", + "integrity": "sha512-GWtM4fyqfb+bec4ocpo51/y4x0b83Je+iA6eV131LT9wL0//G+1UgwbkMg7w61ceOwR+KkZXK00z44jrrNljWg==", + "requires": { + "@types/node": "*" + } + }, + "@types/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-EE11Sn7gzHEF9FGkYHTkFpPuDEamLudLvaGnBciNgH55fTYboWZHINR6MP8+CfCOjPJX08l4teRrjCY11gz1CA==" + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + }, + "@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, "@types/node": { - "version": "18.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==" + "version": "18.19.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.4.tgz", + "integrity": "sha512-xNzlUhzoHotIsnFoXmJB+yWmBvFZgKCI9TtPIEdYIMM1KWfwuY8zh7wvc1u1OAXlC7dlf6mZVx/s+Y5KfFz19A==", + "requires": { + "undici-types": "~5.26.4" + } }, "@types/request": { "version": "2.48.8", @@ -1937,11 +3705,38 @@ "form-data": "^2.5.0" } }, + "@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" + }, "@types/tough-cookie": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==" }, + "@types/yargs": { + "version": "15.0.19", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", + "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, "acorn": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", @@ -1969,14 +3764,12 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -1987,6 +3780,11 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, "asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -2023,6 +3821,28 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, + "axios": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.4.tgz", + "integrity": "sha512-heJnIs6N4aa1eSthhN9M5ioILu8Wi8vmQW9iHQ9NUvfkJb0lEEDUiIdQNAuBtfUt3FxReaKdpQA5DbmMOqzF/A==", + "requires": { + "follow-redirects": "^1.15.4", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + }, + "dependencies": { + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } + } + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2037,6 +3857,48 @@ "tweetnacl": "^0.14.3" } }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2047,22 +3909,55 @@ "concat-map": "0.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, "browser-request": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/browser-request/-/browser-request-0.3.3.tgz", "integrity": "sha512-YyNI4qJJ+piQG6MMEuo7J3Bzaqssufx04zpEKYfSrl/1Op59HWali9zMtBpXnkmqMcOuWJPZvudrm9wISmnCbg==" }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "requires": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -2072,7 +3967,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2107,7 +4001,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -2115,8 +4008,7 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "combined-stream": { "version": "1.0.8", @@ -2143,11 +4035,36 @@ "typedarray": "^0.0.6" } }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, "cookie": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, "core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -2186,11 +4103,36 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "requires": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==" + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -2200,6 +4142,11 @@ "esutils": "^2.0.2" } }, + "dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==" + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -2209,11 +4156,34 @@ "safer-buffer": "^2.1.0" } }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, "errs": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/errs/-/errs-0.3.2.tgz", "integrity": "sha512-r+/tydov04FSwTi+PrGd0IdY195Y1jZW2g27TJ+cErU8vvr9V4hHYxtRF8bMjv4zYEhap7wK7zBQ2i99LRo6kA==" }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -2346,18 +4316,107 @@ "estraverse": "^5.2.0" } }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "requires": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + } + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -2402,6 +4461,53 @@ "flat-cache": "^3.0.4" } }, + "file-type": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", + "requires": { + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.2.4", + "token-types": "^4.1.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -2428,6 +4534,11 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, + "follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==" + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -2443,12 +4554,38 @@ "mime-types": "^2.1.12" } }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "requires": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -2489,6 +4626,19 @@ "type-fest": "^0.20.2" } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, "grapheme-splitter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", @@ -2512,8 +4662,45 @@ "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "requires": { + "get-intrinsic": "^1.2.2" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "requires": { + "function-bind": "^1.1.2" + } + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } }, "http-signature": { "version": "1.2.0", @@ -2525,6 +4712,70 @@ "sshpk": "^1.7.0" } }, + "ibm-cloud-sdk-core": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/ibm-cloud-sdk-core/-/ibm-cloud-sdk-core-4.2.2.tgz", + "integrity": "sha512-Vy240CVrZy0jKQsKqpf9qq5ceXsmCUX1o6ZzxW1SWLd1QkiRzm+diNRoHPz2wkQuV2ILnGTchYv0fbm6UM5JdA==", + "requires": { + "@types/debug": "^4.1.12", + "@types/file-type": "~5.2.1", + "@types/isstream": "^0.1.0", + "@types/node": "~10.14.19", + "@types/tough-cookie": "^4.0.0", + "axios": "1.6.4", + "camelcase": "^5.3.1", + "debug": "^4.3.4", + "dotenv": "^6.2.0", + "expect": "^26.1.0", + "extend": "^3.0.2", + "file-type": "16.5.4", + "form-data": "^2.3.3", + "isstream": "~0.1.2", + "jsonwebtoken": "^9.0.0", + "lodash.isempty": "^4.4.0", + "mime-types": "^2.1.35", + "retry-axios": "^2.6.0", + "tough-cookie": "^4.1.3" + }, + "dependencies": { + "@types/node": { + "version": "10.14.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.22.tgz", + "integrity": "sha512-9taxKC944BqoTVjE+UT3pQH0nHZlTvITwfsOZqyc+R3sfJuxaTtxWjfn1K2UlxyPcKHf0rnaXcVFrS9F9vf0bw==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "dotenv": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", + "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, "ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", @@ -2562,6 +4813,11 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2577,6 +4833,11 @@ "is-extglob": "^2.1.1" } }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, "is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -2604,12 +4865,65 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, + "jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==" + }, + "jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } + }, + "jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + } + }, + "jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==" + }, "js-sdsl": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", "dev": true }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -2645,6 +4959,23 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, + "jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + } + }, "jsprim": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", @@ -2656,6 +4987,25 @@ "verror": "1.10.0" } }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -2685,12 +5035,89 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "lodash.isempty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "integrity": "sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -2751,11 +5178,29 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, + "object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2811,6 +5256,11 @@ "callsites": "^3.0.0" } }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -2829,22 +5279,62 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "peek-readable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", + "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==" + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + } + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -2860,12 +5350,38 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -2880,6 +5396,26 @@ "util-deprecate": "~1.0.1" } }, + "readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "requires": { + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -2922,15 +5458,35 @@ "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } } } }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, + "retry-axios": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/retry-axios/-/retry-axios-2.6.0.tgz", + "integrity": "sha512-pOLi+Gdll3JekwuFjXO3fTq+L9lzMQGcSq7M5gIjExcl3Gu1hd4XXuf5o3+LuSBsaULQH7DiNbsqPd1chVpQGQ==", + "requires": {} + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -2965,6 +5521,79 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "set-function-length": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "requires": { + "define-data-property": "^1.1.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2980,6 +5609,21 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, "sshpk": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", @@ -2996,6 +5640,26 @@ "tweetnacl": "~0.14.0" } }, + "stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + } + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3019,11 +5683,19 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, + "strtok3": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", + "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", + "requires": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^4.1.0" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -3042,13 +5714,37 @@ "os-tmpdir": "~1.0.2" } }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "token-types": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", + "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", + "requires": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + } + }, "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" } }, "tunnel-agent": { @@ -3079,11 +5775,35 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -3092,16 +5812,35 @@ "punycode": "^2.1.0" } }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -3129,9 +5868,9 @@ } }, "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true }, "wrappy": { @@ -3140,6 +5879,11 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/functions/sample/nodejs/package.json b/functions/sample/nodejs/package.json index 72fa5b6e5f..e22d3d16ee 100644 --- a/functions/sample/nodejs/package.json +++ b/functions/sample/nodejs/package.json @@ -12,7 +12,11 @@ "author": "", "license": "ISC", "dependencies": { - "@cloudant/cloudant": "^4.4.0" + "@cloudant/cloudant": "^4.4.0", + "@ibm-cloud/cloudant": "^0.8.2", + "dotenv": "^16.3.1", + "express": "^4.18.2", + "ibm-cloud-sdk-core": "^4.2.2" }, "devDependencies": { "eslint": "^8.27.0" diff --git a/functions/sample/python/main.py b/functions/sample/python/main.py index a88499515c..18f286e7d3 100644 --- a/functions/sample/python/main.py +++ b/functions/sample/python/main.py @@ -8,6 +8,14 @@ import requests +param_dict ={ + "COUCH_URL": "72144af7-975a-4c8a-b653-48177d4a207d-bluemix.cloudantnosqldb.appdomain.cloud" , + "IAM_API_KEY": "ySahisbUPABXdqzJc77nAytbcIFLdzMAiLeGuTPRWw5l", + "COUCH_USERNAME": "72144af7-975a-4c8a-b653-48177d4a207d-bluemix", +} + +#https://72144af7-975a-4c8a-b653-48177d4a207d-bluemix.cloudantnosqldb.appdomain.cloud + def main(param_dict): """Main Function @@ -18,12 +26,16 @@ def main(param_dict): _type_: _description_ TODO """ + + print("params are",param_dict["COUCH_USERNAME"], param_dict["IAM_API_KEY"],param_dict['COUCH_URL']) + try: client = Cloudant.iam( account_name=param_dict["COUCH_USERNAME"], - api_key=param_dict["IAM_API_KEY"], + api_key=param_dict["IAM_API_KEY"],url=param_dict["COUCH_URL"], connect=True, ) + print(f"Databases: {client.all_dbs()}") except CloudantException as cloudant_exception: print("unable to connect") @@ -33,3 +45,6 @@ def main(param_dict): return {"error": err} return {"dbs": client.all_dbs()} + +main(param_dict) + From 3ec47d3cd7103a99c4d3f0f3a58b1b48cfc5aa51 Mon Sep 17 00:00:00 2001 From: DevPS-513 Date: Mon, 15 Jan 2024 11:03:55 -0500 Subject: [PATCH 09/21] adding functionality to retreive review by dealership ID number --- functions/sample/nodejs/index-promise.js | 31 +++++++++++++----------- functions/sample/python/main.py | 4 +-- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/functions/sample/nodejs/index-promise.js b/functions/sample/nodejs/index-promise.js index 850b47a682..65fe0f9cfb 100644 --- a/functions/sample/nodejs/index-promise.js +++ b/functions/sample/nodejs/index-promise.js @@ -29,10 +29,18 @@ function get_dealerships(params) { return getAllRecords(cloudant,"dealerships"); } +function get_reviews(params) { + const authenticator = new IamAuthenticator({ apikey: params.IAM_API_KEY }) + const cloudant = CloudantV1.newInstance({ + authenticator: authenticator + }); + cloudant.setServiceUrl(params.COUCH_URL); + let dbListPromise = getDbs(cloudant); - + return getAllRecords(cloudant,"reviews"); +} function getDbs(cloudant) { return new Promise((resolve, reject) => { @@ -65,15 +73,12 @@ function getDbs(cloudant) { reject({ err: err }); }); }) - } - + } /* Sample implementation to get all the records in a db. */ - - function getAllRecords(cloudant,dbname) { return new Promise((resolve, reject) => { cloudant.postAllDocs({ db: dbname, includeDocs: true, limit: 10 }) @@ -87,15 +92,12 @@ function getDbs(cloudant) { }) } - - app.listen( PORT, () => console.log(`its alive on http://localhost:${PORT}`) ) - app.get('/api/dealership',(req,res)=> { let state = req.query.state; @@ -104,7 +106,6 @@ function getDbs(cloudant) { state=state.replace(/`/g,''); } - get_dealerships(params) .then(result => { if (state) { @@ -119,18 +120,20 @@ function getDbs(cloudant) { }); - app.get('/api/review',(req,res)=> { let dealerID = req.query.dealerID; - console.log(dealerID) - + if(dealerID){ + dealerID=dealerID.replace(/"/g,''); + dealerID=dealerID.replace(/`/g,''); + } get_reviews(params) .then(result => { - if (state) { + if (dealerID) { - let filteredResult = result.result.filter(dealership=> dealership.doc.state === state); + let filteredResult = result.result.filter(review=> Number(review.doc.id) === Number(dealerID)); + console.log(filteredResult) res.status(200).send(filteredResult); } else { res.status(200).send(result); diff --git a/functions/sample/python/main.py b/functions/sample/python/main.py index 18f286e7d3..39187db03b 100644 --- a/functions/sample/python/main.py +++ b/functions/sample/python/main.py @@ -12,9 +12,7 @@ "COUCH_URL": "72144af7-975a-4c8a-b653-48177d4a207d-bluemix.cloudantnosqldb.appdomain.cloud" , "IAM_API_KEY": "ySahisbUPABXdqzJc77nAytbcIFLdzMAiLeGuTPRWw5l", "COUCH_USERNAME": "72144af7-975a-4c8a-b653-48177d4a207d-bluemix", -} - -#https://72144af7-975a-4c8a-b653-48177d4a207d-bluemix.cloudantnosqldb.appdomain.cloud +} def main(param_dict): """Main Function From 50f516a9179a88c7485c8f6b5f4ebb79fdf2d7b9 Mon Sep 17 00:00:00 2001 From: DevPS-513 Date: Mon, 15 Jan 2024 16:59:45 -0500 Subject: [PATCH 10/21] added functionality to add carmake and cartype on admin site --- functions/sample/python/main.py | 68 +- server/DataBaseExample.json | 1173 ++++++++++++++++++++++++++++++ server/db.sqlite3 | Bin 131072 -> 143360 bytes server/djangoapp/admin.py | 16 +- server/djangoapp/models.py | 17 + server/djangobackend/settings.py | 2 +- 6 files changed, 1268 insertions(+), 8 deletions(-) create mode 100644 server/DataBaseExample.json diff --git a/functions/sample/python/main.py b/functions/sample/python/main.py index 39187db03b..ee9681eb86 100644 --- a/functions/sample/python/main.py +++ b/functions/sample/python/main.py @@ -7,6 +7,13 @@ from cloudant.error import CloudantException import requests +from flask import Flask, jsonify, request +import json +from flask_cors import CORS + +app = Flask(__name__) +CORS(app) + param_dict ={ "COUCH_URL": "72144af7-975a-4c8a-b653-48177d4a207d-bluemix.cloudantnosqldb.appdomain.cloud" , @@ -34,15 +41,70 @@ def main(param_dict): connect=True, ) - print(f"Databases: {client.all_dbs()}") + # print(f"Databases: {client.all_dbs()}") + except CloudantException as cloudant_exception: + print("unable to connect") + return {"error": cloudant_exception} + except (requests.exceptions.RequestException, ConnectionResetError) as err: + print("connection error") + return {"error": err} + + dbs_content = {} + for db_name in client.all_dbs(): + db = client[db_name] + dbs_content[db_name]=db.all_docs(include_docs=True)['rows'] + + return {"dbs": dbs_content} + + + + +@app.route('/', methods=['GET']) +def home(): + return main(param_dict) + + +@app.route('/reviews', methods=['GET']) +def reviews(): + result=main(param_dict) + + + + return {'message': result}, 201 + + +@app.route('/reviews', methods=['POST']) +def add_reviews(): + review_data = request.get_json() + + + try: + client = Cloudant.iam( + account_name=param_dict["COUCH_USERNAME"], + api_key=param_dict["IAM_API_KEY"],url=param_dict["COUCH_URL"], + connect=True, + ) + + # print(f"Databases: {client.all_dbs()}") except CloudantException as cloudant_exception: print("unable to connect") return {"error": cloudant_exception} except (requests.exceptions.RequestException, ConnectionResetError) as err: print("connection error") return {"error": err} + + review_db=client['reviews'] + + new_review=review_db.create_document(review_data) + + # Check if the document was saved + if new_review.exists(): + return {'message': 'Review added successfully'}, 201 + else: + return {'message': 'Error adding review'}, 500 + + - return {"dbs": client.all_dbs()} -main(param_dict) +app.run(port=5000,debug=True) diff --git a/server/DataBaseExample.json b/server/DataBaseExample.json new file mode 100644 index 0000000000..077ef7fdf1 --- /dev/null +++ b/server/DataBaseExample.json @@ -0,0 +1,1173 @@ +{ + "dbs": { + "dealerships": [ + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781801d86", + "_rev": "1-34e7ebd07643af43db578a46ee1d6365", + "address": "3 Nova Court", + "city": "El Paso", + "full_name": "Holdlamis Car Dealership", + "id": 1, + "lat": 31.6948, + "long": -106.3, + "short_name": "Holdlamis", + "st": "TX", + "state": "Texas", + "zip": "88563" + }, + "id": "9c3725831f60fdec5f0c0b4781801d86", + "key": "9c3725831f60fdec5f0c0b4781801d86", + "value": { + "rev": "1-34e7ebd07643af43db578a46ee1d6365" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781801fc1", + "_rev": "1-d1778a396ca8cb0ef2966a9854eb93ee", + "address": "6337 Butternut Crossing", + "city": "Minneapolis", + "full_name": "Temp Car Dealership", + "id": 2, + "lat": 44.9762, + "long": -93.2759, + "short_name": "Temp", + "st": "MN", + "state": "Minnesota", + "zip": "55402" + }, + "id": "9c3725831f60fdec5f0c0b4781801fc1", + "key": "9c3725831f60fdec5f0c0b4781801fc1", + "value": { + "rev": "1-d1778a396ca8cb0ef2966a9854eb93ee" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781802f4c", + "_rev": "1-cc5d5c13aa879d1cef8253dfa1dce77d", + "address": "9477 Twin Pines Center", + "city": "Birmingham", + "full_name": "Sub-Ex Car Dealership", + "id": 3, + "lat": 33.5446, + "long": -86.9292, + "short_name": "Sub-Ex", + "st": "AL", + "state": "Alabama", + "zip": "35285" + }, + "id": "9c3725831f60fdec5f0c0b4781802f4c", + "key": "9c3725831f60fdec5f0c0b4781802f4c", + "value": { + "rev": "1-cc5d5c13aa879d1cef8253dfa1dce77d" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781803847", + "_rev": "1-a79013b42c83451d49e7e3aba4a575e3", + "address": "85800 Hazelcrest Circle", + "city": "Dallas", + "full_name": "Solarbreeze Car Dealership", + "id": 4, + "lat": 32.6722, + "long": -96.7774, + "short_name": "Solarbreeze", + "st": "TX", + "state": "Texas", + "zip": "75241" + }, + "id": "9c3725831f60fdec5f0c0b4781803847", + "key": "9c3725831f60fdec5f0c0b4781803847", + "value": { + "rev": "1-a79013b42c83451d49e7e3aba4a575e3" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180403c", + "_rev": "1-c16dcd97a91588c9866814f61ea72751", + "address": "93 Golf Course Pass", + "city": "Baltimore", + "full_name": "Regrant Car Dealership", + "id": 5, + "lat": 39.2847, + "long": -76.6205, + "short_name": "Regrant", + "st": "MD", + "state": "Maryland", + "zip": "21203" + }, + "id": "9c3725831f60fdec5f0c0b478180403c", + "key": "9c3725831f60fdec5f0c0b478180403c", + "value": { + "rev": "1-c16dcd97a91588c9866814f61ea72751" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b47818042b7", + "_rev": "1-e37424d3be7785cbdbc4ed12ec29b343", + "address": "2 Burrows Hill", + "city": "Wilkes Barre", + "full_name": "Stronghold Car Dealership", + "id": 6, + "lat": 41.2722, + "long": -75.8801, + "short_name": "Stronghold", + "st": "PA", + "state": "Pennsylvania", + "zip": "18763" + }, + "id": "9c3725831f60fdec5f0c0b47818042b7", + "key": "9c3725831f60fdec5f0c0b47818042b7", + "value": { + "rev": "1-e37424d3be7785cbdbc4ed12ec29b343" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b47818049b6", + "_rev": "1-96db320a9c736d2e08e8b1bf873d0e04", + "address": "9 Cambridge Park", + "city": "Pueblo", + "full_name": "Job Car Dealership", + "id": 7, + "lat": 38.1286, + "long": -104.5523, + "short_name": "Job", + "st": "CO", + "state": "Colorado", + "zip": "81010" + }, + "id": "9c3725831f60fdec5f0c0b47818049b6", + "key": "9c3725831f60fdec5f0c0b47818049b6", + "value": { + "rev": "1-96db320a9c736d2e08e8b1bf873d0e04" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180542a", + "_rev": "1-4e4889794e42a9e092c1442118889232", + "address": "288 Larry Place", + "city": "Topeka", + "full_name": "Bytecard Car Dealership", + "id": 8, + "lat": 39.0429, + "long": -95.7697, + "short_name": "Bytecard", + "st": "KS", + "state": "Kansas", + "zip": "66642" + }, + "id": "9c3725831f60fdec5f0c0b478180542a", + "key": "9c3725831f60fdec5f0c0b478180542a", + "value": { + "rev": "1-4e4889794e42a9e092c1442118889232" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781805a8b", + "_rev": "1-63f1a1984f40f1de1eabceaec90f7fb6", + "address": "253 Hanson Junction", + "city": "Dallas", + "full_name": "Job Car Dealership", + "id": 9, + "lat": 32.7086, + "long": -96.7955, + "short_name": "Job", + "st": "TX", + "state": "Texas", + "zip": "75216" + }, + "id": "9c3725831f60fdec5f0c0b4781805a8b", + "key": "9c3725831f60fdec5f0c0b4781805a8b", + "value": { + "rev": "1-63f1a1984f40f1de1eabceaec90f7fb6" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781806489", + "_rev": "1-1510e7ca88f225bef573a98f9cb45452", + "address": "108 Memorial Pass", + "city": "Washington", + "full_name": "Alphazap Car Dealership", + "id": 10, + "lat": 38.9067, + "long": -77.0312, + "short_name": "Alphazap", + "st": "DC", + "state": "District of Columbia", + "zip": "20005" + }, + "id": "9c3725831f60fdec5f0c0b4781806489", + "key": "9c3725831f60fdec5f0c0b4781806489", + "value": { + "rev": "1-1510e7ca88f225bef573a98f9cb45452" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781806aa4", + "_rev": "1-25e4e732c54e2138a7d6c344f7c906f4", + "address": "8108 Dryden Court", + "city": "Carol Stream", + "full_name": "Rank Car Dealership", + "id": 11, + "lat": 41.9166, + "long": -88.1208, + "short_name": "Rank", + "st": "IL", + "state": "Illinois", + "zip": "60351" + }, + "id": "9c3725831f60fdec5f0c0b4781806aa4", + "key": "9c3725831f60fdec5f0c0b4781806aa4", + "value": { + "rev": "1-25e4e732c54e2138a7d6c344f7c906f4" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180739c", + "_rev": "1-87eca1b09104f3efd4373e4edfacbb38", + "address": "168 Pawling Lane", + "city": "Silver Spring", + "full_name": "Tin Car Dealership", + "id": 12, + "lat": 39.144, + "long": -77.2076, + "short_name": "Tin", + "st": "MD", + "state": "Maryland", + "zip": "20918" + }, + "id": "9c3725831f60fdec5f0c0b478180739c", + "key": "9c3725831f60fdec5f0c0b478180739c", + "value": { + "rev": "1-87eca1b09104f3efd4373e4edfacbb38" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781807d4b", + "_rev": "1-97762bda9286ea2d1218a64383ab5370", + "address": "452 Fair Oaks Drive", + "city": "Baltimore", + "full_name": "Y-Solowarm Car Dealership", + "id": 13, + "lat": 39.2847, + "long": -76.6205, + "short_name": "Y-Solowarm", + "st": "MD", + "state": "Maryland", + "zip": "21275" + }, + "id": "9c3725831f60fdec5f0c0b4781807d4b", + "key": "9c3725831f60fdec5f0c0b4781807d4b", + "value": { + "rev": "1-97762bda9286ea2d1218a64383ab5370" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781808645", + "_rev": "1-7828b3ead20b34e43a00d8305fee6cd2", + "address": "2109 Scott Parkway", + "city": "San Francisco", + "full_name": "It Car Dealership", + "id": 14, + "lat": 37.7848, + "long": -122.7278, + "short_name": "It", + "st": "CA", + "state": "California", + "zip": "94147" + }, + "id": "9c3725831f60fdec5f0c0b4781808645", + "key": "9c3725831f60fdec5f0c0b4781808645", + "value": { + "rev": "1-7828b3ead20b34e43a00d8305fee6cd2" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781809601", + "_rev": "1-018064051a79bae4a38595f6d712f1f4", + "address": "5057 Pankratz Hill", + "city": "San Antonio", + "full_name": "Tempsoft Car Dealership", + "id": 15, + "lat": 29.3875, + "long": -98.5245, + "short_name": "Tempsoft", + "st": "TX", + "state": "Texas", + "zip": "78225" + }, + "id": "9c3725831f60fdec5f0c0b4781809601", + "key": "9c3725831f60fdec5f0c0b4781809601", + "value": { + "rev": "1-018064051a79bae4a38595f6d712f1f4" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180a203", + "_rev": "1-cfc990372e5aead5c1461c5363ab9661", + "address": "0 Rieder Trail", + "city": "El Paso", + "full_name": "Treeflex Car Dealership", + "id": 16, + "lat": 31.6948, + "long": -106.3, + "short_name": "Treeflex", + "st": "TX", + "state": "Texas", + "zip": "79994" + }, + "id": "9c3725831f60fdec5f0c0b478180a203", + "key": "9c3725831f60fdec5f0c0b478180a203", + "value": { + "rev": "1-cfc990372e5aead5c1461c5363ab9661" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180a4f8", + "_rev": "1-ee4a7286b4515e5c4ef7fb152c6dc37d", + "address": "7670 American Ash Drive", + "city": "San Jose", + "full_name": "Home Ing Car Dealership", + "id": 17, + "lat": 37.2602, + "long": -121.7709, + "short_name": "Home Ing", + "st": "CA", + "state": "California", + "zip": "95138" + }, + "id": "9c3725831f60fdec5f0c0b478180a4f8", + "key": "9c3725831f60fdec5f0c0b478180a4f8", + "value": { + "rev": "1-ee4a7286b4515e5c4ef7fb152c6dc37d" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180aea7", + "_rev": "1-2c1ccca9532d409320038cb83d4f80d6", + "address": "4 Pearson Avenue", + "city": "Whittier", + "full_name": "Bitchip Car Dealership", + "id": 18, + "lat": 33.9413, + "long": -118.0356, + "short_name": "Bitchip", + "st": "CA", + "state": "California", + "zip": "90605" + }, + "id": "9c3725831f60fdec5f0c0b478180aea7", + "key": "9c3725831f60fdec5f0c0b478180aea7", + "value": { + "rev": "1-2c1ccca9532d409320038cb83d4f80d6" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180b826", + "_rev": "1-4467795f20d7931f351651580bc75d0d", + "address": "93 Monument Circle", + "city": "Hialeah", + "full_name": "Otcom Car Dealership", + "id": 19, + "lat": 25.8594, + "long": -80.2725, + "short_name": "Otcom", + "st": "FL", + "state": "Florida", + "zip": "33013" + }, + "id": "9c3725831f60fdec5f0c0b478180b826", + "key": "9c3725831f60fdec5f0c0b478180b826", + "value": { + "rev": "1-4467795f20d7931f351651580bc75d0d" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180bd2d", + "_rev": "1-3518514abb91e959ae2c73d2a0468962", + "address": "4580 Waubesa Lane", + "city": "Detroit", + "full_name": "Subin Car Dealership", + "id": 20, + "lat": 42.4098, + "long": -82.9441, + "short_name": "Subin", + "st": "MI", + "state": "Michigan", + "zip": "48224" + }, + "id": "9c3725831f60fdec5f0c0b478180bd2d", + "key": "9c3725831f60fdec5f0c0b478180bd2d", + "value": { + "rev": "1-3518514abb91e959ae2c73d2a0468962" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180ca5f", + "_rev": "1-3f78374abc08662f7f9bde1cc4b726a6", + "address": "046 Mockingbird Junction", + "city": "San Francisco", + "full_name": "Andalax Car Dealership", + "id": 21, + "lat": 37.7848, + "long": -122.7278, + "short_name": "Andalax", + "st": "CA", + "state": "California", + "zip": "94154" + }, + "id": "9c3725831f60fdec5f0c0b478180ca5f", + "key": "9c3725831f60fdec5f0c0b478180ca5f", + "value": { + "rev": "1-3f78374abc08662f7f9bde1cc4b726a6" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180d5dd", + "_rev": "1-cd8b9f26a5f3445ac312f1242a67fe6b", + "address": "45737 Butternut Lane", + "city": "Fort Lauderdale", + "full_name": "Y-Solowarm Car Dealership", + "id": 22, + "lat": 26.0663, + "long": -80.3339, + "short_name": "Y-Solowarm", + "st": "FL", + "state": "Florida", + "zip": "33330" + }, + "id": "9c3725831f60fdec5f0c0b478180d5dd", + "key": "9c3725831f60fdec5f0c0b478180d5dd", + "value": { + "rev": "1-cd8b9f26a5f3445ac312f1242a67fe6b" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180d8a3", + "_rev": "1-35acfb718ff5e840b6dfa2234635a9cc", + "address": "21425 Bartelt Pass", + "city": "Des Moines", + "full_name": "Bitchip Car Dealership", + "id": 23, + "lat": 41.6727, + "long": -93.5722, + "short_name": "Bitchip", + "st": "IA", + "state": "Iowa", + "zip": "50936" + }, + "id": "9c3725831f60fdec5f0c0b478180d8a3", + "key": "9c3725831f60fdec5f0c0b478180d8a3", + "value": { + "rev": "1-35acfb718ff5e840b6dfa2234635a9cc" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180e6aa", + "_rev": "1-f64046127bcb266e6d8621a6e0761edf", + "address": "408 Delaware Circle", + "city": "Utica", + "full_name": "Aerified Car Dealership", + "id": 24, + "lat": 43.0872, + "long": -75.2603, + "short_name": "Aerified", + "st": "NY", + "state": "New York", + "zip": "13505" + }, + "id": "9c3725831f60fdec5f0c0b478180e6aa", + "key": "9c3725831f60fdec5f0c0b478180e6aa", + "value": { + "rev": "1-f64046127bcb266e6d8621a6e0761edf" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180f659", + "_rev": "1-b9645c81abd6ad8111bbd1c3adddc211", + "address": "6505 Melrose Junction", + "city": "Washington", + "full_name": "Opela Car Dealership", + "id": 25, + "lat": 38.8933, + "long": -77.0146, + "short_name": "Opela", + "st": "DC", + "state": "District of Columbia", + "zip": "20580" + }, + "id": "9c3725831f60fdec5f0c0b478180f659", + "key": "9c3725831f60fdec5f0c0b478180f659", + "value": { + "rev": "1-b9645c81abd6ad8111bbd1c3adddc211" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180fe50", + "_rev": "1-4ca2683a2bc5d6adc9d7f17d6a6d3815", + "address": "306 Jenna Parkway", + "city": "Pittsburgh", + "full_name": "Flowdesk Car Dealership", + "id": 26, + "lat": 40.4344, + "long": -80.0248, + "short_name": "Flowdesk", + "st": "PA", + "state": "Pennsylvania", + "zip": "15279" + }, + "id": "9c3725831f60fdec5f0c0b478180fe50", + "key": "9c3725831f60fdec5f0c0b478180fe50", + "value": { + "rev": "1-4ca2683a2bc5d6adc9d7f17d6a6d3815" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b47818101c5", + "_rev": "1-0d1ad5ed7cfde86fde2b69345e3b8163", + "address": "95321 Superior Hill", + "city": "San Antonio", + "full_name": "Namfix Car Dealership", + "id": 27, + "lat": 29.4189, + "long": -98.6895, + "short_name": "Namfix", + "st": "TX", + "state": "Texas", + "zip": "78245" + }, + "id": "9c3725831f60fdec5f0c0b47818101c5", + "key": "9c3725831f60fdec5f0c0b47818101c5", + "value": { + "rev": "1-0d1ad5ed7cfde86fde2b69345e3b8163" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b47818102e4", + "_rev": "1-fdc867c57002345cfe2e0d17fbb0d4b1", + "address": "5458 Maple Way", + "city": "Hialeah", + "full_name": "Fixflex Car Dealership", + "id": 28, + "lat": 25.9098, + "long": -80.3889, + "short_name": "Fixflex", + "st": "FL", + "state": "Florida", + "zip": "33018" + }, + "id": "9c3725831f60fdec5f0c0b47818102e4", + "key": "9c3725831f60fdec5f0c0b47818102e4", + "value": { + "rev": "1-fdc867c57002345cfe2e0d17fbb0d4b1" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b47818108f4", + "_rev": "1-a017eedc4af988246172b38580dd1bc5", + "address": "9 Harper Circle", + "city": "San Francisco", + "full_name": "Fix San Car Dealership", + "id": 29, + "lat": 37.7509, + "long": -122.4153, + "short_name": "Fix San", + "st": "CA", + "state": "California", + "zip": "94110" + }, + "id": "9c3725831f60fdec5f0c0b47818108f4", + "key": "9c3725831f60fdec5f0c0b47818108f4", + "value": { + "rev": "1-a017eedc4af988246172b38580dd1bc5" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781810955", + "_rev": "1-bc91c48db51d66e73a2e6b759f566014", + "address": "5423 Spaight Road", + "city": "Houston", + "full_name": "Opela Car Dealership", + "id": 30, + "lat": 29.834, + "long": -95.4342, + "short_name": "Opela", + "st": "TX", + "state": "Texas", + "zip": "77218" + }, + "id": "9c3725831f60fdec5f0c0b4781810955", + "key": "9c3725831f60fdec5f0c0b4781810955", + "value": { + "rev": "1-bc91c48db51d66e73a2e6b759f566014" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781810d07", + "_rev": "1-9000d475bd23c5fd22121b16319db543", + "address": "5 Northfield Pass", + "city": "New York City", + "full_name": "Fintone Car Dealership", + "id": 31, + "lat": 40.7808, + "long": -73.9772, + "short_name": "Fintone", + "st": "NY", + "state": "New York", + "zip": "10131" + }, + "id": "9c3725831f60fdec5f0c0b4781810d07", + "key": "9c3725831f60fdec5f0c0b4781810d07", + "value": { + "rev": "1-9000d475bd23c5fd22121b16319db543" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478181147b", + "_rev": "1-cdbfaad14f48d0bd80b435460a802b38", + "address": "3 Carey Junction", + "city": "Wilkes Barre", + "full_name": "Subin Car Dealership", + "id": 32, + "lat": 41.2722, + "long": -75.8801, + "short_name": "Subin", + "st": "PA", + "state": "Pennsylvania", + "zip": "18768" + }, + "id": "9c3725831f60fdec5f0c0b478181147b", + "key": "9c3725831f60fdec5f0c0b478181147b", + "value": { + "rev": "1-cdbfaad14f48d0bd80b435460a802b38" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781811580", + "_rev": "1-c6418f907fbb6365e6a996004b7100f0", + "address": "627 Cottonwood Circle", + "city": "Des Moines", + "full_name": "Tres-Zap Car Dealership", + "id": 33, + "lat": 41.6727, + "long": -93.5722, + "short_name": "Tres-Zap", + "st": "IA", + "state": "Iowa", + "zip": "50335" + }, + "id": "9c3725831f60fdec5f0c0b4781811580", + "key": "9c3725831f60fdec5f0c0b4781811580", + "value": { + "rev": "1-c6418f907fbb6365e6a996004b7100f0" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781811df4", + "_rev": "1-4d8add6ff98d59554709f3bd95e0b7fa", + "address": "8 Green Hill", + "city": "Silver Spring", + "full_name": "Gembucket Car Dealership", + "id": 34, + "lat": 39.0668, + "long": -76.9969, + "short_name": "Gembucket", + "st": "MD", + "state": "Maryland", + "zip": "20904" + }, + "id": "9c3725831f60fdec5f0c0b4781811df4", + "key": "9c3725831f60fdec5f0c0b4781811df4", + "value": { + "rev": "1-4d8add6ff98d59554709f3bd95e0b7fa" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b47818121d3", + "_rev": "1-046cb455b152448daea503bc1fb84941", + "address": "9 Beilfuss Trail", + "city": "Seattle", + "full_name": "Treeflex Car Dealership", + "id": 35, + "lat": 47.4497, + "long": -122.3076, + "short_name": "Treeflex", + "st": "WA", + "state": "Washington", + "zip": "98158" + }, + "id": "9c3725831f60fdec5f0c0b47818121d3", + "key": "9c3725831f60fdec5f0c0b47818121d3", + "value": { + "rev": "1-046cb455b152448daea503bc1fb84941" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b47818128ea", + "_rev": "1-9a5b78f2e289c88181452eae51029f19", + "address": "311 Paget Alley", + "city": "Vienna", + "full_name": "Latlux Car Dealership", + "id": 36, + "lat": 38.8318, + "long": -77.2888, + "short_name": "Latlux", + "st": "VA", + "state": "Virginia", + "zip": "22184" + }, + "id": "9c3725831f60fdec5f0c0b47818128ea", + "key": "9c3725831f60fdec5f0c0b47818128ea", + "value": { + "rev": "1-9a5b78f2e289c88181452eae51029f19" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781813207", + "_rev": "1-0938f528ee4ec72ba5710e4f855e3688", + "address": "152 Moland Lane", + "city": "Detroit", + "full_name": "Ventosanzap Car Dealership", + "id": 37, + "lat": 42.4098, + "long": -82.9441, + "short_name": "Ventosanzap", + "st": "MI", + "state": "Michigan", + "zip": "48224" + }, + "id": "9c3725831f60fdec5f0c0b4781813207", + "key": "9c3725831f60fdec5f0c0b4781813207", + "value": { + "rev": "1-0938f528ee4ec72ba5710e4f855e3688" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781813b5b", + "_rev": "1-6e07d6d5c6d7a616ba7b7358db413d1a", + "address": "821 New Castle Trail", + "city": "Dallas", + "full_name": "Zamit Car Dealership", + "id": 38, + "lat": 32.7887, + "long": -96.7676, + "short_name": "Zamit", + "st": "TX", + "state": "Texas", + "zip": "75226" + }, + "id": "9c3725831f60fdec5f0c0b4781813b5b", + "key": "9c3725831f60fdec5f0c0b4781813b5b", + "value": { + "rev": "1-6e07d6d5c6d7a616ba7b7358db413d1a" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781813f43", + "_rev": "1-aad3e04d9c8755694ad22d3bb6915553", + "address": "990 Raven Road", + "city": "Fresno", + "full_name": "Stronghold Car Dealership", + "id": 39, + "lat": 36.7464, + "long": -119.6397, + "short_name": "Stronghold", + "st": "CA", + "state": "California", + "zip": "93740" + }, + "id": "9c3725831f60fdec5f0c0b4781813f43", + "key": "9c3725831f60fdec5f0c0b4781813f43", + "value": { + "rev": "1-aad3e04d9c8755694ad22d3bb6915553" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781814e22", + "_rev": "1-50617ded0848567bbdbda0551272923b", + "address": "89375 Main Trail", + "city": "Merrifield", + "full_name": "Greenlam Car Dealership", + "id": 40, + "lat": 38.8318, + "long": -77.2888, + "short_name": "Greenlam", + "st": "VA", + "state": "Virginia", + "zip": "22119" + }, + "id": "9c3725831f60fdec5f0c0b4781814e22", + "key": "9c3725831f60fdec5f0c0b4781814e22", + "value": { + "rev": "1-50617ded0848567bbdbda0551272923b" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781815e0e", + "_rev": "1-e258b026351685c07473fd61d7facca1", + "address": "9 Sherman Hill", + "city": "Baltimore", + "full_name": "Tres-Zap Car Dealership", + "id": 41, + "lat": 39.2847, + "long": -76.6205, + "short_name": "Tres-Zap", + "st": "MD", + "state": "Maryland", + "zip": "21275" + }, + "id": "9c3725831f60fdec5f0c0b4781815e0e", + "key": "9c3725831f60fdec5f0c0b4781815e0e", + "value": { + "rev": "1-e258b026351685c07473fd61d7facca1" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b47818161e2", + "_rev": "1-a627885eb87bc547ab133dc9ecea681b", + "address": "62 Manley Point", + "city": "Jersey City", + "full_name": "Konklab Car Dealership", + "id": 42, + "lat": 40.7324, + "long": -74.0431, + "short_name": "Konklab", + "st": "NJ", + "state": "New Jersey", + "zip": "07310" + }, + "id": "9c3725831f60fdec5f0c0b47818161e2", + "key": "9c3725831f60fdec5f0c0b47818161e2", + "value": { + "rev": "1-a627885eb87bc547ab133dc9ecea681b" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781816d18", + "_rev": "1-0ef43a2fc9385b68c4365489004d2b97", + "address": "91 Declaration Avenue", + "city": "Atlanta", + "full_name": "Opela Car Dealership", + "id": 43, + "lat": 33.8913, + "long": -84.0746, + "short_name": "Opela", + "st": "GA", + "state": "Georgia", + "zip": "31119" + }, + "id": "9c3725831f60fdec5f0c0b4781816d18", + "key": "9c3725831f60fdec5f0c0b4781816d18", + "value": { + "rev": "1-0ef43a2fc9385b68c4365489004d2b97" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478181704c", + "_rev": "1-2acfaaf786b749f0c71351f6468dfbaa", + "address": "0 Northview Point", + "city": "Roanoke", + "full_name": "Veribet Car Dealership", + "id": 44, + "lat": 37.2327, + "long": -79.9463, + "short_name": "Veribet", + "st": "VA", + "state": "Virginia", + "zip": "24014" + }, + "id": "9c3725831f60fdec5f0c0b478181704c", + "key": "9c3725831f60fdec5f0c0b478181704c", + "value": { + "rev": "1-2acfaaf786b749f0c71351f6468dfbaa" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781817c5c", + "_rev": "1-759fc681fcdf10e034bbf8accd3acb00", + "address": "283 Mockingbird Plaza", + "city": "Norfolk", + "full_name": "Konklux Car Dealership", + "id": 45, + "lat": 36.8787, + "long": -76.2604, + "short_name": "Konklux", + "st": "VA", + "state": "Virginia", + "zip": "23509" + }, + "id": "9c3725831f60fdec5f0c0b4781817c5c", + "key": "9c3725831f60fdec5f0c0b4781817c5c", + "value": { + "rev": "1-759fc681fcdf10e034bbf8accd3acb00" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781818842", + "_rev": "1-76c2eb4c28da3ba6cd385dfb820ed4d0", + "address": "527 Hayes Junction", + "city": "New Orleans", + "full_name": "Regrant Car Dealership", + "id": 46, + "lat": 30.033, + "long": -89.8826, + "short_name": "Regrant", + "st": "LA", + "state": "Louisiana", + "zip": "70165" + }, + "id": "9c3725831f60fdec5f0c0b4781818842", + "key": "9c3725831f60fdec5f0c0b4781818842", + "value": { + "rev": "1-76c2eb4c28da3ba6cd385dfb820ed4d0" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781818f7b", + "_rev": "1-83ab719b3f039b858e9e7c9c9462748d", + "address": "840 Pepper Wood Crossing", + "city": "Stamford", + "full_name": "Prodder Car Dealership", + "id": 47, + "lat": 41.0888, + "long": -73.5435, + "short_name": "Prodder", + "st": "CT", + "state": "Connecticut", + "zip": "06905" + }, + "id": "9c3725831f60fdec5f0c0b4781818f7b", + "key": "9c3725831f60fdec5f0c0b4781818f7b", + "value": { + "rev": "1-83ab719b3f039b858e9e7c9c9462748d" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b47818196c9", + "_rev": "1-0d5f62c07f25299a7d95b6422f193c63", + "address": "48610 Morning Street", + "city": "Tucson", + "full_name": "It Car Dealership", + "id": 48, + "lat": 32.2138, + "long": -110.824, + "short_name": "It", + "st": "AZ", + "state": "Arizona", + "zip": "85710" + }, + "id": "9c3725831f60fdec5f0c0b47818196c9", + "key": "9c3725831f60fdec5f0c0b47818196c9", + "value": { + "rev": "1-0d5f62c07f25299a7d95b6422f193c63" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781819794", + "_rev": "1-b07c086e72acf42643a1a478e2a07feb", + "address": "222 Grasskamp Plaza", + "city": "Athens", + "full_name": "Veribet Car Dealership", + "id": 49, + "lat": 33.9321, + "long": -83.3525, + "short_name": "Veribet", + "st": "GA", + "state": "Georgia", + "zip": "30605" + }, + "id": "9c3725831f60fdec5f0c0b4781819794", + "key": "9c3725831f60fdec5f0c0b4781819794", + "value": { + "rev": "1-b07c086e72acf42643a1a478e2a07feb" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b47818199da", + "_rev": "1-eba2086b344cc60c0a4dd407a6ced307", + "address": "76 Clove Trail", + "city": "Atlanta", + "full_name": "Aerified Car Dealership", + "id": 50, + "lat": 33.7217, + "long": -84.3339, + "short_name": "Aerified", + "st": "GA", + "state": "Georgia", + "zip": "30316" + }, + "id": "9c3725831f60fdec5f0c0b47818199da", + "key": "9c3725831f60fdec5f0c0b47818199da", + "value": { + "rev": "1-eba2086b344cc60c0a4dd407a6ced307" + } + } + ], + "reviews": [ + { + "doc": { + "_id": "310b6145c664ca5c3770ef71485fb8df", + "_rev": "1-6d3a316e140863cdb147048888d26051", + "car_make": "Audi", + "car_model": "A6", + "car_year": 2010, + "dealership": 15, + "id": 1, + "name": "Berkly Shepley", + "purchase": true, + "purchase_date": "07/11/2020", + "review": "Total grid-enabled service-desk" + }, + "id": "310b6145c664ca5c3770ef71485fb8df", + "key": "310b6145c664ca5c3770ef71485fb8df", + "value": { + "rev": "1-6d3a316e140863cdb147048888d26051" + } + }, + { + "doc": { + "_id": "310b6145c664ca5c3770ef71485fc075", + "_rev": "1-0cbc084ce570374a1d0c2653ceb254ad", + "car_make": "Pontiac", + "car_model": "Firebird", + "car_year": 1995, + "dealership": 23, + "id": 2, + "name": "Gwenora Zettoi", + "purchase": true, + "purchase_date": "09/17/2020", + "review": "Future-proofed foreground capability" + }, + "id": "310b6145c664ca5c3770ef71485fc075", + "key": "310b6145c664ca5c3770ef71485fc075", + "value": { + "rev": "1-0cbc084ce570374a1d0c2653ceb254ad" + } + }, + { + "doc": { + "_id": "310b6145c664ca5c3770ef71485fc173", + "_rev": "1-278e31d48be2f5abc7c9b542cff00208", + "car_make": "Mazda", + "car_model": "MX-5", + "car_year": 2003, + "dealership": 29, + "id": 3, + "name": "Lion Reames", + "purchase": true, + "purchase_date": "10/20/2020", + "review": "Expanded global groupware" + }, + "id": "310b6145c664ca5c3770ef71485fc173", + "key": "310b6145c664ca5c3770ef71485fc173", + "value": { + "rev": "1-278e31d48be2f5abc7c9b542cff00208" + } + }, + { + "doc": { + "_id": "310b6145c664ca5c3770ef71485fcad6", + "_rev": "1-1677bbc642e9673d151d56614ad81963", + "dealership": 13, + "id": 4, + "name": "Iorgos Colley", + "purchase": false, + "review": "Optional heuristic software" + }, + "id": "310b6145c664ca5c3770ef71485fcad6", + "key": "310b6145c664ca5c3770ef71485fcad6", + "value": { + "rev": "1-1677bbc642e9673d151d56614ad81963" + } + }, + { + "doc": { + "_id": "310b6145c664ca5c3770ef71485fccf9", + "_rev": "1-7e446087190b20656bad81aeab9242b5", + "dealership": 46, + "id": 5, + "name": "Kissee Noirel", + "purchase": false, + "review": "Diverse client-server success" + }, + "id": "310b6145c664ca5c3770ef71485fccf9", + "key": "310b6145c664ca5c3770ef71485fccf9", + "value": { + "rev": "1-7e446087190b20656bad81aeab9242b5" + } + }, + { + "doc": { + "_id": "52844e3d638580a4eeee1d72fbec17f6", + "_rev": "1-3072ebde1a82289cf9619f69e3db0e0f", + "review": { + "another": "field", + "car_make": "Audi", + "car_model": "Car", + "car_year": 2021, + "dealership": 15, + "id": 1114, + "name": "Upkar Lidder", + "purchase": false, + "purchase_date": "02/16/2021", + "review": "Great service!" + } + }, + "id": "52844e3d638580a4eeee1d72fbec17f6", + "key": "52844e3d638580a4eeee1d72fbec17f6", + "value": { + "rev": "1-3072ebde1a82289cf9619f69e3db0e0f" + } + } + ] + } + } \ No newline at end of file diff --git a/server/db.sqlite3 b/server/db.sqlite3 index 27476cd7dc49a215a2e633b24a2d9368f72d5cd8..4c26e218216a08713d8fad907a4c9aa1c7fba8e1 100644 GIT binary patch delta 4724 zcma)A3v64}8NSE&`f+35dy*!u+c=INNg7P*#P{J>fPtH)O|rb2N86MYb7MP+6Tjj| zUQ=b#ZJM;gC|r$Blg48RO-P$G79bi!DxeLJHt`yuX>?mxq*a57(M_V7259F#9NQ^- zSjqMIzw@8}eE)yWfBtiQ&pn2FE*s8U8(0j(+R%UbbK3(4Ilw-3_ao3?r4ZO?Y!>zP z9U5cv7E}M%x_Z7*i`hHEu|*+0pAoWI@iDu(!RKI^Ue4d^^>wo$#v2TYsF>3y|pM83UDD_e7Ci?niv-du{jj?_{7@**tm;rhK{0r=dId~DCgTI46gq|&@!wiS^ zns5f}tZO7HdWFC=ZW*&#%!z|>D+7=w=fcT=Rv1Fh~+-VSsg@wp` zE>q0Hw=s&8#bQ2gHsU?I<`S0T8my7PyMU~ejptH{d_Iv$JJ2rFkuj(S+F|OEOn&BVl&RVuc2=hp^ay9025hJYC4G<9i9at>Q*GVwxtxZmq;df{}Al zGC7Rx82kf#7Jj=IE}}JPrvFC2NT~K1>Ic*sb&B#+drW^fy=!{f^q{F= z8Z_-QUNt^v{H`%;95A+{JiJtAa5=OX=(Zh95ii7d`V~>p*sEwn7tldb(NIKLquGo!Y#llw7TYm^+HzlO z(-7)(y0!B3@|x_-FH0_T3?cWmDuEphm4TwON6`^CMs4~A)V6nO#fL{N`g+vv;t28i z(KbCq?VbQ3{&}=hPpj>wvCbX}wcQLMk*n+hiGxJ3f^?XWUMGW#i7~suZA3zs4;Swr zYcsg(RN-f1ZKXC62^~GSWUjn>%EplFkhfEZLAIrleJ*dN9k&tSkQ36amkn!F*Q*s( z?<=Z0MYW`^Lba~C5<9wWTA89oqFAjb`Maa!BD5IU(X+!4?dw{C2snU_EYi(Y(GyCF zS~WdMQ6no>aZ}AzQ$vsgAiXwEnV71y!wbn$);p*(82lJsg0G_ddK}&dS78*6!(P}9 z>u;j}MZZt~ihhQEf_{)L(P=t@GVT_-i#AiAQtwm0rk0<-~x#8pLXdkNqHdL?9;bO9}OVLcmf*+&2d=*v;6 zbXet%lD-_4N>8(y09`;Y$DxAmhXk;LN}leM8B}McML|@9Qu^+t319;|nP;vifD=^Z zTGO5q0XjfUb~WyiA=QeUV0+}LwGts&ZjcEQva6L8skacI2N0^K6&xzKYOsRSQd~=5 zSL#uX1n2~~Y`dI6CV4(wwOmGx3aZ*IqjfUu>*Kn8et#(Fmuqe< z3DnKA-9DZV@GMGx64StsFnAq)wAFCW6=*QvW*{-&`lLkH>j3>8M!$z5_$FOC>jK)5 zuT6$$mw7%BT=z2@tG+p3EVY_lTuvnl%ZW8+IlCSxcE^X-jxUbn$L1Hq(}(6fNg*^g z-M7vbCL=M=F>ZA3#OOr$Sn5bJG7wG92m`Yt8{_FyQ$s}|n4D!MPmIsx`J)?SNp8?H zIWV)#5j~$umWpd-wD+9d? zv!0RVsY8*`wW4p@BP52GeTNs;vc+hAawQVtBJ0B&tKqT9b?^Loe>tXXNV>mQFS~T0 z0(c2Se|0FNZ@~68e1!a8LHp@X2nX(f{i6O2rXFTs0-eC8;R$#Qei`07!c?Fr&L#_Qzm zhJNF%_^aTR?E`m!$H4a0Mew@jsW%U5wqH5|d_aSZi~rOQZ)elsJlK9`5KMu_y%whv zY%Udq*<@V3onCk*1)jg~r8|JQeQp@6G%|Hpu?8%Q)!j-yY52WikM09BVM=oyKZn1d z`2~1Q^Gy)Ivh*)$Ckm7FS$N<9|BQ~)$-?GgR&VL)0cQj99JP03l-4%@&c2EM@KnEJ zDtu_T-{HEUUksc2Ef2)Rd^DHHN>^Q%V@1fJ6C`&NdIxYjM#rWcqtnB~?(Kiv z4W={~W}?8i{X!IU>In?Pd$&Ja1b)1<>E!j683t_jC(^O_TJ22IWnZrRh+`xXi}+__ zevVg;sTN*eE zO;+iYdvQroR*{Z+13Znv58!X$3-Cwq`|y7BhISeyO+U0W8VJm0Rqqpd_1mhy@Yw61 zrKBS;vsv26QemgGNU}(hQlJSWIwi4EUK?-%v)F3hW6T-?v)gvUS}t!*0KwK8SglGp z{U;2*49}sjEtlghy0qDe*I{r!c@{YoW~VainSyZVS6!%@#bd5s$5+psIq0YoU1=c| zN4OMSI~V zW4n0n9?AuJy-YXH1%rW55GX@Y>8%~=RD3*LJ1hD@gk!onZy>;gp1lkRREgjf3|>Jy z;J5H*8y+Uh`ZpfHa_xtx_Fsk wGRdTXx>%1F^#;*krKS75!e$18d8ZvbyArvLx| delta 4487 zcmcInTWlj&8TNR_cD%8Da@jOXv)&||q}grO$;^1Jp$l~!uN~iFCyt#&6tD01+xTuI zyxnCH+O447p^a1t+Dd)k(ucMI<)KBCB0wt8EvO(sZCQ9J6hSLhYSo7dW+qNz?^cu- zY&rS<@67qc_7Gqp4RW7Fr`4d_-JlQ9a39e8rib+;WX0;sS z1Z!A(3?AQ~B{Ik;3>zW-Cz@fCa##)<`l9JjK2Zot>Vw%rVg!O0pbnW!CAd&UxJ!BH znBYnYuFJr`z%Rj{z>mO_;JToy4)`yA{&-t?5}BETB87Yu^4*jSs+V`}tYM<3!)%vtknh!LuYo5`3MRQRo^)s5j(9mF+@l&6F!osm|E}X+)ldgdIPX;r3V4oG z@LuQi%z%K$XOUVeRu77+G>7sNqA?*F6F?Z9nnU=F+)fu7A)pI1j;hs{R zk?-S60zM51cxHkBzFW_TWpY9{E(7lhMe;KtSKk6xK@J3f6%b$&3;;;?uI^3UuXTI6 zZ|kn=^13hRtU6pbE~M#gZF>lTW+0`sdDC;}}&@{X?~UbWA693Js)r4(4XxXvS1F@&gRA<6Z@ZbXhF>N%+6 z_ke^Yvg7oCln)^48DT3&#iQkLCnMSk83^j0)c!>PN1xqu6AJCXgP%jRvIozb`o>3% zeQMJPe=|SQww4k?XA(@Rq{|dubcKZZA2{ZUZx81uqSexVq8#+&l3b?#L;vinU5A? z#`RpPk~}cF^rHA&*ILDy*gT73G>Y%*mEWm1Y>VeNJn?WWnXpChJi}qdm2z>KEkv1( zsHsxeM(r6aUAM)J7IPe%TPRSgH05g&%PeONc^W=DahqNvzDUsXjM0d*Y)2yAtrzdn zJJzLFNDofVV-zYZRn*G|3p4E`=f|U_aEv7bHO}TJZsfg9cYM0w%GmIVmyC1XjSW|P z+h&~GUN+O4HfJTBD$tH>&0gHJ7o%3(bele*@gdN8nqWzSm7X=d1%i=_BsEWw6i#Ep zsiu`7;HC`R1RsKTz?;I8@5f+PD?C_5eNx#V8dwh&m*RQf}d`I$Xd5bAx#9|1(nQEtjt7`h4QKNP+nTSu?PqP4W+a_S#Ohf) zYOSo~P3H9|o66IUrHrZMqkKylblpojy_=z2G-X{fms{0VYblB+-3`kk#;vAmTZ>dF zW(XQDY!<5Cm?Ii2IqDX=RE)Hmk(I50r@eu1uN&E@XDv}Ix(WR* zRG^#HOr=1_!dx*EDrJnJDvG7*bb^bAazqLHq%aw{oZS&ClL>A!TCrKos~5~sf5VO0 zi%Y(?w^q!OIU+?k(}Aid!Zx;T7XMndVW<#3v{^+>L6;BDnb+Lm?YzxyVlU)5pVPqj z$hfZ-tr4q^T8zN917(NRV6-RdajQ2J%hWdf9;}r0dJ{{yHS7199Ja#RvbP?}B3Rex@vBFr8pJriz$rFtT9~BOXLc+Mq=4RlrxFV&0soEH&-&X+^Wsq@;Nak zvz+M-Q)i12sL+jHJ}sBR#O0W9v6eJ83lTh94@byyyc#Pc8Z1|*%f*`UFih>Pa{6y^ z`hSI~{XfQOKTP@1B3ESNE9Ml}azrCdE*r86&1TM zP<)=nD2y>)o`i%jc};~%yP7F9D;X}uRI0`h87@U*u>?t_BXy1_mOF8>SXS#PlXoo^ zG~-E=H~(3kO-6b~gNt&5dHD$}}2Vd4Ir{#H4D< zI15Wc9$EJWUUAk|H&{ow(9Umev*GoYr)i+2T}S$BbSARwi}>`L5rf5_{3#8h875atzxz`Nx zy_YXQBqWD!?S7;(z+xnRGdej5J($^nBG6~}mHzK2)ne0fdFTB7&^Pz4JE7XJ0k+D9 zW$(*CT36KmQ1iEAZy&o){oTGd`-YV72zSlNci}DgCHW=jn%pdVpT`CsVz00U)#%x? z&{qwWP&gaQ3vUj=!xy(+OJ!cOn0%HApJ~Zynb@O4kWW4Ye_b}@or7elymCP)>XGeS zk3ggdam)D5BN0ds#FjI7h3MR9YVV~8G^;|ce0fZ@_m4D0!8^aQL3i)u9Z=uSD-LLW z?}82b1_T}3g>L*$c;0bU|D1#bk4=WLweyr1FmplK*6o_nQ zs;fQjeg)JZh-_p;T%D*$3k%k$Xi3fNkX$e)Mf0fX9E1?rsQ!*uK-qw>x?S}x`M_TP zE$Ablfx*)<@K^9t@HDt8h^vAxoq|nJZ(Vm%4o@ F{0GR+{{R30 diff --git a/server/djangoapp/admin.py b/server/djangoapp/admin.py index b1039e16b8..47861345a7 100644 --- a/server/djangoapp/admin.py +++ b/server/djangoapp/admin.py @@ -1,13 +1,21 @@ from django.contrib import admin -# from .models import related models +from .models import CarMake,CarModel -# Register your models here. - # CarModelInline class +class CarModelInline(admin.StackedInline): + model = CarModel + extra = 3 # how many rows to show + # CarModelAdmin class +class CarModelAdmin(admin.ModelAdmin): + list_display = ('carmake', 'dealerId', 'type', 'year') # fields to display in list view + search_fields = ['type'] # fields to search in search box # CarMakeAdmin class with CarModelInline - +class CarMakeAdmin(admin.ModelAdmin): + inlines = [CarModelInline] # Register models here +admin.site.register(CarModel, CarModelAdmin) +admin.site.register(CarMake, CarMakeAdmin) diff --git a/server/djangoapp/models.py b/server/djangoapp/models.py index 27d96f4eff..6e059d5ee6 100644 --- a/server/djangoapp/models.py +++ b/server/djangoapp/models.py @@ -10,6 +10,23 @@ # - Any other fields you would like to include in car make model # - __str__ method to print a car make object +class CarMake(models.Model): + name=models.CharField(max_length=200) + description=models.CharField(max_length=200) + + + def __str__(self): + return str(self.name) + +class CarModel(models.Model): + carmake=models.ForeignKey(CarMake,on_delete=models.CASCADE) + dealerId=models.IntegerField() + type=models.CharField(max_length=200) + year=models.DateField() + def __str__(self): + return str(self.carmake) + + # Create a Car Model model `class CarModel(models.Model):`: # - Many-To-One relationship to Car Make model (One Car Make has many Car Models, using ForeignKey field) diff --git a/server/djangobackend/settings.py b/server/djangobackend/settings.py index 7077d6c918..3d4401f713 100644 --- a/server/djangobackend/settings.py +++ b/server/djangobackend/settings.py @@ -127,7 +127,7 @@ # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/3.1/howto/static-files/ -LOGOUT_REDIRECT_URL = '/your_desired_path/' +LOGOUT_REDIRECT_URL = '/admin/' STATIC_URL = '/static/' From 717cc1e13bc5686fe70ce28be7b05c0a559b06d8 Mon Sep 17 00:00:00 2001 From: DevPS-513 Date: Mon, 15 Jan 2024 18:41:38 -0500 Subject: [PATCH 11/21] added functionality to be able to query any parameter, tested state and id with postman --- functions/sample/nodejs/index-promise.js | 27 ++++++++++---- server/djangoapp/models.py | 19 ++++++++++ server/djangoapp/restapis.py | 37 +++++++++++++++++++ .../templates/djangoapp/dealershiplist.html | 12 ++++++ server/djangoapp/urls.py | 2 +- server/djangoapp/views.py | 8 +++- 6 files changed, 96 insertions(+), 9 deletions(-) create mode 100644 server/djangoapp/templates/djangoapp/dealershiplist.html diff --git a/functions/sample/nodejs/index-promise.js b/functions/sample/nodejs/index-promise.js index 65fe0f9cfb..a939b04b78 100644 --- a/functions/sample/nodejs/index-promise.js +++ b/functions/sample/nodejs/index-promise.js @@ -3,7 +3,7 @@ */ const express = require('express'); const app=express() -const PORT = 8080; +const PORT = 5000; const bodyParser = require('body-parser'); const { CloudantV1 } = require('@ibm-cloud/cloudant'); @@ -100,17 +100,30 @@ function getDbs(cloudant) { app.get('/api/dealership',(req,res)=> { - let state = req.query.state; - if(state){ - state=state.replace(/"/g,''); - state=state.replace(/`/g,''); + let filterProperty; + let filterValue; + + for (let prop in req.query) { + filterProperty = prop; + filterValue = req.query[prop]; + } + + + if(filterValue){ + filterValue=filterValue.replace(/"/g,''); + filterValue=filterValue.replace(/`/g,''); } + if(filterProperty){ + filterProperty=filterProperty.replace(/"/g,''); + filterProperty=filterProperty.replace(/`/g,''); + } + get_dealerships(params) .then(result => { - if (state) { + if (filterProperty && filterValue ) { - let filteredResult = result.result.filter(dealership=> dealership.doc.state === state); + let filteredResult = result.result.filter(dealership=> dealership.doc[filterProperty] == filterValue); res.status(200).send(filteredResult); } else { res.status(200).send(result); diff --git a/server/djangoapp/models.py b/server/djangoapp/models.py index 6e059d5ee6..8a5087e900 100644 --- a/server/djangoapp/models.py +++ b/server/djangoapp/models.py @@ -39,6 +39,25 @@ def __str__(self): # Create a plain Python class `CarDealer` to hold dealer data + +class CarDealer: + + def __init__(self,address,city, + full_name,id,lat,long, + short_name,st,zip): + self.address=address + self.city=city + self.full_name=full_name + self.id=id + self.lat=lat + self.long=long + self.short_name=short_name + self.st=st + self.zip=zip + + def __str__(self): + return "Dealer name: " + self.full_name + # Create a plain Python class `DealerReview` to hold review data diff --git a/server/djangoapp/restapis.py b/server/djangoapp/restapis.py index b4d13f596a..1e85ff96ca 100644 --- a/server/djangoapp/restapis.py +++ b/server/djangoapp/restapis.py @@ -2,12 +2,32 @@ import json # import related models here from requests.auth import HTTPBasicAuth +from .models import CarDealer +# im using the index-promise.js from previous +# lab since the functions option does not exist anymore in IBM cloud +# +#url="http://localhost:5000" # Create a `get_request` to make HTTP GET requests # e.g., response = requests.get(url, params=params, headers={'Content-Type': 'application/json'}, # auth=HTTPBasicAuth('apikey', api_key)) +def get_request(url,**kwargs): + + print(kwargs) + print(f'GET from{url}') + + try: + response = requests.get(url, headers={'Content-Type': 'application/json'}, + params=kwargs) + except: + print("could not connect") + + status_code=response.status_code + print(f'With status {status_code} ') + print('received as text'+response.text) + return response.text # Create a `post_request` to make HTTP POST requests # e.g., response = requests.post(url, params=kwargs, json=payload) @@ -18,6 +38,23 @@ # - Call get_request() with specified arguments # - Parse JSON results into a CarDealer object list +def get_dealers_from_cf(url, **kwargs): + + results=[] + json_result=get_request(url) + + if json_result: + dealers = json_result["rows"] + for dealer in dealers: + dealer_doc=dealer["doc"] + + dealer_obj = CarDealer(address=dealer_doc["address"], city=dealer_doc["city"], full_name=dealer_doc["full_name"], + id=dealer_doc["id"], lat=dealer_doc["lat"], long=dealer_doc["long"], + short_name=dealer_doc["short_name"], + st=dealer_doc["st"], zip=dealer_doc["zip"]) + results.append(dealer_obj) + return results + # Create a get_dealer_reviews_from_cf method to get reviews by dealer id from a cloud function # def get_dealer_by_id_from_cf(url, dealerId): diff --git a/server/djangoapp/templates/djangoapp/dealershiplist.html b/server/djangoapp/templates/djangoapp/dealershiplist.html new file mode 100644 index 0000000000..7168f617e2 --- /dev/null +++ b/server/djangoapp/templates/djangoapp/dealershiplist.html @@ -0,0 +1,12 @@ +{% extends 'djangoapp/base.html' %} + +{%block title %} Dealership List {% endblock %} + +{% load static %} + +{% block content %} +

List of Dealerships received is:

+

+

{{ dealerships }}

+ +{% endblock %} \ No newline at end of file diff --git a/server/djangoapp/urls.py b/server/djangoapp/urls.py index d6b21532cc..5d359c2d3b 100644 --- a/server/djangoapp/urls.py +++ b/server/djangoapp/urls.py @@ -26,7 +26,7 @@ # path for logout path('logout/', views.logout_view, name='logout'), - # path(route='/', view=views.get_dealerships, name='home'), + path(route='get_dealerships/', view=views.get_dealerships, name='get_dealerships'), # path for dealer reviews view diff --git a/server/djangoapp/views.py b/server/djangoapp/views.py index a91e0f08b1..d37e72658c 100644 --- a/server/djangoapp/views.py +++ b/server/djangoapp/views.py @@ -11,6 +11,8 @@ import json from .forms import RegisterForm +from .restapis import get_request,get_dealers_from_cf + # Get an instance of a logger logger = logging.getLogger(__name__) @@ -63,7 +65,11 @@ def register(request): def get_dealerships(request): context = {} if request.method == "GET": - return render(request, 'djangoapp/index.html', context) + + dealerships=get_request("http://127.0.0.1:5000/api/dealership",state="Texas") + + + return render(request, 'djangoapp/dealershiplist.html', {"dealerships": dealerships}) # Create a `get_dealer_details` view to render the reviews of a dealer From 7145891e08d11ec214ca7a48fd487d9c18b2797d Mon Sep 17 00:00:00 2001 From: DevPS-513 Date: Tue, 16 Jan 2024 09:35:16 -0500 Subject: [PATCH 12/21] changed server function to accept generalized query parameters, a few tests run in post man with requests like http://127.0.0.1:5000/api/review?id=3 --- functions/sample/nodejs/index-promise.js | 31 ++++++++++++++++++------ server/djangoapp/models.py | 18 ++++++++++++++ server/djangoapp/restapis.py | 19 ++++++++++----- server/djangoapp/views.py | 8 ++++-- 4 files changed, 60 insertions(+), 16 deletions(-) diff --git a/functions/sample/nodejs/index-promise.js b/functions/sample/nodejs/index-promise.js index a939b04b78..3359646bfc 100644 --- a/functions/sample/nodejs/index-promise.js +++ b/functions/sample/nodejs/index-promise.js @@ -135,18 +135,33 @@ function getDbs(cloudant) { app.get('/api/review',(req,res)=> { - let dealerID = req.query.dealerID; - if(dealerID){ - dealerID=dealerID.replace(/"/g,''); - dealerID=dealerID.replace(/`/g,''); + let filterProperty; + let filterValue; + + for (let prop in req.query) { + filterProperty = prop; + filterValue = req.query[prop]; + } + + + if(filterValue){ + filterValue=filterValue.replace(/"/g,''); + filterValue=filterValue.replace(/`/g,''); + } + + if(filterProperty){ + filterProperty=filterProperty.replace(/"/g,''); + filterProperty=filterProperty.replace(/`/g,''); } + console.log(filterProperty) + console.log(filterValue) + get_reviews(params) .then(result => { - if (dealerID) { - - let filteredResult = result.result.filter(review=> Number(review.doc.id) === Number(dealerID)); - console.log(filteredResult) + if (filterProperty && filterValue ) { + console.log(result.result) + let filteredResult = result.result.filter(review=> review.doc[filterProperty] == filterValue); res.status(200).send(filteredResult); } else { res.status(200).send(result); diff --git a/server/djangoapp/models.py b/server/djangoapp/models.py index 8a5087e900..d98f6a9d1e 100644 --- a/server/djangoapp/models.py +++ b/server/djangoapp/models.py @@ -61,3 +61,21 @@ def __str__(self): # Create a plain Python class `DealerReview` to hold review data + +class DealerReview: + + def __init__(self,dealership,name, + purchase,review,purchase_date,car_make, + car_model,car_year,sentiment,id): + self.dealership=dealership + self.name=name + self.purchase=purchase + self.review=review + self.purchase_date=purchase_date + self.car_make=car_make + self.car_model=car_model + self.car_year=car_year + self.sentiment=sentiment + self.id=id + + diff --git a/server/djangoapp/restapis.py b/server/djangoapp/restapis.py index 1e85ff96ca..30d7aac6f3 100644 --- a/server/djangoapp/restapis.py +++ b/server/djangoapp/restapis.py @@ -15,8 +15,7 @@ def get_request(url,**kwargs): - print(kwargs) - print(f'GET from{url}') + print(f'calling restapis.get_request({url})','with args',kwargs) try: response = requests.get(url, headers={'Content-Type': 'application/json'}, @@ -25,10 +24,12 @@ def get_request(url,**kwargs): print("could not connect") status_code=response.status_code - print(f'With status {status_code} ') + print(f'With status {status_code}') print('received as text'+response.text) return response.text + + # Create a `post_request` to make HTTP POST requests # e.g., response = requests.post(url, params=kwargs, json=payload) @@ -41,11 +42,17 @@ def get_request(url,**kwargs): def get_dealers_from_cf(url, **kwargs): results=[] - json_result=get_request(url) + json_result=json.loads(get_request(url)) + print("\n") + print("json result is ",type(json_result),"\n") + print("json_result looks like",json_result,"\n") + print("json_keys look like",json_result.keys(),"\n") if json_result: - dealers = json_result["rows"] - for dealer in dealers: + #dealers = json_result["rows"] + for dealer in json_result['result']: + print("dealer is type",type(dealer),"\n") + print('and looks like\n',dealer) dealer_doc=dealer["doc"] dealer_obj = CarDealer(address=dealer_doc["address"], city=dealer_doc["city"], full_name=dealer_doc["full_name"], diff --git a/server/djangoapp/views.py b/server/djangoapp/views.py index d37e72658c..05208543b3 100644 --- a/server/djangoapp/views.py +++ b/server/djangoapp/views.py @@ -66,16 +66,20 @@ def get_dealerships(request): context = {} if request.method == "GET": - dealerships=get_request("http://127.0.0.1:5000/api/dealership",state="Texas") + #dealerships=get_request("http://127.0.0.1:5000/api/dealership",id=1) + dealerships=get_dealers_from_cf("http://127.0.0.1:5000/api/dealership",id=1) + dealer_names = '\n '.join([dealer.short_name for dealer in dealerships]) - return render(request, 'djangoapp/dealershiplist.html', {"dealerships": dealerships}) + return render(request, 'djangoapp/dealershiplist.html', {"dealerships": dealer_names}) # Create a `get_dealer_details` view to render the reviews of a dealer # def get_dealer_details(request, dealer_id): # ... + + # Create a `add_review` view to submit a review # def add_review(request, dealer_id): # ... From 43104c52cff44e722ae406acd6e7c9cdae7f9c37 Mon Sep 17 00:00:00 2001 From: DevPS-513 Date: Tue, 16 Jan 2024 11:44:16 -0500 Subject: [PATCH 13/21] added functionality to get dealer details and review by dealer id --- server/djangoapp/models.py | 28 ++++++++-- server/djangoapp/restapis.py | 53 +++++++++++++++---- .../djangoapp/templates/djangoapp/base.html | 6 +++ .../templates/djangoapp/dealershiplist.html | 20 +++++-- .../templates/djangoapp/reviewlist.html | 24 +++++++++ server/djangoapp/urls.py | 3 +- server/djangoapp/views.py | 28 ++++++---- 7 files changed, 134 insertions(+), 28 deletions(-) create mode 100644 server/djangoapp/templates/djangoapp/reviewlist.html diff --git a/server/djangoapp/models.py b/server/djangoapp/models.py index d98f6a9d1e..587cdf9dd9 100644 --- a/server/djangoapp/models.py +++ b/server/djangoapp/models.py @@ -57,16 +57,26 @@ def __init__(self,address,city, def __str__(self): return "Dealer name: " + self.full_name + - + def get_fields(self): + return vars(self) # Create a plain Python class `DealerReview` to hold review data class DealerReview: - def __init__(self,dealership,name, - purchase,review,purchase_date,car_make, - car_model,car_year,sentiment,id): + def __init__(self=None, + dealership=None, + name=None, + purchase=None, + review=None, + purchase_date=None, + car_make=None, + car_model=None, + car_year=None, + sentiment=None, + id=None): self.dealership=dealership self.name=name self.purchase=purchase @@ -78,4 +88,12 @@ def __init__(self,dealership,name, self.sentiment=sentiment self.id=id - + def __str__(self): + return "Reviewer name: " + self.name + + + def get_fields(self): + return vars(self) + + + diff --git a/server/djangoapp/restapis.py b/server/djangoapp/restapis.py index 30d7aac6f3..3ca0842635 100644 --- a/server/djangoapp/restapis.py +++ b/server/djangoapp/restapis.py @@ -2,7 +2,7 @@ import json # import related models here from requests.auth import HTTPBasicAuth -from .models import CarDealer +from .models import CarDealer,DealerReview # im using the index-promise.js from previous # lab since the functions option does not exist anymore in IBM cloud @@ -42,17 +42,19 @@ def get_request(url,**kwargs): def get_dealers_from_cf(url, **kwargs): results=[] - json_result=json.loads(get_request(url)) - print("\n") - print("json result is ",type(json_result),"\n") - print("json_result looks like",json_result,"\n") - print("json_keys look like",json_result.keys(),"\n") + json_result=json.loads(get_request(url,**kwargs)) + + if isinstance(json_result,dict) and 'result' in json_result: + dealers=json_result['result'] + elif isinstance(json_result,list): + dealers=json_result + else: + print("unexpected format of json result") + return [] if json_result: #dealers = json_result["rows"] - for dealer in json_result['result']: - print("dealer is type",type(dealer),"\n") - print('and looks like\n',dealer) + for dealer in dealers: dealer_doc=dealer["doc"] dealer_obj = CarDealer(address=dealer_doc["address"], city=dealer_doc["city"], full_name=dealer_doc["full_name"], @@ -62,6 +64,39 @@ def get_dealers_from_cf(url, **kwargs): results.append(dealer_obj) return results +def get_dealer_reviews_from_cf(url, **kwargs): + + results=[] + json_result=json.loads(get_request(url,**kwargs)) + + if isinstance(json_result,dict) and 'result' in json_result: + dealers=json_result['result'] + elif isinstance(json_result,list): + dealers=json_result + else: + print("unexpected format of json result") + return [] + + if json_result: + #dealers = json_result["rows"] + for dealer in dealers: + print("\n") + print(dealer) + print("\n") + + dealer_obj=DealerReview() + + for var in dealer_obj.get_fields(): + + try: + setattr(dealer_obj,var,dealer["doc"][var]) + except: + setattr(dealer_obj,var,None) + + + results.append(dealer_obj) + return results + # Create a get_dealer_reviews_from_cf method to get reviews by dealer id from a cloud function # def get_dealer_by_id_from_cf(url, dealerId): diff --git a/server/djangoapp/templates/djangoapp/base.html b/server/djangoapp/templates/djangoapp/base.html index 1796929958..8ba6150dd1 100644 --- a/server/djangoapp/templates/djangoapp/base.html +++ b/server/djangoapp/templates/djangoapp/base.html @@ -29,6 +29,12 @@ + +
diff --git a/server/djangoapp/templates/djangoapp/dealershiplist.html b/server/djangoapp/templates/djangoapp/dealershiplist.html index 7168f617e2..6697d05f54 100644 --- a/server/djangoapp/templates/djangoapp/dealershiplist.html +++ b/server/djangoapp/templates/djangoapp/dealershiplist.html @@ -5,8 +5,20 @@ {% load static %} {% block content %} -

List of Dealerships received is:

-

-

{{ dealerships }}

- + + {% csrf_token %} +

Dealership List

+
+
+ +

+
    + {% for dealership in dealerships %} +
  • + {% for field_name, field_value in dealership.get_fields.items %} + {{ field_name }}: {{ field_value }}
    + {% endfor %} +
  • + {% endfor %} +
{% endblock %} \ No newline at end of file diff --git a/server/djangoapp/templates/djangoapp/reviewlist.html b/server/djangoapp/templates/djangoapp/reviewlist.html new file mode 100644 index 0000000000..6bab3f5b37 --- /dev/null +++ b/server/djangoapp/templates/djangoapp/reviewlist.html @@ -0,0 +1,24 @@ +{% extends 'djangoapp/base.html' %} + +{%block title %} Review List {% endblock %} + +{% load static %} + +{% block content %} +
+ {% csrf_token %} +

Review List



+
+
+ +

+
    + {% for review in reviews %} +
  • + {% for field_name, field_value in review.get_fields.items %} + {{ field_name }}: {{ field_value }}
    + {% endfor %} +
  • + {% endfor %} +
+{% endblock %} \ No newline at end of file diff --git a/server/djangoapp/urls.py b/server/djangoapp/urls.py index 5d359c2d3b..a766a2c651 100644 --- a/server/djangoapp/urls.py +++ b/server/djangoapp/urls.py @@ -26,7 +26,8 @@ # path for logout path('logout/', views.logout_view, name='logout'), - path(route='get_dealerships/', view=views.get_dealerships, name='get_dealerships'), + path(route='get_dealer_details/', view=views.get_dealer_details, name='get_dealer_details'), + path(route='get_reviews/', view=views.get_reviews, name='get_reviews'), # path for dealer reviews view diff --git a/server/djangoapp/views.py b/server/djangoapp/views.py index 05208543b3..55a522902f 100644 --- a/server/djangoapp/views.py +++ b/server/djangoapp/views.py @@ -11,7 +11,7 @@ import json from .forms import RegisterForm -from .restapis import get_request,get_dealers_from_cf +from .restapis import get_request,get_dealers_from_cf,get_dealer_reviews_from_cf # Get an instance of a logger @@ -62,22 +62,32 @@ def register(request): # Update the `get_dealerships` view to render the index page with a list of dealerships -def get_dealerships(request): +def get_dealer_details(request): context = {} - if request.method == "GET": - #dealerships=get_request("http://127.0.0.1:5000/api/dealership",id=1) - dealerships=get_dealers_from_cf("http://127.0.0.1:5000/api/dealership",id=1) - - dealer_names = '\n '.join([dealer.short_name for dealer in dealerships]) - - return render(request, 'djangoapp/dealershiplist.html', {"dealerships": dealer_names}) + if request.method == "POST": + id = request.POST.get('id') + dealerships = get_dealers_from_cf("http://127.0.0.1:5000/api/dealership", id=id) + else: + dealerships = [] + return render(request, 'djangoapp/dealershiplist.html', {"dealerships": dealerships}) # Create a `get_dealer_details` view to render the reviews of a dealer # def get_dealer_details(request, dealer_id): # ... +def get_reviews(request): + context = {} + if request.method == "POST": + id = request.POST.get('id') + reviews = get_dealer_reviews_from_cf("http://127.0.0.1:5000/api/review", id=id) + else: + reviews = [] + return render(request, 'djangoapp/reviewlist.html', {"reviews": reviews}) + + + # Create a `add_review` view to submit a review From f7cc88ae9950aa3a1ecd139a7b3bab091d889e3a Mon Sep 17 00:00:00 2001 From: DevPS-513 Date: Tue, 16 Jan 2024 12:33:53 -0500 Subject: [PATCH 14/21] removed API key from being hardcoded into the server, generated a new key for security purposes --- .gitignore | 1 + functions/sample/nodejs/index-promise.js | 7 ++----- server/djangoapp/models.py | 3 +-- server/djangoapp/restapis.py | 10 +--------- 4 files changed, 5 insertions(+), 16 deletions(-) diff --git a/.gitignore b/.gitignore index a5e81fae11..35cfc8e0a4 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,7 @@ parts/ sdist/ var/ wheels/ +ignorefiles/ pip-wheel-metadata/ share/python-wheels/ *.egg-info/ diff --git a/functions/sample/nodejs/index-promise.js b/functions/sample/nodejs/index-promise.js index 3359646bfc..ac31f3fffe 100644 --- a/functions/sample/nodejs/index-promise.js +++ b/functions/sample/nodejs/index-promise.js @@ -9,11 +9,8 @@ const bodyParser = require('body-parser'); const { CloudantV1 } = require('@ibm-cloud/cloudant'); const { IamAuthenticator } = require('ibm-cloud-sdk-core'); -const params={ - COUCH_URL: "https://72144af7-975a-4c8a-b653-48177d4a207d-bluemix.cloudantnosqldb.appdomain.cloud/" , - IAM_API_KEY: "ySahisbUPABXdqzJc77nAytbcIFLdzMAiLeGuTPRWw5l", - COUCH_USERNAME: "72144af7-975a-4c8a-b653-48177d4a207d-bluemix", -} + +const params = require("C:\\localkeys\\IBM_Cloud_Key.json"); function get_dealerships(params) { diff --git a/server/djangoapp/models.py b/server/djangoapp/models.py index 587cdf9dd9..ef9690a6bc 100644 --- a/server/djangoapp/models.py +++ b/server/djangoapp/models.py @@ -56,8 +56,7 @@ def __init__(self,address,city, self.zip=zip def __str__(self): - return "Dealer name: " + self.full_name - + return "Dealer name: " + self.full_name def get_fields(self): return vars(self) diff --git a/server/djangoapp/restapis.py b/server/djangoapp/restapis.py index 3ca0842635..1db9d78f0c 100644 --- a/server/djangoapp/restapis.py +++ b/server/djangoapp/restapis.py @@ -7,7 +7,6 @@ # im using the index-promise.js from previous # lab since the functions option does not exist anymore in IBM cloud # - #url="http://localhost:5000" # Create a `get_request` to make HTTP GET requests # e.g., response = requests.get(url, params=params, headers={'Content-Type': 'application/json'}, @@ -23,9 +22,6 @@ def get_request(url,**kwargs): except: print("could not connect") - status_code=response.status_code - print(f'With status {status_code}') - print('received as text'+response.text) return response.text @@ -53,7 +49,6 @@ def get_dealers_from_cf(url, **kwargs): return [] if json_result: - #dealers = json_result["rows"] for dealer in dealers: dealer_doc=dealer["doc"] @@ -61,6 +56,7 @@ def get_dealers_from_cf(url, **kwargs): id=dealer_doc["id"], lat=dealer_doc["lat"], long=dealer_doc["long"], short_name=dealer_doc["short_name"], st=dealer_doc["st"], zip=dealer_doc["zip"]) + results.append(dealer_obj) return results @@ -80,9 +76,6 @@ def get_dealer_reviews_from_cf(url, **kwargs): if json_result: #dealers = json_result["rows"] for dealer in dealers: - print("\n") - print(dealer) - print("\n") dealer_obj=DealerReview() @@ -92,7 +85,6 @@ def get_dealer_reviews_from_cf(url, **kwargs): setattr(dealer_obj,var,dealer["doc"][var]) except: setattr(dealer_obj,var,None) - results.append(dealer_obj) return results From 5886d7b32fd13e34722151fcfee456e0d3270dc5 Mon Sep 17 00:00:00 2001 From: DevPS-513 Date: Tue, 16 Jan 2024 12:42:57 -0500 Subject: [PATCH 15/21] initial working version with api_key started for watson NLU --- server/djangoapp/restapis.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/server/djangoapp/restapis.py b/server/djangoapp/restapis.py index 1db9d78f0c..8aeecc5e91 100644 --- a/server/djangoapp/restapis.py +++ b/server/djangoapp/restapis.py @@ -14,15 +14,25 @@ def get_request(url,**kwargs): - print(f'calling restapis.get_request({url})','with args',kwargs) + print(f'calling restapis.get_request({url})') + + api_key=kwargs.pop('api_key',None) try: - response = requests.get(url, headers={'Content-Type': 'application/json'}, + + if( api_key ): + response = requests.get(url, headers={'Content-Type': 'application/json'}, + params=kwargs,auth=HTTPBasicAuth('apikey', api_key)) + else: + response = requests.get(url, headers={'Content-Type': 'application/json'}, params=kwargs) + + return response.text + except: print("could not connect") + return '' - return response.text From 336c0f04a86c45063483e3ce74e5a6bf08aa9357 Mon Sep 17 00:00:00 2001 From: DevPS-513 Date: Tue, 16 Jan 2024 15:17:23 -0500 Subject: [PATCH 16/21] added sentiment analysis --- server/djangoapp/restapis.py | 37 ++++++++++++++++--- .../djangoapp/templates/djangoapp/base.html | 5 +++ .../templates/djangoapp/testnlu.html | 12 ++++++ server/djangoapp/urls.py | 3 ++ server/djangoapp/views.py | 25 ++++++++++++- 5 files changed, 75 insertions(+), 7 deletions(-) create mode 100644 server/djangoapp/templates/djangoapp/testnlu.html diff --git a/server/djangoapp/restapis.py b/server/djangoapp/restapis.py index 8aeecc5e91..16a741a782 100644 --- a/server/djangoapp/restapis.py +++ b/server/djangoapp/restapis.py @@ -12,31 +12,48 @@ # e.g., response = requests.get(url, params=params, headers={'Content-Type': 'application/json'}, # auth=HTTPBasicAuth('apikey', api_key)) +import nltk +nltk.download('vader_lexicon') + +from nltk.sentiment import SentimentIntensityAnalyzer +sia = SentimentIntensityAnalyzer() + def get_request(url,**kwargs): print(f'calling restapis.get_request({url})') - api_key=kwargs.pop('api_key',None) + apikey=kwargs.pop('apikey',None) + headers=kwargs.pop('headers',None) + data=kwargs.pop('data',None) try: - if( api_key ): - response = requests.get(url, headers={'Content-Type': 'application/json'}, - params=kwargs,auth=HTTPBasicAuth('apikey', api_key)) + if( apikey ): + response=requests.post(url, headers=headers,data=data, auth=HTTPBasicAuth('apikey', apikey)) else: response = requests.get(url, headers={'Content-Type': 'application/json'}, params=kwargs) return response.text - except: - print("could not connect") + except Exception as e: + print(e) return '' # Create a `post_request` to make HTTP POST requests + +def post_request(url,**kwargs): + + + response = requests.post(url, params=kwargs, json=payload) + + + return response.text + + # e.g., response = requests.post(url, params=kwargs, json=payload) @@ -95,6 +112,14 @@ def get_dealer_reviews_from_cf(url, **kwargs): setattr(dealer_obj,var,dealer["doc"][var]) except: setattr(dealer_obj,var,None) + + + # Now set the Sentiment + try: + setattr(dealer_obj,'sentiment',sia.polarity_scores(dealer_obj.review) ) + except: + setattr(dealer_obj,'sentiment',"None" ) + results.append(dealer_obj) return results diff --git a/server/djangoapp/templates/djangoapp/base.html b/server/djangoapp/templates/djangoapp/base.html index 8ba6150dd1..0d60546b06 100644 --- a/server/djangoapp/templates/djangoapp/base.html +++ b/server/djangoapp/templates/djangoapp/base.html @@ -35,6 +35,11 @@ + + +
diff --git a/server/djangoapp/templates/djangoapp/testnlu.html b/server/djangoapp/templates/djangoapp/testnlu.html new file mode 100644 index 0000000000..d6dd809fbe --- /dev/null +++ b/server/djangoapp/templates/djangoapp/testnlu.html @@ -0,0 +1,12 @@ +{% extends 'djangoapp/base.html' %} + +{%block title %} Test NLU {% endblock %} + +{% load static %} + +{% block content %} + +

Output from Watson NLU Call

+

+{{watsonreply}} +{% endblock %} \ No newline at end of file diff --git a/server/djangoapp/urls.py b/server/djangoapp/urls.py index a766a2c651..714b35ca73 100644 --- a/server/djangoapp/urls.py +++ b/server/djangoapp/urls.py @@ -29,6 +29,9 @@ path(route='get_dealer_details/', view=views.get_dealer_details, name='get_dealer_details'), path(route='get_reviews/', view=views.get_reviews, name='get_reviews'), + path(route='test_nlu/', view=views.test_nlu, name='test_nlu'), + + # path for dealer reviews view # path for add a review view diff --git a/server/djangoapp/views.py b/server/djangoapp/views.py index 55a522902f..34d3dbd7f8 100644 --- a/server/djangoapp/views.py +++ b/server/djangoapp/views.py @@ -12,7 +12,14 @@ from .forms import RegisterForm from .restapis import get_request,get_dealers_from_cf,get_dealer_reviews_from_cf +import nltk +nltk.download('vader_lexicon') +from nltk.sentiment import SentimentIntensityAnalyzer +sia = SentimentIntensityAnalyzer() + +with open(r"C:\localkeys\IBM_Watson_Credential.txt", 'r') as f: + watson_api_keys = json.load(f) # Get an instance of a logger logger = logging.getLogger(__name__) @@ -65,7 +72,7 @@ def register(request): def get_dealer_details(request): context = {} #dealerships=get_request("http://127.0.0.1:5000/api/dealership",id=1) - if request.method == "POST": + if request.method == "GET": id = request.POST.get('id') dealerships = get_dealers_from_cf("http://127.0.0.1:5000/api/dealership", id=id) else: @@ -88,6 +95,22 @@ def get_reviews(request): +def test_nlu(request): + context = {} + + reply='Initialized_to_None' + + if(request.method == 'GET'): + + + reply=sia.polarity_scores("I love you") + + + return render(request, 'djangoapp/testnlu.html', {"watsonreply": reply}) + + + + # Create a `add_review` view to submit a review From 787d89633ef755d6788bcf45970c2a846c0d3a73 Mon Sep 17 00:00:00 2001 From: DevPS-513 Date: Tue, 16 Jan 2024 16:08:44 -0500 Subject: [PATCH 17/21] initial template of adding a review --- .../templates/djangoapp/addreview.html | 30 +++++++++++++++++ .../djangoapp/templates/djangoapp/base.html | 2 +- server/djangoapp/urls.py | 2 ++ server/djangoapp/views.py | 33 +++++++++++++++++++ 4 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 server/djangoapp/templates/djangoapp/addreview.html diff --git a/server/djangoapp/templates/djangoapp/addreview.html b/server/djangoapp/templates/djangoapp/addreview.html new file mode 100644 index 0000000000..31489f9740 --- /dev/null +++ b/server/djangoapp/templates/djangoapp/addreview.html @@ -0,0 +1,30 @@ +{% extends 'djangoapp/base.html' %} + +{%block title %} Add Review {% endblock %} + +{% load static %} + +{% block content %} +

+ {% csrf_token %} +

Review List



+
+
+ + +

    +
  • + {% for field_name, field_value in emptyform.items %} + {{ field_name }}:
    + {% endfor %} + +
  • + +
    +

    New Data to Add is + {% for field_name, field_value in formdata.items %} + {{ field_name }}: {{ field_value }}
    + {% endfor %} + +

+{% endblock %} \ No newline at end of file diff --git a/server/djangoapp/templates/djangoapp/base.html b/server/djangoapp/templates/djangoapp/base.html index 0d60546b06..7ad8bd9994 100644 --- a/server/djangoapp/templates/djangoapp/base.html +++ b/server/djangoapp/templates/djangoapp/base.html @@ -37,7 +37,7 @@ diff --git a/server/djangoapp/urls.py b/server/djangoapp/urls.py index 714b35ca73..6bfd5e4b05 100644 --- a/server/djangoapp/urls.py +++ b/server/djangoapp/urls.py @@ -29,6 +29,8 @@ path(route='get_dealer_details/', view=views.get_dealer_details, name='get_dealer_details'), path(route='get_reviews/', view=views.get_reviews, name='get_reviews'), + path(route='add_review/', view=views.add_review, name='add_review'), + path(route='test_nlu/', view=views.test_nlu, name='test_nlu'), diff --git a/server/djangoapp/views.py b/server/djangoapp/views.py index 34d3dbd7f8..842fe26f53 100644 --- a/server/djangoapp/views.py +++ b/server/djangoapp/views.py @@ -11,6 +11,8 @@ import json from .forms import RegisterForm +from .models import CarDealer,CarMake,CarModel,DealerReview + from .restapis import get_request,get_dealers_from_cf,get_dealer_reviews_from_cf import nltk nltk.download('vader_lexicon') @@ -94,6 +96,37 @@ def get_reviews(request): return render(request, 'djangoapp/reviewlist.html', {"reviews": reviews}) +def add_review(request): + formdata = DealerReview() + emptyform = vars(formdata) + + print(request.POST) + + if request.method == "POST": + id = request.POST.get('id') + print("id is ", id) + reviews = [] + for var in emptyform.keys(): + try: + print(var) + print( request.POST.get(var)) + setattr(formdata, var, request.POST.get(var)) + except Exception as e: + print("error") + setattr(formdata, var, "None") + + + + formdata = vars(formdata) # Update formdata with the saved data + else: + reviews = [] + + for val in formdata: + print(val,formdata[val]) + + return render(request, 'djangoapp/addreview.html', {"emptyform": emptyform, "formdata": formdata}) + + def test_nlu(request): context = {} From a49b69a0570229a6eafbc65639b4c12646b043f8 Mon Sep 17 00:00:00 2001 From: DevPS-513 Date: Tue, 16 Jan 2024 17:48:13 -0500 Subject: [PATCH 18/21] initial functinality to display full table and link to single dealer ship --- server/djangoapp/models.py | 29 +++++++++---- server/djangoapp/restapis.py | 4 +- .../djangoapp/templates/djangoapp/base.html | 2 +- .../templates/djangoapp/dealer_details.html | 18 -------- .../templates/djangoapp/dealershiplist.html | 39 ++++++++++------- .../djangoapp/get_dealer_details.html | 25 +++++++++++ server/djangoapp/templatetags/__init__.py | 0 server/djangoapp/templatetags/getattribute.py | 12 ++++++ server/djangoapp/urls.py | 3 ++ server/djangoapp/views.py | 43 ++++++++++++++++--- 10 files changed, 126 insertions(+), 49 deletions(-) delete mode 100644 server/djangoapp/templates/djangoapp/dealer_details.html create mode 100644 server/djangoapp/templates/djangoapp/get_dealer_details.html create mode 100644 server/djangoapp/templatetags/__init__.py create mode 100644 server/djangoapp/templatetags/getattribute.py diff --git a/server/djangoapp/models.py b/server/djangoapp/models.py index ef9690a6bc..1e062017fe 100644 --- a/server/djangoapp/models.py +++ b/server/djangoapp/models.py @@ -42,24 +42,37 @@ def __str__(self): class CarDealer: - def __init__(self,address,city, - full_name,id,lat,long, - short_name,st,zip): - self.address=address - self.city=city - self.full_name=full_name + def __init__(self=None, + address=None, + city=None, + full_name=None, + id=None, + lat=None, + long=None, + short_name=None, + st=None, + zip=None): self.id=id + self.full_name=full_name + self.city=city + self.address=address self.lat=lat self.long=long self.short_name=short_name self.st=st self.zip=zip + self.important_fields_names=['id','full_name','city','address','zip','state'] + + def __str__(self): - return "Dealer name: " + self.full_name + return f"Dealer name: { self.full_name}" def get_fields(self): return vars(self) + + def get_frontend_fieldnames(self): + return {k: v for k,v in vars(self).items() if k in self.important_fields_names} # Create a plain Python class `DealerReview` to hold review data @@ -88,7 +101,7 @@ def __init__(self=None, self.id=id def __str__(self): - return "Reviewer name: " + self.name + return f"Reviewer name: {self.name}" def get_fields(self): diff --git a/server/djangoapp/restapis.py b/server/djangoapp/restapis.py index 16a741a782..a1702fae48 100644 --- a/server/djangoapp/restapis.py +++ b/server/djangoapp/restapis.py @@ -47,7 +47,7 @@ def get_request(url,**kwargs): def post_request(url,**kwargs): - + payload={} response = requests.post(url, params=kwargs, json=payload) @@ -85,6 +85,8 @@ def get_dealers_from_cf(url, **kwargs): st=dealer_doc["st"], zip=dealer_doc["zip"]) results.append(dealer_obj) + + return results def get_dealer_reviews_from_cf(url, **kwargs): diff --git a/server/djangoapp/templates/djangoapp/base.html b/server/djangoapp/templates/djangoapp/base.html index 7ad8bd9994..5362a09494 100644 --- a/server/djangoapp/templates/djangoapp/base.html +++ b/server/djangoapp/templates/djangoapp/base.html @@ -30,7 +30,7 @@ Contact