diff --git a/.all-contributorsrc b/.all-contributorsrc index d2a9b175..ea610ac1 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -252,6 +252,101 @@ "contributions": [ "test" ] + }, + { + "login": "devvspaces", + "name": "Ayanwola Ayomide", + "avatar_url": "https://avatars.githubusercontent.com/u/77179231?v=4", + "profile": "https://devvspace.webflow.io/", + "contributions": [ + "code", + "test", + "doc" + ] + }, + { + "login": "zaibugemi", + "name": "Zuhaib Shah", + "avatar_url": "https://avatars.githubusercontent.com/u/34958019?v=4", + "profile": "https://preciouslife837753359.wordpress.com/", + "contributions": [ + "code" + ] + }, + { + "login": "GuilhermeFernandes01", + "name": "Guilherme Fernandes", + "avatar_url": "https://avatars.githubusercontent.com/u/26780625?v=4", + "profile": "https://github.com/GuilhermeFernandes01", + "contributions": [ + "code" + ] + }, + { + "login": "benhalverson", + "name": "Ben Halverson", + "avatar_url": "https://avatars.githubusercontent.com/u/7907232?v=4", + "profile": "https://github.com/benhalverson", + "contributions": [ + "code", + "test" + ] + }, + { + "login": "darkl1ght", + "name": "Ayush Chauhan", + "avatar_url": "https://avatars.githubusercontent.com/u/19537472?v=4", + "profile": "https://github.com/darkl1ght", + "contributions": [ + "test", + "code" + ] + }, + { + "login": "edwardsmoses", + "name": "Edwards Moses", + "avatar_url": "https://avatars.githubusercontent.com/u/19548998?v=4", + "profile": "https://edwardsmoses.com/", + "contributions": [ + "doc", + "test" + ] + }, + { + "login": "RizkyRajitha", + "name": "Rajitha Gunathilake", + "avatar_url": "https://avatars.githubusercontent.com/u/38534289?v=4", + "profile": "https://rizkyrajitha.github.io/", + "contributions": [ + "code" + ] + }, + { + "login": "bmusuko", + "name": "Bram Musuko Panjaitan", + "avatar_url": "https://avatars.githubusercontent.com/u/32943475?v=4", + "profile": "https://bmusuko.tech/", + "contributions": [ + "test" + ] + }, + { + "login": "filipkujawa", + "name": "filip", + "avatar_url": "https://avatars.githubusercontent.com/u/44206832?v=4", + "profile": "https://github.com/filipkujawa", + "contributions": [ + "code" + ] + }, + { + "login": "mdfarhaan", + "name": "Farhaan", + "avatar_url": "https://avatars.githubusercontent.com/u/60516398?v=4", + "profile": "https://github.com/mdfarhaan", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/.github/workflows/codesee-arch-diagram.yml b/.github/workflows/codesee-arch-diagram.yml new file mode 100644 index 00000000..60f36f57 --- /dev/null +++ b/.github/workflows/codesee-arch-diagram.yml @@ -0,0 +1,89 @@ +# This workflow was added by CodeSee. Learn more at https://codesee.io/ +on: + push: + branches: + - dev + pull_request_target: + types: [opened, synchronize, reopened] + +name: CodeSee Map + +permissions: read-all + +jobs: + test_map_action: + runs-on: ubuntu-latest + continue-on-error: true + name: Run CodeSee Map Analysis + steps: + - name: checkout + id: checkout + uses: actions/checkout@v2 + with: + repository: ${{ github.event.pull_request.head.repo.full_name }} + ref: ${{ github.event.pull_request.head.ref }} + + # codesee-detect-languages has an output with id languages. + - name: Detect Languages + id: detect-languages + uses: Codesee-io/codesee-detect-languages-action@latest + + - name: Configure JDK 16 + uses: actions/setup-java@v3 + if: ${{ fromJSON(steps.detect-languages.outputs.languages).java }} + with: + java-version: '16' + distribution: 'zulu' + + # CodeSee Maps Go support uses a static binary so there's no setup step required. + + - name: Configure Node.js 14 + uses: actions/setup-node@v3 + if: ${{ fromJSON(steps.detect-languages.outputs.languages).javascript }} + with: + node-version: '14' + + - name: Configure Python 3.x + uses: actions/setup-python@v4 + if: ${{ fromJSON(steps.detect-languages.outputs.languages).python }} + with: + python-version: '3.10' + architecture: 'x64' + + - name: Configure Ruby '3.x' + uses: ruby/setup-ruby@v1 + if: ${{ fromJSON(steps.detect-languages.outputs.languages).ruby }} + with: + ruby-version: '3.0' + + # We need the rust toolchain because it uses rustc and cargo to inspect the package + - name: Configure Rust 1.x stable + uses: actions-rs/toolchain@v1 + if: ${{ fromJSON(steps.detect-languages.outputs.languages).rust }} + with: + toolchain: stable + + - name: Generate Map + id: generate-map + uses: Codesee-io/codesee-map-action@latest + with: + step: map + api_token: ${{ secrets.CODESEE_ARCH_DIAG_API_TOKEN }} + github_ref: ${{ github.ref }} + languages: ${{ steps.detect-languages.outputs.languages }} + + - name: Upload Map + id: upload-map + uses: Codesee-io/codesee-map-action@latest + with: + step: mapUpload + api_token: ${{ secrets.CODESEE_ARCH_DIAG_API_TOKEN }} + github_ref: ${{ github.ref }} + + - name: Insights + id: insights + uses: Codesee-io/codesee-map-action@latest + with: + step: insights + api_token: ${{ secrets.CODESEE_ARCH_DIAG_API_TOKEN }} + github_ref: ${{ github.ref }} diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml new file mode 100644 index 00000000..e669b5e6 --- /dev/null +++ b/.github/workflows/pr.yml @@ -0,0 +1,17 @@ +name: pull-request + +on: + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Check out code + uses: actions/checkout@v3 + - name: Set up node + uses: actions/setup-node@v3 + - name: Install dependencies + run: npm install + - name: Run tests + run: npm test diff --git a/.gitignore b/.gitignore index 95c72ede..268f51a8 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ npm-debug.log .env .DS_Store .idea +coverage diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..96a18ff3 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,10 @@ +{ + "eslint.alwaysShowStatus": true, + "eslint.format.enable": true, + "eslint.lintTask.enable": true, + "eslint.useESLintClass": false, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + }, + "eslint.validate": ["javascript"] +} \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c25e3c75..4de528ab 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -130,7 +130,7 @@ Enhancement suggestions are tracked as [GitHub issues](https://github.com/agedde include Setup of env, IDE and typical getting started instructions? --> 1. When adding new API endpoints, please add OpenAPI comments -2. All code must have corrosponding unit tests. +2. All code must have corresponding unit tests. 3. All API endpoints must have unit tests for all return codes. ### Improving The Documentation diff --git a/Dockerfile b/Dockerfile index 36d406fc..6b64707b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:12-alpine +FROM node:18-alpine WORKDIR /src COPY package.json package-lock.json /src/ RUN npm install diff --git a/README.md b/README.md index 57c98808..e33ddd85 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-27-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-37-orange.svg?style=flat-square)](#contributors-)

@@ -19,10 +19,10 @@ Welcome to Mocked-API, this is a live API that can be accessed by anyone who nee ## Hacktoberfest Contributors -If you would like to contribute during Hacktoberfest please following our contribution guidelines (Which we are still working on) but here is a quick summary of what we expect in a PR. +If you would like to contribute during Hacktoberfest please following our contribution guidelines (Which we are still working on) but here is a quick summary of what we expect in the process of dev to raising your PR. 1. Find a ticket and ask to be assigned, once assigned start work. :) This is so we don't get multiple PR's for the same issue. -1. Please branch from our active next release *v.0.13.0* +1. Please branch from our active next release *dev* 2. Please make sure your new endpoints all have OpenAPI Comments as they will be used to generate our swagger documentation. 3. Please make sure you have added unit tests for end points and util functions. 4. MOST importantly, have fun. @@ -85,14 +85,13 @@ For each module you create you will also need to create a tests folder, Inside t The utils tests are fairly simple jests tests, the `api` routes tests are slightly different where you will need to add ```javascript import request from 'supertest'; -const baseURL = 'http://localhost:3000'; +import app from 'path/to/app'; ``` to your tests and make a request in your test instead of calling a normal function. ### How to run tests -1. Run the mocked api server locally -2. run `npm run test` - +run `npm test` +run `npm run test:watch` to run the tests in watch mode. ## FAQ @@ -169,6 +168,20 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d krishna
krishna

💻 Vadym Yatsyuk
Vadym Yatsyuk

📖 Nicholas Robert Beckham
Nicholas Robert Beckham

⚠️ + Ayanwola Ayomide
Ayanwola Ayomide

💻 ⚠️ 📖 + + + Zuhaib Shah
Zuhaib Shah

💻 + Guilherme Fernandes
Guilherme Fernandes

💻 + Ben Halverson
Ben Halverson

💻 ⚠️ + Ayush Chauhan
Ayush Chauhan

⚠️ 💻 + Edwards Moses
Edwards Moses

📖 ⚠️ + Rajitha Gunathilake
Rajitha Gunathilake

💻 + Bram Musuko Panjaitan
Bram Musuko Panjaitan

⚠️ + + + filip
filip

💻 + Farhaan
Farhaan

💻 diff --git a/app.ts b/app.ts index e3ac6ad6..8ff1b985 100644 --- a/app.ts +++ b/app.ts @@ -1,12 +1,12 @@ require('dotenv').config(); import express, { Request, Response } from 'express'; import { swaggerSpec } from './utils/swagger'; +import swag from "./swagger.json"; const morgan = require('morgan'); const cors = require('cors'); const app = express(); -const port = 3000; // Load Mock Modules require('./modules/animal/api/animal-routes')(app); // Animals @@ -30,13 +30,20 @@ require('./modules/phone-numbers/api/phone-numbers-routes')(app); // Phone numbe require('./modules/quotes/api/quotes-routes')(app); // Quotes require('./modules/ip/api/ip-routes')(app); // ip and mac address require('./modules/vehicles/api/vehicles-routes')(app); // Vehicles +require('./modules/address/api/address-routes')(app); // Addresses +require('./modules/bankfeed/api/bankfeed-routes')(app); // Bank Feed +require('./modules/location/api/location-routes')(app); // Bank Feed + // Add an healthcheck endpoint +// Shows amount of API Categories and their endpoints app.get('/status', (req, res) => { const data = { uptime: process.uptime(), message: 'Ok', date: new Date(), + totalCategories: swag.tags.length, + totalEndpoints: Object.keys(swag.paths).length, }; res.status(200).send(data); }); @@ -51,10 +58,7 @@ app.get('/docs.json', (req: Request, res: Response) => { const swaggerUi = require('swagger-ui-express'); app.use('/', swaggerUi.serve, swaggerUi.setup(swaggerSpec)); - app.use(cors()); // enabling CORS for all requests app.use(morgan('combined')); // adding morgan to log HTTP requests -app.listen(port, () => { - console.log(`Mock API is running on port ${port}.`); -}); +export default app; diff --git a/jest.config.js b/jest.config.js index e5fbf09c..90113e82 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,5 +1,7 @@ /** @type {import('ts-jest').JestConfigWithTsJest} */ module.exports = { preset: 'ts-jest', - testEnvironment: 'node' + testEnvironment: 'node', + collectCoverage: true, + coverageReporters: ['json', 'html', 'text', 'text-summary'] } diff --git a/modules/address/api/address-routes.ts b/modules/address/api/address-routes.ts new file mode 100644 index 00000000..7dc5e123 --- /dev/null +++ b/modules/address/api/address-routes.ts @@ -0,0 +1,89 @@ +import { Request, Response } from 'express'; +import * as core from 'express-serve-static-core'; +import getRandomAddresses from '../utils/getRandomAddress'; +import { getQtyFromRequest } from '../../../utils/route-utils'; +import { getCountryNameFromRequest } from '../../../utils/route-utils'; + +module.exports = function(app : core.Express) { + /** + * @openapi + * "/address": + * get: + * tags: + * - Address + * summary: Obtain a USA address (by default) + * responses: + * '200': + * description: An array of single address string + * schema: + * type: array + * items: + * type: object + * example: ['Andrew Kappa\n3686 Capital Lakeview\nLahore 2344\nUSA'] + */ + app.get('/address', (req: Request, res: Response) => { + const address = getRandomAddresses(); + res.json(address); + }); + + // get a random UK/USA address + /** + * @openapi + * '/address/:country': + * get: + * tags: + * - Address + * summary: Obtain a random UK/USA address + * parameters: + * - in: path + * name: country + * description: The country whose address is required; can be 'usa' or 'uk' + * type: string + * responses: + * '200': + * description: An array of single address string + * schema: + * type: array + * items: + * type: string + * example: ['Andrew Kappa\n3686 Capital Lakeview\nLahore 2344\nUSA'] + */ + app.get('/address/:country?', (req: Request, res: Response) => { + const country = getCountryNameFromRequest(req); + const address = getRandomAddresses(1, country); + res.json(address); + }); + + // get random USA/UK addresses + /** + * @openapi + * '/address/:country/:qty': + * get: + * tags: + * - Address + * summary: Obtain random UK/USA addresses + * parameters: + * - in: path + * name: country + * description: The country whose address is required; can be 'usa' or 'uk' + * type: string + * - in: path + * name: qty + * description: The number of addresses required + * type: number + * responses: + * '200': + * description: An array of address strings + * schema: + * type: array + * items: + * type: string + * example: ['Andrew Kappa\n3686 Capital Lakeview\nLahore 2344\nUSA', 'Jamal Khan\n600 Zumbuli House\nWashingtom 44521\nUSA'] + */ + app.get('/address/:country?/:qty?', (req: Request, res: Response) => { + const country = getCountryNameFromRequest(req); + const qty = getQtyFromRequest(req); + const addresses = getRandomAddresses(qty, country); + res.json(addresses); + }); +} \ No newline at end of file diff --git a/modules/address/consts/Address.ts b/modules/address/consts/Address.ts new file mode 100644 index 00000000..4da8fe85 --- /dev/null +++ b/modules/address/consts/Address.ts @@ -0,0 +1,39 @@ +/** + * * @openapi + * definitions: + * MockAddress: + * type: objcts + * properties: + * houseNumber: + * type: string + * example: 10 + * addressLine1: + * type: string + * example: Flat 22b + * addressLine2: + * type: string + * example: Gladstone Road + * city: + * type: string + * example: London + * postcode: + * type: string + * example: TN22 7HL + * zipcode: + * type: string + * example: 10234 + * country: + * type: string + * example: uk + */ +type Address = { + houseNumber: string, + addressLine1: string, + addressLine2: string, + city: string, + postcode: string, + zipcode: string, + country: string +} + +export default Address; \ No newline at end of file diff --git a/modules/address/tests/api/address-routes.test.ts b/modules/address/tests/api/address-routes.test.ts new file mode 100644 index 00000000..f8596fd4 --- /dev/null +++ b/modules/address/tests/api/address-routes.test.ts @@ -0,0 +1,79 @@ +import Address from "../../consts/Address"; +import app from "../../../../app"; +let request = require('supertest'); + +// address-routes.ts tests +describe('GET /address/', () => { + it('should return a random address', async () => { + const response = await request(app) + .get('/address'); + + const {status, body} = response; + expect(status).toBe(200); + expect(body).toBeInstanceOf(Array); + expect(body.length).toBe(1); + expect(typeof body[0]).toBe("object"); + }) +}) + +// address/:country +describe('GET /address/usa', () => { + it('should return a random USA format address', async () => { + const response = await request(app) + .get('/address/usa'); + + const {status, body} = response; + expect(status).toBe(200); + expect(body).toBeInstanceOf(Array); + expect(body.length).toBe(1); + expect(typeof body[0]).toBe('object'); + expect(body[0].postcode).toBe(null); + expect(body[0].zipcode).toBeTruthy(); + }) + + it('should return a random UK format address', async () => { + const response = await request(app) + .get('/address/uk'); + + const {status, body} = response; + expect(status).toBe(200); + expect(body).toBeInstanceOf(Array); + expect(body.length).toBe(1); + expect(typeof body[0]).toBe('object'); + expect(body[0].postcode).toBeTruthy(); + expect(body[0].zipcode).toBe(null); + }) +}) + +// address/:country/:qty +describe('GET /address/:country/:qty', () => { + it('should return given number of random USA format addresses', async () => { + const response = await request(app) + .get('/address/usa/5'); + + const {status, body} = response; + expect(status).toBe(200); + expect(body).toBeInstanceOf(Array); + expect(body.length).toBe(5); + expect(typeof body[0]).toBe('object'); + expect(typeof body[1]).toBe('object'); + expect(typeof body[2]).toBe('object'); + expect(typeof body[3]).toBe('object'); + expect(typeof body[4]).toBe('object'); + }) + + it('should return given number of random UK format addresses', async () => { + const response = await request(app) + .get('/address/uk/5'); + + const {status, body} = response; + expect(status).toBe(200); + expect(body).toBeInstanceOf(Array); + expect(body.length).toBe(5); + expect(typeof body[0]).toBe('object'); + expect(typeof body[1]).toBe('object'); + expect(typeof body[2]).toBe('object'); + expect(typeof body[3]).toBe('object'); + expect(typeof body[4]).toBe('object'); + }) +}) \ No newline at end of file diff --git a/modules/address/tests/utils/getRandomAddress.test.ts b/modules/address/tests/utils/getRandomAddress.test.ts new file mode 100644 index 00000000..5f91b9c1 --- /dev/null +++ b/modules/address/tests/utils/getRandomAddress.test.ts @@ -0,0 +1,67 @@ +// jest test for getRandomAddresses which returns a random UK/USA format address + +import getRandomAddresses from '../../utils/getRandomAddress'; +import { faker } from '@faker-js/faker'; + +jest.mock('@faker-js/faker', () => ({ + faker: { + address: { + buildingNumber: jest.fn().mockReturnValue('10'), + secondaryAddress: jest.fn().mockReturnValue('Flat 1'), + street: jest.fn().mockReturnValue('Something Road'), + cityName: jest.fn().mockReturnValue('Lahore'), + zipCode: jest.fn().mockReturnValue('2344'), + } + } +})); + +describe('getRandomAddresses', () => { + afterEach(() => { + jest.clearAllMocks(); + }) + + it('should return a random USA address by default', () => { + const address = getRandomAddresses(); + expect(faker.address.buildingNumber).toHaveBeenCalledTimes(1); + expect(faker.address.secondaryAddress).toHaveBeenCalledTimes(1); + expect(faker.address.street).toHaveBeenCalledTimes(1); + expect(faker.address.cityName).toHaveBeenCalledTimes(1); + expect(faker.address.zipCode).toHaveBeenCalledTimes(1); + }) + + it('should return a random UK address when passed the "uk" argument', () => { + const address = getRandomAddresses(1, 'uk'); + expect(faker.address.buildingNumber).toHaveBeenCalledTimes(1); + expect(faker.address.secondaryAddress).toHaveBeenCalledTimes(1); + expect(faker.address.street).toHaveBeenCalledTimes(1); + expect(faker.address.cityName).toHaveBeenCalledTimes(1); + expect(faker.address.zipCode).toHaveBeenCalledTimes(1); + }) + + it('should return a random USA address when passed the "usa" argument', () => { + const address = getRandomAddresses(1, 'usa'); + expect(faker.address.buildingNumber).toHaveBeenCalledTimes(1); + expect(faker.address.secondaryAddress).toHaveBeenCalledTimes(1); + expect(faker.address.street).toHaveBeenCalledTimes(1); + expect(faker.address.cityName).toHaveBeenCalledTimes(1); + expect(faker.address.zipCode).toHaveBeenCalledTimes(1); + }) + + it('should return USA format addresses equal to the number provided as "addressCount" parameter', () => { + const address = getRandomAddresses(5, 'usa'); + expect(faker.address.buildingNumber).toHaveBeenCalledTimes(5); + expect(faker.address.secondaryAddress).toHaveBeenCalledTimes(5); + expect(faker.address.street).toHaveBeenCalledTimes(5); + expect(faker.address.cityName).toHaveBeenCalledTimes(5); + expect(faker.address.zipCode).toHaveBeenCalledTimes(5); + }) + + it('should return UK format addresses equal to the number provided as "addressCount" parameter', () => { + const address = getRandomAddresses(3, 'uk'); + expect(faker.address.buildingNumber).toHaveBeenCalledTimes(3); + expect(faker.address.secondaryAddress).toHaveBeenCalledTimes(3); + expect(faker.address.street).toHaveBeenCalledTimes(3); + expect(faker.address.cityName).toHaveBeenCalledTimes(3); + expect(faker.address.zipCode).toHaveBeenCalledTimes(3); + }) +}) \ No newline at end of file diff --git a/modules/address/utils/getRandomAddress.ts b/modules/address/utils/getRandomAddress.ts new file mode 100644 index 00000000..58ca55e1 --- /dev/null +++ b/modules/address/utils/getRandomAddress.ts @@ -0,0 +1,21 @@ +import { faker } from '@faker-js/faker'; +import Address from '../consts/Address'; + +const getRandomAddresses = (addressCount : number = 1, country : string = 'uk') : Address[] => { + const addresses : Address[] = []; + + for (let index = 0; index < addressCount; index++) { + addresses.push({ + houseNumber: faker.address.buildingNumber(), + addressLine1: faker.address.secondaryAddress(), + addressLine2: faker.address.street(), + city: faker.address.cityName(), + postcode: country !== "usa" ? faker.address.zipCode() : null, + zipcode: country === "usa" ? faker.address.zipCode() : null, + country + }) + } + return addresses; +} + +export default getRandomAddresses; \ No newline at end of file diff --git a/modules/animal/api/animal-routes.ts b/modules/animal/api/animal-routes.ts index 15519a23..398c2662 100644 --- a/modules/animal/api/animal-routes.ts +++ b/modules/animal/api/animal-routes.ts @@ -4,6 +4,7 @@ import { getQtyFromRequest } from '../../../utils/route-utils'; import AnimalType from '../consts/AnimalEnum'; import getSpeciesOfAnimal from '../utils/getSpeciesOfAnimal'; + module.exports = function (app: core.Express) { /** * @openapi diff --git a/modules/animal/tests/Api/animal-routes.test.ts b/modules/animal/tests/Api/animal-routes.test.ts index 7c06cb0c..49fe4d69 100644 --- a/modules/animal/tests/Api/animal-routes.test.ts +++ b/modules/animal/tests/Api/animal-routes.test.ts @@ -1,14 +1,20 @@ import request from 'supertest'; -const baseURL = 'http://localhost:3000'; +import app from '../../../../app'; + //These routes dont seem to provide consistent responses +// Its not consistent because the data is randomly generated. You will need to mock the data to get consistent responses. describe.skip('animal api endpoints', () => { describe('/animals/bear/species/:qty?', () => { it('should return a list of bear species', async () => { const qty = 4; - const response = await request(baseURL).get(`/animals/bear/species/${qty}`); - expect(response.body.length).toBe(qty); + const response = await request(app) + .get(`/animals/bear/species/${qty}`) + .expect(200) + .expect('Content-Type', /json/); + + expect(response.body.length).toEqual(qty); }); }); @@ -16,7 +22,11 @@ describe.skip('animal api endpoints', () => { it('should return a list of bird species', async () => { const qty = 5; - const response = await request(baseURL).get(`/animals/bird/species/${qty}`); + const response = await request(app) + .get(`/animals/bird/species/${qty}`) + .expect(200) + .expect('Content-Type', /json/); + console.log('response', response.body); expect(response.body.length).toBe(qty); }); }); @@ -25,7 +35,10 @@ describe.skip('animal api endpoints', () => { it('should return a list of cat species', async () => { const qty = 5; - const response = await request(baseURL).get(`/animals/cat/species/${qty}`); + const response = await request(app) + .get(`/animals/cat/species/${qty}`) + .expect(200) + .expect('Content-Type', /json/); expect(response.body.length).toBe(qty); }); }); @@ -34,7 +47,10 @@ describe.skip('animal api endpoints', () => { it('should return a list of cetecean species', async () => { const qty = 4; - const response = await request(baseURL).get(`/animals/cetecean/species/${qty}`); + const response = await request(app) + .get(`/animals/cetecean/species/${qty}`) + .expect(200) + .expect('Content-Type', /json/); expect(response.body.length).toBe(qty); }); }); @@ -43,7 +59,7 @@ describe.skip('animal api endpoints', () => { it('should return a list of cow species', async () => { const qty = 5; - const response = await request(baseURL).get(`/animals/cow/species/${qty}`); + const response = await request(app).get(`/animals/cow/species/${qty}`); expect(response.body.length).toBe(qty); }); }); @@ -52,7 +68,10 @@ describe.skip('animal api endpoints', () => { it('should return a list of crocodile species', async () => { const qty = 5; - const response = await request(baseURL).get(`/animals/crocodile/species/${qty}`); + const response = await request(app) + .get(`/animals/crocodile/species/${qty}`) + .expect(200) + .expect('Content-Type', /json/); expect(response.body.length).toBe(qty); }); }); @@ -61,7 +80,7 @@ describe.skip('animal api endpoints', () => { it('should return a list of dog species', async () => { const qty = 5; - const response = await request(baseURL).get(`/animals/dog/species/${qty}`); + const response = await request(app).get(`/animals/dog/species/${qty}`); expect(response.body.length).toBe(qty); }); }); @@ -70,7 +89,7 @@ describe.skip('animal api endpoints', () => { it('should return a list of fish species', async () => { const qty = 5; - const response = await request(baseURL).get(`/animals/fish/species/${qty}`); + const response = await request(app).get(`/animals/fish/species/${qty}`); expect(response.body.length).toBe(qty); }); }); @@ -79,7 +98,7 @@ describe.skip('animal api endpoints', () => { it('should return a list of horse species', async () => { const qty = 5; - const response = await request(baseURL).get(`/animals/horse/species/${qty}`); + const response = await request(app).get(`/animals/horse/species/${qty}`); expect(response.body.length).toBe(qty); }); }); @@ -88,7 +107,7 @@ describe.skip('animal api endpoints', () => { it('should return a list of insect species', async () => { const qty = 5; - const response = await request(baseURL).get(`/animals/insect/species/${qty}`); + const response = await request(app).get(`/animals/insect/species/${qty}`); expect(response.body.length).toBe(qty); }); }); @@ -97,7 +116,7 @@ describe.skip('animal api endpoints', () => { it('should return a list of lion species', async () => { const qty = 2; - const response = await request(baseURL).get(`/animals/lion/species/${qty}`); + const response = await request(app).get(`/animals/lion/species/${qty}`); expect(response.body.length).toBe(qty); }); }); @@ -106,7 +125,7 @@ describe.skip('animal api endpoints', () => { it('should return a list of rabbit species', async () => { const qty = 5; - const response = await request(baseURL).get(`/animals/rabbit/species/${qty}`); + const response = await request(app).get(`/animals/rabbit/species/${qty}`); expect(response.body.length).toBe(qty); }); }); @@ -115,7 +134,7 @@ describe.skip('animal api endpoints', () => { it('should return a list of rodent species', async () => { const qty = 5; - const response = await request(baseURL).get(`/animals/rodent/species/${qty}`); + const response = await request(app).get(`/animals/rodent/species/${qty}`); expect(response.body.length).toBe(qty); }); }); @@ -124,7 +143,7 @@ describe.skip('animal api endpoints', () => { it('should return a list of snake species', async () => { const qty = 4; - const response = await request(baseURL).get(`/animals/snake/species/${qty}`); + const response = await request(app).get(`/animals/snake/species/${qty}`); expect(response.body.length).toBe(qty); }); }); diff --git a/modules/bankfeed/api/bankfeed.ts b/modules/bankfeed/api/bankfeed-routes.ts similarity index 100% rename from modules/bankfeed/api/bankfeed.ts rename to modules/bankfeed/api/bankfeed-routes.ts diff --git a/modules/bankfeed/data/bankdata.ts b/modules/bankfeed/data/bankdata.ts index fd3f746b..fd9d4a87 100644 --- a/modules/bankfeed/data/bankdata.ts +++ b/modules/bankfeed/data/bankdata.ts @@ -7,7 +7,7 @@ const BankData = { statement: [ { date: '2222-22-22', - discription: 'This is bank statemnet ', + description: 'This is bank statement ', amount: '50000', }, ], diff --git a/modules/bankfeed/tests/api/bankfeed-routes.test.ts b/modules/bankfeed/tests/api/bankfeed-routes.test.ts new file mode 100644 index 00000000..d2d30403 --- /dev/null +++ b/modules/bankfeed/tests/api/bankfeed-routes.test.ts @@ -0,0 +1,30 @@ +import app from "../../../../app"; +let request = require('supertest'); + +describe('bank feed api endpoints', () => { + describe('GET /bank/feed/:qty', () => { + it('should return a list of bank statement', async () => { + const qty = 5; + + const response = await request(app).get(`/bank/feed/${qty}`); + const bankData = response.body; + const bankStatement = bankData.statement[0] + + // bank data + expect(bankData).toHaveProperty('id'); + expect(bankData).toHaveProperty('accountnumber'); + expect(bankData).toHaveProperty('ifsc'); + expect(bankData).toHaveProperty('sortcode'); + expect(bankData).toHaveProperty('isbn'); + expect(bankData).toHaveProperty('statement'); + + // bank statement + expect(bankData.statement.length).toEqual(1); + expect(bankStatement).toHaveProperty('date'); + expect(bankStatement).toHaveProperty('description'); + expect(bankStatement).toHaveProperty('amount'); + expect(parseInt(bankStatement.amount)).toEqual(qty); + + }); + }); +}); \ No newline at end of file diff --git a/modules/chat/api/chat-routes.ts b/modules/chat/api/chat-routes.ts index 1c0519bd..c18bf466 100644 --- a/modules/chat/api/chat-routes.ts +++ b/modules/chat/api/chat-routes.ts @@ -1,37 +1,82 @@ -import { faker } from '@faker-js/faker'; -import { Request, Response } from 'express'; -import * as core from 'express-serve-static-core'; -import getRandomUsers from '../../users/utils/getRandomUsers'; -import { getRandomChat } from '../utils/getRandomChat'; +import { Request, Response } from 'express' +import * as core from 'express-serve-static-core' +import { getRandomChat } from '../utils/getRandomChat' -const defaultUserCount = 100; -const defaultMessageCount = 1000; +const defaultUserCount = 100 +const defaultMessageCount = 1000 module.exports = function (app: core.Express) { - /** + /** * @openapi * '/chat/random': * get: * tags: * - Chat - * summary: Returns a random chat of 100 users and 1000 messages using randomly generated sentances + * summary: Returns a random chat of 100 users and 1000 sentences * responses: * '200': * description: OK * schema: * $ref: '#/definitions/MockChatResponse' */ - app.get('/chat/random/', (req: Request, res: Response) => { - res.json(getRandomChat(defaultUserCount, defaultMessageCount)); - }); + app.get('/chat/random/', (req: Request, res: Response) => { + res.json(getRandomChat(defaultUserCount, defaultMessageCount)) + }) - /** + /** + * @openapi + * '/chat/random/various': + * get: + * tags: + * - Chat + * summary: Returns a random chat of 100 users and 1000 messages of various length + * responses: + * '200': + * description: OK + * schema: + * $ref: '#/definitions/MockChatResponse' + */ + app.get('/chat/random/various/', (req: Request, res: Response) => { + res.json(getRandomChat(defaultUserCount, defaultMessageCount, true)) + }) + + /** + * @openapi + * '/chat/random/various/{userCount}/{messageCount}': + * get: + * tags: + * - Chat + * summary: Returns a random chat of messages from defined counts using randomly generated sentences + * parameters: + * - in: path + * name: userCount + * description: The amount of users the messages can be generated from + * type: string + * default: 100 + * - in: path + * name: messageCount + * description: The amount of messages that will be returned + * type: string + * default: 1000 + * responses: + * '200': + * description: OK + * schema: + * $ref: '#/definitions/MockChatResponse' + */ + app.get('/chat/random/various/:userCount/:messageCount', (req: Request, res: Response) => { + const userCount = req.params.userCount !== '' ? parseInt(req.params.userCount) : defaultUserCount + const messageCount = req.params.messageCount !== '' ? parseInt(req.params.messageCount) : defaultMessageCount + res.json(getRandomChat(userCount, messageCount, true)) + }) + + /** * @openapi * '/chat/random/{userCount}/{messageCount}': * get: * tags: * - Chat - * summary: Returns a random chat of messages from defined counts using randomly generated sentances + * summary: Returns a random chat of messages from defined counts using randomly generated sentences * parameters: * - in: path * name: userCount @@ -49,9 +94,9 @@ module.exports = function (app: core.Express) { * schema: * $ref: '#/definitions/MockChatResponse' */ - app.get('/chat/random/:userCount/:messageCount', (req: Request, res: Response) => { - const userCount = req.params.userCount ? parseInt(req.params.userCount) : defaultUserCount; - const messageCount = req.params.messageCount ? parseInt(req.params.messageCount) : defaultMessageCount; - res.json(getRandomChat(userCount, messageCount)); - }); -}; + app.get('/chat/random/:userCount/:messageCount', (req: Request, res: Response) => { + const userCount = req.params.userCount ? parseInt(req.params.userCount) : defaultUserCount + const messageCount = req.params.messageCount ? parseInt(req.params.messageCount) : defaultMessageCount + res.json(getRandomChat(userCount, messageCount)) + }) +} diff --git a/modules/chat/tests/api/chat-routes.test.ts b/modules/chat/tests/api/chat-routes.test.ts index 7dc8b7bf..d5a766c7 100644 --- a/modules/chat/tests/api/chat-routes.test.ts +++ b/modules/chat/tests/api/chat-routes.test.ts @@ -1,35 +1,56 @@ -import request from 'supertest'; -const baseURL = 'http://localhost:3000'; - -describe('chat api endpoints', () => { - describe('GET /chat/random', () => { - it('should return a random chat snapshot with 1000 messages', async () => { - const response = await request(baseURL).get(`/chat/random`); - - console.log(response.body.messages.length); - - expect(response.body.messages.length).toBe(1000); - expect(response.body.messages[0]).toHaveProperty('id'); - expect(response.body.messages[0]).toHaveProperty('createdAt'); - expect(response.body.messages[0]).toHaveProperty('message'); - expect(response.body.messages[0]).toHaveProperty('userId'); - }); - }); - - describe('GET /chat/random/:userCount/:messageCount', () => { - it('should return a chat with the correct message and user count', async () => { - const userCount = 5; - const messageCount = 100; - const response = await request(baseURL).get(`/chat/random/${userCount}/${messageCount}`); - - const userSet = new Set(); - - response.body.users.forEach((element) => { - userSet.add(element.userId); - }); - - expect(response.body.messages.length).toBe(messageCount); - expect(userSet.size).toBe(userCount); - }); - }); -}); +import request from 'supertest' +import app from '../../../../app' +// const app = 'http://localhost:3000'; + +const testDefaultRoutes = (response: request.Response): void => { + expect(response.body.messages.length).toBe(1000) + expect(response.body.messages[0]).toHaveProperty('id') + expect(response.body.messages[0]).toHaveProperty('createdAt') + expect(response.body.messages[0]).toHaveProperty('message') + expect(response.body.messages[0]).toHaveProperty('userId') +} + +const testParametizedRoutes = (response: request.Response, userCount: number, messageCount: number): void => { + const userSet = new Set() + + response.body.users.forEach((element) => { + userSet.add(element.userId) + }) + + expect(response.body.messages.length).toBe(messageCount) + expect(userSet.size).toBe(userCount) +} + +describe.only('chat api endpoints', () => { + describe('GET /chat/random', () => { + it('should return a random chat snapshot with 1000 messages', async () => { + const response = await request(app).get('/chat/random') + testDefaultRoutes(response) + }) + }) + + describe('GET /chat/random/various', () => { + it('should return a random chat snapshot with 1000 messages', async () => { + const response = await request(app).get('/chat/random/various') + testDefaultRoutes(response) + }) + }) + + describe('GET /chat/random/:userCount/:messageCount', () => { + it('should return a chat with the correct message and user count', async () => { + const userCount = 5 + const messageCount = 100 + const response = await request(app).get(`/chat/random/${userCount}/${messageCount}`) + testParametizedRoutes(response, userCount, messageCount) + }) + }) + + describe('GET /chat/random/various/:userCount/:messageCount', () => { + it('should return a chat with the correct message and user count', async () => { + const userCount = 5 + const messageCount = 100 + const response = await request(app).get(`/chat/random/various/${userCount}/${messageCount}`) + testParametizedRoutes(response, userCount, messageCount) + }) + }) +}) diff --git a/modules/chat/tests/utils/generateRandomMessage.test.ts b/modules/chat/tests/utils/generateRandomMessage.test.ts new file mode 100644 index 00000000..88c08874 --- /dev/null +++ b/modules/chat/tests/utils/generateRandomMessage.test.ts @@ -0,0 +1,9 @@ +import { generateRandomMessage } from '../../utils/generateRandomMessage' + +describe('generate random message', () => { + it('should return a random string', () => { + const res = generateRandomMessage() + + expect(typeof res).toBe('string') + }) +}) diff --git a/modules/chat/utils/generateRandomMessage.ts b/modules/chat/utils/generateRandomMessage.ts new file mode 100644 index 00000000..7784cbe0 --- /dev/null +++ b/modules/chat/utils/generateRandomMessage.ts @@ -0,0 +1,12 @@ +import { faker } from '@faker-js/faker' +import { getRandomArrayItem } from '../../../utils/arrays' + +const messageProviders: Array<() => string> = [ + faker.lorem.sentence, + faker.lorem.word, + faker.lorem.paragraph +] + +export const generateRandomMessage = (): string => { + return getRandomArrayItem(messageProviders)() +} diff --git a/modules/chat/utils/getRandomChat.ts b/modules/chat/utils/getRandomChat.ts index 2cc0bb8d..9476af6b 100644 --- a/modules/chat/utils/getRandomChat.ts +++ b/modules/chat/utils/getRandomChat.ts @@ -1,22 +1,23 @@ -import { faker } from "@faker-js/faker"; -import getRandomUsers from "../../users/utils/getRandomUsers"; -import ChatMessage from "../consts/ChatMessage"; -import ChatRandomResponse from "../consts/ChatRandomResponse"; +import { faker } from '@faker-js/faker' +import getRandomUsers from '../../users/utils/getRandomUsers' +import ChatMessage from '../consts/ChatMessage' +import ChatRandomResponse from '../consts/ChatRandomResponse' +import { generateRandomMessage } from './generateRandomMessage' -export const getRandomChat = (userCount : number, messageCount: number) : ChatRandomResponse => { - const users = getRandomUsers(userCount); +export const getRandomChat = (userCount: number, messageCount: number, various: boolean = false): ChatRandomResponse => { + const users = getRandomUsers(userCount) - const messages : ChatMessage[] = []; - Array.from({length: messageCount}).forEach(() => { - messages.push({ - id: faker.datatype.uuid(), - createdAt: faker.date.recent(faker.datatype.number({ min: 0, max: 30 })).toISOString(), - message: faker.lorem.sentence(), - userId: users[faker.datatype.number({ min: 0, max: userCount - 1 })].userId, - }) + const messages: ChatMessage[] = [] + Array.from({ length: messageCount }).forEach(() => { + messages.push({ + id: faker.datatype.uuid(), + createdAt: faker.date.recent(faker.datatype.number({ min: 0, max: 30 })).toISOString(), + message: various ? generateRandomMessage() : faker.lorem.sentence(), + userId: users[faker.datatype.number({ min: 0, max: userCount - 1 })].userId }) - return { - users, - messages - } + }) + return { + users, + messages + } } diff --git a/modules/countries/test/countries-routes.test.ts b/modules/countries/test/countries-routes.test.ts index 0710bd6c..1c539ab7 100644 --- a/modules/countries/test/countries-routes.test.ts +++ b/modules/countries/test/countries-routes.test.ts @@ -1,12 +1,12 @@ import countriesList from '../data/countries'; import request from 'supertest'; -const baseURL = 'http://localhost:3000'; +import app from '../../../app'; describe('country api endpoints', () => { describe('GET /countries/', () => { it('should return a list of countries', async () => { - const response = await request(baseURL).get(`/countries/`); + const response = await request(app).get(`/countries/`); expect(response.body).toStrictEqual({ countries: [...countriesList] }); }); }); @@ -14,9 +14,7 @@ describe('country api endpoints', () => { describe('GET /countries/:filterBy?', () => { it('should return gpb_usd ticker data', async () => { const filter = 'Afghanistan'; - const response = await request(baseURL).get(`/countries/${filter}`); - console.log(response.body); - + const response = await request(app).get(`/countries/${filter}`); expect(response.body.countries[0]).toEqual(filter); }); }); diff --git a/modules/currency/api/currency-routes.ts b/modules/currency/api/currency-routes.ts index 4936a82e..b0333ed3 100644 --- a/modules/currency/api/currency-routes.ts +++ b/modules/currency/api/currency-routes.ts @@ -4,6 +4,7 @@ import currencySnapshot from '../data/currency-snapshot'; import GBP_USD_TICKER_DATA from '../data/gbp-usd-ticker-data'; import { getQtyFromRequest } from '../../../utils/route-utils'; import getDigitalCurrencyAddress from '../utils/getDigitalCurrencyAddress'; +import getDigitalCurrencyTxList from '../utils/getDigitalCurrencyTxList'; import DigitalCoinEnum from '../consts/DigitalCoinEnum'; module.exports = function (app: core.Express) { @@ -125,5 +126,40 @@ module.exports = function (app: core.Express) { const qty = getQtyFromRequest(req); const addresses = getDigitalCurrencyAddress(qty, DigitalCoinEnum.Litecoin); res.json(addresses); - }); -}; + }) + + /** + * @openapi + * '/currencies/digital-coins/ethereum/tx-list/:address?/:qty?': + * get: + * tags: + * - Currency + * summary: Get the list of transactions performed by an address + * parameters: + * - in: path + * name: address + * description: The address that performed the transactions + * type: string + * - in: path + * name: qty + * description: The number of transactions to be returned + * type: number + * responses: + * '200': + * description: OK + * schema: + * type: json + * items: + * type: object + * example: [{"blockNumber":"27805946","timeStamp":"9942266267","hash":"0xaN6aaOQJX5PFBhXH1RjUlygLdJKqC01qRPC0QbKZ5TIowf7iJnB5DQngiV93jik5","nonce":"18","blockHash":"0xueMI7Aje55ctOTWcCpgMKoyD6Fr5K91uGkaxbpex1gRvKrq3oPyPB5U6qMf7Ia2f","transactionIndex":"5","from":"0xc5102fE9359FD9a28f877a67E36B0F050d81a3CC","to":"0x100807ff56cbc56f4574e515ddbefdbb8d86a7a0","value":"0.1759733580282401","gas":"2270","gasPrice":"573605567923","isError":"0","txreceipt_status":"1","input":"0xKuzGOUc0zN7sGqfFrmhLSsQKz69uZNUbHgSnnTldsCfFBHa682mvwIm2Ly3szQadWJftne0BzIO4obORd3dGKZIXAQ5XEnIveiwQ8ZXwQW9Q1MtnaSh1x5zjJ3Mc4OVHzmNxFMDe","confirmations":"33642"}] + */ + + //Returns the list of transactions performed by an address + app.get("/currencies/digital-coins/ethereum/tx-list/:address?/:qty?", (req: Request, res: Response) => { + const address = req.params.address; + const qty = getQtyFromRequest(req); + const tx_list = getDigitalCurrencyTxList(address, qty); + res.json(tx_list); + }) + +} diff --git a/modules/currency/consts/TransactionInfo.ts b/modules/currency/consts/TransactionInfo.ts new file mode 100644 index 00000000..a6039378 --- /dev/null +++ b/modules/currency/consts/TransactionInfo.ts @@ -0,0 +1,20 @@ +interface transactionInfo { + blockNumber: string; + timeStamp: string; + hash: string; + nonce: string; + blockHash: string; + transactionIndex: string; + from: string; + to: string; + value: string; + gas: string; + gasPrice: string; + isError: string; + txreceipt_status: string; + input: string; + confirmations: string; + +} + +export default transactionInfo; \ No newline at end of file diff --git a/modules/currency/tests/api/currency-routes.test.ts b/modules/currency/tests/api/currency-routes.test.ts new file mode 100644 index 00000000..a637bca2 --- /dev/null +++ b/modules/currency/tests/api/currency-routes.test.ts @@ -0,0 +1,13 @@ +import request from 'supertest'; +import app from '../../../../app'; + +describe('currency api endpoints', () => { + describe('GET /currencies/digital-coins/ethereum/tx-list', () => { + it('should return a list of transactions performed by an address', async () => { + const qty = 10; + const response = await request(app).get(`/currencies/digital-coins/ethereum/tx-list/0xc5102fE9359FD9a28f877a67E36B0F050d81a3CC/${qty}`); + + expect(response.body.length).toBe(qty); + }); + }); +}); \ No newline at end of file diff --git a/modules/currency/tests/utils/api/currency-routes.test.ts b/modules/currency/tests/utils/api/currency-routes.test.ts index d2b6b0cf..e6a224d5 100644 --- a/modules/currency/tests/utils/api/currency-routes.test.ts +++ b/modules/currency/tests/utils/api/currency-routes.test.ts @@ -1,10 +1,10 @@ import request from 'supertest'; -const baseURL = 'http://localhost:3000'; +import app from '../../../../../app'; describe('currency api endpoints', () => { describe('GET /currencies/market-overview', () => { it('should return a currency snapshot', async () => { - const response = await request(baseURL).get(`/currencies/market-overview`); + const response = await request(app).get(`/currencies/market-overview`); expect(response.body[0]).toHaveProperty('currency'); expect(response.body[0]).toHaveProperty('value'); @@ -15,7 +15,7 @@ describe('currency api endpoints', () => { describe('GET /currencies/gbp-usd/ticker', () => { it('should return gpb_usd ticker data', async () => { - const response = await request(baseURL).get(`/currencies/gbp-usd/ticker`); + const response = await request(app).get(`/currencies/gbp-usd/ticker`); expect(response.body[0]).toHaveProperty('ticker'); }); @@ -24,7 +24,7 @@ describe('currency api endpoints', () => { describe('GET /currencies/digital-coins/bitcoin/random-address/:qty?', () => { it('should return a list of bitcoin addresses', async () => { const qty = 5; - const response = await request(baseURL).get(`/currencies/digital-coins/bitcoin/random-address/${qty}`); + const response = await request(app).get(`/currencies/digital-coins/bitcoin/random-address/${qty}`); expect(response.body.length).toBe(qty); }); @@ -33,7 +33,7 @@ describe('currency api endpoints', () => { describe('GET /currencies/digital-coins/ethereum/random-address/:qty?', () => { it('should return a list of eth addresses', async () => { const qty = 5; - const response = await request(baseURL).get(`/currencies/digital-coins/ethereum/random-address/${qty}`); + const response = await request(app).get(`/currencies/digital-coins/ethereum/random-address/${qty}`); expect(response.body.length).toBe(qty); }); @@ -42,7 +42,7 @@ describe('currency api endpoints', () => { describe('GET /currencies/digital-coins/litecoin/random-address/:qty?', () => { it('should return a list of litecoin addresses', async () => { const qty = 5; - const response = await request(baseURL).get(`/currencies/digital-coins/litecoin/random-address/${qty}`); + const response = await request(app).get(`/currencies/digital-coins/litecoin/random-address/${qty}`); expect(response.body.length).toBe(qty); }); diff --git a/modules/currency/utils/getDigitalCurrencyTxList.ts b/modules/currency/utils/getDigitalCurrencyTxList.ts new file mode 100644 index 00000000..8231dec2 --- /dev/null +++ b/modules/currency/utils/getDigitalCurrencyTxList.ts @@ -0,0 +1,50 @@ +import { faker } from '@faker-js/faker'; +import transactionInfo from '../consts/TransactionInfo'; + +const getDigitalCurrencyTxList = (address: string, amount: number) : transactionInfo[] => { + + const ETH_TX_LIST = [] + + for (let i = 0; i < amount; i++) { + + let transaction: transactionInfo = { + blockNumber: (Math.floor(Math.random() * 99999999) + 10000000).toString(), + timeStamp: (Math.floor(Math.random() * 9999999999) + 1000000000).toString(), + hash: ("0x" + makeid(64)).toString(), + nonce: (Math.floor(Math.random() * 30) + 1).toString(), + blockHash: "0x" + makeid(64), + transactionIndex: (Math.floor(Math.random() * 30) + 1).toString(), + from: address, + to: faker.finance.ethereumAddress(), + value: (Math.random()).toString(), + gas: (Math.floor(Math.random() * 9999) + 1000).toString(), + gasPrice: (Math.floor(Math.random() * 999999999999) + 100000000000).toString(), + isError: "0", + txreceipt_status: "1", + input: "0x" + makeid(136), + confirmations: (Math.floor(Math.random() * 99999) + 100).toString(), + + } + + ETH_TX_LIST.push(transaction) + + } + + return ETH_TX_LIST + + +} + +function makeid(length) { + var result = ''; + var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + var charactersLength = characters.length; + for ( var i = 0; i < length; i++ ) { + result += characters.charAt(Math.floor(Math.random() * + charactersLength)); + } + return result; +} + + +export default getDigitalCurrencyTxList; \ No newline at end of file diff --git a/modules/ecommerce/api/ecommerce-routes.ts b/modules/ecommerce/api/ecommerce-routes.ts index 6a6e812a..0de4babe 100644 --- a/modules/ecommerce/api/ecommerce-routes.ts +++ b/modules/ecommerce/api/ecommerce-routes.ts @@ -8,41 +8,40 @@ import { getEcommerceCart } from '../utils/get-ecommerce-cart'; * MockEcommerceProduct: * type: object * properties: - * department: - * type: string - * example: Computers - * type: - * type: string - * example: Chair - * name: - * type: string - * example: Generic Granite Chair - * adjective: - * type: string - * example: Recycled - * description: - * type: string - * example: Carbonite web goalkeeper gloves are ergonomically designed to give easy fit - * material: - * type: string - * example: Wooden - * sku: - * type: array - * items: - * type: object - * properties: - * meta: - * type: object - * properties: - * size: - * type: string - * example: Standard - * price: + * pricePerUnit: + * type: number + * example: 35.44 + * quantity: + * type: number + * example: 3 + * product: + * type: object + * properties: + * productId: + * type: number + * example: 1 + * productName: + * type: string + * example: Super Gamer Juice + * message: + * type: string + * example: I couldn't have managed my 36 hour stint on Fallout 76, without the 4 litres of Super Gamer Juice I drank + * dateTime: + * type: string + * example: 2020-07-02T20:56:42.244Z + * rating: + * type: number + * example: 4 + * userName: + * type: array + * items: * type: string - * example: 806.00 - * amount: - * type: number - * amount: 49403 + * example: Myraa + * categories: + * type: array + * items: + * type: string + * example: sport-drinks */ /** diff --git a/modules/ecommerce/tests/api/ecommerce-routes.test.ts b/modules/ecommerce/tests/api/ecommerce-routes.test.ts new file mode 100644 index 00000000..72b9f550 --- /dev/null +++ b/modules/ecommerce/tests/api/ecommerce-routes.test.ts @@ -0,0 +1,42 @@ +import app from "../../../../app"; +let request = require('supertest'); + +describe('ecommerce api endpoints', () => { + describe('GET /ecommerce/cart', () => { + it('should return a random cart with random products', async () => { + const response = await request(app).get(`/ecommerce/cart`); + + const cart = response.body; + + expect(cart).toHaveProperty('subtotal'); + expect(cart).toHaveProperty('couponCode'); + expect(cart).toHaveProperty('couponPercent'); + expect(cart).toHaveProperty('couponValue'); + expect(cart).toHaveProperty('taxPercent'); + expect(cart).toHaveProperty('taxApplied'); + expect(cart).toHaveProperty('postageValue'); + expect(cart).toHaveProperty('total'); + expect(cart).toHaveProperty('products'); + + expect(cart.products[0]).toHaveProperty('pricePerUnit') + expect(cart.products[0]).toHaveProperty('quantity') + + expect(cart.products[0].product).toHaveProperty('productName') + expect(cart.products[0].product).toHaveProperty('productId') + expect(cart.products[0].product).toHaveProperty('message') + expect(cart.products[0].product).toHaveProperty('dateTime') + expect(cart.products[0].product).toHaveProperty('rating') + expect(cart.products[0].product).toHaveProperty('userName') + expect(cart.products[0].product).toHaveProperty('categories') + }); + }); + + describe('GET /ecommerce/cart/qty', () => { + const qty = 2; + + it('should return a random cart with the given quantity of products', async () => { + const response = await request(app).get(`/ecommerce/cart/${qty}`); + expect(response.body.products.length).toEqual(qty); + }); + }); +}); \ No newline at end of file diff --git a/modules/elements/tests/api/elements-routes.test.ts b/modules/elements/tests/api/elements-routes.test.ts index 82b623ea..26c66e01 100644 --- a/modules/elements/tests/api/elements-routes.test.ts +++ b/modules/elements/tests/api/elements-routes.test.ts @@ -1,11 +1,11 @@ -import request = require('supertest'); -const baseURL = 'http://localhost:3000'; +import request from 'supertest'; +import app from '../../../../app'; // elements-routes.ts tests describe('elements api endpoints', () => { describe('GET /elements', () => { it('should return a random element', async () => { - const response = await request(baseURL).get(`/elements`); + const response = await request(app).get(`/elements`); expect(response.body).toHaveProperty('symbol'); expect(response.body).toHaveProperty('name'); @@ -16,7 +16,7 @@ describe('elements api endpoints', () => { // elements/:qty describe('GET /elements/:qty', () => { it('should return a list of random elements', async () => { - const response = await request(baseURL).get(`/elements/3`); + const response = await request(app).get(`/elements/3`); expect(response.body).toBeInstanceOf(Array); expect(response.body.length).toBe(3); diff --git a/modules/emails/tests/api/emails-routes.test.ts b/modules/emails/tests/api/emails-routes.test.ts index 97e5b840..6aac889f 100644 --- a/modules/emails/tests/api/emails-routes.test.ts +++ b/modules/emails/tests/api/emails-routes.test.ts @@ -1,11 +1,10 @@ -import request = require('supertest'); -const baseURL = 'http://localhost:3000'; - +import request from 'supertest'; +import app from '../../../../app'; // emails-routes.ts tests describe('emails api endpoints', () => { describe('GET /emails', () => { it('should return a list of emails', async () => { - const response = await request(baseURL).get(`/emails`); + const response = await request(app).get(`/emails`).expect(200).expect('Content-Type', /json/); expect(response.body[0]).toHaveProperty('id'); expect(response.body[0]).toHaveProperty('from'); diff --git a/modules/images/tests/Api/images-routes.test.ts b/modules/images/tests/Api/images-routes.test.ts index 4f41e225..d309a1cc 100644 --- a/modules/images/tests/Api/images-routes.test.ts +++ b/modules/images/tests/Api/images-routes.test.ts @@ -1,6 +1,6 @@ import request from 'supertest'; +import app from '../../../../app'; -const baseURL = 'http://localhost:3000'; const get_width_height = (str: string): string[] => { const width_height_regex = /\d+\/\d+/; @@ -14,11 +14,9 @@ describe('image api endpoints', () => { const width = 200; const height = 200; const qty = 2; - - const response = await request(baseURL).get(`/images/abstract/${width}/${height}/${qty}}`); + const response = await request(app).get(`/images/abstract/${width}/${height}/${qty}}`); expect(response.body.length).toBe(qty); const width_height = get_width_height(response.body[0]); - expect(width_height[0]).toEqual(width.toString()); expect(width_height[1]).toEqual(height.toString()); }); @@ -29,11 +27,9 @@ describe('image api endpoints', () => { const width = 200; const height = 200; const qty = 2; - - const response = await request(baseURL).get(`/images/animals/${width}/${height}/${qty}}`); + const response = await request(app).get(`/images/animals/${width}/${height}/${qty}}`); expect(response.body.length).toBe(qty); const width_height = get_width_height(response.body[0]); - expect(width_height[0]).toEqual(width.toString()); expect(width_height[1]).toEqual(height.toString()); }); @@ -45,14 +41,9 @@ describe('image api endpoints', () => { const width = 200; const height = 200; const qty = 2; - - const response = await request(baseURL).get(`/images/avatar/${width}/${height}/${qty}}`); - - console.log(response.body); - + const response = await request(app).get(`/images/avatar/${width}/${height}/${qty}}`); expect(response.body.length).toBe(qty); const width_height = get_width_height(response.body[0]); - expect(width_height[0]).toEqual(width.toString()); expect(width_height[1]).toEqual(height.toString()); }); @@ -63,11 +54,9 @@ describe('image api endpoints', () => { const width = 200; const height = 200; const qty = 2; - - const response = await request(baseURL).get(`/images/business/${width}/${height}/${qty}}`); + const response = await request(app).get(`/images/business/${width}/${height}/${qty}}`); expect(response.body.length).toBe(qty); const width_height = get_width_height(response.body[0]); - expect(width_height[0]).toEqual(width.toString()); expect(width_height[1]).toEqual(height.toString()); }); @@ -78,11 +67,9 @@ describe('image api endpoints', () => { const width = 200; const height = 200; const qty = 2; - - const response = await request(baseURL).get(`/images/cats/${width}/${height}/${qty}}`); + const response = await request(app).get(`/images/cats/${width}/${height}/${qty}}`); expect(response.body.length).toBe(qty); const width_height = get_width_height(response.body[0]); - expect(width_height[0]).toEqual(width.toString()); expect(width_height[1]).toEqual(height.toString()); }); @@ -93,11 +80,9 @@ describe('image api endpoints', () => { const width = 200; const height = 200; const qty = 2; - - const response = await request(baseURL).get(`/images/city/${width}/${height}/${qty}}`); + const response = await request(app).get(`/images/city/${width}/${height}/${qty}}`); expect(response.body.length).toBe(qty); const width_height = get_width_height(response.body[0]); - expect(width_height[0]).toEqual(width.toString()); expect(width_height[1]).toEqual(height.toString()); }); @@ -108,11 +93,9 @@ describe('image api endpoints', () => { const width = 200; const height = 200; const qty = 2; - - const response = await request(baseURL).get(`/images/fashion/${width}/${height}/${qty}}`); + const response = await request(app).get(`/images/fashion/${width}/${height}/${qty}}`); expect(response.body.length).toBe(qty); const width_height = get_width_height(response.body[0]); - expect(width_height[0]).toEqual(width.toString()); expect(width_height[1]).toEqual(height.toString()); }); @@ -123,11 +106,9 @@ describe('image api endpoints', () => { const width = 200; const height = 200; const qty = 2; - - const response = await request(baseURL).get(`/images/food/${width}/${height}/${qty}}`); + const response = await request(app).get(`/images/food/${width}/${height}/${qty}}`); expect(response.body.length).toBe(qty); const width_height = get_width_height(response.body[0]); - expect(width_height[0]).toEqual(width.toString()); expect(width_height[1]).toEqual(height.toString()); }); @@ -138,11 +119,9 @@ describe('image api endpoints', () => { const width = 200; const height = 200; const qty = 2; - - const response = await request(baseURL).get(`/images/nature/${width}/${height}/${qty}}`); + const response = await request(app).get(`/images/nature/${width}/${height}/${qty}}`); expect(response.body.length).toBe(qty); const width_height = get_width_height(response.body[0]); - expect(width_height[0]).toEqual(width.toString()); expect(width_height[1]).toEqual(height.toString()); }); @@ -153,11 +132,9 @@ describe('image api endpoints', () => { const width = 200; const height = 200; const qty = 2; - - const response = await request(baseURL).get(`/images/nightlife/${width}/${height}/${qty}}`); + const response = await request(app).get(`/images/nightlife/${width}/${height}/${qty}}`); expect(response.body.length).toBe(qty); const width_height = get_width_height(response.body[0]); - expect(width_height[0]).toEqual(width.toString()); expect(width_height[1]).toEqual(height.toString()); }); @@ -168,11 +145,9 @@ describe('image api endpoints', () => { const width = 200; const height = 200; const qty = 2; - - const response = await request(baseURL).get(`/images/people/${width}/${height}/${qty}}`); + const response = await request(app).get(`/images/people/${width}/${height}/${qty}}`); expect(response.body.length).toBe(qty); const width_height = get_width_height(response.body[0]); - expect(width_height[0]).toEqual(width.toString()); expect(width_height[1]).toEqual(height.toString()); }); @@ -183,11 +158,9 @@ describe('image api endpoints', () => { const width = 200; const height = 200; const qty = 2; - - const response = await request(baseURL).get(`/images/sports/${width}/${height}/${qty}}`); + const response = await request(app).get(`/images/sports/${width}/${height}/${qty}}`); expect(response.body.length).toBe(qty); const width_height = get_width_height(response.body[0]); - expect(width_height[0]).toEqual(width.toString()); expect(width_height[1]).toEqual(height.toString()); }); @@ -198,11 +171,9 @@ describe('image api endpoints', () => { const width = 200; const height = 200; const qty = 2; - - const response = await request(baseURL).get(`/images/technics/${width}/${height}/${qty}}`); + const response = await request(app).get(`/images/technics/${width}/${height}/${qty}}`); expect(response.body.length).toBe(qty); const width_height = get_width_height(response.body[0]); - expect(width_height[0]).toEqual(width.toString()); expect(width_height[1]).toEqual(height.toString()); }); @@ -213,11 +184,9 @@ describe('image api endpoints', () => { const width = 200; const height = 200; const qty = 2; - - const response = await request(baseURL).get(`/images/transport/${width}/${height}/${qty}}`); + const response = await request(app).get(`/images/transport/${width}/${height}/${qty}}`); expect(response.body.length).toBe(qty); const width_height = get_width_height(response.body[0]); - expect(width_height[0]).toEqual(width.toString()); expect(width_height[1]).toEqual(height.toString()); }); diff --git a/modules/invoice/test/invoices-routes.test.ts b/modules/invoice/test/invoices-routes.test.ts index 877ca241..9c005f03 100644 --- a/modules/invoice/test/invoices-routes.test.ts +++ b/modules/invoice/test/invoices-routes.test.ts @@ -1,12 +1,12 @@ import request from 'supertest'; import Invoice from '../consts/Invoice'; +import app from '../../../app'; -const baseURL = 'http://localhost:3000'; describe('invoice api endpoints', () => { describe('GET /invoices/', () => { it('should return a invoice', async () => { - const response = await request(baseURL).get(`/invoices/`); + const response = await request(app).get(`/invoices/`); const invoice: Invoice = response.body[0]; expect(invoice).toHaveProperty('id'); @@ -34,7 +34,7 @@ describe('invoice api endpoints', () => { it('should return a list of invoices', async () => { const qty = 5; - const response = await request(baseURL).get(`/invoices/${qty}`); + const response = await request(app).get(`/invoices/${qty}`); expect(response.body.length).toEqual(qty); }); }); diff --git a/modules/ip/api/ip-routes.ts b/modules/ip/api/ip-routes.ts index f6c3af82..74710200 100644 --- a/modules/ip/api/ip-routes.ts +++ b/modules/ip/api/ip-routes.ts @@ -20,7 +20,7 @@ module.exports = function (app: core.Express) { * '/ip/{qty}': * get: * tags: - * - Products + * - IPs * summary: Returns a random list of ip addresses * parameters: * - in: path @@ -75,7 +75,7 @@ module.exports = function (app: core.Express) { * '/mac/{qty}': * get: * tags: - * - Products + * - IPs * summary: Returns a random list of mac addresses * parameters: * - in: path diff --git a/modules/ip/tests/ip-routes.tests.ts b/modules/ip/tests/ip-routes.tests.ts index 52f72321..3a4568e1 100644 --- a/modules/ip/tests/ip-routes.tests.ts +++ b/modules/ip/tests/ip-routes.tests.ts @@ -1,13 +1,13 @@ import request from 'supertest'; +import app from '../../../app'; -const baseURL = 'http://localhost:3000'; describe('ip api endpoints', () => { describe('GET /ip/:qty', () => { it('should return a list of ip address', async () => { const qty = 5; - const response = await request(baseURL).get(`/ip/${qty}`); + const response = await request(app).get(`/ip/${qty}`); expect(response.body.length).toEqual(qty); }); }); @@ -16,7 +16,7 @@ describe('GET /mac/:qty', () => { it('should return a list of mac address', async () => { const qty = 5; - const response = await request(baseURL).get(`/mac/${qty}`); + const response = await request(app).get(`/mac/${qty}`); expect(response.body.length).toEqual(qty); }); }); diff --git a/modules/location/api/location-routes.ts b/modules/location/api/location-routes.ts new file mode 100644 index 00000000..8e17c7a4 --- /dev/null +++ b/modules/location/api/location-routes.ts @@ -0,0 +1,102 @@ +import e, { Request, Response } from 'express'; +import * as core from 'express-serve-static-core'; +import { getRandomCoordinates, getCountryCoordinates } from '../utils/getCoordinates'; +import centroids from '../consts/centroids'; +import { getQtyFromRequest } from '../../../utils/route-utils'; + +module.exports = function (app: core.Express) { + /** + * @openapi + * '/location/co-ordinates/random/{qty}': + * get: + * tags: + * - Coordinates + * summary: Obtain random coordinates + * parameters: + * - in: path + * name: qty + * description: The amount of coordinates you require + * type: string + * default: 0 + * responses: + * '200': + * description: OK + * schema: + * type: array + * items: + * type: object + * example: {longitude: '-0.1277583', latitude: '51.5073509'} + */ + + // return a random Coordinates + app.get('/location/co-ordinates/random/:qty', (req: Request, res: Response) => { + const quantity = getQtyFromRequest(req); + + if (isNaN(quantity)) { + return res.status(400).json('Unable to provide a random list of Coordinates with the value received'); + } + + const listElements = []; + for (let i = 0; i < quantity; i++) { + listElements.push(getRandomCoordinates()); + } + + res.json(listElements); + }); + + /** + * @openapi + * '/location/co-ordinates/country/{code}/{qty}': + * get: + * tags: + * - Coordinates + * summary: Obtain random coordinates from a specified country + * parameters: + * - in: path + * name: code + * description: The Country code of the country you require coordinates + * - in: path + * name: qty + * description: The amount of coordinates you require + * type: string + * default: 0 + * responses: + * '200': + * description: OK + * schema: + * type: array + * items: + * type: object + * example: {longitude: '23.5688', latitude: '78.5512', country: "India"} + */ + + // return a random Coordinates for a specified country + app.get('/location/co-ordinates/country/:code/:qty', (req: Request, res: Response) => { + const quantity = getQtyFromRequest(req); + const code = (req.params?.code).toUpperCase(); + + if (isNaN(quantity)) { + return res.status(400).json('Unable to provide a random list of Coordinates with the value received'); + } + + if (code.length !== 2) { + return res.status(400).json('Country code should be of the length 2 characters'); + } + + if (!RegExp(/^\p{L}/, 'u').test(code)) { + return res.status(400).json('Country code should be a character string'); + } + + const countryArray = Object.keys(centroids); + if (!countryArray.includes(code)) { + return res.status(200).json('Not able generate coordinates for the provided country code'); + } + + const listElements = []; + for (let i = 0; i < quantity; i++) { + listElements.push(getCountryCoordinates(code)); + } + + res.json(listElements); + }); +}; diff --git a/modules/location/consts/centroids.ts b/modules/location/consts/centroids.ts new file mode 100644 index 00000000..91334ef4 --- /dev/null +++ b/modules/location/consts/centroids.ts @@ -0,0 +1,1069 @@ +const centroids = { + NU: { + longitude: -169.86878106699083, + latitude: -19.05230921680393, + country: 'Niue', + }, + PN: { + longitude: -128.3149848627581, + latitude: -24.366121747565458, + country: 'Pitcairn', + }, + WS: { + longitude: -172.44107655740137, + latitude: -13.634252953274622, + country: 'Samoa', + }, + TO: { + longitude: -175.20415878511247, + latitude: -21.15927212823853, + country: 'Tonga', + }, + SV: { + longitude: -88.85911489238985, + latitude: 13.758041517055418, + country: 'El Salvador', + }, + GT: { + longitude: -90.31219349119617, + latitude: 15.820878515352684, + country: 'Guatemala', + }, + MX: { + longitude: -101.55399731630118, + latitude: 23.87436068093592, + country: 'Mexico', + }, + CA: { + longitude: -98.41680517868062, + latitude: 57.550480044655636, + country: 'Canada', + }, + AR: { + longitude: -64.53238503843076, + latitude: -35.697270518120085, + country: 'Argentina', + }, + FK: { + longitude: -58.746646363799854, + latitude: -51.75901312766726, + country: 'Falkland Islands', + }, + CL: { + longitude: -70.76863431739216, + latitude: -37.82938283049967, + country: 'Chile', + }, + EC: { + longitude: -78.4630326109714, + latitude: -1.5642721388853116, + country: 'Ecuador', + }, + PE: { + longitude: -74.11416196781884, + latitude: -8.522717984240291, + country: 'Peru', + }, + BO: { + longitude: -64.45209597511206, + latitude: -16.7312488393574, + country: 'Bolivia', + }, + BR: { + longitude: -54.355206608256424, + latitude: -11.524630416426652, + country: 'Brazil', + }, + PY: { + longitude: -58.38906357428651, + latitude: -23.42190559259428, + country: 'Paraguay', + }, + UY: { + longitude: -56.01919523458085, + latitude: -32.78195043831093, + country: 'Uruguay', + }, + AQ: { + longitude: -177.56451613408842, + latitude: -77.16987521415838, + country: 'Antarctica', + }, + FJ: { + longitude: 177.98144613732626, + latitude: -17.822470952336204, + country: 'Fiji', + }, + AG: { + longitude: -61.78530823226373, + latitude: 17.07146759372967, + country: 'Antigua and Barbuda', + }, + AW: { + longitude: -69.97564014284046, + latitude: 12.515625722992898, + country: 'Aruba', + }, + BS: { + longitude: -78.07275370060313, + latitude: 24.72162633646784, + country: 'Bahamas', + }, + BB: { + longitude: -59.557383949150285, + latitude: 13.183219369337529, + country: 'Barbados', + }, + BM: { + longitude: -64.7458500599169, + latitude: 32.315067430740726, + country: 'Bermuda', + }, + VG: { + longitude: -64.62406519257699, + latitude: 18.42195819619707, + country: 'British Virgin Islands', + }, + KY: { + longitude: -81.25203208977878, + latitude: 19.311231805620288, + country: 'Cayman Islands', + }, + CO: { + longitude: -72.6445066243485, + latitude: 4.187753877352739, + country: 'Colombia', + }, + CR: { + longitude: -84.14673625701816, + latitude: 9.863467407406214, + country: 'Costa Rica', + }, + CU: { + longitude: -79.69817857618705, + latitude: 21.476176522869448, + country: 'Cuba', + }, + DM: { + longitude: -61.360471946942994, + latitude: 15.429269860940513, + country: 'Dominica', + }, + DO: { + longitude: -70.43495198520012, + latitude: 18.77954818522993, + country: 'Dominican Republic', + }, + GF: { + longitude: -53.32232307156624, + latitude: 3.857429742497078, + country: 'French Guiana', + }, + HT: { + longitude: -72.89291379842, + latitude: 18.883520486983567, + country: 'Haiti', + }, + HN: { + longitude: -86.49251679006962, + latitude: 14.740370695750006, + country: 'Honduras', + }, + JM: { + longitude: -77.30358894542778, + latitude: 18.12207889341651, + country: 'Jamaica', + }, + MQ: { + longitude: -61.01432380875083, + latitude: 14.642697353597645, + country: 'Martinique', + }, + MS: { + longitude: -62.18693281256255, + latitude: 16.735363391460357, + country: 'Montserrat', + }, + NI: { + longitude: -85.016088327669, + latitude: 12.893566631930554, + country: 'Nicaragua', + }, + PA: { + longitude: -80.14428761482796, + latitude: 8.439536749576892, + country: 'Panama', + }, + PR: { + longitude: -66.49425339593509, + latitude: 18.216224086610914, + country: 'Puerto Rico', + }, + LC: { + longitude: -60.9689510935251, + latitude: 13.895749185129906, + country: 'Saint Lucia', + }, + MF: { + longitude: -63.06678525361946, + latitude: 18.078012113224464, + country: 'Saint Martin', + }, + VC: { + longitude: -61.193766354393034, + latitude: 13.254808122970651, + country: 'Saint Vincent and the Grenadines', + }, + SX: { + longitude: -63.06883135915303, + latitude: 18.03942608463078, + country: 'Sint Maarten', + }, + TT: { + longitude: -61.37236579976247, + latitude: 10.415515638298093, + country: 'Trinidad and Tobago', + }, + VI: { + longitude: -64.76155341409797, + latitude: 17.738009708772523, + country: 'US Virgin Islands', + }, + VE: { + longitude: -66.36492135985132, + latitude: 7.148324760507107, + country: 'Venezuela', + }, + BF: { + longitude: -1.6932816211842325, + latitude: 12.108709036312737, + country: 'Burkina Faso', + }, + CI: { + longitude: -5.571710194917734, + latitude: 7.536779279421307, + country: "Côte d'Ivoire", + }, + GM: { + longitude: -15.383380385869662, + latitude: 13.428617959189328, + country: 'Gambia', + }, + GH: { + longitude: -1.219233362526581, + latitude: 7.94530467243628, + country: 'Ghana', + }, + GI: { + longitude: -5.345549484594358, + latitude: 36.14022671336082, + country: 'Gibraltar', + }, + GN: { + longitude: -10.986948848040218, + latitude: 10.255986541378112, + country: 'Guinea', + }, + LR: { + longitude: -9.258988935497618, + latitude: 6.52012979398834, + country: 'Liberia', + }, + ML: { + longitude: -4.346399841781153, + latitude: 17.168146208584837, + country: 'Mali', + }, + MR: { + longitude: -10.495079045035716, + latitude: 20.466731212820022, + country: 'Mauritania', + }, + MA: { + longitude: -8.817212587250811, + latitude: 28.687598134979325, + country: 'Morocco', + }, + PT: { + longitude: -7.933662183874006, + latitude: 39.67529214702138, + country: 'Portugal', + }, + SN: { + longitude: -14.610875368352305, + latitude: 14.228861491763402, + country: 'Senegal', + }, + SL: { + longitude: -11.78656695731115, + latitude: 8.561330384750587, + country: 'Sierra Leone', + }, + GL: { + longitude: -42.07567788066985, + latitude: 74.16847218965994, + country: 'Greenland', + }, + GG: { + longitude: -2.576392582891568, + latitude: 49.45870771378872, + country: 'Guernsey', + }, + IE: { + longitude: -8.241128545554096, + latitude: 53.30489539816495, + country: 'Ireland', + }, + IM: { + longitude: -4.532995055468449, + latitude: 54.22855301008011, + country: 'Isle of Man', + }, + JE: { + longitude: -2.1291601162653575, + latitude: 49.215396925724306, + country: 'Jersey', + }, + GB: { + longitude: -2.852943909329258, + latitude: 53.97844735080214, + country: 'United Kingdom', + }, + IS: { + longitude: -19.05682967106099, + latitude: 65.12360920205514, + country: 'Iceland', + }, + FO: { + longitude: -6.9811060913122835, + latitude: 62.130896281495346, + country: 'Faroe Islands', + }, + SJ: { + longitude: 16.036378851505283, + latitude: 78.57318936469626, + country: 'Svalbard', + }, + NZ: { + longitude: 170.69035541428696, + latitude: -43.82765432544426, + country: 'New Zealand', + }, + AO: { + longitude: 17.651768783079, + latitude: -12.167424062667942, + country: 'Angola', + }, + BW: { + longitude: 23.85779956995608, + latitude: -22.236609002062902, + country: 'Botswana', + }, + BI: { + longitude: 29.88518227845293, + latitude: -3.261251993278643, + country: 'Burundi', + }, + CG: { + longitude: 14.879732849491393, + latitude: -0.7294391595233845, + country: 'Congo', + }, + CD: { + longitude: 23.419827574282188, + latitude: -3.338629596207896, + country: 'Congo DRC', + }, + GA: { + longitude: 11.839410898545754, + latitude: -0.628448459921234, + country: 'Gabon', + }, + KE: { + longitude: 37.95309411262371, + latitude: 0.6899182318376179, + country: 'Kenya', + }, + LS: { + longitude: 28.24475317864227, + latitude: -29.60168116924817, + country: 'Lesotho', + }, + MW: { + longitude: 34.23441182298881, + latitude: -13.128986464184024, + country: 'Malawi', + }, + MZ: { + longitude: 35.208577031290176, + latitude: -17.525230309488748, + country: 'Mozambique', + }, + NA: { + longitude: 18.16451345845268, + latitude: -21.90858163281473, + country: 'Namibia', + }, + RW: { + longitude: 29.919439681764082, + latitude: -2.014687460047154, + country: 'Rwanda', + }, + ZA: { + longitude: 24.75252746489084, + latitude: -28.55361930679731, + country: 'South Africa', + }, + SZ: { + longitude: 31.510685746082007, + latitude: -26.562540935608702, + country: 'Eswatini', + }, + TZ: { + longitude: 34.81832206060381, + latitude: -6.355794440041147, + country: 'Tanzania', + }, + ZM: { + longitude: 27.75521363430896, + latitude: -13.162832953186246, + country: 'Zambia', + }, + ZW: { + longitude: 29.717829640720844, + latitude: -18.92700121981475, + country: 'Zimbabwe', + }, + IO: { + longitude: 72.43501618476016, + latitude: -7.323548444385743, + country: 'British Indian Ocean Territory', + }, + HM: { + longitude: 73.49298560844045, + latitude: -53.084170035513736, + country: 'Heard Island and McDonald Islands', + }, + MG: { + longitude: 46.68493466832544, + latitude: -19.04163612493041, + country: 'Madagascar', + }, + MU: { + longitude: 57.56415671066546, + latitude: -20.28142317475198, + country: 'Mauritius', + }, + YT: { + longitude: 45.128142327031064, + latitude: -12.824468416301052, + country: 'Mayotte', + }, + SC: { + longitude: 55.47250789595527, + latitude: -4.660002318822744, + country: 'Seychelles', + }, + DZ: { + longitude: 2.6558464719769135, + latitude: 28.350969744889056, + country: 'Algeria', + }, + BJ: { + longitude: 2.305714528830206, + latitude: 9.503013199615893, + country: 'Benin', + }, + CM: { + longitude: 12.948474142398263, + latitude: 6.294168487480992, + country: 'Cameroon', + }, + CF: { + longitude: 20.520743419397256, + latitude: 6.331390033944319, + country: 'Central African Republic', + }, + TD: { + longitude: 18.427113900363025, + latitude: 15.283493546654503, + country: 'Chad', + }, + GQ: { + longitude: 10.425456672353823, + latitude: 1.5954643936590733, + country: 'Equatorial Guinea', + }, + LY: { + longitude: 17.91133392454237, + latitude: 27.202915771690794, + country: 'Libya', + }, + MT: { + longitude: 14.441922442508494, + latitude: 35.890522650899314, + country: 'Malta', + }, + NE: { + longitude: 8.86863247002646, + latitude: 17.08105392407292, + country: 'Niger', + }, + NG: { + longitude: 8.147714845256194, + latitude: 9.61029352034213, + country: 'Nigeria', + }, + TG: { + longitude: 0.8990857571109684, + latitude: 8.660743037717811, + country: 'Togo', + }, + TN: { + longitude: 9.65587551697984, + latitude: 34.08636179565723, + country: 'Tunisia', + }, + CY: { + longitude: 33.375346009199205, + latitude: 35.11700416345239, + country: 'Cyprus', + }, + DJ: { + longitude: 42.613496898789506, + latitude: 11.750235727618804, + country: 'Djibouti', + }, + EG: { + longitude: 30.240135435012338, + latitude: 26.60517034450628, + country: 'Egypt', + }, + ER: { + longitude: 39.2672401449901, + latitude: 15.005533147667684, + country: 'Eritrea', + }, + ET: { + longitude: 39.914902886544276, + latitude: 8.729389557048396, + country: 'Ethiopia', + }, + GR: { + longitude: 23.110368936161876, + latitude: 39.42012261727978, + country: 'Greece', + }, + IQ: { + longitude: 43.832529181056884, + latitude: 33.105075667527906, + country: 'Iraq', + }, + IL: { + longitude: 35.027923472437024, + latitude: 31.513542220043195, + country: 'Israel', + }, + JO: { + longitude: 36.95728884547246, + latitude: 31.387064884449156, + country: 'Jordan', + }, + LB: { + longitude: 35.89651946324749, + latitude: 33.91160170722086, + country: 'Lebanon', + }, + PS: { + longitude: 35.24251184154588, + latitude: 31.930818736453883, + country: 'Palestinian Territory', + }, + SS: { + longitude: 30.3851856901788, + latitude: 7.657782041763295, + country: 'South Sudan', + }, + SD: { + longitude: 29.951458283594064, + latitude: 15.67060230984256, + country: 'Sudan', + }, + SY: { + longitude: 38.5117323139514, + latitude: 35.09751106058316, + country: 'Syria', + }, + TR: { + longitude: 35.56886764076691, + latitude: 38.93207363123396, + country: 'Turkey', + }, + UG: { + longitude: 32.34371768463123, + latitude: 1.2821729218416205, + country: 'Uganda', + }, + AD: { + longitude: 1.5802243611232873, + latitude: 42.54859834854764, + country: 'Andorra', + }, + US: { + longitude: -96.33161660829639, + latitude: 38.8208089190304, + country: 'United States', + }, + FR: { + longitude: 2.1940236627886227, + latitude: 46.6423682169416, + country: 'France', + }, + LI: { + longitude: 9.547674672376376, + latitude: 47.14627562133036, + country: 'Liechtenstein', + }, + MC: { + longitude: 7.412820873271196, + latitude: 43.74798224995656, + country: 'Monaco', + }, + CH: { + longitude: 8.286928794895285, + latitude: 46.73678128684938, + country: 'Switzerland', + }, + BE: { + longitude: 4.675010154696485, + latitude: 50.6182138854095, + country: 'Belgium', + }, + DE: { + longitude: 10.426171427430804, + latitude: 51.08304539800482, + country: 'Germany', + }, + LU: { + longitude: 6.103230338458876, + latitude: 49.77523454542369, + country: 'Luxembourg', + }, + NL: { + longitude: 5.554136426128487, + latitude: 52.134054128923886, + country: 'Netherlands', + }, + AL: { + longitude: 20.061082767269493, + latitude: 41.14165894891656, + country: 'Albania', + }, + AT: { + longitude: 13.797778364631036, + latitude: 47.631858269895794, + country: 'Austria', + }, + BA: { + longitude: 17.83467240787538, + latitude: 44.14415356126429, + country: 'Bosnia and Herzegovina', + }, + HR: { + longitude: 16.625761129583374, + latitude: 44.91192100856702, + country: 'Croatia', + }, + CZ: { + longitude: 15.383273292023533, + latitude: 49.74917370930982, + country: 'Czech Republic', + }, + DK: { + longitude: 9.378670542409406, + latitude: 56.00118817971057, + country: 'Denmark', + }, + HU: { + longitude: 19.39620048366142, + latitude: 47.22527332486294, + country: 'Hungary', + }, + IT: { + longitude: 12.763657166123137, + latitude: 42.98201127614267, + country: 'Italy', + }, + ME: { + longitude: 19.29505087156758, + latitude: 42.73694835210454, + country: 'Montenegro', + }, + PL: { + longitude: 19.43573279234468, + latitude: 52.06848055692473, + country: 'Poland', + }, + SM: { + longitude: 12.461278349581722, + latitude: 43.942820729097896, + country: 'San Marino', + }, + RS: { + longitude: 20.85677444395745, + latitude: 44.02679870131969, + country: 'Serbia', + }, + SK: { + longitude: 19.581015362490966, + latitude: 48.69808390520484, + country: 'Slovakia', + }, + SI: { + longitude: 14.890636899973781, + latitude: 46.13759229564504, + country: 'Slovenia', + }, + MK: { + longitude: 21.70998923872772, + latitude: 41.59402890143112, + country: 'North Macedonia', + }, + VA: { + longitude: 12.451312917026133, + latitude: 41.90402351316735, + country: 'Vatican City', + }, + NO: { + longitude: 16.670259272390894, + latitude: 64.97775882947745, + country: 'Norway', + }, + SE: { + longitude: 17.062431988004956, + latitude: 62.73420986108448, + country: 'Sweden', + }, + BY: { + longitude: 27.964252054715104, + latitude: 53.46791374543163, + country: 'Belarus', + }, + BG: { + longitude: 25.251739122561908, + latitude: 42.82043677302438, + country: 'Bulgaria', + }, + EE: { + longitude: 25.916870250633806, + latitude: 58.648108311231034, + country: 'Estonia', + }, + FI: { + longitude: 25.65738433454702, + latitude: 65.01578959749911, + country: 'Finland', + }, + GE: { + longitude: 43.378866534112234, + latitude: 42.17986277737226, + country: 'Georgia', + }, + LV: { + longitude: 24.693671325654403, + latitude: 56.813853047554154, + country: 'Latvia', + }, + LT: { + longitude: 23.946021605013534, + latitude: 55.29437393417175, + country: 'Lithuania', + }, + MD: { + longitude: 28.391111865941348, + latitude: 47.0725674580696, + country: 'Moldova', + }, + RO: { + longitude: 25.094158201563292, + latitude: 45.82454894397586, + country: 'Romania', + }, + UA: { + longitude: 31.27377208442636, + latitude: 48.657532515563794, + country: 'Ukraine', + }, + AF: { + longitude: 66.59216131095278, + latitude: 34.13402601376932, + country: 'Afghanistan', + }, + BH: { + longitude: 50.540695402276775, + latitude: 26.04798501537066, + country: 'Bahrain', + }, + IN: { + longitude: 81.17300408530181, + latitude: 23.586300567746722, + country: 'India', + }, + IR: { + longitude: 54.237077001065444, + latitude: 32.906023742890056, + country: 'Iran', + }, + KW: { + longitude: 47.56311109320184, + latitude: 29.281360965443092, + country: 'Kuwait', + }, + MV: { + longitude: 73.10076245140479, + latitude: -0.6065577168009924, + country: 'Maldives', + }, + NP: { + longitude: 84.1338898313567, + latitude: 28.300920699755657, + country: 'Nepal', + }, + OM: { + longitude: 55.841088119829, + latitude: 20.7242833183209, + country: 'Oman', + }, + PK: { + longitude: 69.08835090769651, + latitude: 30.116188371410882, + country: 'Pakistan', + }, + QA: { + longitude: 51.19794918743203, + latitude: 25.318528486425386, + country: 'Qatar', + }, + SA: { + longitude: 44.600958178225596, + latitude: 24.136038144757897, + country: 'Saudi Arabia', + }, + SO: { + longitude: 45.40037867243972, + latitude: 6.524534573103924, + country: 'Somalia', + }, + LK: { + longitude: 80.66931169770622, + latitude: 7.696630939329944, + country: 'Sri Lanka', + }, + TJ: { + longitude: 70.94215281065698, + latitude: 38.56933138382972, + country: 'Tajikistan', + }, + TM: { + longitude: 58.4577357627054, + latitude: 39.06069118001429, + country: 'Turkmenistan', + }, + AE: { + longitude: 54.27920525789581, + latitude: 24.18250292309135, + country: 'United Arab Emirates', + }, + YE: { + longitude: 47.46815793206386, + latitude: 16.001392616307445, + country: 'Yemen', + }, + AM: { + longitude: 45.05490831965259, + latitude: 40.17841274230679, + country: 'Armenia', + }, + AZ: { + longitude: 48.634592670644324, + latitude: 40.3920509942049, + country: 'Azerbaijan', + }, + KZ: { + longitude: 66.3759193479301, + latitude: 47.641465195176835, + country: 'Kazakhstan', + }, + KG: { + longitude: 74.17532903468319, + latitude: 41.35698905438358, + country: 'Kyrgyzstan', + }, + UZ: { + longitude: 63.8548297593985, + latitude: 41.4879065244633, + country: 'Uzbekistan', + }, + CX: { + longitude: 105.70209512200549, + latitude: -10.446440802183416, + country: 'Christmas Island', + }, + ID: { + longitude: 113.96538246847302, + latitude: 0.15591979959037652, + country: 'Indonesia', + }, + AU: { + longitude: 134.02277170916162, + latitude: -25.697337673983082, + country: 'Australia', + }, + NR: { + longitude: 166.92937633139178, + latitude: -0.5221021440668993, + country: 'Nauru', + }, + NC: { + longitude: 165.50767040438612, + latitude: -21.33003372660827, + country: 'New Caledonia', + }, + PG: { + longitude: 144.8348942994695, + latitude: -7.156912819152135, + country: 'Papua New Guinea', + }, + SB: { + longitude: 160.16475795033884, + latitude: -9.613104734596515, + country: 'Solomon Islands', + }, + TV: { + longitude: 179.217833977593, + latitude: -8.514701506447222, + country: 'Tuvalu', + }, + VU: { + longitude: 166.84912735669738, + latitude: -15.189132121699332, + country: 'Vanuatu', + }, + KH: { + longitude: 105.03973078680701, + latitude: 12.699186865507775, + country: 'Cambodia', + }, + LA: { + longitude: 103.76375899026448, + latitude: 18.117282736873282, + country: 'Laos', + }, + MY: { + longitude: 114.63330303992869, + latitude: 3.6716608556387857, + country: 'Malaysia', + }, + MM: { + longitude: 97.08892285397344, + latitude: 19.901227931399873, + country: 'Myanmar', + }, + SG: { + longitude: 103.81025757634053, + latitude: 1.3528251890006349, + country: 'Singapore', + }, + TH: { + longitude: 101.08675116214552, + latitude: 13.66222784745538, + country: 'Thailand', + }, + VN: { + longitude: 105.91338832758704, + latitude: 16.517347170839393, + country: 'Vietnam', + }, + BD: { + longitude: 90.43212562608613, + latitude: 23.673728665121, + country: 'Bangladesh', + }, + BT: { + longitude: 90.46716647173861, + latitude: 27.42163933959824, + country: 'Bhutan', + }, + CN: { + longitude: 104.69113855849604, + latitude: 38.07325481105728, + country: 'China', + }, + BN: { + longitude: 114.6430958360464, + latitude: 4.543205889917609, + country: 'Brunei Darussalam', + }, + PH: { + longitude: 121.82208941416745, + latitude: 15.586542251094242, + country: 'Philippines', + }, + KR: { + longitude: 127.76224551357649, + latitude: 36.402386712544114, + country: 'South Korea', + }, + MN: { + longitude: 103.3987360327455, + latitude: 47.08644454604851, + country: 'Mongolia', + }, + KP: { + longitude: 127.3379805653744, + latitude: 40.19198091470839, + country: 'North Korea', + }, + GU: { + longitude: 144.78024458298802, + latitude: 13.445430479945276, + country: 'Guam', + }, + JP: { + longitude: 137.46934234351835, + latitude: 36.76738832597829, + country: 'Japan', + }, + MH: { + longitude: 168.72016025351076, + latitude: 7.307929900994344, + country: 'Marshall Islands', + }, + FM: { + longitude: 158.2291899444527, + latitude: 6.8789448129255435, + country: 'Micronesia', + }, + MP: { + longitude: 145.74119737203134, + latitude: 15.178063516432115, + country: 'Northern Mariana Islands', + }, + PW: { + longitude: 134.57965086721052, + latitude: 7.534775852547396, + country: 'Palau', + }, + RU: { + longitude: 98.6704990698032, + latitude: 59.039434214106194, + country: 'Russian Federation', + }, + ES: { + longitude: -16.53799441021647, + latitude: 28.297665106525546, + country: 'Canarias', + }, +}; + +export default centroids; diff --git a/modules/location/test/api/location-routes.test.ts b/modules/location/test/api/location-routes.test.ts new file mode 100644 index 00000000..1de33633 --- /dev/null +++ b/modules/location/test/api/location-routes.test.ts @@ -0,0 +1,32 @@ +import app from "../../../../app"; +let request = require('supertest'); + +// Test case: for random coordinates is returned check +describe('random coordinates api endpoints', () => { + describe('GET /location/co-ordinates/random/:qty', () => { + it('should return a one random coordinates', async () => { + const qty = 1; + const response = await request(app).get(`/location/co-ordinates/random/${qty}`); + const coordinates = response.body[0]; + expect(coordinates).toHaveProperty('latitude'); + expect(coordinates).toHaveProperty('longitude'); + expect(response.body.length).toStrictEqual(qty); + }); + }); +}); + +// Test case: for One random coordinates in specified country is returned check +describe('coordinates for country code', () => { + describe('GET /location/co-ordinates/country/:code/:qty', () => { + it('should return a one random coordinate in specified country', async () => { + const code = 'US'; + const qty = 1; + const response = await request(app).get(`/location/co-ordinates/country/${code}/${qty}`); + const coordinates = response.body[0]; + expect(coordinates).toHaveProperty('latitude'); + expect(coordinates).toHaveProperty('longitude'); + expect(coordinates).toHaveProperty('country'); + expect(response.body.length).toStrictEqual(qty); + }); + }); +}); diff --git a/modules/location/utils/getCoordinates.ts b/modules/location/utils/getCoordinates.ts new file mode 100644 index 00000000..0f84dc3a --- /dev/null +++ b/modules/location/utils/getCoordinates.ts @@ -0,0 +1,16 @@ +import { faker } from '@faker-js/faker'; +import centroids from '../consts/centroids'; + +const getRandomCoordinates = () => { + const longitude = faker.address.longitude(); + const latitude = faker.address.latitude(); + return { longitude, latitude }; +}; + +const getCountryCoordinates = (countryCode: string) => { + const data = centroids[countryCode]; + const coordinates = faker.address.nearbyGPSCoordinate([data.latitude, data.longitude], 500); + return { longitude: coordinates[0], latitude: coordinates[1], country: data.country }; +}; + +export { getRandomCoordinates, getCountryCoordinates }; diff --git a/modules/music/test/music-routes.test.ts b/modules/music/test/music-routes.test.ts index 95f409b3..d0ec1305 100644 --- a/modules/music/test/music-routes.test.ts +++ b/modules/music/test/music-routes.test.ts @@ -2,13 +2,13 @@ import request from 'supertest'; import { Album } from '../consts/Album'; import { Music } from '../consts/Music'; -const baseURL = 'http://localhost:3000'; +import app from '../../../app'; describe('music api endpoints', () => { describe('GET /music/:qty', () => { it('should return a list of musics', async () => { const qty = 10; - const response = await request(baseURL).get(`/music/${qty}`); + const response = await request(app).get(`/music/${qty}`); const music: Music = response.body.data[0]; expect(music).toHaveProperty('id'); @@ -21,7 +21,7 @@ describe('music api endpoints', () => { describe('GET /album/:qty', () => { it('should return a album', async () => { const qty = 10; - const response = await request(baseURL).get(`/album/${qty}`); + const response = await request(app).get(`/album/${qty}`); const album: Album = response.body.data[0]; expect(album).toHaveProperty('id'); diff --git a/modules/names/tests/Api/names-routes.test.ts b/modules/names/tests/Api/names-routes.test.ts index cdf81727..08576f82 100644 --- a/modules/names/tests/Api/names-routes.test.ts +++ b/modules/names/tests/Api/names-routes.test.ts @@ -1,5 +1,5 @@ import request from 'supertest'; -const baseURL = 'http://localhost:3000'; +import app from '../../../../app'; //These routes dont seem to provide consistent responses @@ -7,28 +7,28 @@ describe('name routes endpoints', () => { describe('male', () => { it('GET /names/fullnames/male/:qty?', async () => { const qty = 5; - const response = await request(baseURL).get(`/names/fullnames/male/${qty}`); + const response = await request(app).get(`/names/fullnames/male/${qty}`); expect(response.body.length).toBe(qty); }); it('GET /names/middlenames/male/:qty?', async () => { const qty = 5; - const response = await request(baseURL).get(`/names/middlenames/male/${qty}`); + const response = await request(app).get(`/names/middlenames/male/${qty}`); expect(response.body.length).toBe(qty); }); it('GET /names/surnames/male/:qty?', async () => { const qty = 5; - const response = await request(baseURL).get(`/names/surnames/male/${qty}`); + const response = await request(app).get(`/names/surnames/male/${qty}`); expect(response.body.length).toBe(qty); }); it('GET /names/fullnames/male/:qty?', async () => { const qty = 5; - const response = await request(baseURL).get(`/names/fullnames/male/${qty}`); + const response = await request(app).get(`/names/fullnames/male/${qty}`); expect(response.body.length).toBe(qty); }); @@ -37,28 +37,28 @@ describe('name routes endpoints', () => { describe('female', () => { it('GET /names/fullnames/female/:qty?', async () => { const qty = 5; - const response = await request(baseURL).get(`/names/fullnames/female/${qty}`); + const response = await request(app).get(`/names/fullnames/female/${qty}`); expect(response.body.length).toBe(qty); }); it('GET /names/middlenames/female/:qty?', async () => { const qty = 5; - const response = await request(baseURL).get(`/names/middlenames/female/${qty}`); + const response = await request(app).get(`/names/middlenames/female/${qty}`); expect(response.body.length).toBe(qty); }); it('GET /names/surnames/female/:qty?', async () => { const qty = 5; - const response = await request(baseURL).get(`/names/surnames/female/${qty}`); + const response = await request(app).get(`/names/surnames/female/${qty}`); expect(response.body.length).toBe(qty); }); it('GET /names/fullnames/female/:qty?', async () => { const qty = 5; - const response = await request(baseURL).get(`/names/fullnames/female/${qty}`); + const response = await request(app).get(`/names/fullnames/female/${qty}`); expect(response.body.length).toBe(qty); }); @@ -67,28 +67,28 @@ describe('name routes endpoints', () => { describe('no gender given', () => { it('GET /names/fullnames/:qty?', async () => { const qty = 5; - const response = await request(baseURL).get(`/names/fullnames/${qty}`); + const response = await request(app).get(`/names/fullnames/${qty}`); expect(response.body.length).toBe(qty); }); it('GET /names/middlenames/:qty?', async () => { const qty = 5; - const response = await request(baseURL).get(`/names/middlenames/${qty}`); + const response = await request(app).get(`/names/middlenames/${qty}`); expect(response.body.length).toBe(qty); }); it('GET /names/surnames/:qty?', async () => { const qty = 5; - const response = await request(baseURL).get(`/names/surnames/${qty}`); + const response = await request(app).get(`/names/surnames/${qty}`); expect(response.body.length).toBe(qty); }); it('GET /names/fullnames/:qty?', async () => { const qty = 5; - const response = await request(baseURL).get(`/names/fullnames/${qty}`); + const response = await request(app).get(`/names/fullnames/${qty}`); expect(response.body.length).toBe(qty); }); diff --git a/modules/phone-numbers/test/api/phone-number-routes.test.ts b/modules/phone-numbers/test/api/phone-number-routes.test.ts index a4853eac..4736670a 100644 --- a/modules/phone-numbers/test/api/phone-number-routes.test.ts +++ b/modules/phone-numbers/test/api/phone-number-routes.test.ts @@ -1,7 +1,5 @@ -import countryNumberData from '../../consts/countryNumberData'; - import request from 'supertest'; -const baseURL = 'http://localhost:3000'; +import app from '../../../../app'; // Test case: for One phone number is returned check describe('phonenumber api endpoints', () => { @@ -9,7 +7,7 @@ describe('phonenumber api endpoints', () => { it('should return a one random country phonenumbers', async () => { const qty = 1; - const response = await request(baseURL).get('/phonenumbers/'); + const response = await request(app).get('/phonenumbers/'); expect([response.body].length).toStrictEqual(qty); }); }); @@ -20,7 +18,7 @@ describe('phonenumber imei endpoints', () => { describe('GET /phonenumbers/imei', () => { it('should return a one random imei', async () => { const qty = 1; - const response = await request(baseURL).get('/phonenumbers/imei'); + const response = await request(app).get('/phonenumbers/imei'); expect([response.body].length).toStrictEqual(qty); }); }); @@ -34,7 +32,7 @@ describe('phonenumber with country code & format endpoints', () => { const countrycode = 'US'; const format = 'space'; const qty = 1; - const response = await request(baseURL).get(`/phonenumbers/country/${countrycode}/${format}`); + const response = await request(app).get(`/phonenumbers/country/${countrycode}/${format}`); expect([response.body].length).toStrictEqual(qty); }); }); @@ -47,7 +45,7 @@ describe('phonenumber with country code & format endpoints', () => { const countrycode = 'GB'; const format = 'nospace'; const qty = 1; - const response = await request(baseURL).get(`/phonenumbers/country/${countrycode}/${format}`); + const response = await request(app).get(`/phonenumbers/country/${countrycode}/${format}`); expect([response.body].length).toStrictEqual(qty); }); }); @@ -60,7 +58,7 @@ describe('phonenumber with country code & format endpoints', () => { const countrycode = 'US'; const format = 'dash'; const qty = 1; - const response = await request(baseURL).get(`/phonenumbers/country/${countrycode}/${format}`); + const response = await request(app).get(`/phonenumbers/country/${countrycode}/${format}`); expect([response.body].length).toStrictEqual(qty); }); }); @@ -73,7 +71,7 @@ describe('phonenumber with country code as US & format space', () => { const countrycode = 'US'; const format = 'space'; const qty = 1; - const response = await request(baseURL).get(`/phonenumbers/country/${countrycode}/${format}`); + const response = await request(app).get(`/phonenumbers/country/${countrycode}/${format}`); expect(/^[+](1\s?)?(\d{3}|\(\d{3}\))[\s]?\d{3}[\s]?\d{4}$/.test(response.body)); }); }); @@ -86,7 +84,7 @@ describe('phonenumber with country code as US & format space', () => { const countrycode = 'US'; const format = 'dash'; const qty = 1; - const response = await request(baseURL).get(`/phonenumbers/country/${countrycode}/${format}`); + const response = await request(app).get(`/phonenumbers/country/${countrycode}/${format}`); expect(/^[+](1\-?)?(\d{3}|\(\d{3}\))[\-]?\d{3}[\-]?\d{4}$/.test(response.body)); }); }); @@ -99,7 +97,7 @@ describe('phonenumber with country code as US & format space', () => { const countrycode = 'US'; const format = 'dash'; const qty = 1; - const response = await request(baseURL).get(`/phonenumbers/country/${countrycode}/${format}`); + const response = await request(app).get(`/phonenumbers/country/${countrycode}/${format}`); expect(/^[+](1?)?(\d{3}|\(\d{3}\))?\d{3}?\d{4}$/.test(response.body)); }); }); diff --git a/modules/products/api/products-routes.ts b/modules/products/api/products-routes.ts index dfe83f5d..1d230dde 100644 --- a/modules/products/api/products-routes.ts +++ b/modules/products/api/products-routes.ts @@ -3,6 +3,7 @@ import * as core from 'express-serve-static-core'; import productReviews from '../data/product-reviews'; import { getQtyFromRequest } from '../../../utils/route-utils'; import getProducts from '../utils/getProducts'; +import { randomRating } from '../../../utils/numbers'; /** * @openapi @@ -102,7 +103,7 @@ module.exports = function (app: core.Express) { /** * @openapi - * '/product/{department}': + * '/product/department/{department}': * get: * tags: * - Products @@ -117,7 +118,7 @@ module.exports = function (app: core.Express) { * schema: * $ref: '#/definitions/MockProduct' */ - app.get('/product/:department', (req: Request, res: Response) => { + app.get('/product/department/:department', (req: Request, res: Response) => { const department = req.params.department ? req.params.department.toString() : 'General'; res.json(getProducts(1, department)); }); @@ -204,12 +205,13 @@ module.exports = function (app: core.Express) { * schema: * $ref: '#/definitions/MockProductReview' */ - app.get('/products/reviews/rating/:rating', (req: Request, res: Response) => { - let reviews = productReviews; - const rating = parseInt(req.params.rating); - reviews.forEach((element) => { - element.rating = rating; - }); - res.json(reviews); + app.get('/products/reviews/ratings/:rating', (req: Request, res: Response) => { + const rating = req.params.rating ? + (parseInt(req.params.rating) <= 5 ? + parseInt(req.params.rating) + : 5) + : randomRating(); + const filtereReview = productReviews.filter((element) => element.rating = rating); + res.json(filtereReview); }); }; diff --git a/modules/products/data/product-reviews.ts b/modules/products/data/product-reviews.ts index 184bc9b3..87113579 100644 --- a/modules/products/data/product-reviews.ts +++ b/modules/products/data/product-reviews.ts @@ -48,8 +48,295 @@ const productReviews = [ rating: randomRating(), userName: getFullNames(1), categories: ['sport-drinks','gaming'] - } - + }, + { + productName: "Golden-arm", + productId: 2, + message: "An amazing sequel to an amazing classic! Great introduction to the new N65 console.", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['gaming'] + }, + { + productName: "Golden-arm", + productId: 2, + message: "Not nearly as good as the original, but it's worth checking out.", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['gaming'] + }, + { + productName: "Golden-arm", + productId: 2, + message: "I'm hooked! I can't wait for the finish to the trilogy, Golden-foot!", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['gaming'] + }, + { + productName: "Golden-arm", + productId: 2, + message: "Tons of fun and lots of great new playable characters - they really deliver here", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['gaming'] + }, + { + productName: "Archie Kibble", + productId: 3, + message: "My cat is obsessed with this food - probably likes it too much, as he is putting on weight!", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['pet-food','cat-food'] + }, + { + productName: "Archie Kibble", + productId: 3, + message: "Great food for a great price... not that I've tried it myself", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['pet-food','cat-food'] + }, + { + productName: "Archie Kibble", + productId: 3, + message: "Too expensive for my wallet!", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['pet-food','cat-food'] + }, + { + productName: "Archie Kibble", + productId: 3, + message: "All but my pickiest cats seem to enjoy eating it", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['pet-food','cat-food'] + }, + { + productName: "Choc-o-lot Bars", + productId: 4, + message: "What a rich treat to enjoy a little too often for my diet!", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['snack-food','food'] + }, + { + productName: "Choc-o-lot Bars", + productId: 4, + message: "The only kind of chocolate I will eat now", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['snack-food','food'] + }, + { + productName: "Choc-o-lot Bars", + productId: 4, + message: "Mine were all broken when I opened the package, but it still tasted good I guess", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['snack-food','food'] + }, + { + productName: "ACME Decorative Tombstones", + productId: 5, + message: "These fell apart with one rain storm - really disappointing", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['halloween','decor'] + }, + { + productName: "ACME Decorative Tombstones", + productId: 5, + message: "The stakes these came with were too small, but the tombstones looked fine in my yard when I used my own stakes", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['halloween','decor'] + }, + { + productName: "ACME Decorative Tombstones", + productId: 5, + message: "Loved how these look - totally got my yard in the Halloween mood", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['halloween','decor'] + }, + { + productName: "ACME Decorative Tombstones", + productId: 5, + message: "I like these, but I do wish they were bigger", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['halloween','decor'] + }, + { + productName: "Bartender's Best Margarita Glasses", + productId: 6, + message: "These look so great and I love serving my guests with them", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['glassware'] + }, + { + productName: "Bartender's Best Margarita Glasses", + productId: 6, + message: "I wish they were a little bigger (I like a heavy pour) but they work", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['glassware'] + }, + { + productName: "Bartender's Best Margarita Glasses", + productId: 6, + message: "One of them arrived broken - they should really pack them better!", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['glassware'] + }, + { + productName: "Matexo Pink Water Bottle", + productId: 7, + message: "Saving the environment never looked so good!", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['water-bottles'] + }, + { + productName: "Matexo Pink Water Bottle", + productId: 7, + message: "Perfect size, and keeps my water cold all day", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['water-bottles'] + }, + { + productName: "Matexo Pink Water Bottle", + productId: 7, + message: "Wish it was a little smaller to fit in my drink holder, but I should have checked the measurements", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['water-bottles'] + }, + { + productName: "Matexo Pink Water Bottle", + productId: 7, + message: "Durable and cute at the same time", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['water-bottles'] + }, + { + productName: "Kaysus Gaming PC", + productId: 8, + message: "The specs aren't worth what they are charging for it", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['gaming','pc','gaming-pc'] + }, + { + productName: "Kaysus Gaming PC", + productId: 8, + message: "It's a little slow, but the graphics look great when they load properly", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['gaming','pc','gaming-pc'] + }, + { + productName: "Kaysus Gaming PC", + productId: 8, + message: "Works great for my favorite simulation game, I'm happy with it", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['gaming','pc','gaming-pc'] + }, + { + productName: "Woolworth's Wool Sweater", + productId: 9, + message: "It keeps me incredibly warm in my cold climate!", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['clothes'] + }, + { + productName: "Woolworth's Wool Sweater", + productId: 9, + message: "Keeps pilling way more than I think it should, not happy", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['clothes'] + }, + { + productName: "Woolworth's Wool Sweater", + productId: 9, + message: "Looks great, love all the color options", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['clothes'] + }, + { + productName: "Woolworth's Wool Sweater", + productId: 9, + message: "The burgundy looks more pink than burgundy, be warned!", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['clothes'] + }, + { + productName: "Z440 Athletic Sneakers", + productId: 10, + message: "These kicks look so cool and I get lots of compliments on them!", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['shoes','sneakers'] + }, + { + productName: "Z440 Athletic Sneakers", + productId: 10, + message: "Get scuffed way too easily, I spend forever trying to keep them clean", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['shoes','sneakers'] + }, + { + productName: "Z440 Athletic Sneakers", + productId: 10, + message: "Super comfortable on my daily runs", + dateTime: getRandomDate(new Date('1960-02-12T01:57:45.271Z'), new Date('2022-12-31T01:57:45.271Z')), + rating: randomRating(), + userName: getFullNames(1), + categories: ['shoes','sneakers'] + }, ] export default productReviews; \ No newline at end of file diff --git a/modules/products/test/api/products-routes.test.ts b/modules/products/test/api/products-routes.test.ts index afae3bb0..22c74c7a 100644 --- a/modules/products/test/api/products-routes.test.ts +++ b/modules/products/test/api/products-routes.test.ts @@ -1,10 +1,10 @@ import request from 'supertest'; -const baseURL = 'http://localhost:3000'; +import app from '../../../../app'; describe('products api endpoints', () => { describe('GET /products/reviews', () => { it('should return a user', async () => { - const response = await request(baseURL).get(`/products/reviews`); + const response = await request(app).get(`/products/reviews`); expect(response.body[0]).toHaveProperty('productName'); expect(response.body[0]).toHaveProperty('productId'); @@ -16,12 +16,69 @@ describe('products api endpoints', () => { }); }); - describe('GET /products/reviews/rating/:rating', () => { + describe('GET /products/reviews/ratings/:rating', () => { const rating = 2; - it('should return a list of users ', async () => { - const response = await request(baseURL).get(`/products/reviews/rating/${rating}`); - expect(response.body[0].rating).toBeLessThanOrEqual(rating); + it('should return a list of reviews ', async () => { + const response = await request(app).get(`/products/reviews/ratings/${rating}`); + expect(response.body[0].rating).toEqual(rating); + expect(response.body[0]).toHaveProperty('productName'); + expect(response.body[0]).toHaveProperty('productId'); + expect(response.body[0]).toHaveProperty('message'); + expect(response.body[0]).toHaveProperty('dateTime'); + expect(response.body[0]).toHaveProperty('rating'); + expect(response.body[0]).toHaveProperty('userName'); + expect(response.body[0]).toHaveProperty('categories'); + }); + }); + + describe('GET /products/:qty/:department', () => { + const quantity = 4; + const department = "Computer"; + + it('should return a list of products ', async () => { + const response = await request(app).get(`/products/${quantity}/${department}`); + expect(response.body.length).toEqual(quantity); + expect(response.body[0].department).toEqual(department); + expect(response.body[0]).toHaveProperty('department'); + expect(response.body[0]).toHaveProperty('type'); + expect(response.body[0]).toHaveProperty('name'); + expect(response.body[0]).toHaveProperty('adjective'); + expect(response.body[0]).toHaveProperty('description'); + expect(response.body[0]).toHaveProperty('material'); + expect(response.body[0]).toHaveProperty('sku'); + }); + }); + + describe('GET /products/quantity/:qty', () => { + const quantity = 4; + + it('should return a list of products', async () => { + const response = await request(app).get(`/products/${quantity}`); + expect(response.body.length).toEqual(quantity); + }); + }); + + describe('GET /products/department/:qty', () => { + const department = "Computer"; + + it('should return a list of products', async () => { + const response = await request(app).get(`/products/department/${department}`); + expect(response.body[0].department).toEqual(department); + }); + }); + + describe('GET /product', () => { + it('should return a random product ', async () => { + const response = await request(app).get(`/product`); + expect(response.body.length).toEqual(1); + expect(response.body[0]).toHaveProperty('department'); + expect(response.body[0]).toHaveProperty('type'); + expect(response.body[0]).toHaveProperty('name'); + expect(response.body[0]).toHaveProperty('adjective'); + expect(response.body[0]).toHaveProperty('description'); + expect(response.body[0]).toHaveProperty('material'); + expect(response.body[0]).toHaveProperty('sku'); }); }); }); diff --git a/modules/socials/api/socials-routes.ts b/modules/socials/api/socials-routes.ts index aeaf30f5..bdd6b91e 100644 --- a/modules/socials/api/socials-routes.ts +++ b/modules/socials/api/socials-routes.ts @@ -1,6 +1,7 @@ import { Request, Response } from 'express'; import * as core from 'express-serve-static-core'; import { DEFAULT_POSTS_COUNT } from '../consts/default'; +import { getRandomFacebookPosts } from '../utils/getRandomFacebookPosts'; import { getRandomInstagramPosts } from '../utils/getRandomInstagramPosts'; import { getRandomTwitterPosts } from '../utils/getRandomTwitterPosts'; @@ -42,4 +43,24 @@ module.exports = function (app: core.Express) { app.get('/socials/instagram', (req: Request, res: Response) => { res.json(getRandomInstagramPosts(DEFAULT_POSTS_COUNT)); }); + + /** + * @openapi + * '/socials/facebook': + * get: + * tags: + * - Socials + * summary: Returns a list of fake facebook posts + * responses: + * '200': + * description: OK + * schema: + * type: array + * items: + * type: object + * $ref: '#/definitions/FacebookPost' + */ + app.get('/socials/facebook', (req: Request, res: Response) => { + res.json(getRandomFacebookPosts(DEFAULT_POSTS_COUNT)); + }); }; diff --git a/modules/socials/consts/Facebook.ts b/modules/socials/consts/Facebook.ts new file mode 100644 index 00000000..270a7586 --- /dev/null +++ b/modules/socials/consts/Facebook.ts @@ -0,0 +1,73 @@ +/** + * @openapi + * definitions: + * FacebookPost: + * type: object + * properties: + * id: + * type: uuid + * example: e69ccf52-22a8-49f6-93e9-c7dfa835c162 + * createdUserName: + * type: string + * example: name + * createdUserEmail: + * type: string + * example: example@example.com + * content: + * type: string + * example: example text + * media: + * type: string + * example: example media + * shares: + * type: number + * example: 1 + * comments: + * type: number + * example: 1 + * createdAt: + * type: date + * example: '2022-06-22T00:01:21.497Z' + * reactions: + * type: object + * properties: + * like: + * type: number + * example: 10 + * love: + * type: number + * example: 10 + * wow: + * type: number + * example: 10 + * haha: + * type: number + * example: 10 + * sad: + * type: number + * example: 10 + * angry: + * type: number + * example: 10 + */ + +type Facebook = { + id: string, + createdUserName: string, + createdUserEmail: string, + content: string, + media: string, + reactions:{ + like:number, + love:number, + wow:number, + haha:number, + sad:number, + angry:number, + }, + shares: number, + comments: number, + createdAt: Date, +} + +export default Facebook; diff --git a/modules/socials/test/socials-routes.test.ts b/modules/socials/test/socials-routes.test.ts index 2a1934ac..4fd1e3b4 100644 --- a/modules/socials/test/socials-routes.test.ts +++ b/modules/socials/test/socials-routes.test.ts @@ -2,13 +2,13 @@ import request from 'supertest'; import Twitter from '../consts/Twitter'; import Instagram from '../consts/Instagram'; import { DEFAULT_POSTS_COUNT } from '../consts/default'; - -const baseURL = 'http://localhost:3000'; +import app from '../../../app'; +import Facebook from '../consts/Facebook'; describe('socials api endpoints', () => { describe('GET /socials/twitter/', () => { it('should returns a list of fake twitter posts', async () => { - const response = await request(baseURL).get(`/socials/twitter/`); + const response = await request(app).get(`/socials/twitter/`); const twitter: Twitter = response.body[0]; expect(twitter).toHaveProperty('id'); @@ -25,7 +25,7 @@ describe('socials api endpoints', () => { describe('GET /socials/instagram/', () => { it('should returns a list of fake instagram posts', async () => { - const response = await request(baseURL).get(`/socials/instagram/`); + const response = await request(app).get(`/socials/instagram/`); const instagram: Instagram = response.body[0]; expect(instagram).toHaveProperty('id'); @@ -50,4 +50,28 @@ describe('socials api endpoints', () => { expect(response.body.length).toEqual(DEFAULT_POSTS_COUNT); }); }); + + describe('GET /socials/facebook/', () => { + it('should returns a list of fake facebook posts', async () => { + const response = await request(app).get(`/socials/facebook/`); + const facebook: Facebook = response.body[0]; + + expect(facebook).toHaveProperty('id'); + expect(facebook).toHaveProperty('createdUserName'); + expect(facebook).toHaveProperty('createdUserEmail'); + expect(facebook).toHaveProperty('content'); + expect(facebook).toHaveProperty('media'); + expect(facebook).toHaveProperty('reactions.like'); + expect(facebook).toHaveProperty('reactions.love'); + expect(facebook).toHaveProperty('reactions.wow'); + expect(facebook).toHaveProperty('reactions.haha'); + expect(facebook).toHaveProperty('reactions.sad'); + expect(facebook).toHaveProperty('reactions.angry'); + expect(facebook).toHaveProperty('shares'); + expect(facebook).toHaveProperty('comments'); + expect(facebook).toHaveProperty('createdAt'); + expect(response.body.length).toEqual(DEFAULT_POSTS_COUNT); + + }); + }); }); diff --git a/modules/socials/utils/getRandomFacebookPosts.ts b/modules/socials/utils/getRandomFacebookPosts.ts new file mode 100644 index 00000000..6b3ede13 --- /dev/null +++ b/modules/socials/utils/getRandomFacebookPosts.ts @@ -0,0 +1,27 @@ +import { faker } from '@faker-js/faker'; +import Facebook from '../consts/Facebook'; + +export const getRandomFacebookPosts = (postCount: number): Facebook[] => { + const facebookPosts: Facebook[] = []; + Array.from({ length: postCount }).forEach(() => { + facebookPosts.push({ + id: faker.datatype.uuid(), + comments: faker.datatype.number(), + content: faker.lorem.sentence(), + media: faker.image.imageUrl(), + createdAt: faker.date.recent(), + createdUserEmail: faker.internet.email(), + createdUserName: faker.word.noun(10), + shares: faker.datatype.number(), + reactions: { + angry: faker.datatype.number(), + haha: faker.datatype.number(), + like: faker.datatype.number(), + love: faker.datatype.number(), + sad: faker.datatype.number(), + wow: faker.datatype.number(), + }, + }); + }); + return facebookPosts; +}; diff --git a/modules/sports/api/sports-routes.ts b/modules/sports/api/sports-routes.ts index 90c43a49..c0f51890 100644 --- a/modules/sports/api/sports-routes.ts +++ b/modules/sports/api/sports-routes.ts @@ -1,6 +1,9 @@ import { Request, Response } from 'express'; import * as core from 'express-serve-static-core'; +import { getQtyFromRequest } from '../../../utils/route-utils'; +import { getRandomSubArray } from '../../../utils/arrays'; import PremierLeagueData2022 from '../data/football-premier-league-2022'; +import LaLigaLeagueData2022 from "../data/football-laliga-league-2022"; module.exports = function (app: core.Express) { /** @@ -28,4 +31,31 @@ module.exports = function (app: core.Express) { app.get('/sports/football/leagues/premier/teams', (req: Request, res: Response) => { res.json(PremierLeagueData2022); }); + + /** + * @openapi + * '/sports/football/leagues/laliga/teams/{qty}': + * get: + * tags: + * - Sports + * summary: Get a list of teams in the La Liga (Spain) football league from 2022 + * parameters: + * - in: path + * name: qty + * description: The amount of results you would like returned + * default: 10 + * type: number + * responses: + * '200': + * description: OK + * schema: + * type: array + * items: + * type: object + * example: { teamName: '', location: '', stadium: '', capacity: ''} + */ + app.get("/sports/football/leagues/laliga/teams/:qty?", (req: Request, res: Response) => { + const qty = getQtyFromRequest(req); + res.json(getRandomSubArray(LaLigaLeagueData2022, qty)); + }); }; diff --git a/modules/sports/data/football-laliga-league-2022.ts b/modules/sports/data/football-laliga-league-2022.ts new file mode 100644 index 00000000..4291ca3a --- /dev/null +++ b/modules/sports/data/football-laliga-league-2022.ts @@ -0,0 +1,124 @@ +const LaLigaData2022 = [ + { + teamName: "Almería", + location: "Almería", + stadium: "Power Horse Stadium", + capacity: "15,274" + }, + { + teamName: "Athletic Bilbao", + location: "Bilbao", + stadium: "San Mamés Stadium", + capacity: "53,331" + }, + { + teamName: "Atlético de Madrid", + location: "Madrid (Rosas)", + stadium: "Metropolitano Stadium", + capacity: "68,456" + }, + { + teamName: "Barcelona", + location: "Barcelona", + stadium: "Camp Nou", + capacity: "99,354" + }, + { + teamName: "Cádiz", + location: "Cádiz", + stadium: "Nuevo Mirandilla", + capacity: "20,724" + }, + { + teamName: "Celta de Vigo", + location: "Vigo", + stadium: "Balaídos", + capacity: "29,000" + }, + { + teamName: "Elche", + location: "Elche", + stadium: "Estadio Manuel Martínez Valero", + capacity: "33,732" + }, + { + teamName: "Espanyol", + location: "Cornellà de Llobregat", + stadium: "RCDE Stadium", + capacity: "40,000" + }, + { + teamName: "Getafe", + location: "Getafe", + stadium: "Coliseum Alfonso Pérez", + capacity: "17,000" + }, + { + teamName: "Girona", + location: "Girona", + stadium: "Estadi Montilivi", + capacity: "11,810" + }, + { + teamName: "Mallorca", + location: "Palma", + stadium: "Balaídos", + capacity: "23,142" + }, + { + teamName: "Osasuna", + location: "Pamplona", + stadium: "El Sadar Stadium", + capacity: "23,576" + }, + { + teamName: "Rayo Vallecano", + location: "Madrid (Vallecas)", + stadium: "Campo de Fútbol de Vallecas", + capacity: "14,708" + }, + { + teamName: "Real Betis", + location: "Sevilha", + stadium: "Estadio Benito Villamarín", + capacity: "60,721" + }, + { + teamName: "Real Madrid", + location: "Madrid (Chamartín)", + stadium: "Santiago Bernabéu Stadium", + capacity: "81,044" + }, + { + teamName: "Real Sociedad", + location: "San Sebastián", + stadium: "Anoeta Stadium", + capacity: "39,313" + }, + { + teamName: "Real Valladolid", + location: "Valladolid", + stadium: "Estadio José Zorrilla", + capacity: "27,846" + }, + { + teamName: "Sevilla", + location: "Seville", + stadium: "Ramón Sánchez Pizjuán Stadium", + capacity: "42,714" + }, + { + teamName: "Valencia", + location: "València", + stadium: "Mestalla Stadium", + capacity: "49,430" + }, + { + teamName: "Villarreal", + location: "Vila-real", + stadium: "Estadi Ciutat de València", + capacity: "26,354" + } +]; + +export default LaLigaData2022; \ No newline at end of file diff --git a/modules/sports/tests/api/sports-routes.test.ts b/modules/sports/tests/api/sports-routes.test.ts index c416dbb9..e01e11b1 100644 --- a/modules/sports/tests/api/sports-routes.test.ts +++ b/modules/sports/tests/api/sports-routes.test.ts @@ -1,12 +1,21 @@ import request from 'supertest'; -const baseURL = 'http://localhost:3000'; +import app from '../../../../app'; describe('sports api endpoints', () => { describe('GET /sports/football/leagues/premier/teams', () => { it('should return a list of teams', async () => { - const response = await request(baseURL).get(`/sports/football/leagues/premier/teams`); + const response = await request(app).get(`/sports/football/leagues/premier/teams`); expect(response).not.toBeFalsy(); }); }); + + describe('GET /sports/football/leagues/laliga/teams', () => { + it('should return a list of la liga teams', async () => { + const qty = 20; + const response = await request(app).get(`/sports/football/leagues/laliga/teams/${qty}`); + + expect(response.body.length).toBe(qty); + }); + }); }); diff --git a/modules/time_zones/api/timezones-routes.ts b/modules/time_zones/api/timezones-routes.ts index a026a1f8..b5cac5c2 100644 --- a/modules/time_zones/api/timezones-routes.ts +++ b/modules/time_zones/api/timezones-routes.ts @@ -2,7 +2,7 @@ import { Request, Response } from 'express'; import * as core from 'express-serve-static-core'; import time_zones from '../data/time_zones'; -module.exports = function(app : core.Express){ +module.exports = function (app: core.Express) { /** * @openapi diff --git a/modules/time_zones/data/time_zones.ts b/modules/time_zones/data/time_zones.ts index 0c11522d..f29bfd09 100644 --- a/modules/time_zones/data/time_zones.ts +++ b/modules/time_zones/data/time_zones.ts @@ -901,7 +901,7 @@ const time_zones = [ "isdst": false, "text": "(UTC+03:00) Moscow, St. Petersburg, Volgograd, Minsk", "utc": [ - "Europe/Kirov", + "Europe/Kirov", "Europe/Moscow", "Europe/Simferopol", "Europe/Volgograd", @@ -915,9 +915,9 @@ const time_zones = [ "isdst": false, "text": "(UTC+04:00) Samara, Ulyanovsk, Saratov", "utc": [ - "Europe/Astrakhan", + "Europe/Astrakhan", "Europe/Samara", - "Europe/Ulyanovsk" + "Europe/Ulyanovsk" ] }, { diff --git a/modules/time_zones/tests/api/timezones-routes.test.ts b/modules/time_zones/tests/api/timezones-routes.test.ts index b2def745..8890fb5f 100644 --- a/modules/time_zones/tests/api/timezones-routes.test.ts +++ b/modules/time_zones/tests/api/timezones-routes.test.ts @@ -1,10 +1,10 @@ import request from 'supertest'; +import app from '../../../../app'; -const baseURL = 'http://localhost:3000'; describe('GET /time-zones/', () => { it('should return 200 OK', async () => { - const response = await request(baseURL).get('/time-zones'); + const response = await request(app).get('/time-zones'); const timeZone = response.body[0]; expect(response.status).toBe(200); @@ -20,7 +20,7 @@ describe('GET /time-zones/', () => { describe('GET /time-zones/random', () => { it('should return 200 OK', async () => { - const response = await request(baseURL).get('/time-zones/random'); + const response = await request(app).get('/time-zones/random'); const timeZone = response.body; expect(response.status).toBe(200); diff --git a/modules/users/tests/api/user-routes.test.ts b/modules/users/tests/api/user-routes.test.ts index 138d4807..28be1bdf 100644 --- a/modules/users/tests/api/user-routes.test.ts +++ b/modules/users/tests/api/user-routes.test.ts @@ -1,10 +1,10 @@ import request from 'supertest'; -const baseURL = 'http://localhost:3000'; +import app from '../../../../app'; describe('user api endpoints', () => { describe('GET /user', () => { it('should return a user', async () => { - const response = await request(baseURL).get(`/users/`); + const response = await request(app).get(`/users/`); expect(response.body[0]).toHaveProperty('avatarUrl'); expect(response.body[0]).toHaveProperty('birthDate'); @@ -20,7 +20,7 @@ describe('user api endpoints', () => { const qty = 5; it('should return a list of users ', async () => { - const response = await request(baseURL).get(`/users/${qty}`); + const response = await request(app).get(`/users/${qty}`); expect(response.body.length).toEqual(qty); }); }); diff --git a/modules/vehicles/tests/api/vehicles-routes.test.ts b/modules/vehicles/tests/api/vehicles-routes.test.ts index ed974b46..7d4dfd41 100644 --- a/modules/vehicles/tests/api/vehicles-routes.test.ts +++ b/modules/vehicles/tests/api/vehicles-routes.test.ts @@ -1,10 +1,10 @@ const request = require('supertest'); -const baseURL = 'http://localhost:3000'; +import app from '../../../../app'; describe('vehicles api endpoints', () => { describe('GET /vehicles', () => { it('should return a vehicle', async () => { - const response = await request(baseURL).get(`/vehicles/`); + const response = await request(app).get(`/vehicles/`); expect(response.body[0]).toHaveProperty('name'); expect(response.body[0]).toHaveProperty('type'); @@ -21,7 +21,7 @@ describe('vehicles api endpoints', () => { const qty = 5; it('should return a list of users ', async () => { - const response = await request(baseURL).get(`/users/${qty}`); + const response = await request(app).get(`/users/${qty}`); expect(response.body.length).toEqual(qty); }); }); diff --git a/modules/vehicles/utils/getRandomVehicles.ts b/modules/vehicles/utils/getRandomVehicles.ts index 27be363c..b0963766 100644 --- a/modules/vehicles/utils/getRandomVehicles.ts +++ b/modules/vehicles/utils/getRandomVehicles.ts @@ -1,7 +1,7 @@ import Vehicle from '../consts/Vehicle'; import { faker } from '@faker-js/faker'; -const getRandomVehicles = (qty: number) => { +const getRandomVehicles = (qty: number) : Vehicle[] => { const vehicles: Vehicle[] = []; Array.from({ length: qty }).forEach(() => { diff --git a/package-lock.json b/package-lock.json index d037478b..5242a392 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,15 +20,16 @@ "swagger-ui-express": "^4.5.0" }, "devDependencies": { - "@faker-js/faker": "7.5.0", + "@faker-js/faker": "7.6.0", "@types/express": "4.17.14", - "@types/jest": "^29.1.1", + "@types/jest": "29.1.2", "@types/node": "18.7.6", + "@types/supertest": "^2.0.12", "@types/swagger-jsdoc": "^6.0.1", "@types/swagger-ui-express": "^4.1.3", - "@typescript-eslint/eslint-plugin": "5.37.0", - "all-contributors-cli": "^6.23.0", - "eslint": "8.24.0", + "@typescript-eslint/eslint-plugin": "5.39.0", + "all-contributors-cli": "6.23.1", + "eslint": "8.25.0", "eslint-config-standard-with-typescript": "23.0.0", "eslint-plugin-import": "2.26.0", "eslint-plugin-n": "15.3.0", @@ -140,38 +141,6 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/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/@babel/core/node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/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/@babel/core/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -416,6 +385,25 @@ "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/@babel/parser": { "version": "7.19.3", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.3.tgz", @@ -635,22 +623,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/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/@babel/traverse/node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -659,11 +631,6 @@ "node": ">=4" } }, - "node_modules/@babel/traverse/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/@babel/types": { "version": "7.19.3", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.3.tgz", @@ -694,10 +661,20 @@ "node": ">=12" } }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "devOptional": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@eslint/eslintrc": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", - "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -717,33 +694,10 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@eslint/eslintrc/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==", - "dev": true - }, "node_modules/@faker-js/faker": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-7.5.0.tgz", - "integrity": "sha512-8wNUCCUHvfvI0gQpDUho/3gPzABffnCn5um65F8dzQ86zz6dlt4+nmAA7PQUc8L+eH+9RgR/qzy5N/8kN0Ozdw==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-7.6.0.tgz", + "integrity": "sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==", "dev": true, "engines": { "node": ">=14.0.0", @@ -764,39 +718,6 @@ "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@humanwhocodes/config-array/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==", - "dev": true - }, - "node_modules/@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -1087,15 +1008,6 @@ } } }, - "node_modules/@jest/reporters/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, "node_modules/@jest/schemas": { "version": "29.0.0", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", @@ -1120,15 +1032,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/source-map/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, "node_modules/@jest/test-result": { "version": "29.1.2", "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.1.2.tgz", @@ -1182,15 +1085,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/transform/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, "node_modules/@jest/types": { "version": "29.1.2", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.1.2.tgz", @@ -1241,12 +1135,12 @@ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "version": "0.3.16", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.16.tgz", + "integrity": "sha512-LCQ+NeThyJ4k1W2d+vIKdxuSt9R3pQSZ4P92m7EakaYuXcVWbHuT5bjNcqLd4Rdgi6xYWYDvBJZJLZSLanjDcA==", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "node_modules/@jsdevtools/ono": { @@ -1390,6 +1284,12 @@ "@types/node": "*" } }, + "node_modules/@types/cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", + "dev": true + }, "node_modules/@types/express": { "version": "4.17.14", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", @@ -1403,9 +1303,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.30", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz", - "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==", + "version": "4.17.31", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", + "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", "dev": true, "dependencies": { "@types/node": "*", @@ -1443,9 +1343,9 @@ } }, "node_modules/@types/jest": { - "version": "29.1.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.1.1.tgz", - "integrity": "sha512-U9Ey07dGWl6fUFaIaUQUKWG5NoKi/zizeVQCGV8s4nSU0jPgqphVZvS64+8BtWYvrc3ZGw6wo943NSYPxkrp/g==", + "version": "29.1.2", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.1.2.tgz", + "integrity": "sha512-y+nlX0h87U0R+wsGn6EBuoRWYyv3KFtwRNP3QWp9+k2tJ2/bqcGS3UxD7jgT+tiwJWWq3UsyV4Y+T6rsMT4XMg==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -1506,6 +1406,25 @@ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" }, + "node_modules/@types/superagent": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.15.tgz", + "integrity": "sha512-mu/N4uvfDN2zVQQ5AYJI/g4qxn2bHB6521t1UuH09ShNWjebTqN0ZFuYK9uYjcgmI0dTQEs+Owi1EO6U0OkOZQ==", + "dev": true, + "dependencies": { + "@types/cookiejar": "*", + "@types/node": "*" + } + }, + "node_modules/@types/supertest": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.12.tgz", + "integrity": "sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==", + "dev": true, + "dependencies": { + "@types/superagent": "*" + } + }, "node_modules/@types/swagger-jsdoc": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/@types/swagger-jsdoc/-/swagger-jsdoc-6.0.1.tgz", @@ -1536,16 +1455,15 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.37.0.tgz", - "integrity": "sha512-Fde6W0IafXktz1UlnhGkrrmnnGpAo1kyX7dnyHHVrmwJOn72Oqm3eYtddrpOwwel2W8PAK9F3pIL5S+lfoM0og==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.39.0.tgz", + "integrity": "sha512-xVfKOkBm5iWMNGKQ2fwX5GVgBuHmZBO1tCRwXmY5oAIsPscfwm2UADDuNB8ZVYCtpQvJK4xpjrK7jEhcJ0zY9A==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.37.0", - "@typescript-eslint/type-utils": "5.37.0", - "@typescript-eslint/utils": "5.37.0", + "@typescript-eslint/scope-manager": "5.39.0", + "@typescript-eslint/type-utils": "5.39.0", + "@typescript-eslint/utils": "5.39.0", "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", "ignore": "^5.2.0", "regexpp": "^3.2.0", "semver": "^7.3.7", @@ -1568,100 +1486,15 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.37.0.tgz", - "integrity": "sha512-F67MqrmSXGd/eZnujjtkPgBQzgespu/iCZ+54Ok9X5tALb9L2v3G+QBSoWkXG0p3lcTJsL+iXz5eLUEdSiJU9Q==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/visitor-keys": "5.37.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.37.0.tgz", - "integrity": "sha512-3frIJiTa5+tCb2iqR/bf7XwU20lnU05r/sgPJnRpwvfZaqCJBrl8Q/mw9vr3NrNdB/XtVyMA0eppRMMBqdJ1bA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.37.0.tgz", - "integrity": "sha512-Hp7rT4cENBPIzMwrlehLW/28EVCOcE9U1Z1BQTc8EA8v5qpr7GRGuG+U58V5tTY48zvUOA3KHvw3rA8tY9fbdA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.37.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/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==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/parser": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.33.1.tgz", - "integrity": "sha512-IgLLtW7FOzoDlmaMoXdxG8HOCByTBXrB1V2ZQYSEV1ggMmJfAkMWTwUjjzagS6OkfpySyhKFkBw7A9jYmcHpZA==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.39.0.tgz", + "integrity": "sha512-PhxLjrZnHShe431sBAGHaNe6BDdxAASDySgsBCGxcBecVCi8NQWxQZMcizNA4g0pN51bBAn/FUfkWG3SDVcGlA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.33.1", - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/typescript-estree": "5.33.1", + "@typescript-eslint/scope-manager": "5.39.0", + "@typescript-eslint/types": "5.39.0", + "@typescript-eslint/typescript-estree": "5.39.0", "debug": "^4.3.4" }, "engines": { @@ -1680,37 +1513,14 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/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==", - "dev": true - }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.33.1.tgz", - "integrity": "sha512-8ibcZSqy4c5m69QpzJn8XQq9NnqAToC8OdH/W6IXPXv83vRyEDPYLdjAlUx8h/rbusq6MkW4YdQzURGOqsn3CA==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.39.0.tgz", + "integrity": "sha512-/I13vAqmG3dyqMVSZPjsbuNQlYS082Y7OMkwhCfLXYsmlI0ca4nkL7wJ/4gjX70LD4P8Hnw1JywUVVAwepURBw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/visitor-keys": "5.33.1" + "@typescript-eslint/types": "5.39.0", + "@typescript-eslint/visitor-keys": "5.39.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1721,13 +1531,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.37.0.tgz", - "integrity": "sha512-BSx/O0Z0SXOF5tY0bNTBcDEKz2Ec20GVYvq/H/XNKiUorUFilH7NPbFUuiiyzWaSdN3PA8JV0OvYx0gH/5aFAQ==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.39.0.tgz", + "integrity": "sha512-KJHJkOothljQWzR3t/GunL0TPKY+fGJtnpl+pX+sJ0YiKTz3q2Zr87SGTmFqsCMFrLt5E0+o+S6eQY0FAXj9uA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.37.0", - "@typescript-eslint/utils": "5.37.0", + "@typescript-eslint/typescript-estree": "5.39.0", + "@typescript-eslint/utils": "5.39.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1747,10 +1557,10 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.37.0.tgz", - "integrity": "sha512-3frIJiTa5+tCb2iqR/bf7XwU20lnU05r/sgPJnRpwvfZaqCJBrl8Q/mw9vr3NrNdB/XtVyMA0eppRMMBqdJ1bA==", + "node_modules/@typescript-eslint/types": { + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.39.0.tgz", + "integrity": "sha512-gQMZrnfEBFXK38hYqt8Lkwt8f4U6yq+2H5VDSgP/qiTzC8Nw8JO3OuSUOQ2qW37S/dlwdkHDntkZM6SQhKyPhw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1760,14 +1570,14 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.37.0.tgz", - "integrity": "sha512-JkFoFIt/cx59iqEDSgIGnQpCTRv96MQnXCYvJi7QhBC24uyuzbD8wVbajMB1b9x4I0octYFJ3OwjAwNqk1AjDA==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.39.0.tgz", + "integrity": "sha512-qLFQP0f398sdnogJoLtd43pUgB18Q50QSA+BTE5h3sUxySzbWDpTSdgt4UyxNSozY/oDK2ta6HVAzvGgq8JYnA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/visitor-keys": "5.37.0", + "@typescript-eslint/types": "5.39.0", + "@typescript-eslint/visitor-keys": "5.39.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1787,14 +1597,18 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.37.0.tgz", - "integrity": "sha512-Hp7rT4cENBPIzMwrlehLW/28EVCOcE9U1Z1BQTc8EA8v5qpr7GRGuG+U58V5tTY48zvUOA3KHvw3rA8tY9fbdA==", + "node_modules/@typescript-eslint/utils": { + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.39.0.tgz", + "integrity": "sha512-+DnY5jkpOpgj+EBtYPyHRjXampJfC0yUZZzfzLuUWVZvCuKqSdJVC8UhdWipIw7VKNTfwfAPiOWzYkAwuIhiAg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.37.0", - "eslint-visitor-keys": "^3.3.0" + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.39.0", + "@typescript-eslint/types": "5.39.0", + "@typescript-eslint/typescript-estree": "5.39.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1802,268 +1616,19 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.39.0.tgz", + "integrity": "sha512-yyE3RPwOG+XJBLrhvsxAidUgybJVQ/hG8BhiJo0k8JSAYfk/CshVcxf0HwP4Jt7WZZ6vLmxdo1p6EyN3tzFTkg==", "dev": true, "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/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==", - "dev": true - }, - "node_modules/@typescript-eslint/type-utils/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.33.1.tgz", - "integrity": "sha512-7K6MoQPQh6WVEkMrMW5QOA5FO+BOwzHSNd0j3+BlBwd6vtzfZceJ8xJ7Um2XDi/O3umS8/qDX6jdy2i7CijkwQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.1.tgz", - "integrity": "sha512-JOAzJ4pJ+tHzA2pgsWQi4804XisPHOtbvwUyqsuuq8+y5B5GMZs7lI1xDWs6V2d7gE/Ez5bTGojSK12+IIPtXA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/visitor-keys": "5.33.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/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==", - "dev": true - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.37.0.tgz", - "integrity": "sha512-jUEJoQrWbZhmikbcWSMDuUSxEE7ID2W/QCV/uz10WtQqfOuKZUqFGjqLJ+qhDd17rjgp+QJPqTdPIBWwoob2NQ==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.37.0", - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/typescript-estree": "5.37.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.37.0.tgz", - "integrity": "sha512-F67MqrmSXGd/eZnujjtkPgBQzgespu/iCZ+54Ok9X5tALb9L2v3G+QBSoWkXG0p3lcTJsL+iXz5eLUEdSiJU9Q==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/visitor-keys": "5.37.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.37.0.tgz", - "integrity": "sha512-3frIJiTa5+tCb2iqR/bf7XwU20lnU05r/sgPJnRpwvfZaqCJBrl8Q/mw9vr3NrNdB/XtVyMA0eppRMMBqdJ1bA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.37.0.tgz", - "integrity": "sha512-JkFoFIt/cx59iqEDSgIGnQpCTRv96MQnXCYvJi7QhBC24uyuzbD8wVbajMB1b9x4I0octYFJ3OwjAwNqk1AjDA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/visitor-keys": "5.37.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.37.0.tgz", - "integrity": "sha512-Hp7rT4cENBPIzMwrlehLW/28EVCOcE9U1Z1BQTc8EA8v5qpr7GRGuG+U58V5tTY48zvUOA3KHvw3rA8tY9fbdA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.37.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/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==", - "dev": true - }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.1.tgz", - "integrity": "sha512-nwIxOK8Z2MPWltLKMLOEZwmfBZReqUdbEoHQXeCpa+sRVARe5twpJGHCB4dk9903Yaf0nMAlGbQfaAH92F60eg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.33.1", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "5.39.0", + "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2079,17 +1644,6 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -2149,9 +1703,9 @@ } }, "node_modules/all-contributors-cli": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/all-contributors-cli/-/all-contributors-cli-6.23.0.tgz", - "integrity": "sha512-myfnxTFLJ1hL5wA705QYkLm08iney2J+A1DC3m2fAe+oyFoXH03u2oK+G7B/cvgrbVl5eWw8yELKmtR6iAtoCw==", + "version": "6.23.1", + "resolved": "https://registry.npmjs.org/all-contributors-cli/-/all-contributors-cli-6.23.1.tgz", + "integrity": "sha512-k5qS+l7booUL3e/R/8mxliUd4SqP5hmLq7LDcm4uCoQe1sGlSPebVNQEmvEuWbAxUOTPFJZX2pC0U/UNGCUNAA==", "dev": true, "dependencies": { "@babel/runtime": "^7.7.6", @@ -2172,124 +1726,6 @@ "node": ">=4" } }, - "node_modules/all-contributors-cli/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/all-contributors-cli/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/all-contributors-cli/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/all-contributors-cli/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/all-contributors-cli/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/all-contributors-cli/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/all-contributors-cli/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/all-contributors-cli/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/all-contributors-cli/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -2518,25 +1954,6 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "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/basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", @@ -2563,9 +1980,9 @@ } }, "node_modules/body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "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", @@ -2575,7 +1992,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.10.3", + "qs": "6.11.0", "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -2585,6 +2002,19 @@ "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/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2652,29 +2082,6 @@ "node-int64": "^0.4.0" } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -2689,21 +2096,6 @@ "semver": "^7.0.0" } }, - "node_modules/builtins/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -2746,9 +2138,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001414", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz", - "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==", + "version": "1.0.30001418", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001418.tgz", + "integrity": "sha512-oIs7+JL3K9JRQ3jPZjlH6qyYDp+nBTCais7hjh0s+fuBwufc7uZ7hPYMXrDOJhV360KGMTcczMRObk0/iMqZRg==", "funding": [ { "type": "opencollective", @@ -2775,25 +2167,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chalk/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/chalk/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==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -2835,10 +2208,22 @@ "fsevents": "~2.3.2" } }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/ci-info": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.4.0.tgz", - "integrity": "sha512-t5QdPT5jq3o262DOQ8zA6E1tlH2upmUc4Hlvrbx1pGYJuiiHl7O7rvVNI+l8HTVhd/q3Qc9vqimkNk5yiXsAug==" + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz", + "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==" }, "node_modules/cjs-module-lexer": { "version": "1.2.2", @@ -2867,16 +2252,14 @@ } }, "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, "node_modules/co": { @@ -3020,11 +2403,19 @@ } }, "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "ms": "2.0.0" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/decamelize": { @@ -3160,9 +2551,9 @@ } }, "node_modules/dotenv": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.2.tgz", - "integrity": "sha512-JvpYKUmzQhYoIFgK2MOnF3bciIZoItIIoryihy0rIA+H4Jy0FmgyKYAHCTN98P5ybGSJcIFbh6QKeJdtZd1qhA==", + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", "engines": { "node": ">=12" } @@ -3173,9 +2564,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.270", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.270.tgz", - "integrity": "sha512-KNhIzgLiJmDDC444dj9vEOpZEgsV96ult9Iff98Vanumn+ShJHd5se8aX6KeVxdc0YQeqdrezBZv89rleDbvSg==" + "version": "1.4.276", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.276.tgz", + "integrity": "sha512-EpuHPqu8YhonqLBXHoU6hDJCD98FCe6KDoet3/gY1qsQ6usjJoHqBH2YIVs8FXaAtHwVL8Uqa/fsYao/vq9VWQ==" }, "node_modules/emittery": { "version": "0.10.2", @@ -3210,31 +2601,32 @@ } }, "node_modules/es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", + "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", + "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", + "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", + "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", "string.prototype.trimend": "^1.0.5", "string.prototype.trimstart": "^1.0.5", "unbox-primitive": "^1.0.2" @@ -3298,14 +2690,13 @@ } }, "node_modules/eslint": { - "version": "8.24.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz", - "integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==", + "version": "8.25.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz", + "integrity": "sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.3.2", + "@eslint/eslintrc": "^1.3.3", "@humanwhocodes/config-array": "^0.10.5", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", "@humanwhocodes/module-importer": "^1.0.1", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -3416,12 +2807,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-import-resolver-node/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, "node_modules/eslint-module-utils": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", @@ -3448,12 +2833,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-module-utils/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, "node_modules/eslint-plugin-es": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", @@ -3524,6 +2903,15 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -3536,6 +2924,12 @@ "node": ">=0.10.0" } }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, "node_modules/eslint-plugin-n": { "version": "15.3.0", "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.3.0.tgz", @@ -3561,21 +2955,6 @@ "eslint": ">=7.0.0" } }, - "node_modules/eslint-plugin-n/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint-plugin-promise": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.0.1.tgz", @@ -3637,23 +3016,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/eslint/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/eslint/node_modules/eslint-scope": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", @@ -3676,24 +3038,6 @@ "node": ">=4.0" } }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/eslint/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==", - "dev": true - }, "node_modules/espree": { "version": "9.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", @@ -3782,28 +3126,12 @@ "node": ">=0.10.0" } }, - "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/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "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.8.x" + "node": ">= 0.6" } }, "node_modules/execa": { @@ -3852,13 +3180,13 @@ } }, "node_modules/express": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "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.0", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", @@ -3877,7 +3205,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.10.3", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.18.0", @@ -3893,9 +3221,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.5.2.tgz", - "integrity": "sha512-N0cG/5ccbXfNC+FxRu7ujm2HjKkygF2PL7KLAf/hct9uqKB5QkZVizb/hEst6tUBXnfhblYWgOorN2eY+Saerw==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.6.0.tgz", + "integrity": "sha512-HFN2+4ZGdkQOS8Qli4z6knmJFnw6lZed67o6b7RGplWeb1Z0s8VXaj3dUgPIdm9hrhZXTRpCTHXA0/2Eqex0vA==", "engines": { "node": ">= 12.9.0" }, @@ -3903,6 +3231,19 @@ "express": "^4 || ^5" } }, + "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/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -3924,9 +3265,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -3939,6 +3280,18 @@ "node": ">=8.6.0" } }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -4036,6 +3389,19 @@ "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", @@ -4130,19 +3496,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -4166,12 +3519,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -4198,9 +3545,9 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -4265,15 +3612,15 @@ } }, "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" } }, "node_modules/globals": { @@ -4343,11 +3690,11 @@ } }, "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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-property-descriptors": { @@ -4435,25 +3782,6 @@ "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", @@ -4617,9 +3945,9 @@ } }, "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "engines": { "node": ">= 0.4" @@ -4821,9 +4149,9 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", - "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -4856,25 +4184,6 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/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==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", @@ -4888,27 +4197,6 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-source-maps/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/istanbul-lib-source-maps/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/istanbul-reports": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", @@ -5020,6 +4308,60 @@ } } }, + "node_modules/jest-cli/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-cli/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-cli/node_modules/yargs": { + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz", + "integrity": "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/jest-config": { "version": "29.1.2", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.1.2.tgz", @@ -5328,14 +4670,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runtime/node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "engines": { - "node": ">=8" - } - }, "node_modules/jest-snapshot": { "version": "29.1.2", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.1.2.tgz", @@ -5370,20 +4704,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/jest-util": { "version": "29.1.2", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.1.2.tgz", @@ -5459,14 +4779,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -5482,9 +4794,9 @@ } }, "node_modules/js-sdsl": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", - "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", + "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": { @@ -5546,15 +4858,14 @@ "dev": true }, "node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", "bin": { "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" } }, "node_modules/kleur": { @@ -5803,6 +5114,19 @@ "node": ">= 0.8.0" } }, + "node_modules/morgan/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/morgan/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/morgan/node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -5815,9 +5139,9 @@ } }, "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/mute-stream": { "version": "0.0.8", @@ -5905,11 +5229,35 @@ "ms": "^2.1.1" } }, - "node_modules/nodemon/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } }, "node_modules/nopt": { "version": "1.0.10", @@ -6350,14 +5698,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -6398,9 +5738,9 @@ } }, "node_modules/qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "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" }, @@ -6458,20 +5798,6 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, - "node_modules/readable-stream": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.2.0.tgz", - "integrity": "sha512-gJrBHsaI3lgBoGMW/jHZsQ/o/TIWiu5ENCJG1BB7fuCKzpFM8GaS2UoBVt9NO+oI+3FcrBNbUkl3ilDe09aY4A==", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -6686,18 +6012,37 @@ } ] }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { - "semver": "bin/semver" + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/send": { @@ -6723,6 +6068,19 @@ "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/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -6938,12 +6296,11 @@ } }, "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/strip-final-newline": { @@ -6966,9 +6323,10 @@ } }, "node_modules/superagent": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.1.tgz", - "integrity": "sha512-eQtVnsW5MkEUHNh3L5+Gz6d8O9d1i+zfhqAmKqJGTETeYO17o9pBQQym95LpbCxrqLfEFtLmleAo0wlx66BQwQ==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.2.tgz", + "integrity": "sha512-QtYZ9uaNAMexI7XWl2vAXAh0j4q9H7T0WVEI/y5qaUB3QLwxo+voUgCQ217AokJzUTIVOp0RTo7fhZrwhD7A2Q==", + "deprecated": "Please use v8.0.0 until https://github.com/visionmedia/superagent/issues/1743 is resolved", "dependencies": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.3", @@ -6979,29 +6337,12 @@ "methods": "^1.1.2", "mime": "2.6.0", "qs": "^6.11.0", - "readable-stream": "^4.2.0", "semver": "^7.3.7" }, "engines": { "node": ">=6.4.0 <13 || >=14" } }, - "node_modules/superagent/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/superagent/node_modules/mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", @@ -7013,43 +6354,10 @@ "node": ">=4.0.0" } }, - "node_modules/superagent/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/superagent/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/superagent/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/supertest": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.2.4.tgz", - "integrity": "sha512-M8xVnCNv+q2T2WXVzxDECvL2695Uv2uUj2O0utxsld/HRyJvOU8W9f1gvsYxSNU4wmIe0/L/ItnpU4iKq0emDA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.0.tgz", + "integrity": "sha512-QgWju1cNoacP81Rv88NKkQ4oXTzGg0eNZtOoxp1ROpbS4OHY/eK5b8meShuFtdni161o5X0VQvgo7ErVyKK+Ow==", "dependencies": { "methods": "^1.1.2", "superagent": "^8.0.0" @@ -7059,14 +6367,14 @@ } }, "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==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/supports-hyperlinks": { @@ -7081,25 +6389,6 @@ "node": ">=8" } }, - "node_modules/supports-hyperlinks/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/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==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -7161,9 +6450,9 @@ } }, "node_modules/swagger-ui-dist": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.14.0.tgz", - "integrity": "sha512-TBzhheU15s+o54Cgk9qxuYcZMiqSm/SkvKnapoGHOF66kz0Y5aGjpzj5BT/vpBbn6rTPJ9tUYXQxuDWfsjiGMw==" + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.14.2.tgz", + "integrity": "sha512-kOIU7Ts3TrXDLb3/c9jRe4qGp8O3bRT19FFJA8wJfrRFkcK/4atPn3krhtBVJ57ZkNNofworXHxuYwmaisXBdg==" }, "node_modules/swagger-ui-express": { "version": "4.5.0", @@ -7324,33 +6613,6 @@ } } }, - "node_modules/ts-jest/node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ts-jest/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -7406,6 +6668,27 @@ "strip-bom": "^3.0.0" } }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -7514,9 +6797,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", - "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", "funding": [ { "type": "opencollective", @@ -7574,15 +6857,6 @@ "node": ">=10.12.0" } }, - "node_modules/v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, "node_modules/validator": { "version": "13.7.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", @@ -7669,19 +6943,17 @@ } }, "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/wrappy": { @@ -7702,49 +6974,117 @@ } }, "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "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/yaml": { + "version": "2.0.0-1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.0.0-1.tgz", + "integrity": "sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ==", "engines": { - "node": ">=10" + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, - "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/yaml": { - "version": "2.0.0-1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.0.0-1.tgz", - "integrity": "sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ==", + "node_modules/yargs/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, "engines": { - "node": ">= 6" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yargs": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz", - "integrity": "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==", + "node_modules/yargs/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "node_modules/yargs/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, "engines": { - "node": ">=12" + "node": ">=6" } }, "node_modules/yn": { @@ -7872,24 +7212,6 @@ "semver": "^6.3.0" }, "dependencies": { - "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" - } - }, - "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -8073,6 +7395,19 @@ "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" + } } } }, @@ -8229,23 +7564,10 @@ "globals": "^11.1.0" }, "dependencies": { - "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" - } - }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, @@ -8271,12 +7593,24 @@ "devOptional": true, "requires": { "@jridgewell/trace-mapping": "0.3.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "devOptional": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } } }, "@eslint/eslintrc": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", - "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -8288,29 +7622,12 @@ "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, "@faker-js/faker": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-7.5.0.tgz", - "integrity": "sha512-8wNUCCUHvfvI0gQpDUho/3gPzABffnCn5um65F8dzQ86zz6dlt4+nmAA7PQUc8L+eH+9RgR/qzy5N/8kN0Ozdw==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-7.6.0.tgz", + "integrity": "sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==", "dev": true }, "@humanwhocodes/config-array": { @@ -8322,31 +7639,8 @@ "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, - "@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true - }, "@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -8563,17 +7857,6 @@ "strip-ansi": "^6.0.0", "terminal-link": "^2.0.0", "v8-to-istanbul": "^9.0.1" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } } }, "@jest/schemas": { @@ -8592,17 +7875,6 @@ "@jridgewell/trace-mapping": "^0.3.15", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } } }, "@jest/test-result": { @@ -8647,17 +7919,6 @@ "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.1" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } } }, "@jest/types": { @@ -8698,12 +7959,12 @@ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "version": "0.3.16", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.16.tgz", + "integrity": "sha512-LCQ+NeThyJ4k1W2d+vIKdxuSt9R3pQSZ4P92m7EakaYuXcVWbHuT5bjNcqLd4Rdgi6xYWYDvBJZJLZSLanjDcA==", "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "@jsdevtools/ono": { @@ -8838,6 +8099,12 @@ "@types/node": "*" } }, + "@types/cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", + "dev": true + }, "@types/express": { "version": "4.17.14", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", @@ -8851,9 +8118,9 @@ } }, "@types/express-serve-static-core": { - "version": "4.17.30", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz", - "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==", + "version": "4.17.31", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", + "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", "dev": true, "requires": { "@types/node": "*", @@ -8891,9 +8158,9 @@ } }, "@types/jest": { - "version": "29.1.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.1.1.tgz", - "integrity": "sha512-U9Ey07dGWl6fUFaIaUQUKWG5NoKi/zizeVQCGV8s4nSU0jPgqphVZvS64+8BtWYvrc3ZGw6wo943NSYPxkrp/g==", + "version": "29.1.2", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.1.2.tgz", + "integrity": "sha512-y+nlX0h87U0R+wsGn6EBuoRWYyv3KFtwRNP3QWp9+k2tJ2/bqcGS3UxD7jgT+tiwJWWq3UsyV4Y+T6rsMT4XMg==", "dev": true, "requires": { "expect": "^29.0.0", @@ -8954,6 +8221,25 @@ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" }, + "@types/superagent": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.15.tgz", + "integrity": "sha512-mu/N4uvfDN2zVQQ5AYJI/g4qxn2bHB6521t1UuH09ShNWjebTqN0ZFuYK9uYjcgmI0dTQEs+Owi1EO6U0OkOZQ==", + "dev": true, + "requires": { + "@types/cookiejar": "*", + "@types/node": "*" + } + }, + "@types/supertest": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.12.tgz", + "integrity": "sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==", + "dev": true, + "requires": { + "@types/superagent": "*" + } + }, "@types/swagger-jsdoc": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/@types/swagger-jsdoc/-/swagger-jsdoc-6.0.1.tgz", @@ -8984,317 +8270,97 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "@typescript-eslint/eslint-plugin": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.37.0.tgz", - "integrity": "sha512-Fde6W0IafXktz1UlnhGkrrmnnGpAo1kyX7dnyHHVrmwJOn72Oqm3eYtddrpOwwel2W8PAK9F3pIL5S+lfoM0og==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.39.0.tgz", + "integrity": "sha512-xVfKOkBm5iWMNGKQ2fwX5GVgBuHmZBO1tCRwXmY5oAIsPscfwm2UADDuNB8ZVYCtpQvJK4xpjrK7jEhcJ0zY9A==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.37.0", - "@typescript-eslint/type-utils": "5.37.0", - "@typescript-eslint/utils": "5.37.0", + "@typescript-eslint/scope-manager": "5.39.0", + "@typescript-eslint/type-utils": "5.39.0", + "@typescript-eslint/utils": "5.39.0", "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", "ignore": "^5.2.0", "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.37.0.tgz", - "integrity": "sha512-F67MqrmSXGd/eZnujjtkPgBQzgespu/iCZ+54Ok9X5tALb9L2v3G+QBSoWkXG0p3lcTJsL+iXz5eLUEdSiJU9Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/visitor-keys": "5.37.0" - } - }, - "@typescript-eslint/types": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.37.0.tgz", - "integrity": "sha512-3frIJiTa5+tCb2iqR/bf7XwU20lnU05r/sgPJnRpwvfZaqCJBrl8Q/mw9vr3NrNdB/XtVyMA0eppRMMBqdJ1bA==", - "dev": true - }, - "@typescript-eslint/visitor-keys": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.37.0.tgz", - "integrity": "sha512-Hp7rT4cENBPIzMwrlehLW/28EVCOcE9U1Z1BQTc8EA8v5qpr7GRGuG+U58V5tTY48zvUOA3KHvw3rA8tY9fbdA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.37.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } } }, "@typescript-eslint/parser": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.33.1.tgz", - "integrity": "sha512-IgLLtW7FOzoDlmaMoXdxG8HOCByTBXrB1V2ZQYSEV1ggMmJfAkMWTwUjjzagS6OkfpySyhKFkBw7A9jYmcHpZA==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.39.0.tgz", + "integrity": "sha512-PhxLjrZnHShe431sBAGHaNe6BDdxAASDySgsBCGxcBecVCi8NQWxQZMcizNA4g0pN51bBAn/FUfkWG3SDVcGlA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.33.1", - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/typescript-estree": "5.33.1", + "@typescript-eslint/scope-manager": "5.39.0", + "@typescript-eslint/types": "5.39.0", + "@typescript-eslint/typescript-estree": "5.39.0", "debug": "^4.3.4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, "@typescript-eslint/scope-manager": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.33.1.tgz", - "integrity": "sha512-8ibcZSqy4c5m69QpzJn8XQq9NnqAToC8OdH/W6IXPXv83vRyEDPYLdjAlUx8h/rbusq6MkW4YdQzURGOqsn3CA==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.39.0.tgz", + "integrity": "sha512-/I13vAqmG3dyqMVSZPjsbuNQlYS082Y7OMkwhCfLXYsmlI0ca4nkL7wJ/4gjX70LD4P8Hnw1JywUVVAwepURBw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/visitor-keys": "5.33.1" + "@typescript-eslint/types": "5.39.0", + "@typescript-eslint/visitor-keys": "5.39.0" } }, "@typescript-eslint/type-utils": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.37.0.tgz", - "integrity": "sha512-BSx/O0Z0SXOF5tY0bNTBcDEKz2Ec20GVYvq/H/XNKiUorUFilH7NPbFUuiiyzWaSdN3PA8JV0OvYx0gH/5aFAQ==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.39.0.tgz", + "integrity": "sha512-KJHJkOothljQWzR3t/GunL0TPKY+fGJtnpl+pX+sJ0YiKTz3q2Zr87SGTmFqsCMFrLt5E0+o+S6eQY0FAXj9uA==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.37.0", - "@typescript-eslint/utils": "5.37.0", + "@typescript-eslint/typescript-estree": "5.39.0", + "@typescript-eslint/utils": "5.39.0", "debug": "^4.3.4", "tsutils": "^3.21.0" - }, - "dependencies": { - "@typescript-eslint/types": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.37.0.tgz", - "integrity": "sha512-3frIJiTa5+tCb2iqR/bf7XwU20lnU05r/sgPJnRpwvfZaqCJBrl8Q/mw9vr3NrNdB/XtVyMA0eppRMMBqdJ1bA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.37.0.tgz", - "integrity": "sha512-JkFoFIt/cx59iqEDSgIGnQpCTRv96MQnXCYvJi7QhBC24uyuzbD8wVbajMB1b9x4I0octYFJ3OwjAwNqk1AjDA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/visitor-keys": "5.37.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.37.0.tgz", - "integrity": "sha512-Hp7rT4cENBPIzMwrlehLW/28EVCOcE9U1Z1BQTc8EA8v5qpr7GRGuG+U58V5tTY48zvUOA3KHvw3rA8tY9fbdA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.37.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } } }, "@typescript-eslint/types": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.33.1.tgz", - "integrity": "sha512-7K6MoQPQh6WVEkMrMW5QOA5FO+BOwzHSNd0j3+BlBwd6vtzfZceJ8xJ7Um2XDi/O3umS8/qDX6jdy2i7CijkwQ==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.39.0.tgz", + "integrity": "sha512-gQMZrnfEBFXK38hYqt8Lkwt8f4U6yq+2H5VDSgP/qiTzC8Nw8JO3OuSUOQ2qW37S/dlwdkHDntkZM6SQhKyPhw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.1.tgz", - "integrity": "sha512-JOAzJ4pJ+tHzA2pgsWQi4804XisPHOtbvwUyqsuuq8+y5B5GMZs7lI1xDWs6V2d7gE/Ez5bTGojSK12+IIPtXA==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.39.0.tgz", + "integrity": "sha512-qLFQP0f398sdnogJoLtd43pUgB18Q50QSA+BTE5h3sUxySzbWDpTSdgt4UyxNSozY/oDK2ta6HVAzvGgq8JYnA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/visitor-keys": "5.33.1", + "@typescript-eslint/types": "5.39.0", + "@typescript-eslint/visitor-keys": "5.39.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "semver": "^7.3.7", "tsutils": "^3.21.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } } }, "@typescript-eslint/utils": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.37.0.tgz", - "integrity": "sha512-jUEJoQrWbZhmikbcWSMDuUSxEE7ID2W/QCV/uz10WtQqfOuKZUqFGjqLJ+qhDd17rjgp+QJPqTdPIBWwoob2NQ==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.39.0.tgz", + "integrity": "sha512-+DnY5jkpOpgj+EBtYPyHRjXampJfC0yUZZzfzLuUWVZvCuKqSdJVC8UhdWipIw7VKNTfwfAPiOWzYkAwuIhiAg==", "dev": true, "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.37.0", - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/typescript-estree": "5.37.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.37.0.tgz", - "integrity": "sha512-F67MqrmSXGd/eZnujjtkPgBQzgespu/iCZ+54Ok9X5tALb9L2v3G+QBSoWkXG0p3lcTJsL+iXz5eLUEdSiJU9Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/visitor-keys": "5.37.0" - } - }, - "@typescript-eslint/types": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.37.0.tgz", - "integrity": "sha512-3frIJiTa5+tCb2iqR/bf7XwU20lnU05r/sgPJnRpwvfZaqCJBrl8Q/mw9vr3NrNdB/XtVyMA0eppRMMBqdJ1bA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.37.0.tgz", - "integrity": "sha512-JkFoFIt/cx59iqEDSgIGnQpCTRv96MQnXCYvJi7QhBC24uyuzbD8wVbajMB1b9x4I0octYFJ3OwjAwNqk1AjDA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/visitor-keys": "5.37.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.37.0.tgz", - "integrity": "sha512-Hp7rT4cENBPIzMwrlehLW/28EVCOcE9U1Z1BQTc8EA8v5qpr7GRGuG+U58V5tTY48zvUOA3KHvw3rA8tY9fbdA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.37.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.39.0", + "@typescript-eslint/types": "5.39.0", + "@typescript-eslint/typescript-estree": "5.39.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" } }, "@typescript-eslint/visitor-keys": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.1.tgz", - "integrity": "sha512-nwIxOK8Z2MPWltLKMLOEZwmfBZReqUdbEoHQXeCpa+sRVARe5twpJGHCB4dk9903Yaf0nMAlGbQfaAH92F60eg==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.39.0.tgz", + "integrity": "sha512-yyE3RPwOG+XJBLrhvsxAidUgybJVQ/hG8BhiJo0k8JSAYfk/CshVcxf0HwP4Jt7WZZ6vLmxdo1p6EyN3tzFTkg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.33.1", + "@typescript-eslint/types": "5.39.0", "eslint-visitor-keys": "^3.3.0" } }, @@ -9304,14 +8370,6 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "requires": { - "event-target-shim": "^5.0.0" - } - }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -9353,9 +8411,9 @@ } }, "all-contributors-cli": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/all-contributors-cli/-/all-contributors-cli-6.23.0.tgz", - "integrity": "sha512-myfnxTFLJ1hL5wA705QYkLm08iney2J+A1DC3m2fAe+oyFoXH03u2oK+G7B/cvgrbVl5eWw8yELKmtR6iAtoCw==", + "version": "6.23.1", + "resolved": "https://registry.npmjs.org/all-contributors-cli/-/all-contributors-cli-6.23.1.tgz", + "integrity": "sha512-k5qS+l7booUL3e/R/8mxliUd4SqP5hmLq7LDcm4uCoQe1sGlSPebVNQEmvEuWbAxUOTPFJZX2pC0U/UNGCUNAA==", "dev": true, "requires": { "@babel/runtime": "^7.7.6", @@ -9368,102 +8426,6 @@ "node-fetch": "^2.6.0", "pify": "^5.0.0", "yargs": "^15.0.1" - }, - "dependencies": { - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } } }, "ansi-escapes": { @@ -9636,11 +8598,6 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, "basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", @@ -9663,9 +8620,9 @@ "dev": true }, "body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "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", @@ -9675,10 +8632,25 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.10.3", + "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==" + } } }, "brace-expansion": { @@ -9726,15 +8698,6 @@ "node-int64": "^0.4.0" } }, - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -9747,17 +8710,6 @@ "dev": true, "requires": { "semver": "^7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } } }, "bytes": { @@ -9790,9 +8742,9 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "caniuse-lite": { - "version": "1.0.30001414", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz", - "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==" + "version": "1.0.30001418", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001418.tgz", + "integrity": "sha512-oIs7+JL3K9JRQ3jPZjlH6qyYDp+nBTCais7hjh0s+fuBwufc7uZ7hPYMXrDOJhV360KGMTcczMRObk0/iMqZRg==" }, "chalk": { "version": "4.1.2", @@ -9801,21 +8753,6 @@ "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "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==", - "requires": { - "has-flag": "^4.0.0" - } - } } }, "char-regex": { @@ -9843,12 +8780,23 @@ "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } } }, "ci-info": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.4.0.tgz", - "integrity": "sha512-t5QdPT5jq3o262DOQ8zA6E1tlH2upmUc4Hlvrbx1pGYJuiiHl7O7rvVNI+l8HTVhd/q3Qc9vqimkNk5yiXsAug==" + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz", + "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==" }, "cjs-module-lexer": { "version": "1.2.2", @@ -9871,13 +8819,14 @@ "dev": true }, "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, "requires": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, "co": { @@ -9995,11 +8944,11 @@ } }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { - "ms": "2.0.0" + "ms": "2.1.2" } }, "decamelize": { @@ -10098,9 +9047,9 @@ } }, "dotenv": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.2.tgz", - "integrity": "sha512-JvpYKUmzQhYoIFgK2MOnF3bciIZoItIIoryihy0rIA+H4Jy0FmgyKYAHCTN98P5ybGSJcIFbh6QKeJdtZd1qhA==" + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" }, "ee-first": { "version": "1.1.1", @@ -10108,9 +9057,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "electron-to-chromium": { - "version": "1.4.270", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.270.tgz", - "integrity": "sha512-KNhIzgLiJmDDC444dj9vEOpZEgsV96ult9Iff98Vanumn+ShJHd5se8aX6KeVxdc0YQeqdrezBZv89rleDbvSg==" + "version": "1.4.276", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.276.tgz", + "integrity": "sha512-EpuHPqu8YhonqLBXHoU6hDJCD98FCe6KDoet3/gY1qsQ6usjJoHqBH2YIVs8FXaAtHwVL8Uqa/fsYao/vq9VWQ==" }, "emittery": { "version": "0.10.2", @@ -10136,31 +9085,32 @@ } }, "es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", + "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", + "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", + "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", + "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", "string.prototype.trimend": "^1.0.5", "string.prototype.trimstart": "^1.0.5", "unbox-primitive": "^1.0.2" @@ -10203,14 +9153,13 @@ "dev": true }, "eslint": { - "version": "8.24.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz", - "integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==", + "version": "8.25.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz", + "integrity": "sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.3.2", + "@eslint/eslintrc": "^1.3.3", "@humanwhocodes/config-array": "^0.10.5", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", "@humanwhocodes/module-importer": "^1.0.1", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -10249,15 +9198,6 @@ "text-table": "^0.2.0" }, "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, "eslint-scope": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", @@ -10273,21 +9213,6 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true } } }, @@ -10326,12 +9251,6 @@ "requires": { "ms": "^2.1.1" } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true } } }, @@ -10352,12 +9271,6 @@ "requires": { "ms": "^2.1.1" } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true } } }, @@ -10409,6 +9322,15 @@ "tsconfig-paths": "^3.14.1" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -10417,6 +9339,12 @@ "requires": { "esutils": "^2.0.2" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true } } }, @@ -10434,17 +9362,6 @@ "minimatch": "^3.1.2", "resolve": "^1.22.1", "semver": "^7.3.7" - }, - "dependencies": { - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } } }, "eslint-plugin-promise": { @@ -10553,16 +9470,6 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" - }, "execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -10597,13 +9504,13 @@ } }, "express": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "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.0", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", @@ -10622,7 +9529,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.10.3", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.18.0", @@ -10632,12 +9539,27 @@ "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" + }, + "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==" + } } }, "express-rate-limit": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.5.2.tgz", - "integrity": "sha512-N0cG/5ccbXfNC+FxRu7ujm2HjKkygF2PL7KLAf/hct9uqKB5QkZVizb/hEst6tUBXnfhblYWgOorN2eY+Saerw==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.6.0.tgz", + "integrity": "sha512-HFN2+4ZGdkQOS8Qli4z6knmJFnw6lZed67o6b7RGplWeb1Z0s8VXaj3dUgPIdm9hrhZXTRpCTHXA0/2Eqex0vA==", "requires": {} }, "external-editor": { @@ -10658,9 +9580,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -10668,6 +9590,17 @@ "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } } }, "fast-json-stable-stringify": { @@ -10749,6 +9682,21 @@ "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": { @@ -10820,12 +9768,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -10843,12 +9785,6 @@ "functions-have-names": "^1.2.2" } }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, "functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -10866,9 +9802,9 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -10909,12 +9845,12 @@ } }, "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "requires": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" } }, "globals": { @@ -10966,9 +9902,9 @@ "dev": true }, "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==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "has-property-descriptors": { "version": "1.0.0", @@ -11028,11 +9964,6 @@ "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", @@ -11154,9 +10085,9 @@ } }, "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true }, "is-core-module": { @@ -11283,9 +10214,9 @@ "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==" }, "istanbul-lib-instrument": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", - "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "requires": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -11309,46 +10240,16 @@ "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "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==", - "requires": { - "has-flag": "^4.0.0" - } - } } }, "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" } }, "istanbul-reports": { @@ -11423,6 +10324,47 @@ "jest-validate": "^29.1.2", "prompts": "^2.0.1", "yargs": "^17.3.1" + }, + "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yargs": { + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz", + "integrity": "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==", + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + } + } } }, "jest-config": { @@ -11659,13 +10601,6 @@ "jest-util": "^29.1.2", "slash": "^3.0.0", "strip-bom": "^4.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" - } } }, "jest-snapshot": { @@ -11697,16 +10632,6 @@ "natural-compare": "^1.4.0", "pretty-format": "^29.1.2", "semver": "^7.3.5" - }, - "dependencies": { - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "requires": { - "lru-cache": "^6.0.0" - } - } } }, "jest-util": { @@ -11768,11 +10693,6 @@ "supports-color": "^8.0.0" }, "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -11784,9 +10704,9 @@ } }, "js-sdsl": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", - "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", + "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": { @@ -11836,13 +10756,9 @@ "dev": true }, "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" }, "kleur": { "version": "3.0.3", @@ -12032,6 +10948,19 @@ "on-headers": "~1.0.2" }, "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==" + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -12043,9 +10972,9 @@ } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "mute-stream": { "version": "0.0.8", @@ -12109,11 +11038,26 @@ "ms": "^2.1.1" } }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -12410,11 +11354,6 @@ } } }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" - }, "prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -12446,9 +11385,9 @@ "dev": true }, "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "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" } @@ -12480,17 +11419,6 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, - "readable-stream": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.2.0.tgz", - "integrity": "sha512-gJrBHsaI3lgBoGMW/jHZsQ/o/TIWiu5ENCJG1BB7fuCKzpFM8GaS2UoBVt9NO+oI+3FcrBNbUkl3ilDe09aY4A==", - "requires": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10" - } - }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -12624,16 +11552,29 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "requires": { + "lru-cache": "^6.0.0" + } }, "send": { "version": "0.18.0", @@ -12655,6 +11596,21 @@ "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==" + } + } + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -12828,10 +11784,9 @@ } }, "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" }, "strip-final-newline": { "version": "2.0.0", @@ -12844,9 +11799,9 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, "superagent": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.1.tgz", - "integrity": "sha512-eQtVnsW5MkEUHNh3L5+Gz6d8O9d1i+zfhqAmKqJGTETeYO17o9pBQQym95LpbCxrqLfEFtLmleAo0wlx66BQwQ==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.2.tgz", + "integrity": "sha512-QtYZ9uaNAMexI7XWl2vAXAh0j4q9H7T0WVEI/y5qaUB3QLwxo+voUgCQ217AokJzUTIVOp0RTo7fhZrwhD7A2Q==", "requires": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.3", @@ -12857,61 +11812,31 @@ "methods": "^1.1.2", "mime": "2.6.0", "qs": "^6.11.0", - "readable-stream": "^4.2.0", "semver": "^7.3.7" }, "dependencies": { - "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" - } - }, "mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "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" - } - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "requires": { - "lru-cache": "^6.0.0" - } } } }, "supertest": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.2.4.tgz", - "integrity": "sha512-M8xVnCNv+q2T2WXVzxDECvL2695Uv2uUj2O0utxsld/HRyJvOU8W9f1gvsYxSNU4wmIe0/L/ItnpU4iKq0emDA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.0.tgz", + "integrity": "sha512-QgWju1cNoacP81Rv88NKkQ4oXTzGg0eNZtOoxp1ROpbS4OHY/eK5b8meShuFtdni161o5X0VQvgo7ErVyKK+Ow==", "requires": { "methods": "^1.1.2", "superagent": "^8.0.0" } }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } }, "supports-hyperlinks": { @@ -12921,21 +11846,6 @@ "requires": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "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==", - "requires": { - "has-flag": "^4.0.0" - } - } } }, "supports-preserve-symlinks-flag": { @@ -12980,9 +11890,9 @@ } }, "swagger-ui-dist": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.14.0.tgz", - "integrity": "sha512-TBzhheU15s+o54Cgk9qxuYcZMiqSm/SkvKnapoGHOF66kz0Y5aGjpzj5BT/vpBbn6rTPJ9tUYXQxuDWfsjiGMw==" + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.14.2.tgz", + "integrity": "sha512-kOIU7Ts3TrXDLb3/c9jRe4qGp8O3bRT19FFJA8wJfrRFkcK/4atPn3krhtBVJ57ZkNNofworXHxuYwmaisXBdg==" }, "swagger-ui-express": { "version": "4.5.0", @@ -13084,23 +11994,6 @@ "make-error": "1.x", "semver": "7.x", "yargs-parser": "^21.0.1" - }, - "dependencies": { - "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } } }, "ts-node": { @@ -13134,6 +12027,23 @@ "json5": "^1.0.1", "minimist": "^1.2.6", "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + } } }, "tslib": { @@ -13210,9 +12120,9 @@ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, "update-browserslist-db": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", - "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", "requires": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -13246,17 +12156,6 @@ "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^1.6.0" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } } }, "validator": { @@ -13327,9 +12226,10 @@ "dev": true }, "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -13351,9 +12251,10 @@ } }, "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true }, "yallist": { "version": "4.0.0", @@ -13366,17 +12267,71 @@ "integrity": "sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ==" }, "yargs": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz", - "integrity": "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==", + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } } }, "yargs-parser": { diff --git a/package.json b/package.json index 81a34ea5..5257b8fa 100644 --- a/package.json +++ b/package.json @@ -4,9 +4,10 @@ "description": "An API library for providing endpoints of mock data for use during testing", "main": "app.ts", "scripts": { - "serve": "nodemon app.ts", + "serve": "nodemon server.ts", "config": "ts-node utils\\config.ts", - "test": "jest", + "test": "jest --coverage", + "test:watch": "jest --watch", "contributors:add": "all-contributors add", "contributors:generate": "all-contributors generate", "contributors:check": "all-contributors check" @@ -26,15 +27,16 @@ }, "homepage": "https://github.com/ageddesi/Mocked-API#readme", "devDependencies": { - "@faker-js/faker": "7.5.0", + "@faker-js/faker": "7.6.0", "@types/express": "4.17.14", - "@types/jest": "^29.1.1", + "@types/jest": "29.1.2", "@types/node": "18.7.6", + "@types/supertest": "^2.0.12", "@types/swagger-jsdoc": "^6.0.1", "@types/swagger-ui-express": "^4.1.3", - "@typescript-eslint/eslint-plugin": "5.37.0", - "all-contributors-cli": "^6.23.0", - "eslint": "8.24.0", + "@typescript-eslint/eslint-plugin": "5.39.0", + "all-contributors-cli": "6.23.1", + "eslint": "8.25.0", "eslint-config-standard-with-typescript": "23.0.0", "eslint-plugin-import": "2.26.0", "eslint-plugin-n": "15.3.0", diff --git a/server.ts b/server.ts new file mode 100644 index 00000000..96eb519c --- /dev/null +++ b/server.ts @@ -0,0 +1,9 @@ +import app from './app' + +const port = 3000; + +app.listen(port, () => { + console.log(`Mock API is running on port ${port}.`); + console.log(`Vist Mock API in the browser http://localhost:${port}.`); +}); + diff --git a/swagger.json b/swagger.json index 477820ca..ed6c8c39 100644 --- a/swagger.json +++ b/swagger.json @@ -49,6 +49,10 @@ "name": "Images", "description": "A set of endpoints related to obtaining placeholder image urls" }, + { + "name": "IPs", + "description": "A set of endpoints related to obtaining random IP Addresses" + }, { "name": "Music", "description": "A set of endpoints related to music" @@ -84,7 +88,8 @@ { "name": "TimeZones", "description": "A set of endpoints related to TimeZones" - },{ + }, + { "name": "IP", "description": "A set of endpoints to get random ip and mac address" } @@ -544,10 +549,12 @@ } } }, - "/colors/{qty}" : { + "/colors/{qty}": { "get": { - "tags": ["Colors"], - "summary" : "Obtain a random color", + "tags": [ + "Colors" + ], + "summary": "Obtain a random color", "parameters": [ { "in": "path", @@ -559,12 +566,12 @@ } ], "responses": { - "200" : { - "description" : "OK", + "200": { + "description": "OK", "schema": { - "type" : "array", + "type": "array", "items": { - "type" : "string", + "type": "string", "example": "efc27b" } } @@ -572,10 +579,12 @@ } } }, - "/colors/{qty}/{colorSpace}/{colorFormat}" : { + "/colors/{qty}/{colorSpace}/{colorFormat}": { "get": { - "tags": ["Colors"], - "summary" : "Obtain a random color", + "tags": [ + "Colors" + ], + "summary": "Obtain a random color", "parameters": [ { "in": "path", @@ -618,12 +627,12 @@ } ], "responses": { - "200" : { - "description" : "OK", + "200": { + "description": "OK", "schema": { - "type" : "array", + "type": "array", "items": { - "type" : "string", + "type": "string", "example": "efc27b" } } @@ -844,13 +853,15 @@ } } }, - "/emails" : { + "/emails": { "get": { - "tags": ["Emails"], - "summary" : "Returns a list of emails", + "tags": [ + "Emails" + ], + "summary": "Returns a list of emails", "responses": { - "200" : { - "description" : "OK", + "200": { + "description": "OK", "schema": { "$ref": "#/definitions/MockEmails" } @@ -888,13 +899,15 @@ } ], "responses": { - "200"Countries: { - "description": "OK", - "schema": { - "type": "array", - "items": { - "type": "string", - "example": "https://loremflickr.com/1024/201/cats?49645" + "200": { + "Countries": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "type": "string", + "example": "https://loremflickr.com/1024/201/cats?49645" + } } } } @@ -1500,10 +1513,12 @@ } } }, - "/music/{qty}" : { + "/music/{qty}": { "get": { - "tags": ["Music"], - "summary" : "Get a song name and genre", + "tags": [ + "Music" + ], + "summary": "Get a song name and genre", "parameters": [ { "in": "path", @@ -1514,12 +1529,12 @@ } ], "responses": { - "200" : { - "description" : "OK", + "200": { + "description": "OK", "schema": { - "type" : "array", + "type": "array", "items": { - "type" : "object", + "type": "object", "example": "{ genre: '', song: ''}" } } @@ -1527,11 +1542,13 @@ } } }, - "/album/{qty}" : { + "/album/{qty}": { "get": { - "tags": ["Music"], - "summary" : "Get an album name with release date, publisher, price, and total songs inlcuded", - "parameters": [ + "tags": [ + "Music" + ], + "summary": "Get an album name with release date, publisher, price, and total songs inlcuded", + "parameters": [ { "in": "path", "name": "qty", @@ -1541,12 +1558,12 @@ } ], "responses": { - "200" : { - "description" : "OK", + "200": { + "description": "OK", "schema": { - "type" : "array", + "type": "array", "items": { - "type" : "object", + "type": "object", "example": "{ name: '', releasedate: '', price: '', publisher: '', songs: ''}" } } @@ -1989,10 +2006,12 @@ } } }, - "/product/{department}" : { + "/product/department/{department}": { "get": { - "tags": ["Products"], - "summary" : "Get a single product with a specified department", + "tags": [ + "Products" + ], + "summary": "Get a single product with a specified department", "parameters": [ { "required": false, @@ -2004,8 +2023,8 @@ } ], "responses": { - "200" : { - "description" : "OK", + "200": { + "description": "OK", "schema": { "$ref": "#/definitions/ProductResponse" } @@ -2013,10 +2032,12 @@ } } }, - "/products/{qty}/{department}" : { + "/products/{qty}/{department}": { "get": { - "tags": ["Products"], - "summary" : "Obtain a list of random products", + "tags": [ + "Products" + ], + "summary": "Obtain a list of random products", "parameters": [ { "required": false, @@ -2036,8 +2057,8 @@ } ], "responses": { - "200" : { - "description" : "OK", + "200": { + "description": "OK", "schema": { "$ref": "#/definitions/ProductResponse" } @@ -2133,13 +2154,15 @@ } } }, - "/socials/twitter" : { + "/socials/twitter": { "get": { - "tags": ["Socials"], - "summary" : "Returns random Twitter posts", + "tags": [ + "Socials" + ], + "summary": "Returns random Twitter posts", "responses": { - "200" : { - "description" : "OK", + "200": { + "description": "OK", "schema": { "$ref": "#/definitions/MockTwitterPosts" } @@ -2175,6 +2198,34 @@ } } }, + "/sports/football/leagues/laliga/teams/{qty}": { + "get": { + "tags": [ + "Sports" + ], + "summary": "Get a list of teams in the La Liga (Spain) football league from 2022", + "parameters": [ + { + "in": "path", + "name": "qty", + "default": 10, + "description": "The amount of results you would like returned" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "type": "object", + "example": "{ teamName: '', location: '', stadium: '', capacity: ''}" + } + } + } + } + } + }, "/time_zones": { "get": { "tags": [ @@ -2194,7 +2245,7 @@ } } }, - "/time_zones": { + "/time-zones": { "get": { "tags": [ "/TimeZones/random" @@ -2221,8 +2272,8 @@ "summary": "Get a random value of a Chemical Elements", "parameters": [], "responses": { - "200" : { - "description" : "OK", + "200": { + "description": "OK", "schema": { "$ref": "#/definitions/MockChemicalElement" } @@ -2245,423 +2296,385 @@ } ], "responses": { - "200" : { - "description" : "OK", + "200": { + "description": "OK", "schema": { "$ref": "#/definitions/MockChemicalElements" - } - } - } - } - }, - "definitions": { - "ErrorResponse": { - "type": "string", - "example": "An unknown error occured, please try again." - }, - "CountriesListResponse": { - "properties": { - "countries": { - "type": "array", - "items": { - "type": "string", - "example": "United Kingdom" + } } } } }, - "FullNamesResponse": { - "properties": { - "fullNamesList": { - "type": "array", - "items": { - "type": "string", - "example": "Aaron D Rackley" + "definitions": { + "ErrorResponse": { + "type": "string", + "example": "An unknown error occured, please try again." + }, + "CountriesListResponse": { + "properties": { + "countries": { + "type": "array", + "items": { + "type": "string", + "example": "United Kingdom" + } } } - } - }, - "FirstNamesResponse": { - "properties": { - "firstNamesList": { - "type": "array", - "items": { - "type": "string", - "example": "Mandy" + }, + "FullNamesResponse": { + "properties": { + "fullNamesList": { + "type": "array", + "items": { + "type": "string", + "example": "Aaron D Rackley" + } } } - } - }, - "LastNameResponse": { - "properties": { - "lastNamesList": { - "type": "array", - "items": { - "type": "string", - "example": "smith" + }, + "FirstNamesResponse": { + "properties": { + "firstNamesList": { + "type": "array", + "items": { + "type": "string", + "example": "Mandy" + } } } - } - }, - "MockEcommerceCartItem": { - "type":"object", - "properties": { - "pricePerUnit": { - "type":"number", - "example": 2 - }, - "quantity": { - "type":"number", - "example":2 - }, - "product": { - "type": "object", - "properties":{ - "productName": { - "type": "string", - "example": "Super Gamer Juice" - }, - "productId": { - "type": "number", - "example": 1 - }, - "message": { - "type": "string", - "example": "The only drink I will ever need." - }, - "dateTime": { - "type": "string", - "example": "1984-05-21T00:02:11.497Z" - }, - "rating": { - "type": "number", - "example": 1 - }, - "userName": { + }, + "LastNameResponse": { + "properties": { + "lastNamesList": { + "type": "array", + "items": { "type": "string", - "example": "Aaron Rackley" - }, - "categories": { - "type": "array", - "items": { - "type": "string", - "example": "sport-drinks" - } + "example": "smith" } } } - } - }, - "MockEcommerceCart": { - "type":"object", - "properties": { - "products": { - "type": "array", - "items": { - "$ref": "#/definitions/MockEcommerceCartItem" - } - }, - "couponCode":{ - "type":"string", - "default": "DISCOUNT" - }, - "couponPercent":{ - "type":"number", - "default":8 - }, - "couponValue":{ - "type":"number", - "default":4 - }, - "taxPercent":{ - "type":"number", - "default":4 - }, - "taxApplied":{ - "type":"number", - "default":8 - }, - "postageValue":{ - "type":"number", - "default":5 - }, - "subtotal":{ - "type":"number", - "default":100 - }, - "total":{ - "type":"number", - "default": 120 - } - } - }, - "MockProductReview": { - "type": "array", - "items": { - "type" : "object", + }, + "MockEcommerceCartItem": { + "type": "object", "properties": { - "department" : { - "type" : "string", - "example" : "Sports" - }, - "type" : { - "type" : "string", - "example" : "Ball" - }, - "name" : { - "type" : "string", - "example" : "Sleek Bronze Towels" - }, - "adjective" : { - "type" : "string", - "example" : "Incredible" - }, - "description" : { - "type" : "string", - "example" : "The automobile layout consists of a front-engine design, with transaxle-type transmissions mounted at the rear of the engine and four wheel drive" + "pricePerUnit": { + "type": "number", + "example": 2 }, - "material" : { - "type" : "string", - "example" : "Soft" + "quantity": { + "type": "number", + "example": 2 }, - "sku" : { - "type" : "array", - "items": { - "type" : "object", - "properties": { - "meta": { - "type" : "object", - "properties": { - "size" : { - "type" : "string", - "example" : "Medium" - } - } - }, - "price" : { - "type" : "string", - "example" : "232.00" - }, - "amount" : { - "type" : "number", - "example" : 11109 + "product": { + "type": "object", + "properties": { + "productName": { + "type": "string", + "example": "Super Gamer Juice" + }, + "productId": { + "type": "number", + "example": 1 + }, + "message": { + "type": "string", + "example": "The only drink I will ever need." + }, + "dateTime": { + "type": "string", + "example": "1984-05-21T00:02:11.497Z" + }, + "rating": { + "type": "number", + "example": 1 + }, + "userName": { + "type": "string", + "example": "Aaron Rackley" + }, + "categories": { + "type": "array", + "items": { + "type": "string", + "example": "sport-drinks" } } } } } - } - }, - "MockChatMessages" : { - "type": "array", - "items": { + }, + "MockEcommerceCart": { "type": "object", "properties": { - "id": { - "type": "string", - "example": "dc90af0e-f073-45e7-8a77-69e7e94aed31" - }, - "createdAt": { - "type": "string", - "example": "2022-09-22T16:03:17.885Z" + "products": { + "type": "array", + "items": { + "$ref": "#/definitions/MockEcommerceCartItem" + } }, - "message": { + "couponCode": { "type": "string", - "example": "Dicta amet dolores mollitia eveniet commodi." + "default": "DISCOUNT" }, - "userId": { - "type": "string", - "example": "d392a495-3f4c-4660-a896-dce057afbbd4" - } - } - } - }, - "MockUsers" : { - "type": "array", - "items": { - "type": "object", - "properties": { - "userId" : { - "type" : "string", - "example" : "d392a495-3f4c-4660-a896-dce057afbbd4" + "couponPercent": { + "type": "number", + "default": 8 }, - "username" : { - "type" : "string", - "example" : "Aaron Rackley" + "couponValue": { + "type": "number", + "default": 4 }, - "email" : { - "type" : "string", - "example" : "john.doe@example.com" + "taxPercent": { + "type": "number", + "default": 4 }, - "avatarUrl" : { - "type" : "string", - "example" : "https://cloudflare-ipfs.com/ipfs/Qmd3W5DuhgHirLHGVixi6V76LhCkZUz6pnFt5AJBiyvHye/avatar/597.jpg" + "taxApplied": { + "type": "number", + "default": 8 }, - "password" : { - "type" : "string", - "example" : "password" + "postageValue": { + "type": "number", + "default": 5 }, - "birthDate" : { - "type" : "string", - "example" : "1984-05-21T00:02:11.497Z" + "subtotal": { + "type": "number", + "default": 100 }, - "registeredAt" : { - "type" : "string", - "example" : "2022-09-22T16:03:17.885Z" + "total": { + "type": "number", + "default": 120 } } - } - }, - "MockChatResponse" : { - "type" : "object", - "properties": { - "users" : { - "$ref" : "#/definitions/MockUsers" - }, - "messages" : { - "$ref" : "#/definitions/MockChatMessages" + }, + "MockProductReview": { + "type": "array", + "items": { + "type": "object", + "properties": { + "department": { + "type": "string", + "example": "Sports" + }, + "type": { + "type": "string", + "example": "Ball" + }, + "name": { + "type": "string", + "example": "Sleek Bronze Towels" + }, + "adjective": { + "type": "string", + "example": "Incredible" + }, + "description": { + "type": "string", + "example": "The automobile layout consists of a front-engine design, with transaxle-type transmissions mounted at the rear of the engine and four wheel drive" + }, + "material": { + "type": "string", + "example": "Soft" + }, + "sku": { + "type": "array", + "items": { + "type": "object", + "properties": { + "meta": { + "type": "object", + "properties": { + "size": { + "type": "string", + "example": "Medium" + } + } + }, + "price": { + "type": "string", + "example": "232.00" + }, + "amount": { + "type": "number", + "example": 11109 + } + } + } + } + } } - } - }, - "MockEmails" : { - "type": "array", - "items": { - "type": "object", - "properties": { - "id" : { - "type" : "string", - "example" : "dc90af0e-f073-45e7-8a77-69e7e94aed31" - }, - "from" : { - "type" : "string", - "example" : "john.doe@example.com" - }, - "subject" : { - "type" : "string", - "example" : "Lorem ipsum dolor" - }, - "body" : { - "type" : "string", - "example" : "Dicta amet dolores mollitia eveniet commodi." - }, - "read" : { - "type" : "boolean", - "example" : false - }, - "tags" : { - "type": "array", - "items": { + }, + "MockChatMessages": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string", + "example": "dc90af0e-f073-45e7-8a77-69e7e94aed31" + }, + "createdAt": { "type": "string", - "example": "important" + "example": "2022-09-22T16:03:17.885Z" + }, + "message": { + "type": "string", + "example": "Dicta amet dolores mollitia eveniet commodi." + }, + "userId": { + "type": "string", + "example": "d392a495-3f4c-4660-a896-dce057afbbd4" } - }, - "date" : { - "type" : "string", - "example" : "2022-09-22T16:03:17.885Z" } } - } - }, - "MockTwitterPosts" : { - "type": "array", - "items": { + }, + "MockUsers": { + "type": "array", + "items": { + "type": "object", + "properties": { + "userId": { + "type": "string", + "example": "d392a495-3f4c-4660-a896-dce057afbbd4" + }, + "username": { + "type": "string", + "example": "Aaron Rackley" + }, + "email": { + "type": "string", + "example": "john.doe@example.com" + }, + "avatarUrl": { + "type": "string", + "example": "https://cloudflare-ipfs.com/ipfs/Qmd3W5DuhgHirLHGVixi6V76LhCkZUz6pnFt5AJBiyvHye/avatar/597.jpg" + }, + "password": { + "type": "string", + "example": "password" + }, + "birthDate": { + "type": "string", + "example": "1984-05-21T00:02:11.497Z" + }, + "registeredAt": { + "type": "string", + "example": "2022-09-22T16:03:17.885Z" + } + } + } + }, + "MockChatResponse": { "type": "object", "properties": { - "id" : { - "type" : "string", - "example" : "dc90af0e-f073-45e7-8a77-69e7e94aed31" - }, - "handle" : { - "type" : "string", - "example" : "@JohnDoe" - }, - "message" : { - "type" : "string", - "example" : "Dicta amet dolores mollitia eveniet commodi." - }, - "media" : { - "type" : "string", - "example" : "https://loremflickr.com/640/480" - }, - "likes" : { - "type" : "number", - "example" : 438 - }, - "comments" : { - "type" : "number", - "example" : 10 - }, - "retweets" : { - "type" : "number", - "example" : 2 + "users": { + "$ref": "#/definitions/MockUsers" }, - "date" : { - "type" : "string", - "example" : "2022-09-22T16:03:17.885Z" + "messages": { + "$ref": "#/definitions/MockChatMessages" } } - } - }, - "MockChemicalElement" : { - "properties": { - "symbol": { - "type": "string", - "example": "N" - }, - "name": { - "type": "string", - "example": "Nitrogen" - }, - "atomicNumber": { - "type" : "number", - "example" : 7 + }, + "MockEmails": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string", + "example": "dc90af0e-f073-45e7-8a77-69e7e94aed31" + }, + "from": { + "type": "string", + "example": "john.doe@example.com" + }, + "subject": { + "type": "string", + "example": "Lorem ipsum dolor" + }, + "body": { + "type": "string", + "example": "Dicta amet dolores mollitia eveniet commodi." + }, + "read": { + "type": "boolean", + "example": false + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "example": "important" + } + }, + "date": { + "type": "string", + "example": "2022-09-22T16:03:17.885Z" + } + } } - } - }, - "MockChemicalElements" : { - "type": "array", - "items": { - "$ref": "#/definitions/MockChemicalElement" - } - }, - "MockProductReview": { - "type": "array", - "items": { - "type": "object", + }, + "MockTwitterPosts": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string", + "example": "dc90af0e-f073-45e7-8a77-69e7e94aed31" + }, + "handle": { + "type": "string", + "example": "@JohnDoe" + }, + "message": { + "type": "string", + "example": "Dicta amet dolores mollitia eveniet commodi." + }, + "media": { + "type": "string", + "example": "https://loremflickr.com/640/480" + }, + "likes": { + "type": "number", + "example": 438 + }, + "comments": { + "type": "number", + "example": 10 + }, + "retweets": { + "type": "number", + "example": 2 + }, + "date": { + "type": "string", + "example": "2022-09-22T16:03:17.885Z" + } + } + } + }, + "MockChemicalElement": { "properties": { - "productName": { + "symbol": { "type": "string", - "example": "Super Gamer Juice" + "example": "N" }, - "productId": { - "type": "number", - "example": 1 - }, - "message": { + "name": { "type": "string", - "example": "The only drink I will ever need." + "example": "Nitrogen" }, - "dateTime": { - "type": "string", - "example": "1984-05-21T00:02:11.497Z" - }, - "rating": { + "atomicNumber": { "type": "number", - "example": 1 - }, - "userName": { - "type": "string", - "example": "Aaron Rackley" - }, - "categories": { - "type": "array", - "items": { - "type": "string", - "example": "sport-drinks" - } + "example": 7 } } + }, + "MockChemicalElements": { + "type": "array", + "items": { + "$ref": "#/definitions/MockChemicalElement" + } } } } - } \ No newline at end of file +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index f6d323fd..da87ea9d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,6 +3,7 @@ "module": "commonjs", "target": "es6", "rootDir": "./", - "esModuleInterop": true + "resolveJsonModule": true, + "esModuleInterop": true, } } diff --git a/utils/arrays.ts b/utils/arrays.ts index 4ad61746..b5004b1a 100644 --- a/utils/arrays.ts +++ b/utils/arrays.ts @@ -4,4 +4,13 @@ */ export const getRandomArrayItem = (array : any[]) : any => { return array[Math.floor(Math.random() * array.length)]; -} \ No newline at end of file +} + +/** + * Takes an array and will return a random subarray from that array. + * @param array + * @param qty + */ +export const getRandomSubArray = (array: any[], qty: number) : any[] => { + return [...Array(array.length).keys()].sort(() => 0.5 - Math.random()).slice(0, qty).map(index => array[index]); +}; \ No newline at end of file diff --git a/utils/route-utils.ts b/utils/route-utils.ts index b601aa40..5acd4269 100644 --- a/utils/route-utils.ts +++ b/utils/route-utils.ts @@ -5,6 +5,7 @@ const defaultQty = 10; const maxQty = 100; const imageWidthDefault = 640; const imageHeightDefault = 480; +const defaultCountry = 'uk'; const getQtyFromRequest = (request: Request | null, overrideDefaultQty?: number | null): number => { return request.params.qty @@ -27,4 +28,13 @@ const getImageDataFromRequest = (request: Request | null): ImageDataType => { }; }; -export { getQtyFromRequest, getImageDataFromRequest }; +const getCountryNameFromRequest = (request : Request | null) : string => { + return request.params.country ? request.params.country : defaultCountry; +} + + +export { + getQtyFromRequest, + getImageDataFromRequest, + getCountryNameFromRequest +} \ No newline at end of file diff --git a/utils/swagger.ts b/utils/swagger.ts index e1373a43..db602acf 100644 --- a/utils/swagger.ts +++ b/utils/swagger.ts @@ -1,6 +1,4 @@ -import { Express, Request, Response } from 'express'; import swaggerJsdoc from 'swagger-jsdoc'; -import swaggerUi from 'swagger-ui-express'; const { version } = require('../package.json'); @@ -19,6 +17,10 @@ const options: swaggerJsdoc.Options = { consumes: ['application/json'], produces: ['application/json'], tags: [ + { + name: 'Address', + description: 'A set of endpoints related to addresses', + }, { name: 'Animals', description: 'A set of endpoints related to animal', @@ -59,6 +61,10 @@ const options: swaggerJsdoc.Options = { name: 'Images', description: 'A set of endpoints related to obtaining placeholder image urls', }, + { + name: 'IPs', + description: 'A set of endpoints related to obtaining random IP Addresses', + }, { name: 'Invoices', description: 'A set of endpoints related to invoices', diff --git a/utils/tests/arrays.test.ts b/utils/tests/arrays.test.ts index 3d64439e..87aad16f 100644 --- a/utils/tests/arrays.test.ts +++ b/utils/tests/arrays.test.ts @@ -1,4 +1,4 @@ -import { getRandomArrayItem } from '../arrays'; +import { getRandomArrayItem, getRandomSubArray } from '../arrays'; describe('array utils', () => { describe('get random Array Item', () => { @@ -9,4 +9,13 @@ describe('array utils', () => { expect(arr.includes(res)).toBe(true); }); }); + + describe('get random subarray', () => { + it('should return an random subarray from original array', () => { + const arr = ['this', 'is', 'a', 'test']; + const res = getRandomSubArray(arr, 2); + + expect(arr.filter(originalArrElement => res.find(responseArrElement => originalArrElement === responseArrElement)).length).toBe(2); + }); + }); });