From e8e3121947d4263c392b5b93a210c05401e5b0bd Mon Sep 17 00:00:00 2001 From: Ankit Tehlan Date: Wed, 8 Nov 2023 23:42:09 +0530 Subject: [PATCH 01/14] Add static pages --- server/db.sqlite3 | Bin 0 -> 131072 bytes server/djangoapp/templates/base.html | 69 ++++++++++++++++++ .../djangoapp/templates/djangoapp/about.html | 13 ++++ .../templates/djangoapp/contact_us.html | 51 +++++++++++++ .../djangoapp/templates/djangoapp/index.html | 30 ++------ server/djangoapp/urls.py | 2 + server/djangoapp/views.py | 11 ++- server/requirements.txt | 12 +-- server/static/admin/img/about-us.svg | 1 + server/static/admin/img/aboutus.jpg | Bin 0 -> 72708 bytes 10 files changed, 156 insertions(+), 33 deletions(-) create mode 100644 server/db.sqlite3 create mode 100644 server/djangoapp/templates/base.html create mode 100644 server/djangoapp/templates/djangoapp/about.html create mode 100644 server/djangoapp/templates/djangoapp/contact_us.html create mode 100644 server/static/admin/img/about-us.svg create mode 100644 server/static/admin/img/aboutus.jpg diff --git a/server/db.sqlite3 b/server/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..719e3a56e1b80599ee9e19c7c94df52e0adff119 GIT binary patch literal 131072 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 BpjQ9@ literal 0 HcmV?d00001 diff --git a/server/djangoapp/templates/base.html b/server/djangoapp/templates/base.html new file mode 100644 index 0000000000..592c8fb25f --- /dev/null +++ b/server/djangoapp/templates/base.html @@ -0,0 +1,69 @@ + + + + + Dealership Review + + + + + + + + + + + {% block content %} + {% endblock content %} + + diff --git a/server/djangoapp/templates/djangoapp/about.html b/server/djangoapp/templates/djangoapp/about.html new file mode 100644 index 0000000000..06238beecc --- /dev/null +++ b/server/djangoapp/templates/djangoapp/about.html @@ -0,0 +1,13 @@ +{% extends 'base.html' %} + +{% block content %} +

+ About Us +

+

+ Welcome to Best Cars dealership, home to the best cars in North America. We + sell domestic and imported cars at reasonable prices. +

+{% load static %} + +{% endblock content %} diff --git a/server/djangoapp/templates/djangoapp/contact_us.html b/server/djangoapp/templates/djangoapp/contact_us.html new file mode 100644 index 0000000000..aa9ad83b08 --- /dev/null +++ b/server/djangoapp/templates/djangoapp/contact_us.html @@ -0,0 +1,51 @@ +{% extends 'base.html' %} + +{% block content %} + + + +

+ Contact Us +

+

+ Details about CAPSTONE +

+ + + + + + + + + + + + + + + + + +
AttributeDetails
NameCAPSTONE
Address15338 NE 9th Pl, Bellevue, WA, 98007
Contact+1 432 768 9876
+{% load static %} + +{% endblock content %} diff --git a/server/djangoapp/templates/djangoapp/index.html b/server/djangoapp/templates/djangoapp/index.html index 1a9ee6e39a..910e060d10 100644 --- a/server/djangoapp/templates/djangoapp/index.html +++ b/server/djangoapp/templates/djangoapp/index.html @@ -1,25 +1,7 @@ - - - - - Dealership Review - - - - - - - + +{% extends 'base.html'%} - - - - - This is the index page of your Django app! - - - - - - - +{% block content %} + +
Dealer table
+{% endblock content %} diff --git a/server/djangoapp/urls.py b/server/djangoapp/urls.py index 37b1c89d01..c1d22264ef 100644 --- a/server/djangoapp/urls.py +++ b/server/djangoapp/urls.py @@ -10,8 +10,10 @@ # name the URL # path for about view + path(route='about', view=views.about, name='about'), # path for contact us view + path(route='contact', view=views.contact, name='contact'), # path for registration diff --git a/server/djangoapp/views.py b/server/djangoapp/views.py index 61cc664da0..5c315804ba 100644 --- a/server/djangoapp/views.py +++ b/server/djangoapp/views.py @@ -18,12 +18,17 @@ # Create an `about` view to render a static about page -# def about(request): -# ... +def about(request): + context = {} + if request.method == "GET": + return render(request, 'djangoapp/about.html', context) # Create a `contact` view to return a static contact page -#def contact(request): +def contact(request): + context = {} + if request.method == "GET": + return render(request, 'djangoapp/contact_us.html', context) # Create a `login_request` view to handle sign in request # def login_request(request): diff --git a/server/requirements.txt b/server/requirements.txt index 2851cca128..cff7323daf 100644 --- a/server/requirements.txt +++ b/server/requirements.txt @@ -1,7 +1,7 @@ requests -Django==3.1.3 -Pillow==8.0.1 -gunicorn==20.1.0 -ibm-cloud-sdk-core==3.10.0 -ibm-watson==5.2.2 -ibmcloudant==0.0.34 +Django +Pillow +gunicorn +ibm-cloud-sdk-core +ibm-watson +ibmcloudant diff --git a/server/static/admin/img/about-us.svg b/server/static/admin/img/about-us.svg new file mode 100644 index 0000000000..712840b70b --- /dev/null +++ b/server/static/admin/img/about-us.svg @@ -0,0 +1 @@ +Created by Gregor Cresnarfrom the Noun Project \ No newline at end of file diff --git a/server/static/admin/img/aboutus.jpg b/server/static/admin/img/aboutus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3f39bb85bdc7960d7c5d80c8f393f9e5f8faeb89 GIT binary patch literal 72708 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 z%0A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

b^^*hOU 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 literal 0 HcmV?d00001 From 6bbbe96c76c03bd321c3f7e5457c7dc08c006ebc Mon Sep 17 00:00:00 2001 From: Ankit Tehlan Date: Thu, 9 Nov 2023 10:46:00 +0530 Subject: [PATCH 02/14] Add user management --- server/db.sqlite3 | Bin 131072 -> 131072 bytes server/djangoapp/templates/base.html | 6 +- .../templates/djangoapp/registration.html | 61 ++++++++++++++++-- server/djangoapp/urls.py | 7 +- server/djangoapp/views.py | 51 +++++++++++++-- 5 files changed, 110 insertions(+), 15 deletions(-) diff --git a/server/db.sqlite3 b/server/db.sqlite3 index 719e3a56e1b80599ee9e19c7c94df52e0adff119..22720d5dd66176725006b4ede9de707ea4f19d9e 100644 GIT binary patch delta 1138 zcmaiyOK%%h6vt=mfb0tU0!1>2M-$aTLY196citl+7(eRg*s-0sb~nkjJ)RlcV_p77O;UVy66h=1uB79b=6hb@(GxPM-zn9vpV(#uL73!1usE+kwa6fxDahkRXURqu5#MN6tdE zgVXicweSt{-}0f zmud86w@#0}dS%wFv%RT_X3QRfh)z*d3X0p1l_)4dCe1)*&4>cl@f07Z`UFp}MnO?x zxHKbh952e}L8l*+7qHQt*eB7b9Q$9`c@CG|`4Z;w()U{|UDI%@oKL#?lrmT1nX!QR}OG}VT(+pyH8c)Z@@`Ck+m-Z}s{HbPQ zW0LM$=H(`62?d|UG$XP|>6X1S)5a`v3uRpsPdPTW+D0|j$;d2Q3lnqyXtv5GDyuoUWsyeD6_L;O=_S>WU zqVA1kC8MTVwXSWTF+7+!9@|KDaMduiwlkaRJ&kYIt?beiO?u%_ZUs%~Chj3v9H4HV zKf1#VR>FRvs2T%bT)X4DO}nG2Bf)l!T-9Z``2lqGqa}S<)Mhkq&lNV`&1;(8q;STZ zpR|lxX_PNznzy~O)iNgI@nNH1Vyb3&*(%@?#Sgt)8=dr_6m;TOO^GduMLlDAg*nod zE?ueKp7{HBmC9;>t;V|G4O{A1ZQemPcHlpwM)bv2{jC$tGQyJFQdY7m@b+jX^gWL< zR&&RL*3jW8N*hk*=4!#xD*ad4oFiqu>;!i*av6^fai-FTPNz^tNbd8F;inK5?Yb|N zZeAKDFJejKUbIpPYLi8JUV;h_&ZQah86N=Mt%gBEMAQVdM 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$DMb{{ user.first_name }}({{ user.username }}) - Logout + Logout {% else %}

  • -
    + {% csrf_token %}
    - Sign Up + Sign Up
  • diff --git a/server/djangoapp/templates/djangoapp/registration.html b/server/djangoapp/templates/djangoapp/registration.html index ae11ea4b71..65e422404b 100644 --- a/server/djangoapp/templates/djangoapp/registration.html +++ b/server/djangoapp/templates/djangoapp/registration.html @@ -5,7 +5,60 @@ {% load static %} - - - - \ No newline at end of file + + + + + + +
    +
    + {% csrf_token %} +

    Sign Up

    +
    +
    + + + + + + + + + {% if message %} +
    + {{ message }} +
    + {% endif %} + +
    +
    +
    + + \ No newline at end of file diff --git a/server/djangoapp/urls.py b/server/djangoapp/urls.py index c1d22264ef..3729f3d543 100644 --- a/server/djangoapp/urls.py +++ b/server/djangoapp/urls.py @@ -10,16 +10,19 @@ # name the URL # path for about view - path(route='about', view=views.about, name='about'), + path(route='about/', view=views.about, name='about'), # path for contact us view - path(route='contact', view=views.contact, name='contact'), + path(route='contact/', view=views.contact, name='contact'), # path for registration + path('registration/', views.registration_request, name='registration'), # path for login + path(route='login/', view=views.login_request, name='login'), # path for logout + path('logout/', views.logout_request, name='logout'), path(route='', view=views.get_dealerships, name='index'), diff --git a/server/djangoapp/views.py b/server/djangoapp/views.py index 5c315804ba..8f07d10aa5 100644 --- a/server/djangoapp/views.py +++ b/server/djangoapp/views.py @@ -31,16 +31,55 @@ def contact(request): return render(request, 'djangoapp/contact_us.html', context) # Create a `login_request` view to handle sign in request -# def login_request(request): -# ... +def login_request(request): + context = {} + # Handles POST request + if request.method == "POST": + # Get username and password from request.POST dictionary + username = request.POST['username'] + password = request.POST['psw'] + # Try to check if provide credential can be authenticated + user = authenticate(username=username, password=password) + if user is not None: + # If user is valid, call login method to login current user + login(request, user) + return redirect('djangoapp:index') + # else: + # # If not, return to login page again + # return render(request, 'onlinecourse/user_login.html', context) + # else: + # return render(request, 'onlinecourse/user_login.html', context) # Create a `logout_request` view to handle sign out request -# def logout_request(request): -# ... +def logout_request(request): + logout(request) + return redirect('djangoapp:index') # Create a `registration_request` view to handle sign up request -# def registration_request(request): -# ... +def registration_request(request): + context = {} + if request.method == 'GET': + return render(request, 'djangoapp/registration.html', context) + elif request.method == 'POST': + # Check if user exists + username = request.POST['username'] + password = request.POST['psw'] + first_name = request.POST['firstname'] + last_name = request.POST['lastname'] + user_exist = False + try: + User.objects.get(username=username) + user_exist = True + except: + logger.error("New user") + if not user_exist: + user = User.objects.create_user(username=username, first_name=first_name, last_name=last_name, + password=password) + login(request, user) + return redirect("djangoapp:index") + else: + context['message'] = "User already exists." + return render(request, 'djangoapp/registration.html', context) # Update the `get_dealerships` view to render the index page with a list of dealerships def get_dealerships(request): From fc6a3c2c4c4da39bd1594e439c90d2ebbd6df398 Mon Sep 17 00:00:00 2001 From: Ankit Tehlan Date: Thu, 9 Nov 2023 11:55:28 +0530 Subject: [PATCH 03/14] Manual workflow dispatch for lint --- .github/workflows/linter.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index 05ca50d23b..900779afc8 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -1,10 +1,6 @@ name: 'Lint Code' -on: - push: - branches: [master, main] - pull_request: - branches: [master, main] +on: workflow_dispatch jobs: # list of things to do lint_function_js: From 97c2ce39ddef383702a57eda869a2514f0667852 Mon Sep 17 00:00:00 2001 From: Ankit Tehlan Date: Tue, 14 Nov 2023 11:26:58 +0530 Subject: [PATCH 04/14] Add cloud functions --- functions/sample/nodejs/index.js | 4 +- functions/sample/nodejs/package-lock.json | 2802 ++++++++++++++++++++- functions/sample/nodejs/package.json | 5 +- functions/sample/python/__init__.py | 0 functions/sample/python/main.py | 11 +- functions/sample/python/requirements.txt | 25 +- server/db.sqlite3 | Bin 131072 -> 131072 bytes 7 files changed, 2766 insertions(+), 81 deletions(-) create mode 100644 functions/sample/python/__init__.py diff --git a/functions/sample/nodejs/index.js b/functions/sample/nodejs/index.js index c5e284b7fb..454e3dfd5f 100644 --- a/functions/sample/nodejs/index.js +++ b/functions/sample/nodejs/index.js @@ -6,11 +6,11 @@ const { IamAuthenticator } = require("ibm-cloud-sdk-core"); function main(params) { - const authenticator = new IamAuthenticator({ apikey: params.IAM_API_KEY }); + const authenticator = new IamAuthenticator({ apikey: "u8v-rk2sni64qWz9lvYJLcbSw6NqgS27ijwCR4oVHhXu" }); const cloudant = CloudantV1.newInstance({ authenticator: authenticator, }); - cloudant.setServiceUrl(params.COUCH_URL); + cloudant.setServiceUrl("https://e5c1f382-d6e3-4c53-b67f-a2e45ce95497-bluemix.cloudantnosqldb.appdomain.cloud/"); let dbList = getDbs(cloudant); return { dbs: dbList }; diff --git a/functions/sample/nodejs/package-lock.json b/functions/sample/nodejs/package-lock.json index a74c9ce34a..47a93c332b 100644 --- a/functions/sample/nodejs/package-lock.json +++ b/functions/sample/nodejs/package-lock.json @@ -9,12 +9,175 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@cloudant/cloudant": "^4.4.0" + "@cloudant/cloudant": "", + "@ibm-cloud/cloudant": "^0.7.2", + "package.json": "^2.0.1" }, "devDependencies": { "eslint": "^8.27.0" } }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "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.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "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 +300,38 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@ibm-cloud/cloudant": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@ibm-cloud/cloudant/-/cloudant-0.7.2.tgz", + "integrity": "sha512-SQnLFSOtZrKc3j7lOv/z60cP1YxEPZ2QgF6FSz+oFqNfdf+zSMWuC3qqkLnvnA8WzAC0VQGxO7YDA67mSns/0A==", + "dependencies": { + "@types/node": "18.18.8", + "ibm-cloud-sdk-core": "4.1.4" + }, + "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 +367,57 @@ "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/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/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.18.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.8.tgz", + "integrity": "sha512-OLGBaaK5V3VRBS1bAkMVP2/W9B+H8meUfl866OrMNQqt7wDgdpWPp5o6gmIc9pB+lIQHSq4ZL8ypeH1vPxcPaQ==", + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/request": { "version": "2.48.8", @@ -193,11 +430,37 @@ "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.18", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.18.tgz", + "integrity": "sha512-DDi2KmvAnNsT/EvU8jp1UR7pOJojBtJ3GLZ/uw1MUq4VbbESppPWoHUY4h0OB4BbEbGJiyEsmUcuZDZtoR+ZwQ==", + "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/abs": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/abs/-/abs-1.3.14.tgz", + "integrity": "sha512-PrS26IzwKLWwuURpiKl8wRmJ2KdR/azaVrLEBWG/TALwT20Y7qjtYp1qcMLHA4206hBHY5phv3w4pjf9NPv4Vw==", + "dependencies": { + "ul": "^5.0.0" + } + }, "node_modules/acorn": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", @@ -238,7 +501,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 +509,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" }, @@ -306,6 +567,29 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, + "node_modules/axios": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", + "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", + "dependencies": { + "follow-redirects": "^1.15.0", + "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", @@ -330,6 +614,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,6 +633,11 @@ "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", @@ -352,6 +652,25 @@ "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/capture-stack-trace": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.2.tgz", + "integrity": "sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==", + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -361,7 +680,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 +733,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 +743,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", @@ -473,6 +789,17 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, + "node_modules/create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==", + "dependencies": { + "capture-stack-trace": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -506,12 +833,28 @@ "ms": "^2.1.1" } }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/deffy": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/deffy/-/deffy-2.2.4.tgz", + "integrity": "sha512-pLc9lsbsWjr6RxmJ2OLyvm+9l4j1yK69h+TML/gUit/t3vTijpkNGh8LioaJYTGO7F25m6HZndADcUOo2PsiUg==", + "dependencies": { + "typpy": "^2.0.0" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -520,6 +863,14 @@ "node": ">=0.4.0" } }, + "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 +883,22 @@ "node": ">=6.0.0" } }, + "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/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -541,6 +908,30 @@ "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/err": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/err/-/err-1.1.1.tgz", + "integrity": "sha512-N97Ybd2jJHVQ+Ft3Q5+C2gM3kgygkdeQmEqbN2z15UTVyyEsIwLA1VK39O1DHEJhXbwIFcJLqm6iARNhFANcQA==", + "dependencies": { + "typpy": "^2.2.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/errs": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/errs/-/errs-0.3.2.tgz", @@ -748,6 +1139,31 @@ "node": ">=0.10.0" } }, + "node_modules/exec-limiter": { + "version": "3.2.13", + "resolved": "https://registry.npmjs.org/exec-limiter/-/exec-limiter-3.2.13.tgz", + "integrity": "sha512-86Ri699bwiHZVBzTzNj8gspqAhCPchg70zPVWIh3qzUOA1pUMcb272Em3LPk8AE0mS95B9yMJhtqF8vFJAn0dA==", + "dependencies": { + "limit-it": "^3.0.0", + "typpy": "^2.1.0" + } + }, + "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/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -798,6 +1214,33 @@ "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/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -833,6 +1276,25 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "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", @@ -860,6 +1322,22 @@ "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/function.name": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/function.name/-/function.name-1.0.13.tgz", + "integrity": "sha512-mVrqdoy5npWZyoXl4DxCeuVF6delDcQjVS9aPdvLYlBxtMTZDR2B5GVEQEoM1jJyspCqg3C0v4ABkLE7tp9xFA==", + "dependencies": { + "noop6": "^1.0.1" + } + }, "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -868,6 +1346,58 @@ "assert-plus": "^1.0.0" } }, + "node_modules/git-package-json": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/git-package-json/-/git-package-json-1.4.10.tgz", + "integrity": "sha512-DRAcvbzd2SxGK7w8OgYfvKqhFliT5keX0lmSmVdgScgf1kkl5tbbo7Pam6uYoCa1liOiipKxQZG8quCtGWl/fA==", + "dependencies": { + "deffy": "^2.2.1", + "err": "^1.1.1", + "gry": "^5.0.0", + "normalize-package-data": "^2.3.5", + "oargv": "^3.4.1", + "one-by-one": "^3.1.0", + "r-json": "^1.2.1", + "r-package-json": "^1.0.0", + "tmp": "0.0.28" + } + }, + "node_modules/git-package-json/node_modules/tmp": { + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.28.tgz", + "integrity": "sha512-c2mmfiBmND6SOVxzogm1oda0OJ1HZVIk/5n26N59dDTh80MUeavpiCls4PGAdkX1PFkKokLpcf7prSjCeXLsJg==", + "dependencies": { + "os-tmpdir": "~1.0.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/git-source": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/git-source/-/git-source-1.1.10.tgz", + "integrity": "sha512-XZZ7ZgnLL35oLgM/xjnLYgtlKlxJG0FohC1kWDvGkU7s1VKGXK0pFF/g1itQEwQ3D+uTQzBnzPi8XbqOv7Wc1Q==", + "dependencies": { + "git-url-parse": "^5.0.1" + } + }, + "node_modules/git-up": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-1.2.1.tgz", + "integrity": "sha512-SRVN3rOLACva8imc7BFrB6ts5iISWKH1/h/1Z+JZYoUI7UVQM7gQqk4M2yxUENbq2jUUT09NEND5xwP1i7Ktlw==", + "dependencies": { + "is-ssh": "^1.0.0", + "parse-url": "^1.0.0" + } + }, + "node_modules/git-url-parse": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-5.0.1.tgz", + "integrity": "sha512-4uSiOgrryNEMBX+gTWogenYRUh2j1D+95STTSEF2RCTgLkfJikl8c7BGr0Bn274hwuxTsbS2/FQ5pVS9FoXegQ==", + "dependencies": { + "git-up": "^1.0.0" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -915,14 +1445,56 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/got": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-5.6.0.tgz", + "integrity": "sha512-MnypzkaW8dldA8AbJFjMs7y14+ykd2V8JCLKSvX1Gmzx1alH3Y+3LArywHDoAF2wS3pnZp4gacoYtvqBeF6drQ==", + "dependencies": { + "create-error-class": "^3.0.1", + "duplexer2": "^0.1.4", + "is-plain-obj": "^1.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "node-status-codes": "^1.0.0", + "object-assign": "^4.0.1", + "parse-json": "^2.1.0", + "pinkie-promise": "^2.0.0", + "read-all-stream": "^3.0.0", + "readable-stream": "^2.0.5", + "timed-out": "^2.0.0", + "unzip-response": "^1.0.0", + "url-parse-lax": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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", "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, - "node_modules/har-schema": { - "version": "2.0.0", + "node_modules/gry": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/gry/-/gry-5.0.8.tgz", + "integrity": "sha512-meq9ZjYVpLzZh3ojhTg7IMad9grGsx6rUUKHLqPnhLXzJkRQvEL2U3tQpS5/WentYTtHtxkT3Ew/mb10D6F6/g==", + "dependencies": { + "abs": "^1.2.1", + "exec-limiter": "^3.0.0", + "one-by-one": "^3.0.0", + "ul": "^5.0.0" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "engines": { @@ -946,11 +1518,26 @@ "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/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/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, "node_modules/http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -965,6 +1552,79 @@ "npm": ">=1.3.7" } }, + "node_modules/ibm-cloud-sdk-core": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/ibm-cloud-sdk-core/-/ibm-cloud-sdk-core-4.1.4.tgz", + "integrity": "sha512-eRPC/bSzCrPMDdHbnXIApajeNV0/9KGl2NmACvhcgP6Wn4WlvqzjD5ik3jxf771vVb+KKt5aFGKfnm2Obh4whw==", + "dependencies": { + "@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.0", + "camelcase": "^5.3.1", + "debug": "^4.1.1", + "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.18", + "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/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/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 +1674,27 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1035,6 +1716,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", @@ -1044,6 +1733,46 @@ "node": ">=8" } }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-ssh": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", + "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", + "dependencies": { + "protocols": "^2.0.1" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -1065,12 +1794,85 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, + "node_modules/iterate-object": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/iterate-object/-/iterate-object-1.3.4.tgz", + "integrity": "sha512-4dG1D1x/7g8PwHS9aK6QV5V94+ZvyP4+d19qDv43EzImmrndysIl4prmJ1hWWIGCqrZHyaHBm6BSEWHOLnpoNw==" + }, + "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 +1911,41 @@ "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/jsonwebtoken/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/jsprim": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", @@ -1123,6 +1960,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", @@ -1136,6 +1992,14 @@ "node": ">= 0.8.0" } }, + "node_modules/limit-it": { + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/limit-it/-/limit-it-3.2.10.tgz", + "integrity": "sha512-T0NK99pHnkimldr1WUqvbGV1oWDku/xC9J/OqzJFsV1jeOS6Bwl8W7vkeQIBqwiON9dTALws+rX/XPMQqWerDQ==", + "dependencies": { + "typpy": "^2.0.0" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -1161,12 +2025,83 @@ "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/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "engines": { + "node": ">=0.10.0" + } + }, + "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/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-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -1198,6 +2133,14 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -1245,6 +2188,39 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/node-status-codes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", + "integrity": "sha512-1cBMgRxdMWE8KeWCqk2RIOrvUb0XCwYfEsY5/y2NlXyq4Y/RumnOZvTj4Nbr77+Vb2C+kyBoRTdkNOS8L3d/aQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/noop6": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/noop6/-/noop6-1.0.9.tgz", + "integrity": "sha512-DB3Hwyd89dPr5HqEPg3YHjzvwh/mCqizC1zZ8vyofqc+TQRyPDnT4wgXXbLGF4z9YAzwwTLi8pNLhGqcbSjgkA==" + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/oargv": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/oargv/-/oargv-3.4.10.tgz", + "integrity": "sha512-SXaMANv9sr7S/dP0vj0+Ybipa47UE1ntTWQ2rpPRhC6Bsvfl+Jg03Xif7jfL0sWKOYWK8oPjcZ5eJ82t8AP/8g==", + "dependencies": { + "iterate-object": "^1.1.0", + "ul": "^5.0.0" + } + }, "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -1253,6 +2229,22 @@ "node": "*" } }, + "node_modules/obj-def": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/obj-def/-/obj-def-1.0.9.tgz", + "integrity": "sha512-bQ4ya3VYD6FAA1+s6mEhaURRHSmw4+sKaXE6UyXZ1XDYc5D+c7look25dFdydmLd18epUegh398gdDkMUZI9xg==", + "dependencies": { + "deffy": "^2.2.2" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -1262,6 +2254,15 @@ "wrappy": "1" } }, + "node_modules/one-by-one": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/one-by-one/-/one-by-one-3.2.8.tgz", + "integrity": "sha512-HR/pSzZdm46Xqj58K+Bu64kMbSTw8/u77AwWvV+rprO/OsuR++pPlkUJn+SmwqBGRgHKwSKQ974V3uls7crIeQ==", + "dependencies": { + "obj-def": "^1.0.0", + "sliced": "^1.0.1" + } + }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -1317,6 +2318,39 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/package-json": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz", + "integrity": "sha512-PRg65iXMTt/uK8Rfh5zvzkUbfAPitF17YaCY+IbHsYgksiLvtzWWTUildHth3mVaZ7871OJ7gtP4LBRBlmAdXg==", + "dependencies": { + "got": "^5.0.0", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/package-json-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/package-json-path/-/package-json-path-1.0.9.tgz", + "integrity": "sha512-uNu7f6Ef7tQHZRnkyVnCtzdSYVN9uBtge/sG7wzcUaawFWkPYUq67iXxRGrQSg/q0tzxIB8jSyIYUKjG2Jn//A==", + "dependencies": { + "abs": "^1.2.1" + } + }, + "node_modules/package.json": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/package.json/-/package.json-2.0.1.tgz", + "integrity": "sha512-pSxZ6XR5yEawRN2ekxx9IKgPN5uNAYco7MCPxtBEWMKO3UKWa1X2CtQMzMgloeGj2g2o6cue3Sb5iPkByIJqlw==", + "deprecated": "Use pkg.json instead.", + "dependencies": { + "git-package-json": "^1.4.0", + "git-source": "^1.1.0", + "package-json": "^2.3.1" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -1329,6 +2363,31 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-url": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-1.3.11.tgz", + "integrity": "sha512-1wj9nkgH/5EboDxLwaTMGJh3oH3f+Gue+aGdh631oCqoSBpokzmMmOldvOeBPtB8GJBYJbaF93KPzlkU+Y1ksg==", + "dependencies": { + "is-ssh": "^1.3.0", + "protocols": "^1.4.0" + } + }, + "node_modules/parse-url/node_modules/protocols": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz", + "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -1356,11 +2415,58 @@ "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "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/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -1370,11 +2476,43 @@ "node": ">= 0.8.0" } }, + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", + "engines": { + "node": ">=0.10.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/protocols": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", + "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==" + }, + "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 +2534,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 +2559,59 @@ } ] }, + "node_modules/r-json": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/r-json/-/r-json-1.2.10.tgz", + "integrity": "sha512-hu9vyLjSlHXT62NAS7DjI9WazDlvjN0lgp3n431dCVnirVcLkZIpzSwA3orhZEKzdDD2jqNYI+w0yG0aFf4kpA==" + }, + "node_modules/r-package-json": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/r-package-json/-/r-package-json-1.0.9.tgz", + "integrity": "sha512-G4Vpf1KImWmmPFGdtWQTU0L9zk0SjqEC4qs/jE7AQ+Ylmr5kizMzGeC4wnHp5+ijPqNN+2ZPpvyjVNdN1CDVcg==", + "dependencies": { + "package-json-path": "^1.0.0", + "r-json": "^1.2.1" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "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/read-all-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", + "integrity": "sha512-DI1drPHbmBcUDWrJ7ull/F2Qb8HkwBncVx8/RpKYFSIACYaVRQReISYPdZz/mt1y1+qMCOrfReTopERmaxtP6w==", + "dependencies": { + "pinkie-promise": "^2.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -1430,6 +2626,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", @@ -1442,6 +2666,26 @@ "url": "https://github.com/sponsors/mysticatea" } }, + "node_modules/registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "dependencies": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", + "dependencies": { + "rc": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -1486,6 +2730,39 @@ "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": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -1495,6 +2772,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 +2841,14 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -1574,6 +2870,47 @@ "node": ">=8" } }, + "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/sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA==" + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==" + }, "node_modules/sshpk": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", @@ -1598,6 +2935,25 @@ "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/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -1630,11 +2986,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" }, @@ -1642,33 +3013,81 @@ "node": ">=8" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/timed-out": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz", + "integrity": "sha512-pqqJOi1rF5zNs/ps4vmbE4SFCrM4iR7LW+GHAsHqO/EumqbIWceioevYLM5xZRgQSH6gFgL9J/uB7EcJhQ9niQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dependencies": { - "os-tmpdir": "~1.0.2" + "os-tmpdir": "~1.0.2" + }, + "engines": { + "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/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": ">=0.6.0" + "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": { @@ -1716,6 +3135,44 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, + "node_modules/typpy": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/typpy/-/typpy-2.3.13.tgz", + "integrity": "sha512-vOxIcQz9sxHi+rT09SJ5aDgVgrPppQjwnnayTrMye1ODaU8gIZTDM19t9TxmEElbMihx2Nq/0/b/MtyKfayRqA==", + "dependencies": { + "function.name": "^1.0.3" + } + }, + "node_modules/ul": { + "version": "5.2.15", + "resolved": "https://registry.npmjs.org/ul/-/ul-5.2.15.tgz", + "integrity": "sha512-svLEUy8xSCip5IWnsRa0UOg+2zP0Wsj4qlbjTmX6GJSmvKMHADBuHOm1dpNkWqWPIGuVSqzUkV3Cris5JrlTRQ==", + "dependencies": { + "deffy": "^2.2.2", + "typpy": "^2.3.4" + } + }, + "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/unzip-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", + "integrity": "sha512-pwCcjjhEcpW45JZIySExBHYv5Y9EeL2OIGEfrSKp2dMUFGFv4CpvZkwJbVge8OvGH2BNNtJBx67DuKuJhf+N5Q==", + "engines": { + "node": ">=0.10" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -1724,6 +3181,26 @@ "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/url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", + "dependencies": { + "prepend-http": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -1738,6 +3215,15 @@ "uuid": "bin/uuid" } }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -1772,9 +3258,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 +3272,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 +3291,132 @@ } }, "dependencies": { + "@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "requires": { + "@babel/highlight": "^7.22.13", + "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.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "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 +3507,27 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@ibm-cloud/cloudant": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@ibm-cloud/cloudant/-/cloudant-0.7.2.tgz", + "integrity": "sha512-SQnLFSOtZrKc3j7lOv/z60cP1YxEPZ2QgF6FSz+oFqNfdf+zSMWuC3qqkLnvnA8WzAC0VQGxO7YDA67mSns/0A==", + "requires": { + "@types/node": "18.18.8", + "ibm-cloud-sdk-core": "4.1.4" + } + }, + "@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 +3554,57 @@ "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/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/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.18.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.8.tgz", + "integrity": "sha512-OLGBaaK5V3VRBS1bAkMVP2/W9B+H8meUfl866OrMNQqt7wDgdpWPp5o6gmIc9pB+lIQHSq4ZL8ypeH1vPxcPaQ==", + "requires": { + "undici-types": "~5.26.4" + } }, "@types/request": { "version": "2.48.8", @@ -1937,11 +3617,37 @@ "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.18", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.18.tgz", + "integrity": "sha512-DDi2KmvAnNsT/EvU8jp1UR7pOJojBtJ3GLZ/uw1MUq4VbbESppPWoHUY4h0OB4BbEbGJiyEsmUcuZDZtoR+ZwQ==", + "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==" + }, + "abs": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/abs/-/abs-1.3.14.tgz", + "integrity": "sha512-PrS26IzwKLWwuURpiKl8wRmJ2KdR/azaVrLEBWG/TALwT20Y7qjtYp1qcMLHA4206hBHY5phv3w4pjf9NPv4Vw==", + "requires": { + "ul": "^5.0.0" + } + }, "acorn": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", @@ -1969,14 +3675,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" } @@ -2023,6 +3727,28 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, + "axios": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", + "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", + "requires": { + "follow-redirects": "^1.15.0", + "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", @@ -2047,11 +3773,24 @@ "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", @@ -2063,6 +3802,16 @@ "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==" + }, + "capture-stack-trace": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.2.tgz", + "integrity": "sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==" + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -2072,7 +3821,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 +3855,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 +3862,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", @@ -2153,6 +3899,14 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==", + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2180,17 +3934,35 @@ "ms": "^2.1.1" } }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "deffy": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/deffy/-/deffy-2.2.4.tgz", + "integrity": "sha512-pLc9lsbsWjr6RxmJ2OLyvm+9l4j1yK69h+TML/gUit/t3vTijpkNGh8LioaJYTGO7F25m6HZndADcUOo2PsiUg==", + "requires": { + "typpy": "^2.0.0" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, + "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 +3972,19 @@ "esutils": "^2.0.2" } }, + "dotenv": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", + "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==" + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "requires": { + "readable-stream": "^2.0.2" + } + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -2209,6 +3994,30 @@ "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" + } + }, + "err": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/err/-/err-1.1.1.tgz", + "integrity": "sha512-N97Ybd2jJHVQ+Ft3Q5+C2gM3kgygkdeQmEqbN2z15UTVyyEsIwLA1VK39O1DHEJhXbwIFcJLqm6iARNhFANcQA==", + "requires": { + "typpy": "^2.2.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, "errs": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/errs/-/errs-0.3.2.tgz", @@ -2358,6 +4167,28 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "exec-limiter": { + "version": "3.2.13", + "resolved": "https://registry.npmjs.org/exec-limiter/-/exec-limiter-3.2.13.tgz", + "integrity": "sha512-86Ri699bwiHZVBzTzNj8gspqAhCPchg70zPVWIh3qzUOA1pUMcb272Em3LPk8AE0mS95B9yMJhtqF8vFJAn0dA==", + "requires": { + "limit-it": "^3.0.0", + "typpy": "^2.1.0" + } + }, + "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" + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -2402,6 +4233,24 @@ "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" + } + }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -2428,6 +4277,11 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, + "follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==" + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -2449,6 +4303,19 @@ "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==" + }, + "function.name": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/function.name/-/function.name-1.0.13.tgz", + "integrity": "sha512-mVrqdoy5npWZyoXl4DxCeuVF6delDcQjVS9aPdvLYlBxtMTZDR2B5GVEQEoM1jJyspCqg3C0v4ABkLE7tp9xFA==", + "requires": { + "noop6": "^1.0.1" + } + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -2457,6 +4324,57 @@ "assert-plus": "^1.0.0" } }, + "git-package-json": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/git-package-json/-/git-package-json-1.4.10.tgz", + "integrity": "sha512-DRAcvbzd2SxGK7w8OgYfvKqhFliT5keX0lmSmVdgScgf1kkl5tbbo7Pam6uYoCa1liOiipKxQZG8quCtGWl/fA==", + "requires": { + "deffy": "^2.2.1", + "err": "^1.1.1", + "gry": "^5.0.0", + "normalize-package-data": "^2.3.5", + "oargv": "^3.4.1", + "one-by-one": "^3.1.0", + "r-json": "^1.2.1", + "r-package-json": "^1.0.0", + "tmp": "0.0.28" + }, + "dependencies": { + "tmp": { + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.28.tgz", + "integrity": "sha512-c2mmfiBmND6SOVxzogm1oda0OJ1HZVIk/5n26N59dDTh80MUeavpiCls4PGAdkX1PFkKokLpcf7prSjCeXLsJg==", + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "git-source": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/git-source/-/git-source-1.1.10.tgz", + "integrity": "sha512-XZZ7ZgnLL35oLgM/xjnLYgtlKlxJG0FohC1kWDvGkU7s1VKGXK0pFF/g1itQEwQ3D+uTQzBnzPi8XbqOv7Wc1Q==", + "requires": { + "git-url-parse": "^5.0.1" + } + }, + "git-up": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-1.2.1.tgz", + "integrity": "sha512-SRVN3rOLACva8imc7BFrB6ts5iISWKH1/h/1Z+JZYoUI7UVQM7gQqk4M2yxUENbq2jUUT09NEND5xwP1i7Ktlw==", + "requires": { + "is-ssh": "^1.0.0", + "parse-url": "^1.0.0" + } + }, + "git-url-parse": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-5.0.1.tgz", + "integrity": "sha512-4uSiOgrryNEMBX+gTWogenYRUh2j1D+95STTSEF2RCTgLkfJikl8c7BGr0Bn274hwuxTsbS2/FQ5pVS9FoXegQ==", + "requires": { + "git-up": "^1.0.0" + } + }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -2489,12 +4407,51 @@ "type-fest": "^0.20.2" } }, + "got": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-5.6.0.tgz", + "integrity": "sha512-MnypzkaW8dldA8AbJFjMs7y14+ykd2V8JCLKSvX1Gmzx1alH3Y+3LArywHDoAF2wS3pnZp4gacoYtvqBeF6drQ==", + "requires": { + "create-error-class": "^3.0.1", + "duplexer2": "^0.1.4", + "is-plain-obj": "^1.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "node-status-codes": "^1.0.0", + "object-assign": "^4.0.1", + "parse-json": "^2.1.0", + "pinkie-promise": "^2.0.0", + "read-all-stream": "^3.0.0", + "readable-stream": "^2.0.5", + "timed-out": "^2.0.0", + "unzip-response": "^1.0.0", + "url-parse-lax": "^1.0.0" + } + }, + "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", "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "gry": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/gry/-/gry-5.0.8.tgz", + "integrity": "sha512-meq9ZjYVpLzZh3ojhTg7IMad9grGsx6rUUKHLqPnhLXzJkRQvEL2U3tQpS5/WentYTtHtxkT3Ew/mb10D6F6/g==", + "requires": { + "abs": "^1.2.1", + "exec-limiter": "^3.0.0", + "one-by-one": "^3.0.0", + "ul": "^5.0.0" + } + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -2509,21 +4466,83 @@ "har-schema": "^2.0.0" } }, - "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 - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "ibm-cloud-sdk-core": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/ibm-cloud-sdk-core/-/ibm-cloud-sdk-core-4.1.4.tgz", + "integrity": "sha512-eRPC/bSzCrPMDdHbnXIApajeNV0/9KGl2NmACvhcgP6Wn4WlvqzjD5ik3jxf771vVb+KKt5aFGKfnm2Obh4whw==", + "requires": { + "@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.0", + "camelcase": "^5.3.1", + "debug": "^4.1.1", + "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.18", + "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" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "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", @@ -2562,6 +4581,24 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "requires": { + "hasown": "^2.0.0" + } + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2577,12 +4614,45 @@ "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", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==" + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==" + }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" + }, + "is-ssh": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", + "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", + "requires": { + "protocols": "^2.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -2604,12 +4674,70 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, + "iterate-object": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/iterate-object/-/iterate-object-1.3.4.tgz", + "integrity": "sha512-4dG1D1x/7g8PwHS9aK6QV5V94+ZvyP4+d19qDv43EzImmrndysIl4prmJ1hWWIGCqrZHyaHBm6BSEWHOLnpoNw==" + }, + "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 +4773,33 @@ "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" + }, + "dependencies": { + "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" + } + } + } + }, "jsprim": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", @@ -2656,6 +4811,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", @@ -2666,6 +4840,14 @@ "type-check": "~0.4.0" } }, + "limit-it": { + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/limit-it/-/limit-it-3.2.10.tgz", + "integrity": "sha512-T0NK99pHnkimldr1WUqvbGV1oWDku/xC9J/OqzJFsV1jeOS6Bwl8W7vkeQIBqwiON9dTALws+rX/XPMQqWerDQ==", + "requires": { + "typpy": "^2.0.0" + } + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -2685,12 +4867,74 @@ "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==" + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, + "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" + } + }, + "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-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -2713,6 +4957,11 @@ "brace-expansion": "^1.1.7" } }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -2751,11 +5000,54 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node-status-codes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", + "integrity": "sha512-1cBMgRxdMWE8KeWCqk2RIOrvUb0XCwYfEsY5/y2NlXyq4Y/RumnOZvTj4Nbr77+Vb2C+kyBoRTdkNOS8L3d/aQ==" + }, + "noop6": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/noop6/-/noop6-1.0.9.tgz", + "integrity": "sha512-DB3Hwyd89dPr5HqEPg3YHjzvwh/mCqizC1zZ8vyofqc+TQRyPDnT4wgXXbLGF4z9YAzwwTLi8pNLhGqcbSjgkA==" + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "oargv": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/oargv/-/oargv-3.4.10.tgz", + "integrity": "sha512-SXaMANv9sr7S/dP0vj0+Ybipa47UE1ntTWQ2rpPRhC6Bsvfl+Jg03Xif7jfL0sWKOYWK8oPjcZ5eJ82t8AP/8g==", + "requires": { + "iterate-object": "^1.1.0", + "ul": "^5.0.0" + } + }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, + "obj-def": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/obj-def/-/obj-def-1.0.9.tgz", + "integrity": "sha512-bQ4ya3VYD6FAA1+s6mEhaURRHSmw4+sKaXE6UyXZ1XDYc5D+c7look25dFdydmLd18epUegh398gdDkMUZI9xg==", + "requires": { + "deffy": "^2.2.2" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2765,6 +5057,15 @@ "wrappy": "1" } }, + "one-by-one": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/one-by-one/-/one-by-one-3.2.8.tgz", + "integrity": "sha512-HR/pSzZdm46Xqj58K+Bu64kMbSTw8/u77AwWvV+rprO/OsuR++pPlkUJn+SmwqBGRgHKwSKQ974V3uls7crIeQ==", + "requires": { + "obj-def": "^1.0.0", + "sliced": "^1.0.1" + } + }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -2802,6 +5103,35 @@ "p-limit": "^3.0.2" } }, + "package-json": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz", + "integrity": "sha512-PRg65iXMTt/uK8Rfh5zvzkUbfAPitF17YaCY+IbHsYgksiLvtzWWTUildHth3mVaZ7871OJ7gtP4LBRBlmAdXg==", + "requires": { + "got": "^5.0.0", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + } + }, + "package-json-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/package-json-path/-/package-json-path-1.0.9.tgz", + "integrity": "sha512-uNu7f6Ef7tQHZRnkyVnCtzdSYVN9uBtge/sG7wzcUaawFWkPYUq67iXxRGrQSg/q0tzxIB8jSyIYUKjG2Jn//A==", + "requires": { + "abs": "^1.2.1" + } + }, + "package.json": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/package.json/-/package.json-2.0.1.tgz", + "integrity": "sha512-pSxZ6XR5yEawRN2ekxx9IKgPN5uNAYco7MCPxtBEWMKO3UKWa1X2CtQMzMgloeGj2g2o6cue3Sb5iPkByIJqlw==", + "requires": { + "git-package-json": "^1.4.0", + "git-source": "^1.1.0", + "package-json": "^2.3.1" + } + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -2811,6 +5141,30 @@ "callsites": "^3.0.0" } }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-url": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-1.3.11.tgz", + "integrity": "sha512-1wj9nkgH/5EboDxLwaTMGJh3oH3f+Gue+aGdh631oCqoSBpokzmMmOldvOeBPtB8GJBYJbaF93KPzlkU+Y1ksg==", + "requires": { + "is-ssh": "^1.3.0", + "protocols": "^1.4.0" + }, + "dependencies": { + "protocols": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz", + "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==" + } + } + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -2829,22 +5183,76 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "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==" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "requires": { + "pinkie": "^2.0.0" + } + }, "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 }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==" + }, + "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==" }, + "protocols": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", + "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==" + }, + "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 +5268,63 @@ "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 }, + "r-json": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/r-json/-/r-json-1.2.10.tgz", + "integrity": "sha512-hu9vyLjSlHXT62NAS7DjI9WazDlvjN0lgp3n431dCVnirVcLkZIpzSwA3orhZEKzdDD2jqNYI+w0yG0aFf4kpA==" + }, + "r-package-json": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/r-package-json/-/r-package-json-1.0.9.tgz", + "integrity": "sha512-G4Vpf1KImWmmPFGdtWQTU0L9zk0SjqEC4qs/jE7AQ+Ylmr5kizMzGeC4wnHp5+ijPqNN+2ZPpvyjVNdN1CDVcg==", + "requires": { + "package-json-path": "^1.0.0", + "r-json": "^1.2.1" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" + } + } + }, + "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==" + }, + "read-all-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", + "integrity": "sha512-DI1drPHbmBcUDWrJ7ull/F2Qb8HkwBncVx8/RpKYFSIACYaVRQReISYPdZz/mt1y1+qMCOrfReTopERmaxtP6w==", + "requires": { + "pinkie-promise": "^2.0.0", + "readable-stream": "^2.0.0" + } + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -2880,12 +5339,49 @@ "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", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, + "registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", + "requires": { + "rc": "^1.0.1" + } + }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -2922,15 +5418,45 @@ "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": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, "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 +5491,11 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2980,6 +5511,44 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA==" + }, + "spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==" + }, "sshpk": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", @@ -2996,6 +5565,21 @@ "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==" + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3019,21 +5603,39 @@ "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" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "timed-out": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz", + "integrity": "sha512-pqqJOi1rF5zNs/ps4vmbE4SFCrM4iR7LW+GHAsHqO/EumqbIWceioevYLM5xZRgQSH6gFgL9J/uB7EcJhQ9niQ==" + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -3042,13 +5644,32 @@ "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" + } + }, + "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": { @@ -3084,6 +5705,38 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, + "typpy": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/typpy/-/typpy-2.3.13.tgz", + "integrity": "sha512-vOxIcQz9sxHi+rT09SJ5aDgVgrPppQjwnnayTrMye1ODaU8gIZTDM19t9TxmEElbMihx2Nq/0/b/MtyKfayRqA==", + "requires": { + "function.name": "^1.0.3" + } + }, + "ul": { + "version": "5.2.15", + "resolved": "https://registry.npmjs.org/ul/-/ul-5.2.15.tgz", + "integrity": "sha512-svLEUy8xSCip5IWnsRa0UOg+2zP0Wsj4qlbjTmX6GJSmvKMHADBuHOm1dpNkWqWPIGuVSqzUkV3Cris5JrlTRQ==", + "requires": { + "deffy": "^2.2.2", + "typpy": "^2.3.4" + } + }, + "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==" + }, + "unzip-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", + "integrity": "sha512-pwCcjjhEcpW45JZIySExBHYv5Y9EeL2OIGEfrSKp2dMUFGFv4CpvZkwJbVge8OvGH2BNNtJBx67DuKuJhf+N5Q==" + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -3092,6 +5745,23 @@ "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" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", + "requires": { + "prepend-http": "^1.0.1" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -3102,6 +5772,15 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -3129,9 +5808,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 +5819,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..1309893411 100644 --- a/functions/sample/nodejs/package.json +++ b/functions/sample/nodejs/package.json @@ -4,7 +4,7 @@ "description": "", "main": "index.js", "scripts": { - "start": "node sample.js", + "start": "node index.js", "test": "echo \"Error: no test specified\" && exit 1", "lint": "npx eslint . --ext .js --ignore-pattern node_modules/" }, @@ -12,7 +12,8 @@ "author": "", "license": "ISC", "dependencies": { - "@cloudant/cloudant": "^4.4.0" + "@ibm-cloud/cloudant": "^0.7.2", + "package.json": "^2.0.1" }, "devDependencies": { "eslint": "^8.27.0" diff --git a/functions/sample/python/__init__.py b/functions/sample/python/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/functions/sample/python/main.py b/functions/sample/python/main.py index a88499515c..46cc536c0a 100644 --- a/functions/sample/python/main.py +++ b/functions/sample/python/main.py @@ -3,11 +3,10 @@ Returns: List: List of reviews for the given dealership """ -from cloudant.client import Cloudant -from cloudant.error import CloudantException +from cloudant import Cloudant +from flask_apiexceptions import ApiException import requests - def main(param_dict): """Main Function @@ -20,12 +19,12 @@ def main(param_dict): try: client = Cloudant.iam( - account_name=param_dict["COUCH_USERNAME"], - api_key=param_dict["IAM_API_KEY"], + account_name="e5c1f382-d6e3-4c53-b67f-a2e45ce95497-bluemix", + api_key="u8v-rk2sni64qWz9lvYJLcbSw6NqgS27ijwCR4oVHhXu", connect=True, ) print(f"Databases: {client.all_dbs()}") - except CloudantException as cloudant_exception: + except ApiException as cloudant_exception: print("unable to connect") return {"error": cloudant_exception} except (requests.exceptions.RequestException, ConnectionResetError) as err: diff --git a/functions/sample/python/requirements.txt b/functions/sample/python/requirements.txt index 9ab61720bd..f923df912f 100644 --- a/functions/sample/python/requirements.txt +++ b/functions/sample/python/requirements.txt @@ -1,12 +1,13 @@ -certifi==2021.5.30 -charset-normalizer==2.0.4 -ibm-cloud-sdk-core==3.10.0 -ibmcloudant==0.0.34 -idna==3.2 -jproperties==2.1.1 -PyJWT==2.1.0 -python-dateutil==2.8.2 -requests==2.26.0 -six==1.16.0 -urllib3==1.26.6 -websocket-client==1.1.0 +certifi +charset-normalizer +ibm-cloud-sdk-core +cloudant +idna +jproperties +PyJWT +python-dateutil +requests +six +urllib3 +websocket-client +flask_apiexceptions diff --git a/server/db.sqlite3 b/server/db.sqlite3 index 22720d5dd66176725006b4ede9de707ea4f19d9e..2e2a4cc57f8d052f0d816d3ccfa4942cc94436cc 100644 GIT binary patch delta 434 zcmajbElW z)lz)3_*1bW3I&Lf0KxNXd|x;Ta1>Bj3Mop*SSxddYpxrAhesYqh{M|R-`scWG!tVXnD-mtr)4Pjhy;{sRq-@Ug8?I z=SbbMwuyXIG-*!@f{_&uIyiQnjCU)2M?ZuL7=p;ml!4EXqz~0v&*yh5i5FG+9lqf@ zY`AUil_ly~gh=^mptp1ki%{SJ;Gy`-4vWIo`Ryt9{+weE3u|k0Rqj8pv$w~Ww@2>N M&iz?ke|&MP-_f0n(EtDd delta 434 zcmajbJx{_w0LJk&E^Y<~7fp0YS7#tj& z9E^i84154ThLaz{S&eaXaD9e<^8BXL<>_?!dYut(Hg*~DT#HL>7nuXE4B6 zn5}tttG_D}K{kUhj%w%LI)i7!kDY2j}3*oW<4DAt(M8xE8gzN64haj>}N9d?%4iF#sDkn81)3h|!$h-czP7h>T zlJnYrT=I0ck=1Rs#k`2q1tc&9Z5Te(Zjg5QlTKtNROPF;5MiR<^g7ROUag%eUvn Q+cWb~N&QLPzJD^CUufEmApigX From d443caf0df801e3ef8f52e86da54908113f3b540 Mon Sep 17 00:00:00 2001 From: Ankit Tehlan Date: Tue, 14 Nov 2023 13:04:45 +0530 Subject: [PATCH 05/14] Add functions for dealership and review --- functions/get-dealership.js | 63 ++++++++++++++++++++++++++++++++ functions/reviews.py | 72 +++++++++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 functions/get-dealership.js create mode 100644 functions/reviews.py diff --git a/functions/get-dealership.js b/functions/get-dealership.js new file mode 100644 index 0000000000..62ae402749 --- /dev/null +++ b/functions/get-dealership.js @@ -0,0 +1,63 @@ +const express = require('express'); +const app = express(); +const port = process.env.PORT || 3000; +const Cloudant = require('@cloudant/cloudant'); + +// Initialize Cloudant connection with IAM authentication +async function dbCloudantConnect() { + try { + const cloudant = Cloudant({ + plugins: { iamauth: { iamApiKey: 'u8v-rk2sni64qWz9lvYJLcbSw6NqgS27ijwCR4oVHhXu' } }, // Replace with your IAM API key + url: 'https://e5c1f382-d6e3-4c53-b67f-a2e45ce95497-bluemix.cloudantnosqldb.appdomain.cloud', // Replace with your Cloudant URL + }); + + const db = cloudant.use('dealerships'); + console.info('Connect success! Connected to DB'); + return db; + } catch (err) { + console.error('Connect failure: ' + err.message + ' for Cloudant DB'); + throw err; + } +} + +let db; + +(async () => { + db = await dbCloudantConnect(); +})(); + +app.use(express.json()); + +// Define a route to get all dealerships with optional state and ID filters +app.get('/dealerships/get', (req, res) => { + const { state, id } = req.query; + + // Create a selector object based on query parameters + const selector = {}; + if (state) { + selector.state = state; + } + + if (id) { + selector.id = parseInt(id); // Filter by "id" with a value of 1 + } + + const queryOptions = { + selector, + limit: 10, // Limit the number of documents returned to 10 + }; + + db.find(queryOptions, (err, body) => { + if (err) { + console.error('Error fetching dealerships:', err); + res.status(500).json({ error: 'An error occurred while fetching dealerships.' }); + } else { + const dealerships = body.docs; + res.json(dealerships); + } + }); +}); + +app.listen(port, () => { + console.log(`Server is running on port ${port}`); +}); \ No newline at end of file diff --git a/functions/reviews.py b/functions/reviews.py new file mode 100644 index 0000000000..908aa828d4 --- /dev/null +++ b/functions/reviews.py @@ -0,0 +1,72 @@ +from cloudant.client import Cloudant +from cloudant.query import Query +from flask import Flask, jsonify, request +import atexit + +#Add your Cloudant service credentials here +cloudant_username = 'e5c1f382-d6e3-4c53-b67f-a2e45ce95497-bluemix' +cloudant_api_key = 'u8v-rk2sni64qWz9lvYJLcbSw6NqgS27ijwCR4oVHhXu' +cloudant_url = 'https://e5c1f382-d6e3-4c53-b67f-a2e45ce95497-bluemix.cloudantnosqldb.appdomain.cloud' +client = Cloudant.iam(cloudant_username, cloudant_api_key, connect=True, url=cloudant_url) + +session = client.session() +print('Databases:', client.all_dbs()) + +db = client['reviews'] + +app = Flask(__name__) + +@app.route('/api/get_reviews', methods=['GET']) +def get_reviews(): + dealership_id = request.args.get('id') + + # Check if "id" parameter is missing + if dealership_id is None: + return jsonify({"error": "Missing 'id' parameter in the URL"}), 400 + + # Convert the "id" parameter to an integer (assuming "id" should be an integer) + try: + dealership_id = int(dealership_id) + except ValueError: + return jsonify({"error": "'id' parameter must be an integer"}), 400 + + # Define the query based on the 'dealership' ID + selector = { + 'dealership': dealership_id + } + + # Execute the query using the query method + result = db.get_query_result(selector) + + # Create a list to store the documents + data_list = [] + + # Iterate through the results and add documents to the list + for doc in result: + data_list.append(doc) + + # Return the data as JSON + return jsonify(data_list) + + +@app.route('/api/post_review', methods=['POST']) +def post_review(): + if not request.json: + abort(400, description='Invalid JSON data') + + # Extract review data from the request JSON + review_data = request.json + + # Validate that the required fields are present in the review data + required_fields = ['id', 'name', 'dealership', 'review', 'purchase', 'purchase_date', 'car_make', 'car_model', 'car_year'] + for field in required_fields: + if field not in review_data: + abort(400, description=f'Missing required field: {field}') + + # Save the review data as a new document in the Cloudant database + db.create_document(review_data) + + return jsonify({"message": "Review posted successfully"}), 201 + +if __name__ == '__main__': + app.run(debug=True) \ No newline at end of file From 3bea3b87d28417a572580324e98c935c92002ac5 Mon Sep 17 00:00:00 2001 From: Ankit Tehlan Date: Fri, 17 Nov 2023 01:10:52 +0530 Subject: [PATCH 06/14] Add models --- server/db.sqlite3 | Bin 131072 -> 131072 bytes server/djangoapp/models.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/server/db.sqlite3 b/server/db.sqlite3 index 2e2a4cc57f8d052f0d816d3ccfa4942cc94436cc..4ac44afe57d9ae9183333a4b3cd2d6bc1002614f 100644 GIT binary patch delta 2614 zcmZ8iU5pb|6rS6;)0u8NbGzGiyKFl9|B0QtFz8WT|cx@m1Gz@PDau`p$sCHih+ss}EcQ&aSI z!sz$1^Hzz5lSMB%Z%yTk^z~%92QC?wML$WFdfI7e{(>Gz!K1Bt6vw7c47ZGU&Y#%M-g`qgd zpK*TD;K(23E@_Y-$Vu`MIkuiMb`v4a^94k2h9Wy8Il!l+%IeC2`TdRh>QbnW*Bp0s zx!T}3F79|s)yCn)<>keC4X_C2bBO(>1MBqegb|gYKX)>%lR&FVmm1D|I zWt03&z9V0fkI8S!C3zt9Pv~CgTIhUeCG<*YDEKINJ@{d8Dfn`5blnW!?~^v_0*5l= z5FJ%L%^|S0G5?Xp>d|?-MB6Jh-F9@_(c`e2&iNtR>Poe}@3;s8aI{?^hZzQ?{Hd9%F9nbEheLnLxMqocPF1P~P3|E1}8E`oComo}v z2U{Bx=!Mz17zR66!1Vjsv`E07C}aBj?3k#yc64rRLIyi)Vq09N2W$EfIwWrN`4CV6^hE-hvIT<6=lbTb_QCo{p@;ac6(3I@K;+9@NkSU#3>tC`wq1E90^ z%8D$o&rQ9X=w{!c`Wy~E|eT>+p%?;Nr4Imu>FFoE8=91dF!0)qXOFqGozsY@a3+C%GIZcj| zePkEeLPkk=v+|$vQ29yuO1Yw(SDH#qnTLtns^pZI{6u~z|14jZugGWR6Y!Ool&Q8? zXi6-{p6QAVFvyL<25f*GE!cvX-_HbMmTG52!f}iy5Oy=|;Kae*fE`@1>)J#; zqbEl&8bdsb-I|~fJCAoGx6q)2x^Y`*ACvDHzyJ&B9XE;n*tgJhK5VT)5FOZ!*+Ts+ zre|V=ejLak=d$5BfZoIr9LS>9Jv$iBu&!vp^AQ|K2iWBTi3jBBgJ2km>-}qw$+=y^ zr5oX^H*i?u!qDs-*VlvdI+>>89WzYoWDz=l4|#*UMqVY;(9%y8L*NmTbhc`29bv0# zukbY3Yl5xAY~8TF`rDZY@R07|$e-jFa)W$MJ|<`21>Xblrb#>^VNOlBExzpjPlz8} zyp57gKjvaF`(?I!O%}k5+n&=i7~GWYc5b|%$6Q?XJgqSw<}}swhT2bS6ak#@z)&dr UX?4qDTi=j7=wEFeuRS6E13#$8-~a#s delta 2870 zcmai0TWlj&8J@AncD(h>$#or?IJVa@NowrO{o=Be$pxo&Y{%Ion^cHoVoz)*@g2WXJ?q2&P(LIMGOSXF?Qi~7>?0E>9w1tD=};>2+lsUyq& z{_mXm&VM_{=k&Di^tA6gW9Zy#^}c{n9-(-6JTFoFL)g zO~eZ72>2U#4BiKI@DRKUnr8z$J0LoQnFFX&tLC=LYNe1rKF*hlqqyDd?K8-1rBo{; z2r_6l%-XS9fz}Xy!|XnPOJ__@vzbA)pE`z6tM+)7?6-o42>1v1HTWa=33wYkgiAGm z_O+LW+tzW+??cn2VpT0xtF5wnd<9!@Y-Gfc)m1S98*v(z;e>ez8}S-u*HO~|=5*PO zL>-p0P_fd&p?jl_9Rxf9?}1mrE(ik$@n_=4#2Z9~NIXx3h(Y|H_;2wa;`i}2+~@eW zY6LKUf}{$02t4F(s3^dXqc_!bJWe^z@Z;Sz7?bt2pdcnX{37qC{} z1@}P#+yxQ90x#$XDDjl|6Y(435%E3ZK2apTN<;{naKkcvg0}}T)Q?(?kdM{#o*l-} z8Pu9l57nx=-65UlWICr5vzO$}0Sxt_Rz2>{w2_+_8bmFI+?9459>q`!wR9w}3=Fl; zM>@J!Mg~VPG=N%k?JMj6z)&~Zt$DxU0oD=L3lGkjj-bvE1ctiM%ZlUu80tkYirj{q z(qZJl+z~N~_S`wuQ8B0+#?sv)+YJXzMyTC=)aS&|S=7|g>hiX8z9ZP>+g2m7COytB zYZ=7sQ>Y<*u^X{r%pO2Hx)-F`AUmQLq^TdX`{7p3Y+o??PBsy*BS3~hoUG@HRKC0!QyQX>Epbb;8<7QNw=D-$VQVgNLg!cGmBdks zDT%4{b#KKm$AoB6U}#Dy9^|WruU!;slqv^b&K8vXVJKZHTn&N=(+rFw#7Z13@%nx> zflm?eDfriUG0vPjAAwQ38J^L4fF|7RwReTzJH`6@Q1Ac&4~Puhw3|fx>pqhu{*856 z5sONmW^;L=Q5QM(pj_F{Y=0%qMY8G4x~c|6 zrjy>J1F}b?J z??>mBgmsyVjJcsiIiCC99%P*)NOfMuWJ_x)&BDBzrt$*Y>&T#KY(9>55QaC0bI2X+Cx?hagBA3=Ht%qm<2=p zzAIwsRmFCak`$lHz55m1&{0>qW^Kj i*8La(AA_GmpB{nR6J{B`%-k~tGr7#N{c`x3#QqP(^#t?) diff --git a/server/djangoapp/models.py b/server/djangoapp/models.py index 27d96f4eff..543a0c9b0f 100644 --- a/server/djangoapp/models.py +++ b/server/djangoapp/models.py @@ -10,6 +10,14 @@ # - Any other fields you would like to include in car make model # - __str__ method to print a car make object +class CarMake(models.Model): + id = models.AutoField(primary_key=True) + name = models.CharField(null=False, max_length=20) + description = models.CharField(null=False, max_length=50) + + def __str__(self): + return self.name + # 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) @@ -20,6 +28,27 @@ # - Any other fields you would like to include in car model # - __str__ method to print a car make object +class CarModel(models.Model): + id = models.AutoField(primary_key=True) + make = models.ForeignKey(CarMake, null=False, on_delete=models.CASCADE) + name = models.CharField(null=False, max_length=20) + dealer_id = models.CharField(null=False, max_length=20) + + SEDAN = 'sedan' + SUV = 'suv' + WAGON = 'wagon' + CAR_TYPES = [ + (SEDAN, 'Sedan'), + (SUV, 'SUV'), + (WAGON, 'Wagon') + ] + + type = models.CharField(null=False, choices=CAR_TYPES, max_length=20) + year = models.DateField(null=False) + + def __str__(self): + return self.name + " (" + self.type + ")" + # Create a plain Python class `CarDealer` to hold dealer data From 33924089135fa7f32b43f8ab0cfe07d622db5293 Mon Sep 17 00:00:00 2001 From: Ankit Tehlan Date: Sat, 18 Nov 2023 17:20:00 +0530 Subject: [PATCH 07/14] Add models to admin site --- server/db.sqlite3 | Bin 131072 -> 143360 bytes server/djangoapp/admin.py | 27 +++++++++++++++++++++++++++ server/djangoapp/models.py | 8 ++++---- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/server/db.sqlite3 b/server/db.sqlite3 index 4ac44afe57d9ae9183333a4b3cd2d6bc1002614f..47cfd7e8704ea74fbc899b2270a25dd2c414b718 100644 GIT binary patch delta 4570 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 diff --git a/server/djangoapp/admin.py b/server/djangoapp/admin.py index b1039e16b8..ab3c76ec41 100644 --- a/server/djangoapp/admin.py +++ b/server/djangoapp/admin.py @@ -1,5 +1,32 @@ 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 = 2 + + +# CarModelAdmin class +class CarModelAdmin(admin.ModelAdmin): + list_display = ('name', 'type', 'year') + list_filter = ['year'] + search_fields = ['name', 'type'] + + +# CarMakeAdmin class with CarModelInline +class CarMakeAdmin(admin.ModelAdmin): + inlines = [CarModelInline] + list_display = ('name', 'description') + + +# Register models here +admin.site.register(CarMake, CarMakeAdmin) +admin.site.register(CarModel, CarModelAdmin) # Register your models here. diff --git a/server/djangoapp/models.py b/server/djangoapp/models.py index 543a0c9b0f..afa27b9a9c 100644 --- a/server/djangoapp/models.py +++ b/server/djangoapp/models.py @@ -11,7 +11,7 @@ # - __str__ method to print a car make object class CarMake(models.Model): - id = models.AutoField(primary_key=True) + id = models.IntegerField(default=1, primary_key=True) name = models.CharField(null=False, max_length=20) description = models.CharField(null=False, max_length=50) @@ -29,7 +29,7 @@ def __str__(self): # - __str__ method to print a car make object class CarModel(models.Model): - id = models.AutoField(primary_key=True) + id = models.IntegerField(default=1, primary_key=True) make = models.ForeignKey(CarMake, null=False, on_delete=models.CASCADE) name = models.CharField(null=False, max_length=20) dealer_id = models.CharField(null=False, max_length=20) @@ -43,8 +43,8 @@ class CarModel(models.Model): (WAGON, 'Wagon') ] - type = models.CharField(null=False, choices=CAR_TYPES, max_length=20) - year = models.DateField(null=False) + type = models.CharField(null=False, choices=CAR_TYPES, max_length=20, default=SEDAN) + year = models.DateField(null=False, default=now) def __str__(self): return self.name + " (" + self.type + ")" From 5d9eecbc4bb28b5d69d60fcb630726a49dbc1b69 Mon Sep 17 00:00:00 2001 From: Ankit Tehlan Date: Mon, 20 Nov 2023 11:51:02 +0530 Subject: [PATCH 08/14] Add django proxy service for cloud functions --- server/djangoapp/__init__.py | 0 server/djangoapp/models.py | 24 +++++++++++++++++++++ server/djangoapp/restapis.py | 37 ++++++++++++++++++++++++++++++++ server/djangoapp/urls.py | 4 ++-- server/djangoapp/views.py | 11 ++++++++-- server/djangobackend/__init__.py | 0 6 files changed, 72 insertions(+), 4 deletions(-) delete mode 100644 server/djangoapp/__init__.py delete mode 100644 server/djangobackend/__init__.py diff --git a/server/djangoapp/__init__.py b/server/djangoapp/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/server/djangoapp/models.py b/server/djangoapp/models.py index afa27b9a9c..120a2b0512 100644 --- a/server/djangoapp/models.py +++ b/server/djangoapp/models.py @@ -52,5 +52,29 @@ 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): + # Dealer address + self.address = address + # Dealer city + self.city = city + # Dealer Full Name + self.full_name = full_name + # Dealer id + self.id = id + # Location lat + self.lat = lat + # Location long + self.long = long + # Dealer short name + self.short_name = short_name + # Dealer state + self.st = st + # Dealer zip + 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..70ccae51e5 100644 --- a/server/djangoapp/restapis.py +++ b/server/djangoapp/restapis.py @@ -3,11 +3,28 @@ # import related models here from requests.auth import HTTPBasicAuth +from .models import CarDealer + # 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("GET from {} ".format(url)) + try: + # Call get method of requests library with URL and parameters + response = requests.get(url, headers={'Content-Type': 'application/json'}, + params=kwargs) + except: + # If any error occurs + print("Network exception occurred") + status_code = response.status_code + print("With status {} ".format(status_code)) + json_data = json.loads(response.text) + return json_data + # Create a `post_request` to make HTTP POST requests # e.g., response = requests.post(url, params=kwargs, json=payload) @@ -17,6 +34,26 @@ # def get_dealers_from_cf(url, **kwargs): # - Call get_request() with specified arguments # - Parse JSON results into a CarDealer object list +def get_dealers_from_cf(url, **kwargs): + results = [] + # Call get_request with a URL parameter + json_result = get_request(url) + print(json_result) + if json_result: + # Get the row list in JSON as dealers + dealers = json_result["rows"] + # For each dealer object + for dealer in dealers: + # Get its content in `doc` object + dealer_doc = dealer["doc"] + # Create a CarDealer object with values in `doc` object + 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 diff --git a/server/djangoapp/urls.py b/server/djangoapp/urls.py index 3729f3d543..8e055f5fb6 100644 --- a/server/djangoapp/urls.py +++ b/server/djangoapp/urls.py @@ -16,13 +16,13 @@ path(route='contact/', view=views.contact, name='contact'), # path for registration - path('registration/', views.registration_request, name='registration'), + path(route='registration/', view=views.registration_request, name='registration'), # path for login path(route='login/', view=views.login_request, name='login'), # path for logout - path('logout/', views.logout_request, name='logout'), + path(route='logout/', view=views.logout_request, name='logout'), path(route='', view=views.get_dealerships, name='index'), diff --git a/server/djangoapp/views.py b/server/djangoapp/views.py index 8f07d10aa5..35382f2c34 100644 --- a/server/djangoapp/views.py +++ b/server/djangoapp/views.py @@ -10,6 +10,8 @@ import logging import json +from djangoapp.restapis import get_dealers_from_cf + # Get an instance of a logger logger = logging.getLogger(__name__) @@ -83,9 +85,14 @@ def registration_request(request): # Update the `get_dealerships` view to render the index page with a list of dealerships def get_dealerships(request): - context = {} if request.method == "GET": - return render(request, 'djangoapp/index.html', context) + url = "https://ankitehlanwo-3000.theiadocker-0-labs-prod-theiak8s-4-tor01.proxy.cognitiveclass.ai/dealerships/get" + # Get dealers from the URL + dealerships = get_dealers_from_cf(url) + # Concat all dealer's short name + dealer_names = ' '.join([dealer.short_name for dealer in dealerships]) + # Return a list of dealer short name + return HttpResponse(dealer_names) # Create a `get_dealer_details` view to render the reviews of a dealer diff --git a/server/djangobackend/__init__.py b/server/djangobackend/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 From 643e5695f295fd8a4a042397d019a587e9b0e551 Mon Sep 17 00:00:00 2001 From: Ankit Tehlan Date: Mon, 20 Nov 2023 14:18:25 +0530 Subject: [PATCH 09/14] Add dealership context to index --- server/djangoapp/restapis.py | 22 ++++++++++++------- .../djangoapp/templates/djangoapp/index.html | 6 ++++- server/djangoapp/views.py | 2 +- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/server/djangoapp/restapis.py b/server/djangoapp/restapis.py index 70ccae51e5..048cf371f5 100644 --- a/server/djangoapp/restapis.py +++ b/server/djangoapp/restapis.py @@ -36,21 +36,27 @@ def get_request(url, **kwargs): # - Parse JSON results into a CarDealer object list def get_dealers_from_cf(url, **kwargs): results = [] - # Call get_request with a URL parameter - json_result = get_request(url) + state = kwargs.get("state") + if state: + json_result = get_request(url, state=state) + else: + json_result = get_request(url) + + # print('json_result from line 31', json_result) print(json_result) if json_result: # Get the row list in JSON as dealers - dealers = json_result["rows"] + dealers = json_result # For each dealer object for dealer in dealers: # Get its content in `doc` object - dealer_doc = dealer["doc"] + dealer_doc = dealer + print(dealer_doc) # Create a CarDealer object with values in `doc` object - 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"]) + dealer_obj = CarDealer(address=dealer_doc["address"], city=dealer_doc["city"], + id=dealer_doc["id"], lat=dealer_doc["lat"], long=dealer_doc["long"], full_name=dealer_doc["full_name"], + + st=dealer_doc["st"], zip=dealer_doc["zip"], short_name=dealer_doc["short_name"]) results.append(dealer_obj) return results diff --git a/server/djangoapp/templates/djangoapp/index.html b/server/djangoapp/templates/djangoapp/index.html index 910e060d10..48f6b81378 100644 --- a/server/djangoapp/templates/djangoapp/index.html +++ b/server/djangoapp/templates/djangoapp/index.html @@ -3,5 +3,9 @@ {% block content %} -
    Dealer table
    +{% for i in dealerships %} +
    + {{ i }} +
    +{% endfor %} {% endblock content %} diff --git a/server/djangoapp/views.py b/server/djangoapp/views.py index 35382f2c34..45e8645306 100644 --- a/server/djangoapp/views.py +++ b/server/djangoapp/views.py @@ -92,7 +92,7 @@ def get_dealerships(request): # Concat all dealer's short name dealer_names = ' '.join([dealer.short_name for dealer in dealerships]) # Return a list of dealer short name - return HttpResponse(dealer_names) + return render(request, 'djangoapp/index.html', {'dealerships':dealerships}) # Create a `get_dealer_details` view to render the reviews of a dealer From 078c4bbc4f41b524a30a4250b030507c819c4d94 Mon Sep 17 00:00:00 2001 From: Ankit Tehlan Date: Mon, 20 Nov 2023 19:06:08 +0530 Subject: [PATCH 10/14] Index view update --- .../djangoapp/templates/djangoapp/index.html | 41 ++++++++++++++++--- server/djangoapp/views.py | 2 +- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/server/djangoapp/templates/djangoapp/index.html b/server/djangoapp/templates/djangoapp/index.html index 48f6b81378..058ee0e073 100644 --- a/server/djangoapp/templates/djangoapp/index.html +++ b/server/djangoapp/templates/djangoapp/index.html @@ -2,10 +2,39 @@ {% extends 'base.html'%} {% block content %} - -{% for i in dealerships %} -
    - {{ i }} -
    -{% endfor %} + + + + + + + + + + + + + + {% for dealer in dealerships %} + + + + + + + + + {% endfor %} + +
    IDDealer NameCityAddressZipState
    {{ dealer.id }}{{ dealer.full_name }}{{ dealer.city }}{{ dealer.address }}{{ dealer.zip }}{{ dealer.st }}
    + + + + + + {% endblock content %} diff --git a/server/djangoapp/views.py b/server/djangoapp/views.py index 45e8645306..aeafdc8fe5 100644 --- a/server/djangoapp/views.py +++ b/server/djangoapp/views.py @@ -86,7 +86,7 @@ def registration_request(request): # Update the `get_dealerships` view to render the index page with a list of dealerships def get_dealerships(request): if request.method == "GET": - url = "https://ankitehlanwo-3000.theiadocker-0-labs-prod-theiak8s-4-tor01.proxy.cognitiveclass.ai/dealerships/get" + url = "https://ankitehlanwo-3000.theiadocker-1-labs-prod-theiak8s-4-tor01.proxy.cognitiveclass.ai/dealerships/get" # Get dealers from the URL dealerships = get_dealers_from_cf(url) # Concat all dealer's short name From 78f413c35f00724ca10fa13322ba733be53dd4c2 Mon Sep 17 00:00:00 2001 From: Ankit Tehlan Date: Tue, 21 Nov 2023 11:04:11 +0530 Subject: [PATCH 11/14] Add get review and add review views and restapis --- server/djangoapp/models.py | 22 ++++ server/djangoapp/restapis.py | 115 +++++++++++++++++- .../templates/djangoapp/add_review.html | 60 ++++++--- .../templates/djangoapp/dealer_details.html | 55 ++++++--- .../djangoapp/templates/djangoapp/index.html | 2 +- server/djangoapp/urls.py | 3 +- server/djangoapp/views.py | 53 +++++++- 7 files changed, 276 insertions(+), 34 deletions(-) diff --git a/server/djangoapp/models.py b/server/djangoapp/models.py index 120a2b0512..c466b59d43 100644 --- a/server/djangoapp/models.py +++ b/server/djangoapp/models.py @@ -1,3 +1,4 @@ +import json from django.db import models from django.utils.timezone import now @@ -78,3 +79,24 @@ def __str__(self): # Create a plain Python class `DealerReview` to hold review data + +class DealerReview: + def __init__(self, dealership, name, purchase, review): + + self.dealership = dealership + self.name = name + self.purchase = purchase + self.review = review + self.purchase_date = "" + self.car_make = "" + self.car_model = "" + self.car_year = "" + self.sentiment = "" + self.id = "" + + def __str__(self): + return "Reviews: " + self.review + + def to_json(self): + return json.dumps(self, default=lambda o: o.__dict__, + sort_keys=True, indent=4) diff --git a/server/djangoapp/restapis.py b/server/djangoapp/restapis.py index 048cf371f5..dc29290dd8 100644 --- a/server/djangoapp/restapis.py +++ b/server/djangoapp/restapis.py @@ -3,7 +3,11 @@ # import related models here from requests.auth import HTTPBasicAuth -from .models import CarDealer +from .models import CarDealer, DealerReview +from ibm_cloud_sdk_core.authenticators import IAMAuthenticator +from ibm_watson import NaturalLanguageUnderstandingV1 +from ibm_watson.natural_language_understanding_v1 import Features,SentimentOptions +import time # Create a `get_request` to make HTTP GET requests @@ -29,6 +33,16 @@ def get_request(url, **kwargs): # Create a `post_request` to make HTTP POST requests # e.g., response = requests.post(url, params=kwargs, json=payload) +def post_request(url, payload, **kwargs): + print(kwargs) + print("POST to {} ".format(url)) + print(payload) + response = requests.post(url, params=kwargs, json=payload) + status_code = response.status_code + print("With status {} ".format(status_code)) + json_data = json.loads(response.text) + return json_data + # Create a get_dealers_from_cf method to get dealers from a cloud function # def get_dealers_from_cf(url, **kwargs): @@ -73,5 +87,104 @@ def get_dealers_from_cf(url, **kwargs): # - Call get_request() with specified arguments # - Get the returned sentiment label such as Positive or Negative +def get_dealer_by_id_from_cf(url, id): + json_result = get_request(url, id=id) + print(json_result) + if json_result: + dealers = json_result + dealer_doc = dealers[0] + print("\n\n~~~~~~~~~Dealer Doc~~~~~~~~\n\n") + print(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"] + ) + return dealer_obj + +def get_dealers_by_st_from_cf(url, state): + results = [] + json_result = get_request(url, st=state) + if json_result: + dealers = json_result + for dealer_doc in dealers: + 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 + +def get_dealer_reviews_from_cf(url, **kwargs): + results = [] + id = kwargs.get("id") + if id: + json_result = get_request(url, id=id) + else: + json_result = get_request(url) + + if json_result: + print("\n\n~~~~~~Review by dealer id~~~~~~~\n\n",json_result) + reviews = json_result + + for dealer_review in reviews: + + review_obj = DealerReview(dealership=dealer_review["dealership"], + name=dealer_review["name"], + purchase=dealer_review["purchase"], + review=dealer_review["review"]) + if "id" in dealer_review: + review_obj.id = dealer_review["id"] + if "purchase_date" in dealer_review: + review_obj.purchase_date = dealer_review["purchase_date"] + if "car_make" in dealer_review: + review_obj.car_make = dealer_review["car_make"] + if "car_model" in dealer_review: + review_obj.car_model = dealer_review["car_model"] + if "car_year" in dealer_review: + review_obj.car_year = dealer_review["car_year"] + + # sentiment = analyze_review_sentiments(review_obj.review) + # print(sentiment) + review_obj.sentiment = analyze_review_sentiments(review_obj.review) + # review_obj.sentiment = sentiment + results.append(review_obj) + return results +# natural_language_understanding.set_service_url(url) + # response = natural_language_understanding.analyze( text=text+"hello hello hello",features=Features(sentiment=SentimentOptions(targets=[text+"hello hello hello"]))).get_result() + # label=json.dumps(response, indent=2) + # label = response['sentiment']['document']['label'] + + # return(label) + +def analyze_review_sentiments(text): + url = "https://api.eu-gb.natural-language-understanding.watson.cloud.ibm.com/instances/9f4f74d0-c3af-4933-9d5a-b88a97d0de1e" + api_key = "jZtEBcSkOeJopHdWLBLMV-yf7-BiFvHJyAKLCmPciSYk" + authenticator = IAMAuthenticator(api_key) + natural_language_understanding = NaturalLanguageUnderstandingV1(version='2022-08-01',authenticator=authenticator) + try: + response = natural_language_understanding.analyze( + text=text, + features=Features(sentiment=SentimentOptions(targets=[text])) + ).get_result() + label = response['sentiment']['document']['label'] + except Exception as e: + print("Exception occurred during sentiment analysis:", str(e)) + label = "unknown" + + return label diff --git a/server/djangoapp/templates/djangoapp/add_review.html b/server/djangoapp/templates/djangoapp/add_review.html index 768ddf508c..10d0835f00 100644 --- a/server/djangoapp/templates/djangoapp/add_review.html +++ b/server/djangoapp/templates/djangoapp/add_review.html @@ -1,16 +1,46 @@ - - - - - {% load static %} - - - - - +{% extends 'base.html' %} - - - - - \ No newline at end of file +{% block content %} +
    + +
    + {% csrf_token %} +

    Add a review about {{ dealer.full_name }}

    +
    + +
    + + +
    + +
    + + + (select purchased car information below if checked) +
    + +
    + + + +
    + +
    + + +
    + + +
    +
    + + +{% endblock content %} diff --git a/server/djangoapp/templates/djangoapp/dealer_details.html b/server/djangoapp/templates/djangoapp/dealer_details.html index 25bd9a223d..5f0d98248c 100644 --- a/server/djangoapp/templates/djangoapp/dealer_details.html +++ b/server/djangoapp/templates/djangoapp/dealer_details.html @@ -1,18 +1,45 @@ - - - - - Dealership Review - {% load static %} - - +{% extends 'base.html' %} - +{% block content %} +
    + {% if messages %} + {% for message in messages %} + + {% endfor %} + {% endif %} - +

    Reviews for {{dealer.full_name}}

    + Add Review - +
    - - - \ No newline at end of file +
    +
    + {% for review in reviews %} +
    +
    + {% if review.sentiment == "positive" %} + Sentiment + {% elif review.sentiment == "negative" %} + Sentiment + {% else %} + Sentiment + {% endif %} +
    + {% if review.car_make%} +
    {{review.car_make}}, {{review.car_model}}
    +
    {{review.car_year}}
    +
    {{review.name}}
    + {% endif %} +

    {{review.review}}

    +
    +
    +
    + {% endfor %} +
    +
    +
    +{% endblock content %} diff --git a/server/djangoapp/templates/djangoapp/index.html b/server/djangoapp/templates/djangoapp/index.html index 058ee0e073..439800143f 100644 --- a/server/djangoapp/templates/djangoapp/index.html +++ b/server/djangoapp/templates/djangoapp/index.html @@ -18,7 +18,7 @@ {% for dealer in dealerships %} {{ dealer.id }} - {{ dealer.full_name }} + {{dealer.full_name}} {{ dealer.city }} {{ dealer.address }} {{ dealer.zip }} diff --git a/server/djangoapp/urls.py b/server/djangoapp/urls.py index 8e055f5fb6..62f4b33a85 100644 --- a/server/djangoapp/urls.py +++ b/server/djangoapp/urls.py @@ -27,7 +27,8 @@ path(route='', view=views.get_dealerships, name='index'), # path for dealer reviews view - + path('dealer//', views.get_dealer_details, name='dealer_details'), # path for add a review view + path('dealer//review', views.add_review, name='add_review'), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \ No newline at end of file diff --git a/server/djangoapp/views.py b/server/djangoapp/views.py index aeafdc8fe5..6cee1a68dd 100644 --- a/server/djangoapp/views.py +++ b/server/djangoapp/views.py @@ -2,8 +2,8 @@ from django.http import HttpResponseRedirect, HttpResponse from django.contrib.auth.models import User from django.shortcuts import get_object_or_404, render, redirect -# from .models import related models -# from .restapis import related methods +from .models import CarDealer, DealerReview, CarModel, CarMake +from .restapis import get_dealers_from_cf,get_dealer_reviews_from_cf,post_request, get_dealer_by_id_from_cf from django.contrib.auth import login, logout, authenticate from django.contrib import messages from datetime import datetime @@ -99,7 +99,56 @@ def get_dealerships(request): # def get_dealer_details(request, dealer_id): # ... +def get_dealer_details(request, id): + if request.method == "GET": + context = {} + url = "https://ankitehlanwo-3000.theiadocker-1-labs-prod-theiak8s-4-tor01.proxy.cognitiveclass.ai/dealerships/get" + dealer = get_dealer_by_id_from_cf(url, id) + context["dealer"] = dealer + + review_url = "https://ankitehlanwo-5000.theiadocker-1-labs-prod-theiak8s-4-tor01.proxy.cognitiveclass.ai/api/get_reviews" + reviews = get_dealer_reviews_from_cf(review_url, id=id) + print(reviews) + context["reviews"] = reviews + + return render(request, 'djangoapp/dealer_details.html', context) + # Create a `add_review` view to submit a review # def add_review(request, dealer_id): # ... +def add_review(request, id): + if request.user.is_authenticated: + context = {} + dealer_url = "https://ankitehlanwo-3000.theiadocker-1-labs-prod-theiak8s-4-tor01.proxy.cognitiveclass.ai/dealerships/get" + dealer = get_dealer_by_id_from_cf(dealer_url, id=id) + context["dealer"] = dealer + if request.method == "GET": + cars = CarModel.objects.all() + context["cars"] = cars + print(context) + return render(request, 'djangoapp/add_review.html', context) + + if request.method == "POST": + review = {} + review["name"] = request.user.first_name + " " + request.user.last_name + form = request.POST + review["dealership"] = id + review["review"] = form["content"] + if(form.get("purchasecheck") == "on"): + review["purchase"] = True + else: + review["purchase"] = False + if(review["purchase"]): + review["purchase_date"] = form["purchasedate"] + car = CarModel.objects.get(pk=form["car"]) + review["car_make"] = car.make.name + review["car_model"] = car.name + review["car_year"] = car.year + post_url = "https://ankitehlanwo-5000.theiadocker-1-labs-prod-theiak8s-4-tor01.proxy.cognitiveclass.ai/api/post_review" + json_payload = { "review": review } + post_request(post_url, json_payload, id=id) + return redirect("djangoapp:dealer_details", id=id) + else: + return redirect("/djangoapp/login") + From 4577ea028869fc1b41acda048c15661491e00651 Mon Sep 17 00:00:00 2001 From: Ankit Tehlan Date: Tue, 21 Nov 2023 11:40:17 +0530 Subject: [PATCH 12/14] Fix NLP sentiment response --- server/djangoapp/restapis.py | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/server/djangoapp/restapis.py b/server/djangoapp/restapis.py index dc29290dd8..414b768a3a 100644 --- a/server/djangoapp/restapis.py +++ b/server/djangoapp/restapis.py @@ -175,16 +175,10 @@ def get_dealer_reviews_from_cf(url, **kwargs): def analyze_review_sentiments(text): url = "https://api.eu-gb.natural-language-understanding.watson.cloud.ibm.com/instances/9f4f74d0-c3af-4933-9d5a-b88a97d0de1e" api_key = "jZtEBcSkOeJopHdWLBLMV-yf7-BiFvHJyAKLCmPciSYk" - authenticator = IAMAuthenticator(api_key) - natural_language_understanding = NaturalLanguageUnderstandingV1(version='2022-08-01',authenticator=authenticator) - try: - response = natural_language_understanding.analyze( - text=text, - features=Features(sentiment=SentimentOptions(targets=[text])) - ).get_result() - label = response['sentiment']['document']['label'] - except Exception as e: - print("Exception occurred during sentiment analysis:", str(e)) - label = "unknown" - + authenticator = IAMAuthenticator(api_key) + natural_language_understanding = NaturalLanguageUnderstandingV1(version='2021-08-01',authenticator=authenticator) + natural_language_understanding.set_service_url(url) + response = natural_language_understanding.analyze(text=text,features=Features(sentiment=SentimentOptions(targets=[text])),language="en").get_result() + label=json.dumps(response, indent=2) + label = response['sentiment']['document']['label'] return label From e24179f75a5f147b792f2664ad85a083ed949afe Mon Sep 17 00:00:00 2001 From: Ankit Tehlan Date: Tue, 21 Nov 2023 13:17:31 +0530 Subject: [PATCH 13/14] Fix add review --- server/db.sqlite3 | Bin 143360 -> 143360 bytes server/djangoapp/models.py | 31 +++--- server/djangoapp/restapis.py | 92 ++++++++++-------- .../templates/djangoapp/add_review.html | 7 +- server/djangoapp/views.py | 73 +++++++------- 5 files changed, 107 insertions(+), 96 deletions(-) diff --git a/server/db.sqlite3 b/server/db.sqlite3 index 47cfd7e8704ea74fbc899b2270a25dd2c414b718..6c7038582c781d3e40b14ded5593d1ac74257289 100644 GIT binary patch delta 288 zcmZp8z|ru4V}dlJ@kAMCM&peMvHFahllSSnaWL}#Vc`G6|9!LIhS&U}EX>h^F5=sfEXw5R0e);ehI!OeB1b{_1YUXlY$1&QJT@!N{J~csVPcU3e~l>u}lb8Dj1kq8Jbub TS?Zaan;MvyZNJXTq^Se|%coL` delta 202 zcmZp8z|ru4V}dlJ(L@<%Mx%`hvHFZ0llSSnaWDulFz|op|Grsp!)ty~7G_RHCI$uu z7G59$mO9RVe6ygzZvM%~{bgi Create a plain Python class `DealerReview` to hold review data class DealerReview: - def __init__(self, dealership, name, purchase, review): - - self.dealership = dealership - self.name = name - self.purchase = purchase - self.review = review - self.purchase_date = "" - self.car_make = "" - self.car_model = "" - self.car_year = "" - self.sentiment = "" - self.id = "" - + def __init__(self, dealership, purchase, purchase_date, name, review, car_make, car_model, car_year, id, sentiment): + self.dealership=dealership + self.purchase=purchase + self.purchase_date=purchase_date + self.name=name + self.review=review + self.car_make=car_make + self.car_model=car_model + self.car_year=car_year + self.id=id + self.sentiment=sentiment + def __str__(self): - return "Reviews: " + self.review - - def to_json(self): - return json.dumps(self, default=lambda o: o.__dict__, - sort_keys=True, indent=4) + return "Review: " + self.review diff --git a/server/djangoapp/restapis.py b/server/djangoapp/restapis.py index 414b768a3a..8a07e83b28 100644 --- a/server/djangoapp/restapis.py +++ b/server/djangoapp/restapis.py @@ -15,30 +15,44 @@ # auth=HTTPBasicAuth('apikey', api_key)) def get_request(url, **kwargs): - print(kwargs) + # If argument contain API KEY + api_key = kwargs.get("api_key") print("GET from {} ".format(url)) try: - # Call get method of requests library with URL and parameters - response = requests.get(url, headers={'Content-Type': 'application/json'}, + if api_key: + params = dict() + params["text"] = kwargs["text"] + params["version"] = kwargs["version"] + params["features"] = kwargs["features"] + params["return_analyzed_text"] = kwargs["return_analyzed_text"] + response = requests.get(url, params=params, headers={'Content-Type': 'application/json'}, + auth=HTTPBasicAuth('apikey', api_key)) + else: + # Call get method of requests library with URL and parameters + response = requests.get(url, headers={'Content-Type': 'application/json'}, params=kwargs) except: # If any error occurs print("Network exception occurred") + status_code = response.status_code print("With status {} ".format(status_code)) json_data = json.loads(response.text) + return json_data # Create a `post_request` to make HTTP POST requests # e.g., response = requests.post(url, params=kwargs, json=payload) -def post_request(url, payload, **kwargs): - print(kwargs) - print("POST to {} ".format(url)) - print(payload) - response = requests.post(url, params=kwargs, json=payload) - status_code = response.status_code +def post_request(url, json_payload, **kwargs): + print(json_payload) + print("POST from {} ".format(url)) + try: + response=requests.post(url, params=kwargs, json=json_payload) + except: + print("Network exception occurred") + status_code=response.status_code print("With status {} ".format(status_code)) json_data = json.loads(response.text) return json_data @@ -128,41 +142,41 @@ def get_dealers_by_st_from_cf(url, state): results.append(dealer_obj) return results -def get_dealer_reviews_from_cf(url, **kwargs): +def get_dealer_reviews_from_cf(url, id): results = [] - id = kwargs.get("id") - if id: - json_result = get_request(url, id=id) - else: - json_result = get_request(url) - + json_result=get_request(url, id=id) + print(json_result) if json_result: - print("\n\n~~~~~~Review by dealer id~~~~~~~\n\n",json_result) reviews = json_result - - for dealer_review in reviews: - - review_obj = DealerReview(dealership=dealer_review["dealership"], - name=dealer_review["name"], - purchase=dealer_review["purchase"], - review=dealer_review["review"]) - if "id" in dealer_review: - review_obj.id = dealer_review["id"] - if "purchase_date" in dealer_review: - review_obj.purchase_date = dealer_review["purchase_date"] - if "car_make" in dealer_review: - review_obj.car_make = dealer_review["car_make"] - if "car_model" in dealer_review: - review_obj.car_model = dealer_review["car_model"] - if "car_year" in dealer_review: - review_obj.car_year = dealer_review["car_year"] - - # sentiment = analyze_review_sentiments(review_obj.review) - # print(sentiment) + for review in reviews: + if review['purchase']: + review_obj = DealerReview( + dealership=review['dealership'], + purchase=review['purchase'], + purchase_date=review['purchase_date'], + name=review['name'], + review=review['review'], + car_make=review['car_make'], + car_model=review['car_model'], + car_year=review['car_year'], + id=review['id'], + sentiment = 'sentiment') + else: + review_obj = DealerReview( + dealership=review['dealership'], + purchase=review['purchase'], + purchase_date=None, + name=review['name'], + review=review['review'], + car_make=None, + car_model=None, + car_year=None, + id=review['id'], + sentiment = 'sentiment') review_obj.sentiment = analyze_review_sentiments(review_obj.review) - # review_obj.sentiment = sentiment results.append(review_obj) - + print("Sentiments: ", review_obj.sentiment) + print("Results: ", review_obj) return results # natural_language_understanding.set_service_url(url) diff --git a/server/djangoapp/templates/djangoapp/add_review.html b/server/djangoapp/templates/djangoapp/add_review.html index 10d0835f00..56fb7cac48 100644 --- a/server/djangoapp/templates/djangoapp/add_review.html +++ b/server/djangoapp/templates/djangoapp/add_review.html @@ -31,16 +31,11 @@

    Add a review about {{ dealer.full_name }}

    - +
    - {% endblock content %} diff --git a/server/djangoapp/views.py b/server/djangoapp/views.py index 6cee1a68dd..09b08faa2d 100644 --- a/server/djangoapp/views.py +++ b/server/djangoapp/views.py @@ -118,37 +118,44 @@ def get_dealer_details(request, id): # ... def add_review(request, id): - if request.user.is_authenticated: - context = {} - dealer_url = "https://ankitehlanwo-3000.theiadocker-1-labs-prod-theiak8s-4-tor01.proxy.cognitiveclass.ai/dealerships/get" - dealer = get_dealer_by_id_from_cf(dealer_url, id=id) - context["dealer"] = dealer - if request.method == "GET": - cars = CarModel.objects.all() - context["cars"] = cars - print(context) - return render(request, 'djangoapp/add_review.html', context) - - if request.method == "POST": - review = {} - review["name"] = request.user.first_name + " " + request.user.last_name - form = request.POST - review["dealership"] = id - review["review"] = form["content"] - if(form.get("purchasecheck") == "on"): - review["purchase"] = True - else: - review["purchase"] = False - if(review["purchase"]): - review["purchase_date"] = form["purchasedate"] - car = CarModel.objects.get(pk=form["car"]) - review["car_make"] = car.make.name - review["car_model"] = car.name - review["car_year"] = car.year - post_url = "https://ankitehlanwo-5000.theiadocker-1-labs-prod-theiak8s-4-tor01.proxy.cognitiveclass.ai/api/post_review" - json_payload = { "review": review } - post_request(post_url, json_payload, id=id) - return redirect("djangoapp:dealer_details", id=id) - else: - return redirect("/djangoapp/login") + context = {} + dealer_url = "https://ankitehlanwo-3000.theiadocker-1-labs-prod-theiak8s-4-tor01.proxy.cognitiveclass.ai/dealerships/get" + dealer = get_dealer_by_id_from_cf(dealer_url, id=id) + context['dealer'] = dealer + + if request.method == 'GET': + cars = CarModel.objects.all() + print("CARS: ", cars) + context['cars'] = cars + + return render(request, 'djangoapp/add_review.html', context) + + elif request.method == 'POST': + if request.user.is_authenticated: + username = request.user.username + print(request.POST) + car_id = request.POST["car"] + car = CarModel.objects.get(pk=car_id) + print("CAR: ",car) + user_review = {} + user_review["time"] = datetime.utcnow().isoformat() + user_review["name"] = username + user_review["dealership"] = id + user_review["id"] = id + user_review['review'] = request.POST['content'] + user_review['purchase'] = False + + if 'purchasecheck' in request.POST: + if request.POST['purchasecheck'] == 'on': + user_review['purchase'] = True + user_review['purchase_date'] = request.POST['purchasedate'] + user_review['car_make'] = car.make.name + user_review['car_model'] = car.name + user_review['car_year'] = int(car.year.strftime("%Y")) + + payload = {} + payload['review'] = user_review + review_post_url = "https://ankitehlanwo-5000.theiadocker-1-labs-prod-theiak8s-4-tor01.proxy.cognitiveclass.ai/api/post_review" + post_request(review_post_url, payload, id=id) + return redirect('djangoapp:dealer_details', id=id) From 12aff3c52b4a3f50f02f9103821c28bc5b3b70a6 Mon Sep 17 00:00:00 2001 From: Ankit Tehlan Date: Tue, 21 Nov 2023 14:51:56 +0530 Subject: [PATCH 14/14] Add dockerfile --- server/Dockerfile | 28 ++++++++++++++++++++++++++++ server/entrypoint.sh | 17 +++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 server/Dockerfile create mode 100755 server/entrypoint.sh diff --git a/server/Dockerfile b/server/Dockerfile new file mode 100644 index 0000000000..25696fb89a --- /dev/null +++ b/server/Dockerfile @@ -0,0 +1,28 @@ + FROM python:3.8.2 + + ENV PYTHONBUFFERED 1 + ENV PYTHONWRITEBYTECODE 1 + + RUN apt-get update \ + && apt-get install -y netcat + + ENV APP=/app + + # Change the workdir. + WORKDIR $APP + + # Install the requirements + COPY requirements.txt $APP + + RUN pip3 install -r requirements.txt + + # Copy the rest of the files + COPY . $APP + + EXPOSE 8000 + + RUN chmod +x /app/entrypoint.sh + + ENTRYPOINT ["/bin/bash","/app/entrypoint.sh"] + + CMD ["gunicorn", "--bind", ":8000", "--workers", "3", "djangobackend.wsgi"] \ No newline at end of file diff --git a/server/entrypoint.sh b/server/entrypoint.sh new file mode 100755 index 0000000000..1a48bf8972 --- /dev/null +++ b/server/entrypoint.sh @@ -0,0 +1,17 @@ + #!/bin/sh + + if [ "$DATABASE" = "postgres" ]; then + echo "Waiting for postgres..." + + while ! nc -z $DATABASE_HOST $DATABASE_PORT; do + sleep 0.1 + done + + echo "PostgreSQL started" + fi + + # Make migrations and migrate the database. + echo "Making migrations and migrating the database. " + python manage.py makemigrations main --noinput + python manage.py migrate --noinput + exec "$@" \ No newline at end of file