diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index 05ca50d23b..4ddc276946 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -5,6 +5,7 @@ on: branches: [master, main] pull_request: branches: [master, main] + workflow_dispatch: jobs: # list of things to do lint_function_js: @@ -43,7 +44,7 @@ jobs: # list of things to do pip install pylint if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - name: Lint with Pylint - run: pylint *.py + run: pylint *.py working-directory: functions/sample/python lint_django_server: diff --git a/.gitignore b/.gitignore index a5e81fae11..845a9d4fa9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ .vscode +**node_modules + # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] @@ -22,6 +24,7 @@ parts/ sdist/ var/ wheels/ +ignorefiles/ pip-wheel-metadata/ share/python-wheels/ *.egg-info/ diff --git a/DataBaseErrorExample.json b/DataBaseErrorExample.json new file mode 100644 index 0000000000..d957d18bf7 --- /dev/null +++ b/DataBaseErrorExample.json @@ -0,0 +1,119 @@ +{ + "result": [ + { + "id": "310b6145c664ca5c3770ef71485fb8df", + "key": "310b6145c664ca5c3770ef71485fb8df", + "value": { + "rev": "1-6d3a316e140863cdb147048888d26051" + }, + "doc": { + "_id": "310b6145c664ca5c3770ef71485fb8df", + "_rev": "1-6d3a316e140863cdb147048888d26051", + "id": 1, + "name": "Berkly Shepley", + "dealership": 15, + "review": "Total grid-enabled service-desk", + "purchase": true, + "purchase_date": "07/11/2020", + "car_make": "Audi", + "car_model": "A6", + "car_year": 2010 + } + }, + { + "id": "310b6145c664ca5c3770ef71485fc075", + "key": "310b6145c664ca5c3770ef71485fc075", + "value": { + "rev": "1-0cbc084ce570374a1d0c2653ceb254ad" + }, + "doc": { + "_id": "310b6145c664ca5c3770ef71485fc075", + "_rev": "1-0cbc084ce570374a1d0c2653ceb254ad", + "id": 2, + "name": "Gwenora Zettoi", + "dealership": 23, + "review": "Future-proofed foreground capability", + "purchase": true, + "purchase_date": "09/17/2020", + "car_make": "Pontiac", + "car_model": "Firebird", + "car_year": 1995 + } + }, + { + "id": "310b6145c664ca5c3770ef71485fc173", + "key": "310b6145c664ca5c3770ef71485fc173", + "value": { + "rev": "1-278e31d48be2f5abc7c9b542cff00208" + }, + "doc": { + "_id": "310b6145c664ca5c3770ef71485fc173", + "_rev": "1-278e31d48be2f5abc7c9b542cff00208", + "id": 3, + "name": "Lion Reames", + "dealership": 29, + "review": "Expanded global groupware", + "purchase": true, + "purchase_date": "10/20/2020", + "car_make": "Mazda", + "car_model": "MX-5", + "car_year": 2003 + } + }, + { + "id": "310b6145c664ca5c3770ef71485fcad6", + "key": "310b6145c664ca5c3770ef71485fcad6", + "value": { + "rev": "1-1677bbc642e9673d151d56614ad81963" + }, + "doc": { + "_id": "310b6145c664ca5c3770ef71485fcad6", + "_rev": "1-1677bbc642e9673d151d56614ad81963", + "id": 4, + "name": "Iorgos Colley", + "dealership": 13, + "review": "Optional heuristic software", + "purchase": false + } + }, + { + "id": "310b6145c664ca5c3770ef71485fccf9", + "key": "310b6145c664ca5c3770ef71485fccf9", + "value": { + "rev": "1-7e446087190b20656bad81aeab9242b5" + }, + "doc": { + "_id": "310b6145c664ca5c3770ef71485fccf9", + "_rev": "1-7e446087190b20656bad81aeab9242b5", + "id": 5, + "name": "Kissee Noirel", + "dealership": 46, + "review": "Diverse client-server success", + "purchase": false + } + }, + { + "id": "52844e3d638580a4eeee1d72fbec17f6", + "key": "52844e3d638580a4eeee1d72fbec17f6", + "value": { + "rev": "1-3072ebde1a82289cf9619f69e3db0e0f" + }, + "doc": { + "_id": "52844e3d638580a4eeee1d72fbec17f6", + "_rev": "1-3072ebde1a82289cf9619f69e3db0e0f", + "review": { + "id": 1114, + "name": "Upkar Lidder", + "dealership": 15, + "review": "Great service!", + "purchase": false, + "another": "field", + "purchase_date": "02/16/2021", + "car_make": "Audi", + "car_model": "Car", + "car_year": 2021 + } + } + } + ] +} \ No newline at end of file diff --git a/DataBaseErrorExample.txt b/DataBaseErrorExample.txt new file mode 100644 index 0000000000..d957d18bf7 --- /dev/null +++ b/DataBaseErrorExample.txt @@ -0,0 +1,119 @@ +{ + "result": [ + { + "id": "310b6145c664ca5c3770ef71485fb8df", + "key": "310b6145c664ca5c3770ef71485fb8df", + "value": { + "rev": "1-6d3a316e140863cdb147048888d26051" + }, + "doc": { + "_id": "310b6145c664ca5c3770ef71485fb8df", + "_rev": "1-6d3a316e140863cdb147048888d26051", + "id": 1, + "name": "Berkly Shepley", + "dealership": 15, + "review": "Total grid-enabled service-desk", + "purchase": true, + "purchase_date": "07/11/2020", + "car_make": "Audi", + "car_model": "A6", + "car_year": 2010 + } + }, + { + "id": "310b6145c664ca5c3770ef71485fc075", + "key": "310b6145c664ca5c3770ef71485fc075", + "value": { + "rev": "1-0cbc084ce570374a1d0c2653ceb254ad" + }, + "doc": { + "_id": "310b6145c664ca5c3770ef71485fc075", + "_rev": "1-0cbc084ce570374a1d0c2653ceb254ad", + "id": 2, + "name": "Gwenora Zettoi", + "dealership": 23, + "review": "Future-proofed foreground capability", + "purchase": true, + "purchase_date": "09/17/2020", + "car_make": "Pontiac", + "car_model": "Firebird", + "car_year": 1995 + } + }, + { + "id": "310b6145c664ca5c3770ef71485fc173", + "key": "310b6145c664ca5c3770ef71485fc173", + "value": { + "rev": "1-278e31d48be2f5abc7c9b542cff00208" + }, + "doc": { + "_id": "310b6145c664ca5c3770ef71485fc173", + "_rev": "1-278e31d48be2f5abc7c9b542cff00208", + "id": 3, + "name": "Lion Reames", + "dealership": 29, + "review": "Expanded global groupware", + "purchase": true, + "purchase_date": "10/20/2020", + "car_make": "Mazda", + "car_model": "MX-5", + "car_year": 2003 + } + }, + { + "id": "310b6145c664ca5c3770ef71485fcad6", + "key": "310b6145c664ca5c3770ef71485fcad6", + "value": { + "rev": "1-1677bbc642e9673d151d56614ad81963" + }, + "doc": { + "_id": "310b6145c664ca5c3770ef71485fcad6", + "_rev": "1-1677bbc642e9673d151d56614ad81963", + "id": 4, + "name": "Iorgos Colley", + "dealership": 13, + "review": "Optional heuristic software", + "purchase": false + } + }, + { + "id": "310b6145c664ca5c3770ef71485fccf9", + "key": "310b6145c664ca5c3770ef71485fccf9", + "value": { + "rev": "1-7e446087190b20656bad81aeab9242b5" + }, + "doc": { + "_id": "310b6145c664ca5c3770ef71485fccf9", + "_rev": "1-7e446087190b20656bad81aeab9242b5", + "id": 5, + "name": "Kissee Noirel", + "dealership": 46, + "review": "Diverse client-server success", + "purchase": false + } + }, + { + "id": "52844e3d638580a4eeee1d72fbec17f6", + "key": "52844e3d638580a4eeee1d72fbec17f6", + "value": { + "rev": "1-3072ebde1a82289cf9619f69e3db0e0f" + }, + "doc": { + "_id": "52844e3d638580a4eeee1d72fbec17f6", + "_rev": "1-3072ebde1a82289cf9619f69e3db0e0f", + "review": { + "id": 1114, + "name": "Upkar Lidder", + "dealership": 15, + "review": "Great service!", + "purchase": false, + "another": "field", + "purchase_date": "02/16/2021", + "car_make": "Audi", + "car_model": "Car", + "car_year": 2021 + } + } + } + ] +} \ No newline at end of file diff --git a/DataBaseErrorExample_review_db.json b/DataBaseErrorExample_review_db.json new file mode 100644 index 0000000000..d957d18bf7 --- /dev/null +++ b/DataBaseErrorExample_review_db.json @@ -0,0 +1,119 @@ +{ + "result": [ + { + "id": "310b6145c664ca5c3770ef71485fb8df", + "key": "310b6145c664ca5c3770ef71485fb8df", + "value": { + "rev": "1-6d3a316e140863cdb147048888d26051" + }, + "doc": { + "_id": "310b6145c664ca5c3770ef71485fb8df", + "_rev": "1-6d3a316e140863cdb147048888d26051", + "id": 1, + "name": "Berkly Shepley", + "dealership": 15, + "review": "Total grid-enabled service-desk", + "purchase": true, + "purchase_date": "07/11/2020", + "car_make": "Audi", + "car_model": "A6", + "car_year": 2010 + } + }, + { + "id": "310b6145c664ca5c3770ef71485fc075", + "key": "310b6145c664ca5c3770ef71485fc075", + "value": { + "rev": "1-0cbc084ce570374a1d0c2653ceb254ad" + }, + "doc": { + "_id": "310b6145c664ca5c3770ef71485fc075", + "_rev": "1-0cbc084ce570374a1d0c2653ceb254ad", + "id": 2, + "name": "Gwenora Zettoi", + "dealership": 23, + "review": "Future-proofed foreground capability", + "purchase": true, + "purchase_date": "09/17/2020", + "car_make": "Pontiac", + "car_model": "Firebird", + "car_year": 1995 + } + }, + { + "id": "310b6145c664ca5c3770ef71485fc173", + "key": "310b6145c664ca5c3770ef71485fc173", + "value": { + "rev": "1-278e31d48be2f5abc7c9b542cff00208" + }, + "doc": { + "_id": "310b6145c664ca5c3770ef71485fc173", + "_rev": "1-278e31d48be2f5abc7c9b542cff00208", + "id": 3, + "name": "Lion Reames", + "dealership": 29, + "review": "Expanded global groupware", + "purchase": true, + "purchase_date": "10/20/2020", + "car_make": "Mazda", + "car_model": "MX-5", + "car_year": 2003 + } + }, + { + "id": "310b6145c664ca5c3770ef71485fcad6", + "key": "310b6145c664ca5c3770ef71485fcad6", + "value": { + "rev": "1-1677bbc642e9673d151d56614ad81963" + }, + "doc": { + "_id": "310b6145c664ca5c3770ef71485fcad6", + "_rev": "1-1677bbc642e9673d151d56614ad81963", + "id": 4, + "name": "Iorgos Colley", + "dealership": 13, + "review": "Optional heuristic software", + "purchase": false + } + }, + { + "id": "310b6145c664ca5c3770ef71485fccf9", + "key": "310b6145c664ca5c3770ef71485fccf9", + "value": { + "rev": "1-7e446087190b20656bad81aeab9242b5" + }, + "doc": { + "_id": "310b6145c664ca5c3770ef71485fccf9", + "_rev": "1-7e446087190b20656bad81aeab9242b5", + "id": 5, + "name": "Kissee Noirel", + "dealership": 46, + "review": "Diverse client-server success", + "purchase": false + } + }, + { + "id": "52844e3d638580a4eeee1d72fbec17f6", + "key": "52844e3d638580a4eeee1d72fbec17f6", + "value": { + "rev": "1-3072ebde1a82289cf9619f69e3db0e0f" + }, + "doc": { + "_id": "52844e3d638580a4eeee1d72fbec17f6", + "_rev": "1-3072ebde1a82289cf9619f69e3db0e0f", + "review": { + "id": 1114, + "name": "Upkar Lidder", + "dealership": 15, + "review": "Great service!", + "purchase": false, + "another": "field", + "purchase_date": "02/16/2021", + "car_make": "Audi", + "car_model": "Car", + "car_year": 2021 + } + } + } + ] +} \ No newline at end of file diff --git a/README.md b/README.md index cdd50e544e..b082130be1 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,42 @@ -# Final Project Template - -The final project for this course has several steps that you must complete. -To give you an overview of the whole project, all the high-level steps are listed below. -The project is then divided into several smaller labs that give the detailed instructions for each step. -You must complete all the labs to successfully complete the project. - -## Project Breakdown - -**Prework: Sign up for IBM Cloud account and create a Watson Natural language Understanding service** -1. Create an IBM cloud account if you don't have one already. -2. Create an instance of the Natural Language Understanding (NLU) service. - -**Fork the project Github repository with a project then build and deploy the template project** -1. Fork the repository in your account -2. Clone the repository in the theia lab environment -3. Create static pages to finish the user stories -4. Deploy the application on IBM Cloud - -**Add user management to the application** -1. Implement user management using the Django user authentication system. -2. Set up continuous integration and delivery - -**Implement backend services** -1. Create cloud functions to manage dealers and reviews -2. Create Django models and views to manage car model and car make -3. Create Django proxy services and views to integrate dealers, reviews, and cars together - -**Add dynamic pages with Django templates** -1. Create a page that shows all the dealers -2. Create a page that show reviews for a selected dealer -3. Create a page that let's the end user add a review for a selected dealer - -**Containerize your application** -1. Add deployment artifacts to your application -2. Deploy your application +# Abstract + +# Full Stack Final Project Website + +This website is a full stack project that utilizes Django and Node.js with Express. For the coursera course on Django Cloud Development + +- **Django:** Used for rendering a list of car dealerships and associated user reviews. +- **Node.js and Express:** Although the REST API for the course's IBM Cloud has been decommissioned,The raw JSON list of dealerships and users is still accessible from the IBM Cloud database. This data is used in the `./server/djangobackend/node_Dealership_example_server` A Node and Express server + was made to enable the rest of the website. + +# Project Concepts + +-User Authentication +-Working with Django Forms,models, and ORM databases +-Frontend Bootstrap styling and dynamic interaction like table filters +-REST API calls to a database ( although the data could have been stored all in Django) + + +# Dealerships Data Table + +Basic Data Table with criteria filter + +![DealerShip Table](./assets/J23_dealerships_table.png) + +filtered by state + +![Table Filter](./assets/J23_Table_Filter.png) + +User Sign up functionality + +![Signup Page](./assets/J23_SignupPage.png) + +User logged in + +![Loggedin](./assets/J23_Person1loggedin.png) + +Form Submission sent to database + +![Form Submission](./assets/J23_Post_Review.png) + + + diff --git a/assets/J23_Person1loggedin.png b/assets/J23_Person1loggedin.png new file mode 100644 index 0000000000..0ce745a5ad Binary files /dev/null and b/assets/J23_Person1loggedin.png differ diff --git a/assets/J23_Post_Review.png b/assets/J23_Post_Review.png new file mode 100644 index 0000000000..eaaefc57ce Binary files /dev/null and b/assets/J23_Post_Review.png differ diff --git a/assets/J23_SignupPage.png b/assets/J23_SignupPage.png new file mode 100644 index 0000000000..fff0de8e48 Binary files /dev/null and b/assets/J23_SignupPage.png differ diff --git a/assets/J23_Table_Filter.png b/assets/J23_Table_Filter.png new file mode 100644 index 0000000000..01fb844b5b Binary files /dev/null and b/assets/J23_Table_Filter.png differ diff --git a/assets/J23_dealerships_table.png b/assets/J23_dealerships_table.png new file mode 100644 index 0000000000..c93b6f3399 Binary files /dev/null and b/assets/J23_dealerships_table.png differ diff --git a/dealerDB_original.json b/dealerDB_original.json new file mode 100644 index 0000000000..1ea5c34fac --- /dev/null +++ b/dealerDB_original.json @@ -0,0 +1,215 @@ + +[ + { + "id": "9c3725831f60fdec5f0c0b4781801d86", + "key": "9c3725831f60fdec5f0c0b4781801d86", + "value": { + "rev": "1-34e7ebd07643af43db578a46ee1d6365" + }, + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781801d86", + "_rev": "1-34e7ebd07643af43db578a46ee1d6365", + "id": 1, + "city": "El Paso", + "state": "Texas", + "st": "TX", + "address": "3 Nova Court", + "zip": "88563", + "lat": 31.6948, + "long": -106.3, + "short_name": "Holdlamis", + "full_name": "Holdlamis Car Dealership" + } + }, + { + "id": "9c3725831f60fdec5f0c0b4781801fc1", + "key": "9c3725831f60fdec5f0c0b4781801fc1", + "value": { + "rev": "1-d1778a396ca8cb0ef2966a9854eb93ee" + }, + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781801fc1", + "_rev": "1-d1778a396ca8cb0ef2966a9854eb93ee", + "id": 2, + "city": "Minneapolis", + "state": "Minnesota", + "st": "MN", + "address": "6337 Butternut Crossing", + "zip": "55402", + "lat": 44.9762, + "long": -93.2759, + "short_name": "Temp", + "full_name": "Temp Car Dealership" + } + }, + { + "id": "9c3725831f60fdec5f0c0b4781802f4c", + "key": "9c3725831f60fdec5f0c0b4781802f4c", + "value": { + "rev": "1-cc5d5c13aa879d1cef8253dfa1dce77d" + }, + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781802f4c", + "_rev": "1-cc5d5c13aa879d1cef8253dfa1dce77d", + "id": 3, + "city": "Birmingham", + "state": "Alabama", + "st": "AL", + "address": "9477 Twin Pines Center", + "zip": "35285", + "lat": 33.5446, + "long": -86.9292, + "short_name": "Sub-Ex", + "full_name": "Sub-Ex Car Dealership" + } + }, + { + "id": "9c3725831f60fdec5f0c0b4781803847", + "key": "9c3725831f60fdec5f0c0b4781803847", + "value": { + "rev": "1-a79013b42c83451d49e7e3aba4a575e3" + }, + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781803847", + "_rev": "1-a79013b42c83451d49e7e3aba4a575e3", + "id": 4, + "city": "Dallas", + "state": "Texas", + "st": "TX", + "address": "85800 Hazelcrest Circle", + "zip": "75241", + "lat": 32.6722, + "long": -96.7774, + "short_name": "Solarbreeze", + "full_name": "Solarbreeze Car Dealership" + } + }, + { + "id": "9c3725831f60fdec5f0c0b478180403c", + "key": "9c3725831f60fdec5f0c0b478180403c", + "value": { + "rev": "1-c16dcd97a91588c9866814f61ea72751" + }, + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180403c", + "_rev": "1-c16dcd97a91588c9866814f61ea72751", + "id": 5, + "city": "Baltimore", + "state": "Maryland", + "st": "MD", + "address": "93 Golf Course Pass", + "zip": "21203", + "lat": 39.2847, + "long": -76.6205, + "short_name": "Regrant", + "full_name": "Regrant Car Dealership" + } + }, + { + "id": "9c3725831f60fdec5f0c0b47818042b7", + "key": "9c3725831f60fdec5f0c0b47818042b7", + "value": { + "rev": "1-e37424d3be7785cbdbc4ed12ec29b343" + }, + "doc": { + "_id": "9c3725831f60fdec5f0c0b47818042b7", + "_rev": "1-e37424d3be7785cbdbc4ed12ec29b343", + "id": 6, + "city": "Wilkes Barre", + "state": "Pennsylvania", + "st": "PA", + "address": "2 Burrows Hill", + "zip": "18763", + "lat": 41.2722, + "long": -75.8801, + "short_name": "Stronghold", + "full_name": "Stronghold Car Dealership" + } + }, + { + "id": "9c3725831f60fdec5f0c0b47818049b6", + "key": "9c3725831f60fdec5f0c0b47818049b6", + "value": { + "rev": "1-96db320a9c736d2e08e8b1bf873d0e04" + }, + "doc": { + "_id": "9c3725831f60fdec5f0c0b47818049b6", + "_rev": "1-96db320a9c736d2e08e8b1bf873d0e04", + "id": 7, + "city": "Pueblo", + "state": "Colorado", + "st": "CO", + "address": "9 Cambridge Park", + "zip": "81010", + "lat": 38.1286, + "long": -104.5523, + "short_name": "Job", + "full_name": "Job Car Dealership" + } + }, + { + "id": "9c3725831f60fdec5f0c0b478180542a", + "key": "9c3725831f60fdec5f0c0b478180542a", + "value": { + "rev": "1-4e4889794e42a9e092c1442118889232" + }, + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180542a", + "_rev": "1-4e4889794e42a9e092c1442118889232", + "id": 8, + "city": "Topeka", + "state": "Kansas", + "st": "KS", + "address": "288 Larry Place", + "zip": "66642", + "lat": 39.0429, + "long": -95.7697, + "short_name": "Bytecard", + "full_name": "Bytecard Car Dealership" + } + }, + { + "id": "9c3725831f60fdec5f0c0b4781805a8b", + "key": "9c3725831f60fdec5f0c0b4781805a8b", + "value": { + "rev": "1-63f1a1984f40f1de1eabceaec90f7fb6" + }, + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781805a8b", + "_rev": "1-63f1a1984f40f1de1eabceaec90f7fb6", + "id": 9, + "city": "Dallas", + "state": "Texas", + "st": "TX", + "address": "253 Hanson Junction", + "zip": "75216", + "lat": 32.7086, + "long": -96.7955, + "short_name": "Job", + "full_name": "Job Car Dealership" + } + }, + { + "id": "9c3725831f60fdec5f0c0b4781806489", + "key": "9c3725831f60fdec5f0c0b4781806489", + "value": { + "rev": "1-1510e7ca88f225bef573a98f9cb45452" + }, + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781806489", + "_rev": "1-1510e7ca88f225bef573a98f9cb45452", + "id": 10, + "city": "Washington", + "state": "District of Columbia", + "st": "DC", + "address": "108 Memorial Pass", + "zip": "20005", + "lat": 38.9067, + "long": -77.0312, + "short_name": "Alphazap", + "full_name": "Alphazap Car Dealership" + } + } + } + + ] \ No newline at end of file diff --git a/functions/.creds-sample.json b/functions/.creds-sample.json index f4d2fdbe1e..829a7bcfc6 100644 --- a/functions/.creds-sample.json +++ b/functions/.creds-sample.json @@ -1,4 +1,4 @@ { - "COUCH_URL": "", - "IAM_API_KEY": "" + "COUCH_URL": "https://72144af7-975a-4c8a-b653-48177d4a207d-bluemix.cloudantnosqldb.appdomain.cloud" , + "IAM_API_KEY": "8QlH7-SI_k4q2an8qH8Bl24W4mBB-vYgagvrw9heNk55" } \ No newline at end of file diff --git a/functions/sample/nodejs/index-promise.js b/functions/sample/nodejs/index-promise.js index 135d73385a..a99b4d9d06 100644 --- a/functions/sample/nodejs/index-promise.js +++ b/functions/sample/nodejs/index-promise.js @@ -1,11 +1,32 @@ /** * Get all dealerships */ +const express = require('express'); +const app=express() +const PORT = 5000; +const bodyParser = require('body-parser'); const { CloudantV1 } = require('@ibm-cloud/cloudant'); const { IamAuthenticator } = require('ibm-cloud-sdk-core'); -function main(params) { + +const params = require("C:\\localkeys\\IBM_Cloud_Key.json"); + + +function get_dealerships(params) { + + const authenticator = new IamAuthenticator({ apikey: params.IAM_API_KEY }) + const cloudant = CloudantV1.newInstance({ + authenticator: authenticator + }); + cloudant.setServiceUrl(params.COUCH_URL); + + let dbListPromise = getDbs(cloudant); + + return getAllRecords(cloudant,"dealerships"); +} + +function get_reviews(params) { const authenticator = new IamAuthenticator({ apikey: params.IAM_API_KEY }) const cloudant = CloudantV1.newInstance({ @@ -14,14 +35,17 @@ function main(params) { cloudant.setServiceUrl(params.COUCH_URL); let dbListPromise = getDbs(cloudant); - return dbListPromise; + + return getAllRecords(cloudant,"reviews"); } function getDbs(cloudant) { return new Promise((resolve, reject) => { cloudant.getAllDbs() .then(body => { + console.log(body.result) resolve({ dbs: body.result }); + }) .catch(err => { console.log(err); @@ -46,12 +70,12 @@ function getDbs(cloudant) { reject({ err: err }); }); }) - } - + } /* Sample implementation to get all the records in a db. */ + function getAllRecords(cloudant,dbname) { return new Promise((resolve, reject) => { cloudant.postAllDocs({ db: dbname, includeDocs: true, limit: 10 }) @@ -64,3 +88,83 @@ function getDbs(cloudant) { }); }) } + + app.listen( + PORT, + () => console.log(`its alive on http://localhost:${PORT}`) + + ) + + app.get('/api/dealership',(req,res)=> { + + let filterProperty; + let filterValue; + + for (let prop in req.query) { + filterProperty = prop; + filterValue = req.query[prop]; + } + + + if(filterValue){ + filterValue=filterValue.replace(/"/g,''); + filterValue=filterValue.replace(/`/g,''); + } + + if(filterProperty){ + filterProperty=filterProperty.replace(/"/g,''); + filterProperty=filterProperty.replace(/`/g,''); + } + + get_dealerships(params) + .then(result => { + if (filterProperty && filterValue ) { + + let filteredResult = result.result.filter(dealership=> dealership.doc[filterProperty] == filterValue); + console.log(filteredResult) + res.status(200).send(filteredResult); + } else { + res.status(200).send(result); + } + }) + .catch(err=>res.status(500).send(err)); + + }); + + app.get('/api/review',(req,res)=> { + + let filterProperty; + let filterValue; + + for (let prop in req.query) { + filterProperty = prop; + filterValue = req.query[prop]; + } + + + if(filterValue){ + filterValue=filterValue.replace(/"/g,''); + filterValue=filterValue.replace(/`/g,''); + } + + if(filterProperty){ + filterProperty=filterProperty.replace(/"/g,''); + filterProperty=filterProperty.replace(/`/g,''); + } + + console.log(filterProperty) + console.log(filterValue) + + get_reviews(params) + .then(result => { + if (filterProperty && filterValue ) { + console.log(result.result) + let filteredResult = result.result.filter(review=> review.doc[filterProperty] == filterValue); + res.status(200).send(filteredResult); + } else { + res.status(200).send(result); + } + }) + .catch(err=>res.status(500).send(err)); + + }); \ No newline at end of file diff --git a/functions/sample/nodejs/package-lock.json b/functions/sample/nodejs/package-lock.json index a74c9ce34a..3fbd8be0f0 100644 --- a/functions/sample/nodejs/package-lock.json +++ b/functions/sample/nodejs/package-lock.json @@ -9,12 +9,177 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@cloudant/cloudant": "^4.4.0" + "@cloudant/cloudant": "^4.4.0", + "@ibm-cloud/cloudant": "^0.8.2", + "dotenv": "^16.3.1", + "express": "^4.18.2", + "ibm-cloud-sdk-core": "^4.2.2" }, "devDependencies": { "eslint": "^8.27.0" } }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@cloudant/cloudant": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/@cloudant/cloudant/-/cloudant-4.5.1.tgz", @@ -137,6 +302,38 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@ibm-cloud/cloudant": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@ibm-cloud/cloudant/-/cloudant-0.8.2.tgz", + "integrity": "sha512-lUMV3Ma4PmIqP25HIgXXZfED25ANzLJreleeS7wVfzYlPjKSrgR8vAOqsGkcrRg/J4ySiF0BCABNP3T4MSnyZQ==", + "dependencies": { + "@types/node": "18.19.4", + "ibm-cloud-sdk-core": "4.2.2" + }, + "engines": { + "node": "^18 || ^20" + }, + "peerDependencies": { + "@types/tough-cookie": "^4.0.0", + "extend": "^3.0.2", + "tough-cookie": "^4.0.0" + } + }, + "node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -172,15 +369,70 @@ "node": ">= 8" } }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + }, "node_modules/@types/caseless": { "version": "0.12.2", "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/file-type": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@types/file-type/-/file-type-5.2.2.tgz", + "integrity": "sha512-GWtM4fyqfb+bec4ocpo51/y4x0b83Je+iA6eV131LT9wL0//G+1UgwbkMg7w61ceOwR+KkZXK00z44jrrNljWg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-EE11Sn7gzHEF9FGkYHTkFpPuDEamLudLvaGnBciNgH55fTYboWZHINR6MP8+CfCOjPJX08l4teRrjCY11gz1CA==" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, "node_modules/@types/node": { - "version": "18.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==" + "version": "18.19.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.4.tgz", + "integrity": "sha512-xNzlUhzoHotIsnFoXmJB+yWmBvFZgKCI9TtPIEdYIMM1KWfwuY8zh7wvc1u1OAXlC7dlf6mZVx/s+Y5KfFz19A==", + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/request": { "version": "2.48.8", @@ -193,11 +445,41 @@ "form-data": "^2.5.0" } }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" + }, "node_modules/@types/tough-cookie": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==" }, + "node_modules/@types/yargs": { + "version": "15.0.19", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", + "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", @@ -238,7 +520,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -247,7 +528,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -264,6 +544,11 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -306,6 +591,29 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, + "node_modules/axios": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.4.tgz", + "integrity": "sha512-heJnIs6N4aa1eSthhN9M5ioILu8Wi8vmQW9iHQ9NUvfkJb0lEEDUiIdQNAuBtfUt3FxReaKdpQA5DbmMOqzF/A==", + "dependencies": { + "follow-redirects": "^1.15.4", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -320,6 +628,56 @@ "tweetnacl": "^0.14.3" } }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -330,6 +688,17 @@ "concat-map": "0.0.1" } }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/browser-request": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/browser-request/-/browser-request-0.3.3.tgz", @@ -338,11 +707,37 @@ "node" ] }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -352,6 +747,14 @@ "node": ">=6" } }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -361,7 +764,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -415,7 +817,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -426,8 +827,7 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -460,6 +860,44 @@ "typedarray": "^0.0.6" } }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/cookie": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", @@ -468,6 +906,11 @@ "node": ">= 0.6" } }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -512,6 +955,19 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -520,6 +976,31 @@ "node": ">=0.4.0" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "engines": { + "node": ">= 10.14.2" + } + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -532,6 +1013,17 @@ "node": ">=6.0.0" } }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -541,6 +1033,27 @@ "safer-buffer": "^2.1.0" } }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/errs": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/errs/-/errs-0.3.2.tgz", @@ -549,6 +1062,11 @@ "node": ">= 0.4.0" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -748,16 +1266,135 @@ "node": ">=0.10.0" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ + "node_modules/expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ "node >=0.6.0" ] }, @@ -798,6 +1435,63 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/file-type": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", + "dependencies": { + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.2.4", + "token-types": "^4.1.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -833,6 +1527,25 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -854,12 +1567,50 @@ "node": ">= 0.12" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -915,6 +1666,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, "node_modules/grapheme-splitter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", @@ -946,11 +1713,69 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -965,6 +1790,99 @@ "npm": ">=1.3.7" } }, + "node_modules/ibm-cloud-sdk-core": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/ibm-cloud-sdk-core/-/ibm-cloud-sdk-core-4.2.2.tgz", + "integrity": "sha512-Vy240CVrZy0jKQsKqpf9qq5ceXsmCUX1o6ZzxW1SWLd1QkiRzm+diNRoHPz2wkQuV2ILnGTchYv0fbm6UM5JdA==", + "dependencies": { + "@types/debug": "^4.1.12", + "@types/file-type": "~5.2.1", + "@types/isstream": "^0.1.0", + "@types/node": "~10.14.19", + "@types/tough-cookie": "^4.0.0", + "axios": "1.6.4", + "camelcase": "^5.3.1", + "debug": "^4.3.4", + "dotenv": "^6.2.0", + "expect": "^26.1.0", + "extend": "^3.0.2", + "file-type": "16.5.4", + "form-data": "^2.3.3", + "isstream": "~0.1.2", + "jsonwebtoken": "^9.0.0", + "lodash.isempty": "^4.4.0", + "mime-types": "^2.1.35", + "retry-axios": "^2.6.0", + "tough-cookie": "^4.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/ibm-cloud-sdk-core/node_modules/@types/node": { + "version": "10.14.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.22.tgz", + "integrity": "sha512-9taxKC944BqoTVjE+UT3pQH0nHZlTvITwfsOZqyc+R3sfJuxaTtxWjfn1K2UlxyPcKHf0rnaXcVFrS9F9vf0bw==" + }, + "node_modules/ibm-cloud-sdk-core/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/ibm-cloud-sdk-core/node_modules/dotenv": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", + "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ibm-cloud-sdk-core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", @@ -1014,6 +1932,14 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1035,6 +1961,14 @@ "node": ">=0.10.0" } }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -1065,12 +1999,80 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, + "node_modules/jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "engines": { + "node": ">= 10.14.2" + } + }, "node_modules/js-sdsl": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", "dev": true }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -1109,6 +2111,27 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, "node_modules/jsprim": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", @@ -1123,6 +2146,25 @@ "node": ">=0.6.0" } }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -1161,12 +2203,107 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isempty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "integrity": "sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -1245,6 +2382,14 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -1253,6 +2398,25 @@ "node": "*" } }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -1329,6 +2493,14 @@ "node": ">=6" } }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -1356,11 +2528,39 @@ "node": ">=8" } }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/peek-readable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", + "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -1370,11 +2570,42 @@ "node": ">= 0.8.0" } }, + "node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -1396,6 +2627,11 @@ "node": ">=0.6" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -1416,6 +2652,33 @@ } ] }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, "node_modules/readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -1430,6 +2693,34 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/readable-web-to-node-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -1486,6 +2777,23 @@ "node": ">= 0.12" } }, + "node_modules/request/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -1495,6 +2803,17 @@ "node": ">=4" } }, + "node_modules/retry-axios": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/retry-axios/-/retry-axios-2.6.0.tgz", + "integrity": "sha512-pOLi+Gdll3JekwuFjXO3fTq+L9lzMQGcSq7M5gIjExcl3Gu1hd4XXuf5o3+LuSBsaULQH7DiNbsqPd1chVpQGQ==", + "engines": { + "node": ">=10.7.0" + }, + "peerDependencies": { + "axios": "*" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -1553,6 +2872,90 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "dependencies": { + "define-data-property": "^1.1.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -1574,6 +2977,27 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, "node_modules/sshpk": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", @@ -1595,7 +3019,34 @@ "sshpk-verify": "bin/sshpk-verify" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.10.0" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" } }, "node_modules/string_decoder": { @@ -1630,11 +3081,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strtok3": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", + "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^4.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -1659,16 +3125,53 @@ "node": ">=0.6.0" } }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/token-types": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", + "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "engines": { - "node": ">=0.8" + "node": ">=6" } }, "node_modules/tunnel-agent": { @@ -1711,11 +3214,44 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -1724,11 +3260,28 @@ "punycode": "^2.1.0" } }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -1738,6 +3291,14 @@ "uuid": "bin/uuid" } }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -1772,9 +3333,9 @@ } }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -1786,6 +3347,11 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -1800,6 +3366,132 @@ } }, "dependencies": { + "@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "requires": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" + }, + "@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "requires": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "@cloudant/cloudant": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/@cloudant/cloudant/-/cloudant-4.5.1.tgz", @@ -1890,6 +3582,27 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@ibm-cloud/cloudant": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@ibm-cloud/cloudant/-/cloudant-0.8.2.tgz", + "integrity": "sha512-lUMV3Ma4PmIqP25HIgXXZfED25ANzLJreleeS7wVfzYlPjKSrgR8vAOqsGkcrRg/J4ySiF0BCABNP3T4MSnyZQ==", + "requires": { + "@types/node": "18.19.4", + "ibm-cloud-sdk-core": "4.2.2" + } + }, + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1916,15 +3629,70 @@ "fastq": "^1.6.0" } }, + "@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + }, "@types/caseless": { "version": "0.12.2", "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" }, + "@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "requires": { + "@types/ms": "*" + } + }, + "@types/file-type": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@types/file-type/-/file-type-5.2.2.tgz", + "integrity": "sha512-GWtM4fyqfb+bec4ocpo51/y4x0b83Je+iA6eV131LT9wL0//G+1UgwbkMg7w61ceOwR+KkZXK00z44jrrNljWg==", + "requires": { + "@types/node": "*" + } + }, + "@types/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-EE11Sn7gzHEF9FGkYHTkFpPuDEamLudLvaGnBciNgH55fTYboWZHINR6MP8+CfCOjPJX08l4teRrjCY11gz1CA==" + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + }, + "@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, "@types/node": { - "version": "18.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==" + "version": "18.19.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.4.tgz", + "integrity": "sha512-xNzlUhzoHotIsnFoXmJB+yWmBvFZgKCI9TtPIEdYIMM1KWfwuY8zh7wvc1u1OAXlC7dlf6mZVx/s+Y5KfFz19A==", + "requires": { + "undici-types": "~5.26.4" + } }, "@types/request": { "version": "2.48.8", @@ -1937,11 +3705,38 @@ "form-data": "^2.5.0" } }, + "@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" + }, "@types/tough-cookie": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==" }, + "@types/yargs": { + "version": "15.0.19", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", + "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, "acorn": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", @@ -1969,14 +3764,12 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -1987,6 +3780,11 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, "asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -2023,6 +3821,28 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, + "axios": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.4.tgz", + "integrity": "sha512-heJnIs6N4aa1eSthhN9M5ioILu8Wi8vmQW9iHQ9NUvfkJb0lEEDUiIdQNAuBtfUt3FxReaKdpQA5DbmMOqzF/A==", + "requires": { + "follow-redirects": "^1.15.4", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + }, + "dependencies": { + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } + } + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2037,6 +3857,48 @@ "tweetnacl": "^0.14.3" } }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2047,22 +3909,55 @@ "concat-map": "0.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, "browser-request": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/browser-request/-/browser-request-0.3.3.tgz", "integrity": "sha512-YyNI4qJJ+piQG6MMEuo7J3Bzaqssufx04zpEKYfSrl/1Op59HWali9zMtBpXnkmqMcOuWJPZvudrm9wISmnCbg==" }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "requires": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -2072,7 +3967,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2107,7 +4001,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -2115,8 +4008,7 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "combined-stream": { "version": "1.0.8", @@ -2143,11 +4035,36 @@ "typedarray": "^0.0.6" } }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, "cookie": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, "core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -2186,11 +4103,36 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "requires": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==" + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -2200,6 +4142,11 @@ "esutils": "^2.0.2" } }, + "dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==" + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -2209,11 +4156,34 @@ "safer-buffer": "^2.1.0" } }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, "errs": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/errs/-/errs-0.3.2.tgz", "integrity": "sha512-r+/tydov04FSwTi+PrGd0IdY195Y1jZW2g27TJ+cErU8vvr9V4hHYxtRF8bMjv4zYEhap7wK7zBQ2i99LRo6kA==" }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -2346,18 +4316,107 @@ "estraverse": "^5.2.0" } }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "requires": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + } + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -2402,6 +4461,53 @@ "flat-cache": "^3.0.4" } }, + "file-type": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", + "requires": { + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.2.4", + "token-types": "^4.1.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -2428,6 +4534,11 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, + "follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==" + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -2443,12 +4554,38 @@ "mime-types": "^2.1.12" } }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "requires": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -2489,6 +4626,19 @@ "type-fest": "^0.20.2" } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, "grapheme-splitter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", @@ -2512,8 +4662,45 @@ "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "requires": { + "get-intrinsic": "^1.2.2" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "requires": { + "function-bind": "^1.1.2" + } + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } }, "http-signature": { "version": "1.2.0", @@ -2525,6 +4712,70 @@ "sshpk": "^1.7.0" } }, + "ibm-cloud-sdk-core": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/ibm-cloud-sdk-core/-/ibm-cloud-sdk-core-4.2.2.tgz", + "integrity": "sha512-Vy240CVrZy0jKQsKqpf9qq5ceXsmCUX1o6ZzxW1SWLd1QkiRzm+diNRoHPz2wkQuV2ILnGTchYv0fbm6UM5JdA==", + "requires": { + "@types/debug": "^4.1.12", + "@types/file-type": "~5.2.1", + "@types/isstream": "^0.1.0", + "@types/node": "~10.14.19", + "@types/tough-cookie": "^4.0.0", + "axios": "1.6.4", + "camelcase": "^5.3.1", + "debug": "^4.3.4", + "dotenv": "^6.2.0", + "expect": "^26.1.0", + "extend": "^3.0.2", + "file-type": "16.5.4", + "form-data": "^2.3.3", + "isstream": "~0.1.2", + "jsonwebtoken": "^9.0.0", + "lodash.isempty": "^4.4.0", + "mime-types": "^2.1.35", + "retry-axios": "^2.6.0", + "tough-cookie": "^4.1.3" + }, + "dependencies": { + "@types/node": { + "version": "10.14.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.22.tgz", + "integrity": "sha512-9taxKC944BqoTVjE+UT3pQH0nHZlTvITwfsOZqyc+R3sfJuxaTtxWjfn1K2UlxyPcKHf0rnaXcVFrS9F9vf0bw==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "dotenv": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", + "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, "ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", @@ -2562,6 +4813,11 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2577,6 +4833,11 @@ "is-extglob": "^2.1.1" } }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, "is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -2604,12 +4865,65 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, + "jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==" + }, + "jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } + }, + "jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + } + }, + "jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==" + }, "js-sdsl": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", "dev": true }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -2645,6 +4959,23 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, + "jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + } + }, "jsprim": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", @@ -2656,6 +4987,25 @@ "verror": "1.10.0" } }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -2685,12 +5035,89 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "lodash.isempty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "integrity": "sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -2751,11 +5178,29 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, + "object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2811,6 +5256,11 @@ "callsites": "^3.0.0" } }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -2829,22 +5279,62 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "peek-readable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", + "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==" + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + } + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -2860,12 +5350,38 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -2880,6 +5396,26 @@ "util-deprecate": "~1.0.1" } }, + "readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "requires": { + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -2922,15 +5458,35 @@ "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } } } }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, + "retry-axios": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/retry-axios/-/retry-axios-2.6.0.tgz", + "integrity": "sha512-pOLi+Gdll3JekwuFjXO3fTq+L9lzMQGcSq7M5gIjExcl3Gu1hd4XXuf5o3+LuSBsaULQH7DiNbsqPd1chVpQGQ==", + "requires": {} + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -2965,6 +5521,79 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "set-function-length": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "requires": { + "define-data-property": "^1.1.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2980,6 +5609,21 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, "sshpk": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", @@ -2996,6 +5640,26 @@ "tweetnacl": "~0.14.0" } }, + "stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + } + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3019,11 +5683,19 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, + "strtok3": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", + "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", + "requires": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^4.1.0" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -3042,13 +5714,37 @@ "os-tmpdir": "~1.0.2" } }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "token-types": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", + "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", + "requires": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + } + }, "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" } }, "tunnel-agent": { @@ -3079,11 +5775,35 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -3092,16 +5812,35 @@ "punycode": "^2.1.0" } }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -3129,9 +5868,9 @@ } }, "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true }, "wrappy": { @@ -3140,6 +5879,11 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/functions/sample/nodejs/package.json b/functions/sample/nodejs/package.json index 72fa5b6e5f..e22d3d16ee 100644 --- a/functions/sample/nodejs/package.json +++ b/functions/sample/nodejs/package.json @@ -12,7 +12,11 @@ "author": "", "license": "ISC", "dependencies": { - "@cloudant/cloudant": "^4.4.0" + "@cloudant/cloudant": "^4.4.0", + "@ibm-cloud/cloudant": "^0.8.2", + "dotenv": "^16.3.1", + "express": "^4.18.2", + "ibm-cloud-sdk-core": "^4.2.2" }, "devDependencies": { "eslint": "^8.27.0" diff --git a/functions/sample/python/main.py b/functions/sample/python/main.py index a88499515c..ee9681eb86 100644 --- a/functions/sample/python/main.py +++ b/functions/sample/python/main.py @@ -7,6 +7,19 @@ from cloudant.error import CloudantException import requests +from flask import Flask, jsonify, request +import json +from flask_cors import CORS + +app = Flask(__name__) +CORS(app) + + +param_dict ={ + "COUCH_URL": "72144af7-975a-4c8a-b653-48177d4a207d-bluemix.cloudantnosqldb.appdomain.cloud" , + "IAM_API_KEY": "ySahisbUPABXdqzJc77nAytbcIFLdzMAiLeGuTPRWw5l", + "COUCH_USERNAME": "72144af7-975a-4c8a-b653-48177d4a207d-bluemix", +} def main(param_dict): """Main Function @@ -18,18 +31,80 @@ def main(param_dict): _type_: _description_ TODO """ + + print("params are",param_dict["COUCH_USERNAME"], param_dict["IAM_API_KEY"],param_dict['COUCH_URL']) + try: client = Cloudant.iam( account_name=param_dict["COUCH_USERNAME"], - api_key=param_dict["IAM_API_KEY"], + api_key=param_dict["IAM_API_KEY"],url=param_dict["COUCH_URL"], connect=True, ) - print(f"Databases: {client.all_dbs()}") + + # print(f"Databases: {client.all_dbs()}") except CloudantException as cloudant_exception: print("unable to connect") return {"error": cloudant_exception} except (requests.exceptions.RequestException, ConnectionResetError) as err: print("connection error") return {"error": err} + + dbs_content = {} + for db_name in client.all_dbs(): + db = client[db_name] + dbs_content[db_name]=db.all_docs(include_docs=True)['rows'] + + return {"dbs": dbs_content} + + + + +@app.route('/', methods=['GET']) +def home(): + return main(param_dict) + + +@app.route('/reviews', methods=['GET']) +def reviews(): + result=main(param_dict) + + + + return {'message': result}, 201 + + +@app.route('/reviews', methods=['POST']) +def add_reviews(): + review_data = request.get_json() + + + try: + client = Cloudant.iam( + account_name=param_dict["COUCH_USERNAME"], + api_key=param_dict["IAM_API_KEY"],url=param_dict["COUCH_URL"], + connect=True, + ) + + # print(f"Databases: {client.all_dbs()}") + except CloudantException as cloudant_exception: + print("unable to connect") + return {"error": cloudant_exception} + except (requests.exceptions.RequestException, ConnectionResetError) as err: + print("connection error") + return {"error": err} + + review_db=client['reviews'] + + new_review=review_db.create_document(review_data) + + # Check if the document was saved + if new_review.exists(): + return {'message': 'Review added successfully'}, 201 + else: + return {'message': 'Error adding review'}, 500 + + + + +app.run(port=5000,debug=True) - return {"dbs": client.all_dbs()} diff --git a/server/DataBaseExample.json b/server/DataBaseExample.json new file mode 100644 index 0000000000..077ef7fdf1 --- /dev/null +++ b/server/DataBaseExample.json @@ -0,0 +1,1173 @@ +{ + "dbs": { + "dealerships": [ + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781801d86", + "_rev": "1-34e7ebd07643af43db578a46ee1d6365", + "address": "3 Nova Court", + "city": "El Paso", + "full_name": "Holdlamis Car Dealership", + "id": 1, + "lat": 31.6948, + "long": -106.3, + "short_name": "Holdlamis", + "st": "TX", + "state": "Texas", + "zip": "88563" + }, + "id": "9c3725831f60fdec5f0c0b4781801d86", + "key": "9c3725831f60fdec5f0c0b4781801d86", + "value": { + "rev": "1-34e7ebd07643af43db578a46ee1d6365" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781801fc1", + "_rev": "1-d1778a396ca8cb0ef2966a9854eb93ee", + "address": "6337 Butternut Crossing", + "city": "Minneapolis", + "full_name": "Temp Car Dealership", + "id": 2, + "lat": 44.9762, + "long": -93.2759, + "short_name": "Temp", + "st": "MN", + "state": "Minnesota", + "zip": "55402" + }, + "id": "9c3725831f60fdec5f0c0b4781801fc1", + "key": "9c3725831f60fdec5f0c0b4781801fc1", + "value": { + "rev": "1-d1778a396ca8cb0ef2966a9854eb93ee" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781802f4c", + "_rev": "1-cc5d5c13aa879d1cef8253dfa1dce77d", + "address": "9477 Twin Pines Center", + "city": "Birmingham", + "full_name": "Sub-Ex Car Dealership", + "id": 3, + "lat": 33.5446, + "long": -86.9292, + "short_name": "Sub-Ex", + "st": "AL", + "state": "Alabama", + "zip": "35285" + }, + "id": "9c3725831f60fdec5f0c0b4781802f4c", + "key": "9c3725831f60fdec5f0c0b4781802f4c", + "value": { + "rev": "1-cc5d5c13aa879d1cef8253dfa1dce77d" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781803847", + "_rev": "1-a79013b42c83451d49e7e3aba4a575e3", + "address": "85800 Hazelcrest Circle", + "city": "Dallas", + "full_name": "Solarbreeze Car Dealership", + "id": 4, + "lat": 32.6722, + "long": -96.7774, + "short_name": "Solarbreeze", + "st": "TX", + "state": "Texas", + "zip": "75241" + }, + "id": "9c3725831f60fdec5f0c0b4781803847", + "key": "9c3725831f60fdec5f0c0b4781803847", + "value": { + "rev": "1-a79013b42c83451d49e7e3aba4a575e3" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180403c", + "_rev": "1-c16dcd97a91588c9866814f61ea72751", + "address": "93 Golf Course Pass", + "city": "Baltimore", + "full_name": "Regrant Car Dealership", + "id": 5, + "lat": 39.2847, + "long": -76.6205, + "short_name": "Regrant", + "st": "MD", + "state": "Maryland", + "zip": "21203" + }, + "id": "9c3725831f60fdec5f0c0b478180403c", + "key": "9c3725831f60fdec5f0c0b478180403c", + "value": { + "rev": "1-c16dcd97a91588c9866814f61ea72751" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b47818042b7", + "_rev": "1-e37424d3be7785cbdbc4ed12ec29b343", + "address": "2 Burrows Hill", + "city": "Wilkes Barre", + "full_name": "Stronghold Car Dealership", + "id": 6, + "lat": 41.2722, + "long": -75.8801, + "short_name": "Stronghold", + "st": "PA", + "state": "Pennsylvania", + "zip": "18763" + }, + "id": "9c3725831f60fdec5f0c0b47818042b7", + "key": "9c3725831f60fdec5f0c0b47818042b7", + "value": { + "rev": "1-e37424d3be7785cbdbc4ed12ec29b343" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b47818049b6", + "_rev": "1-96db320a9c736d2e08e8b1bf873d0e04", + "address": "9 Cambridge Park", + "city": "Pueblo", + "full_name": "Job Car Dealership", + "id": 7, + "lat": 38.1286, + "long": -104.5523, + "short_name": "Job", + "st": "CO", + "state": "Colorado", + "zip": "81010" + }, + "id": "9c3725831f60fdec5f0c0b47818049b6", + "key": "9c3725831f60fdec5f0c0b47818049b6", + "value": { + "rev": "1-96db320a9c736d2e08e8b1bf873d0e04" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180542a", + "_rev": "1-4e4889794e42a9e092c1442118889232", + "address": "288 Larry Place", + "city": "Topeka", + "full_name": "Bytecard Car Dealership", + "id": 8, + "lat": 39.0429, + "long": -95.7697, + "short_name": "Bytecard", + "st": "KS", + "state": "Kansas", + "zip": "66642" + }, + "id": "9c3725831f60fdec5f0c0b478180542a", + "key": "9c3725831f60fdec5f0c0b478180542a", + "value": { + "rev": "1-4e4889794e42a9e092c1442118889232" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781805a8b", + "_rev": "1-63f1a1984f40f1de1eabceaec90f7fb6", + "address": "253 Hanson Junction", + "city": "Dallas", + "full_name": "Job Car Dealership", + "id": 9, + "lat": 32.7086, + "long": -96.7955, + "short_name": "Job", + "st": "TX", + "state": "Texas", + "zip": "75216" + }, + "id": "9c3725831f60fdec5f0c0b4781805a8b", + "key": "9c3725831f60fdec5f0c0b4781805a8b", + "value": { + "rev": "1-63f1a1984f40f1de1eabceaec90f7fb6" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781806489", + "_rev": "1-1510e7ca88f225bef573a98f9cb45452", + "address": "108 Memorial Pass", + "city": "Washington", + "full_name": "Alphazap Car Dealership", + "id": 10, + "lat": 38.9067, + "long": -77.0312, + "short_name": "Alphazap", + "st": "DC", + "state": "District of Columbia", + "zip": "20005" + }, + "id": "9c3725831f60fdec5f0c0b4781806489", + "key": "9c3725831f60fdec5f0c0b4781806489", + "value": { + "rev": "1-1510e7ca88f225bef573a98f9cb45452" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781806aa4", + "_rev": "1-25e4e732c54e2138a7d6c344f7c906f4", + "address": "8108 Dryden Court", + "city": "Carol Stream", + "full_name": "Rank Car Dealership", + "id": 11, + "lat": 41.9166, + "long": -88.1208, + "short_name": "Rank", + "st": "IL", + "state": "Illinois", + "zip": "60351" + }, + "id": "9c3725831f60fdec5f0c0b4781806aa4", + "key": "9c3725831f60fdec5f0c0b4781806aa4", + "value": { + "rev": "1-25e4e732c54e2138a7d6c344f7c906f4" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180739c", + "_rev": "1-87eca1b09104f3efd4373e4edfacbb38", + "address": "168 Pawling Lane", + "city": "Silver Spring", + "full_name": "Tin Car Dealership", + "id": 12, + "lat": 39.144, + "long": -77.2076, + "short_name": "Tin", + "st": "MD", + "state": "Maryland", + "zip": "20918" + }, + "id": "9c3725831f60fdec5f0c0b478180739c", + "key": "9c3725831f60fdec5f0c0b478180739c", + "value": { + "rev": "1-87eca1b09104f3efd4373e4edfacbb38" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781807d4b", + "_rev": "1-97762bda9286ea2d1218a64383ab5370", + "address": "452 Fair Oaks Drive", + "city": "Baltimore", + "full_name": "Y-Solowarm Car Dealership", + "id": 13, + "lat": 39.2847, + "long": -76.6205, + "short_name": "Y-Solowarm", + "st": "MD", + "state": "Maryland", + "zip": "21275" + }, + "id": "9c3725831f60fdec5f0c0b4781807d4b", + "key": "9c3725831f60fdec5f0c0b4781807d4b", + "value": { + "rev": "1-97762bda9286ea2d1218a64383ab5370" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781808645", + "_rev": "1-7828b3ead20b34e43a00d8305fee6cd2", + "address": "2109 Scott Parkway", + "city": "San Francisco", + "full_name": "It Car Dealership", + "id": 14, + "lat": 37.7848, + "long": -122.7278, + "short_name": "It", + "st": "CA", + "state": "California", + "zip": "94147" + }, + "id": "9c3725831f60fdec5f0c0b4781808645", + "key": "9c3725831f60fdec5f0c0b4781808645", + "value": { + "rev": "1-7828b3ead20b34e43a00d8305fee6cd2" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781809601", + "_rev": "1-018064051a79bae4a38595f6d712f1f4", + "address": "5057 Pankratz Hill", + "city": "San Antonio", + "full_name": "Tempsoft Car Dealership", + "id": 15, + "lat": 29.3875, + "long": -98.5245, + "short_name": "Tempsoft", + "st": "TX", + "state": "Texas", + "zip": "78225" + }, + "id": "9c3725831f60fdec5f0c0b4781809601", + "key": "9c3725831f60fdec5f0c0b4781809601", + "value": { + "rev": "1-018064051a79bae4a38595f6d712f1f4" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180a203", + "_rev": "1-cfc990372e5aead5c1461c5363ab9661", + "address": "0 Rieder Trail", + "city": "El Paso", + "full_name": "Treeflex Car Dealership", + "id": 16, + "lat": 31.6948, + "long": -106.3, + "short_name": "Treeflex", + "st": "TX", + "state": "Texas", + "zip": "79994" + }, + "id": "9c3725831f60fdec5f0c0b478180a203", + "key": "9c3725831f60fdec5f0c0b478180a203", + "value": { + "rev": "1-cfc990372e5aead5c1461c5363ab9661" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180a4f8", + "_rev": "1-ee4a7286b4515e5c4ef7fb152c6dc37d", + "address": "7670 American Ash Drive", + "city": "San Jose", + "full_name": "Home Ing Car Dealership", + "id": 17, + "lat": 37.2602, + "long": -121.7709, + "short_name": "Home Ing", + "st": "CA", + "state": "California", + "zip": "95138" + }, + "id": "9c3725831f60fdec5f0c0b478180a4f8", + "key": "9c3725831f60fdec5f0c0b478180a4f8", + "value": { + "rev": "1-ee4a7286b4515e5c4ef7fb152c6dc37d" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180aea7", + "_rev": "1-2c1ccca9532d409320038cb83d4f80d6", + "address": "4 Pearson Avenue", + "city": "Whittier", + "full_name": "Bitchip Car Dealership", + "id": 18, + "lat": 33.9413, + "long": -118.0356, + "short_name": "Bitchip", + "st": "CA", + "state": "California", + "zip": "90605" + }, + "id": "9c3725831f60fdec5f0c0b478180aea7", + "key": "9c3725831f60fdec5f0c0b478180aea7", + "value": { + "rev": "1-2c1ccca9532d409320038cb83d4f80d6" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180b826", + "_rev": "1-4467795f20d7931f351651580bc75d0d", + "address": "93 Monument Circle", + "city": "Hialeah", + "full_name": "Otcom Car Dealership", + "id": 19, + "lat": 25.8594, + "long": -80.2725, + "short_name": "Otcom", + "st": "FL", + "state": "Florida", + "zip": "33013" + }, + "id": "9c3725831f60fdec5f0c0b478180b826", + "key": "9c3725831f60fdec5f0c0b478180b826", + "value": { + "rev": "1-4467795f20d7931f351651580bc75d0d" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180bd2d", + "_rev": "1-3518514abb91e959ae2c73d2a0468962", + "address": "4580 Waubesa Lane", + "city": "Detroit", + "full_name": "Subin Car Dealership", + "id": 20, + "lat": 42.4098, + "long": -82.9441, + "short_name": "Subin", + "st": "MI", + "state": "Michigan", + "zip": "48224" + }, + "id": "9c3725831f60fdec5f0c0b478180bd2d", + "key": "9c3725831f60fdec5f0c0b478180bd2d", + "value": { + "rev": "1-3518514abb91e959ae2c73d2a0468962" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180ca5f", + "_rev": "1-3f78374abc08662f7f9bde1cc4b726a6", + "address": "046 Mockingbird Junction", + "city": "San Francisco", + "full_name": "Andalax Car Dealership", + "id": 21, + "lat": 37.7848, + "long": -122.7278, + "short_name": "Andalax", + "st": "CA", + "state": "California", + "zip": "94154" + }, + "id": "9c3725831f60fdec5f0c0b478180ca5f", + "key": "9c3725831f60fdec5f0c0b478180ca5f", + "value": { + "rev": "1-3f78374abc08662f7f9bde1cc4b726a6" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180d5dd", + "_rev": "1-cd8b9f26a5f3445ac312f1242a67fe6b", + "address": "45737 Butternut Lane", + "city": "Fort Lauderdale", + "full_name": "Y-Solowarm Car Dealership", + "id": 22, + "lat": 26.0663, + "long": -80.3339, + "short_name": "Y-Solowarm", + "st": "FL", + "state": "Florida", + "zip": "33330" + }, + "id": "9c3725831f60fdec5f0c0b478180d5dd", + "key": "9c3725831f60fdec5f0c0b478180d5dd", + "value": { + "rev": "1-cd8b9f26a5f3445ac312f1242a67fe6b" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180d8a3", + "_rev": "1-35acfb718ff5e840b6dfa2234635a9cc", + "address": "21425 Bartelt Pass", + "city": "Des Moines", + "full_name": "Bitchip Car Dealership", + "id": 23, + "lat": 41.6727, + "long": -93.5722, + "short_name": "Bitchip", + "st": "IA", + "state": "Iowa", + "zip": "50936" + }, + "id": "9c3725831f60fdec5f0c0b478180d8a3", + "key": "9c3725831f60fdec5f0c0b478180d8a3", + "value": { + "rev": "1-35acfb718ff5e840b6dfa2234635a9cc" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180e6aa", + "_rev": "1-f64046127bcb266e6d8621a6e0761edf", + "address": "408 Delaware Circle", + "city": "Utica", + "full_name": "Aerified Car Dealership", + "id": 24, + "lat": 43.0872, + "long": -75.2603, + "short_name": "Aerified", + "st": "NY", + "state": "New York", + "zip": "13505" + }, + "id": "9c3725831f60fdec5f0c0b478180e6aa", + "key": "9c3725831f60fdec5f0c0b478180e6aa", + "value": { + "rev": "1-f64046127bcb266e6d8621a6e0761edf" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180f659", + "_rev": "1-b9645c81abd6ad8111bbd1c3adddc211", + "address": "6505 Melrose Junction", + "city": "Washington", + "full_name": "Opela Car Dealership", + "id": 25, + "lat": 38.8933, + "long": -77.0146, + "short_name": "Opela", + "st": "DC", + "state": "District of Columbia", + "zip": "20580" + }, + "id": "9c3725831f60fdec5f0c0b478180f659", + "key": "9c3725831f60fdec5f0c0b478180f659", + "value": { + "rev": "1-b9645c81abd6ad8111bbd1c3adddc211" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478180fe50", + "_rev": "1-4ca2683a2bc5d6adc9d7f17d6a6d3815", + "address": "306 Jenna Parkway", + "city": "Pittsburgh", + "full_name": "Flowdesk Car Dealership", + "id": 26, + "lat": 40.4344, + "long": -80.0248, + "short_name": "Flowdesk", + "st": "PA", + "state": "Pennsylvania", + "zip": "15279" + }, + "id": "9c3725831f60fdec5f0c0b478180fe50", + "key": "9c3725831f60fdec5f0c0b478180fe50", + "value": { + "rev": "1-4ca2683a2bc5d6adc9d7f17d6a6d3815" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b47818101c5", + "_rev": "1-0d1ad5ed7cfde86fde2b69345e3b8163", + "address": "95321 Superior Hill", + "city": "San Antonio", + "full_name": "Namfix Car Dealership", + "id": 27, + "lat": 29.4189, + "long": -98.6895, + "short_name": "Namfix", + "st": "TX", + "state": "Texas", + "zip": "78245" + }, + "id": "9c3725831f60fdec5f0c0b47818101c5", + "key": "9c3725831f60fdec5f0c0b47818101c5", + "value": { + "rev": "1-0d1ad5ed7cfde86fde2b69345e3b8163" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b47818102e4", + "_rev": "1-fdc867c57002345cfe2e0d17fbb0d4b1", + "address": "5458 Maple Way", + "city": "Hialeah", + "full_name": "Fixflex Car Dealership", + "id": 28, + "lat": 25.9098, + "long": -80.3889, + "short_name": "Fixflex", + "st": "FL", + "state": "Florida", + "zip": "33018" + }, + "id": "9c3725831f60fdec5f0c0b47818102e4", + "key": "9c3725831f60fdec5f0c0b47818102e4", + "value": { + "rev": "1-fdc867c57002345cfe2e0d17fbb0d4b1" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b47818108f4", + "_rev": "1-a017eedc4af988246172b38580dd1bc5", + "address": "9 Harper Circle", + "city": "San Francisco", + "full_name": "Fix San Car Dealership", + "id": 29, + "lat": 37.7509, + "long": -122.4153, + "short_name": "Fix San", + "st": "CA", + "state": "California", + "zip": "94110" + }, + "id": "9c3725831f60fdec5f0c0b47818108f4", + "key": "9c3725831f60fdec5f0c0b47818108f4", + "value": { + "rev": "1-a017eedc4af988246172b38580dd1bc5" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781810955", + "_rev": "1-bc91c48db51d66e73a2e6b759f566014", + "address": "5423 Spaight Road", + "city": "Houston", + "full_name": "Opela Car Dealership", + "id": 30, + "lat": 29.834, + "long": -95.4342, + "short_name": "Opela", + "st": "TX", + "state": "Texas", + "zip": "77218" + }, + "id": "9c3725831f60fdec5f0c0b4781810955", + "key": "9c3725831f60fdec5f0c0b4781810955", + "value": { + "rev": "1-bc91c48db51d66e73a2e6b759f566014" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781810d07", + "_rev": "1-9000d475bd23c5fd22121b16319db543", + "address": "5 Northfield Pass", + "city": "New York City", + "full_name": "Fintone Car Dealership", + "id": 31, + "lat": 40.7808, + "long": -73.9772, + "short_name": "Fintone", + "st": "NY", + "state": "New York", + "zip": "10131" + }, + "id": "9c3725831f60fdec5f0c0b4781810d07", + "key": "9c3725831f60fdec5f0c0b4781810d07", + "value": { + "rev": "1-9000d475bd23c5fd22121b16319db543" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478181147b", + "_rev": "1-cdbfaad14f48d0bd80b435460a802b38", + "address": "3 Carey Junction", + "city": "Wilkes Barre", + "full_name": "Subin Car Dealership", + "id": 32, + "lat": 41.2722, + "long": -75.8801, + "short_name": "Subin", + "st": "PA", + "state": "Pennsylvania", + "zip": "18768" + }, + "id": "9c3725831f60fdec5f0c0b478181147b", + "key": "9c3725831f60fdec5f0c0b478181147b", + "value": { + "rev": "1-cdbfaad14f48d0bd80b435460a802b38" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781811580", + "_rev": "1-c6418f907fbb6365e6a996004b7100f0", + "address": "627 Cottonwood Circle", + "city": "Des Moines", + "full_name": "Tres-Zap Car Dealership", + "id": 33, + "lat": 41.6727, + "long": -93.5722, + "short_name": "Tres-Zap", + "st": "IA", + "state": "Iowa", + "zip": "50335" + }, + "id": "9c3725831f60fdec5f0c0b4781811580", + "key": "9c3725831f60fdec5f0c0b4781811580", + "value": { + "rev": "1-c6418f907fbb6365e6a996004b7100f0" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781811df4", + "_rev": "1-4d8add6ff98d59554709f3bd95e0b7fa", + "address": "8 Green Hill", + "city": "Silver Spring", + "full_name": "Gembucket Car Dealership", + "id": 34, + "lat": 39.0668, + "long": -76.9969, + "short_name": "Gembucket", + "st": "MD", + "state": "Maryland", + "zip": "20904" + }, + "id": "9c3725831f60fdec5f0c0b4781811df4", + "key": "9c3725831f60fdec5f0c0b4781811df4", + "value": { + "rev": "1-4d8add6ff98d59554709f3bd95e0b7fa" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b47818121d3", + "_rev": "1-046cb455b152448daea503bc1fb84941", + "address": "9 Beilfuss Trail", + "city": "Seattle", + "full_name": "Treeflex Car Dealership", + "id": 35, + "lat": 47.4497, + "long": -122.3076, + "short_name": "Treeflex", + "st": "WA", + "state": "Washington", + "zip": "98158" + }, + "id": "9c3725831f60fdec5f0c0b47818121d3", + "key": "9c3725831f60fdec5f0c0b47818121d3", + "value": { + "rev": "1-046cb455b152448daea503bc1fb84941" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b47818128ea", + "_rev": "1-9a5b78f2e289c88181452eae51029f19", + "address": "311 Paget Alley", + "city": "Vienna", + "full_name": "Latlux Car Dealership", + "id": 36, + "lat": 38.8318, + "long": -77.2888, + "short_name": "Latlux", + "st": "VA", + "state": "Virginia", + "zip": "22184" + }, + "id": "9c3725831f60fdec5f0c0b47818128ea", + "key": "9c3725831f60fdec5f0c0b47818128ea", + "value": { + "rev": "1-9a5b78f2e289c88181452eae51029f19" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781813207", + "_rev": "1-0938f528ee4ec72ba5710e4f855e3688", + "address": "152 Moland Lane", + "city": "Detroit", + "full_name": "Ventosanzap Car Dealership", + "id": 37, + "lat": 42.4098, + "long": -82.9441, + "short_name": "Ventosanzap", + "st": "MI", + "state": "Michigan", + "zip": "48224" + }, + "id": "9c3725831f60fdec5f0c0b4781813207", + "key": "9c3725831f60fdec5f0c0b4781813207", + "value": { + "rev": "1-0938f528ee4ec72ba5710e4f855e3688" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781813b5b", + "_rev": "1-6e07d6d5c6d7a616ba7b7358db413d1a", + "address": "821 New Castle Trail", + "city": "Dallas", + "full_name": "Zamit Car Dealership", + "id": 38, + "lat": 32.7887, + "long": -96.7676, + "short_name": "Zamit", + "st": "TX", + "state": "Texas", + "zip": "75226" + }, + "id": "9c3725831f60fdec5f0c0b4781813b5b", + "key": "9c3725831f60fdec5f0c0b4781813b5b", + "value": { + "rev": "1-6e07d6d5c6d7a616ba7b7358db413d1a" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781813f43", + "_rev": "1-aad3e04d9c8755694ad22d3bb6915553", + "address": "990 Raven Road", + "city": "Fresno", + "full_name": "Stronghold Car Dealership", + "id": 39, + "lat": 36.7464, + "long": -119.6397, + "short_name": "Stronghold", + "st": "CA", + "state": "California", + "zip": "93740" + }, + "id": "9c3725831f60fdec5f0c0b4781813f43", + "key": "9c3725831f60fdec5f0c0b4781813f43", + "value": { + "rev": "1-aad3e04d9c8755694ad22d3bb6915553" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781814e22", + "_rev": "1-50617ded0848567bbdbda0551272923b", + "address": "89375 Main Trail", + "city": "Merrifield", + "full_name": "Greenlam Car Dealership", + "id": 40, + "lat": 38.8318, + "long": -77.2888, + "short_name": "Greenlam", + "st": "VA", + "state": "Virginia", + "zip": "22119" + }, + "id": "9c3725831f60fdec5f0c0b4781814e22", + "key": "9c3725831f60fdec5f0c0b4781814e22", + "value": { + "rev": "1-50617ded0848567bbdbda0551272923b" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781815e0e", + "_rev": "1-e258b026351685c07473fd61d7facca1", + "address": "9 Sherman Hill", + "city": "Baltimore", + "full_name": "Tres-Zap Car Dealership", + "id": 41, + "lat": 39.2847, + "long": -76.6205, + "short_name": "Tres-Zap", + "st": "MD", + "state": "Maryland", + "zip": "21275" + }, + "id": "9c3725831f60fdec5f0c0b4781815e0e", + "key": "9c3725831f60fdec5f0c0b4781815e0e", + "value": { + "rev": "1-e258b026351685c07473fd61d7facca1" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b47818161e2", + "_rev": "1-a627885eb87bc547ab133dc9ecea681b", + "address": "62 Manley Point", + "city": "Jersey City", + "full_name": "Konklab Car Dealership", + "id": 42, + "lat": 40.7324, + "long": -74.0431, + "short_name": "Konklab", + "st": "NJ", + "state": "New Jersey", + "zip": "07310" + }, + "id": "9c3725831f60fdec5f0c0b47818161e2", + "key": "9c3725831f60fdec5f0c0b47818161e2", + "value": { + "rev": "1-a627885eb87bc547ab133dc9ecea681b" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781816d18", + "_rev": "1-0ef43a2fc9385b68c4365489004d2b97", + "address": "91 Declaration Avenue", + "city": "Atlanta", + "full_name": "Opela Car Dealership", + "id": 43, + "lat": 33.8913, + "long": -84.0746, + "short_name": "Opela", + "st": "GA", + "state": "Georgia", + "zip": "31119" + }, + "id": "9c3725831f60fdec5f0c0b4781816d18", + "key": "9c3725831f60fdec5f0c0b4781816d18", + "value": { + "rev": "1-0ef43a2fc9385b68c4365489004d2b97" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b478181704c", + "_rev": "1-2acfaaf786b749f0c71351f6468dfbaa", + "address": "0 Northview Point", + "city": "Roanoke", + "full_name": "Veribet Car Dealership", + "id": 44, + "lat": 37.2327, + "long": -79.9463, + "short_name": "Veribet", + "st": "VA", + "state": "Virginia", + "zip": "24014" + }, + "id": "9c3725831f60fdec5f0c0b478181704c", + "key": "9c3725831f60fdec5f0c0b478181704c", + "value": { + "rev": "1-2acfaaf786b749f0c71351f6468dfbaa" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781817c5c", + "_rev": "1-759fc681fcdf10e034bbf8accd3acb00", + "address": "283 Mockingbird Plaza", + "city": "Norfolk", + "full_name": "Konklux Car Dealership", + "id": 45, + "lat": 36.8787, + "long": -76.2604, + "short_name": "Konklux", + "st": "VA", + "state": "Virginia", + "zip": "23509" + }, + "id": "9c3725831f60fdec5f0c0b4781817c5c", + "key": "9c3725831f60fdec5f0c0b4781817c5c", + "value": { + "rev": "1-759fc681fcdf10e034bbf8accd3acb00" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781818842", + "_rev": "1-76c2eb4c28da3ba6cd385dfb820ed4d0", + "address": "527 Hayes Junction", + "city": "New Orleans", + "full_name": "Regrant Car Dealership", + "id": 46, + "lat": 30.033, + "long": -89.8826, + "short_name": "Regrant", + "st": "LA", + "state": "Louisiana", + "zip": "70165" + }, + "id": "9c3725831f60fdec5f0c0b4781818842", + "key": "9c3725831f60fdec5f0c0b4781818842", + "value": { + "rev": "1-76c2eb4c28da3ba6cd385dfb820ed4d0" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781818f7b", + "_rev": "1-83ab719b3f039b858e9e7c9c9462748d", + "address": "840 Pepper Wood Crossing", + "city": "Stamford", + "full_name": "Prodder Car Dealership", + "id": 47, + "lat": 41.0888, + "long": -73.5435, + "short_name": "Prodder", + "st": "CT", + "state": "Connecticut", + "zip": "06905" + }, + "id": "9c3725831f60fdec5f0c0b4781818f7b", + "key": "9c3725831f60fdec5f0c0b4781818f7b", + "value": { + "rev": "1-83ab719b3f039b858e9e7c9c9462748d" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b47818196c9", + "_rev": "1-0d5f62c07f25299a7d95b6422f193c63", + "address": "48610 Morning Street", + "city": "Tucson", + "full_name": "It Car Dealership", + "id": 48, + "lat": 32.2138, + "long": -110.824, + "short_name": "It", + "st": "AZ", + "state": "Arizona", + "zip": "85710" + }, + "id": "9c3725831f60fdec5f0c0b47818196c9", + "key": "9c3725831f60fdec5f0c0b47818196c9", + "value": { + "rev": "1-0d5f62c07f25299a7d95b6422f193c63" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b4781819794", + "_rev": "1-b07c086e72acf42643a1a478e2a07feb", + "address": "222 Grasskamp Plaza", + "city": "Athens", + "full_name": "Veribet Car Dealership", + "id": 49, + "lat": 33.9321, + "long": -83.3525, + "short_name": "Veribet", + "st": "GA", + "state": "Georgia", + "zip": "30605" + }, + "id": "9c3725831f60fdec5f0c0b4781819794", + "key": "9c3725831f60fdec5f0c0b4781819794", + "value": { + "rev": "1-b07c086e72acf42643a1a478e2a07feb" + } + }, + { + "doc": { + "_id": "9c3725831f60fdec5f0c0b47818199da", + "_rev": "1-eba2086b344cc60c0a4dd407a6ced307", + "address": "76 Clove Trail", + "city": "Atlanta", + "full_name": "Aerified Car Dealership", + "id": 50, + "lat": 33.7217, + "long": -84.3339, + "short_name": "Aerified", + "st": "GA", + "state": "Georgia", + "zip": "30316" + }, + "id": "9c3725831f60fdec5f0c0b47818199da", + "key": "9c3725831f60fdec5f0c0b47818199da", + "value": { + "rev": "1-eba2086b344cc60c0a4dd407a6ced307" + } + } + ], + "reviews": [ + { + "doc": { + "_id": "310b6145c664ca5c3770ef71485fb8df", + "_rev": "1-6d3a316e140863cdb147048888d26051", + "car_make": "Audi", + "car_model": "A6", + "car_year": 2010, + "dealership": 15, + "id": 1, + "name": "Berkly Shepley", + "purchase": true, + "purchase_date": "07/11/2020", + "review": "Total grid-enabled service-desk" + }, + "id": "310b6145c664ca5c3770ef71485fb8df", + "key": "310b6145c664ca5c3770ef71485fb8df", + "value": { + "rev": "1-6d3a316e140863cdb147048888d26051" + } + }, + { + "doc": { + "_id": "310b6145c664ca5c3770ef71485fc075", + "_rev": "1-0cbc084ce570374a1d0c2653ceb254ad", + "car_make": "Pontiac", + "car_model": "Firebird", + "car_year": 1995, + "dealership": 23, + "id": 2, + "name": "Gwenora Zettoi", + "purchase": true, + "purchase_date": "09/17/2020", + "review": "Future-proofed foreground capability" + }, + "id": "310b6145c664ca5c3770ef71485fc075", + "key": "310b6145c664ca5c3770ef71485fc075", + "value": { + "rev": "1-0cbc084ce570374a1d0c2653ceb254ad" + } + }, + { + "doc": { + "_id": "310b6145c664ca5c3770ef71485fc173", + "_rev": "1-278e31d48be2f5abc7c9b542cff00208", + "car_make": "Mazda", + "car_model": "MX-5", + "car_year": 2003, + "dealership": 29, + "id": 3, + "name": "Lion Reames", + "purchase": true, + "purchase_date": "10/20/2020", + "review": "Expanded global groupware" + }, + "id": "310b6145c664ca5c3770ef71485fc173", + "key": "310b6145c664ca5c3770ef71485fc173", + "value": { + "rev": "1-278e31d48be2f5abc7c9b542cff00208" + } + }, + { + "doc": { + "_id": "310b6145c664ca5c3770ef71485fcad6", + "_rev": "1-1677bbc642e9673d151d56614ad81963", + "dealership": 13, + "id": 4, + "name": "Iorgos Colley", + "purchase": false, + "review": "Optional heuristic software" + }, + "id": "310b6145c664ca5c3770ef71485fcad6", + "key": "310b6145c664ca5c3770ef71485fcad6", + "value": { + "rev": "1-1677bbc642e9673d151d56614ad81963" + } + }, + { + "doc": { + "_id": "310b6145c664ca5c3770ef71485fccf9", + "_rev": "1-7e446087190b20656bad81aeab9242b5", + "dealership": 46, + "id": 5, + "name": "Kissee Noirel", + "purchase": false, + "review": "Diverse client-server success" + }, + "id": "310b6145c664ca5c3770ef71485fccf9", + "key": "310b6145c664ca5c3770ef71485fccf9", + "value": { + "rev": "1-7e446087190b20656bad81aeab9242b5" + } + }, + { + "doc": { + "_id": "52844e3d638580a4eeee1d72fbec17f6", + "_rev": "1-3072ebde1a82289cf9619f69e3db0e0f", + "review": { + "another": "field", + "car_make": "Audi", + "car_model": "Car", + "car_year": 2021, + "dealership": 15, + "id": 1114, + "name": "Upkar Lidder", + "purchase": false, + "purchase_date": "02/16/2021", + "review": "Great service!" + } + }, + "id": "52844e3d638580a4eeee1d72fbec17f6", + "key": "52844e3d638580a4eeee1d72fbec17f6", + "value": { + "rev": "1-3072ebde1a82289cf9619f69e3db0e0f" + } + } + ] + } + } \ No newline at end of file diff --git a/server/Dockerfile b/server/Dockerfile new file mode 100644 index 0000000000..a88983546c --- /dev/null +++ b/server/Dockerfile @@ -0,0 +1,26 @@ +FROM python:3.12.0-slim-bookworm + +ENV PYTHONBUFFERED 1 +ENV PYTHONWRITEBYTECODE 1 + +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 +COPY entrypoint.sh /app/entrypoint.sh + +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/db.sqlite3 b/server/db.sqlite3 new file mode 100644 index 0000000000..8910d4ffa2 Binary files /dev/null and b/server/db.sqlite3 differ diff --git a/server/djangoapp/admin.py b/server/djangoapp/admin.py index b1039e16b8..d037608b8d 100644 --- a/server/djangoapp/admin.py +++ b/server/djangoapp/admin.py @@ -1,13 +1,21 @@ from django.contrib import admin -# from .models import related models +from .models import CarMake,CarModel -# Register your models here. - # CarModelInline class +class CarModelInline(admin.StackedInline): + model = CarModel + extra = 3 # how many rows to show + # CarModelAdmin class +class CarModelAdmin(admin.ModelAdmin): + list_display = ('make', 'dealerId', 'type', 'year') # fields to display in list view + search_fields = ('make', 'dealerId', 'type', 'year') # fields to search in search box # CarMakeAdmin class with CarModelInline - +class CarMakeAdmin(admin.ModelAdmin): + inlines = [CarModelInline] # Register models here +admin.site.register(CarModel, CarModelAdmin) +admin.site.register(CarMake, CarMakeAdmin) diff --git a/server/djangoapp/forms.py b/server/djangoapp/forms.py new file mode 100644 index 0000000000..66c7bd8d45 --- /dev/null +++ b/server/djangoapp/forms.py @@ -0,0 +1,29 @@ +from django import forms +from django.contrib.auth.forms import UserCreationForm +from django.contrib.auth.models import User + +from .models import CarModel + +class RegisterForm(UserCreationForm): + email = forms.EmailField(required=True) + first_name = forms.CharField(max_length=30,required=True) + last_name = forms.CharField(max_length=30,required=True) + + class Meta: + model=User + fields=['username','email','first_name','last_name', + 'password1','password2'] + + +class ReviewForm(forms.Form): + name = forms.CharField(max_length=30,required=True) + id = forms.CharField(max_length=30,required=True) + content = forms.CharField(widget=forms.Textarea,required=True) + purchasecheck = forms.BooleanField(required=True) + purchase_date = forms.CharField(max_length=50,required=True) + + car = forms.ModelChoiceField(queryset=CarModel.objects.all(), required=True) + + + + dealership=forms.CharField(max_length=50,required=True) \ No newline at end of file diff --git a/server/djangoapp/models.py b/server/djangoapp/models.py index 27d96f4eff..ea28339580 100644 --- a/server/djangoapp/models.py +++ b/server/djangoapp/models.py @@ -10,6 +10,25 @@ # - Any other fields you would like to include in car make model # - __str__ method to print a car make object +class CarMake(models.Model): + name=models.CharField(max_length=200) + description=models.CharField(max_length=200) + + + def __str__(self): + return str(self.name) + +class CarModel(models.Model): + make=models.ForeignKey(CarMake,on_delete=models.CASCADE) + dealerId=models.IntegerField() + name=models.CharField(max_length=200,default='civic') + + type=models.CharField(max_length=200) + year=models.DateField() + def __str__(self): + return str(self.make) + + # 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) @@ -22,6 +41,85 @@ # Create a plain Python class `CarDealer` to hold dealer data + +class CarDealer: + + def __init__(self=None, + address=None, + city=None, + full_name=None, + id=None, + lat=None, + long=None, + short_name=None, + st=None, + zip=None, + state=None): + self.id=id + self.full_name=full_name + self.city=city + self.address=address + self.lat=lat + self.long=long + self.short_name=short_name + self.st=st + self.zip=zip + self.state=state + self.important_fields_names=['id','full_name','city','address','zip','st'] + + + + def __str__(self): + return f"Dealer name: { self.full_name}" + def get_fields(self): + return vars(self) + + def get_frontend_fieldnames(self): + return {k: v for k,v in vars(self).items() if k in self.important_fields_names} + + def to_dict(self): + return vars(self) # Create a plain Python class `DealerReview` to hold review data + +class DealerReview: + + def __init__(self=None, + dealership=None, + name=None, + purchase=None, + review=None, + purchase_date=None, + car_make=None, + car_model=None, + car_year=None, + sentiment=None, + id=None): + self.dealership=dealership + self.name=name + self.purchase=purchase + self.purchase_date=purchase_date + self.car_make=car_make + self.car_model=car_model + self.car_year=car_year + self.sentiment=sentiment + self.id=id + self.review=review + + self.important_fields_names=['name','id','dealership','purchase_date','car_make','car_year','review'] + + + def __str__(self): + return f"Reviewer name: {self.name}" + + + def get_fields(self): + return vars(self) + + def get_frontend_fieldnames(self): + return {k: v for k,v in vars(self).items() if k in self.important_fields_names} + + + + diff --git a/server/djangoapp/restapis.py b/server/djangoapp/restapis.py index b4d13f596a..8d658234fa 100644 --- a/server/djangoapp/restapis.py +++ b/server/djangoapp/restapis.py @@ -2,14 +2,59 @@ import json # import related models here from requests.auth import HTTPBasicAuth +from .models import CarDealer,DealerReview - +# im using the index-promise.js from previous +# lab since the functions option does not exist anymore in IBM cloud +# +#url="http://localhost:5000" # Create a `get_request` to make HTTP GET requests # e.g., response = requests.get(url, params=params, headers={'Content-Type': 'application/json'}, # auth=HTTPBasicAuth('apikey', api_key)) +import nltk +nltk.download('vader_lexicon') + +from nltk.sentiment import SentimentIntensityAnalyzer +sia = SentimentIntensityAnalyzer() + +def get_request(url,**kwargs): + + print(f'calling restapis.get_request({url})') + + apikey=kwargs.pop('apikey',None) + headers=kwargs.pop('headers',None) + data=kwargs.pop('data',None) + + try: + + if( apikey ): + response=requests.get(url, headers=headers,data=data, auth=HTTPBasicAuth('apikey', apikey)) + else: + response = requests.get(url, headers={'Content-Type': 'application/json'}, + params=kwargs) + + print(response.text) + return response.text + + except Exception as e: + print(e) + return '' + + + # Create a `post_request` to make HTTP POST requests + +def post_request(url,**kwargs): + + payload={} + response = requests.post(url, params=kwargs, json=payload) + + + return response.text + + # e.g., response = requests.post(url, params=kwargs, json=payload) @@ -18,6 +63,85 @@ # - Call get_request() with specified arguments # - Parse JSON results into a CarDealer object list +def get_dealers_from_cf(url, **kwargs): + + results=[] + json_result=json.loads(get_request(url,**kwargs)) + + if isinstance(json_result,dict) and 'result' in json_result: + dealers=json_result['result'] + elif isinstance(json_result,list): + dealers=json_result + else: + print("unexpected format of json result") + return [] + + if json_result: + for dealer in dealers: + dealer_doc=dealer["doc"] + + dealer_obj = CarDealer(address=dealer_doc["address"], city=dealer_doc["city"], full_name=dealer_doc["full_name"], + id=dealer_doc["id"], lat=dealer_doc["lat"], long=dealer_doc["long"], + short_name=dealer_doc["short_name"], + st=dealer_doc["st"], zip=dealer_doc["zip"]) + + results.append(dealer_obj) + + + + # Format the JSON result + formatted_json_result = json.dumps(json_result, indent=4) + print(formatted_json_result) + + return results + +def get_dealer_reviews_from_cf(url, **kwargs): + + results=[] + json_result=json.loads(get_request(url,**kwargs)) + + print("json result from getting all reviews") + print(json_result) + + if isinstance(json_result,dict) and 'result' in json_result: + dealers=json_result['result'] + elif isinstance(json_result,list): + dealers=json_result + else: + print("unexpected format of json result") + return [] + + if json_result: + #dealers = json_result["rows"] + for dealer in dealers: + + dealer_obj=DealerReview() + + for var in dealer_obj.get_fields(): + + try: + setattr(dealer_obj,var,dealer["doc"][var]) + except: + setattr(dealer_obj,var,None) + + + # Now set the Sentiment + try: + setattr(dealer_obj,'sentiment',sia.polarity_scores(dealer_obj.review) ) + except: + setattr(dealer_obj,'sentiment',"None" ) + + + results.append(dealer_obj) + + + + + # Format the JSON result + formatted_json_result = json.dumps(json_result, indent=4) + print(formatted_json_result) + return results + # Create a get_dealer_reviews_from_cf method to get reviews by dealer id from a cloud function # def get_dealer_by_id_from_cf(url, dealerId): diff --git a/server/djangoapp/templates/djangoapp/about.html b/server/djangoapp/templates/djangoapp/about.html new file mode 100644 index 0000000000..3a01fd9c3d --- /dev/null +++ b/server/djangoapp/templates/djangoapp/about.html @@ -0,0 +1,8 @@ +{% extends 'djangoapp/base.html' %} + +{%block title %} About Us {% endblock %} + + +{%block content %} +

Started in 1966, BestCars dealer is a great platform to review car dealerships +{% endblock %} \ No newline at end of file diff --git a/server/djangoapp/templates/djangoapp/addreview.html b/server/djangoapp/templates/djangoapp/addreview.html new file mode 100644 index 0000000000..d652bab209 --- /dev/null +++ b/server/djangoapp/templates/djangoapp/addreview.html @@ -0,0 +1,102 @@ +{% extends 'djangoapp/base.html' %} + + + +{%block title %} Add Review {% endblock %} + +{% load static %} + +{% block content %} +{% if user.is_authenticated %} +

Enter review for a car dealership below

+
+ {% csrf_token %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Value User Input
Name
Review
Purchase Made +       + + +   +
+
Visit Date
+
+
+ +
+ +
Raw Data Sent to server:
+{{formdata}} + +
Response from NodeJS+Express server:
+{{response}} + {% else %} +

You must be logged in to add a review.

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

Contact Us

+
+ {% csrf_token %} +
+ + +
+
+ + +
+
+ + +
+ +
+
+{% endblock %} \ No newline at end of file diff --git a/server/djangoapp/templates/djangoapp/dealer_details.html b/server/djangoapp/templates/djangoapp/dealer_details.html deleted file mode 100644 index 25bd9a223d..0000000000 --- a/server/djangoapp/templates/djangoapp/dealer_details.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - Dealership Review - {% load static %} - - - - - - - - - - - - \ No newline at end of file diff --git a/server/djangoapp/templates/djangoapp/dealershiplist.html b/server/djangoapp/templates/djangoapp/dealershiplist.html new file mode 100644 index 0000000000..fb9b7b9bc9 --- /dev/null +++ b/server/djangoapp/templates/djangoapp/dealershiplist.html @@ -0,0 +1,47 @@ +{% extends 'djangoapp/base.html' %} + +{%block title %} Dealership List {% endblock %} +{% load static %} + +{% load getattribute %} +{% block content %} + + + + + {% for fieldname in fieldnames %} + {% if fieldname == "st" %} + + + {% else %} + + {% endif %} + {% endfor %} + + + + {% for dealer in dealerships %} + + {% for fieldname in fieldnames %} + {% if fieldname == "full_name" %} + {% else %} + + + {% endif %} + {% endfor %} + + + {% endfor %} + +
{{fieldname}}{{fieldname}}
{{dealer.full_name}}{{ dealer|getattribute:fieldname }}
+ + + + +{% endblock %} \ No newline at end of file diff --git a/server/djangoapp/templates/djangoapp/get_dealer_details.html b/server/djangoapp/templates/djangoapp/get_dealer_details.html new file mode 100644 index 0000000000..709ef57919 --- /dev/null +++ b/server/djangoapp/templates/djangoapp/get_dealer_details.html @@ -0,0 +1,43 @@ +{% extends 'djangoapp/base.html' %} + +{%block title %} Dealership Details {% endblock %} + +{% load static %} +{% load getattribute %} + +{% block content %} + + + + + + + + + {% for fieldname,value in dealership.items %} + + {% if fieldname in fieldnames %} + + + {% endif %} + + {% endfor %} + +
Field NameValue
{{ fieldname }}{{ value }}
+

+ +
+ {% for review in reviews %} +
+
+
{{ review.name}}
+

{{ review.review}}-{{review.sentiment_emoticon}}

+
+ +
+ {% endfor %} +
+ +{% endblock %} \ No newline at end of file diff --git a/server/djangoapp/templates/djangoapp/index.html b/server/djangoapp/templates/djangoapp/index.html index 1a9ee6e39a..ace6dc558d 100644 --- a/server/djangoapp/templates/djangoapp/index.html +++ b/server/djangoapp/templates/djangoapp/index.html @@ -1,25 +1,23 @@ - - - - - Dealership Review - - - - - - - +{% extends 'djangoapp/base.html' %} - +{%block title %} Home {% endblock %} - - - This is the index page of your Django app! - - +{% block content %} + +{% endblock %} \ No newline at end of file diff --git a/server/djangoapp/templates/djangoapp/register.html b/server/djangoapp/templates/djangoapp/register.html new file mode 100644 index 0000000000..c4e077d5d0 --- /dev/null +++ b/server/djangoapp/templates/djangoapp/register.html @@ -0,0 +1,9 @@ +{% extends 'djangoapp/base.html' %} + {% block title %}Register{% endblock %} +{% load crispy_forms_tags %} {% block content %} +
+ {% csrf_token %}{{form|crispy}} +

Don't have an account? Login Here!

+ +
+{% endblock %} \ No newline at end of file diff --git a/server/djangoapp/templates/djangoapp/registration.html b/server/djangoapp/templates/djangoapp/registration.html deleted file mode 100644 index ae11ea4b71..0000000000 --- a/server/djangoapp/templates/djangoapp/registration.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - {% load static %} - - - - - - \ No newline at end of file diff --git a/server/djangoapp/templates/djangoapp/reviewlist.html b/server/djangoapp/templates/djangoapp/reviewlist.html new file mode 100644 index 0000000000..16778017dc --- /dev/null +++ b/server/djangoapp/templates/djangoapp/reviewlist.html @@ -0,0 +1,34 @@ +{% extends 'djangoapp/base.html' %} + +{%block title %} Review List {% endblock %} + +{% load static %} +{% load getattribute %} +{% block content %} + + + + {% for fieldname in fieldnames %} + + {% endfor %} + + + + {% for review in reviews %} + + {% for fieldname in fieldnames %} + + {% endfor %} + + {% endfor %} + +
{{fieldname}}
{{ review|getattribute:fieldname }}
+ + +{% endblock %} \ No newline at end of file diff --git a/server/djangoapp/templates/djangoapp/testnlu.html b/server/djangoapp/templates/djangoapp/testnlu.html new file mode 100644 index 0000000000..d6dd809fbe --- /dev/null +++ b/server/djangoapp/templates/djangoapp/testnlu.html @@ -0,0 +1,12 @@ +{% extends 'djangoapp/base.html' %} + +{%block title %} Test NLU {% endblock %} + +{% load static %} + +{% block content %} + +

Output from Watson NLU Call

+

+{{watsonreply}} +{% endblock %} \ No newline at end of file diff --git a/server/djangoapp/templates/registration/login.html b/server/djangoapp/templates/registration/login.html new file mode 100644 index 0000000000..2e57a21f56 --- /dev/null +++ b/server/djangoapp/templates/registration/login.html @@ -0,0 +1,8 @@ +{% extends 'djangoapp/base.html' %} {% block title %}Login{% endblock %} +{% load crispy_forms_tags %} {% block content %} +

+ {% csrf_token %}{{form|crispy}} +

Don't have an account? Create one Here!

+ +
+{% endblock %} \ No newline at end of file diff --git a/server/djangoapp/templatetags/__init__.py b/server/djangoapp/templatetags/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/server/djangoapp/templatetags/getattribute.py b/server/djangoapp/templatetags/getattribute.py new file mode 100644 index 0000000000..9a550c8fb6 --- /dev/null +++ b/server/djangoapp/templatetags/getattribute.py @@ -0,0 +1,12 @@ +from django import template + +register = template.Library() + +@register.filter +def getattribute(value, arg): + """Gets an attribute of an object dynamically from a string name""" + + if hasattr(value, str(arg)): + return getattr(value, arg) + else: + return '' \ No newline at end of file diff --git a/server/djangoapp/urls.py b/server/djangoapp/urls.py index 37b1c89d01..224a539a5d 100644 --- a/server/djangoapp/urls.py +++ b/server/djangoapp/urls.py @@ -9,17 +9,32 @@ # view refers to the view function # name the URL + path('',views.home,name="home"), + path('home/',views.home,name="home"), # path for about view - + path('about/',views.about,name="about"), # path for contact us view + path('contact/',views.contact,name="contact"), # path for registration + path('register/', views.register, name='register'), + # path for login + # path('login/',views.login,name='sign_up'), # path for logout + path('logout/', views.logout_view, name='logout'), + + path(route='get_dealerships/', view=views.get_dealerships, name='get_dealerships'), + + + path(route='get_dealer_details/', view=views.get_dealer_details, name='get_dealer_details'), + path(route='get_reviews/', view=views.get_reviews, name='get_reviews'), + + path(route='add_review/', view=views.add_review, name='add_review'), + - path(route='', view=views.get_dealerships, name='index'), # path for dealer reviews view diff --git a/server/djangoapp/views.py b/server/djangoapp/views.py index 61cc664da0..fe54dbb47c 100644 --- a/server/djangoapp/views.py +++ b/server/djangoapp/views.py @@ -1,3 +1,22 @@ +import os +from dotenv import load_dotenv + +load_dotenv() + + +API_CREDS = { + 'dealership_url': os.getenv('DEALERSHIP_URL',''), + 'review_url': os.getenv('REVIEWS_URL',''), + + 'dealership_key': os.getenv('DEALERSHIP_API_KEY',''), + +} + + +from requests.auth import HTTPBasicAuth +from .models import CarDealer,DealerReview + + from django.shortcuts import render from django.http import HttpResponseRedirect, HttpResponse from django.contrib.auth.models import User @@ -9,45 +28,279 @@ from datetime import datetime import logging import json +import requests + +from .forms import RegisterForm,ReviewForm +from .models import CarDealer,CarMake,CarModel,DealerReview +from .restapis import get_request,get_dealers_from_cf,get_dealer_reviews_from_cf + +import nltk +nltk.download('vader_lexicon') + + +def get_emoticon_from_sentiment(sentiment_dict): + # Get compound score + compound_score = sentiment_dict.get('compound', 0) + + # Assign emoticon based on compound score + if compound_score >= 0.3: + return "😊" # Positive sentiment + elif compound_score <= -0.3: + return "😞" # Negative sentiment + else: + return "😐" # Neutral sentiment + + + + -# Get an instance of a logger -logger = logging.getLogger(__name__) # Create your views here. +def home(request): + return render(request, 'djangoapp/index.html', {}) + # Create an `about` view to render a static about page # def about(request): # ... +def about(request): + return render(request, 'djangoapp/about.html', {}) + # Create a `contact` view to return a static contact page -#def contact(request): + +def contact(request): + return render(request, 'djangoapp/contact.html', {}) + # Create a `login_request` view to handle sign in request # def login_request(request): # ... # Create a `logout_request` view to handle sign out request -# def logout_request(request): -# ... - +def logout_view(request): + logout(request) + return redirect('djangoapp:home') # Create a `registration_request` view to handle sign up request -# def registration_request(request): -# ... +def register(request): + + if request.method == 'POST': + form = RegisterForm(request.POST) + if form.is_valid(): + user= form.save() + login(request,user) + return redirect('djangoapp:home') + else: + form = RegisterForm() + + return render(request,'djangoapp/register.html',{"form":form}) + # Update the `get_dealerships` view to render the index page with a list of dealerships def get_dealerships(request): + dealership_url=API_CREDS['dealership_url'] + dealership_key=API_CREDS['dealership_key'] context = {} - if request.method == "GET": - return render(request, 'djangoapp/index.html', context) + #dealerships=get_request("http://127.0.0.1:5000/api/dealership",id=1) + if request.method == "GET" : + dealerships = get_dealers_from_cf(dealership_url,apikey=dealership_key) + elif request.method =="POST": + id = request.POST.get('id') + dealerships = get_dealers_from_cf(dealership_url, id=id) + else: + dealerships = [] + + context['dealerships']=dealerships + print(dealerships) + + DealerProperties=CarDealer() + + context['fieldnames']=DealerProperties.get_frontend_fieldnames() + + print('fieldnames are \n\n',context['fieldnames'],'\n') + + return render(request, 'djangoapp/dealershiplist.html', context) # Create a `get_dealer_details` view to render the reviews of a dealer # def get_dealer_details(request, dealer_id): # ... +# Update the `get_dealerships` view to render the index page with a list of dealerships +def get_dealer_details(request): + + from nltk.sentiment import SentimentIntensityAnalyzer + sia = SentimentIntensityAnalyzer() + + dealership_url=API_CREDS['dealership_url'] + reviews_url=API_CREDS['review_url'] + dealership_key=API_CREDS['dealership_key'] + + context = {'dealership': {}} + dealership={} + newdealership=CarDealer() + reviews={} + review_list=[] + + + if request.method == "GET": + id = request.GET.get('id') + dealership_url=str(dealership_url)+r'/'+str(id) + reviews_url=str(reviews_url) + + dealer_response=requests.get(url=str(dealership_url), auth=HTTPBasicAuth('apikey', str(dealership_key))) + rev_response=requests.get(url=str(reviews_url), auth=HTTPBasicAuth('apikey', str(dealership_key))) + + dealership=json.loads(dealer_response.text) + reviews=json.loads(rev_response.text) + + print("dealership['doc']",dealership['doc']) + + dealership=dealership['doc'] + + + + for review in reviews: + try: + if(int(review['doc']['id'])==int(id)): + sentiment_dict=sia.polarity_scores(review['doc']['review']) + review['doc']['sentiment']=sentiment_dict + review['doc']['sentiment_emoticon']=get_emoticon_from_sentiment(sentiment_dict) + + + review_list.append(review['doc']) + except Exception as e: + print(e) + + + for (key,value) in dealership.items(): + try: + setattr(newdealership,key,value) + except: + print(" no value for ",key) + + context['dealership']=newdealership.to_dict() + context['fieldnames']=newdealership.get_frontend_fieldnames() + + context['reviews']=review_list + return render(request, 'djangoapp/get_dealer_details.html', context) + + + +# Update the `get_dealerships` view to render the index page with a list of dealerships +def get_reviews(request): + from nltk.sentiment import SentimentIntensityAnalyzer + sia = SentimentIntensityAnalyzer() + reviews_url=API_CREDS['review_url'] + dealership_key=API_CREDS['dealership_key'] + context = {} + reviews = [] + #dealerships=get_request("http://127.0.0.1:5000/api/dealership",id=1) + if request.method == "GET" : + response=requests.get(url=str(reviews_url), auth=HTTPBasicAuth('apikey', str(dealership_key))) + reviews=json.loads(response.text) + + newreviews=[] + for review in reviews: + + review_obj = DealerReview() + for key,item in review['doc'].items(): + setattr(review_obj,key,item) + + setattr(review_obj,'sentiment',sia.polarity_scores(review_obj.review)) + print(sia.polarity_scores(review_obj.review)) + + newreviews.append(review_obj) + + + context['reviews']=newreviews + + ReviewProperties=DealerReview() + print(type(reviews),len(reviews),"\n") + print(reviews[0],type(reviews[0])) + + context['fieldnames']=ReviewProperties.get_frontend_fieldnames() + + print("\n","fieldnames are","\n",context['fieldnames']) + + return render(request, 'djangoapp/reviewlist.html', context) + + +def add_review(request): + formdata = DealerReview() + form_names = formdata.get_frontend_fieldnames() + response=requests.models.Response() + json_to_send='not sent' + + dealership_url=API_CREDS['dealership_url'] + reviews_url=API_CREDS['review_url'] + dealership_key=API_CREDS['dealership_key'] + + dealerships = get_dealers_from_cf(dealership_url,apikey=dealership_key) + + dealer_name_to_id_map={} + + for dealer in dealerships: + dealer_name_to_id_map[dealer.full_name]=dealer.id + + + + + + if request.method == "POST": + + post_data=request.POST.copy() + post_data['id']=dealer_name_to_id_map[post_data['dealership']] + + form=ReviewForm(post_data) + + # Get the ID and car + + if form.is_valid(): + formdata=form.cleaned_data + data = { + "doc": { + "name": str(formdata["name"]), + "id": str(dealer_name_to_id_map[formdata['dealership']]), + "dealership": str(formdata['dealership']), + "review": str(formdata['content']), + "purchase": str(formdata['purchasecheck']), + "purchase_date": str(formdata['purchase_date']), + "car_make": formdata['car'].make.name, + "car_model": formdata['car'].type, + "car_year": formdata['car'].year.year, + # Add other fields here as needed + } + } + + + json_to_send=json.dumps(data) + headers = {'Content-Type': 'application/json'} + + + response=requests.post(url=str(reviews_url), headers=headers,data=json_to_send,auth=HTTPBasicAuth('apikey', str(dealership_key))) + + + + + + cars = CarModel.objects.all() + return render(request, 'djangoapp/addreview.html', {"emptyform": form_names, + "formdata": json_to_send, + "response": response.text, + "cars":cars, + "dealerships": dealerships}) + + + + + + + + # Create a `add_review` view to submit a review # def add_review(request, dealer_id): # ... diff --git a/server/djangobackend/node_dealership_example_server b/server/djangobackend/node_dealership_example_server new file mode 160000 index 0000000000..07ef6c9f97 --- /dev/null +++ b/server/djangobackend/node_dealership_example_server @@ -0,0 +1 @@ +Subproject commit 07ef6c9f973584dd7d816f6532473cf2e2e33ee6 diff --git a/server/djangobackend/settings.py b/server/djangobackend/settings.py index 6c6fe6a78b..e1462ad9c9 100644 --- a/server/djangobackend/settings.py +++ b/server/djangobackend/settings.py @@ -11,6 +11,7 @@ """ import os from pathlib import Path +import subprocess # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent @@ -27,9 +28,9 @@ APPEND_SLASH = True -ALLOWED_HOSTS = ['localhost',''] +ALLOWED_HOSTS = ['127.0.0.1'] -CSRF_TRUSTED_ORIGINS = [''] +CSRF_TRUSTED_ORIGINS = ['https://127.0.0.1'] # Application definition @@ -42,8 +43,13 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'crispy_forms', + 'crispy_bootstrap5' ] +CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap5" +CRISPY_TEMPLATE_PACK="bootstrap5" + MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', @@ -122,7 +128,15 @@ # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/3.1/howto/static-files/ +LOGOUT_REDIRECT_URL = '/admin/' + +LOGIN_REDIRECT_URL = '/djangoapp/' + STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'static') MEDIA_ROOT = os.path.join(STATIC_ROOT, 'media') MEDIA_URL = '/media/' + + + +print("Django app has started, you need to run the node server in the folder node_dealership_example_server first ") \ No newline at end of file diff --git a/server/djangobackend/urls.py b/server/djangobackend/urls.py index 6e110cad6d..d9a39d41cd 100644 --- a/server/djangobackend/urls.py +++ b/server/djangobackend/urls.py @@ -21,4 +21,7 @@ urlpatterns = [ path('admin/', admin.site.urls), path('djangoapp/', include('djangoapp.urls')), + path('', include('djangoapp.urls')), + path('',include('django.contrib.auth.urls')), + ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/server/entrypoint.sh b/server/entrypoint.sh new file mode 100644 index 0000000000..13f4f2881e --- /dev/null +++ b/server/entrypoint.sh @@ -0,0 +1,13 @@ + #!/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