diff --git a/.circleci/config.yml b/.circleci/config.yml index add304d..a098efa 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,80 +1,130 @@ -version: 2 +version: 2.1 +parameters: + run_automatedtesting: + default: false + type: boolean + run_basedeployment: + default: true + type: boolean defaults: &defaults - docker: - - image: circleci/python:2.7-stretch-browsers + docker: + - image: cimg/python:3.12.1-browsers install_dependency: &install_dependency name: Installation of build and deployment dependencies. command: | - sudo apt install jq - sudo pip install awscli --upgrade - sudo pip install docker-compose + pip3 install awscli --upgrade install_deploysuite: &install_deploysuite name: Installation of install_deploysuite. command: | - git clone --branch v1.4 https://github.com/topcoder-platform/tc-deploy-scripts ../buildscript + git clone --branch v1.4.17 https://github.com/topcoder-platform/tc-deploy-scripts ../buildscript cp ./../buildscript/master_deploy.sh . cp ./../buildscript/buildenv.sh . cp ./../buildscript/awsconfiguration.sh . restore_cache_settings_for_build: &restore_cache_settings_for_build - key: docker-node-modules-{{ checksum "package-lock.json" }} + key: docker-node-modules-{{ checksum "yarn.lock" }} save_cache_settings: &save_cache_settings - key: docker-node-modules-{{ checksum "package-lock.json" }} + key: docker-node-modules-{{ checksum "yarn.lock" }} paths: - - node_modules + - node_modules builddeploy_steps: &builddeploy_steps - - checkout - - setup_remote_docker - - run: *install_dependency - - run: *install_deploysuite - - restore_cache: *restore_cache_settings_for_build - - run: ./build.sh ${APPNAME} - - save_cache: *save_cache_settings - - deploy: - name: Running MasterScript. - command: | - ./awsconfiguration.sh $DEPLOY_ENV - source awsenvconf - ./buildenv.sh -e $DEPLOY_ENV -b ${LOGICAL_ENV}-${APPNAME}-deployvar - source buildenvvar - ./master_deploy.sh -d ECS -e $DEPLOY_ENV -t latest -s ${LOGICAL_ENV}-global-appvar,${LOGICAL_ENV}-${APPNAME}-appvar -i ${APPNAME} - - +- checkout +- setup_remote_docker +- run: *install_dependency +- run: *install_deploysuite +- restore_cache: *restore_cache_settings_for_build +- run: ./build.sh ${APPNAME} +- save_cache: *save_cache_settings +- deploy: + name: Running MasterScript. + command: "./awsconfiguration.sh $DEPLOY_ENV\nsource awsenvconf\n./buildenv.sh -e $DEPLOY_ENV -b ${LOGICAL_ENV}-${APPNAME}-deployvar\nsource buildenvvar\n./master_deploy.sh -d ECS -e $DEPLOY_ENV -t latest -s ${LOGICAL_ENV}-global-appvar,${LOGICAL_ENV}-${APPNAME}-appvar -i ${APPNAME} -p FARGATE\n#testing code changes\nif [[ true ]]; then\n ./buildenv.sh -e $DEPLOY_ENV -b ${LOGICAL_ENV}-qa-v1-appvar\n source buildenvvar \n curl --request POST \\\n --url https://circleci.com/api/v2/project/github/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/pipeline \\\n --header \"Circle-Token: ${QA_USER_TOKEN}\" \\\n --header 'content-type: application/json' \\\n --data '{\"branch\":\"'\"$CIRCLE_BRANCH\"'\",\"parameters\":{\"run_automatedtesting\":true , \"run_basedeployment\": false}}'\nfi \n #magic___^_^___line\n #magic___^_^___line\n" jobs: # Build & Deploy against development backend "build-dev": - <<: *defaults + !!merge <<: *defaults environment: DEPLOY_ENV: "DEV" LOGICAL_ENV: "dev" - APPNAME: "resources-api" + APPNAME: "resources-api" steps: *builddeploy_steps "build-prod": - <<: *defaults + !!merge <<: *defaults environment: DEPLOY_ENV: "PROD" - LOGICAL_ENV: "prod" - APPNAME: "resources-api" + LOGICAL_ENV: "prod" + APPNAME: "resources-api" steps: *builddeploy_steps + "Run-Newman-Test": + docker: + - image: circleci/node:12 + environment: + DEPLOY_ENV: "DEV" + LOGICAL_ENV: "dev" + APPNAME: "resources-api" + - image: tray/dynamodb-local + command: "-inMemory -port 7777" + - image: elasticsearch:6.8.13 + environment: + discovery.type: "single-node" + steps: + - checkout + - setup_remote_docker + - run: *install_dependency + - run: *install_deploysuite + - run: + name: 'newman test' + command: | + ./awsconfiguration.sh $DEPLOY_ENV + source awsenvconf + ./buildenv.sh -e $DEPLOY_ENV -b ${LOGICAL_ENV}-global-appvar,${LOGICAL_ENV}-${APPNAME}-qa-appvar + source buildenvvar + npm i + cd mock + (npm run mock-challenge-api&) + (NODE_ENV=test npm start&) + npm run test:newman:clear + npm run test:newman + npm run test:newman:clear + - store_artifacts: + path: ./newman + workflows: version: 2 build: + when: << pipeline.parameters.run_basedeployment >> jobs: - # Development builds are executed on "develop" branch only. - - "build-dev": - context : org-global - filters: - branches: - only: - - develop + # Development builds are executed on "develop" branch only. + - "build-dev": + context: org-global + filters: + branches: + only: + - develop + - hotfix/deploy + + # Production builds are exectuted only on tagged commits to the testing + # master branch. + - "build-prod": + context: org-global + filters: + branches: + only: + - master - # Production builds are exectuted only on tagged commits to the - # master branch. - - "build-prod": - context : org-global - filters: - branches: - only: master \ No newline at end of file + testingflow: + when: << pipeline.parameters.run_automatedtesting >> + jobs: + - Hold [Performance-Testing]: + type: approval + - "Run-Newman-Test": + context: org-global + requires: + - Hold [Performance-Testing] + filters: + branches: + only: + - develop + - dev-circleci diff --git a/.eslintrc.yaml b/.eslintrc.yaml new file mode 100644 index 0000000..eab45db --- /dev/null +++ b/.eslintrc.yaml @@ -0,0 +1 @@ +extends: standard diff --git a/.gitignore b/.gitignore index d354fe4..05e3156 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,9 @@ lib-cov # Coverage directory used by tools like istanbul coverage +# Newman tests +newman + # nyc test coverage .nyc_output diff --git a/ReadMe.md b/ReadMe.md index b18c025..47df2f7 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -25,6 +25,7 @@ This microservice provides interaction with Challenge Resources. ## Prerequisites - [NodeJS](https://nodejs.org/en/) (v10) - [DynamoDB](https://aws.amazon.com/dynamodb/) +- [ElasticSearch](https://www.elastic.co/) - [Docker](https://www.docker.com/) - [Docker Compose](https://docs.docker.com/compose/) @@ -58,6 +59,9 @@ The following parameters can be set in config files or in env variables: - DYNAMODB.AWS_WRITE_UNITS: The DynamoDB table write unit configuration, default is 2 - DYNAMODB.TIMEOUT: The timeout setting used in health check - SCOPES: The M2M scopes, refer `config/default.js` for more information +- OS.HOST: Opensearch host, default value is 'localhost:9200' +- OS.OS_INDEX: Opensearch index name for resources, default value is 'resources' +- OS.OS_REFRESH: Opensearch force refresh flag, default value is 'true' - BUSAPI_URL: the bus api, default value is 'https://api.topcoder-dev.com/v5' - KAFKA_ERROR_TOPIC: Kafka error topic, default value is 'common.error.reporting', - KAFKA_MESSAGE_ORIGINATOR: the Kafka message originator, default value is 'resources-api' @@ -65,21 +69,39 @@ The following parameters can be set in config files or in env variables: - RESOURCE_DELETE_TOPIC: the resource delete Kafka topic, default value is 'challenge.action.resource.delete', - RESOURCE_ROLE_CREATE_TOPIC: the resource role create topic, default value is 'challenge.action.resource.role.create', - RESOURCE_ROLE_UPDATE_TOPIC: the resource role update topic, default value is 'challenge.action.resource.role.update' +- AUTOMATED_TESTING_NAME_PREFIX: the role name prefix for every `ResourceRole` record Configuration for testing is at `config/test.js`, only add such new configurations different from `config/default.js` -- WAIT_TIME: wait time used in test, default is 1500 or 1.5 second +- WAIT_TIME: wait time used in test, default is 6000 or 6 seconds - MOCK_CHALLENGE_API_PORT: the mock server port, default is 4000. +- AUTH_V2_URL: The auth v2 url +- AUTH_V2_CLIENT_ID: The auth v2 client id +- AUTH_V3_URL: The auth v3 url +- ADMIN_CREDENTIALS_USERNAME: The user's username with admin role +- ADMIN_CREDENTIALS_PASSWORD: The user's password with admin role +- COPILOT_CREDENTIALS_USERNAME: The user's username with copilot role +- COPILOT_CREDENTIALS_PASSWORD: The user's password with copilot role +- USER_CREDENTIALS_USERNAME: The user's username with user role +- USER_CREDENTIALS_PASSWORD: The user's password with user role +- AUTOMATED_TESTING_REPORTERS_FORMAT: indicates reporters format. It is an array of the formats. e.g. `['html']` produces html format. `['cli', 'json', 'junit', 'html']` is the full format. +*For the details of the supported format, please refer to https://www.npmjs.com/package/newman#reporters*. ## Available commands - Install dependencies `npm install` - Run lint `npm run lint` - Run lint fix `npm run lint:fix` - Create tables `npm run create-tables` +- Drop tables `npm run drop-tables` +- Create tables for test environment `npm run create-tables:test` +- Drop tables for test environment `npm run drop-tables:test` - Clear and init db `npm run init-db` +- Initialize ElasticSearch `npm run init-es` - Start app `npm start` - App is running at `http://localhost:3000` - Start mock server `npm run mock-challenge-api` - The mock server is running at `http://localhost:4000` +- Run the Postman tests `npm run test:newman` +- Clear the testing data by Postman tests: `npm run test:newman:clear` ## Local Deployment ### Foreman Setup @@ -87,7 +109,7 @@ To install foreman follow this [link](https://theforeman.org/manuals/1.24/#3.Ins To know how to use foreman follow this [link](https://theforeman.org/manuals/1.24/#2.Quickstart) - + ### DynamoDB Setup We can use DynamoDB setup on Docker for testing purpose. Just run `docker-compose up` in `local` folder. @@ -100,6 +122,18 @@ You can also use your own AWS DynamoDB service for testing purpose. 2. Make sure you have configured all config parameters. Refer [Configuration](#configuration) 3. Run `npm run create-tables` to create tables. +### ElasticSearch Setup + +We can use ElasticSearch on Docker for testing purpose. Just run `docker-compose up` in `local` folder. + +You can also use your own remote ElasticSearch service for testing purpose. + +### Create ElasticSearch Index + +1. Make sure ElasticSearch are running as per instructions above. +2. Make sure you have configured all config parameters. Refer [Configuration](#configuration) +3. Run `npm run init-es force` to create index. + ### Mock Challenge V5 API The `GET /v5/challenges/{id}` is mocked. It is a simple server app, the code is under mock folder. @@ -126,12 +160,23 @@ The following test parameters can be set in config file or in env variables: - WAIT_TIME: wait time - MOCK_CHALLENGE_API_PORT: mock challenge api port +- AUTH_V2_URL: The auth v2 url +- AUTH_V2_CLIENT_ID: The auth v2 client id +- AUTH_V3_URL: The auth v3 url +- ADMIN_CREDENTIALS_USERNAME: The user's username with admin role +- ADMIN_CREDENTIALS_PASSWORD: The user's password with admin role +- COPILOT_CREDENTIALS_USERNAME: The user's username with copilot role +- COPILOT_CREDENTIALS_PASSWORD: The user's password with copilot role +- USER_CREDENTIALS_USERNAME: The user's username with user role +- USER_CREDENTIALS_PASSWORD: The user's password with user role ### Prepare - Start Local DynamoDB. - Create DynamoDB tables. +- Start Local ElasticSearch. +- Create ElasticSearch index. - Various config parameters should be properly set. ### Running unit tests @@ -144,19 +189,44 @@ To run unit tests and generate coverage report. npm run test ``` -### Running integration tests +### Running E2E tests with Postman + +#### `Start` the app server and mock API server before running e2e tests. You may need to set the env variables by calling `source env.sh` before calling `NODE_ENV=test npm start`. + +- Make sure the db and es are started +```bash + $ cd resources-api + + # NOTE: + # if tables and data already exist, please run first + + # $ npm run drop-tables + + # to drop data and tables + + # Then re-initialize the es server and the database. + + $ npm run create-tables + $ npm run init-es force + $ npm run init-db +``` + +To run postman e2e tests. -#### You need to `stop` the app server and mock API server before running e2e tests. +```bash +npm run test:newman +``` -To run integration tests and generate coverage report. +To clear the testing data from postman e2e tests. ```bash -npm run e2e +npm run test:newman:clear ``` ## Running tests in CI + - TBD ## Verification -Refer to the verification document `Verification.md` +Refer to the verification document `Verification.md`. diff --git a/Verification.md b/Verification.md index 169f0c5..cffa15d 100644 --- a/Verification.md +++ b/Verification.md @@ -10,69 +10,88 @@ ## Unit test Coverage - 115 passing (2m) - -----------------------------------------|----------|----------|----------|----------|-------------------| -File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s | -----------------------------------------|----------|----------|----------|----------|-------------------| -All files | 88.21 | 75.6 | 90.14 | 88.66 | | - resources-api | 100 | 100 | 100 | 100 | | - app-bootstrap.js | 100 | 100 | 100 | 100 | | - app-constants.js | 100 | 100 | 100 | 100 | | - resources-api/config | 100 | 92.65 | 100 | 100 | | - default.js | 100 | 92.65 | 100 | 100 | 13,14,16,17,29 | - test.js | 100 | 100 | 100 | 100 | | - resources-api/src/common | 77.78 | 54.41 | 84.09 | 79.04 | | - errors.js | 100 | 50 | 100 | 100 | 23 | - helper.js | 65.63 | 52.17 | 75.86 | 67.39 |... 91,209,262,272 | - logger.js | 92.31 | 60 | 100 | 92.31 | 31,53,58,82,116 | - resources-api/src/models | 100 | 50 | 100 | 100 | | - Resource.js | 100 | 100 | 100 | 100 | | - ResourceRole.js | 100 | 100 | 100 | 100 | | - ResourceRolePhaseDependency.js | 100 | 100 | 100 | 100 | | - index.js | 100 | 50 | 100 | 100 | 14 | - resources-api/src/services | 95.1 | 78.57 | 100 | 95 | | - ResourceRolePhaseDependencyService.js | 93.1 | 79.17 | 100 | 92.98 | 55,77,113,136 | - ResourceRoleService.js | 94.87 | 75 | 100 | 94.59 | 47,82 | - ResourceService.js | 96.26 | 78.75 | 100 | 96.23 | 77,154,158,162 | -----------------------------------------|----------|----------|----------|----------|-------------------| - - -## E2E test Coverage - - 164 passing (6m) - --------------------------------------------|----------|----------|----------|----------|-------------------| -File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s | --------------------------------------------|----------|----------|----------|----------|-------------------| -All files | 93.92 | 80.27 | 99 | 93.81 | | - resources-api | 95.88 | 82.98 | 100 | 95.79 | | - app-bootstrap.js | 100 | 100 | 100 | 100 | | - app-constants.js | 100 | 100 | 100 | 100 | | - app-routes.js | 97.3 | 93.75 | 100 | 97.3 | 24 | - app.js | 94.23 | 77.42 | 100 | 94.23 | 42,72,88 | - resources-api/config | 100 | 92.65 | 100 | 100 | | - default.js | 100 | 92.65 | 100 | 100 | 13,14,16,17,29 | - test.js | 100 | 100 | 100 | 100 | | - resources-api/src | 100 | 100 | 100 | 100 | | - routes.js | 100 | 100 | 100 | 100 | | - resources-api/src/common | 89.47 | 70.59 | 97.73 | 89.22 | | - errors.js | 100 | 50 | 100 | 100 | 23 | - helper.js | 86.46 | 73.91 | 96.55 | 85.87 |... 91,209,262,272 | - logger.js | 92.31 | 65 | 100 | 92.31 | 31,53,58,82,116 | - resources-api/src/controllers | 100 | 100 | 100 | 100 | | - HealthCheckController.js | 100 | 100 | 100 | 100 | | - ResourceController.js | 100 | 100 | 100 | 100 | | - ResourceRoleController.js | 100 | 100 | 100 | 100 | | - ResourceRolePhaseDependencyController.js | 100 | 100 | 100 | 100 | | - resources-api/src/models | 100 | 50 | 100 | 100 | | - Resource.js | 100 | 100 | 100 | 100 | | - ResourceRole.js | 100 | 100 | 100 | 100 | | - ResourceRolePhaseDependency.js | 100 | 100 | 100 | 100 | | - index.js | 100 | 50 | 100 | 100 | 14 | - resources-api/src/services | 94.93 | 78.07 | 100 | 94.84 | | - HealthCheckService.js | 92.31 | 50 | 100 | 92.31 | 15 | - ResourceRolePhaseDependencyService.js | 93.1 | 79.17 | 100 | 92.98 | 55,77,113,136 | - ResourceRoleService.js | 94.87 | 75 | 100 | 94.59 | 47,82 | - ResourceService.js | 96.26 | 78.75 | 100 | 96.23 | 77,154,158,162 | --------------------------------------------|----------|----------|----------|----------|-------------------| + 127 passing (1m) + +File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s +----------------------------------------|----------|----------|----------|----------|------------------- +All files | 88.69 | 83.7 | 90.43 | 88.48 | + resources-api | 100 | 100 | 100 | 100 | + app-bootstrap.js | 100 | 100 | 100 | 100 | + app-constants.js | 100 | 100 | 100 | 100 | + resources-api/config | 100 | 98.78 | 100 | 100 | + default.js | 100 | 98.78 | 100 | 100 | 35 + test.js | 100 | 100 | 100 | 100 | + resources-api/src/common | 74.45 | 52.17 | 83.02 | 75.11 | + errors.js | 100 | 50 | 100 | 100 | 23 + helper.js | 65.13 | 50 | 76.32 | 65.75 |... 46,364,374,390 + logger.js | 92.31 | 60 | 100 | 92.31 | 31,53,58,82,116 + resources-api/src/models | 100 | 50 | 100 | 100 | + MemberProfile.js | 100 | 100 | 100 | 100 | + MemberStats.js | 100 | 100 | 100 | 100 | + Resource.js | 100 | 100 | 100 | 100 | + ResourceRole.js | 100 | 100 | 100 | 100 | + ResourceRolePhaseDependency.js | 100 | 100 | 100 | 100 | + index.js | 100 | 50 | 100 | 100 | 8,18 + resources-api/src/services | 98.23 | 96.45 | 100 | 98.05 | + ResourceRolePhaseDependencyService.js | 94.83 | 87.5 | 100 | 94.74 | 77,113,136 + ResourceRoleService.js | 96.55 | 90 | 100 | 95.35 | 60,96 + ResourceService.js | 100 | 100 | 100 | 100 | + +## E2E testing with Postman + +You should be able to find the tests result from the command window of running `npm run test:newman` for each test case. + +Below is a sample output result of finding resources by member. + +``` +resource-api + +Iteration 1/4 + +❏ Resources / list challenge by member +↳ get challenges by member with resource role + GET http://localhost:3000/v5/resources/16096823/challenges?resourceRoleId=c943cb74-37bb-409a-994e-1cd28fbbb7b5 [200 OK, 702B, 11ms] + ✓ Status code is 200 + +Iteration 2/4 + +↳ get challenges by member with resource role + GET http://localhost:3000/v5/resources/16096823/challenges?resourceRoleId=c943cb74-37bb-409a-994e-1cd28fbbb7b5 [200 OK, 702B, 17ms] + ✓ Status code is 200 + +Iteration 3/4 + +↳ get challenges by member with resource role + GET http://localhost:3000/v5/resources/16096823/challenges?resourceRoleId=c943cb74-37bb-409a-994e-1cd28fbbb7b5 [200 OK, 702B, 21ms] + ✓ Status code is 200 + +Iteration 4/4 + +↳ get challenges by member with resource role + GET http://localhost:3000/v5/resources/not_exist_user/challenges?resourceRoleId=c943cb74-37bb-409a-994e-1cd28fbbb7b5 [200 OK, 397B, 24ms] + ✓ Status code is 200 + +┌─────────────────────────┬──────────────────┬──────────────────┐ +│ │ executed │ failed │ +├─────────────────────────┼──────────────────┼──────────────────┤ +│ iterations │ 4 │ 0 │ +├─────────────────────────┼──────────────────┼──────────────────┤ +│ requests │ 4 │ 0 │ +├─────────────────────────┼──────────────────┼──────────────────┤ +│ test-scripts │ 4 │ 0 │ +├─────────────────────────┼──────────────────┼──────────────────┤ +│ prerequest-scripts │ 0 │ 0 │ +├─────────────────────────┼──────────────────┼──────────────────┤ +│ assertions │ 4 │ 0 │ +├─────────────────────────┴──────────────────┴──────────────────┤ +│ total run duration: 207ms │ +├───────────────────────────────────────────────────────────────┤ +│ total data received: 122B (approx) │ +├───────────────────────────────────────────────────────────────┤ +│ average response time: 18ms [min: 11ms, max: 24ms, s.d.: 4ms] │ +└───────────────────────────────────────────────────────────────┘ +``` + +Then you can run `npm run test:newman:clear` to delete all testing data by above postman tests. +If 'socket hang up' appears while running the `npm run test:newman`. You can increase the `WAIT_TIME` from the `default/test.js`. + Then run `npm run test:newman:clear` before calling `npm run test:newman` again. \ No newline at end of file diff --git a/app-bootstrap.js b/app-bootstrap.js index 5a6617c..b65f780 100644 --- a/app-bootstrap.js +++ b/app-bootstrap.js @@ -3,9 +3,10 @@ */ global.Promise = require('bluebird') +const config = require('config') const Joi = require('joi') Joi.optionalId = () => Joi.string().uuid() Joi.id = () => Joi.optionalId().required() Joi.page = () => Joi.number().integer().min(1).default(1) -Joi.perPage = () => Joi.number().integer().min(1).max(100).default(20) +Joi.perPage = () => Joi.number().integer().min(1).max(10000).default(config.DEFAULT_PAGE_SIZE) diff --git a/app-constants.js b/app-constants.js index e6eb8b4..9dc4d3b 100644 --- a/app-constants.js +++ b/app-constants.js @@ -9,6 +9,12 @@ const UserRoles = { User: 'Topcoder User' } +const ChallengeStatuses = { + Completed: 'Completed', + Active: 'Active' +} + module.exports = { - UserRoles + UserRoles, + ChallengeStatuses } diff --git a/app-routes.js b/app-routes.js index 8392e2a..e7bd9c7 100644 --- a/app-routes.js +++ b/app-routes.js @@ -45,6 +45,19 @@ module.exports = (app) => { } }) + if (def.blockByIp) { + actions.push((req, res, next) => { + req.authUser.blockIP = _.find(req.authUser, (value, key) => { + return (key.indexOf('blockIP') !== -1) + }) + if (req.authUser.blockIP) { + throw new errors.ForbiddenError('Access denied') + } else { + next() + } + }) + } + if (!def.allowAnonymous) { actions.push((req, res, next) => { if (req.authUser.isMachine) { @@ -58,6 +71,7 @@ module.exports = (app) => { } else { // User req.authUser.userId = String(req.authUser.userId) + console.log(req.authUser) if (!req.authUser.roles || !helper.checkIfExists(def.access, req.authUser.roles)) { next(new errors.ForbiddenError('You are not allowed to perform this action!')) } else { diff --git a/app.js b/app.js index f565aab..4a57a85 100644 --- a/app.js +++ b/app.js @@ -92,6 +92,10 @@ app.use((err, req, res, next) => { } } + if (!_.isUndefined(err.metadata)) { + errorResponse.metadata = err.metadata + } + res.status(status).json(errorResponse) }) diff --git a/build.sh b/build.sh index aa24a4b..223d20d 100755 --- a/build.sh +++ b/build.sh @@ -7,10 +7,10 @@ docker create --name app $APP_NAME:latest if [ -d node_modules ] then - mv package-lock.json old-package-lock.json - docker cp app:/$APP_NAME/package-lock.json package-lock.json + mv yarn.lock old-yarn.lock + docker cp app:/$APP_NAME/yarn.lock yarn.lock set +eo pipefail - UPDATE_CACHE=$(cmp package-lock.json old-package-lock.json) + UPDATE_CACHE=$(cmp yarn.lock old-yarn.lock) set -eo pipefail else UPDATE_CACHE=1 diff --git a/config/default.js b/config/default.js index 0ec194b..3450fa1 100644 --- a/config/default.js +++ b/config/default.js @@ -7,6 +7,7 @@ module.exports = { PORT: process.env.PORT || 3000, API_VERSION: process.env.API_VERSION || 'v5', DEFAULT_PAGE_SIZE: process.env.DEFAULT_PAGE_SIZE || 1000, + MAX_ELASTIC_SEARCH_RECORDS_SIZE: process.env.MAX_ELASTIC_SEARCH_RECORDS_SIZE || 10000, // used to properly set the header response to api calls for services behind a load balancer API_BASE_URL: process.env.API_BASE_URL || `http://localhost:3000`, @@ -14,6 +15,8 @@ module.exports = { VALID_ISSUERS: process.env.VALID_ISSUERS || '["https://api.topcoder-dev.com", "https://api.topcoder.com", "https://topcoder-dev.auth0.com/"]', SUBMITTER_RESOURCE_ROLE_ID: process.env.SUBMITTER_RESOURCE_ROLE_ID || '732339e7-8e30-49d7-9198-cccf9451e221', + REVIEWER_RESOURCE_ROLE_ID: process.env.REVIEWER_RESOURCE_ROLE_ID || '318b9c07-079a-42d9-a81f-b96be1dc1099', + ITERATIVE_REVIEWER_RESOURCE_ROLE_ID: process.env.ITERATIVE_REVIEWER_RESOURCE_ROLE_ID || 'f6df7212-b9d6-4193-bfb1-b383586fce63', AUTH0_URL: process.env.AUTH0_URL || 'https://topcoder-dev.auth0.com/oauth/token', AUTH0_AUDIENCE: process.env.AUTH0_AUDIENCE || 'https://m2m.topcoder-dev.com/', @@ -23,29 +26,29 @@ module.exports = { AUTH0_PROXY_SERVER_URL: process.env.AUTH0_PROXY_SERVER_URL, TERMS_API_URL: process.env.TERMS_API_URL || 'https://api.topcoder-dev.com/v5/terms', - MEMBER_API_URL: process.env.MEMBER_API_URL || 'https://api.topcoder-dev.com/v3/members', + MEMBER_API_URL: process.env.MEMBER_API_URL || 'https://api.topcoder-dev.com/v5/members', USER_API_URL: process.env.USER_API_URL || 'https://api.topcoder-dev.com/v3/users', CHALLENGE_API_URL: process.env.CHALLENGE_API_URL || 'http://localhost:4000/v5/challenges', CHALLENGE_PHASES_API_URL: process.env.CHALLENGE_PHASES_API_URL || 'https://api.topcoder-dev.com/v5/challenge-phases', + SUBMISSIONS_API_URL: process.env.SUBMISSIONS_API_URL || 'https://api.topcoder-dev.com/v5/submissions', DYNAMODB: { - // AWS_ACCESS_KEY_ID: process.env.AWS_FAKE_ID, - // AWS_SECRET_ACCESS_KEY: process.env.AWS_FAKE_KEY, + AWS_ACCESS_KEY_ID: process.env.AWS_ACCESS_KEY_ID, + AWS_SECRET_ACCESS_KEY: process.env.AWS_SECRET_ACCESS_KEY, AWS_REGION: process.env.AWS_REGION || 'us-east-1', IS_LOCAL_DB: process.env.IS_LOCAL_DB ? process.env.IS_LOCAL_DB === 'true' : true, - URL: process.env.DYNAMODB_URL || 'http://localhost:8000', + DYNAMODB_URL: process.env.DYNAMODB_URL || 'http://localhost:7777', + URL: process.env.DYNAMODB_URL || 'http://localhost:7777', AWS_READ_UNITS: process.env.AWS_READ_UNITS || 4, AWS_WRITE_UNITS: process.env.AWS_WRITE_UNITS || 2, TIMEOUT: process.env.DYNAMODB_TIMEOUT || 10000 }, - ES: { - // above AWS_REGION is used if we use AWS ES - HOST: process.env.ES_HOST || 'localhost:9200', - API_VERSION: process.env.ES_API_VERSION || '6.8', - ES_INDEX: process.env.ES_INDEX || 'resources', - ES_TYPE: process.env.ES_TYPE || '_doc', // ES 6.x accepts only 1 Type per index and it's mandatory to define it - ES_REFRESH: process.env.ES_REFRESH || 'true' + OS: { + // above AWS_REGION is used if we use AWS OS + HOST: process.env.OS_HOST || 'localhost:9200', + OS_INDEX: process.env.OS_INDEX || 'resources', + OS_REFRESH: process.env.OS_REFRESH || 'true' }, SCOPES: { @@ -62,5 +65,18 @@ module.exports = { RESOURCE_CREATE_TOPIC: process.env.RESOURCE_CREATE_TOPIC || 'challenge.action.resource.create', RESOURCE_DELETE_TOPIC: process.env.RESOURCE_DELETE_TOPIC || 'challenge.action.resource.delete', RESOURCE_ROLE_CREATE_TOPIC: process.env.RESOURCE_ROLE_CREATE_TOPIC || 'challenge.action.resource.role.create', - RESOURCE_ROLE_UPDATE_TOPIC: process.env.RESOURCE_ROLE_UPDATE_TOPIC || 'challenge.action.resource.role.update' + RESOURCE_ROLE_UPDATE_TOPIC: process.env.RESOURCE_ROLE_UPDATE_TOPIC || 'challenge.action.resource.role.update', + EMAIL_NOTIFICATIN_TOPIC: process.env.EMAIL_NOTIFICATIN_TOPIC || 'external.action.email', + REGISTRATION_EMAIL: { + EMAIL_FROM: process.env.EMAIL_FROM || 'no-reply@topcoder.com', + SENDGRID_TEMPLATE_ID: process.env.SENDGRID_TEMPLATE_ID || '', + SENDGRID_TEMPLATE_ID_NO_FORUM: process.env.SENDGRID_TEMPLATE_ID_NO_FORUM || '', + SUBMIT_URL: process.env.SUBMIT_URL || 'https://www.topcoder.com/challenges/:id/submit/', + REVIEW_APP_URL: process.env.REVIEW_APP_URL || 'https://software.topcoder.com/review/actions/ViewProjectDetails?pid=', + HELP_URL: process.env.HELP_URL || 'https://help.topcoder.com', + SUPPORT_EMAIL: process.env.SUPPORT_EMAIL || 'support@topcoder.com' + }, + + AUTOMATED_TESTING_NAME_PREFIX: process.env.AUTOMATED_TESTING_NAME_PREFIX || 'POSTMANE2E-', + TOPCROWD_CHALLENGE_TEMPLATE_ID: process.env.TOPCROWD_CHALLENGE_TEMPLATE_ID || '517e76b0-8824-4e72-9b48-a1ebde1793a8' } diff --git a/config/test.js b/config/test.js index be2c097..81cb802 100644 --- a/config/test.js +++ b/config/test.js @@ -3,6 +3,19 @@ */ module.exports = { - WAIT_TIME: 1500, - MOCK_CHALLENGE_API_PORT: 4000 + TERMS_API_URL: 'http://localhost:4000/v5/terms', + BUSAPI_URL: 'http://localhost:4000/v5', + CHALLENGE_PHASES_API_URL: 'http://localhost:4000/v5/challenge-phases', + WAIT_TIME: 6000, + MOCK_CHALLENGE_API_PORT: 4000, + AUTH_V2_URL: process.env.AUTH_V2_URL || 'https://topcoder-dev.auth0.com/oauth/ro', + AUTH_V2_CLIENT_ID: process.env.AUTH_V2_CLIENT_ID || '', + AUTH_V3_URL: process.env.AUTH_V3_URL || 'https://api.topcoder-dev.com/v3/authorizations', + ADMIN_CREDENTIALS_USERNAME: process.env.ADMIN_CREDENTIALS_USERNAME || '', + ADMIN_CREDENTIALS_PASSWORD: process.env.ADMIN_CREDENTIALS_PASSWORD || '', + COPILOT_CREDENTIALS_USERNAME: process.env.COPILOT_CREDENTIALS_USERNAME || '', + COPILOT_CREDENTIALS_PASSWORD: process.env.COPILOT_CREDENTIALS_PASSWORD || '', + USER_CREDENTIALS_USERNAME: process.env.USER_CREDENTIALS_USERNAME || '', + USER_CREDENTIALS_PASSWORD: process.env.USER_CREDENTIALS_PASSWORD || '', + AUTOMATED_TESTING_REPORTERS_FORMAT: process.env.AUTOMATED_TESTING_REPORTERS_FORMAT || ['cli', 'html'] } diff --git a/docker/Dockerfile b/docker/Dockerfile index 7d1d781..1bb009a 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,5 +1,5 @@ # Use the base image with Node.js -FROM node:latest +FROM node:14.21.3 # Copy the current directory into the Docker image COPY . /resources-api @@ -8,10 +8,8 @@ COPY . /resources-api WORKDIR /resources-api # Install the dependencies from package.json -RUN npm install -RUN npm run lint -RUN npm run lint:fix -#RUN npm run build -#RUN npm run test +RUN yarn install +RUN yarn lint +RUN yarn lint:fix -CMD npm start \ No newline at end of file +CMD node app.js diff --git a/docs/swagger.yaml b/docs/swagger.yaml index aa1b1fe..30a6bf6 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -66,12 +66,30 @@ paths: format: UUID in: query required: true + - name: memberId + type: integer + description: The member id + in: query + - name: memberHandle + type: string + description: The member handle + in: query - name: roleId type: string description: role id to filter on format: UUID in: query required: false + - name: sortBy + type: string + description: Sort the results by the field. + in: query + required: false + - name: sortOrder + type: string + description: Order the results by the asc/desc. + in: query + required: false responses: '200': description: OK - the request was successful @@ -577,6 +595,9 @@ definitions: type: string description: The unauthorized error message. example: Unable to authenticate the user. + metadata: + type: object + description: freeform metadata object NotFound: type: object description: The not found error entity. @@ -585,6 +606,9 @@ definitions: type: string description: The not found error message. example: A resource with the name could not be found. + metadata: + type: object + description: freeform metadata object ServerError: type: object description: The server error entity. @@ -596,6 +620,9 @@ definitions: Something went wrong while processing your request. We’re sorry for the trouble. We’ve been notified of the error and will correct it as soon as possible. Please try your request again in a moment. + metadata: + type: object + description: freeform metadata object ServiceUnavailable: type: object description: The server is unavailable @@ -604,6 +631,9 @@ definitions: type: string description: The server error message. example: Something went wrong with the server. + metadata: + type: object + description: freeform metadata object BadRequest: type: object description: The bad request error entity. @@ -612,6 +642,9 @@ definitions: type: string description: The bad request error message. example: Invalid input. + metadata: + type: object + description: freeform metadata object Forbidden: type: object description: The permission error entity. @@ -620,6 +653,9 @@ definitions: type: string description: The forbidden error message. example: You are not allowed to access the request. + metadata: + type: object + description: freeform metadata object Conflict: type: object description: The conflict error entity. @@ -630,3 +666,6 @@ definitions: type: string description: The conflict error message. example: Creating a resource with a name already exists. + metadata: + type: object + description: freeform metadata object diff --git a/docs/topcoder-challenge-resource-api.postman_collection.json b/docs/topcoder-challenge-resource-api.postman_collection.json index 11c7e42..4c267e1 100644 --- a/docs/topcoder-challenge-resource-api.postman_collection.json +++ b/docs/topcoder-challenge-resource-api.postman_collection.json @@ -1,15 +1,19 @@ { + "variables": [], "info": { - "_postman_id": "4220e314-878c-42fa-b36b-a3e9f8f2db00", "name": "topcoder-challenge-resource-api", - "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + "_postman_id": "de2a0476-0ad4-d78a-f9c2-8db33ee75cc8", + "description": "", + "schema": "https://schema.getpostman.com/json/collection/v2.0.0/collection.json" }, "item": [ { "name": "Resource Roles", + "description": "", "item": [ { "name": "create resource role", + "description": "", "item": [ { "name": "create active read only access resource role by admin", @@ -17,18 +21,18 @@ { "listen": "test", "script": { - "id": "cb7a7fa3-80d2-4d2a-97a6-558e97041fb4", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", " pm.environment.set(\"COPILOT_RESOURCE_ROLE_ID\", pm.response.json().id);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles", "method": "POST", "header": [ { @@ -52,15 +56,7 @@ "mode": "raw", "raw": "{\n\t\"name\": \"co-pilot\",\n\t\"fullReadAccess\": true,\n \"fullWriteAccess\": false,\n\t\"isActive\": true,\n\t\"selfObtainable\": false\n}" }, - "url": { - "raw": "{{URL}}/resource-roles", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles" - ] - } + "description": "" }, "response": [] }, @@ -70,18 +66,18 @@ { "listen": "test", "script": { - "id": "8caf10f3-8e53-4e35-83a5-ce4225e5014b", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", " pm.environment.set(\"OBSERVER_RESOURCE_ROLE_ID\", pm.response.json().id);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles", "method": "POST", "header": [ { @@ -105,15 +101,7 @@ "mode": "raw", "raw": "{\n\t\"name\": \"Observer\",\n\t\"fullReadAccess\": true,\n \"fullWriteAccess\": true,\n\t\"isActive\": false,\n\t\"selfObtainable\": false\n}" }, - "url": { - "raw": "{{URL}}/resource-roles", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles" - ] - } + "description": "" }, "response": [] }, @@ -123,18 +111,18 @@ { "listen": "test", "script": { - "id": "ca220ef8-27ac-4ef3-b763-f66c5a3887d1", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", " pm.environment.set(\"SUBMITTER_RESOURCE_ROLE_ID\", pm.response.json().id);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles", "method": "POST", "header": [ { @@ -158,15 +146,7 @@ "mode": "raw", "raw": "{\n\t\"name\": \"submitter\",\n\t\"fullReadAccess\": true,\n \"fullWriteAccess\": true,\n\t\"isActive\": true,\n\t\"selfObtainable\": true\n}" }, - "url": { - "raw": "{{URL}}/resource-roles", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles" - ] - } + "description": "" }, "response": [] }, @@ -176,18 +156,18 @@ { "listen": "test", "script": { - "id": "284c6c8a-c7e5-4131-ba30-b07cd404e7be", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", " pm.environment.set(\"REVIEWER_RESOURCE_ROLE_ID\", pm.response.json().id);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles", "method": "POST", "header": [ { @@ -211,15 +191,7 @@ "mode": "raw", "raw": "{\n\t\"name\": \"reviewer\",\n\t\"fullReadAccess\": false,\n \"fullWriteAccess\": false,\n\t\"isActive\": true,\n\t\"selfObtainable\": false\n}" }, - "url": { - "raw": "{{URL}}/resource-roles", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles" - ] - } + "description": "" }, "response": [] }, @@ -229,17 +201,17 @@ { "listen": "test", "script": { - "id": "f19a9655-0688-4912-b2fa-d2b3c669fe66", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles", "method": "POST", "header": [ { @@ -263,15 +235,7 @@ "mode": "raw", "raw": "{\n\t\"invalid\": \"invalid\",\n\t\"fullReadAccess\": true,\n \"fullWriteAccess\": false,\n\t\"isActive\": true\n}" }, - "url": { - "raw": "{{URL}}/resource-roles", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles" - ] - } + "description": "" }, "response": [] }, @@ -281,17 +245,17 @@ { "listen": "test", "script": { - "id": "f339ac6a-b858-494e-aede-c5e769ac9a80", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles", "method": "POST", "header": [ { @@ -315,15 +279,7 @@ "mode": "raw", "raw": "{\n\t\"name\": \"failure-test\",\n\t\"fullReadAccess\": true,\n \"fullWriteAccess\": false\n}" }, - "url": { - "raw": "{{URL}}/resource-roles", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles" - ] - } + "description": "" }, "response": [] }, @@ -333,17 +289,17 @@ { "listen": "test", "script": { - "id": "36a6886b-b3e5-47c2-896b-71301f5fc5b7", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 401\", function () {", " pm.response.to.have.status(401);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles", "method": "POST", "header": [ { @@ -362,15 +318,7 @@ "mode": "raw", "raw": "{\n\t\"name\": \"failure\",\n\t\"fullReadAccess\": true,\n \"fullWriteAccess\": false,\n\t\"isActive\": true\n}" }, - "url": { - "raw": "{{URL}}/resource-roles", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles" - ] - } + "description": "" }, "response": [] }, @@ -380,17 +328,17 @@ { "listen": "test", "script": { - "id": "d9433b01-b75e-4d32-898c-daa89d874529", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 401\", function () {", " pm.response.to.have.status(401);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles", "method": "POST", "header": [ { @@ -414,15 +362,7 @@ "mode": "raw", "raw": "{\n\t\"name\": \"failure\",\n\t\"fullReadAccess\": true,\n \"fullWriteAccess\": false,\n\t\"isActive\": true\n}" }, - "url": { - "raw": "{{URL}}/resource-roles", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles" - ] - } + "description": "" }, "response": [] }, @@ -432,17 +372,17 @@ { "listen": "test", "script": { - "id": "afd35294-3a18-4eea-bf71-725bb4f02dda", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 401\", function () {", " pm.response.to.have.status(401);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles", "method": "POST", "header": [ { @@ -466,15 +406,7 @@ "mode": "raw", "raw": "{\n\t\"name\": \"failure\",\n\t\"fullReadAccess\": true,\n \"fullWriteAccess\": false,\n\t\"isActive\": true\n}" }, - "url": { - "raw": "{{URL}}/resource-roles", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles" - ] - } + "description": "" }, "response": [] }, @@ -484,17 +416,17 @@ { "listen": "test", "script": { - "id": "0e91af82-2110-4d79-9b06-9713b2a1b8f3", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 403\", function () {", " pm.response.to.have.status(403);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles", "method": "POST", "header": [ { @@ -518,15 +450,7 @@ "mode": "raw", "raw": "{\n\t\"name\": \"failure\",\n\t\"fullReadAccess\": true,\n \"fullWriteAccess\": false,\n\t\"isActive\": true\n}" }, - "url": { - "raw": "{{URL}}/resource-roles", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles" - ] - } + "description": "" }, "response": [] }, @@ -536,17 +460,17 @@ { "listen": "test", "script": { - "id": "cacaeb82-1ae4-41e7-949b-3c275fc35642", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 403\", function () {", " pm.response.to.have.status(403);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles", "method": "POST", "header": [ { @@ -570,15 +494,7 @@ "mode": "raw", "raw": "{\n\t\"name\": \"failure\",\n\t\"fullReadAccess\": true,\n \"fullWriteAccess\": false,\n\t\"isActive\": true\n}" }, - "url": { - "raw": "{{URL}}/resource-roles", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles" - ] - } + "description": "" }, "response": [] }, @@ -588,17 +504,17 @@ { "listen": "test", "script": { - "id": "b61880be-12b5-4e15-a42c-f845b686623d", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 409\", function () {", " pm.response.to.have.status(409);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles", "method": "POST", "header": [ { @@ -622,24 +538,16 @@ "mode": "raw", "raw": "{\n\t\"name\": \"SUBMITTER\",\n\t\"fullReadAccess\": true,\n \"fullWriteAccess\": false,\n\t\"isActive\": true,\n\t\"selfObtainable\": true\n}" }, - "url": { - "raw": "{{URL}}/resource-roles", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles" - ] - } + "description": "" }, "response": [] } ], - "protocolProfileBehavior": {}, "_postman_isSubFolder": true }, { "name": "get resource roles", + "description": "", "item": [ { "name": "get all resource roles", @@ -647,17 +555,17 @@ { "listen": "test", "script": { - "id": "6aacc23b-b91b-48c8-a1da-9a2c3c7ad043", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles", "method": "GET", "header": [ { @@ -676,15 +584,11 @@ "type": "text" } ], - "url": { - "raw": "{{URL}}/resource-roles", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, @@ -694,17 +598,32 @@ { "listen": "test", "script": { - "id": "b298d260-2b10-4cbb-9c78-35f18e0e47b8", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": { + "raw": "{{URL}}/resource-roles?name=Reviewer", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles" + ], + "query": [ + { + "key": "name", + "value": "Reviewer" + } + ], + "variable": [] + }, "method": "GET", "header": [ { @@ -723,21 +642,11 @@ "value": "Bearer {{m2m_all_token}}" } ], - "url": { - "raw": "{{URL}}/resource-roles?name=Reviewer", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles" - ], - "query": [ - { - "key": "name", - "value": "Reviewer" - } - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, @@ -747,17 +656,32 @@ { "listen": "test", "script": { - "id": "87e8825e-a0e1-4059-8ba6-b700bbd5d319", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": { + "raw": "{{URL}}/resource-roles?isActive=true", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles" + ], + "query": [ + { + "key": "isActive", + "value": "true" + } + ], + "variable": [] + }, "method": "GET", "header": [ { @@ -776,21 +700,11 @@ "value": "Bearer {{m2m_all_token}}" } ], - "url": { - "raw": "{{URL}}/resource-roles?isActive=true", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles" - ], - "query": [ - { - "key": "isActive", - "value": "true" - } - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, @@ -800,17 +714,32 @@ { "listen": "test", "script": { - "id": "52ba1f88-7f91-4101-8f21-e8bb59d15bfb", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": { + "raw": "{{URL}}/resource-roles?isActive=false", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles" + ], + "query": [ + { + "key": "isActive", + "value": "false" + } + ], + "variable": [] + }, "method": "GET", "header": [ { @@ -829,21 +758,11 @@ "value": "Bearer {{user1_token}}" } ], - "url": { - "raw": "{{URL}}/resource-roles?isActive=false", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles" - ], - "query": [ - { - "key": "isActive", - "value": "false" - } - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, @@ -853,35 +772,16 @@ { "listen": "test", "script": { - "id": "98093523-8bd4-4106-b71f-151e85b6e9a6", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { - "method": "GET", - "header": [ - { - "key": "Accept", - "type": "text", - "value": "application/json" - }, - { - "key": "Content-Type", - "type": "text", - "value": "application/json" - }, - { - "key": "Authorization", - "type": "text", - "value": "Bearer {{admin_token}}" - } - ], "url": { "raw": "{{URL}}/resource-roles?isActive=invalid", "host": [ @@ -900,8 +800,32 @@ "value": "invalid", "disabled": true } - ] - } + ], + "variable": [] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{admin_token}}" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, @@ -911,17 +835,32 @@ { "listen": "test", "script": { - "id": "61523250-4acf-486d-af7e-8ef604303aac", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 401\", function () {", " pm.response.to.have.status(401);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": { + "raw": "{{URL}}/resource-roles?isActive=true", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles" + ], + "query": [ + { + "key": "isActive", + "value": "true" + } + ], + "variable": [] + }, "method": "GET", "header": [ { @@ -940,21 +879,11 @@ "value": "Bearer {{expire_token}}" } ], - "url": { - "raw": "{{URL}}/resource-roles?isActive=true", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles" - ], - "query": [ - { - "key": "isActive", - "value": "true" - } - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, @@ -964,30 +893,16 @@ { "listen": "test", "script": { - "id": "d116ab18-cc47-44a8-b1cf-2520d17d97a9", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 401\", function () {", " pm.response.to.have.status(401);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { - "method": "GET", - "header": [ - { - "key": "Accept", - "type": "text", - "value": "application/json" - }, - { - "key": "Content-Type", - "type": "text", - "value": "application/json" - } - ], "url": { "raw": "{{URL}}/resource-roles?isActive=true", "host": [ @@ -1001,8 +916,27 @@ "key": "isActive", "value": "true" } - ] - } + ], + "variable": [] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, @@ -1012,17 +946,32 @@ { "listen": "test", "script": { - "id": "b2109b9f-5190-443d-b589-514757a5b82f", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 401\", function () {", " pm.response.to.have.status(401);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": { + "raw": "{{URL}}/resource-roles?isActive=true", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles" + ], + "query": [ + { + "key": "isActive", + "value": "true" + } + ], + "variable": [] + }, "method": "GET", "header": [ { @@ -1041,21 +990,11 @@ "value": "Bearer invalid" } ], - "url": { - "raw": "{{URL}}/resource-roles?isActive=true", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles" - ], - "query": [ - { - "key": "isActive", - "value": "true" - } - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, @@ -1065,17 +1004,32 @@ { "listen": "test", "script": { - "id": "24a733a9-3187-43cb-9c97-e7a89c00e7b6", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 403\", function () {", " pm.response.to.have.status(403);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": { + "raw": "{{URL}}/resource-roles?isActive=true", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles" + ], + "query": [ + { + "key": "isActive", + "value": "true" + } + ], + "variable": [] + }, "method": "GET", "header": [ { @@ -1094,30 +1048,20 @@ "value": "Bearer {{m2m_modify_token}}" } ], - "url": { - "raw": "{{URL}}/resource-roles?isActive=true", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles" - ], - "query": [ - { - "key": "isActive", - "value": "true" - } - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] } ], - "protocolProfileBehavior": {}, "_postman_isSubFolder": true }, { "name": "update resource role", + "description": "", "item": [ { "name": "failure - update resource role invalid id 400", @@ -1125,17 +1069,17 @@ { "listen": "test", "script": { - "id": "17b52390-60f1-4365-b8e8-740944ccc7e6", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/test", "method": "PUT", "header": [ { @@ -1158,16 +1102,7 @@ "mode": "raw", "raw": "{\n\t\"name\": \"failure-test\",\n\t\"fullReadAccess\": true,\n \"fullWriteAccess\": false,\n\t\"isActive\": true,\n\t\"selfObtainable\": false\n}" }, - "url": { - "raw": "{{URL}}/resource-roles/test", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "test" - ] - } + "description": "" }, "response": [] }, @@ -1177,17 +1112,17 @@ { "listen": "test", "script": { - "id": "45d0c550-b0aa-4fed-af26-f6300f367af0", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/{{COPILOT_RESOURCE_ROLE_ID}}", "method": "PUT", "header": [ { @@ -1210,16 +1145,7 @@ "mode": "raw", "raw": "{\n\t\"name\": \"failure\",\n\t\"isActive\": true,\n\t\"selfObtainable\": false\n}" }, - "url": { - "raw": "{{URL}}/resource-roles/{{COPILOT_RESOURCE_ROLE_ID}}", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "{{COPILOT_RESOURCE_ROLE_ID}}" - ] - } + "description": "" }, "response": [] }, @@ -1229,17 +1155,17 @@ { "listen": "test", "script": { - "id": "e8bb59ea-f00b-433c-b684-5b4b0ee356ad", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 401\", function () {", " pm.response.to.have.status(401);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/{{COPILOT_RESOURCE_ROLE_ID}}", "method": "PUT", "header": [ { @@ -1257,16 +1183,7 @@ "mode": "raw", "raw": "{\n\t\"name\": \"failure\",\n\t\"fullReadAccess\": true,\n \"fullWriteAccess\": false,\n\t\"isActive\": true,\n\t\"selfObtainable\": false\n}" }, - "url": { - "raw": "{{URL}}/resource-roles/{{COPILOT_RESOURCE_ROLE_ID}}", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "{{COPILOT_RESOURCE_ROLE_ID}}" - ] - } + "description": "" }, "response": [] }, @@ -1276,17 +1193,17 @@ { "listen": "test", "script": { - "id": "228491e4-72d2-48c9-ba82-17bf582a8679", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 401\", function () {", " pm.response.to.have.status(401);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/{{COPILOT_RESOURCE_ROLE_ID}}", "method": "PUT", "header": [ { @@ -1309,16 +1226,7 @@ "mode": "raw", "raw": "{\n\t\"name\": \"failure\",\n\t\"fullReadAccess\": true,\n \"fullWriteAccess\": false,\n\t\"isActive\": true,\n\t\"selfObtainable\": false\n}" }, - "url": { - "raw": "{{URL}}/resource-roles/{{COPILOT_RESOURCE_ROLE_ID}}", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "{{COPILOT_RESOURCE_ROLE_ID}}" - ] - } + "description": "" }, "response": [] }, @@ -1328,17 +1236,17 @@ { "listen": "test", "script": { - "id": "e2ba26ca-a34f-495a-a761-112e1ca15993", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 401\", function () {", " pm.response.to.have.status(401);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/{{COPILOT_RESOURCE_ROLE_ID}}", "method": "PUT", "header": [ { @@ -1361,16 +1269,7 @@ "mode": "raw", "raw": "{\n\t\"name\": \"failure\",\n\t\"fullReadAccess\": true,\n \"fullWriteAccess\": false,\n\t\"isActive\": true,\n\t\"selfObtainable\": false\n}" }, - "url": { - "raw": "{{URL}}/resource-roles/{{COPILOT_RESOURCE_ROLE_ID}}", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "{{COPILOT_RESOURCE_ROLE_ID}}" - ] - } + "description": "" }, "response": [] }, @@ -1380,17 +1279,17 @@ { "listen": "test", "script": { - "id": "aef5f4e1-97f7-4df8-8c63-42b752591e98", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 403\", function () {", " pm.response.to.have.status(403);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/{{COPILOT_RESOURCE_ROLE_ID}}", "method": "PUT", "header": [ { @@ -1413,16 +1312,7 @@ "mode": "raw", "raw": "{\n\t\"name\": \"failure\",\n\t\"fullReadAccess\": true,\n \"fullWriteAccess\": false,\n\t\"isActive\": true,\n\t\"selfObtainable\": false\n}" }, - "url": { - "raw": "{{URL}}/resource-roles/{{COPILOT_RESOURCE_ROLE_ID}}", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "{{COPILOT_RESOURCE_ROLE_ID}}" - ] - } + "description": "" }, "response": [] }, @@ -1432,17 +1322,17 @@ { "listen": "test", "script": { - "id": "2a44cc37-f3f0-491f-bd01-385744b8a695", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 403\", function () {", " pm.response.to.have.status(403);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/{{COPILOT_RESOURCE_ROLE_ID}}", "method": "PUT", "header": [ { @@ -1465,16 +1355,7 @@ "mode": "raw", "raw": "{\n\t\"name\": \"failure\",\n\t\"fullReadAccess\": true,\n \"fullWriteAccess\": false,\n\t\"isActive\": true,\n\t\"selfObtainable\": false\n}" }, - "url": { - "raw": "{{URL}}/resource-roles/{{COPILOT_RESOURCE_ROLE_ID}}", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "{{COPILOT_RESOURCE_ROLE_ID}}" - ] - } + "description": "" }, "response": [] }, @@ -1484,17 +1365,17 @@ { "listen": "test", "script": { - "id": "769cb23d-00ba-4f7d-9835-5a84db507f32", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 404\", function () {", " pm.response.to.have.status(404);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/{{CHALLENGE_ID}}", "method": "PUT", "header": [ { @@ -1517,16 +1398,7 @@ "mode": "raw", "raw": "{\n\t\"name\": \"failure-test\",\n\t\"fullReadAccess\": true,\n \"fullWriteAccess\": false,\n\t\"isActive\": true,\n\t\"selfObtainable\": false\n}" }, - "url": { - "raw": "{{URL}}/resource-roles/{{CHALLENGE_ID}}", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "{{CHALLENGE_ID}}" - ] - } + "description": "" }, "response": [] }, @@ -1536,17 +1408,17 @@ { "listen": "test", "script": { - "id": "467fbd81-2923-466d-906e-786ac09f9257", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 409\", function () {", " pm.response.to.have.status(409);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/{{COPILOT_RESOURCE_ROLE_ID}}", "method": "PUT", "header": [ { @@ -1569,16 +1441,7 @@ "mode": "raw", "raw": "{\n\t\"name\": \"SUBMITTER\",\n\t\"fullReadAccess\": true,\n \"fullWriteAccess\": false,\n\t\"isActive\": true,\n\t\"selfObtainable\": false\n}" }, - "url": { - "raw": "{{URL}}/resource-roles/{{COPILOT_RESOURCE_ROLE_ID}}", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "{{COPILOT_RESOURCE_ROLE_ID}}" - ] - } + "description": "" }, "response": [] }, @@ -1588,17 +1451,17 @@ { "listen": "test", "script": { - "id": "953ce406-a554-4710-87fa-dd1a6e691fe7", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/{{COPILOT_RESOURCE_ROLE_ID}}", "method": "PUT", "header": [ { @@ -1621,16 +1484,7 @@ "mode": "raw", "raw": "{\n\t\"name\": \"UPDATE-CO-PILOT\",\n\t\"fullReadAccess\": true,\n \"fullWriteAccess\": true,\n\t\"isActive\": true,\n\t\"selfObtainable\": false\n}" }, - "url": { - "raw": "{{URL}}/resource-roles/{{COPILOT_RESOURCE_ROLE_ID}}", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "{{COPILOT_RESOURCE_ROLE_ID}}" - ] - } + "description": "" }, "response": [] }, @@ -1640,17 +1494,17 @@ { "listen": "test", "script": { - "id": "5e3f7f7d-1176-4231-862d-be65b18c0d67", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/{{COPILOT_RESOURCE_ROLE_ID}}", "method": "PUT", "header": [ { @@ -1673,31 +1527,22 @@ "mode": "raw", "raw": "{\n\t\"name\": \"CO-PILOT\",\n\t\"fullReadAccess\": true,\n \"fullWriteAccess\": true,\n\t\"isActive\": true,\n\t\"selfObtainable\": false\n}" }, - "url": { - "raw": "{{URL}}/resource-roles/{{COPILOT_RESOURCE_ROLE_ID}}", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "{{COPILOT_RESOURCE_ROLE_ID}}" - ] - } + "description": "" }, "response": [] } ], - "protocolProfileBehavior": {}, "_postman_isSubFolder": true } - ], - "protocolProfileBehavior": {} + ] }, { "name": "Resource Role Phase Dependencies", + "description": "", "item": [ { "name": "create dependency", + "description": "", "item": [ { "name": "create dependency by admin", @@ -1705,18 +1550,18 @@ { "listen": "test", "script": { - "id": "3ba3a204-2ad3-4736-ac77-aa8bafd02512", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", " pm.environment.set(\"DEPENDENCY_ID_1\", pm.response.json().id);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/Phase-dependencies", "method": "POST", "header": [ { @@ -1740,16 +1585,7 @@ "mode": "raw", "raw": "{\n\t\"phaseId\": \"{{PHASE_ID}}\",\n\t\"resourceRoleId\": \"{{COPILOT_RESOURCE_ROLE_ID}}\",\n\t\"phaseState\": false\n}" }, - "url": { - "raw": "{{URL}}/resource-roles/Phase-dependencies", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "Phase-dependencies" - ] - } + "description": "" }, "response": [] }, @@ -1759,18 +1595,18 @@ { "listen": "test", "script": { - "id": "fcc7f082-66fa-4f7a-98be-765e099fa571", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", " pm.environment.set(\"DEPENDENCY_ID_2\", pm.response.json().id);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/Phase-dependencies", "method": "POST", "header": [ { @@ -1794,16 +1630,7 @@ "mode": "raw", "raw": "{\n\t\"phaseId\": \"{{PHASE_ID}}\",\n\t\"resourceRoleId\": \"{{SUBMITTER_RESOURCE_ROLE_ID}}\",\n\t\"phaseState\": true\n}" }, - "url": { - "raw": "{{URL}}/resource-roles/Phase-dependencies", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "Phase-dependencies" - ] - } + "description": "" }, "response": [] }, @@ -1813,17 +1640,17 @@ { "listen": "test", "script": { - "id": "875ef910-a757-480c-ad83-51bea42bc8c0", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 404\", function () {", " pm.response.to.have.status(404);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/Phase-dependencies", "method": "POST", "header": [ { @@ -1847,16 +1674,7 @@ "mode": "raw", "raw": "{\n\t\"phaseId\": \"{{SUBMITTER_RESOURCE_ROLE_ID}}\",\n\t\"resourceRoleId\": \"{{SUBMITTER_RESOURCE_ROLE_ID}}\",\n\t\"phaseState\": false\n}" }, - "url": { - "raw": "{{URL}}/resource-roles/Phase-dependencies", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "Phase-dependencies" - ] - } + "description": "" }, "response": [] }, @@ -1866,17 +1684,17 @@ { "listen": "test", "script": { - "id": "f589c0b3-a174-47ab-a60a-cbbbd3ed5139", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 409\", function () {", " pm.response.to.have.status(409);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/Phase-dependencies", "method": "POST", "header": [ { @@ -1900,16 +1718,7 @@ "mode": "raw", "raw": "{\n\t\"phaseId\": \"{{PHASE_ID}}\",\n\t\"resourceRoleId\": \"{{SUBMITTER_RESOURCE_ROLE_ID}}\",\n\t\"phaseState\": false\n}" }, - "url": { - "raw": "{{URL}}/resource-roles/Phase-dependencies", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "Phase-dependencies" - ] - } + "description": "" }, "response": [] }, @@ -1919,17 +1728,17 @@ { "listen": "test", "script": { - "id": "0d5e34a1-2ec0-4648-800d-f464ba1c895a", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 403\", function () {", " pm.response.to.have.status(403);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/Phase-dependencies", "method": "POST", "header": [ { @@ -1953,16 +1762,7 @@ "mode": "raw", "raw": "{\n\t\"phaseId\": \"{{PHASE_ID}}\",\n\t\"resourceRoleId\": \"{{SUBMITTER_RESOURCE_ROLE_ID}}\",\n\t\"phaseState\": false\n}" }, - "url": { - "raw": "{{URL}}/resource-roles/Phase-dependencies", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "Phase-dependencies" - ] - } + "description": "" }, "response": [] }, @@ -1972,17 +1772,17 @@ { "listen": "test", "script": { - "id": "6323fd61-600b-4d4e-b07f-4afe417ec4b3", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 401\", function () {", " pm.response.to.have.status(401);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/Phase-dependencies", "method": "POST", "header": [ { @@ -2006,16 +1806,7 @@ "mode": "raw", "raw": "{\n\t\"phaseId\": \"{{PHASE_ID}}\",\n\t\"resourceRoleId\": \"{{SUBMITTER_RESOURCE_ROLE_ID}}\",\n\t\"phaseState\": false\n}" }, - "url": { - "raw": "{{URL}}/resource-roles/Phase-dependencies", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "Phase-dependencies" - ] - } + "description": "" }, "response": [] }, @@ -2025,17 +1816,17 @@ { "listen": "test", "script": { - "id": "79ddb7af-142a-4c36-ba26-e04a3e1a67b9", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 401\", function () {", " pm.response.to.have.status(401);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/Phase-dependencies", "method": "POST", "header": [ { @@ -2054,16 +1845,7 @@ "mode": "raw", "raw": "{\n\t\"phaseId\": \"{{PHASE_ID}}\",\n\t\"resourceRoleId\": \"{{SUBMITTER_RESOURCE_ROLE_ID}}\",\n\t\"phaseState\": false\n}" }, - "url": { - "raw": "{{URL}}/resource-roles/Phase-dependencies", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "Phase-dependencies" - ] - } + "description": "" }, "response": [] }, @@ -2073,17 +1855,17 @@ { "listen": "test", "script": { - "id": "04c35650-71ef-4f62-aae6-bea3bb9443e4", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/Phase-dependencies", "method": "POST", "header": [ { @@ -2107,47 +1889,16 @@ "mode": "raw", "raw": "{\n\t\"phaseId\": \"abc\",\n\t\"resourceRoleId\": \"{{SUBMITTER_RESOURCE_ROLE_ID}}\",\n\t\"phaseState\": false\n}" }, - "url": { - "raw": "{{URL}}/resource-roles/Phase-dependencies", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "Phase-dependencies" - ] - } + "description": "" }, "response": [] } ], - "event": [ - { - "listen": "prerequest", - "script": { - "id": "76f81880-36b0-409e-8c0e-ff688e76e180", - "type": "text/javascript", - "exec": [ - "" - ] - } - }, - { - "listen": "test", - "script": { - "id": "cd550f97-32d2-4220-8441-b10213cefa3f", - "type": "text/javascript", - "exec": [ - "" - ] - } - } - ], - "protocolProfileBehavior": {}, "_postman_isSubFolder": true }, { "name": "get dependencies", + "description": "", "item": [ { "name": "get all dependencies", @@ -2155,17 +1906,17 @@ { "listen": "test", "script": { - "id": "20bd39d1-eef6-41f9-9655-ce00a225c9e8", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/Phase-dependencies", "method": "GET", "header": [ { @@ -2184,16 +1935,11 @@ "value": "Bearer {{admin_token}}" } ], - "url": { - "raw": "{{URL}}/resource-roles/Phase-dependencies", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "Phase-dependencies" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, @@ -2203,35 +1949,16 @@ { "listen": "test", "script": { - "id": "7990a99d-2c13-40e1-9753-5ea49dec2d0f", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { - "method": "GET", - "header": [ - { - "key": "Accept", - "type": "text", - "value": "application/json" - }, - { - "key": "Content-Type", - "type": "text", - "value": "application/json" - }, - { - "key": "Authorization", - "type": "text", - "value": "Bearer {{m2m_read_token}}" - } - ], "url": { "raw": "{{URL}}/resource-roles/Phase-dependencies?phaseId={{PHASE_ID}}&resourceRoleId={{SUBMITTER_RESOURCE_ROLE_ID}}&phaseState=false", "host": [ @@ -2254,28 +1981,9 @@ "key": "phaseState", "value": "false" } - ] - } - }, - "response": [] - }, - { - "name": "failure - get dependencies with invalid query 400", - "event": [ - { - "listen": "test", - "script": { - "id": "0a297dcd-5ba0-41ec-bafd-ed20bdeb6ea3", - "exec": [ - "pm.test(\"Status code is 400\", function () {", - " pm.response.to.have.status(400);", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { + ], + "variable": [] + }, "method": "GET", "header": [ { @@ -2294,6 +2002,30 @@ "value": "Bearer {{m2m_read_token}}" } ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" + }, + "response": [] + }, + { + "name": "failure - get dependencies with invalid query 400", + "event": [ + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "pm.test(\"Status code is 400\", function () {", + " pm.response.to.have.status(400);", + "});" + ] + } + } + ], + "request": { "url": { "raw": "{{URL}}/resource-roles/Phase-dependencies?phaseId=abc&resourceRoleId=123&phaseState=abc", "host": [ @@ -2316,8 +2048,32 @@ "key": "phaseState", "value": "abc" } - ] - } + ], + "variable": [] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{m2m_read_token}}" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, @@ -2327,17 +2083,17 @@ { "listen": "test", "script": { - "id": "dc4537d7-ec80-47d2-9722-5c5061610ce1", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 403\", function () {", " pm.response.to.have.status(403);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/Phase-dependencies", "method": "GET", "header": [ { @@ -2356,16 +2112,11 @@ "value": "Bearer {{m2m_modify_token}}" } ], - "url": { - "raw": "{{URL}}/resource-roles/Phase-dependencies", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "Phase-dependencies" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, @@ -2375,17 +2126,17 @@ { "listen": "test", "script": { - "id": "1edea7c1-c521-472c-83f6-240e0d86ff7c", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 403\", function () {", " pm.response.to.have.status(403);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/Phase-dependencies", "method": "GET", "header": [ { @@ -2404,47 +2155,20 @@ "value": "Bearer {{user1_token}}" } ], - "url": { - "raw": "{{URL}}/resource-roles/Phase-dependencies", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "Phase-dependencies" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] } ], - "event": [ - { - "listen": "prerequest", - "script": { - "id": "b0ebe117-ff1b-40d4-964e-79edf475de13", - "type": "text/javascript", - "exec": [ - "" - ] - } - }, - { - "listen": "test", - "script": { - "id": "60578d7d-f1cd-47ab-b57d-b0b8ac2da0eb", - "type": "text/javascript", - "exec": [ - "" - ] - } - } - ], - "protocolProfileBehavior": {}, "_postman_isSubFolder": true }, { "name": "update dependency", + "description": "", "item": [ { "name": "update dependency via admin", @@ -2452,17 +2176,17 @@ { "listen": "test", "script": { - "id": "9939790a-9331-47c0-ad48-859247bf5174", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/Phase-dependencies/{{DEPENDENCY_ID_1}}", "method": "PUT", "header": [ { @@ -2485,17 +2209,7 @@ "mode": "raw", "raw": "{\n\t\"phaseId\": \"{{PHASE_ID}}\",\n\t\"resourceRoleId\": \"{{COPILOT_RESOURCE_ROLE_ID}}\",\n\t\"phaseState\": true\n}" }, - "url": { - "raw": "{{URL}}/resource-roles/Phase-dependencies/{{DEPENDENCY_ID_1}}", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "Phase-dependencies", - "{{DEPENDENCY_ID_1}}" - ] - } + "description": "" }, "response": [] }, @@ -2505,17 +2219,17 @@ { "listen": "test", "script": { - "id": "a52a3d60-6d4a-468b-a483-759038cbd93e", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/Phase-dependencies/{{DEPENDENCY_ID_1}}", "method": "PUT", "header": [ { @@ -2538,17 +2252,7 @@ "mode": "raw", "raw": "{\n\t\"phaseId\": \"{{PHASE_ID}}\",\n\t\"resourceRoleId\": \"{{COPILOT_RESOURCE_ROLE_ID}}\",\n\t\"phaseState\": false\n}" }, - "url": { - "raw": "{{URL}}/resource-roles/Phase-dependencies/{{DEPENDENCY_ID_1}}", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "Phase-dependencies", - "{{DEPENDENCY_ID_1}}" - ] - } + "description": "" }, "response": [] }, @@ -2558,17 +2262,17 @@ { "listen": "test", "script": { - "id": "5047d51e-4848-4395-8487-222a2281d277", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 404\", function () {", " pm.response.to.have.status(404);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/Phase-dependencies/{{DEPENDENCY_ID_1}}", "method": "PUT", "header": [ { @@ -2591,17 +2295,7 @@ "mode": "raw", "raw": "{\n\t\"phaseId\": \"{{PHASE_ID}}\",\n\t\"resourceRoleId\": \"{{DEPENDENCY_ID_2}}\",\n\t\"phaseState\": false\n}" }, - "url": { - "raw": "{{URL}}/resource-roles/Phase-dependencies/{{DEPENDENCY_ID_1}}", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "Phase-dependencies", - "{{DEPENDENCY_ID_1}}" - ] - } + "description": "" }, "response": [] }, @@ -2611,17 +2305,17 @@ { "listen": "test", "script": { - "id": "20185088-dc5e-4a27-bd2a-54287f754470", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 404\", function () {", " pm.response.to.have.status(404);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/Phase-dependencies/{{COPILOT_RESOURCE_ROLE_ID}}", "method": "PUT", "header": [ { @@ -2644,17 +2338,7 @@ "mode": "raw", "raw": "{\n\t\"phaseId\": \"{{PHASE_ID}}\",\n\t\"resourceRoleId\": \"{{COPILOT_RESOURCE_ROLE_ID}}\",\n\t\"phaseState\": false\n}" }, - "url": { - "raw": "{{URL}}/resource-roles/Phase-dependencies/{{COPILOT_RESOURCE_ROLE_ID}}", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "Phase-dependencies", - "{{COPILOT_RESOURCE_ROLE_ID}}" - ] - } + "description": "" }, "response": [] }, @@ -2664,17 +2348,17 @@ { "listen": "test", "script": { - "id": "c6179d10-63ca-4391-814f-53512458cd7e", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/Phase-dependencies/{{DEPENDENCY_ID_1}}", "method": "PUT", "header": [ { @@ -2697,17 +2381,7 @@ "mode": "raw", "raw": "{\n\t\"resourceRoleId\": \"{{COPILOT_RESOURCE_ROLE_ID}}\",\n\t\"phaseState\": false\n}" }, - "url": { - "raw": "{{URL}}/resource-roles/Phase-dependencies/{{DEPENDENCY_ID_1}}", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "Phase-dependencies", - "{{DEPENDENCY_ID_1}}" - ] - } + "description": "" }, "response": [] }, @@ -2717,17 +2391,17 @@ { "listen": "test", "script": { - "id": "98f78bed-3e9c-42c9-8534-72f0cd043692", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 403\", function () {", " pm.response.to.have.status(403);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/Phase-dependencies/{{DEPENDENCY_ID_1}}", "method": "PUT", "header": [ { @@ -2750,48 +2424,16 @@ "mode": "raw", "raw": "{\n\t\"phaseId\": \"{{PHASE_ID}}\",\n\t\"resourceRoleId\": \"{{COPILOT_RESOURCE_ROLE_ID}}\",\n\t\"phaseState\": false\n}" }, - "url": { - "raw": "{{URL}}/resource-roles/Phase-dependencies/{{DEPENDENCY_ID_1}}", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "Phase-dependencies", - "{{DEPENDENCY_ID_1}}" - ] - } + "description": "" }, "response": [] } ], - "event": [ - { - "listen": "prerequest", - "script": { - "id": "cf487aa9-93b4-4cfc-b4e9-810881d1aeaf", - "type": "text/javascript", - "exec": [ - "" - ] - } - }, - { - "listen": "test", - "script": { - "id": "2a201a9a-c917-41d4-92ce-915a7b1048e2", - "type": "text/javascript", - "exec": [ - "" - ] - } - } - ], - "protocolProfileBehavior": {}, "_postman_isSubFolder": true }, { "name": "delete dependency", + "description": "", "item": [ { "name": "delete dependency via admin", @@ -2799,17 +2441,17 @@ { "listen": "test", "script": { - "id": "44b6b67a-76fe-4ad8-aa6a-760ee8937eb1", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/Phase-dependencies/{{DEPENDENCY_ID_1}}", "method": "DELETE", "header": [ { @@ -2832,17 +2474,7 @@ "mode": "raw", "raw": "" }, - "url": { - "raw": "{{URL}}/resource-roles/Phase-dependencies/{{DEPENDENCY_ID_1}}", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "Phase-dependencies", - "{{DEPENDENCY_ID_1}}" - ] - } + "description": "" }, "response": [] }, @@ -2852,17 +2484,17 @@ { "listen": "test", "script": { - "id": "44058474-d0b2-4604-98d5-839ec3c99065", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/Phase-dependencies/{{DEPENDENCY_ID_2}}", "method": "DELETE", "header": [ { @@ -2885,17 +2517,7 @@ "mode": "raw", "raw": "" }, - "url": { - "raw": "{{URL}}/resource-roles/Phase-dependencies/{{DEPENDENCY_ID_2}}", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "Phase-dependencies", - "{{DEPENDENCY_ID_2}}" - ] - } + "description": "" }, "response": [] }, @@ -2905,17 +2527,17 @@ { "listen": "test", "script": { - "id": "ee4b409a-f523-44a1-8c04-f0d3bbb7cc5a", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 404\", function () {", " pm.response.to.have.status(404);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/Phase-dependencies/{{SUBMITTER_RESOURCE_ROLE_ID}}", "method": "DELETE", "header": [ { @@ -2938,17 +2560,7 @@ "mode": "raw", "raw": "" }, - "url": { - "raw": "{{URL}}/resource-roles/Phase-dependencies/{{SUBMITTER_RESOURCE_ROLE_ID}}", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "Phase-dependencies", - "{{SUBMITTER_RESOURCE_ROLE_ID}}" - ] - } + "description": "" }, "response": [] }, @@ -2958,17 +2570,17 @@ { "listen": "test", "script": { - "id": "4af99993-227a-4ad4-8bd5-393946f6f97e", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/Phase-dependencies/abc", "method": "DELETE", "header": [ { @@ -2991,17 +2603,7 @@ "mode": "raw", "raw": "" }, - "url": { - "raw": "{{URL}}/resource-roles/Phase-dependencies/abc", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "Phase-dependencies", - "abc" - ] - } + "description": "" }, "response": [] }, @@ -3011,17 +2613,17 @@ { "listen": "test", "script": { - "id": "556ef0ca-0c76-485e-ae10-22f83e49cf26", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 403\", function () {", " pm.response.to.have.status(403);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/Phase-dependencies/{{DEPENDENCY_ID_2}}", "method": "DELETE", "header": [ { @@ -3044,17 +2646,7 @@ "mode": "raw", "raw": "" }, - "url": { - "raw": "{{URL}}/resource-roles/Phase-dependencies/{{DEPENDENCY_ID_2}}", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "Phase-dependencies", - "{{DEPENDENCY_ID_2}}" - ] - } + "description": "" }, "response": [] }, @@ -3064,17 +2656,17 @@ { "listen": "test", "script": { - "id": "8c97f313-2c76-4bd3-8da5-fe45bf4d931c", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 403\", function () {", " pm.response.to.have.status(403);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resource-roles/Phase-dependencies/{{DEPENDENCY_ID_2}}", "method": "DELETE", "header": [ { @@ -3097,76 +2689,22 @@ "mode": "raw", "raw": "" }, - "url": { - "raw": "{{URL}}/resource-roles/Phase-dependencies/{{DEPENDENCY_ID_2}}", - "host": [ - "{{URL}}" - ], - "path": [ - "resource-roles", - "Phase-dependencies", - "{{DEPENDENCY_ID_2}}" - ] - } + "description": "" }, "response": [] } ], - "event": [ - { - "listen": "prerequest", - "script": { - "id": "b7f41473-d775-4272-9f59-d165a0727e28", - "type": "text/javascript", - "exec": [ - "" - ] - } - }, - { - "listen": "test", - "script": { - "id": "ceefc87e-8b45-4f6c-a8e2-bf40394d5edf", - "type": "text/javascript", - "exec": [ - "" - ] - } - } - ], - "protocolProfileBehavior": {}, "_postman_isSubFolder": true } - ], - "event": [ - { - "listen": "prerequest", - "script": { - "id": "6776ec77-db26-4c73-a506-33ccf8d3979c", - "type": "text/javascript", - "exec": [ - "" - ] - } - }, - { - "listen": "test", - "script": { - "id": "ce9b86a2-9e3e-4e91-a55e-29c6961bafd7", - "type": "text/javascript", - "exec": [ - "" - ] - } - } - ], - "protocolProfileBehavior": {} + ] }, { "name": "Resources", + "description": "", "item": [ { "name": "create resource", + "description": "", "item": [ { "name": "create resource by admin", @@ -3174,17 +2712,17 @@ { "listen": "test", "script": { - "id": "82ecf77b-c1ee-42ce-b521-db5b253e71e6", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "POST", "header": [ { @@ -3207,15 +2745,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"HoHoSKY\",\n\t\"roleId\": \"{{COPILOT_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -3225,17 +2755,17 @@ { "listen": "test", "script": { - "id": "6a878f42-8f78-4266-9673-922d947e0914", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "POST", "header": [ { @@ -3258,15 +2788,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"HoHoSKY\",\n\t\"roleId\": \"{{REVIEWER_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -3276,17 +2798,17 @@ { "listen": "test", "script": { - "id": "50a54b4f-0f8a-4922-9fb1-b7fbd8ab9a22", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "POST", "header": [ { @@ -3309,15 +2831,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"denis\",\n\t\"roleId\": \"{{SUBMITTER_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -3327,17 +2841,17 @@ { "listen": "test", "script": { - "id": "f6430ae0-1a8d-4b20-98b9-a9a37b05f08c", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "POST", "header": [ { @@ -3360,15 +2874,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"ghostar\",\n\t\"roleId\": \"{{SUBMITTER_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -3378,17 +2884,17 @@ { "listen": "test", "script": { - "id": "8654a3de-859b-4aae-a633-927617b49837", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "POST", "header": [ { @@ -3411,15 +2917,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{TEST_CHALLENGE_ID1}}\",\n\t\"memberHandle\": \"ghostar\",\n\t\"roleId\": \"{{REVIEWER_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -3429,17 +2927,17 @@ { "listen": "test", "script": { - "id": "1b439548-d7a0-41bd-a8f0-7270e4121c99", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "POST", "header": [ { @@ -3462,15 +2960,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{TEST_CHALLENGE_ID2}}\",\n\t\"memberHandle\": \"ghostar\",\n\t\"roleId\": \"{{REVIEWER_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -3480,17 +2970,17 @@ { "listen": "test", "script": { - "id": "e9638d12-8fa5-4fd5-9659-718da388cafc", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "POST", "header": [ { @@ -3513,15 +3003,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"ghostar\",\n\t\"roleId\": \"{{OBSERVER_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -3531,17 +3013,17 @@ { "listen": "test", "script": { - "id": "3e64615c-028d-4d56-93e1-e0336cde29ae", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "POST", "header": [ { @@ -3564,15 +3046,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"ghostar\",\n\t\"roleId\": \"{{CHALLENGE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -3582,17 +3056,17 @@ { "listen": "test", "script": { - "id": "7270766f-d8da-41f2-bd8f-67c5639c6d5d", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "POST", "header": [ { @@ -3615,15 +3089,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"invalid\",\n\t\"memberHandle\": \"ghostar\",\n\t\"roleId\": \"{{OBSERVER_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -3633,17 +3099,17 @@ { "listen": "test", "script": { - "id": "058a119b-3c7f-4560-a831-14351feb4ada", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "POST", "header": [ { @@ -3666,15 +3132,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": true,\n\t\"roleId\": \"{{OBSERVER_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -3684,17 +3142,17 @@ { "listen": "test", "script": { - "id": "221b1c28-04c9-419d-ae92-1a4de473e4bc", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "POST", "header": [ { @@ -3717,15 +3175,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"123abcx\",\n\t\"roleId\": \"{{OBSERVER_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -3735,17 +3185,17 @@ { "listen": "test", "script": { - "id": "3d5d66aa-ff8b-4e31-852d-55f311bae1f5", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 401\", function () {", " pm.response.to.have.status(401);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "POST", "header": [ { @@ -3768,15 +3218,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"tonyj\",\n\t\"roleId\": \"{{SUBMITTER_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -3786,17 +3228,17 @@ { "listen": "test", "script": { - "id": "23c90b60-0028-462a-8c36-0ea9764b4e22", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 401\", function () {", " pm.response.to.have.status(401);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "POST", "header": [ { @@ -3819,15 +3261,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"tonyj\",\n\t\"roleId\": \"{{SUBMITTER_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -3837,17 +3271,17 @@ { "listen": "test", "script": { - "id": "4f468a08-5dda-446e-b676-16774ba390b3", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 403\", function () {", " pm.response.to.have.status(403);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "POST", "header": [ { @@ -3870,15 +3304,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"tonyj\",\n\t\"roleId\": \"{{SUBMITTER_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -3888,17 +3314,17 @@ { "listen": "test", "script": { - "id": "bd11e2ac-93cb-4c31-9e57-c22fb56c685e", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 403\", function () {", " pm.response.to.have.status(403);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "POST", "header": [ { @@ -3921,15 +3347,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"tonyj\",\n\t\"roleId\": \"{{SUBMITTER_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -3939,17 +3357,17 @@ { "listen": "test", "script": { - "id": "60db2e07-51a3-4e41-bf46-b8d85a66c782", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 404\", function () {", " pm.response.to.have.status(404);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "POST", "header": [ { @@ -3972,15 +3390,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_NOT_FOUND_ID}}\",\n\t\"memberHandle\": \"ghostar\",\n\t\"roleId\": \"{{OBSERVER_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -3990,17 +3400,17 @@ { "listen": "test", "script": { - "id": "c1f1382c-7c5a-426a-9006-959eef991ba6", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 409\", function () {", " pm.response.to.have.status(409);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "POST", "header": [ { @@ -4023,15 +3433,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"HoHoSKY\",\n\t\"roleId\": \"{{COPILOT_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -4041,17 +3443,17 @@ { "listen": "test", "script": { - "id": "8b653688-eb5f-481d-89c3-c86a980adb10", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "POST", "header": [ { @@ -4074,15 +3476,7 @@ "mode": "raw", "raw": "{\n\t\"memberHandle\": \"HoHoSKY\",\n\t\"roleId\": \"{{COPILOT_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -4092,17 +3486,17 @@ { "listen": "test", "script": { - "id": "0bfa26ec-7b42-40f6-be15-69027b3cf300", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "POST", "header": [ { @@ -4125,15 +3519,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"lars2520\",\n\t\"roleId\": \"{{SUBMITTER_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -4143,17 +3529,17 @@ { "listen": "test", "script": { - "id": "fa575441-2cfa-4ba1-b250-bad44009d291", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 403\", function () {", " pm.response.to.have.status(403);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "POST", "header": [ { @@ -4176,24 +3562,16 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"thomaskranitsas\",\n\t\"roleId\": \"{{SUBMITTER_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] } ], - "protocolProfileBehavior": {}, "_postman_isSubFolder": true }, { "name": "get resources", + "description": "", "item": [ { "name": "get resources by admin", @@ -4201,17 +3579,32 @@ { "listen": "test", "script": { - "id": "984eb9d3-f950-408b-844e-61958fe69cb2", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": { + "raw": "{{URL}}/resources?challengeId={{CHALLENGE_ID}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resources" + ], + "query": [ + { + "key": "challengeId", + "value": "{{CHALLENGE_ID}}" + } + ], + "variable": [] + }, "method": "GET", "header": [ { @@ -4230,147 +3623,172 @@ "type": "text" } ], - "url": { - "raw": "{{URL}}/resources?challengeId={{CHALLENGE_ID}}", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ], - "query": [ - { - "key": "challengeId", - "value": "{{CHALLENGE_ID}}" - } - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { - "name": "get resources by user has full-access permission", + "name": "get resources by admin with member ID", "event": [ { "listen": "test", "script": { - "id": "c9eb1189-68be-4c75-9778-cec3b4cebf50", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": { + "raw": "{{URL}}/resources?challengeId={{CHALLENGE_ID}}&memberId={{MEMBER_ID}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resources" + ], + "query": [ + { + "key": "challengeId", + "value": "{{CHALLENGE_ID}}", + "equals": true, + "description": "" + }, + { + "key": "memberId", + "value": "{{MEMBER_ID}}", + "equals": true, + "description": "" + } + ], + "variable": [] + }, "method": "GET", "header": [ { "key": "Accept", - "type": "text", - "value": "application/json" + "value": "application/json", + "description": "" }, { "key": "Content-Type", - "type": "text", - "value": "application/json" + "value": "application/json", + "description": "" }, { "key": "Authorization", - "type": "text", - "value": "Bearer {{user2_token}}" + "value": "Bearer {{admin_token}}", + "description": "" } ], - "url": { - "raw": "{{URL}}/resources?challengeId={{CHALLENGE_ID}}", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ], - "query": [ - { - "key": "challengeId", - "value": "{{CHALLENGE_ID}}" - } - ] - } + "body": {}, + "description": "" }, "response": [] }, { - "name": "get resources using m2m token", + "name": "get resources by admin with member handle", "event": [ { "listen": "test", "script": { - "id": "cfdb716a-9cd6-4147-8a8a-7178582578af", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": { + "raw": "{{URL}}/resources?challengeId={{CHALLENGE_ID}}&memberHandle={{MEMBER_HANDLE}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resources" + ], + "query": [ + { + "key": "challengeId", + "value": "{{CHALLENGE_ID}}", + "equals": true, + "description": "" + }, + { + "key": "memberHandle", + "value": "{{MEMBER_HANDLE}}", + "equals": true, + "description": "" + } + ], + "variable": [] + }, "method": "GET", "header": [ { "key": "Accept", - "type": "text", - "value": "application/json" + "value": "application/json", + "description": "" }, { "key": "Content-Type", - "type": "text", - "value": "application/json" + "value": "application/json", + "description": "" }, { "key": "Authorization", - "type": "text", - "value": "Bearer {{m2m_read_token}}" + "value": "Bearer {{admin_token}}", + "description": "" } ], - "url": { - "raw": "{{URL}}/resources?challengeId={{CHALLENGE_ID}}", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ], - "query": [ - { - "key": "challengeId", - "value": "{{CHALLENGE_ID}}" - } - ] - } + "body": {}, + "description": "" }, "response": [] }, { - "name": "failure - get resources invalid challenge id 400", + "name": "get resources by user has full-access permission", "event": [ { "listen": "test", "script": { - "id": "621032e7-dccb-4573-a6ad-06fc24491780", + "type": "text/javascript", "exec": [ - "pm.test(\"Status code is 400\", function () {", - " pm.response.to.have.status(400);", + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": { + "raw": "{{URL}}/resources?challengeId={{CHALLENGE_ID}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resources" + ], + "query": [ + { + "key": "challengeId", + "value": "{{CHALLENGE_ID}}" + } + ], + "variable": [] + }, "method": "GET", "header": [ { @@ -4386,64 +3804,98 @@ { "key": "Authorization", "type": "text", - "value": "Bearer {{admin_token}}" + "value": "Bearer {{user2_token}}" } ], - "url": { - "raw": "{{URL}}/resources?challengeId=invalid", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ], - "query": [ - { - "key": "challengeId", - "value": "invalid" - } - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { - "name": "failure - get resources using invalid token 401", + "name": "get resources by user has full-access permission with member ID", "event": [ { "listen": "test", "script": { - "id": "57037df4-c094-4c9d-97c3-93b4ff319ad2", + "type": "text/javascript", "exec": [ - "pm.test(\"Status code is 401\", function () {", - " pm.response.to.have.status(401);", + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": { + "raw": "{{URL}}/resources?challengeId={{CHALLENGE_ID}}&memberId={{MEMBER_ID}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resources" + ], + "query": [ + { + "key": "challengeId", + "value": "{{CHALLENGE_ID}}", + "equals": true, + "description": "" + }, + { + "key": "memberId", + "value": "{{MEMBER_ID}}", + "equals": true, + "description": "" + } + ], + "variable": [] + }, "method": "GET", "header": [ { "key": "Accept", - "type": "text", - "value": "application/json" + "value": "application/json", + "description": "" }, { "key": "Content-Type", - "type": "text", - "value": "application/json" + "value": "application/json", + "description": "" }, { "key": "Authorization", - "type": "text", - "value": "Bearer invalid" + "value": "Bearer {{user2_token}}", + "description": "" } ], + "body": {}, + "description": "" + }, + "response": [] + }, + { + "name": "get resources by user has full-access permission with member handle", + "event": [ + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});" + ] + } + } + ], + "request": { "url": { - "raw": "{{URL}}/resources?challengeId={{CHALLENGE_ID}}", + "raw": "{{URL}}/resources?challengeId={{CHALLENGE_ID}}&memberHandle={{MEMBER_HANDLE}}", "host": [ "{{URL}}" ], @@ -4453,30 +3905,74 @@ "query": [ { "key": "challengeId", - "value": "{{CHALLENGE_ID}}" + "value": "{{CHALLENGE_ID}}", + "equals": true, + "description": "" + }, + { + "key": "memberHandle", + "value": "{{MEMBER_HANDLE}}", + "equals": true, + "description": "" } - ] - } + ], + "variable": [] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json", + "description": "" + }, + { + "key": "Content-Type", + "value": "application/json", + "description": "" + }, + { + "key": "Authorization", + "value": "Bearer {{user2_token}}", + "description": "" + } + ], + "body": {}, + "description": "" }, "response": [] }, { - "name": "failure - get resources using expire token 401", + "name": "get resources using m2m token", "event": [ { "listen": "test", "script": { - "id": "21fce931-9840-4ab6-9f21-929a52e372dd", + "type": "text/javascript", "exec": [ - "pm.test(\"Status code is 401\", function () {", - " pm.response.to.have.status(401);", + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": { + "raw": "{{URL}}/resources?challengeId={{CHALLENGE_ID}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resources" + ], + "query": [ + { + "key": "challengeId", + "value": "{{CHALLENGE_ID}}" + } + ], + "variable": [] + }, "method": "GET", "header": [ { @@ -4492,11 +3988,35 @@ { "key": "Authorization", "type": "text", - "value": "Bearer {{expire_token}}" + "value": "Bearer {{m2m_read_token}}" } ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" + }, + "response": [] + }, + { + "name": "get resources using m2m token with member ID", + "event": [ + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});" + ] + } + } + ], + "request": { "url": { - "raw": "{{URL}}/resources?challengeId={{CHALLENGE_ID}}", + "raw": "{{URL}}/resources?challengeId={{CHALLENGE_ID}}&memberId={{MEMBER_ID}}", "host": [ "{{URL}}" ], @@ -4506,30 +4026,137 @@ "query": [ { "key": "challengeId", - "value": "{{CHALLENGE_ID}}" + "value": "{{CHALLENGE_ID}}", + "equals": true, + "description": "" + }, + { + "key": "memberId", + "value": "{{MEMBER_ID}}", + "equals": true, + "description": "" } - ] + ], + "variable": [] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json", + "description": "" + }, + { + "key": "Content-Type", + "value": "application/json", + "description": "" + }, + { + "key": "Authorization", + "value": "Bearer {{m2m_read_token}}", + "description": "" + } + ], + "body": {}, + "description": "" + }, + "response": [] + }, + { + "name": "get resources using m2m token with member handle", + "event": [ + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});" + ] + } } + ], + "request": { + "url": { + "raw": "{{URL}}/resources?challengeId={{CHALLENGE_ID}}&memberHandle={{MEMBER_HANDLE}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resources" + ], + "query": [ + { + "key": "challengeId", + "value": "{{CHALLENGE_ID}}", + "equals": true, + "description": "" + }, + { + "key": "memberHandle", + "value": "{{MEMBER_HANDLE}}", + "equals": true, + "description": "" + } + ], + "variable": [] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json", + "description": "" + }, + { + "key": "Content-Type", + "value": "application/json", + "description": "" + }, + { + "key": "Authorization", + "value": "Bearer {{m2m_read_token}}", + "description": "" + } + ], + "body": {}, + "description": "" }, "response": [] }, { - "name": "failure - get resources by user without full-access permission 403", + "name": "failure - get resources invalid challenge id 400", "event": [ { "listen": "test", "script": { - "id": "42e3821e-890e-434e-a8ae-1d2ef6ee1eb7", + "type": "text/javascript", "exec": [ - "pm.test(\"Status code is 403\", function () {", - " pm.response.to.have.status(403);", + "pm.test(\"Status code is 400\", function () {", + " pm.response.to.have.status(400);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": { + "raw": "{{URL}}/resources?challengeId=invalid", + "host": [ + "{{URL}}" + ], + "path": [ + "resources" + ], + "query": [ + { + "key": "challengeId", + "value": "invalid" + } + ], + "variable": [] + }, "method": "GET", "header": [ { @@ -4545,9 +4172,33 @@ { "key": "Authorization", "type": "text", - "value": "Bearer {{user1_token}}" + "value": "Bearer {{admin_token}}" } ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" + }, + "response": [] + }, + { + "name": "failure - get resources using invalid token 401", + "event": [ + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "pm.test(\"Status code is 401\", function () {", + " pm.response.to.have.status(401);", + "});" + ] + } + } + ], + "request": { "url": { "raw": "{{URL}}/resources?challengeId={{CHALLENGE_ID}}", "host": [ @@ -4561,28 +4212,67 @@ "key": "challengeId", "value": "{{CHALLENGE_ID}}" } - ] - } + ], + "variable": [] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer invalid" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { - "name": "failure - get resources using invalid m2m token 403", + "name": "failure - get resources using expire token 401", "event": [ { "listen": "test", "script": { - "id": "718634b1-7557-4fcb-932f-3413858e84ef", + "type": "text/javascript", "exec": [ - "pm.test(\"Status code is 403\", function () {", - " pm.response.to.have.status(403);", + "pm.test(\"Status code is 401\", function () {", + " pm.response.to.have.status(401);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": { + "raw": "{{URL}}/resources?challengeId={{CHALLENGE_ID}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resources" + ], + "query": [ + { + "key": "challengeId", + "value": "{{CHALLENGE_ID}}" + } + ], + "variable": [] + }, "method": "GET", "header": [ { @@ -4598,9 +4288,33 @@ { "key": "Authorization", "type": "text", - "value": "Bearer {{m2m_modify_token}}" + "value": "Bearer {{expire_token}}" } ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" + }, + "response": [] + }, + { + "name": "failure - get resources by user without full-access permission 403", + "event": [ + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "pm.test(\"Status code is 403\", function () {", + " pm.response.to.have.status(403);", + "});" + ] + } + } + ], + "request": { "url": { "raw": "{{URL}}/resources?challengeId={{CHALLENGE_ID}}", "host": [ @@ -4614,28 +4328,67 @@ "key": "challengeId", "value": "{{CHALLENGE_ID}}" } - ] - } + ], + "variable": [] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{user1_token}}" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { - "name": "failure - get resources challenge not found 404", + "name": "failure - get resources using invalid m2m token 403", "event": [ { "listen": "test", "script": { - "id": "0f06b26b-4630-472a-a6f2-9984f4c9d061", + "type": "text/javascript", "exec": [ - "pm.test(\"Status code is 404\", function () {", - " pm.response.to.have.status(404);", + "pm.test(\"Status code is 403\", function () {", + " pm.response.to.have.status(403);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": { + "raw": "{{URL}}/resources?challengeId={{CHALLENGE_ID}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resources" + ], + "query": [ + { + "key": "challengeId", + "value": "{{CHALLENGE_ID}}" + } + ], + "variable": [] + }, "method": "GET", "header": [ { @@ -4651,9 +4404,33 @@ { "key": "Authorization", "type": "text", - "value": "Bearer {{admin_token}}" + "value": "Bearer {{m2m_modify_token}}" } ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" + }, + "response": [] + }, + { + "name": "failure - get resources challenge not found 404", + "event": [ + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "pm.test(\"Status code is 404\", function () {", + " pm.response.to.have.status(404);", + "});" + ] + } + } + ], + "request": { "url": { "raw": "{{URL}}/resources?challengeId={{CHALLENGE_NOT_FOUND_ID}}", "host": [ @@ -4667,8 +4444,32 @@ "key": "challengeId", "value": "{{CHALLENGE_NOT_FOUND_ID}}" } - ] - } + ], + "variable": [] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{admin_token}}" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, @@ -4678,17 +4479,17 @@ { "listen": "test", "script": { - "id": "b946d6f6-45da-4517-a898-c0e1d5ee2284", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "GET", "header": [ { @@ -4707,24 +4508,20 @@ "value": "Bearer {{admin_token}}" } ], - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] } ], - "protocolProfileBehavior": {}, "_postman_isSubFolder": true }, { "name": "list challenge by member", + "description": "", "item": [ { "name": "get challenges hohosky can access", @@ -4732,17 +4529,17 @@ { "listen": "test", "script": { - "id": "e9a08004-e1b8-4ba2-81ab-bb816f36a2ec", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources/16096823/challenges", "method": "GET", "header": [ { @@ -4763,17 +4560,11 @@ "disabled": true } ], - "url": { - "raw": "{{URL}}/resources/16096823/challenges", - "host": [ - "{{URL}}" - ], - "path": [ - "resources", - "16096823", - "challenges" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, @@ -4783,17 +4574,17 @@ { "listen": "test", "script": { - "id": "a2cf4848-a8e0-466c-a9d7-68a5f1cfaf42", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources/151743/challenges", "method": "GET", "header": [ { @@ -4820,17 +4611,11 @@ "type": "text" } ], - "url": { - "raw": "{{URL}}/resources/151743/challenges", - "host": [ - "{{URL}}" - ], - "path": [ - "resources", - "151743", - "challenges" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, @@ -4840,17 +4625,39 @@ { "listen": "test", "script": { - "id": "8c970a0e-3bf3-4b2d-8316-e49db5f380a8", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": { + "raw": "{{URL}}/resources/151743/challenges?resourceRoleId={{REVIEWER_RESOURCE_ROLE_ID}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resources", + "151743", + "challenges" + ], + "query": [ + { + "key": "resourceRoleId", + "value": "{{REVIEWER_RESOURCE_ROLE_ID}}" + }, + { + "key": "resourceRoleId", + "value": "{{SUBMITTER_RESOURCE_ROLE_ID}}", + "disabled": true + } + ], + "variable": [] + }, "method": "GET", "header": [ { @@ -4877,28 +4684,11 @@ "disabled": true } ], - "url": { - "raw": "{{URL}}/resources/151743/challenges?resourceRoleId={{REVIEWER_RESOURCE_ROLE_ID}}", - "host": [ - "{{URL}}" - ], - "path": [ - "resources", - "151743", - "challenges" - ], - "query": [ - { - "key": "resourceRoleId", - "value": "{{REVIEWER_RESOURCE_ROLE_ID}}" - }, - { - "key": "resourceRoleId", - "value": "{{SUBMITTER_RESOURCE_ROLE_ID}}", - "disabled": true - } - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, @@ -4908,17 +4698,17 @@ { "listen": "test", "script": { - "id": "fc215944-5683-4ba1-a696-e2a3f5b310de", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources/111111111/challenges", "method": "GET", "header": [ { @@ -4927,17 +4717,11 @@ "value": "Bearer {{m2m_all_token}}" } ], - "url": { - "raw": "{{URL}}/resources/111111111/challenges", - "host": [ - "{{URL}}" - ], - "path": [ - "resources", - "111111111", - "challenges" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, @@ -4947,25 +4731,16 @@ { "listen": "test", "script": { - "id": "3c4b9772-5cfa-4d8d-ac17-568245390248", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { - "method": "GET", - "header": [ - { - "key": "Authorization", - "type": "text", - "value": "Bearer {{m2m_read_token}}" - } - ], "url": { "raw": "{{URL}}/resources/151743/challenges?resourceRoleId={{TEST_CHALLENGE_ID1}}", "host": [ @@ -4981,8 +4756,22 @@ "key": "resourceRoleId", "value": "{{TEST_CHALLENGE_ID1}}" } - ] - } + ], + "variable": [] + }, + "method": "GET", + "header": [ + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{m2m_read_token}}" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, @@ -4992,30 +4781,24 @@ { "listen": "test", "script": { - "id": "eb64ce86-2990-400f-bb39-a10388cf8245", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 401\", function () {", " pm.response.to.have.status(401);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources/16096823/challenges", "method": "GET", "header": [], - "url": { - "raw": "{{URL}}/resources/16096823/challenges", - "host": [ - "{{URL}}" - ], - "path": [ - "resources", - "16096823", - "challenges" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, @@ -5025,17 +4808,17 @@ { "listen": "test", "script": { - "id": "85544f13-5c94-4a2e-8e0c-fdda47133e1f", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 403\", function () {", " pm.response.to.have.status(403);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources/16096823/challenges", "method": "GET", "header": [ { @@ -5044,17 +4827,11 @@ "value": "Bearer {{m2m_modify_token}}" } ], - "url": { - "raw": "{{URL}}/resources/16096823/challenges", - "host": [ - "{{URL}}" - ], - "path": [ - "resources", - "16096823", - "challenges" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, @@ -5064,17 +4841,17 @@ { "listen": "test", "script": { - "id": "bda9b04f-d640-4e2f-a6f1-01ddc0ec5532", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources/invalid/challenges", "method": "GET", "header": [ { @@ -5095,17 +4872,11 @@ "disabled": true } ], - "url": { - "raw": "{{URL}}/resources/invalid/challenges", - "host": [ - "{{URL}}" - ], - "path": [ - "resources", - "invalid", - "challenges" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, @@ -5115,17 +4886,34 @@ { "listen": "test", "script": { - "id": "9389854d-f4f8-46ec-ba06-b696b351b159", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": { + "raw": "{{URL}}/resources/16096823/challenges?resourceRoleId=111111", + "host": [ + "{{URL}}" + ], + "path": [ + "resources", + "16096823", + "challenges" + ], + "query": [ + { + "key": "resourceRoleId", + "value": "111111" + } + ], + "variable": [] + }, "method": "GET", "header": [ { @@ -5146,32 +4934,20 @@ "disabled": true } ], - "url": { - "raw": "{{URL}}/resources/16096823/challenges?resourceRoleId=111111", - "host": [ - "{{URL}}" - ], - "path": [ - "resources", - "16096823", - "challenges" - ], - "query": [ - { - "key": "resourceRoleId", - "value": "111111" - } - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] } ], - "protocolProfileBehavior": {}, "_postman_isSubFolder": true }, { "name": "delete resource", + "description": "", "item": [ { "name": "failure - delete resource that user doesn't have 400", @@ -5179,17 +4955,17 @@ { "listen": "test", "script": { - "id": "9abc6b1e-7ff1-4616-9ae4-98d5015b9d7b", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "DELETE", "header": [ { @@ -5212,15 +4988,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"hohoSKY\",\n\t\"roleId\": \"{{OBSERVER_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -5230,17 +4998,17 @@ { "listen": "test", "script": { - "id": "433efe13-eb00-47ca-bf86-db37ae68599e", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "DELETE", "header": [ { @@ -5263,15 +5031,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"invalid\",\n\t\"memberHandle\": \"hohoSKY\",\n\t\"roleId\": \"{{COPILOT_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -5281,17 +5041,17 @@ { "listen": "test", "script": { - "id": "fa5a2a45-7a20-4a75-9229-8b441600da6c", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "DELETE", "header": [ { @@ -5314,15 +5074,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"ghostar\",\n\t\"roleId\": \"{{CHALLENGE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -5332,17 +5084,17 @@ { "listen": "test", "script": { - "id": "670eed47-a699-4c2a-aa7c-6ac0c676d71d", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "DELETE", "header": [ { @@ -5365,15 +5117,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"123abcx\",\n\t\"roleId\": \"{{OBSERVER_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -5383,17 +5127,17 @@ { "listen": "test", "script": { - "id": "7a52952e-54da-4da5-bb4c-a9225f5a23ab", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "DELETE", "header": [ { @@ -5416,15 +5160,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": true,\n\t\"roleId\": \"{{OBSERVER_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -5434,17 +5170,17 @@ { "listen": "test", "script": { - "id": "a36016c0-6955-49be-b560-8b0906a59952", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 401\", function () {", " pm.response.to.have.status(401);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "DELETE", "header": [ { @@ -5467,15 +5203,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"tonyj\",\n\t\"roleId\": \"{{SUBMITTER_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -5485,17 +5213,17 @@ { "listen": "test", "script": { - "id": "6bedf956-11b6-4307-a69f-339f17d759ff", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 401\", function () {", " pm.response.to.have.status(401);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "DELETE", "header": [ { @@ -5518,15 +5246,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"tonyj\",\n\t\"roleId\": \"{{SUBMITTER_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -5536,17 +5256,17 @@ { "listen": "test", "script": { - "id": "af91fa6a-ee62-474d-a1fe-9a75192de257", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 403\", function () {", " pm.response.to.have.status(403);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "DELETE", "header": [ { @@ -5569,15 +5289,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"tonyj\",\n\t\"roleId\": \"{{SUBMITTER_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -5587,17 +5299,17 @@ { "listen": "test", "script": { - "id": "a6d5447b-5a43-4ea7-b4b1-042da53f5dac", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 403\", function () {", " pm.response.to.have.status(403);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "DELETE", "header": [ { @@ -5620,15 +5332,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"tonyj\",\n\t\"roleId\": \"{{SUBMITTER_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -5638,17 +5342,17 @@ { "listen": "test", "script": { - "id": "0c6d9f15-7017-40c2-8073-d1c8aa1c2a41", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 404\", function () {", " pm.response.to.have.status(404);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "DELETE", "header": [ { @@ -5671,15 +5375,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_NOT_FOUND_ID}}\",\n\t\"memberHandle\": \"hohoSKY\",\n\t\"roleId\": \"{{COPILOT_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -5689,17 +5385,17 @@ { "listen": "test", "script": { - "id": "d80ed568-ed9a-4122-bdc7-6e297e4092b4", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "DELETE", "header": [ { @@ -5722,15 +5418,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"ghostar\",\n\t\"roleId\": \"{{SUBMITTER_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -5740,17 +5428,17 @@ { "listen": "test", "script": { - "id": "80b20480-1202-45a8-bfeb-bfead3aa9c43", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "DELETE", "header": [ { @@ -5773,15 +5461,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"denis\",\n\t\"roleId\": \"{{SUBMITTER_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -5791,17 +5471,17 @@ { "listen": "test", "script": { - "id": "7f6a283f-84ce-47e1-b02b-b76b842974dd", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "DELETE", "header": [ { @@ -5824,15 +5504,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"HoHoSKY\",\n\t\"roleId\": \"{{COPILOT_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -5842,17 +5514,17 @@ { "listen": "test", "script": { - "id": "b4db4893-701b-4fd2-8fb0-a40da526cb77", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "DELETE", "header": [ { @@ -5875,15 +5547,7 @@ "mode": "raw", "raw": "{\n\t\"memberHandle\": \"HoHoSKY\",\n\t\"roleId\": \"{{COPILOT_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -5893,17 +5557,17 @@ { "listen": "test", "script": { - "id": "67cc4abc-b98f-48c9-bc14-4a3e2ff341ef", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 403\", function () {", " pm.response.to.have.status(403);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "DELETE", "header": [ { @@ -5926,15 +5590,7 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"lars2520\",\n\t\"roleId\": \"{{SUBMITTER_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] }, @@ -5944,17 +5600,17 @@ { "listen": "test", "script": { - "id": "5ebaa610-2635-4f01-a47e-0b325d682246", + "type": "text/javascript", "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});" - ], - "type": "text/javascript" + ] } } ], "request": { + "url": "{{URL}}/resources", "method": "DELETE", "header": [ { @@ -5977,43 +5633,28 @@ "mode": "raw", "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"lars2520\",\n\t\"roleId\": \"{{SUBMITTER_RESOURCE_ROLE_ID}}\"\n}" }, - "url": { - "raw": "{{URL}}/resources", - "host": [ - "{{URL}}" - ], - "path": [ - "resources" - ] - } + "description": "" }, "response": [] } ], - "protocolProfileBehavior": {}, "_postman_isSubFolder": true } - ], - "protocolProfileBehavior": {} + ] }, { "name": "health check", "request": { + "url": "{{URL}}/resources/health", "method": "GET", "header": [], - "url": { - "raw": "{{URL}}/resources/health", - "host": [ - "{{URL}}" - ], - "path": [ - "resources", - "health" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] } - ], - "protocolProfileBehavior": {} + ] } \ No newline at end of file diff --git a/docs/topcoder-challenge-resource-api.postman_environment.json b/docs/topcoder-challenge-resource-api.postman_environment.json index 6e4f29d..4c45d8c 100644 --- a/docs/topcoder-challenge-resource-api.postman_environment.json +++ b/docs/topcoder-challenge-resource-api.postman_environment.json @@ -101,6 +101,18 @@ "key": "DEPENDENCY_ID_2", "value": "", "enabled": true + }, + { + "enabled": true, + "key": "MEMBER_ID", + "value": "16096823", + "type": "text" + }, + { + "enabled": true, + "key": "MEMBER_HANDLE", + "value": "HoHoSKY", + "type": "text" } ], "_postman_variable_scope": "environment", diff --git a/env.sh b/env.sh new file mode 100644 index 0000000..2feb112 --- /dev/null +++ b/env.sh @@ -0,0 +1,29 @@ +#!/bin/sh + +export AUTH0_CLIENT_ID= + +export AUTH0_CLIENT_SECRET= + +export AUTH0_AUDIENCE= + +export AUTH_V2_URL= + +export AUTH_V2_CLIENT_ID= + +export AUTH_V3_URL= + +export ADMIN_CREDENTIALS_USERNAME= + +export ADMIN_CREDENTIALS_PASSWORD= + +export COPILOT_CREDENTIALS_USERNAME= + +export COPILOT_CREDENTIALS_PASSWORD= + +export USER_CREDENTIALS_USERNAME= + +export USER_CREDENTIALS_PASSWORD= + +export IS_LOCAL_DB= + +export AUTH_SECRET= \ No newline at end of file diff --git a/local/docker-compose.yml b/local/docker-compose.yml index 501f197..8fa5110 100644 --- a/local/docker-compose.yml +++ b/local/docker-compose.yml @@ -5,3 +5,10 @@ services: ports: - "7777:7777" command: "-inMemory -port 7777" + elasticsearch: + image: elasticsearch:6.8.13 + ports: + - "9200:9200" + - "9300:9300" + environment: + discovery.type: "single-node" \ No newline at end of file diff --git a/mock/mock-challenge-api.js b/mock/mock-challenge-api.js index dfe1bd4..ac4cc21 100644 --- a/mock/mock-challenge-api.js +++ b/mock/mock-challenge-api.js @@ -36,18 +36,58 @@ const mockChallengeApi = http.createServer((req, res) => { } else { return send(res, 200, { id: challengeId, + task: { + isTask: challengeId === 'fe6d0a58-ce7d-4521-8501-b8132b1c0392' + }, + terms: challengeId === 'fe6d0a58-ce7d-4521-8501-b8132b1c0392' ? [{ + id: 'ae6d0a58-ce7d-4521-8501-b8132b1c0391', + roleId: 'aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b' + }] : [{ + id: 'ae6d0a58-ce7d-4521-8501-b8132b1c0392', + roleId: config.SUBMITTER_RESOURCE_ROLE_ID + }, { + id: 'ae6d0a58-ce7d-4521-8501-b8132b1c0393', + roleId: config.SUBMITTER_RESOURCE_ROLE_ID + }], phases: [{ phaseId: 'aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b', isOpen: true }, { phaseId: 'cfe12b3f-2a12-4639-9d8b-ec86726f7644', isOpen: false + }, { + phaseId: 'ad123e44-c6c4-4cb3-8c60-e0339e1eaa3e', + actualStartDate: '2020-01-01', + actualEndDate: '2020-01-02' + }, { + phaseId: 'ad123e44-c6c4-4cb3-8c60-e0339e1eaa40', + scheduledStartDate: '2020-01-01', + scheduledEndDate: '2020-01-02' + }, { + phaseId: 'ad123e44-c6c4-4cb3-8c60-e0339e1eaa41' }] }) } } else { return send(res, 400, { message: `Challenge id: ${challengeId} should be a UUID.` }) } + } else if (req.method === 'GET' && req.url.match(/^\/v5\/terms\/[a-zA-Z0-9-]+\?userId=[0-9]+$/)) { + const list1 = req.url.split('/') + const list2 = list1[3].split('?') + const termId = list2[0] + return send(res, 200, { agreed: termId.endsWith('3'), title: 'term_title' }) + } else if (req.method === 'GET' && req.url.match(/^\/v5\/challenge-phases.*$/)) { + res.setHeader('x-total', '6') + return send(res, 200, [ + { id: 'aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b' }, + { id: 'cfe12b3f-2a12-4639-9d8b-ec86726f7644' }, + { id: 'ad123e44-c6c4-4cb3-8c60-e0339e1eaa3e' }, + { id: 'ad123e44-c6c4-4cb3-8c60-e0339e1eaa40' }, + { id: 'ad123e44-c6c4-4cb3-8c60-e0339e1eaa41' }, + { id: 'ad123e44-c6c4-4cb3-8c60-e0339e1eaa42' } + ]) + } else if (req.method === 'POST' && req.url.match(/^\/v5\/bus\/events$/)) { + return send(res, 200, {}) } else { // 404 for other routes res.statusCode = 404 diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 2d30b37..0000000 --- a/package-lock.json +++ /dev/null @@ -1,4932 +0,0 @@ -{ - "name": "topcoder-challenge-recources-api", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4", - "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.4.tgz", - "integrity": "sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==", - "dev": true - }, - "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/traverse": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.4.tgz", - "integrity": "sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.11" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "@types/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.33", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", - "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", - "requires": { - "@types/node": "*" - } - }, - "@types/express": { - "version": "4.17.6", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.6.tgz", - "integrity": "sha512-n/mr9tZI83kd4azlPG5y997C/M4DNABK9yErhFM6hKdym4kkmd9j0vtsJyjFIwfRBxtrxZtAfGZCNRIBMFLK5w==", - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "*", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-jwt": { - "version": "0.0.42", - "resolved": "https://registry.npmjs.org/@types/express-jwt/-/express-jwt-0.0.42.tgz", - "integrity": "sha512-WszgUddvM1t5dPpJ3LhWNH8kfNN8GPIBrAGxgIYXVCEGx6Bx4A036aAuf/r5WH9DIEdlmp7gHOYvSM6U87B0ag==", - "requires": { - "@types/express": "*", - "@types/express-unless": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.7", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.7.tgz", - "integrity": "sha512-EMgTj/DF9qpgLXyc+Btimg+XoH7A2liE8uKul8qSmMTHCeNYzydDKFdsJskDvw42UsesCnhO63dO0Grbj8J4Dw==", - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "@types/express-unless": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@types/express-unless/-/express-unless-0.5.1.tgz", - "integrity": "sha512-5fuvg7C69lemNgl0+v+CUxDYWVPSfXHhJPst4yTLcqi4zKJpORCxnDrnnilk3k0DTq/WrAUdvXFs01+vUqUZHw==", - "requires": { - "@types/express": "*" - } - }, - "@types/mime": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.2.tgz", - "integrity": "sha512-4kPlzbljFcsttWEq6aBW0OZe6BDajAmyvr2xknBG92tejQnvdGtT9+kXSZ580DqpxY9qG2xeQVF9Dq0ymUTo5Q==" - }, - "@types/node": { - "version": "14.0.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.5.tgz", - "integrity": "sha512-90hiq6/VqtQgX8Sp0EzeIsv3r+ellbGj4URKj5j30tLlZvRUpnAe9YbYnjl3pJM93GyXU0tghHhvXHq+5rnCKA==" - }, - "@types/qs": { - "version": "6.9.3", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.3.tgz", - "integrity": "sha512-7s9EQWupR1fTc2pSMtXRQ9w9gLOcrJn+h7HOXw4evxyvVqMi4f+q7d2tnFe3ng3SNHjtK+0EzGMGFUQX4/AQRA==" - }, - "@types/range-parser": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", - "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" - }, - "@types/serve-static": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.4.tgz", - "integrity": "sha512-jTDt0o/YbpNwZbQmE/+2e+lfjJEJJR0I3OFaKQKPWkASkCoW3i6fsUnqudSMcNAfbtmADGu8f4MV4q+GqULmug==", - "requires": { - "@types/express-serve-static-core": "*", - "@types/mime": "*" - } - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - }, - "dependencies": { - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "requires": { - "mime-db": "1.40.0" - } - } - } - }, - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - }, - "acorn-jsx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", - "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", - "dev": true - }, - "agentkeepalive": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", - "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", - "requires": { - "humanize-ms": "^1.2.1" - } - }, - "ajv": { - "version": "6.9.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.2.tgz", - "integrity": "sha512-4UFy0/LgDo7Oa/+wOAlj44tp9K78u38E5/359eSrqEp1Z5PdVfimCcs7SluXMP755RUQu6d2b4AvF0R1C9RZjg==", - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", - "dev": true - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", - "dev": true, - "requires": { - "default-require-extensions": "^2.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "array-includes": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.7.0" - } - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", - "requires": { - "lodash": "^4.17.11" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "aws-sdk": { - "version": "2.692.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.692.0.tgz", - "integrity": "sha512-fQRbZq+urzE4VjciEr6KNY7vbzougcVg7UqbHKGcgBT7EPtSbog9C2i9YY9Yum8PRuP1GAmfvC2Vthlw6dVTGw==", - "requires": { - "buffer": "4.9.2", - "events": "1.1.1", - "ieee754": "1.1.13", - "jmespath": "0.15.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "uuid": "3.3.2", - "xml2js": "0.4.19" - }, - "dependencies": { - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - } - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" - }, - "axios": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", - "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", - "requires": { - "follow-redirects": "1.5.10" - } - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "babel-runtime": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.6.1.tgz", - "integrity": "sha1-eIuUtvY04luRvWxd9y1GdFevsAA=", - "requires": { - "core-js": "^2.1.0" - } - }, - "backoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", - "requires": { - "precond": "0.2" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bluebird": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", - "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==" - }, - "body-parser": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", - "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", - "requires": { - "bytes": "3.0.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "~1.6.3", - "iconv-lite": "0.4.23", - "on-finished": "~2.3.0", - "qs": "6.5.2", - "raw-body": "2.3.3", - "type-is": "~1.6.16" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" - }, - "bunyan": { - "version": "1.8.12", - "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.12.tgz", - "integrity": "sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c=", - "requires": { - "dtrace-provider": "~0.8", - "moment": "^2.10.6", - "mv": "~2", - "safe-json-stringify": "~1" - } - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "caching-transform": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", - "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", - "dev": true, - "requires": { - "hasha": "^3.0.0", - "make-dir": "^2.0.0", - "package-hash": "^3.0.0", - "write-file-atomic": "^2.4.2" - } - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "^0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.0", - "type-detect": "^4.0.5" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "codependency": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/codependency/-/codependency-0.1.4.tgz", - "integrity": "sha1-0XY6tyZL1wyR2WJumIYtN5K/jUo=", - "requires": { - "semver": "5.0.1" - }, - "dependencies": { - "semver": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.1.tgz", - "integrity": "sha1-n7P0AE+QDYPEeWj+QvdYPgWDLMk=" - } - } - }, - "color": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", - "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "colornames": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", - "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=" - }, - "colors": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", - "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==" - }, - "colorspace": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.1.tgz", - "integrity": "sha512-pI3btWyiuz7Ken0BWh9Elzsmv2bM9AhA7psXib4anUXy/orfZ/E0MbQwhSOG/9L8hLlalqrU0UhOuqxW1YjmVw==", - "requires": { - "color": "3.0.x", - "text-hex": "1.0.x" - } - }, - "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "config": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/config/-/config-3.0.1.tgz", - "integrity": "sha512-TBNrrk2b6AybUohqXw2AydglFBL9b/+1GG93Di6Fm6x1SyVJ5PYgo+mqY2X0KpU9m0PJDSbFaC5H95utSphtLw==", - "requires": { - "json5": "^1.0.1" - } - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" - }, - "core-js": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "cp-file": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", - "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "make-dir": "^2.0.0", - "nested-error-stacks": "^2.0.0", - "pify": "^4.0.1", - "safe-buffer": "^5.0.1" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "cssfilter": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", - "integrity": "sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4=" - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "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" - } - }, - "debug-log": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", - "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", - "dev": true, - "requires": { - "strip-bom": "^3.0.0" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "deglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.1.tgz", - "integrity": "sha512-2kjwuGGonL7gWE1XU4Fv79+vVzpoQCl0V+boMwWtOQJV2AGDabCwez++nB1Nli/8BabAfZQ/UuHPlp6AymKdWw==", - "dev": true, - "requires": { - "find-root": "^1.0.0", - "glob": "^7.0.5", - "ignore": "^3.0.9", - "pkg-config": "^1.1.0", - "run-parallel": "^1.1.2", - "uniq": "^1.0.1" - }, - "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "diagnostics": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", - "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", - "requires": { - "colorspace": "1.1.x", - "enabled": "1.0.x", - "kuler": "1.0.x" - } - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dtrace-provider": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.7.tgz", - "integrity": "sha1-3JObTT4GIM/gwc2APQ0tftBP/QQ=", - "optional": true, - "requires": { - "nan": "^2.10.0" - } - }, - "dynamoose": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/dynamoose/-/dynamoose-1.7.2.tgz", - "integrity": "sha512-cRXX+ixgFYeLHIYA/rvVu+byPPHHfkUrO26IgUyqd/6apyGnAUtKAOeCEsS6M7fjVouuavxl+Va51cexRcCOkw==", - "requires": { - "@types/node": "11.11.0", - "aws-sdk": "2.395.0", - "debug": "4.1.1", - "deep-equal": "1.0.1", - "hooks": "0.3.2", - "object-path": "0.11.4", - "q": "1.5.1" - }, - "dependencies": { - "@types/node": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.0.tgz", - "integrity": "sha512-D5Rt+HXgEywr3RQJcGlZUCTCx1qVbCZpVk3/tOOA6spLNZdGm8BU+zRgdRYDoF1pO3RuXLxADzMrF903JlQXqg==" - }, - "aws-sdk": { - "version": "2.395.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.395.0.tgz", - "integrity": "sha512-ldTTjctniZT4E2lq2z3D8Y2u+vpkp+laoEnDkXgjKXTKbiJ0QEtfWsUdx/IQ7awCt8stoxyqZK47DJOxIbRNoA==", - "requires": { - "buffer": "4.9.1", - "events": "1.1.1", - "ieee754": "1.1.8", - "jmespath": "0.15.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "uuid": "3.3.2", - "xml2js": "0.4.19" - }, - "dependencies": { - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - } - } - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "elasticsearch": { - "version": "16.7.1", - "resolved": "https://registry.npmjs.org/elasticsearch/-/elasticsearch-16.7.1.tgz", - "integrity": "sha512-PL/BxB03VGbbghJwISYvVcrR9KbSSkuQ7OM//jHJg/End/uC2fvXg4QI7RXLvCGbhBuNQ8dPue7DOOPra73PCw==", - "requires": { - "agentkeepalive": "^3.4.1", - "chalk": "^1.0.0", - "lodash": "^4.17.10" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "enabled": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", - "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", - "requires": { - "env-variable": "0.0.x" - } - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "env-variable": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.5.tgz", - "integrity": "sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA==" - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - } - } - }, - "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "eslint": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.4.0.tgz", - "integrity": "sha512-UIpL91XGex3qtL6qwyCQJar2j3osKxK9e3ano3OcGEIRM4oWIpCkDg9x95AXEC2wMs7PnxzOkPZ2gq+tsMS9yg==", - "dev": true, - "requires": { - "ajv": "^6.5.0", - "babel-code-frame": "^6.26.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^3.1.0", - "doctrine": "^2.1.0", - "eslint-scope": "^4.0.0", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^4.0.0", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.2", - "imurmurhash": "^0.1.4", - "inquirer": "^5.2.0", - "is-resolvable": "^1.1.0", - "js-yaml": "^3.11.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.5", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "regexpp": "^2.0.0", - "require-uncached": "^1.0.3", - "semver": "^5.5.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^4.0.3", - "text-table": "^0.2.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "eslint-config-standard": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz", - "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==", - "dev": true - }, - "eslint-config-standard-jsx": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-6.0.2.tgz", - "integrity": "sha512-D+YWAoXw+2GIdbMBRAzWwr1ZtvnSf4n4yL0gKGg7ShUOGXkSOLerI17K4F6LdQMJPNMoWYqepzQD/fKY+tXNSg==", - "dev": true - }, - "eslint-import-resolver-node": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", - "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "resolve": "^1.5.0" - } - }, - "eslint-module-utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.3.0.tgz", - "integrity": "sha512-lmDJgeOOjk8hObTysjqH7wyMi+nsHwwvfBykwfhjR1LNdd7C2uFJBvx4OpWYpXOw4df1yE1cDEVd1yLHitk34w==", - "dev": true, - "requires": { - "debug": "^2.6.8", - "pkg-dir": "^2.0.0" - } - }, - "eslint-plugin-es": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.0.tgz", - "integrity": "sha512-XfFmgFdIUDgvaRAlaXUkxrRg5JSADoRC8IkKLc/cISeR3yHVMefFHQZpcyXXEUUPHfy5DwviBcrfqlyqEwlQVw==", - "dev": true, - "requires": { - "eslint-utils": "^1.3.0", - "regexpp": "^2.0.1" - } - }, - "eslint-plugin-import": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", - "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", - "dev": true, - "requires": { - "contains-path": "^0.1.0", - "debug": "^2.6.8", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.1", - "eslint-module-utils": "^2.2.0", - "has": "^1.0.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.3", - "read-pkg-up": "^2.0.0", - "resolve": "^1.6.0" - }, - "dependencies": { - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - } - } - }, - "eslint-plugin-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz", - "integrity": "sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw==", - "dev": true, - "requires": { - "eslint-plugin-es": "^1.3.1", - "eslint-utils": "^1.3.1", - "ignore": "^4.0.2", - "minimatch": "^3.0.4", - "resolve": "^1.8.1", - "semver": "^5.5.0" - } - }, - "eslint-plugin-promise": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz", - "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==", - "dev": true - }, - "eslint-plugin-react": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", - "integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.0.1", - "prop-types": "^15.6.2" - } - }, - "eslint-plugin-standard": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz", - "integrity": "sha512-OwxJkR6TQiYMmt1EsNRMe5qG3GsbjlcOhbGUBY4LtavF9DsLaTcoR+j2Tdjqi23oUwKNUqX7qcn5fPStafMdlA==", - "dev": true - }, - "eslint-scope": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.2.tgz", - "integrity": "sha512-5q1+B/ogmHl8+paxtOKx38Z8LtWkVGuNt3+GQNErqwLl6ViNp/gdJGMCjZNxZ8j/VYjDNZ2Fo+eQc1TAVPIzbg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", - "dev": true - }, - "espree": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", - "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", - "dev": true, - "requires": { - "acorn": "^6.0.2", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "express": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", - "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", - "requires": { - "accepts": "~1.3.5", - "array-flatten": "1.1.1", - "body-parser": "1.18.3", - "content-disposition": "0.5.2", - "content-type": "~1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.1.1", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.4", - "qs": "6.5.2", - "range-parser": "~1.2.0", - "safe-buffer": "5.1.2", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" - } - } - }, - "express-interceptor": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/express-interceptor/-/express-interceptor-1.2.0.tgz", - "integrity": "sha1-M0YKjhHc5+WgIsr1VdN35F3bgio=", - "requires": { - "debug": "^2.2.0" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fast-safe-stringify": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz", - "integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg==" - }, - "fecha": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", - "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==" - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - } - }, - "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" - } - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - } - } - }, - "find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", - "dev": true, - "requires": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" - }, - "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "requires": { - "debug": "=3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "foreground-child": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", - "dev": true, - "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - } - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "formidable": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", - "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "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": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, - "get-parameter-names": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/get-parameter-names/-/get-parameter-names-0.3.0.tgz", - "integrity": "sha1-LSI3zVkubFuFmrLv2rQ18Ajlu5c=" - }, - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "optional": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "globals": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", - "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", - "dev": true - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, - "hasha": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", - "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", - "dev": true, - "requires": { - "is-stream": "^1.0.1" - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "hoek": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.1.2.tgz", - "integrity": "sha512-6qhh/wahGYZHFSFw12tBbJw5fsAhhwrrG/y3Cs0YMTv2WzMnL0oLPnQJjv1QJvEfylRSOFuP+xCu+tdx0tD16Q==" - }, - "hooks": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/hooks/-/hooks-0.3.2.tgz", - "integrity": "sha1-ox8GDCAmzqbPHKPrF4Qw5xjhxKM=" - }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-aws-es": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/http-aws-es/-/http-aws-es-6.0.0.tgz", - "integrity": "sha512-g+qp7J110/m4aHrR3iit4akAlnW0UljZ6oTq/rCcbsI8KP9x+95vqUtx49M2XQ2JMpwJio3B6gDYx+E8WDxqiA==" - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "http-json-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/http-json-response/-/http-json-response-1.0.1.tgz", - "integrity": "sha1-ryQ2POlMcqre78x6rh8nRo7PS3I=" - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "http-status-codes": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-1.3.0.tgz", - "integrity": "sha1-nNDnE5F3PQZxtInUHLxQlKpBY7Y=" - }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "inquirer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", - "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.1.0", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^5.5.2", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" - }, - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "^1.0.1" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isemail": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", - "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==", - "requires": { - "punycode": "2.x.x" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - } - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", - "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", - "dev": true, - "requires": { - "append-transform": "^1.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", - "dev": true, - "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", - "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0" - } - }, - "jmespath": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" - }, - "joi": { - "version": "14.3.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-14.3.1.tgz", - "integrity": "sha512-LQDdM+pkOrpAn4Lp+neNIFV3axv1Vna3j38bisbQhETPMANYRbFJFUyOZcOClYvM/hppMhGWuKSFEK9vjrB+bQ==", - "requires": { - "hoek": "6.x.x", - "isemail": "3.x.x", - "topo": "3.x.x" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", - "requires": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^5.6.0" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jsx-ast-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", - "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", - "dev": true, - "requires": { - "array-includes": "^3.0.3" - } - }, - "jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jwks-rsa": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-1.8.1.tgz", - "integrity": "sha512-CcE8ypsATHwGmzELwzeFjLzPBXTXTrMmDYbn92LTQwYsZdOedp+ZIuYTofUdrWreu8CKRuXmhk17+6/li2sR6g==", - "requires": { - "@types/express-jwt": "0.0.42", - "axios": "^0.19.2", - "debug": "^4.1.0", - "jsonwebtoken": "^8.5.1", - "limiter": "^1.1.5", - "lru-memoizer": "^2.1.2", - "ms": "^2.1.2" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "requires": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "kuler": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", - "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", - "requires": { - "colornames": "^1.1.1" - } - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "limiter": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.4.tgz", - "integrity": "sha512-XCpr5bElgDI65vVgstP8TWjv6/QKWm9GU5UG0Pr5sLQ3QLo8NVKsioe+Jed5/3vFOe3IQuqE7DKwTvKQkjTHvg==" - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" - }, - "lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" - }, - "lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" - }, - "lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" - }, - "lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" - }, - "logform": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz", - "integrity": "sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ==", - "requires": { - "colors": "^1.2.1", - "fast-safe-stringify": "^2.0.4", - "fecha": "^2.3.3", - "ms": "^2.1.1", - "triple-beam": "^1.3.0" - }, - "dependencies": { - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } - } - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lru-cache": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", - "integrity": "sha1-HRdnnAac2l0ECZGgnbwsDbN35V4=", - "requires": { - "pseudomap": "^1.0.1", - "yallist": "^2.0.0" - } - }, - "lru-memoizer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.1.2.tgz", - "integrity": "sha512-N5L5xlnVcbIinNn/TJ17vHBZwBMt9t7aJDz2n97moWubjNl6VO9Ao2XuAGBBddkYdjrwR9HfzXbT6NfMZXAZ/A==", - "requires": { - "lodash.clonedeep": "^4.5.0", - "lru-cache": "~4.0.0" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "millisecond": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/millisecond/-/millisecond-0.1.2.tgz", - "integrity": "sha1-bMWtOGJByrjniv+WT4cCjuyS2sU=" - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" - }, - "mime-db": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", - "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==" - }, - "mime-types": { - "version": "2.1.22", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", - "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", - "requires": { - "mime-db": "~1.38.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "mocha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", - "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", - "dev": true, - "requires": { - "browser-stdout": "1.3.1", - "commander": "2.15.1", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.5", - "he": "1.1.1", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "supports-color": "5.4.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - } - } - }, - "mocha-prepare": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/mocha-prepare/-/mocha-prepare-0.1.0.tgz", - "integrity": "sha1-VRMidoEiLkNJSB7k5GJHLzHGu4I=", - "dev": true - }, - "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", - "optional": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", - "optional": true, - "requires": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" - } - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "optional": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "optional": true - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "nested-error-stacks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", - "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "nock": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/nock/-/nock-10.0.6.tgz", - "integrity": "sha512-b47OWj1qf/LqSQYnmokNWM8D88KvUl2y7jT0567NB3ZBAZFz2bWp2PC81Xn7u8F2/vJxzkzNZybnemeFa7AZ2w==", - "dev": true, - "requires": { - "chai": "^4.1.2", - "debug": "^4.1.0", - "deep-equal": "^1.0.0", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.5", - "mkdirp": "^0.5.0", - "propagate": "^1.0.0", - "qs": "^6.5.1", - "semver": "^5.5.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "nyc": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.0.tgz", - "integrity": "sha512-iy9fEV8Emevz3z/AanIZsoGa8F4U2p0JKevZ/F0sk+/B2r9E6Qn+EPs0bpxEhnAt6UPlTL8mQZIaSJy8sK0ZFw==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "caching-transform": "^3.0.2", - "convert-source-map": "^1.6.0", - "cp-file": "^6.2.0", - "find-cache-dir": "^2.1.0", - "find-up": "^3.0.0", - "foreground-child": "^1.5.6", - "glob": "^7.1.3", - "istanbul-lib-coverage": "^2.0.5", - "istanbul-lib-hook": "^2.0.7", - "istanbul-lib-instrument": "^3.3.0", - "istanbul-lib-report": "^2.0.8", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^2.2.4", - "js-yaml": "^3.13.1", - "make-dir": "^2.1.0", - "merge-source-map": "^1.1.0", - "resolve-from": "^4.0.0", - "rimraf": "^2.6.3", - "signal-exit": "^3.0.2", - "spawn-wrap": "^1.4.2", - "test-exclude": "^5.2.3", - "uuid": "^3.3.2", - "yargs": "^13.2.2", - "yargs-parser": "^13.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": false, - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": false, - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": false, - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": false, - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": false, - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": false, - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", - "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==", - "dev": true - }, - "object-path": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", - "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "one-time": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", - "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "package-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", - "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^3.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pkg-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", - "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" - }, - "dependencies": { - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "pkg-config": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", - "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=", - "dev": true, - "requires": { - "debug-log": "^1.0.0", - "find-root": "^1.0.0", - "xtend": "^4.0.1" - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true - }, - "precond": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=" - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "propagate": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/propagate/-/propagate-1.0.0.tgz", - "integrity": "sha1-AMLa7t2iDofjeCs0Stuhzd1q1wk=", - "dev": true - }, - "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" - } - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "psl": { - "version": "1.1.33", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.33.tgz", - "integrity": "sha512-LTDP2uSrsc7XCb5lO7A8BI1qYxRe/8EqlRvMeEl6rsnYAqDOl8xHR+8lSAIVfrNaSAlTPTNOCgNjWcoUL3AZsw==" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "r7insight_node": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/r7insight_node/-/r7insight_node-1.8.4.tgz", - "integrity": "sha512-6cQrzLkaOxdv/SRFXWRJjgFr8a3nXUOT/4IMFuBv+mWzBnu5DJl+HzONAsWYvclrlZnvfa54PaIPqPuPRSlbrQ==", - "requires": { - "babel-runtime": "6.6.1", - "codependency": "0.1.4", - "json-stringify-safe": "5.0.1", - "lodash": "4.17.15", - "reconnect-core": "1.3.0", - "semver": "5.1.0" - }, - "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - }, - "semver": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz", - "integrity": "sha1-hfLPhVBGXE3wAM99hvawVBBqueU=" - } - } - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" - }, - "raw-body": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", - "unpipe": "1.0.0" - } - }, - "react-is": { - "version": "16.8.3", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.3.tgz", - "integrity": "sha512-Y4rC1ZJmsxxkkPuMLwvKvlL1Zfpbcu+Bf4ZigkHup3v9EfdYhAlWAaVyA19olXq2o2mGn0w+dFKvk3pVVlYcIA==", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "readable-stream": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.2.0.tgz", - "integrity": "sha512-RV20kLjdmpZuTF1INEb9IA3L68Nmi+Ri7ppZqo78wj//Pn62fCoJyV9zalccNzDD/OuJpMG4f+pfMl8+L6QdGw==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "reconnect-core": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/reconnect-core/-/reconnect-core-1.3.0.tgz", - "integrity": "sha1-+65SkZp4d9hE4yRtAaLyZwHIM8g=", - "requires": { - "backoff": "~2.5.0" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - } - }, - "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", - "optional": true, - "requires": { - "glob": "^6.0.1" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", - "dev": true - }, - "rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", - "dev": true, - "requires": { - "symbol-observable": "1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-json-stringify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", - "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" - }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" - }, - "dependencies": { - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" - } - } - }, - "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "should": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", - "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", - "dev": true, - "requires": { - "should-equal": "^2.0.0", - "should-format": "^3.0.3", - "should-type": "^1.4.0", - "should-type-adaptors": "^1.0.1", - "should-util": "^1.0.0" - } - }, - "should-equal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", - "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", - "dev": true, - "requires": { - "should-type": "^1.4.0" - } - }, - "should-format": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", - "integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=", - "dev": true, - "requires": { - "should-type": "^1.3.0", - "should-type-adaptors": "^1.0.1" - } - }, - "should-type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", - "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=", - "dev": true - }, - "should-type-adaptors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", - "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", - "dev": true, - "requires": { - "should-type": "^1.3.0", - "should-util": "^1.0.0" - } - }, - "should-util": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.0.tgz", - "integrity": "sha1-yYzaN0qmsZDfi6h8mInCtNtiAGM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "requires": { - "is-arrayish": "^0.3.1" - } - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "spawn-wrap": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.3.tgz", - "integrity": "sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw==", - "dev": true, - "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", - "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" - }, - "standard": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/standard/-/standard-12.0.1.tgz", - "integrity": "sha512-UqdHjh87OG2gUrNCSM4QRLF5n9h3TFPwrCNyVlkqu31Hej0L/rc8hzKqVvkb2W3x0WMq7PzZdkLfEcBhVOR6lg==", - "dev": true, - "requires": { - "eslint": "~5.4.0", - "eslint-config-standard": "12.0.0", - "eslint-config-standard-jsx": "6.0.2", - "eslint-plugin-import": "~2.14.0", - "eslint-plugin-node": "~7.0.1", - "eslint-plugin-promise": "~4.0.0", - "eslint-plugin-react": "~7.11.1", - "eslint-plugin-standard": "~4.0.0", - "standard-engine": "~9.0.0" - } - }, - "standard-engine": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-9.0.0.tgz", - "integrity": "sha512-ZfNfCWZ2Xq67VNvKMPiVMKHnMdvxYzvZkf1AH8/cw2NLDBm5LRsxMqvEJpsjLI/dUosZ3Z1d6JlHDp5rAvvk2w==", - "dev": true, - "requires": { - "deglob": "^2.1.0", - "get-stdin": "^6.0.0", - "minimist": "^1.1.0", - "pkg-conf": "^2.0.0" - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "string_decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - } - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "superagent": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-4.1.0.tgz", - "integrity": "sha512-FT3QLMasz0YyCd4uIi5HNe+3t/onxMyEho7C3PSqmti3Twgy2rXT4fmkTz6wRL6bTF4uzPcfkUCa8u4JWHw8Ag==", - "requires": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.2", - "debug": "^4.1.0", - "form-data": "^2.3.3", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^2.4.0", - "qs": "^6.6.0", - "readable-stream": "^3.0.6" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "mime": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", - "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==" - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "qs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.6.0.tgz", - "integrity": "sha512-KIJqT9jQJDQx5h5uAVPimw6yVg2SekOKu959OCtktD3FjzbpvaPr8i4zzg07DOMz+igA4W/aNM7OV8H37pFYfA==" - } - } - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "swagger-ui-dist": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-3.25.0.tgz", - "integrity": "sha512-vwvJPPbdooTvDwLGzjIXinOXizDJJ6U1hxnJL3y6U3aL1d2MSXDmKg2139XaLBhsVZdnQJV2bOkX4reB+RXamg==" - }, - "swagger-ui-express": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-4.1.3.tgz", - "integrity": "sha512-f8SEn4YWkKh/HGK0ZjuA2VqA78i1aY6OIa5cqYNgOkBobfHV6Mz4dphQW/us8HYhEFfbENq329PyfIonWfzFrw==", - "requires": { - "swagger-ui-dist": "^3.18.1" - } - }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "dev": true - }, - "table": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", - "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", - "dev": true, - "requires": { - "ajv": "^6.0.1", - "ajv-keywords": "^3.0.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" - } - }, - "tc-bus-api-wrapper": { - "version": "github:topcoder-platform/tc-bus-api-wrapper#a52f69ef72a80d27aeeab790fb18eb419a904862", - "from": "github:topcoder-platform/tc-bus-api-wrapper", - "requires": { - "joi": "^13.4.0", - "lodash": "^4.17.15", - "superagent": "^3.8.3", - "tc-core-library-js": "github:appirio-tech/tc-core-library-js#v2.6.4" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "hoek": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-5.0.4.tgz", - "integrity": "sha512-Alr4ZQgoMlnere5FZJsIyfIjORBqZll5POhDsF4q64dPuJR6rNxXdDxtHSQq8OXRurhmx+PWYEE8bXRROY8h0w==" - }, - "joi": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-13.7.0.tgz", - "integrity": "sha512-xuY5VkHfeOYK3Hdi91ulocfuFopwgbSORmIwzcwHKESQhC7w1kD5jaVSPnqDxS2I8t3RZ9omCKAxNwXN5zG1/Q==", - "requires": { - "hoek": "5.x.x", - "isemail": "3.x.x", - "topo": "3.x.x" - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - }, - "lru-memoizer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.1.2.tgz", - "integrity": "sha512-N5L5xlnVcbIinNn/TJ17vHBZwBMt9t7aJDz2n97moWubjNl6VO9Ao2XuAGBBddkYdjrwR9HfzXbT6NfMZXAZ/A==", - "requires": { - "lodash.clonedeep": "^4.5.0", - "lru-cache": "~4.0.0" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", - "requires": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" - } - }, - "tc-core-library-js": { - "version": "github:appirio-tech/tc-core-library-js#df0b36c51cf80918194cbff777214b3c0cf5a151", - "from": "github:appirio-tech/tc-core-library-js#v2.6.4", - "requires": { - "axios": "^0.19.0", - "bunyan": "^1.8.12", - "jsonwebtoken": "^8.5.1", - "jwks-rsa": "^1.6.0", - "lodash": "^4.17.15", - "millisecond": "^0.1.2", - "r7insight_node": "^1.8.4", - "request": "^2.88.0" - }, - "dependencies": { - "axios": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", - "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", - "requires": { - "follow-redirects": "1.5.10" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "jwks-rsa": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-1.8.0.tgz", - "integrity": "sha512-+HYROHD5fsYQCNrJ37RSr2NjbN2/V9YT+yVF3oJxLmPIZWrmp1SOl1hMw2RcuNh+LGA2bGZIhRKGiMjhQa/b7Q==", - "requires": { - "@types/express-jwt": "0.0.42", - "axios": "^0.19.2", - "debug": "^4.1.0", - "jsonwebtoken": "^8.5.1", - "limiter": "^1.1.4", - "lru-memoizer": "^2.0.1", - "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==" - } - } - } - } - }, - "tc-core-library-js": { - "version": "github:appirio-tech/tc-core-library-js#df0b36c51cf80918194cbff777214b3c0cf5a151", - "from": "github:appirio-tech/tc-core-library-js#v2.6.4", - "requires": { - "axios": "^0.19.0", - "bunyan": "^1.8.12", - "jsonwebtoken": "^8.5.1", - "jwks-rsa": "^1.6.0", - "lodash": "^4.17.15", - "millisecond": "^0.1.2", - "r7insight_node": "^1.8.4", - "request": "^2.88.0" - } - }, - "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", - "dev": true, - "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - } - } - }, - "text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "topo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/topo/-/topo-3.0.3.tgz", - "integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==", - "requires": { - "hoek": "6.x.x" - } - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } - } - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "triple-beam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.18" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "requires": { - "punycode": "^2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - } - } - }, - "url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==" - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "winston": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz", - "integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==", - "requires": { - "async": "^2.6.1", - "diagnostics": "^1.1.1", - "is-stream": "^1.1.0", - "logform": "^2.1.1", - "one-time": "0.0.4", - "readable-stream": "^3.1.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.3.0" - } - }, - "winston-transport": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.3.0.tgz", - "integrity": "sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A==", - "requires": { - "readable-stream": "^2.3.6", - "triple-beam": "^1.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "write-file-atomic": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", - "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - } - }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" - }, - "xss": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.7.tgz", - "integrity": "sha512-A9v7tblGvxu8TWXQC9rlpW96a+LN1lyw6wyhpTmmGW+FwRMactchBR3ROKSi33UPCUcUHSu8s9YP6F+K3Mw//w==", - "requires": { - "commander": "^2.20.3", - "cssfilter": "0.0.10" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - } - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "yamljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz", - "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==", - "requires": { - "argparse": "^1.0.7", - "glob": "^7.0.5" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "yargs": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", - "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } -} diff --git a/package.json b/package.json index 36ac3a5..1999299 100644 --- a/package.json +++ b/package.json @@ -11,21 +11,25 @@ "init-es": "node src/init-es.js", "drop-tables": "node src/scripts/drop-tables.js", "create-tables": "node src/scripts/create-tables.js", + "drop-tables:test": "NODE_ENV=test node src/scripts/drop-tables.js", + "create-tables:test": "NODE_ENV=test node src/scripts/create-tables.js", "seed-tables": "node src/scripts/seed-tables.js", "view-data": "node src/scripts/view-data.js", "mock-challenge-api": "NODE_ENV=test node mock/mock-challenge-api", "test": "nyc --reporter=html --reporter=text mocha test/unit/test.js --require test/common/prepare.js --timeout 60000 --exit", - "e2e": "nyc --reporter=html --reporter=text mocha test/e2e/test.js --require test/common/prepare.js --timeout 60000 --exit" + "test:newman": "NODE_ENV=test node test/postman/newman.js", + "test:newman:clear": "node test/postman/clearTestData.js" }, "author": "TCSCODER", "license": "none", "devDependencies": { - "should": "^13.2.3", "mocha": "^5.2.0", "mocha-prepare": "^0.1.0", + "nock": "^10.0.6", "nyc": "^14.0.0", + "should": "^13.2.3", "standard": "^12.0.1", - "nock": "^10.0.6" + "tc-api-testing-lib": "topcoder-platform/api-automated-testing.git" }, "dependencies": { "aws-sdk": "^2.466.0", @@ -34,7 +38,7 @@ "config": "^3.0.1", "cors": "^2.7.1", "dynamoose": "^1.7.2", - "elasticsearch": "^16.1.1", + "@opensearch-project/opensearch": "^2.11.0", "express": "^4.16.4", "express-interceptor": "^1.2.0", "get-parameter-names": "^0.3.0", @@ -43,17 +47,17 @@ "http-status-codes": "^1.3.0", "joi": "^14.0.0", "lodash": "^4.17.19", - "superagent": "^4.1.0", + "superagent": "^8.0.9", "swagger-ui-express": "^4.1.3", "tc-bus-api-wrapper": "topcoder-platform/tc-bus-api-wrapper.git", - "tc-core-library-js": "appirio-tech/tc-core-library-js.git#v2.6.4", + "tc-core-library-js": "appirio-tech/tc-core-library-js.git#v2.6.6", "uuid": "^8.3.0", "winston": "^3.2.1", "xss": "^1.0.7", "yamljs": "^0.3.0" }, "engines": { - "node": "10.x" + "node": "14.x" }, "standard": { "env": [ @@ -67,5 +71,9 @@ "test/unit/*.js", "test/e2e/*.js" ] + }, + "volta": { + "node": "14.21.3", + "yarn": "1.22.19" } } diff --git a/src/common/errors.js b/src/common/errors.js index 9908c72..bdd7ffe 100644 --- a/src/common/errors.js +++ b/src/common/errors.js @@ -15,13 +15,15 @@ function createError (name, statusCode) { * The error constructor * @param {String} message the error message * @param {String} [cause] the error cause + * @param {Object} metadata the metadata * @constructor */ - function ErrorCtor (message, cause) { + function ErrorCtor (message, cause, metadata) { Error.call(this) Error.captureStackTrace(this) this.message = message || name this.cause = cause + this.metadata = metadata this.httpStatus = statusCode } diff --git a/src/common/helper.js b/src/common/helper.js index 27e8224..e19df81 100644 --- a/src/common/helper.js +++ b/src/common/helper.js @@ -6,7 +6,6 @@ const _ = require('lodash') const config = require('config') const querystring = require('querystring') const request = require('superagent') -const xss = require('xss') const constants = require('../../app-constants') const models = require('../models') const { MemberProfile, MemberStats } = require('../models') @@ -14,14 +13,14 @@ const errors = require('./errors') const logger = require('./logger') const m2mAuth = require('tc-core-library-js').auth.m2m const AWS = require('aws-sdk') -const elasticsearch = require('elasticsearch') +const opensearch = require('@opensearch-project/opensearch') const m2m = m2mAuth(_.pick(config, ['AUTH0_URL', 'AUTH0_AUDIENCE', 'TOKEN_CACHE_TIME', 'AUTH0_PROXY_SERVER_URL'])) const busApi = require('tc-bus-api-wrapper') const busApiClient = busApi(_.pick(config, ['AUTH0_URL', 'AUTH0_AUDIENCE', 'TOKEN_CACHE_TIME', 'AUTH0_CLIENT_ID', 'AUTH0_CLIENT_SECRET', 'BUSAPI_URL', 'KAFKA_ERROR_TOPIC', 'AUTH0_PROXY_SERVER_URL'])) -// Elasticsearch client -let esClient +// Opensearch client +let osClient /** * Check the error is custom error. @@ -157,33 +156,52 @@ async function getMemberInfoById (id) { return memberInfo } +/** + * Get Member by memberId from the API + * @param {String} id The user ID + * @returns {Promise} + */ +async function getMemberById (id) { + try { + const res = await getRequest(`${config.MEMBER_API_URL}`, { userId: id }) + return _.get(res, 'body[0]') + } catch (e) { + logger.debug(e.message) + logger.debug(e) + } +} + /** * Get Data by model id * @param {String} handle The member handle * @returns {Promise} */ -async function getMemberIdByHandle (handle) { +async function getMemberDetailsByHandle (handle) { try { // logger.warn(`getMemberIdByHandle ${handle}`) const profile = await MemberProfile.query('handleLower').eq(_.toLower(handle)).exec().then(r => r[0]) - return profile.userId + return { memberId: profile.userId, email: profile.email } } catch (e) { // fall back to v3 api... - logger.warn(`Get MemberID by Handle from Dynamo Failed, trying v3 Members API. Error: ${JSON.stringify(e)}`) - return getMemberIdByHandleFromV3Members(handle) + logger.warn(`Get Member by Handle from Dynamo Failed, trying v3 Members API. Error: ${JSON.stringify(e)}`) + return getMemberDetailsByHandleFromV3Members(handle) } } -async function getMemberIdByHandleFromV3Members (handle) { +async function getMemberDetailsByHandleFromV3Members (handle) { let memberId + let email try { - logger.warn(`getMemberIdByHandle ${handle} from v3`) + logger.warn(`getMemberByHandle ${handle} from v5`) const res = await getRequest(`${config.MEMBER_API_URL}/${handle}`) - if (_.get(res, 'body.result.content.userId')) { - memberId = String(res.body.result.content.userId) + if (_.get(res, 'body.userId')) { + memberId = String(res.body.userId) + } + if (_.get(res, 'body.email')) { + email = String(res.body.email) } // handle return from v3 API, handle and memberHandle are the same under case-insensitive condition - handle = _.get(res, 'body.result.content.handle') + handle = _.get(res, 'body.handle') } catch (error) { // re-throw all error except 404 Not-Founded, BadRequestError should be thrown if 404 occurs if (error.status !== 404) { @@ -195,7 +213,7 @@ async function getMemberIdByHandleFromV3Members (handle) { throw new errors.BadRequestError(`User with handle: ${handle} doesn't exist`) } - return memberId + return { memberId, email } } /** @@ -256,6 +274,23 @@ async function scan (modelName, scanParams) { }) } +/** + * Get all data collection (avoid default page limit of DynamoDB) by scan parameters + * @param {Object} modelName The dynamoose model name + * @param {Object} scanParams The scan parameters object + * @returns {Array} + */ +async function scanAll (modelName, scanParams) { + let results = await models[modelName].scan(scanParams).exec() + let lastKey = results.lastKey + while (!_.isUndefined(results.lastKey)) { + const newResult = await models[modelName].scan(scanParams).startAt(lastKey).exec() + results = [...results, ...newResult] + lastKey = newResult.lastKey + } + return results +} + /** * Get data collection by query parameters * @param {Object} modelName The dynamoose model name @@ -305,6 +340,30 @@ async function getRequest (url, query) { .query(query || {}) } +/** + * Uses superagent to proxy post request + * @param {String} url the url + * @param {Object} data the query parameters, optional + * @returns {Object} the response + */ +async function postRequest (url, data) { + try { + const m2mToken = await m2m.getMachineToken(config.AUTH0_CLIENT_ID, config.AUTH0_CLIENT_SECRET) + + const res = await request + .post(url) + .set('Authorization', `Bearer ${m2mToken}`) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json') + .send(data) + + return res + } catch (err) { + console.error(err) + throw err + } +} + /** * Get link for a given page. * @param {Object} req the HTTP request @@ -377,50 +436,29 @@ async function getAllPages (url, query) { } /** - * Get ES Client - * @return {Object} Elasticsearch Client Instance + * Get OS Client + * @return {Object} Opensearch Client Instance */ -function getESClient () { - if (esClient) { - return esClient +function getOSClient () { + if (osClient) { + return osClient } - const esHost = config.get('ES.HOST') + const osHost = config.get('OS.HOST') // AWS ES configuration is different from other providers - if (/.*amazonaws.*/.test(esHost)) { - esClient = elasticsearch.Client({ - apiVersion: config.get('ES.API_VERSION'), - hosts: esHost, - connectionClass: require('http-aws-es'), // eslint-disable-line global-require + if (/.*amazonaws.*/.test(osHost)) { + osClient = new opensearch.Client({ + node: osHost, amazonES: { region: config.get('DYNAMODB.AWS_REGION'), credentials: new AWS.EnvironmentCredentials('AWS') } }) } else { - esClient = new elasticsearch.Client({ - apiVersion: config.get('ES.API_VERSION'), - hosts: esHost + osClient = new opensearch.Client({ + node: osHost }) } - return esClient -} -/** - * Test whether the given value is partially match the filter. - * @param {String} filter the filter - * @param {String} value the value to test - * @returns {Boolean} the match result - */ -function partialMatch (filter, value) { - if (filter) { - if (value) { - const filtered = xss(filter) - return _.toLower(value).includes(_.toLower(filtered)) - } else { - return false - } - } else { - return true - } + return osClient } /** @@ -430,15 +468,52 @@ function partialMatch (filter, value) { */ async function checkAgreedTerms (userId, terms) { const unAgreedTerms = [] + const missingTerms = [] for (const term of terms) { const res = await getRequest(`${config.TERMS_API_URL}/${term.id}`, { userId }) if (!_.get(res, 'body.agreed', false)) { unAgreedTerms.push(_.get(res, 'body.title', term)) + missingTerms.push({ + termId: term.id, + roleId: term.roleId + }) } } if (unAgreedTerms.length > 0) { - throw new errors.ForbiddenError(`The user has not yet agreed to the following terms: [${unAgreedTerms.join(', ')}]`) + throw new errors.ForbiddenError(`The user has not yet agreed to the following terms: [${unAgreedTerms.join(', ')}]`, null, { missingTerms }) + } +} + +async function advanceChallengePhase (challengeId, phase, operation, numAttempts = 1) { + if (!challengeId || !phase || !operation) { + throw new Error('Invalid arguments') + } + + try { + console.log('Initiating advance phase:', challengeId, phase, operation) + + const response = await postRequest(`${config.CHALLENGE_API_URL}/${challengeId}/advance-phase`, { + phase, + operation + }) + + if (response.status !== 200) { + throw new Error(`Received non-200 status code: ${response.status}`) + } + + console.log('Successfully advanced phase with response:', response.body) + return response.body + } catch (err) { + logger.warn(`Error while advancing phase for challenge ${challengeId}. ${JSON.stringify(err)}`) + + if (numAttempts <= 3) { + return new Promise((resolve) => { + setTimeout(() => { + resolve(advanceChallengePhase(challengeId, phase, operation, ++numAttempts)) + }, 5000) + }) + } } } @@ -446,8 +521,7 @@ module.exports = { wrapExpress, autoWrapExpress, getMemberInfoById, - getMemberIdByHandle, - partialMatch, + getMemberDetailsByHandle, checkIfExists, hasAdminRole, getById, @@ -455,12 +529,16 @@ module.exports = { update, query, scan, + scanAll, validateDuplicate, getRequest, postEvent, isCustomError, setResHeaders, getAllPages, - getESClient, - checkAgreedTerms + getOSClient, + checkAgreedTerms, + postRequest, + getMemberById, + advanceChallengePhase } diff --git a/src/controllers/CleanUpController.js b/src/controllers/CleanUpController.js new file mode 100644 index 0000000..b8c6bc0 --- /dev/null +++ b/src/controllers/CleanUpController.js @@ -0,0 +1,19 @@ +/** + * Controller for cleaning up test data + */ + +const service = require('../services/CleanUpService') + +/** + * Get all resources of a challenge + * @param {Object} req the request + * @param {Object} res the response + */ +async function cleanUpTestData (req, res) { + await service.cleanUpTestData() + res.sendStatus(200) +} + +module.exports = { + cleanUpTestData +} diff --git a/src/controllers/ResourceController.js b/src/controllers/ResourceController.js index 7ca03be..3353255 100644 --- a/src/controllers/ResourceController.js +++ b/src/controllers/ResourceController.js @@ -11,7 +11,7 @@ const helper = require('../common/helper') * @param {Object} res the response */ async function getResources (req, res) { - const result = await service.getResources(req.authUser, req.query.challengeId, req.query.roleId, req.query.page, req.query.perPage) + const result = await service.getResources(req.authUser, req.query.challengeId, req.query.roleId, req.query.memberId, req.query.memberHandle, req.query.page, req.query.perPage, req.query.sortBy, req.query.sortOrder) helper.setResHeaders(req, res, result) res.send(result.data) } @@ -47,9 +47,20 @@ async function listChallengesByMember (req, res) { res.send(result.data) } +/** + * Get resource count of a challenge + * @param {Object} req the request + * @param {Object} res the response + */ +async function getResourceCount (req, res) { + const result = await service.getResourceCount(req.query.challengeId, req.query.roleId) + res.send(result) +} + module.exports = { getResources, createResource, deleteResource, - listChallengesByMember + listChallengesByMember, + getResourceCount } diff --git a/src/controllers/ResourceRoleController.js b/src/controllers/ResourceRoleController.js index 1441f3d..97b30f9 100644 --- a/src/controllers/ResourceRoleController.js +++ b/src/controllers/ResourceRoleController.js @@ -3,6 +3,7 @@ */ const service = require('../services/ResourceRoleService') +const helper = require('../common/helper') /** * Get resource roles. @@ -11,7 +12,8 @@ const service = require('../services/ResourceRoleService') */ async function getResourceRoles (req, res) { const result = await service.getResourceRoles(req.query) - res.send(result) + helper.setResHeaders(req, res, result) + res.send(result.data) } /** diff --git a/src/controllers/ResourceRolePhaseDependencyController.js b/src/controllers/ResourceRolePhaseDependencyController.js index 46e2f05..3959342 100644 --- a/src/controllers/ResourceRolePhaseDependencyController.js +++ b/src/controllers/ResourceRolePhaseDependencyController.js @@ -3,6 +3,7 @@ */ const service = require('../services/ResourceRolePhaseDependencyService') +const helper = require('../common/helper') /** * Get dependencies. @@ -11,7 +12,8 @@ const service = require('../services/ResourceRolePhaseDependencyService') */ async function getDependencies (req, res) { const result = await service.getDependencies(req.query) - res.send(result) + helper.setResHeaders(req, res, result) + res.send(result.data) } /** diff --git a/src/init-es.js b/src/init-es.js index 022186b..48bc6df 100644 --- a/src/init-es.js +++ b/src/init-es.js @@ -10,33 +10,37 @@ const config = require('config') const logger = require('./common/logger') const helper = require('./common/helper') -const client = helper.getESClient() +const client = helper.getOSClient() const initES = async () => { if (process.argv.length === 3 && process.argv[2] === 'force') { - logger.info(`Delete index ${config.ES.ES_INDEX} if any.`) + logger.info(`Delete index ${config.OS.OS_INDEX} if any.`) try { - await client.indices.delete({ index: config.ES.ES_INDEX }) + await client.indices.delete({ index: config.OS.OS_INDEX }) } catch (err) { // ignore } } - const exists = await client.indices.exists({ index: config.ES.ES_INDEX }) + const exists = await client.indices.exists({ index: config.OS.OS_INDEX }) if (exists) { - logger.info(`The index ${config.ES.ES_INDEX} exists.`) + logger.info(`The index ${config.OS.OS_INDEX} exists.`) } else { - logger.info(`The index ${config.ES.ES_INDEX} will be created.`) + logger.info(`The index ${config.OS.OS_INDEX} will be created.`) const body = { mappings: {} } - body.mappings[config.get('ES.ES_TYPE')] = { + body.mappings['_doc'] = { properties: { - id: { type: 'keyword' } + id: { type: 'keyword' }, + memberHandle: { + type: 'text', + fielddata: true + } } } await client.indices.create({ - index: config.ES.ES_INDEX, + index: config.OS.OS_INDEX, body }) } diff --git a/src/models/MemberProfile.js b/src/models/MemberProfile.js index 583c2c8..42d5bfb 100644 --- a/src/models/MemberProfile.js +++ b/src/models/MemberProfile.js @@ -23,6 +23,9 @@ const schema = new Schema({ name: 'handleLower-index', project: true } + }, + email: { + type: String } }, { diff --git a/src/models/Resource.js b/src/models/Resource.js index d3a3700..1639229 100644 --- a/src/models/Resource.js +++ b/src/models/Resource.js @@ -61,8 +61,7 @@ const schema = new Schema({ } }, { - // throughput: { read: config.DYNAMODB.AWS_READ_UNITS, write: config.DYNAMODB.AWS_WRITE_UNITS } - throughput: 'ON_DEMAND' + throughput: config.DYNAMODB.IS_LOCAL_DB ? { read: config.DYNAMODB.AWS_READ_UNITS, write: config.DYNAMODB.AWS_WRITE_UNITS } : 'ON_DEMAND' }) module.exports = schema diff --git a/src/models/index.js b/src/models/index.js index 63b4cce..66ff4a7 100644 --- a/src/models/index.js +++ b/src/models/index.js @@ -16,7 +16,7 @@ const awsConfigs = config.DYNAMODB.IS_LOCAL_DB ? { dynamoose.AWS.config.update(awsConfigs) if (config.DYNAMODB.IS_LOCAL_DB) { - dynamoose.local(config.DYNAMODB.DYNAMODB_URL) + dynamoose.local(config.DYNAMODB.URL) } dynamoose.setDefaults({ diff --git a/src/routes.js b/src/routes.js index 679f3b0..8f47d1c 100644 --- a/src/routes.js +++ b/src/routes.js @@ -3,7 +3,9 @@ */ const constants = require('../app-constants') -const { SCOPES: { READ, CREATE, DELETE, UPDATE, ALL } } = require('config') +const { + SCOPES: { READ, CREATE, DELETE, UPDATE, ALL } +} = require('config') module.exports = { '/resources': { @@ -20,7 +22,8 @@ module.exports = { method: 'createResource', auth: 'jwt', access: [constants.UserRoles.Admin, constants.UserRoles.Copilot, constants.UserRoles.Manager, constants.UserRoles.User], - scopes: [CREATE, ALL] + scopes: [CREATE, ALL], + blockByIp: true }, delete: { controller: 'ResourceController', @@ -30,6 +33,24 @@ module.exports = { scopes: [DELETE, ALL] } }, + '/resources/count': { + get: { + controller: 'ResourceController', + method: 'getResourceCount', + auth: 'jwt', + access: [constants.UserRoles.Admin], + scopes: [READ, ALL] + } + }, + '/resources/internal/jobs/clean': { + post: { + controller: 'CleanUpController', + method: 'cleanUpTestData', + auth: 'jwt', + access: [constants.UserRoles.Admin], + scopes: [ALL] + } + }, '/resources/health': { get: { controller: 'HealthCheckController', diff --git a/src/scripts/create-tables.js b/src/scripts/create-tables.js index 2f52ef9..818699b 100644 --- a/src/scripts/create-tables.js +++ b/src/scripts/create-tables.js @@ -9,7 +9,7 @@ const logger = require('../common/logger') logger.info('Requesting to create tables...') const promises = [] -const skipModels = ['DynamoDB', 'MemberStats', 'MemberProfile'] +const skipModels = ['DynamoDB', 'MemberProfile'] Object.keys(models).forEach(modelName => { if (!includes(skipModels, modelName)) { diff --git a/src/scripts/drop-tables.js b/src/scripts/drop-tables.js index cc95a93..e1bc95c 100644 --- a/src/scripts/drop-tables.js +++ b/src/scripts/drop-tables.js @@ -9,7 +9,7 @@ const logger = require('../common/logger') logger.info('Requesting to delete tables...') const promises = [] -const skipModels = ['DynamoDB', 'MemberStats', 'MemberProfile'] +const skipModels = ['DynamoDB', 'MemberProfile'] Object.keys(models).forEach(modelName => { if (!includes(skipModels, modelName)) { diff --git a/src/scripts/seed-tables.js b/src/scripts/seed-tables.js index 57088af..19de355 100644 --- a/src/scripts/seed-tables.js +++ b/src/scripts/seed-tables.js @@ -1,7 +1,7 @@ /** * Seed table data in database */ -const { get } = require('lodash') +const { get, includes } = require('lodash') const models = require('../models') const logger = require('../common/logger') @@ -9,13 +9,17 @@ logger.info('Requesting to seed data to the resources tables...') const promises = [] +const skipModels = ['DynamoDB', 'MemberStats', 'MemberProfile'] + Object.keys(models).forEach(modelName => { - try { - const data = require(`./seed/${modelName}.json`) - logger.info(`Inserting ${get(data, 'length')} records in table ${modelName}`) - promises.push(models[modelName].batchPut(data)) - } catch (e) { - logger.warn(`No records will be inserted in table ${modelName} error: ${e}`) + if (!includes(skipModels, modelName)) { + try { + const data = require(`./seed/${modelName}.json`) + logger.info(`Inserting ${get(data, 'length')} records in table ${modelName}`) + promises.push(models[modelName].batchPut(data)) + } catch (e) { + logger.warn(`No records will be inserted in table ${modelName} error: ${e}`) + } } }) diff --git a/src/services/CleanUpService.js b/src/services/CleanUpService.js new file mode 100644 index 0000000..76f1458 --- /dev/null +++ b/src/services/CleanUpService.js @@ -0,0 +1,100 @@ +/** + * This service provides operations to clean up the environment for running automated tests. + */ + +const _ = require('lodash') +const config = require('config') +const models = require('../models') +const helper = require('../common/helper') +const logger = require('../common/logger') + +/** + * Delete the Resource from the OS by the given id + * @param id the resource id + * @returns {Promise} + */ +const deleteFromOSById = async (id) => { + // delete from ES + const osClient = await helper.getOSClient() + await osClient.delete({ + index: config.OS.OS_INDEX, + id: id, + refresh: 'true' // refresh ES so that it is effective for read operations instantly + }) +} + +/** + * Get Data by model id. + * @param {Object} modelName The dynamoose model name + * @param {String} id The id value + * @returns {Promise} + */ +const getById = async (modelName, id) => { + return new Promise((resolve, reject) => { + models[modelName].query('id').eq(id).exec((err, result) => { + if (err) { + logger.info('ERROR') + return reject(err) + } + if (result.length > 0) { + return resolve(result[0]) + } else { + return resolve(null) + } + }) + }) +} + +/** + * Delete the record from database by the given id. + * @param modelName the model name + * @param id the id + * @returns {Promise} + */ +const deleteFromDBById = async (modelName, id) => { + if (id && id.length > 0) { + try { + const entity = await getById(modelName, id) + if (entity) { + await entity.delete() + } + } catch (err) { + throw err + } + } +} + +/** + * Clear the postman test data. The main function of this class. + * @returns {Promise} + */ +const cleanUpTestData = async () => { + logger.info('clear the test data from postman test!') + let roles = await helper.scanAll('ResourceRole') + roles = _.filter(roles, r => (r.name.startsWith(config.AUTOMATED_TESTING_NAME_PREFIX))) + for (const role of roles) { + let roleId = role.id + let rolePhaseDeps = await helper.scanAll('ResourceRolePhaseDependency') + rolePhaseDeps = _.filter(rolePhaseDeps, d => (d.resourceRoleId === roleId)) + for (const dep of rolePhaseDeps) { + logger.info('ResourceRolePhaseDependency to be deleted', dep.id) + await deleteFromDBById('ResourceRolePhaseDependency', dep.id) + } + let resources = await helper.scanAll('Resource') + resources = _.filter(resources, r => (r.roleId === roleId)) + for (const res of resources) { + logger.info('Resource to be deleted', res.id) + await deleteFromDBById('Resource', res.id) + await deleteFromOSById(res.id) + } + logger.info('ResourceRole to be deleted', roleId) + await deleteFromDBById('ResourceRole', roleId) + } + logger.info('clear the test data from postman test completed!') +} + +module.exports = { + cleanUpTestData +} + +logger.buildService(module.exports) diff --git a/src/services/ResourceRolePhaseDependencyService.js b/src/services/ResourceRolePhaseDependencyService.js index d0f0a4c..f83c3e6 100644 --- a/src/services/ResourceRolePhaseDependencyService.js +++ b/src/services/ResourceRolePhaseDependencyService.js @@ -7,7 +7,7 @@ const config = require('config') const Joi = require('joi') const { v4: uuid } = require('uuid') const helper = require('../common/helper') -// const logger = require('../common/logger') +const logger = require('../common/logger') const errors = require('../common/errors') /** @@ -24,10 +24,15 @@ async function getDependencies (criteria) { options.resourceRoleId = { eq: criteria.resourceRoleId } } if (!_.isNil(criteria.phaseState)) { - options.phaseState = { eq: criteria.phaseState } + options.phaseState = { eq: criteria.phaseState === 'true' } + } + const list = await helper.scanAll('ResourceRolePhaseDependency', options) + return { + data: list, + total: list.length, + page: 1, + perPage: Math.max(10, list.length) } - const list = await helper.scan('ResourceRolePhaseDependency', options) - return list } getDependencies.schema = { @@ -150,4 +155,4 @@ module.exports = { deleteDependency } -// logger.buildService(module.exports) +logger.buildService(module.exports) diff --git a/src/services/ResourceRoleService.js b/src/services/ResourceRoleService.js index cadd0ba..1024c3a 100644 --- a/src/services/ResourceRoleService.js +++ b/src/services/ResourceRoleService.js @@ -7,7 +7,7 @@ const config = require('config') const Joi = require('joi') const { v4: uuid } = require('uuid') const helper = require('../common/helper') -// const logger = require('../common/logger') +const logger = require('../common/logger') const payloadFields = ['id', 'name', 'legacyId', 'fullReadAccess', 'fullWriteAccess', 'isActive', 'selfObtainable'] @@ -17,16 +17,22 @@ const payloadFields = ['id', 'name', 'legacyId', 'fullReadAccess', 'fullWriteAcc * @returns {Array} the search result */ async function getResourceRoles (criteria) { - let records = await helper.scan('ResourceRole') + let records = await helper.scanAll('ResourceRole') if (criteria.name) records = _.filter(records, e => (criteria.name === e.name)) if (criteria.id) records = _.filter(records, e => (criteria.id === e.id)) if (criteria.legacyId) records = _.filter(records, e => (_.toNumber(criteria.legacyId) === _.toNumber(e.legacyId))) - if (!_.isUndefined(criteria.isActive)) records = _.filter(records, e => (e.isActive === (criteria.isActive === 'true'))) - if (!_.isUndefined(criteria.selfObtainable)) records = _.filter(records, e => (e.selfObtainable === (criteria.selfObtainable === 'true'))) - if (!_.isUndefined(criteria.fullReadAccess)) records = _.filter(records, e => (e.fullReadAccess === (criteria.fullReadAccess === 'true'))) - if (!_.isUndefined(criteria.fullWriteAccess)) records = _.filter(records, e => (e.fullWriteAccess === (criteria.fullWriteAccess === 'true'))) + if (!_.isUndefined(criteria.isActive)) records = _.filter(records, e => (_.toString(e.isActive) === _.toString(criteria.isActive))) + if (!_.isUndefined(criteria.selfObtainable)) records = _.filter(records, e => (e.selfObtainable === criteria.selfObtainable)) + if (!_.isUndefined(criteria.fullReadAccess)) records = _.filter(records, e => (e.fullReadAccess === criteria.fullReadAccess)) + if (!_.isUndefined(criteria.fullWriteAccess)) records = _.filter(records, e => (e.fullWriteAccess === criteria.fullWriteAccess)) - return _.map(records, e => _.pick(e, payloadFields)) + const result = _.map(records, e => _.pick(e, payloadFields)) + return { + data: result, + total: result.length, + page: 1, + perPage: Math.max(10, result.length) + } } getResourceRoles.schema = { @@ -35,7 +41,7 @@ getResourceRoles.schema = { selfObtainable: Joi.boolean(), fullReadAccess: Joi.boolean(), fullWriteAccess: Joi.boolean(), - id: Joi.id(), + id: Joi.optionalId(), legacyId: Joi.number(), name: Joi.string() }).required() @@ -116,4 +122,4 @@ module.exports = { updateResourceRole } -// logger.buildService(module.exports) +logger.buildService(module.exports) diff --git a/src/services/ResourceService.js b/src/services/ResourceService.js index 6132977..7ba0af9 100644 --- a/src/services/ResourceService.js +++ b/src/services/ResourceService.js @@ -12,25 +12,23 @@ const helper = require('../common/helper') const logger = require('../common/logger') const errors = require('../common/errors') const ResourceRolePhaseDependencyService = require('./ResourceRolePhaseDependencyService') +const constants = require('../../app-constants') const payloadFields = ['id', 'challengeId', 'memberId', 'memberHandle', 'roleId', 'created', 'createdBy', 'updated', 'updatedBy', 'legacyId'] /** * Check whether the user can access resources - * @param {Object} currentUser the current user - * @param {Array} the resources of specified challenge id + * @param {Array} resources resources of current user for specified challenge id */ -async function checkAccess (currentUser, resources) { +async function checkAccess (currentUserResources) { const list = await helper.scan('ResourceRole') - const fullAccessRoles = new Set() + const fullAccessRoles = [] _.each(list, e => { if (e.isActive && e.fullReadAccess && e.fullWriteAccess) { - fullAccessRoles.add(e.id) + fullAccessRoles.push(e.id) } }) - if (!_.reduce(resources, - (result, r) => _.toString(r.memberId) === _.toString(currentUser.userId) && fullAccessRoles.has(r.roleId) ? true : result, - false)) { + if (_.isEmpty(_.intersectionWith(currentUserResources, fullAccessRoles, (a, b) => a.roleId === b))) { throw new errors.ForbiddenError(`Only M2M, admin or user with full access role can perform this action`) } } @@ -40,46 +38,71 @@ async function checkAccess (currentUser, resources) { * @param {Object} currentUser the current user * @param {String} challengeId the challenge id * @param {String} roleId the role id to filter on + * @param {String} memberId the member id + * @param {String} memberHandle the member handle * @param {Number} page The page number * @param {Number} perPage The number of items to list per page - * @returns {Array} the search result + * @param {Number} sortBy The field that becomes the sorting criteria + * @param {Number} sortOrder The sort order + * @returns {Object} the search result */ -async function getResources (currentUser, challengeId, roleId, page, perPage) { - if (!validateUUID(challengeId)) { +async function getResources (currentUser, challengeId, roleId, memberId, memberHandle, page, perPage, sortBy, sortOrder) { + page = page || 1 + perPage = perPage || config.DEFAULT_PAGE_SIZE + sortBy = sortBy || 'created' + sortOrder = sortOrder || 'asc' + logger.debug(`getResources ${JSON.stringify([currentUser, challengeId, roleId, memberId, memberHandle, page, perPage, sortBy, sortOrder])}`) + if (!challengeId && !memberId && !memberHandle) { + throw new errors.BadRequestError('At least one of the following parameters is required: [challengeId, memberId, memberHandle]') + } + if (challengeId && !validateUUID(challengeId)) { throw new errors.BadRequestError(`Challenge ID ${challengeId} must be a valid v5 Challenge Id (UUID)`) } - try { - // Verify that the challenge exists - await helper.getRequest(`${config.CHALLENGE_API_URL}/${challengeId}`) - } catch (e) { - throw new errors.NotFoundError(`Challenge ID ${challengeId} not found`) + if (challengeId) { + try { + // Verify that the challenge exists + await helper.getRequest(`${config.CHALLENGE_API_URL}/${challengeId}`, { checkIfExists: 'true' }) + } catch (e) { + throw new errors.NotFoundError(`Challenge ID ${challengeId} not found`) + } } const boolQuery = [] const mustQuery = [] - page = page || 1 - perPage = perPage || config.DEFAULT_PAGE_SIZE let hasFullAccess // Check if the user has a resource with full access on the challenge - if (currentUser) { - const resources = await helper.query('Resource', { challengeId }) - try { - await checkAccess(currentUser, resources) - hasFullAccess = true - } catch (e) { - hasFullAccess = false + if (currentUser && !currentUser.isMachine && !helper.hasAdminRole(currentUser)) { + if (challengeId) { + const resources = await helper.query('Resource', { + hash: { challengeId: { eq: challengeId } }, + range: { memberId: { eq: currentUser.userId } } + }) + try { + await checkAccess(resources) + hasFullAccess = true + } catch (e) { + hasFullAccess = false + } + } + if (memberId && _.toString(memberId) !== _.toString(currentUser.userId)) { + throw new errors.ForbiddenError('You are not allowed to perform this operation!') + } + if (memberHandle && memberHandle !== currentUser.handle) { + throw new errors.ForbiddenError('You are not allowed to perform this operation!') } } - boolQuery.push({ match_phrase: { challengeId } }) + if (challengeId) { + boolQuery.push({ match_phrase: { challengeId } }) + } else if (!currentUser) { + throw new errors.ForbiddenError('You are not allowed to perform this operation!') + } - // logger.warn('User Check') if (!currentUser) { // if the user is not logged in, only return resources with submitter role ID boolQuery.push({ match_phrase: { roleId: config.SUBMITTER_RESOURCE_ROLE_ID } }) } else if (!currentUser.isMachine && !helper.hasAdminRole(currentUser) && !hasFullAccess) { - // await checkAccess(currentUser, resources) // if not admin, and not machine, only return submitters + all my roles boolQuery.push({ bool: { @@ -98,8 +121,15 @@ async function getResources (currentUser, challengeId, roleId, page, perPage) { ] } }) - } else if (roleId) { - boolQuery.push({ match_phrase: { roleId } }) + } else { + if (roleId) { + boolQuery.push({ match_phrase: { roleId } }) + } + if (memberId) { + boolQuery.push({ match_phrase: { memberId } }) + } else if (memberHandle) { + boolQuery.push({ match_phrase: { memberHandle } }) + } } mustQuery.push({ @@ -108,39 +138,13 @@ async function getResources (currentUser, challengeId, roleId, page, perPage) { } }) - const esQuery = { - index: config.get('ES.ES_INDEX'), - type: config.get('ES.ES_TYPE'), - size: perPage, - from: perPage * (page - 1), // Es Index starts from 0 - body: { - query: { - bool: { - must: mustQuery - } - } - } - } - const esClient = await helper.getESClient() - let docs - // logger.debug(`ES Query ${JSON.stringify(esQuery)}`) - try { - docs = await esClient.search(esQuery) - } catch (e) { - // Catch error when the ES is fresh and has no data - logger.info(`Query Error from ES ${JSON.stringify(e)}`) + const sortCriteria = [{ [sortBy]: { 'order': sortOrder } }] + let docs = await searchOS(mustQuery, perPage, page, sortCriteria) + docs = docs.body - docs = { - hits: { - total: 0, - hits: [] - } - } - } // Extract data from hits const allResources = _.map(docs.hits.hits, item => item._source) const resources = _.map(allResources, item => ({ ...item, memberId: (_.toString(item.memberId)) })) - // logger.warn('Resources extracted') const memberIds = _.uniq(_.map(resources, r => r.memberId)) @@ -162,7 +166,6 @@ async function getResources (currentUser, challengeId, roleId, page, perPage) { } completeResources.push(completeResource) } else { - // logger.warn(`memberInfo not found in db for memberId [${resource.memberId}]}`) completeResources.push(resource) } } @@ -177,23 +180,16 @@ async function getResources (currentUser, challengeId, roleId, page, perPage) { getResources.schema = { currentUser: Joi.any(), - challengeId: Joi.id(), + challengeId: Joi.optionalId(), roleId: Joi.optionalId(), - page: Joi.page(), - perPage: Joi.perPage() + memberId: Joi.string(), + memberHandle: Joi.string(), + page: Joi.page().default(1), + perPage: Joi.perPage().default(config.DEFAULT_PAGE_SIZE), + sortBy: Joi.string().valid('memberHandle', 'created').default('created'), + sortOrder: Joi.string().valid('desc', 'asc').default('asc') } -/** - * Get member information using v3 API - * @param {String} memberHandle the member handle - * @returns {String} the member id and member handle - */ -// async function getMemberInfo (memberHandle) { -// const member = await helper.getMemberByHandle(memberHandle) -// if (member) return { memberId: member.userId, handle: member.handle } -// return -// } - /** * Get the resource role. * @param {String} roleId the resource role id @@ -225,57 +221,110 @@ async function getResourceRole (roleId, isCreated) { * @param {String} challengeId the challenge id * @param {Object} resource the resource to be created * @param {Boolean} isCreated the flag indicate it is create operation. - * @returns {Object} the resource entities and member information. + * @returns {Promise} the resource entities and member information. */ async function init (currentUser, challengeId, resource, isCreated) { // Verify that the challenge exists const challengeRes = await helper.getRequest(`${config.CHALLENGE_API_URL}/${challengeId}`) const challenge = challengeRes.body + if (_.get(challenge, 'status') === constants.ChallengeStatuses.Completed && !isCreated) { + throw new errors.BadRequestError('Cannot delete resources of a completed challenge!') + } + + if (!_.get(challenge, 'task.isTask', false) && _.get(challenge, 'status') !== constants.ChallengeStatuses.Active && isCreated && resource.roleId === config.SUBMITTER_RESOURCE_ROLE_ID) { + throw new errors.BadRequestError(`Cannot create submitter resource on challenge with status ${_.get(challenge, 'status')}`) + } + + const allResources = await helper.query('Resource', { challengeId }) + + const registrationPhase = challenge.phases.find((phase) => phase.name === 'Registration') + const currentSubmitters = _.filter(allResources, (r) => r.roleId === config.SUBMITTER_RESOURCE_ROLE_ID) + const handle = resource.memberHandle + const userResources = allResources.filter((r) => _.toLower(r.memberHandle) === _.toLower(handle)) + // Retrieve the constraint - Allowed Registrants + if (isCreated && resource.roleId === config.SUBMITTER_RESOURCE_ROLE_ID) { + const allowedRegistrants = _.get(challenge, 'constraints.allowedRegistrants') + // enforce the allowed Registrants constraint + if ( + _.isArray(allowedRegistrants) && + !_.isEmpty(allowedRegistrants) && + !_.some( + allowedRegistrants, + (allowed) => _.toLower(allowed) === _.toLower(handle) + ) + ) { + throw new errors.ConflictError( + `User ${resource.memberHandle} is not allowed to register.` + ) + } + if (!_.get(challenge, 'task.isTask', false) && (_.toLower(challenge.createdBy) === _.toLower(handle) || + _.some(userResources, r => r.roleId === config.REVIEWER_RESOURCE_ROLE_ID || r.roleId === config.ITERATIVE_REVIEWER_RESOURCE_ROLE_ID))) { + throw new errors.BadRequestError( + `User ${resource.memberHandle} is not allowed to register.` + ) + } + } + // Prevent from creating more than 1 submitter resources on tasks if (_.get(challenge, 'task.isTask', false) && isCreated && resource.roleId === config.SUBMITTER_RESOURCE_ROLE_ID) { - const existing = await getResources(currentUser, challengeId, config.SUBMITTER_RESOURCE_ROLE_ID, 1, 1) - if (_.find(existing.data, r => r.roleId === config.SUBMITTER_RESOURCE_ROLE_ID)) { + if (currentSubmitters.length > 0) { throw new errors.ConflictError(`The Task is already assigned`) } } - // logger.error(`Init Member for ${JSON.stringify(currentUser)}`) - // get member information using v3 API - const handle = resource.memberHandle - const memberId = await helper.getMemberIdByHandle(resource.memberHandle) + const currentUserResources = allResources.filter((r) => _.toString(r.memberId) === _.toString(currentUser.userId)) + const isResourceExist = !_.isUndefined(_.find(userResources, r => r.roleId === resource.roleId)) + if (isCreated && isResourceExist) { + throw new errors.ConflictError(`User ${resource.memberHandle} already has resource with roleId: ${resource.roleId} in challenge: ${challengeId}`) + } + + if (!isCreated && !isResourceExist) { + throw new errors.NotFoundError(`User ${handle} doesn't have resource with roleId: ${resource.roleId} in challenge ${challengeId}`) + } + + const { memberId, email } = await helper.getMemberDetailsByHandle(handle) + // check if the resource is reviewer role and has already made a submission in the challenge + if (isCreated && (resource.roleId === config.REVIEWER_RESOURCE_ROLE_ID || resource.roleId === config.ITERATIVE_REVIEWER_RESOURCE_ROLE_ID)) { + const submissionsRes = await helper.getRequest(`${config.SUBMISSIONS_API_URL}`, { challengeId: challengeId, perPage: 100, memberId: memberId }) + const submissions = submissionsRes.body + if (submissions.length !== 0) { + throw new errors.ConflictError(`The member has already submitted to the challenge and cannot have a Reviewer or Iterative Reviewer role`) + } + } // ensure resource role existed const resourceRole = await getResourceRole(resource.roleId, isCreated) - // perform access validation - let resources // Verify the member has agreed to the challenge terms if (isCreated) { await helper.checkAgreedTerms(memberId, _.filter(_.get(challenge, 'terms', []), t => t.roleId === resourceRole.id)) } if (!currentUser.isMachine && !helper.hasAdminRole(currentUser)) { // Check if user has agreed to the challenge terms - resources = await helper.query('Resource', { challengeId }) - if (!resourceRole.selfObtainable || _.toString(memberId) !== _.toString(currentUser.userId)) { - // if user is not creating/deleting a self obtainable resource for itself - // we need to perform check access first - await checkAccess(currentUser, resources) + if (!_.get(challenge, 'legacy.selfService')) { + if (!resourceRole.selfObtainable || _.toString(memberId) !== _.toString(currentUser.userId)) { + // if user is not creating/deleting a self obtainable resource for itself + // we need to perform check access first + await checkAccess(currentUserResources) + } } - } else { - // fetch resources for specified challenge and member - resources = await helper.query('Resource', { - hash: { challengeId: { eq: challengeId } }, - range: { memberId: { eq: memberId } } - }) } + + let closeRegistration = false + if (isCreated && registrationPhase && challenge.legacy != null && challenge.legacy.subTrack === 'FIRST_2_FINISH') { + const isPastScheduledEndDate = moment().utc() > moment(registrationPhase.scheduledEndDate).utc() + closeRegistration = registrationPhase.isOpen && isPastScheduledEndDate && resource.roleId === config.SUBMITTER_RESOURCE_ROLE_ID + } + // skip phase dependency checks for tasks if (_.get(challenge, 'task.isTask', false)) { - return { resources, memberId, handle } + return { allResources, userResources, memberId, handle, email, challenge, closeRegistration } } + // bypass phase dependency checks if the caller is an m2m/admin if (currentUser.isMachine || helper.hasAdminRole(currentUser)) { - return { resources, memberId, handle } + return { allResources, userResources, memberId, handle, email, challenge, closeRegistration } } // check phases dependencies const dependencies = await ResourceRolePhaseDependencyService.getDependencies({ resourceRoleId: resource.roleId }) @@ -303,7 +352,7 @@ async function init (currentUser, challengeId, resource, isCreated) { }) // return resources and the member id - return { resources, memberId, handle } + return { allResources, userResources, memberId, handle, email, challenge, closeRegistration } } /** @@ -315,19 +364,9 @@ async function init (currentUser, challengeId, resource, isCreated) { async function createResource (currentUser, resource) { try { const challengeId = resource.challengeId + const { memberId, handle, email, challenge, closeRegistration } = await init(currentUser, challengeId, resource, true) - const { resources, memberId, handle } = await init(currentUser, challengeId, resource, true) - if (handle) { - resource.memberHandle = handle - } - - if (_.reduce(resources, - (result, r) => _.toString(r.memberId) === _.toString(memberId) && r.roleId === resource.roleId ? true : result, - false)) { - throw new errors.ConflictError(`User ${resource.memberHandle} already has resource with roleId: ${resource.roleId} in challenge: ${challengeId}`) - } - - // logger.warn(JSON.stringify(currentUser)) + const timelineTemplateId = _.get(challenge, 'timelineTemplateId', null) const ret = await helper.create('Resource', _.assign({ id: uuid(), @@ -336,11 +375,10 @@ async function createResource (currentUser, resource) { createdBy: currentUser.handle || currentUser.sub }, resource)) - // Create resources in ES - const esClient = await helper.getESClient() - await esClient.create({ - index: config.ES.ES_INDEX, - type: config.ES.ES_TYPE, + // Create resources in OS + const osClient = await helper.getOSClient() + await osClient.index({ + index: config.OS.OS_INDEX, id: ret.id, body: _.pick(ret, payloadFields), refresh: 'true' // refresh ES so that it is visible for read operations instantly @@ -348,6 +386,41 @@ async function createResource (currentUser, resource) { logger.debug(`Created resource: ${JSON.stringify(_.pick(ret, payloadFields))}`) await helper.postEvent(config.RESOURCE_CREATE_TOPIC, _.pick(ret, payloadFields)) + if (!_.get(challenge, 'task.isTask', false) && resource.roleId === config.SUBMITTER_RESOURCE_ROLE_ID) { + const forumUrl = _.get(challenge, 'discussions[0].url') + let templateId = config.REGISTRATION_EMAIL.SENDGRID_TEMPLATE_ID + if (_.isUndefined(forumUrl)) { + templateId = config.REGISTRATION_EMAIL.SENDGRID_TEMPLATE_ID_NO_FORUM + } + console.log('challenge template id', timelineTemplateId) + console.log('config template id', config.get('TOPCROWD_CHALLENGE_TEMPLATE_ID')) + if (config.get('TOPCROWD_CHALLENGE_TEMPLATE_ID') !== timelineTemplateId) { + console.log('sending email') + await helper.postEvent(config.EMAIL_NOTIFICATIN_TOPIC, { + from: config.REGISTRATION_EMAIL.EMAIL_FROM, + replyTo: config.REGISTRATION_EMAIL.EMAIL_FROM, + recipients: [email], + data: { + handle, + challengeName: challenge.name, + forum: forumUrl, + submissionEndTime: new Date(_.get(_.find(challenge.phases, phase => phase.name === 'Submission'), 'scheduledEndDate')).toUTCString(), + submitUrl: _.replace(config.REGISTRATION_EMAIL.SUBMIT_URL, ':id', challengeId), + reviewAppUrl: config.REGISTRATION_EMAIL.REVIEW_APP_URL + challenge.legacyId, + helpUrl: config.REGISTRATION_EMAIL.HELP_URL, + support: config.REGISTRATION_EMAIL.SUPPORT_EMAIL + }, + sendgrid_template_id: templateId, + version: 'v3' + }) + } + } + + if (closeRegistration) { + logger.info(`Closing registration phase for challenge ${challengeId}`) + const response = await helper.advanceChallengePhase(challengeId, 'Registration', 'close') + logger.info(`Closed registration phase for challenge ${challengeId} with response ${JSON.stringify(response)}`) + } return ret } catch (err) { @@ -378,25 +451,24 @@ async function deleteResource (currentUser, resource) { try { const challengeId = resource.challengeId - const { resources, memberId, handle } = await init(currentUser, challengeId, resource) + const { allResources, memberId, handle } = await init(currentUser, challengeId, resource) - const ret = _.reduce(resources, + const ret = _.reduce(allResources, (result, r) => _.toString(r.memberId) === _.toString(memberId) && r.roleId === resource.roleId ? r : result, undefined) if (!ret) { - throw new errors.BadRequestError(`User ${handle || resource.memberHandle} doesn't have resource with roleId: ${resource.roleId} in challenge ${challengeId}`) + throw new errors.NotFoundError(`User ${handle} doesn't have resource with roleId: ${resource.roleId} in challenge ${challengeId}`) } await ret.delete() - // delete from ES - const esClient = await helper.getESClient() - await esClient.delete({ - index: config.ES.ES_INDEX, - type: config.ES.ES_TYPE, + // delete from OS + const osClient = await helper.getOSClient() + await osClient.delete({ + index: config.OS.OS_INDEX, id: ret.id, - refresh: 'true' // refresh ES so that it is effective for read operations instantly + refresh: 'true' // refresh OS so that it is effective for read operations instantly }) logger.debug(`Deleted resource, posting to Bus API: ${JSON.stringify(_.pick(ret, payloadFields))}`) @@ -427,12 +499,6 @@ deleteResource.schema = { * @returns {Array} an array of challenge ids represents challenges that given member has access to. */ async function listChallengesByMember (memberId, criteria) { - // removing this call. If a member doesn't exist, it won't find any challenges - // const res = await helper.getRequest(`${config.USER_API_URL}?filter=id=${memberId}`) - // if (_.get(res, 'body.result.content').length === 0) { - // throw new errors.BadRequestError(`User with id: ${memberId} doesn't exist`) - // } - const boolQuery = [] const mustQuery = [] const perPage = criteria.perPage || config.DEFAULT_PAGE_SIZE @@ -440,36 +506,145 @@ async function listChallengesByMember (memberId, criteria) { boolQuery.push({ match_phrase: { memberId } }) if (criteria.resourceRoleId) boolQuery.push({ match_phrase: { roleId: criteria.resourceRoleId } }) - if (boolQuery.length > 0) { - mustQuery.push({ - bool: { - filter: boolQuery - } - }) + mustQuery.push({ + bool: { + filter: boolQuery + } + }) + + let docs = { + hits: { + total: 0, + hits: [] + } + } + + if (criteria.useScroll) { + docs = await searchOSWithScroll(mustQuery) + } else if (perPage * page <= config.MAX_ELASTIC_SEARCH_RECORDS_SIZE) { + docs = await searchOS(mustQuery, perPage, page).body + } else { + throw new errors.BadRequestError(` + OS pagination params: + page ${page}, + perPage: ${perPage} + exceeds the max search window:${config.MAX_ELASTIC_SEARCH_RECORDS_SIZE}` + ) + } + logger.debug(`Docs from OS: ${JSON.stringify(docs)}`) + + // Extract data from hits + let result = _.map(docs.hits.hits, item => item._source) + const arr = _.uniq(_.map(result, 'challengeId')) + return { + data: arr, + total: docs.hits.total, + page, + perPage } +} - const esQuery = { - index: config.get('ES.ES_INDEX'), - type: config.get('ES.ES_TYPE'), - size: perPage, - from: perPage * (page - 1), // Es Index starts from 0 +listChallengesByMember.schema = { + memberId: Joi.string().required(), + criteria: Joi.object().keys({ + resourceRoleId: Joi.string().uuid(), + page: Joi.page().default(1), + perPage: Joi.perPage().default(config.DEFAULT_PAGE_SIZE), + useScroll: Joi.boolean().default(false) + }).required() +} + +async function searchOSWithScroll (mustQuery) { + const scrollTimeout = '1m' + const osQuery = { + index: config.get('OS.OS_INDEX'), + size: 10000, body: { - query: mustQuery.length > 0 ? { + query: { bool: { must: mustQuery - // must_not: mustNotQuery } - } : { - match_all: {} } + }, + scroll: scrollTimeout + } + + const osClient = await helper.getOSClient() + let searchResponse = await osClient.search(osQuery) + // eslint-disable-next-line camelcase + const { _scroll_id, hits } = searchResponse.body + const totalHits = hits.total + + // eslint-disable-next-line camelcase + let scrollId = _scroll_id + + while (hits.hits.length < totalHits) { + const nextScrollResponse = await osClient.scroll({ + scroll: scrollTimeout, + scroll_id: scrollId + }) + + scrollId = nextScrollResponse._scroll_id + hits.hits = [...hits.hits, ...nextScrollResponse.hits.hits] + } + + await osClient.clearScroll({ + body: { + // eslint-disable-next-line camelcase + scroll_id: [_scroll_id] + } + }) + + return { + hits: { + total: hits.total, + hits: hits.hits } } - // logger.warn(`esQuery ${JSON.stringify(esQuery)}`) +} - const esClient = await helper.getESClient() +/** + * Execute OS query + * @param {Object} mustQuery the query that will be sent to ES + * @param {Number} perPage number of search result per page + * @param {Number} page the current page + * @returns {Object} doc from OS + */ +async function searchOS (mustQuery, perPage, page, sortCriteria) { + let osQuery + if (sortCriteria) { + osQuery = { + index: config.get('OS.OS_INDEX'), + size: perPage, + from: perPage * (page - 1), // Es Index starts from 0 + body: { + query: { + bool: { + must: mustQuery + } + }, + sort: sortCriteria + } + } + } else { + osQuery = { + index: config.get('OS.OS_INDEX'), + size: perPage, + from: perPage * (page - 1), // Es Index starts from 0 + body: { + query: { + bool: { + must: mustQuery + } + } + } + } + } + logger.debug(`OS Query ${JSON.stringify(osQuery)}`) + const osClient = await helper.getOSClient() let docs try { - docs = await esClient.search(esQuery) + docs = await osClient.search(osQuery) } catch (e) { // Catch error when the ES is fresh and has no data logger.info(`Query Error from ES ${JSON.stringify(e)}`) @@ -480,31 +655,65 @@ async function listChallengesByMember (memberId, criteria) { } } } - // Extract data from hits - let result = _.map(docs.hits.hits, item => item._source) - const arr = _.uniq(_.map(result, 'challengeId')) - return { - data: arr, - total: docs.hits.total, - page, - perPage + return docs +} + +/** + * Get resource count of a challenge. + * @param {String} challengeId the challenge id + * @param {String} roleId the role id to filter on + * @returns {Object} the search result + */ +async function getResourceCount (challengeId, roleId) { + logger.debug(`getResourceCount ${JSON.stringify([challengeId, roleId])}`) + const must = [{ term: { 'challengeId.keyword': challengeId } }] + if (roleId) { + must.push({ term: { 'roleId.keyword': roleId } }) } + + const osQuery = { + index: config.get('OS.OS_INDEX'), + size: 0, + body: { + query: { + bool: { + must + } + }, + aggs: { + group_by_roleId: { + terms: { + field: 'roleId.keyword' + } + } + } + } + } + + const osClient = await helper.getOSClient() + let result + try { + result = await osClient.search(osQuery) + result = result.body + } catch (err) { + logger.error(`Get Resource Count Error ${JSON.stringify(err)}`) + throw err + } + const response = _.mapValues(_.keyBy(result.aggregations.group_by_roleId.buckets, 'key'), (v) => v.doc_count) + return response } -listChallengesByMember.schema = { - memberId: Joi.string().required(), - criteria: Joi.object().keys({ - resourceRoleId: Joi.string().uuid(), - page: Joi.page(), - perPage: Joi.perPage() - }).required() +getResourceCount.schema = { + challengeId: Joi.id(), + roleId: Joi.optionalId() } module.exports = { getResources, createResource, deleteResource, - listChallengesByMember + listChallengesByMember, + getResourceCount } -// logger.buildService(module.exports) +logger.buildService(module.exports) diff --git a/test/common/testData.js b/test/common/testData.js index 8a8e7be..8c1cd09 100644 --- a/test/common/testData.js +++ b/test/common/testData.js @@ -97,7 +97,7 @@ const requestBody = { resourceRoles: { stringFields: ['name'], booleanFields: ['fullReadAccess', 'fullWriteAccess', 'isActive', 'selfObtainable'], - requiredFields: ['name', 'fullReadAccess', 'fullWriteAccess', 'isActive', 'selfObtainable'], + requiredFields: ['name', 'isActive', 'selfObtainable'], testBody: { name: 'name', fullReadAccess: true, diff --git a/test/common/testHelper.js b/test/common/testHelper.js index 7fdeac0..f68448e 100644 --- a/test/common/testHelper.js +++ b/test/common/testHelper.js @@ -2,6 +2,7 @@ * This file defines helper methods */ +const config = require('config') const request = require('superagent') const should = require('should') const helper = require('../../src/common/helper') @@ -168,6 +169,21 @@ async function clearDependencies () { } } +/** + * Clear the OS documents. + */ +async function initES () { + const client = helper.getOSClient() + await client.deleteByQuery({ + index: config.OS.OS_INDEX, + body: { + query: { + match_all: {} + } + } + }) +} + module.exports = { getRequest, putRequest, @@ -180,5 +196,6 @@ module.exports = { assertResource, assertResourceRolePhaseDependency, initLogs, - clearDependencies + clearDependencies, + initES } diff --git a/test/e2e/createResource.test.js b/test/e2e/createResource.test.js deleted file mode 100644 index 41e35b4..0000000 --- a/test/e2e/createResource.test.js +++ /dev/null @@ -1,281 +0,0 @@ -/** - * E2E test of the Challenge Resource API - create resource endpoint. - */ - -const _ = require('lodash') -const config = require('config') -const should = require('should') -const ResourceRolePhaseDependencyService = require('../../src/services/ResourceRolePhaseDependencyService') -const { postRequest, getRoleIds, assertResource, clearDependencies } = require('../common/testHelper') -const { token, requestBody } = require('../common/testData') - -const challengeId1 = 'fe6d0a58-ce7d-4521-8501-b8132b1c0391' -const challengeId2 = 'fe6d0a58-ce7d-4521-8501-b8132b1c0392' -const challengeId3 = 'fe6d0a58-ce7d-4521-8501-b8132b1c0393' -const challengeNotFoundId = '11111111-ce7d-4521-8501-b8132b1c0391' -const resourceUrl = `http://localhost:${config.PORT}/${config.API_VERSION}/resources` -const resources = requestBody.resources - -module.exports = describe('Create resource endpoint', () => { - let copilotRoleId - let observerRoleId - let submitterRoleId - let reviewerRoleId - let dependency - - before(async () => { - const ret = await getRoleIds() - copilotRoleId = ret.copilotRoleId - observerRoleId = ret.observerRoleId - submitterRoleId = ret.submitterRoleId - reviewerRoleId = ret.reviewerRoleId - - const records = await ResourceRolePhaseDependencyService.getDependencies({ resourceRoleId: copilotRoleId }) - dependency = records[0] - }) - - it('failure - create resource with wrong phase state', async () => { - await ResourceRolePhaseDependencyService.updateDependency(dependency.id, { - phaseId: dependency.phaseId, - resourceRoleId: dependency.resourceRoleId, - phaseState: false - }) - try { - const body = resources.createBody('HoHoSKY', copilotRoleId, challengeId1) - await postRequest(resourceUrl, body, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `Phase ${dependency.phaseId} should not be open`) - } - }) - - it('create resource by admin', async () => { - await ResourceRolePhaseDependencyService.updateDependency(dependency.id, { - phaseId: dependency.phaseId, - resourceRoleId: dependency.resourceRoleId, - phaseState: true - }) - - const body = resources.createBody('HoHoSKY', copilotRoleId, challengeId1) - const res = await postRequest(resourceUrl, body, token.admin) - should.equal(res.status, 200) - await assertResource(res.body.id, res.body) - - // remove the dependencies so that below tests will not have these limitations - await clearDependencies() - }) - - it('create another resource for user hohosky', async () => { - const body = resources.createBody('HoHoSKY', reviewerRoleId, challengeId1) - const res = await postRequest(resourceUrl, body, token.admin) - should.equal(res.status, 200) - await assertResource(res.body.id, res.body) - }) - - it('create resource by user', async () => { - const body = resources.createBody('denis', submitterRoleId, challengeId1) - const res = await postRequest(resourceUrl, body, token.hohosky) - should.equal(res.status, 200) - await assertResource(res.body.id, res.body) - }) - - it('failure - create self obtainable resource for other user by normal user 403', async () => { - const body = resources.createBody('lars2520', submitterRoleId, challengeId1) - try { - await postRequest(resourceUrl, body, token.denis) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 403) - should.equal(_.get(err, 'response.body.message'), `Only M2M, admin or user with full access role can perform this action`) - } - }) - - it('create self obtainable resource by user itself', async () => { - const body = resources.createBody('lars2520', submitterRoleId, challengeId1) - const res = await postRequest(resourceUrl, body, token.lars2520) - should.equal(res.status, 200) - await assertResource(res.body.id, res.body) - }) - - it('failure - create non self obtainable resource by normal user 403', async () => { - const body = resources.createBody('lars2520', copilotRoleId, challengeId1) - try { - await postRequest(resourceUrl, body, token.lars2520) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 403) - should.equal(_.get(err, 'response.body.message'), `Only M2M, admin or user with full access role can perform this action`) - } - }) - - it('create resource using m2m token', async () => { - const body = resources.createBody('ghostar', submitterRoleId, challengeId1) - const res = await postRequest(resourceUrl, body, token.m2m) - should.equal(res.status, 200) - await assertResource(res.body.id, res.body) - }) - - it('create resource for user ghostar 1', async () => { - const body = resources.createBody('ghostar', reviewerRoleId, challengeId2) - const res = await postRequest(resourceUrl, body, token.m2m) - should.equal(res.status, 200) - await assertResource(res.body.id, res.body) - }) - - it('create resource for user ghostar 2', async () => { - const body = resources.createBody('ghostar', reviewerRoleId, challengeId3) - const res = await postRequest(resourceUrl, body, token.m2m) - should.equal(res.status, 200) - await assertResource(res.body.id, res.body) - }) - - it('create resource using inactive role, expected 400', async () => { - const body = resources.createBody('ghostar', observerRoleId, challengeId1) - try { - await postRequest(resourceUrl, body, token.m2m) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `Resource role with id: ${observerRoleId} is inactive, please use an active one.`) - } - }) - - it('create resource using non-existed role, expected 400', async () => { - const body = resources.createBody('ghostar', challengeId1, challengeId1) - try { - await postRequest(resourceUrl, body, token.m2m) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `No resource role found with id: ${challengeId1}.`) - } - }) - - it(`create resource member doesn't exist, expected 400`, async () => { - const body = resources.createBody('123abcx', challengeId1, challengeId1) - try { - await postRequest(resourceUrl, body, token.m2m) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `User with handle: 123abcx doesn't exist`) - } - }) - - let { stringFields, requiredFields, testBody } = resources - - it(`test invalid path parameter, challengeId must be UUID`, async () => { - let body = _.cloneDeep(testBody) - body.challengeId = 'invalid' - try { - await postRequest(resourceUrl, body, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `"challengeId" must be a valid GUID`) - } - }) - - for (const stringField of stringFields) { - it(`test invalid parameters, invalid string type field ${stringField}`, async () => { - let body = _.cloneDeep(testBody) - _.set(body, stringField, 123) - try { - await postRequest(resourceUrl, body, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `"${stringField}" must be a string`) - } - }) - } - - for (const requiredField of requiredFields) { - it(`test invalid parameters, required field ${requiredField} is missing`, async () => { - let body = _.cloneDeep(testBody) - body = _.omit(body, requiredField) - try { - await postRequest(resourceUrl, body, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `"${requiredField}" is required`) - } - }) - } - - it(`test without token, expected 401`, async () => { - try { - await postRequest(resourceUrl, testBody) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'No token provided.') - } - }) - - it(`test with invalid token(invalid), expected 401`, async () => { - try { - await postRequest(resourceUrl, testBody, 'invalid') - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'Invalid Token.') - } - }) - - it(`test with invalid token(expired), expected 401`, async () => { - try { - await postRequest(resourceUrl, testBody, token.expired) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'Failed to authenticate token.') - } - }) - - it(`test with user without permission, expected 403`, async () => { - const body = resources.createBody('tonyj', submitterRoleId, challengeId1) - try { - await postRequest(resourceUrl, body, token.denis) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 403) - should.equal(_.get(err, 'response.body.message'), 'Only M2M, admin or user with full access role can perform this action') - } - }) - - it(`test with invalid M2M token, expected 403`, async () => { - const body = resources.createBody('tonyj', submitterRoleId, challengeId1) - try { - await postRequest(resourceUrl, body, token.m2mRead) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 403) - should.equal(_.get(err, 'response.body.message'), 'You are not allowed to perform this action!') - } - }) - - it('create resource for non-existed challenge, expected 404', async () => { - const body = resources.createBody('ghostar', observerRoleId, challengeNotFoundId) - try { - await postRequest(resourceUrl, body, token.m2m) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 404) - should.equal(_.get(err, 'response.body.message'), `Challenge with id: ${challengeNotFoundId} doesn't exist.`) - } - }) - - it(`create duplicate resource, expected 409`, async () => { - const body = resources.createBody('hohosky', copilotRoleId, challengeId1) - try { - await postRequest(resourceUrl, body, token.m2mModify) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 409) - should.equal(_.get(err, 'response.body.message'), `User hohosky already has resource with roleId: ${copilotRoleId} in challenge: ${challengeId1}`) - } - }) -}) diff --git a/test/e2e/createResourceRole.test.js b/test/e2e/createResourceRole.test.js deleted file mode 100644 index c8e4bed..0000000 --- a/test/e2e/createResourceRole.test.js +++ /dev/null @@ -1,151 +0,0 @@ -/** - * E2E test of the Challenge Resource API - create resource role endpoint. - */ - -const _ = require('lodash') -const config = require('config') -const should = require('should') -const { postRequest, assertResourceRole } = require('../common/testHelper') -const { token, requestBody } = require('../common/testData') - -const resourceRoleUrl = `http://localhost:${config.PORT}/${config.API_VERSION}/resource-roles` -const resourceRoles = requestBody.resourceRoles - -module.exports = describe('Create resource role endpoint', () => { - it('create active full-access resource role by admin', async () => { - const body = resourceRoles.createBody('co-pilot', true, true, false) - const res = await postRequest(resourceRoleUrl, body, token.admin) - should.equal(res.status, 200) - const copilotRoleId = res.body.id - await assertResourceRole(copilotRoleId, body) - }) - - it('create inactive full-access resource role by M2M', async () => { - const body = resourceRoles.createBody('Observer', true, false, false) - const res = await postRequest(resourceRoleUrl, body, token.m2m) - should.equal(res.status, 200) - const observerRoleId = res.body.id - await assertResourceRole(observerRoleId, body) - }) - - it('create active not full-access resource role by admin', async () => { - const body = resourceRoles.createBody('submitter', false, true, true) - const res = await postRequest(resourceRoleUrl, body, token.admin) - should.equal(res.status, 200) - const submitterRoleId = res.body.id - await assertResourceRole(submitterRoleId, body) - }) - - it('create reviewer resource role', async () => { - const body = resourceRoles.createBody('reviewer', false, true, false) - const res = await postRequest(resourceRoleUrl, body, token.admin) - should.equal(res.status, 200) - const reviewerRoleId = res.body.id - await assertResourceRole(reviewerRoleId, body) - }) - - let { stringFields, booleanFields, requiredFields, testBody } = resourceRoles - - for (const stringField of stringFields) { - it(`test invalid parameters, invalid string type field ${stringField}`, async () => { - let body = _.cloneDeep(testBody) - _.set(body, stringField, 123) - try { - await postRequest(resourceRoleUrl, body, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `"${stringField}" must be a string`) - } - }) - } - - for (const booleanField of booleanFields) { - it(`test invalid parameters, invalid boolean type field ${booleanField}`, async () => { - let body = _.cloneDeep(testBody) - _.set(body, booleanField, 123) - try { - await postRequest(resourceRoleUrl, body, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `"${booleanField}" must be a boolean`) - } - }) - } - - for (const requiredField of requiredFields) { - it(`test invalid parameters, required field ${requiredField} is missing`, async () => { - let body = _.cloneDeep(testBody) - body = _.omit(body, requiredField) - try { - await postRequest(resourceRoleUrl, body, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `"${requiredField}" is required`) - } - }) - } - - it(`test without token, expected 401`, async () => { - try { - await postRequest(resourceRoleUrl, testBody) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'No token provided.') - } - }) - - it(`test with invalid token(invalid), expected 401`, async () => { - try { - await postRequest(resourceRoleUrl, testBody, 'invalid') - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'Invalid Token.') - } - }) - - it(`test with invalid token(expired), expected 401`, async () => { - try { - await postRequest(resourceRoleUrl, testBody, token.expired) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'Failed to authenticate token.') - } - }) - - it(`test with user token, expected 403`, async () => { - try { - await postRequest(resourceRoleUrl, testBody, token.denis) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 403) - should.equal(_.get(err, 'response.body.message'), 'You are not allowed to perform this action!') - } - }) - - it(`test with invalid M2M token, expected 403`, async () => { - try { - await postRequest(resourceRoleUrl, testBody, token.m2mRead) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 403) - should.equal(_.get(err, 'response.body.message'), 'You are not allowed to perform this action!') - } - }) - - it(`create duplicate resource role, expected 409`, async () => { - const body = resourceRoles.createBody('SUBMITTER', false, true, true) - try { - await postRequest(resourceRoleUrl, body, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 409) - should.equal(_.get(err, 'response.body.message'), 'ResourceRole with name: SUBMITTER already exist.') - } - }) -}) diff --git a/test/e2e/createResourceRolePhaseDependency.test.js b/test/e2e/createResourceRolePhaseDependency.test.js deleted file mode 100644 index 364aa11..0000000 --- a/test/e2e/createResourceRolePhaseDependency.test.js +++ /dev/null @@ -1,164 +0,0 @@ -/** - * E2E test of the Challenge Resource API - create resource role phase dependency endpoint. - */ - -const _ = require('lodash') -const config = require('config') -const should = require('should') -const { postRequest, assertResourceRolePhaseDependency, getRoleIds } = require('../common/testHelper') -const { token, requestBody } = require('../common/testData') - -const dependenciesUrl = `http://localhost:${config.PORT}/${config.API_VERSION}/resourceRoles/phase-dependencies` -const dependencies = requestBody.resourceRolePhaseDependencies - -module.exports = describe('Create resource role phase dependency endpoint', () => { - let copilotRoleId - let submitterRoleId - - before(async () => { - const ret = await getRoleIds() - copilotRoleId = ret.copilotRoleId - submitterRoleId = ret.submitterRoleId - }) - - it('create copilot dependency', async () => { - const entity = dependencies.createBody(dependencies.testBody.phaseId, copilotRoleId, true) - const ret = await postRequest(dependenciesUrl, entity, token.admin) - should.equal(ret.status, 200) - await assertResourceRolePhaseDependency(ret.body.id, entity) - }) - - it('create submitter dependency', async () => { - const entity = dependencies.createBody(dependencies.testBody.phaseId, submitterRoleId, true) - const ret = await postRequest(dependenciesUrl, entity, token.m2m) - should.equal(ret.status, 200) - await assertResourceRolePhaseDependency(ret.body.id, entity) - }) - - it('create dependency - phaseId not found', async () => { - try { - const entity = dependencies.createBody(submitterRoleId, submitterRoleId, false) - await postRequest(dependenciesUrl, entity, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 404) - should.equal(_.get(err, 'response.body.message'), `Not found phase id: ${submitterRoleId}`) - } - }) - - it('create dependency - resourceRoleId not found', async () => { - try { - const entity = dependencies.createBody(dependencies.testBody.phaseId, dependencies.testBody.phaseId, true) - await postRequest(dependenciesUrl, entity, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 404) - should.equal(_.get(err, 'response.body.message'), `ResourceRole with id: ${dependencies.testBody.phaseId} doesn't exist`) - } - }) - - it('create dependency - conflict', async () => { - const entity = dependencies.createBody(dependencies.testBody.phaseId, submitterRoleId, true) - try { - await postRequest(dependenciesUrl, entity, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 409) - should.equal(_.get(err, 'response.body.message'), 'There is already dependency of given phaseId and resourceRoleId') - } - }) - - let { stringFields, booleanFields, requiredFields, testBody } = dependencies - - for (const stringField of stringFields) { - it(`test invalid parameters, invalid string type field ${stringField}`, async () => { - let entity = _.cloneDeep(testBody) - _.set(entity, stringField, 123) - try { - await postRequest(dependenciesUrl, entity, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `"${stringField}" must be a string`) - } - }) - } - - for (const booleanField of booleanFields) { - it(`test invalid parameters, invalid boolean type field ${booleanField}`, async () => { - let entity = _.cloneDeep(testBody) - _.set(entity, booleanField, 123) - try { - await postRequest(dependenciesUrl, entity, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `"${booleanField}" must be a boolean`) - } - }) - } - - for (const requiredField of requiredFields) { - it(`test invalid parameters, required field ${requiredField} is missing`, async () => { - let entity = _.cloneDeep(testBody) - entity = _.omit(entity, requiredField) - try { - await postRequest(dependenciesUrl, entity, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `"${requiredField}" is required`) - } - }) - } - - it(`test without token, expected 401`, async () => { - try { - await postRequest(dependenciesUrl, testBody) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'No token provided.') - } - }) - - it(`test with invalid token(invalid), expected 401`, async () => { - try { - await postRequest(dependenciesUrl, testBody, 'invalid') - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'Invalid Token.') - } - }) - - it(`test with invalid token(expired), expected 401`, async () => { - try { - await postRequest(dependenciesUrl, testBody, token.expired) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'Failed to authenticate token.') - } - }) - - it(`test with user token, expected 403`, async () => { - try { - await postRequest(dependenciesUrl, testBody, token.denis) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 403) - should.equal(_.get(err, 'response.body.message'), 'You are not allowed to perform this action!') - } - }) - - it(`test with invalid M2M token, expected 403`, async () => { - try { - await postRequest(dependenciesUrl, testBody, token.m2mRead) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 403) - should.equal(_.get(err, 'response.body.message'), 'You are not allowed to perform this action!') - } - }) -}) diff --git a/test/e2e/deleteResource.test.js b/test/e2e/deleteResource.test.js deleted file mode 100644 index f332ca8..0000000 --- a/test/e2e/deleteResource.test.js +++ /dev/null @@ -1,234 +0,0 @@ -/** - * E2E test of the Challenge Resource API - delete resource endpoint. - */ - -const _ = require('lodash') -const config = require('config') -const should = require('should') -const helper = require('../../src/common/helper') -const { deleteRequest, getRoleIds } = require('../common/testHelper') -const { token, requestBody, user } = require('../common/testData') - -const challengeId = 'fe6d0a58-ce7d-4521-8501-b8132b1c0391' -const challengeNotFoundId = '11111111-ce7d-4521-8501-b8132b1c0391' -const resourceUrl = `http://localhost:${config.PORT}/${config.API_VERSION}/resources` -const resources = requestBody.resources - -module.exports = describe('Delete resource endpoint', () => { - let copilotRoleId - let observerRoleId - let submitterRoleId - - before(async () => { - const ret = await getRoleIds() - copilotRoleId = ret.copilotRoleId - observerRoleId = ret.observerRoleId - submitterRoleId = ret.submitterRoleId - }) - - it(`delete resource that user doesn't have, expected 400`, async () => { - const body = resources.createBody('HoHosky', observerRoleId, challengeId) - try { - await deleteRequest(resourceUrl, body, token.m2mModify) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `User hohosky doesn't have resource with roleId: ${observerRoleId} in challenge ${challengeId}`) - } - }) - - it('delete resource using non-existed role, expected 400', async () => { - const body = resources.createBody('ghostar', challengeId, challengeId) - try { - await deleteRequest(resourceUrl, body, token.m2m) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `No resource role found with id: ${challengeId}.`) - } - }) - - it(`delete resource member doesn't exist, expected 400`, async () => { - const body = resources.createBody('123abcx', observerRoleId, challengeId) - try { - await deleteRequest(resourceUrl, body, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `User with handle: 123abcx doesn't exist`) - } - }) - - let { stringFields, requiredFields, testBody } = resources - - it(`test invalid path parameter, challengeId must be UUID`, async () => { - let body = _.cloneDeep(testBody) - body.challengeId = 'invalid' - try { - await deleteRequest(resourceUrl, body, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `"challengeId" must be a valid GUID`) - } - }) - - for (const stringField of stringFields) { - it(`test invalid parameters, invalid string type field ${stringField}`, async () => { - let body = _.cloneDeep(testBody) - _.set(body, stringField, 123) - try { - await deleteRequest(resourceUrl, body, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `"${stringField}" must be a string`) - } - }) - } - - for (const requiredField of requiredFields) { - it(`test invalid parameters, required field ${requiredField} is missing`, async () => { - let body = _.cloneDeep(testBody) - body = _.omit(body, requiredField) - try { - await deleteRequest(resourceUrl, body, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `"${requiredField}" is required`) - } - }) - } - - it(`test without token, expected 401`, async () => { - try { - await deleteRequest(resourceUrl, testBody) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'No token provided.') - } - }) - - it(`test with invalid token(invalid), expected 401`, async () => { - try { - await deleteRequest(resourceUrl, testBody, 'invalid') - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'Invalid Token.') - } - }) - - it(`test with invalid token(expired), expected 401`, async () => { - try { - await deleteRequest(resourceUrl, testBody, token.expired) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'Failed to authenticate token.') - } - }) - - it(`test with user without permission, expected 403`, async () => { - const body = resources.createBody('tonyj', submitterRoleId, challengeId) - try { - await deleteRequest(resourceUrl, body, token.denis) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 403) - should.equal(_.get(err, 'response.body.message'), 'Only M2M, admin or user with full access role can perform this action') - } - }) - - it(`test with invalid M2M token, expected 403`, async () => { - const body = resources.createBody('tonyj', submitterRoleId, challengeId) - try { - await deleteRequest(resourceUrl, body, token.m2mRead) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 403) - should.equal(_.get(err, 'response.body.message'), 'You are not allowed to perform this action!') - } - }) - - it(`failure - delete self obtainable resource for other user by normal user 403`, async () => { - const body = resources.createBody('lars2520', submitterRoleId, challengeId) - try { - await deleteRequest(resourceUrl, body, token.denis) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 403) - should.equal(_.get(err, 'response.body.message'), 'Only M2M, admin or user with full access role can perform this action') - } - }) - - it('delete resource for non-existed challenge, expected 404', async () => { - const body = resources.createBody('ghostar', observerRoleId, challengeNotFoundId) - try { - await deleteRequest(resourceUrl, body, token.m2m) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 404) - should.equal(_.get(err, 'response.body.message'), `Challenge with id: ${challengeNotFoundId} doesn't exist.`) - } - }) - - it('delete resource using m2m token', async () => { - const body = resources.createBody('ghostar', submitterRoleId, challengeId) - const res = await deleteRequest(resourceUrl, body, token.m2m) - should.equal(res.status, 200) - should.exist(res.body.id) - try { - await helper.getById('Resource', res.body.id) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.name, 'NotFoundError') - } - should.equal(res.body.challengeId, challengeId) - should.exist(res.body.memberId) - should.equal(res.body.memberHandle.toLowerCase(), 'ghostar') - should.equal(res.body.roleId, submitterRoleId) - should.exist(res.body.created) - should.equal(res.body.createdBy, user.m2m.sub) - }) - - it('delete resource by user', async () => { - const body = resources.createBody('DENIS', submitterRoleId, challengeId) - const res = await deleteRequest(resourceUrl, body, token.hohosky) - should.equal(res.status, 200) - should.exist(res.body.id) - try { - await helper.getById('Resource', res.body.id) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.name, 'NotFoundError') - } - should.equal(res.body.challengeId, challengeId) - should.exist(res.body.memberId) - should.equal(res.body.memberHandle.toLowerCase(), 'denis') - should.equal(res.body.roleId, submitterRoleId) - should.exist(res.body.created) - should.equal(res.body.createdBy.toLowerCase(), 'hohosky') - }) - - it('delete resource by admin', async () => { - const body = resources.createBody('HoHoSKY', copilotRoleId, challengeId) - const res = await deleteRequest(resourceUrl, body, token.admin) - should.equal(res.status, 200) - should.exist(res.body.id) - try { - await helper.getById('Resource', res.body.id) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.name, 'NotFoundError') - } - should.equal(res.body.challengeId, challengeId) - should.exist(res.body.memberId) - should.equal(res.body.memberHandle.toLowerCase(), 'hohosky') - should.equal(res.body.roleId, copilotRoleId) - should.exist(res.body.created) - should.equal(res.body.createdBy.toLowerCase(), 'tonyj') - }) -}) diff --git a/test/e2e/deleteResourceRolePhaseDependency.test.js b/test/e2e/deleteResourceRolePhaseDependency.test.js deleted file mode 100644 index 39c9b49..0000000 --- a/test/e2e/deleteResourceRolePhaseDependency.test.js +++ /dev/null @@ -1,73 +0,0 @@ -/** - * E2E test of the Challenge Resource API - delete resource role phase dependency endpoint. - */ - -const _ = require('lodash') -const config = require('config') -const should = require('should') -const service = require('../../src/services/ResourceRolePhaseDependencyService') -const { deleteRequest, getRoleIds } = require('../common/testHelper') -const { token } = require('../common/testData') - -const dependenciesUrl = `http://localhost:${config.PORT}/${config.API_VERSION}/resource-roles/phase-dependencies` - -module.exports = describe('Delete resource role phase dependency endpoint', () => { - let dependency - - before(async () => { - const ret = await getRoleIds() - const submitterRoleId = ret.submitterRoleId - const records = await service.getDependencies({ resourceRoleId: submitterRoleId }) - dependency = records[0] - }) - - it('delete dependency', async () => { - const ret = await deleteRequest(`${dependenciesUrl}/${dependency.id}`, {}, token.admin) - should.equal(ret.status, 200) - should.equal(ret.body.id, dependency.id) - should.equal(ret.body.phaseId, dependency.phaseId) - should.equal(ret.body.resourceRoleId, dependency.resourceRoleId) - should.equal(ret.body.phaseState, dependency.phaseState) - }) - - it('delete dependency - not found', async () => { - try { - await deleteRequest(`${dependenciesUrl}/${dependency.id}`, {}, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 404) - should.equal(_.get(err, 'response.body.message'), - `ResourceRolePhaseDependency with id: ${dependency.id} doesn't exist`) - } - }) - - it('delete dependency - invalid id', async () => { - try { - await deleteRequest(`${dependenciesUrl}/invalid`, {}, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), '"id" must be a valid GUID') - } - }) - - it('delete dependency - forbidden user', async () => { - try { - await deleteRequest(`${dependenciesUrl}/${dependency.id}`, {}, token.denis) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 403) - should.equal(_.get(err, 'response.body.message'), 'You are not allowed to perform this action!') - } - }) - - it('delete dependency - forbidden m2m', async () => { - try { - await deleteRequest(`${dependenciesUrl}/${dependency.id}`, {}, token.m2mRead) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 403) - should.equal(_.get(err, 'response.body.message'), 'You are not allowed to perform this action!') - } - }) -}) diff --git a/test/e2e/getResourceRolePhaseDependencies.test.js b/test/e2e/getResourceRolePhaseDependencies.test.js deleted file mode 100644 index 950d61f..0000000 --- a/test/e2e/getResourceRolePhaseDependencies.test.js +++ /dev/null @@ -1,105 +0,0 @@ -/** - * E2E test of the Challenge Resource API - get resource role phase dependencies endpoint. - */ - -const _ = require('lodash') -const config = require('config') -const should = require('should') -const service = require('../../src/services/ResourceRolePhaseDependencyService') -const { getRequest, assertResourceRolePhaseDependency, getRoleIds } = require('../common/testHelper') -const { token } = require('../common/testData') - -const dependenciesUrl = `http://localhost:${config.PORT}/${config.API_VERSION}/resource-roles/phase-dependencies` - -module.exports = describe('Get resource roles endpoint', () => { - let dependency - - before(async () => { - const ret = await getRoleIds() - const submitterRoleId = ret.submitterRoleId - const records = await service.getDependencies({ resourceRoleId: submitterRoleId }) - dependency = records[0] - }) - - it('get all resource role phase dependencies', async () => { - const res = await getRequest(dependenciesUrl, token.admin) - should.equal(res.status, 200) - const records = res.body - should.equal(records.length, 2) - for (const record of records) { - await assertResourceRolePhaseDependency(record.id, record) - } - }) - - it('get matched resource role phase dependencies', async () => { - const res = await getRequest(`${dependenciesUrl}?phaseId=${dependency.phaseId}&resourceRoleId=${ - dependency.resourceRoleId - }&phaseState=${dependency.phaseState}`, token.m2mRead) - should.equal(res.status, 200) - const records = res.body - should.equal(records.length, 1) - for (const record of records) { - await assertResourceRolePhaseDependency(record.id, record) - } - }) - - it('test invalid parameters, invalid boolean parameter phaseState ', async () => { - try { - await getRequest(`${dependenciesUrl}?phaseState=invalid`, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `"phaseState" must be a boolean`) - } - }) - - it('test invalid parameters, invalid GUID parameter phaseId ', async () => { - try { - await getRequest(`${dependenciesUrl}?phaseId=invalid`, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `"phaseId" must be a valid GUID`) - } - }) - - it(`test without token, expected 401`, async () => { - try { - await getRequest(dependenciesUrl) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'No token provided.') - } - }) - - it(`test with invalid token(invalid), expected 401`, async () => { - try { - await getRequest(dependenciesUrl, 'invalid') - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'Invalid Token.') - } - }) - - it(`test with invalid token(expired), expected 401`, async () => { - try { - await getRequest(dependenciesUrl, token.expired) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'Failed to authenticate token.') - } - }) - - it(`test with invalid M2M token, expected 403`, async () => { - try { - await getRequest(dependenciesUrl, token.m2mModify) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 403) - should.equal(_.get(err, 'response.body.message'), 'You are not allowed to perform this action!') - } - }) -}) diff --git a/test/e2e/getResourceRoles.test.js b/test/e2e/getResourceRoles.test.js deleted file mode 100644 index d3859eb..0000000 --- a/test/e2e/getResourceRoles.test.js +++ /dev/null @@ -1,93 +0,0 @@ -/** - * E2E test of the Challenge Resource API - get resource roles endpoint. - */ - -const _ = require('lodash') -const config = require('config') -const should = require('should') -const { getRequest, assertResourceRole } = require('../common/testHelper') -const { token } = require('../common/testData') - -const resourceRoleUrl = `http://localhost:${config.PORT}/${config.API_VERSION}/resource-roles` - -module.exports = describe('Get resource roles endpoint', () => { - it('get all resource roles', async () => { - const res = await getRequest(resourceRoleUrl, token.admin) - should.equal(res.status, 200) - const records = res.body - should.equal(records.length, 4) - for (const record of records) { - await assertResourceRole(record.id, record) - } - }) - - it('get active resource roles', async () => { - const res = await getRequest(`${resourceRoleUrl}?isActive=true`, token.admin) - should.equal(res.status, 200) - const records = res.body - should.equal(records.length, 3) - for (const record of records) { - should.equal(record.isActive, true) - await assertResourceRole(record.id, record) - } - }) - - it('get inactive resource roles', async () => { - const res = await getRequest(`${resourceRoleUrl}?isActive=false`, token.denis) - should.equal(res.status, 200) - const records = res.body - should.equal(records.length, 1) - should.equal(records[0].isActive, false) - await assertResourceRole(records[0].id, records[0]) - }) - - it('test invalid parameters, invalid boolean path parameter isActive ', async () => { - try { - await getRequest(`${resourceRoleUrl}?isActive=invalid`, token.denis) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `"isActive" must be a boolean`) - } - }) - - it(`test without token, expected 401`, async () => { - try { - await getRequest(resourceRoleUrl) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'No token provided.') - } - }) - - it(`test with invalid token(invalid), expected 401`, async () => { - try { - await getRequest(resourceRoleUrl, 'invalid') - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'Invalid Token.') - } - }) - - it(`test with invalid token(expired), expected 401`, async () => { - try { - await getRequest(resourceRoleUrl, token.expired) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'Failed to authenticate token.') - } - }) - - it(`test with invalid M2M token, expected 403`, async () => { - try { - await getRequest(resourceRoleUrl, token.m2mModify) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 403) - should.equal(_.get(err, 'response.body.message'), 'You are not allowed to perform this action!') - } - }) -}) diff --git a/test/e2e/getResources.test.js b/test/e2e/getResources.test.js deleted file mode 100644 index 0d168c8..0000000 --- a/test/e2e/getResources.test.js +++ /dev/null @@ -1,183 +0,0 @@ -/** - * E2E test of the Challenge Resource API - get resources endpoint. - */ - -const _ = require('lodash') -const config = require('config') -const should = require('should') -const helper = require('../../src/common/helper') -const { getRequest, getRoleIds } = require('../common/testHelper') -const { token } = require('../common/testData') - -const challengeId = 'fe6d0a58-ce7d-4521-8501-b8132b1c0391' -const challengeNotFoundId = '11111111-ce7d-4521-8501-b8132b1c0391' -const resourceUrl = `http://localhost:${config.PORT}/${config.API_VERSION}/resources?challengeId=${challengeId}` -const resource400Url = `http://localhost:${config.PORT}/${config.API_VERSION}/resources?challengeId=invalid` -const resource404Url = `http://localhost:${config.PORT}/${config.API_VERSION}/resources?challengeId=${challengeNotFoundId}` - -module.exports = describe('Get resource endpoint', () => { - let copilotRoleId - let submitterRoleId - let reviewerRoleId - - before(async () => { - const ret = await getRoleIds() - copilotRoleId = ret.copilotRoleId - submitterRoleId = ret.submitterRoleId - reviewerRoleId = ret.reviewerRoleId - }) - - let hasCopilotRole, hasReviewerRole - - /** - * Assert resource entity in database. - * @param {String} id the entity id - * @param {Object} expected the expected data - */ - const assertResource = async (id, expected) => { - should.exist(id) - const entity = await helper.getById('Resource', id) - should.equal(entity.challengeId, challengeId) - should.equal(entity.memberId, expected.memberId) - should.equal(entity.memberHandle.toLowerCase(), expected.memberHandle.toLowerCase()) - should.equal(entity.roleId, expected.roleId) - if (entity.memberHandle.toLowerCase() === 'hohosky') { - if (entity.roleId === copilotRoleId) { - hasCopilotRole = true - } - if (entity.roleId === reviewerRoleId) { - hasReviewerRole = true - } - } else { - should.equal(entity.roleId, submitterRoleId) - } - should.exist(expected.created) - should.exist(expected.createdBy) - should.equal(entity.createdBy, expected.createdBy) - } - - it('get resources by admin', async () => { - hasCopilotRole = false - hasReviewerRole = false - const res = await getRequest(resourceUrl, token.admin) - should.equal(res.status, 200) - const records = res.body - should.equal(records.length, 5) - for (const record of records) { - await assertResource(record.id, record) - } - // user hohosky should have two resources - should.equal(hasCopilotRole, true) - should.equal(hasReviewerRole, true) - }) - - it('get resources by user has full-access permission', async () => { - hasCopilotRole = false - hasReviewerRole = false - const res = await getRequest(resourceUrl, token.hohosky) - should.equal(res.status, 200) - const records = res.body - should.equal(records.length, 5) - for (const record of records) { - await assertResource(record.id, record) - } - // user hohosky should have two resources - should.equal(hasCopilotRole, true) - should.equal(hasReviewerRole, true) - }) - - it('get resources using m2m token', async () => { - hasCopilotRole = false - hasReviewerRole = false - const res = await getRequest(resourceUrl, token.m2m) - should.equal(res.status, 200) - const records = res.body - should.equal(records.length, 5) - for (const record of records) { - await assertResource(record.id, record) - } - // user hohosky should have two resources - should.equal(hasCopilotRole, true) - should.equal(hasReviewerRole, true) - }) - - it(`test invalid url, challengeId query parameter is required`, async () => { - try { - await getRequest(`http://localhost:${config.PORT}/${config.API_VERSION}/resources`, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `"challengeId" is required`) - } - }) - - it(`test invalid query parameter, challengeId must be UUID`, async () => { - try { - await getRequest(resource400Url, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `"challengeId" must be a valid GUID`) - } - }) - - it(`test without token, expected 401`, async () => { - try { - await getRequest(resourceUrl) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'No token provided.') - } - }) - - it(`test with invalid token(invalid), expected 401`, async () => { - try { - await getRequest(resourceUrl, 'invalid') - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'Invalid Token.') - } - }) - - it(`test with invalid token(expired), expected 401`, async () => { - try { - await getRequest(resourceUrl, token.expired) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'Failed to authenticate token.') - } - }) - - it(`test with user without permission, expected 403`, async () => { - try { - await getRequest(resourceUrl, token.denis) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 403) - should.equal(_.get(err, 'response.body.message'), 'Only M2M, admin or user with full access role can perform this action') - } - }) - - it(`test with invalid M2M token, expected 403`, async () => { - try { - await getRequest(resourceUrl, token.m2mModify) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 403) - should.equal(_.get(err, 'response.body.message'), 'You are not allowed to perform this action!') - } - }) - - it('get resource from non-existed challenge, expected 404', async () => { - try { - await getRequest(resource404Url, token.m2mRead) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 404) - should.equal(_.get(err, 'response.body.message'), `Challenge with id: ${challengeNotFoundId} doesn't exist.`) - } - }) -}) diff --git a/test/e2e/listChallengesByMember.test.js b/test/e2e/listChallengesByMember.test.js deleted file mode 100644 index d150513..0000000 --- a/test/e2e/listChallengesByMember.test.js +++ /dev/null @@ -1,154 +0,0 @@ -/** - * E2E test of the Challenge Resource API - list challenges by member. - */ - -const _ = require('lodash') -const config = require('config') -const should = require('should') -const { getRequest, getRoleIds } = require('../common/testHelper') -const { token } = require('../common/testData') - -const challengeId1 = 'fe6d0a58-ce7d-4521-8501-b8132b1c0391' -const challengeId2 = 'fe6d0a58-ce7d-4521-8501-b8132b1c0392' -const challengeId3 = 'fe6d0a58-ce7d-4521-8501-b8132b1c0393' -const resourceUrl = `http://localhost:${config.PORT}/${config.API_VERSION}/resources` - -module.exports = describe('Create resource endpoint', () => { - let submitterRoleId - let reviewerRoleId - let observerRoleId - - before(async () => { - const ret = await getRoleIds() - submitterRoleId = ret.submitterRoleId - reviewerRoleId = ret.reviewerRoleId - observerRoleId = ret.observerRoleId - }) - - it('get challenges hohosky can access', async () => { - const res = await getRequest(`${resourceUrl}/16096823/challenges`, token.admin) - should.equal(res.status, 200) - should.equal(res.body.length, 1) - should.equal(res.body[0], challengeId1) - }) - - it('get challenges ghostar can access', async () => { - const res = await getRequest(`${resourceUrl}/151743/challenges`, token.denis) - should.equal(res.status, 200) - should.equal(res.body.length, 3) - should.equal(res.body.includes(challengeId1), true) - should.equal(res.body.includes(challengeId2), true) - should.equal(res.body.includes(challengeId3), true) - }) - - it('get challenges ghostar can access with filter 1', async () => { - const res = await getRequest(`${resourceUrl}/151743/challenges?resourceRoleId=${submitterRoleId}`, token.hohosky) - should.equal(res.status, 200) - should.equal(res.body.length, 1) - should.equal(res.body[0], challengeId1) - }) - - it('get challenges ghostar can access with filter 2', async () => { - const res = await getRequest(`${resourceUrl}/151743/challenges?resourceRoleId=${reviewerRoleId}`, token.m2mRead) - should.equal(res.status, 200) - should.equal(res.body.length, 2) - should.equal(res.body.includes(challengeId2), true) - should.equal(res.body.includes(challengeId3), true) - }) - - it('get challenges ghostar can access with filter 3', async () => { - const res = await getRequest(`${resourceUrl}/151743/challenges?resourceRoleId=${observerRoleId}`, token.m2m) - should.equal(res.status, 200) - should.equal(res.body.length, 0) - }) - - it('failure - get challenges by non existed user', async () => { - try { - await getRequest(`${resourceUrl}/111111111/challenges`, token.m2m) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `User with id: 111111111 doesn't exist`) - } - }) - - it(`failure - get challenges for user with invalid filter, role doesn't exist`, async () => { - try { - await getRequest(`${resourceUrl}/151743/challenges?resourceRoleId=${challengeId1}`, token.m2m) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `No resource role found with id: ${challengeId1}.`) - } - }) - - it(`test invalid parameters, memberId should be number`, async () => { - try { - await getRequest(`${resourceUrl}/invalid/challenges`, token.m2m) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `"memberId" must be a number`) - } - }) - - it(`test invalid parameters, memberId should be a positive number`, async () => { - try { - await getRequest(`${resourceUrl}/-1/challenges`, token.m2m) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `"memberId" must be a positive number`) - } - }) - - it(`test invalid parameters, resourceRoleId should be UUID`, async () => { - try { - await getRequest(`${resourceUrl}/151743/challenges?resourceRoleId=invalid`, token.m2m) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `"resourceRoleId" must be a valid GUID`) - } - }) - - it(`test without token, expected 401`, async () => { - try { - await getRequest(`${resourceUrl}/151743/challenges`) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'No token provided.') - } - }) - - it(`test with invalid token(invalid), expected 401`, async () => { - try { - await getRequest(`${resourceUrl}/151743/challenges`, 'invalid') - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'Invalid Token.') - } - }) - - it(`test with invalid token(expired), expected 401`, async () => { - try { - await getRequest(`${resourceUrl}/151743/challenges`, token.expired) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'Failed to authenticate token.') - } - }) - - it(`test with invalid M2M token, expected 403`, async () => { - try { - await getRequest(`${resourceUrl}/151743/challenges`, token.m2mModify) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 403) - should.equal(_.get(err, 'response.body.message'), 'You are not allowed to perform this action!') - } - }) -}) diff --git a/test/e2e/test.js b/test/e2e/test.js deleted file mode 100644 index e0a97a5..0000000 --- a/test/e2e/test.js +++ /dev/null @@ -1,168 +0,0 @@ -/** - * E2E test of the Challenge Resource API. - */ - -process.env.NODE_ENV = 'test' - -require('../../app-bootstrap') - -const _ = require('lodash') -const config = require('config') -const should = require('should') -const logger = require('../../src/common/logger') -const helper = require('../../src/common/helper') -const { getRequest, putRequest } = require('../common/testHelper') - -const { mockChallengeApi } = require('../../mock/mock-challenge-api') - -describe('Topcoder - Challenge Resource API E2E Test', () => { - let app - let infoLogs = [] - let errorLogs = [] - let debugLogs = [] - const info = logger.info - const error = logger.error - const debug = logger.debug - - /** - * Sleep with time from input - * @param time the time input - */ - const sleep = (time) => new Promise((resolve) => { - setTimeout(resolve, time) - }) - - /** - * Start http server with port - * @param {Object} server the server - * @param {Number} port the server port - */ - const startServer = (server, port) => new Promise((resolve) => { - server.listen(port, () => { - resolve() - }) - }) - - /** - * Close http server - * @param {Object} server the server - */ - const closeServer = (server) => new Promise((resolve) => { - server.close(() => { - resolve() - }) - }) - - /** - * Initialize database tables. All data will be cleared. - */ - const initDB = async () => { - const roles = await helper.scan('ResourceRole') - for (const role of roles) { - await role.delete() - } - const resources = await helper.scan('Resource') - for (const resource of resources) { - await resource.delete() - } - const dependencies = await helper.scan('ResourceRolePhaseDependency') - for (const d of dependencies) { - await d.delete() - } - } - - before(async () => { - // start mock server for v5 challenge api - await startServer(mockChallengeApi, config.MOCK_CHALLENGE_API_PORT) - - // inject logger with log collector - logger.info = (message) => { - infoLogs.push(message) - info(message) - } - logger.debug = (message) => { - debugLogs.push(message) - debug(message) - } - logger.error = (message) => { - errorLogs.push(message) - error(message) - } - - // start the application - app = require('../../app') - - // wait until application init successfully - while (true) { - if (infoLogs.some(x => String(x).includes('Express server listening on port'))) { - break - } - await sleep(config.WAIT_TIME) - } - - await initDB() - }) - - after(async () => { - // close server - await closeServer(mockChallengeApi) - await closeServer(app) - - // restore logger - logger.error = error - logger.info = info - logger.debug = debug - - await initDB() - }) - - describe('Health check endpoints', () => { - it('health check success', async () => { - const res = await getRequest(`http://localhost:${config.PORT}/${config.API_VERSION}/resources/health`) - should.equal(res.status, 200) - should.equal(res.body.checksRun, 1) - }) - }) - - describe('Failure routes Tests', () => { - it('Unsupported http method, return 405', async () => { - try { - await putRequest(`http://localhost:${config.PORT}/${config.API_VERSION}/resourceRoles`, {}) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 405) - should.equal(_.get(err, 'response.body.message'), 'The requested HTTP method is not supported.') - } - }) - - it('Http resource not found, return 404', async () => { - try { - await getRequest(`http://localhost:${config.PORT}/${config.API_VERSION}/invalid`) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 404) - should.equal(_.get(err, 'response.body.message'), 'The requested resource cannot be found.') - } - }) - }) - - describe('Resource Roles endpoints', () => { - require('./createResourceRole.test') - require('./getResourceRoles.test') - require('./updateResourceRole.test') - }) - - describe('Resource Role Phase Dependencies endpoints', () => { - require('./createResourceRolePhaseDependency.test') - require('./getResourceRolePhaseDependencies.test') - require('./updateResourceRolePhaseDependency.test') - require('./deleteResourceRolePhaseDependency.test') - }) - - describe('Resources endpoints', () => { - require('./createResource.test') - require('./getResources.test') - require('./listChallengesByMember.test') - require('./deleteResource.test') - }) -}) diff --git a/test/e2e/updateResourceRole.test.js b/test/e2e/updateResourceRole.test.js deleted file mode 100644 index a8e0a8c..0000000 --- a/test/e2e/updateResourceRole.test.js +++ /dev/null @@ -1,171 +0,0 @@ -/** - * E2E test of the Challenge Resource API - update resource roles endpoint. - */ - -const _ = require('lodash') -const config = require('config') -const should = require('should') -const { putRequest, getRoleIds, assertResourceRole } = require('../common/testHelper') -const { token, requestBody } = require('../common/testData') - -const resourceRoleUrl = `http://localhost:${config.PORT}/${config.API_VERSION}/resource-roles` -const resourceRoles = requestBody.resourceRoles - -module.exports = describe('Update resource roles endpoint', () => { - let copilotRoleId - - before(async () => { - const ret = await getRoleIds() - copilotRoleId = ret.copilotRoleId - }) - - it('update resource role using m2m all token', async () => { - const body = resourceRoles.createBody('UPDATE-CO-PILOT', true, false, true) - const res = await putRequest(`${resourceRoleUrl}/${copilotRoleId}`, body, token.m2m) - should.equal(res.status, 200) - should.equal(copilotRoleId, res.body.id) - await assertResourceRole(copilotRoleId, res.body) - }) - - it('update resource role using m2m resource roles token', async () => { - const body = resourceRoles.createBody('UPDATE-CO-PILOT', false, false, false) - const res = await putRequest(`${resourceRoleUrl}/${copilotRoleId}`, body, token.m2mModify) - should.equal(res.status, 200) - should.equal(copilotRoleId, res.body.id) - await assertResourceRole(copilotRoleId, res.body) - }) - - it('update resource role via admin', async () => { - const body = resourceRoles.createBody('CO-PILOT', true, true, false) - const res = await putRequest(`${resourceRoleUrl}/${copilotRoleId}`, body, token.admin) - should.equal(res.status, 200) - should.equal(copilotRoleId, res.body.id) - await assertResourceRole(copilotRoleId, res.body) - }) - - let { stringFields, booleanFields, requiredFields, testBody } = resourceRoles - - for (const stringField of stringFields) { - it(`test invalid parameters, invalid string type field ${stringField}`, async () => { - let body = _.cloneDeep(testBody) - _.set(body, stringField, 123) - try { - await putRequest(`${resourceRoleUrl}/${copilotRoleId}`, body, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `"${stringField}" must be a string`) - } - }) - } - - for (const booleanField of booleanFields) { - it(`test invalid parameters, invalid boolean type field ${booleanField}`, async () => { - let body = _.cloneDeep(testBody) - _.set(body, booleanField, 123) - try { - await putRequest(`${resourceRoleUrl}/${copilotRoleId}`, body, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `"${booleanField}" must be a boolean`) - } - }) - } - - for (const requiredField of requiredFields) { - it(`test invalid parameters, required field ${requiredField} is missing`, async () => { - let body = _.cloneDeep(testBody) - body = _.omit(body, requiredField) - try { - await putRequest(`${resourceRoleUrl}/${copilotRoleId}`, body, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `"${requiredField}" is required`) - } - }) - } - - it(`test invalid path parameter, resourceRoleId must be UUID`, async () => { - try { - await putRequest(`${resourceRoleUrl}/invalid`, testBody, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `"resourceRoleId" must be a valid GUID`) - } - }) - - it(`test without token, expected 401`, async () => { - try { - await putRequest(`${resourceRoleUrl}/${copilotRoleId}`, testBody) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'No token provided.') - } - }) - - it(`test with invalid token(invalid), expected 401`, async () => { - try { - await putRequest(`${resourceRoleUrl}/${copilotRoleId}`, testBody, 'invalid') - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'Invalid Token.') - } - }) - - it(`test with invalid token(expired), expected 401`, async () => { - try { - await putRequest(`${resourceRoleUrl}/${copilotRoleId}`, testBody, token.expired) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'Failed to authenticate token.') - } - }) - - it(`test with user token, expected 403`, async () => { - try { - await putRequest(`${resourceRoleUrl}/${copilotRoleId}`, testBody, token.denis) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 403) - should.equal(_.get(err, 'response.body.message'), 'You are not allowed to perform this action!') - } - }) - - it(`test with invalid M2M token, expected 403`, async () => { - try { - await putRequest(`${resourceRoleUrl}/${copilotRoleId}`, testBody, token.m2mRead) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 403) - should.equal(_.get(err, 'response.body.message'), 'You are not allowed to perform this action!') - } - }) - - it(`test with not founded resource role, expected 404`, async () => { - try { - const id = 'fe6d0a58-ce7d-4521-8501-b8132b1c0391' - await putRequest(`${resourceRoleUrl}/${id}`, testBody, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 404) - should.equal(_.get(err, 'response.body.message'), `ResourceRole with id: fe6d0a58-ce7d-4521-8501-b8132b1c0391 doesn't exist`) - } - }) - - it(`update resource role name duplication, expected 409`, async () => { - const body = resourceRoles.createBody('SUBMITTER', false, true, true) - try { - await putRequest(`${resourceRoleUrl}/${copilotRoleId}`, body, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 409) - should.equal(_.get(err, 'response.body.message'), 'ResourceRole with name: SUBMITTER already exist.') - } - }) -}) diff --git a/test/e2e/updateResourceRolePhaseDependency.test.js b/test/e2e/updateResourceRolePhaseDependency.test.js deleted file mode 100644 index 1d310d5..0000000 --- a/test/e2e/updateResourceRolePhaseDependency.test.js +++ /dev/null @@ -1,160 +0,0 @@ -/** - * E2E test of the Challenge Resource API - update resource role phase dependency endpoint. - */ - -const _ = require('lodash') -const config = require('config') -const should = require('should') -const service = require('../../src/services/ResourceRolePhaseDependencyService') -const { putRequest, assertResourceRolePhaseDependency, getRoleIds } = require('../common/testHelper') -const { token, requestBody } = require('../common/testData') - -const dependenciesUrl = `http://localhost:${config.PORT}/${config.API_VERSION}/resource-roles/phase-dependencies` -const dependencies = requestBody.resourceRolePhaseDependencies - -module.exports = describe('Update resource role phase dependency endpoint', () => { - let dependency - let copilotRoleId - - before(async () => { - const ret = await getRoleIds() - copilotRoleId = ret.copilotRoleId - const submitterRoleId = ret.submitterRoleId - const records = await service.getDependencies({ resourceRoleId: submitterRoleId }) - dependency = records[0] - }) - - it('update dependency', async () => { - const entity = dependencies.createBody(dependency.phaseId, dependency.resourceRoleId, true) - const ret = await putRequest(`${dependenciesUrl}/${dependency.id}`, entity, token.admin) - should.equal(ret.status, 200) - await assertResourceRolePhaseDependency(ret.body.id, entity) - }) - - it('update dependency - phaseId not found', async () => { - try { - const entity = dependencies.createBody(dependency.resourceRoleId, dependency.resourceRoleId, false) - await putRequest(`${dependenciesUrl}/${dependency.id}`, entity, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 404) - should.equal(_.get(err, 'response.body.message'), `Not found phase id: ${dependency.resourceRoleId}`) - } - }) - - it('update dependency - resourceRoleId not found', async () => { - try { - const entity = dependencies.createBody(dependencies.testBody.phaseId, dependencies.testBody.phaseId, true) - await putRequest(`${dependenciesUrl}/${dependency.id}`, entity, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 404) - should.equal(_.get(err, 'response.body.message'), `ResourceRole with id: ${dependencies.testBody.phaseId} doesn't exist`) - } - }) - - it('update dependency - conflict', async () => { - const entity = dependencies.createBody(dependency.phaseId, copilotRoleId, true) - try { - await putRequest(`${dependenciesUrl}/${dependency.id}`, entity, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 409) - should.equal(_.get(err, 'response.body.message'), 'There is already dependency of given phaseId and resourceRoleId') - } - }) - - let { stringFields, booleanFields, requiredFields, testBody } = dependencies - - for (const stringField of stringFields) { - it(`test invalid parameters, invalid string type field ${stringField}`, async () => { - let entity = _.cloneDeep(testBody) - _.set(entity, stringField, 123) - try { - await putRequest(`${dependenciesUrl}/${dependency.id}`, entity, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `"${stringField}" must be a string`) - } - }) - } - - for (const booleanField of booleanFields) { - it(`test invalid parameters, invalid boolean type field ${booleanField}`, async () => { - let entity = _.cloneDeep(testBody) - _.set(entity, booleanField, 123) - try { - await putRequest(`${dependenciesUrl}/${dependency.id}`, entity, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `"${booleanField}" must be a boolean`) - } - }) - } - - for (const requiredField of requiredFields) { - it(`test invalid parameters, required field ${requiredField} is missing`, async () => { - let entity = _.cloneDeep(testBody) - entity = _.omit(entity, requiredField) - try { - await putRequest(`${dependenciesUrl}/${dependency.id}`, entity, token.admin) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 400) - should.equal(_.get(err, 'response.body.message'), `"${requiredField}" is required`) - } - }) - } - - it(`test without token, expected 401`, async () => { - try { - await putRequest(`${dependenciesUrl}/${dependency.id}`, testBody) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'No token provided.') - } - }) - - it(`test with invalid token(invalid), expected 401`, async () => { - try { - await putRequest(`${dependenciesUrl}/${dependency.id}`, testBody, 'invalid') - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'Invalid Token.') - } - }) - - it(`test with invalid token(expired), expected 401`, async () => { - try { - await putRequest(`${dependenciesUrl}/${dependency.id}`, testBody, token.expired) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 401) - should.equal(_.get(err, 'response.body.message'), 'Failed to authenticate token.') - } - }) - - it(`test with user token, expected 403`, async () => { - try { - await putRequest(`${dependenciesUrl}/${dependency.id}`, testBody, token.denis) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 403) - should.equal(_.get(err, 'response.body.message'), 'You are not allowed to perform this action!') - } - }) - - it(`test with invalid M2M token, expected 403`, async () => { - try { - await putRequest(`${dependenciesUrl}/${dependency.id}`, testBody, token.m2mRead) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 403) - should.equal(_.get(err, 'response.body.message'), 'You are not allowed to perform this action!') - } - }) -}) diff --git a/test/postman/ClearPostmanData.md b/test/postman/ClearPostmanData.md new file mode 100644 index 0000000..6e467e6 --- /dev/null +++ b/test/postman/ClearPostmanData.md @@ -0,0 +1,65 @@ +# Clear Testing data which are from Postman Tests + +## How to clear the Postman related testing data +- To summarize, simply run below command after running the Postman tests. +``` + npm run test:newman:clear +``` +- You should follow the ReadMe.md and Verification.md to run the tests. Then you will get output like below: +``` +> NODE_ENV=test node test/postman/clearTestData.js + +info: Clear the Postman test data. +clear the test data from postman test! +ResourceRole to be deleted addd9ae8-9610-4c20-9849-95587fbfa318 +ResourceRolePhaseDependency to be deleted d775f701-e440-451d-b5cb-e675fd5db89e +ResourceRolePhaseDependency to be deleted 4aac6a0b-5375-4cc5-8af0-c3feb64ac51e +Resource to be deleted 82823bde-4acb-437a-8ab1-03aef7f30ea0 +Resource to be deleted c02514c9-93ef-4da9-8771-df0fbb931d86 +Resource to be deleted 262528be-94c3-4ae7-96be-9c643a54c457 +Resource to be deleted 03eac62d-93ed-4be1-a061-4d58595d0833 +Resource to be deleted e61a2997-f995-47ff-98ca-aeb42831aec1 +Resource to be deleted 2572f829-1076-470e-b142-59d07cc59a1f +Resource to be deleted 2a9f228d-0981-48fd-80e7-988b23f1dc8c +Resource to be deleted 15093b6b-13aa-4f7c-964a-6b5708e302e4 +Resource to be deleted eaf6b9c9-b0ca-4804-ba6f-654127d4feaf +ResourceRole to be deleted 9a72f8cb-93b3-4f3e-b9ed-7bbe09255521 +ResourceRole to be deleted f722e872-897f-442f-980c-e92d00fe70fb +ResourceRole to be deleted 1d28eb17-4085-4269-b5a2-c73cc28aa5b9 +ResourceRole to be deleted c4b53497-d6d2-43dc-b5bc-f09a681ae33a +ResourceRole to be deleted 47f3191d-1596-4155-b8da-35dc9288d820 +ResourceRole to be deleted c5032dba-5da1-4846-a46c-845d74e880be +ResourceRole to be deleted 1da92cb3-8658-46d7-b147-4c913634fac1 +clear the test data from postman test completed! +info: Done! +``` +## Strategy +1. Setup the `AUTOMATED_TESTING_NAME_PREFIX` from the test environment. This prefix should be a name that will never be used +set as part of the role name. e.g. 'POSTMANE2E-'. In this case, the created `ResourceRole` will have a name like 'POSTMANE2E-submitter'. + +2. You can use use Postman's mock server for the bus api. You can refer to https://drive.google.com/file/d/1GXMzyqpzwix-LDBwieiRFfpJlJxrTIgI/view?usp=sharing + for details. You need to update the environment variable `BUSAPI_URL` to your Postman mock server. + +3. Steps of clearing the test data from Postman tests. + * Find all `ResourceRole` record whose names are starting with `AUTOMATED_TESTING_NAME_PREFIX`. + * For each `ResourceRole` record, find all `ResourceRolePhaseDependency` records whose `resourceRoleId` are the same + as the `id` of `RecourceRole`. Delete those `ResourceRolePhaseDependency` records. + * For each `ResourceRole` record, find all `Resource` records whose `roleId` are the same + as the `id` of `RecourceRole`. + * Delete those `Resource` records. + * Delete the ES index by the resource id too. (Only **Resource** are indexed by ES.) + * Delete the `ResourceRole` record. + +4. Note, in production enviroment, there is no need to run `npm run init-es force` or `npm run init-db`. + +## Questions from the spec +* The DB is getting filled up with dummy/test data. You need to suggest a way to delete/clean up the data created from executing the tests without affecting existing data. + _Check above strategy section._ +* Lookup data may not be required to get created as it may already exist or in some cases must not get created as there will be conflicts with existing data. You need to suggest how to overcome this issue. + _All data from the Postman tests can be easily deleted._ +* Existing lookup data should not be deleted. You need to suggest how to avoid accidentally deleting lookup data. + _The Postman tests only use the testing data created by itself._ +* Existing production data should not be affected by the tests. You need to suggest how to avoid this possible issue. + _Check the strategy section. All testing data are removed at last._ +* If possible, we should be able to differentiate the test data from the actual data so we can filter it out from the search results of the production API. Please suggest how to achieve this. + _Check the strategy section. We can easy find all `ResourceRole` records with the given role name prefix. Then we can find all the related `ResourceRolePhaseDependency` and `Resource`._ diff --git a/test/postman/README.md b/test/postman/README.md new file mode 100644 index 0000000..83ae04f --- /dev/null +++ b/test/postman/README.md @@ -0,0 +1,71 @@ +# Automated testing using Postman + Newman +## Configurations + +- All configurations are set in [/config/test.js](../../config/test.js). +- All test data is set in [/test/postman/testData](testData/). + +## Running the tests locally + +- Follow the steps from the [Readme](../../ReadMe.md) + +## Running the tests on CircleCI + +- With every commit in the `develop` branch, and after the API is deployed on the development environment, a `Run-Newman-Test` job is created on CircleCI. +- You need to approve this step in order to trigger the test execution. +- The progress as well as the results can be monitored within CircleCI and the final result (pass/fail) will also be visible on the repository page on Github. +- If you simply want to trigger the tests, you can either rerun the test workflow from within CircleCI or push an empty commit to trigger a new deployment. +## Testing summary + +The following scenarios have been tested: + +- create resource role by admin +- create resource role by m2m +- create resource role with all kinds of invalid token +- update resource role by admin +- update resource role by m2m +- update resource role with all kinds of invalid token +- failure - update resource role invalid id 404 +- create dependency by admin +- create dependency by m2m +- create dependency with all kinds of invalid token +- create dependency with not found phase id 404 +- get all dependencies +- get matched dependencies +- get dependencies with all kinds of invalid token +- update dependency by admin +- update dependency by m2m +- update not found dependency 404 +- update dependency with all kinds of invalid token +- delete dependency with all kinds of invalid token +- delete dependency with admin +- delete dependency with m2m +- create resource role with all kinds of invalid request body +- update resource role with all kinds of invalid request body +- get all resource roles +- get matched resource roles +- get resource roles with all kinds of invalid parameter +- create dependency with all kinds of invalid request body +- update dependency with all kinds of invalid request body +- get dependencies with all kinds of invalid parameter +- create resource by admin +- create resource using m2m token +- create resource with all kinds of invalid token +- create resource with all kinds of invalid request body +- get resources by required parameter only +- get resources with all parameters +- get resources with all kinds of invalid parameter +- get challenges by member with different users +- get challenges by member with resource role +- get challenges by member with all kinds of invalid token +- get challenges by member with all kinds of invalid parameter +- delete resource with all kinds of invalid token +- delete resource with all kinds of invalid parameter +- delete resource with admin +- delete resource with m2m + +### Roles tested + +- M2M +- Admin +- Copilot +- User diff --git a/test/postman/clearTestData.js b/test/postman/clearTestData.js new file mode 100644 index 0000000..95424e0 --- /dev/null +++ b/test/postman/clearTestData.js @@ -0,0 +1,28 @@ +/** + * Clear the postman test data. All data created by postman e2e tests will be cleared. + */ +const logger = require('../../src/common/logger') +const helper = require('../../src/common/helper') +const config = require('config') + +logger.info('Clear the Postman test data.') + +/** + * Clear the postman test data. The main function of this class. + * @returns {Promise} + */ +const clearTestData = async () => { + await helper.postRequest(`${config.API_BASE_URL}/${config.API_VERSION}/resources/internal/jobs/clean`) +} + +clearTestData().then(() => { + logger.info('Completed!') + process.exit() +}).catch((e) => { + logger.logFullError(e) + process.exit(1) +}) + +module.exports = { + clearTestData +} diff --git a/test/postman/newman.js b/test/postman/newman.js new file mode 100644 index 0000000..7f029d5 --- /dev/null +++ b/test/postman/newman.js @@ -0,0 +1,197 @@ +const config = require('config') +const apiTestLib = require('tc-api-testing-lib') +const helper = require('../../src/common/helper') +const logger = require('../../src/common/logger') + +const requests = [ + { + folder: 'create resource role by admin', + iterationData: require('./testData/resource-role/create-resource-role-by-admin.json') + }, + { + folder: 'create resource role by m2m', + iterationData: require('./testData/resource-role/create-resource-role-by-m2m.json') + }, + { + folder: 'create resource role with all kinds of invalid token', + iterationData: require('./testData/resource-role/create-resource-role-with-invalid-tokens.json') + }, + { + folder: 'update resource role by admin', + iterationData: require('./testData/resource-role/update-resource-role-by-admin.json') + }, + { + folder: 'update resource role by m2m', + iterationData: require('./testData/resource-role/update-resource-role-by-m2m.json') + }, + { + folder: 'update resource role with all kinds of invalid token', + iterationData: require('./testData/resource-role/update-resource-role-with-invalid-tokens.json') + }, { + folder: 'failure - update resource role invalid id 404' + }, + { + folder: 'create dependency by admin', + iterationData: require('./testData/resource-role-phase-dependency/create-dependency.json') + }, + { + folder: 'create dependency by m2m', + iterationData: require('./testData/resource-role-phase-dependency/create-dependency.json') + }, + { + folder: 'create dependency with all kinds of invalid token', + iterationData: require('./testData/resource-role-phase-dependency/create-dependency-with-invalid-tokens.json') + }, + { + folder: 'create dependency with not found phase id 404' + }, + { + folder: 'get all dependencies' + }, + { + folder: 'get matched dependencies' + }, + { + folder: 'get dependencies with all kinds of invalid token', + iterationData: require('./testData/resource-role-phase-dependency/get-dependency-with-invalid-tokens.json') + }, + { + folder: 'update dependency by admin', + iterationData: require('./testData/resource-role-phase-dependency/update-dependency.json') + }, + { + folder: 'update dependency by m2m', + iterationData: require('./testData/resource-role-phase-dependency/update-dependency.json') + }, + { + folder: 'update not found dependency 404' + }, + { + folder: 'update dependency with all kinds of invalid token', + iterationData: require('./testData/resource-role-phase-dependency/update-dependency-with-invalid-tokens.json') + }, + { + folder: 'delete dependency with all kinds of invalid token', + iterationData: require('./testData/resource-role-phase-dependency/delete-dependency-with-invalid-tokens.json') + }, + { + folder: 'delete dependency with admin' + }, + { + folder: 'delete dependency with m2m' + }, + { + folder: 'create resource role with all kinds of invalid request body', + iterationData: require('./testData/resource-role/create-resource-role-with-invalid-data.json') + }, + { + folder: 'update resource role with all kinds of invalid request body', + iterationData: require('./testData/resource-role/update-resource-role-with-invalid-data.json') + }, + { + folder: 'get all resource roles' + }, + { + folder: 'get matched resource roles' + }, + { + folder: 'get resource roles with all kinds of invalid parameter', + iterationData: require('./testData/resource-role/get-resource-role-with-invalid-data.json') + }, + { + folder: 'create dependency with all kinds of invalid request body', + iterationData: require('./testData/resource-role-phase-dependency/create-dependency-with-invalid-data.json') + }, + { + folder: 'update dependency with all kinds of invalid request body', + iterationData: require('./testData/resource-role-phase-dependency/update-dependency-with-invalid-data.json') + }, + { + folder: 'get dependencies with all kinds of invalid parameter', + iterationData: require('./testData/resource-role-phase-dependency/get-dependencies-with-invalid-data.json') + }, + { + folder: 'create resource by admin', + iterationData: require('./testData/resource/create-resource-by-admin.json') + }, + { + folder: 'create resource using m2m token', + iterationData: require('./testData/resource/create-resource-by-m2m.json') + }, + { + folder: 'create resource with all kinds of invalid token', + iterationData: require('./testData/resource/create-resource-with-invalid-tokens.json') + }, + { + folder: 'create resource with all kinds of invalid request body', + iterationData: require('./testData/resource/create-resource-with-invalid-data.json') + }, + { + folder: 'get resources by required parameter only', + iterationData: require('./testData/resource/get-resources-with-required-parameter.json') + }, + { + folder: 'get resources with all parameters', + iterationData: require('./testData/resource/get-resources-with-all-parameters.json') + }, + { + folder: 'get resources with all kinds of invalid parameter', + iterationData: require('./testData/resource/get-resources-with-invalid-data.json') + }, + { + folder: 'get challenges by member with different users', + iterationData: require('./testData/resource/get-resources-by-member-with-different-users.json') + }, + { + folder: 'get challenges by member with resource role', + iterationData: require('./testData/resource/get-resources-by-member-with-resource-role.json') + }, + { + folder: 'get challenges by member with all kinds of invalid token', + iterationData: require('./testData/resource/get-resources-by-member-with-invalid-tokens.json') + }, + { + folder: 'get challenges by member with all kinds of invalid parameter', + iterationData: require('./testData/resource/get-resources-by-member-with-invalid-parameter.json') + }, + { + folder: 'delete resource with all kinds of invalid token', + iterationData: require('./testData/resource/delete-resource-with-invalid-tokens.json') + }, + { + folder: 'delete resource with all kinds of invalid parameter', + iterationData: require('./testData/resource/delete-resource-with-invalid-parameter.json') + }, + { + folder: 'delete resource with admin' + }, + { + folder: 'delete resource with m2m' + } +] + +/** + * Clear the test data. + * @return {Promise} + */ +async function clearTestData () { + logger.info('Clear the Postman test data.') + await helper.postRequest(`${config.API_BASE_URL}/${config.API_VERSION}/resources/internal/jobs/clean`) + logger.info('Finished clear the Postman test data.') +} + +/** + * Run the postman tests. + */ +apiTestLib.runTests(requests, require.resolve('./resource-api.postman_collection.json'), + require.resolve('./resource-api.postman_environment.json')).then(async () => { + logger.info('newman test completed!') + await clearTestData() +}).catch(async (err) => { + logger.logFullError(err) + + // Only calling the clean up function when it is not validation error. + if (err.name !== 'ValidationError') { + await clearTestData() + } +}) diff --git a/test/postman/resource-api.postman_collection.json b/test/postman/resource-api.postman_collection.json new file mode 100644 index 0000000..d56b00e --- /dev/null +++ b/test/postman/resource-api.postman_collection.json @@ -0,0 +1,2670 @@ +{ + "info": { + "_postman_id": "751f9f67-b079-4916-be2e-58d19e423484", + "name": "resource-api", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + }, + "item": [ + { + "name": "Resource Roles", + "item": [ + { + "name": "create resource role", + "item": [ + { + "name": "create resource role by admin", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " if(httpCode === 200){", + " const response = pm.response.json()", + " pm.expect(response.name).to.eq(iterationData.get('name'))", + " pm.expect(response.fullReadAccess).to.eq(iterationData.get('fullReadAccess'))", + " pm.expect(response.fullWriteAccess).to.eq(iterationData.get('fullWriteAccess'))", + " pm.expect(response.isActive).to.eq(iterationData.get('isActive'))", + " pm.expect(response.selfObtainable).to.eq(iterationData.get('selfObtainable'))", + " pm.environment.set(\"COPILOT_RESOURCE_ROLE_ID\", response.id);", + " }", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{admin_token}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"name\": \"{{name}}\",\n\t\"fullReadAccess\": {{fullReadAccess}},\n \"fullWriteAccess\": {{fullWriteAccess}},\n\t\"isActive\": {{isActive}},\n\t\"selfObtainable\": {{selfObtainable}}\n}" + }, + "url": { + "raw": "{{URL}}/resource-roles", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles" + ] + } + }, + "response": [] + }, + { + "name": "create resource role by m2m", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " if(httpCode === 200){", + " const response = pm.response.json()", + " pm.expect(response.name).to.eq(iterationData.get('name'))", + " pm.expect(response.fullReadAccess).to.eq(iterationData.get('fullReadAccess'))", + " pm.expect(response.fullWriteAccess).to.eq(iterationData.get('fullWriteAccess'))", + " pm.expect(response.isActive).to.eq(iterationData.get('isActive'))", + " pm.expect(response.selfObtainable).to.eq(iterationData.get('selfObtainable'))", + " pm.environment.set(\"COPILOT_RESOURCE_ROLE_ID\", response.id);", + " }", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{M2M_TOKEN}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"name\": \"{{name}}\",\n\t\"fullReadAccess\": {{fullReadAccess}},\n \"fullWriteAccess\": {{fullWriteAccess}},\n\t\"isActive\": {{isActive}},\n\t\"selfObtainable\": {{selfObtainable}}\n}" + }, + "url": { + "raw": "{{URL}}/resource-roles", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles" + ] + } + }, + "response": [] + }, + { + "name": "create resource role with all kinds of invalid token", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " const response = pm.response.json()", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "{{jwtToken}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"name\": \"failure-token\",\n\t\"fullReadAccess\": true,\n \"fullWriteAccess\": false,\n\t\"isActive\": true,\n \"selfObtainable\": false\n}" + }, + "url": { + "raw": "{{URL}}/resource-roles", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles" + ] + } + }, + "response": [] + }, + { + "name": "create resource role with all kinds of invalid request body", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " const response = pm.response.json()", + " pm.expect(response.message).to.eq(iterationData.get('message'))", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{admin_token}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"name\": \"{{name}}\",\n\t\"fullReadAccess\": {{fullReadAccess}},\n \"fullWriteAccess\": {{fullWriteAccess}},\n\t\"{{required_field_1}}\": {{isActive}},\n\t\"{{required_field_2}}\": {{selfObtainable}}\n}" + }, + "url": { + "raw": "{{URL}}/resource-roles", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "update resource role", + "item": [ + { + "name": "update resource role by admin", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " if(httpCode === 200){", + " const response = pm.response.json()", + " pm.expect(response.name).to.eq(iterationData.get('name'))", + " pm.expect(response.fullReadAccess).to.eq(iterationData.get('fullReadAccess'))", + " pm.expect(response.fullWriteAccess).to.eq(iterationData.get('fullWriteAccess'))", + " pm.expect(response.isActive).to.eq(iterationData.get('isActive'))", + " pm.expect(response.selfObtainable).to.eq(iterationData.get('selfObtainable'))", + " }", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "PUT", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{admin_token}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"name\": \"{{name}}\",\n\t\"fullReadAccess\": {{fullReadAccess}},\n \"fullWriteAccess\": {{fullWriteAccess}},\n\t\"isActive\": {{isActive}},\n\t\"selfObtainable\": {{selfObtainable}}\n}" + }, + "url": { + "raw": "{{URL}}/resource-roles/{{COPILOT_RESOURCE_ROLE_ID}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles", + "{{COPILOT_RESOURCE_ROLE_ID}}" + ] + } + }, + "response": [] + }, + { + "name": "update resource role by m2m", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " if(httpCode === 200){", + " const response = pm.response.json()", + " pm.expect(response.name).to.eq(iterationData.get('name'))", + " pm.expect(response.fullReadAccess).to.eq(iterationData.get('fullReadAccess'))", + " pm.expect(response.fullWriteAccess).to.eq(iterationData.get('fullWriteAccess'))", + " pm.expect(response.isActive).to.eq(iterationData.get('isActive'))", + " pm.expect(response.selfObtainable).to.eq(iterationData.get('selfObtainable'))", + " }", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "PUT", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{M2M_TOKEN}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"name\": \"{{name}}\",\n\t\"fullReadAccess\": {{fullReadAccess}},\n \"fullWriteAccess\": {{fullWriteAccess}},\n\t\"isActive\": {{isActive}},\n\t\"selfObtainable\": {{selfObtainable}}\n}" + }, + "url": { + "raw": "{{URL}}/resource-roles/{{COPILOT_RESOURCE_ROLE_ID}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles", + "{{COPILOT_RESOURCE_ROLE_ID}}" + ] + } + }, + "response": [] + }, + { + "name": "update resource role with all kinds of invalid token", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " const response = pm.response.json()", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "PUT", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "{{jwtToken}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"name\": \"failure-test\",\n\t\"fullReadAccess\": true,\n \"fullWriteAccess\": false,\n\t\"isActive\": true,\n\t\"selfObtainable\": false\n}" + }, + "url": { + "raw": "{{URL}}/resource-roles/{{COPILOT_RESOURCE_ROLE_ID}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles", + "{{COPILOT_RESOURCE_ROLE_ID}}" + ] + } + }, + "response": [] + }, + { + "name": "failure - update resource role invalid id 404", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 404\", function () {", + " pm.response.to.have.status(404);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "PUT", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{admin_token}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"name\": \"failure-test\",\n\t\"fullReadAccess\": true,\n \"fullWriteAccess\": false,\n\t\"isActive\": true,\n\t\"selfObtainable\": false\n}" + }, + "url": { + "raw": "{{URL}}/resource-roles/fe6d0a58-ce7d-4521-8501-b8132b1c0311", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles", + "fe6d0a58-ce7d-4521-8501-b8132b1c0311" + ] + } + }, + "response": [] + }, + { + "name": "update resource role with all kinds of invalid request body", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " const response = pm.response.json()", + " pm.expect(response.message).to.eq(iterationData.get('message'))", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "PUT", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{admin_token}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"name\": \"{{name}}\",\n\t\"fullReadAccess\": {{fullReadAccess}},\n \"fullWriteAccess\": {{fullWriteAccess}},\n\t\"{{required_field_1}}\": {{isActive}},\n\t\"{{required_field_2}}\": {{selfObtainable}}\n}" + }, + "url": { + "raw": "{{URL}}/resource-roles/{{COPILOT_RESOURCE_ROLE_ID}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles", + "{{COPILOT_RESOURCE_ROLE_ID}}" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "get resource role", + "item": [ + { + "name": "get all resource roles", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "", + "type": "text", + "value": "", + "disabled": true + } + ], + "url": { + "raw": "{{URL}}/resource-roles", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles" + ] + } + }, + "response": [] + }, + { + "name": "get matched resource roles", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "", + "type": "text", + "value": "", + "disabled": true + } + ], + "url": { + "raw": "{{URL}}/resource-roles/?name=Reviewer&isActive=true&legacyId=1&selfObtainable=false&fullReadAccess=true&fullWriteAccess=false", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles", + "" + ], + "query": [ + { + "key": "name", + "value": "Reviewer" + }, + { + "key": "isActive", + "value": "true" + }, + { + "key": "legacyId", + "value": "1" + }, + { + "key": "selfObtainable", + "value": "false" + }, + { + "key": "fullReadAccess", + "value": "true" + }, + { + "key": "fullWriteAccess", + "value": "false" + } + ] + } + }, + "response": [] + }, + { + "name": "get resource roles with all kinds of invalid parameter", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " const response = pm.response.json()", + " pm.expect(response.message).to.eq(iterationData.get('message'))", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "", + "type": "text", + "value": "", + "disabled": true + } + ], + "url": { + "raw": "{{URL}}/resource-roles/?name={{name}}&isActive={{isActive}}&legacyId={{legacyId}}&selfObtainable={{selfObtainable}}&fullReadAccess={{fullReadAccess}}&fullWriteAccess={{fullWriteAccess}}&{{invalid}}={{invalid}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles", + "" + ], + "query": [ + { + "key": "name", + "value": "{{name}}" + }, + { + "key": "isActive", + "value": "{{isActive}}" + }, + { + "key": "legacyId", + "value": "{{legacyId}}" + }, + { + "key": "selfObtainable", + "value": "{{selfObtainable}}" + }, + { + "key": "fullReadAccess", + "value": "{{fullReadAccess}}" + }, + { + "key": "fullWriteAccess", + "value": "{{fullWriteAccess}}" + }, + { + "key": "{{invalid}}", + "value": "{{invalid}}" + } + ] + } + }, + "response": [] + } + ] + } + ] + }, + { + "name": "Resource Role Phase Dependencies", + "item": [ + { + "name": "create dependency", + "item": [ + { + "name": "create dependency by admin", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " if(httpCode === 200){", + " const response = pm.response.json()", + " pm.expect(response.phaseId).to.eq(iterationData.get('phaseId'))", + " pm.expect(response.resourceRoleId).to.eq(pm.environment.get('COPILOT_RESOURCE_ROLE_ID'))", + " pm.expect(response.phaseState).to.eq(iterationData.get('phaseState'))", + " pm.environment.set(\"DEPENDENCY_ID_1\", pm.response.json().id);", + " }", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{admin_token}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"phaseId\": \"{{phaseId}}\",\n\t\"resourceRoleId\": \"{{COPILOT_RESOURCE_ROLE_ID}}\",\n\t\"phaseState\": {{phaseState}}\n}" + }, + "url": { + "raw": "{{URL}}/resource-roles/Phase-dependencies", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles", + "Phase-dependencies" + ] + } + }, + "response": [] + }, + { + "name": "create dependency by m2m", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "const idLabel = iterationData.get('idLabel')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " if(httpCode === 200){", + " const response = pm.response.json()", + " pm.expect(response.phaseId).to.eq(iterationData.get('phaseId'))", + " pm.expect(response.resourceRoleId).to.eq(pm.environment.get('COPILOT_RESOURCE_ROLE_ID'))", + " pm.expect(response.phaseState).to.eq(iterationData.get('phaseState'))", + " pm.environment.set(\"DEPENDENCY_ID_2\", pm.response.json().id);", + " pm.environment.set(idLabel, pm.response.json().id);", + " }", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{M2M_TOKEN}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"phaseId\": \"{{phaseId}}\",\n\t\"resourceRoleId\": \"{{COPILOT_RESOURCE_ROLE_ID}}\",\n\t\"phaseState\": {{phaseState}}\n}" + }, + "url": { + "raw": "{{URL}}/resource-roles/Phase-dependencies", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles", + "Phase-dependencies" + ] + } + }, + "response": [] + }, + { + "name": "create dependency with all kinds of invalid token", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " const response = pm.response.json()", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "{{jwtToken}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"phaseId\": \"{{PHASE_ID}}\",\n\t\"resourceRoleId\": \"{{COPILOT_RESOURCE_ROLE_ID}}\",\n\t\"phaseState\": false\n}" + }, + "url": { + "raw": "{{URL}}/resource-roles/Phase-dependencies", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles", + "Phase-dependencies" + ] + } + }, + "response": [] + }, + { + "name": "create dependency with not found phase id 404", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 404\", function () {", + " pm.response.to.have.status(404);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{M2M_TOKEN}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"phaseId\": \"fe6d0a58-ce7d-4521-8501-b8132b1c0391\",\n\t\"resourceRoleId\": \"fe6d0a58-ce7d-4521-8501-b8132b1c0391\",\n\t\"phaseState\": false\n}" + }, + "url": { + "raw": "{{URL}}/resource-roles/Phase-dependencies", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles", + "Phase-dependencies" + ] + } + }, + "response": [] + }, + { + "name": "create dependency with all kinds of invalid request body", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " const response = pm.response.json()", + " pm.expect(response.message).to.eq(iterationData.get('message'))", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{admin_token}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"{{required_field_1}}\": \"{{phaseId}}\",\n\t\"{{required_field_2}}\": \"{{COPILOT_RESOURCE_ROLE_ID}}\",\n\t\"{{required_field_3}}\": {{phaseState}}\n}" + }, + "url": { + "raw": "{{URL}}/resource-roles/Phase-dependencies", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles", + "Phase-dependencies" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "get dependencies", + "item": [ + { + "name": "get all dependencies", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{admin_token}}" + } + ], + "url": { + "raw": "{{URL}}/resource-roles/Phase-dependencies", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles", + "Phase-dependencies" + ] + } + }, + "response": [] + }, + { + "name": "get matched dependencies", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{M2M_TOKEN}}" + } + ], + "url": { + "raw": "{{URL}}/resource-roles/Phase-dependencies?phaseId={{PHASE_ID}}&resourceRoleId={{COPILOT_RESOURCE_ROLE_ID}}&phaseState=false", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles", + "Phase-dependencies" + ], + "query": [ + { + "key": "phaseId", + "value": "{{PHASE_ID}}" + }, + { + "key": "resourceRoleId", + "value": "{{COPILOT_RESOURCE_ROLE_ID}}" + }, + { + "key": "phaseState", + "value": "false" + } + ] + } + }, + "response": [] + }, + { + "name": "get dependencies with all kinds of invalid token", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " const response = pm.response.json()", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "{{jwtToken}}" + } + ], + "url": { + "raw": "{{URL}}/resource-roles/Phase-dependencies", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles", + "Phase-dependencies" + ] + } + }, + "response": [] + }, + { + "name": "get dependencies with all kinds of invalid parameter", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " const response = pm.response.json()", + " pm.expect(response.message).to.eq(iterationData.get('message'))", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{admin_token}}" + } + ], + "url": { + "raw": "{{URL}}/resource-roles/Phase-dependencies?phaseId={{phaseId}}&resourceRoleId={{COPILOT_RESOURCE_ROLE_ID}}&phaseState={{phaseState}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles", + "Phase-dependencies" + ], + "query": [ + { + "key": "phaseId", + "value": "{{phaseId}}" + }, + { + "key": "resourceRoleId", + "value": "{{COPILOT_RESOURCE_ROLE_ID}}" + }, + { + "key": "phaseState", + "value": "{{phaseState}}" + } + ] + } + }, + "response": [] + } + ] + }, + { + "name": "update dependency", + "item": [ + { + "name": "update dependency by admin", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " if(httpCode === 200){", + " const response = pm.response.json()", + " pm.expect(response.phaseId).to.eq(iterationData.get('phaseId'))", + " pm.expect(response.resourceRoleId).to.eq(pm.environment.get('COPILOT_RESOURCE_ROLE_ID'))", + " pm.expect(response.phaseState).to.eq(iterationData.get('phaseState'))", + " }", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "PUT", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{admin_token}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"phaseId\": \"{{phaseId}}\",\n\t\"resourceRoleId\": \"{{COPILOT_RESOURCE_ROLE_ID}}\",\n\t\"phaseState\": {{phaseState}}\n}" + }, + "url": { + "raw": "{{URL}}/resource-roles/Phase-dependencies/{{DEPENDENCY_ID_1}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles", + "Phase-dependencies", + "{{DEPENDENCY_ID_1}}" + ] + } + }, + "response": [] + }, + { + "name": "update dependency by m2m", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " if(httpCode === 200){", + " const response = pm.response.json()", + " pm.expect(response.phaseId).to.eq(iterationData.get('phaseId'))", + " pm.expect(response.resourceRoleId).to.eq(pm.environment.get('COPILOT_RESOURCE_ROLE_ID'))", + " pm.expect(response.phaseState).to.eq(iterationData.get('phaseState'))", + " }", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "PUT", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{M2M_TOKEN}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"phaseId\": \"{{phaseId}}\",\n\t\"resourceRoleId\": \"{{COPILOT_RESOURCE_ROLE_ID}}\",\n\t\"phaseState\": {{phaseState}}\n}" + }, + "url": { + "raw": "{{URL}}/resource-roles/Phase-dependencies/{{DEPENDENCY_ID_1}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles", + "Phase-dependencies", + "{{DEPENDENCY_ID_1}}" + ] + } + }, + "response": [] + }, + { + "name": "update not found dependency 404", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 404\", function () {", + " pm.response.to.have.status(404);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "PUT", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{M2M_TOKEN}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"phaseId\": \"{{PHASE_ID}}\",\n\t\"resourceRoleId\": \"{{COPILOT_RESOURCE_ROLE_ID}}\",\n\t\"phaseState\": false\n}" + }, + "url": { + "raw": "{{URL}}/resource-roles/Phase-dependencies/{{COPILOT_RESOURCE_ROLE_ID}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles", + "Phase-dependencies", + "{{COPILOT_RESOURCE_ROLE_ID}}" + ] + } + }, + "response": [] + }, + { + "name": "update dependency with all kinds of invalid token", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " const response = pm.response.json()", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "PUT", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "{{jwtToken}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"phaseId\": \"{{PHASE_ID}}\",\n\t\"resourceRoleId\": \"{{COPILOT_RESOURCE_ROLE_ID}}\",\n\t\"phaseState\": false\n}" + }, + "url": { + "raw": "{{URL}}/resource-roles/Phase-dependencies/{{DEPENDENCY_ID_1}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles", + "Phase-dependencies", + "{{DEPENDENCY_ID_1}}" + ] + } + }, + "response": [] + }, + { + "name": "update dependency with all kinds of invalid request body", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " const response = pm.response.json()", + " pm.expect(response.message).to.eq(iterationData.get('message'))", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "PUT", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{admin_token}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"{{required_field_1}}\": \"{{phaseId}}\",\n\t\"{{required_field_2}}\": \"{{COPILOT_RESOURCE_ROLE_ID}}\",\n\t\"{{required_field_3}}\": {{phaseState}}\n}" + }, + "url": { + "raw": "{{URL}}/resource-roles/Phase-dependencies/{{DEPENDENCY_ID_1}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles", + "Phase-dependencies", + "{{DEPENDENCY_ID_1}}" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "delete dependency", + "item": [ + { + "name": "delete dependency with all kinds of invalid token", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " const response = pm.response.json()", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "DELETE", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "{{jwtToken}}" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "{{URL}}/resource-roles/Phase-dependencies/{{DEPENDENCY_ID_2}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles", + "Phase-dependencies", + "{{DEPENDENCY_ID_2}}" + ] + } + }, + "response": [] + }, + { + "name": "delete dependency with admin", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "DELETE", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{admin_token}}" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "{{URL}}/resource-roles/Phase-dependencies/{{DEPENDENCY_ID_1}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles", + "Phase-dependencies", + "{{DEPENDENCY_ID_1}}" + ] + } + }, + "response": [] + }, + { + "name": "delete dependency with m2m", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "DELETE", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{M2M_TOKEN}}" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "{{URL}}/resource-roles/Phase-dependencies/{{DEPENDENCY_ID_3}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resource-roles", + "Phase-dependencies", + "{{DEPENDENCY_ID_3}}" + ] + } + }, + "response": [] + } + ] + } + ] + }, + { + "name": "Resources", + "item": [ + { + "name": "create resource", + "item": [ + { + "name": "create resource by admin", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " if(httpCode === 200){", + " const response = pm.response.json()", + " pm.expect(response.memberHandle).to.eq(iterationData.get('memberHandle'))", + " pm.expect(response.challengeId).to.eq(pm.environment.get('CHALLENGE_ID'))", + " pm.expect(response.roleId).to.eq(pm.environment.get('COPILOT_RESOURCE_ROLE_ID'))", + " pm.expect(response.id).to.be.a(\"string\");", + " pm.expect(response.created).to.be.a(\"string\");", + " pm.expect(response.createdBy).to.be.a(\"string\");", + " pm.expect(response.memberId).to.be.a(\"string\");", + " }", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "value": "application/json", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{admin_token}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"{{memberHandle}}\",\n\t\"roleId\": \"{{COPILOT_RESOURCE_ROLE_ID}}\"\n}" + }, + "url": { + "raw": "{{URL}}/resources", + "host": [ + "{{URL}}" + ], + "path": [ + "resources" + ] + } + }, + "response": [] + }, + { + "name": "create resource using m2m token", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " if(httpCode === 200){", + " const response = pm.response.json()", + " pm.expect(response.memberHandle).to.eq(iterationData.get('memberHandle'))", + " pm.expect(response.challengeId).to.eq(pm.environment.get('CHALLENGE_ID'))", + " pm.expect(response.roleId).to.eq(pm.environment.get('COPILOT_RESOURCE_ROLE_ID'))", + " pm.expect(response.id).to.be.a(\"string\");", + " pm.expect(response.created).to.be.a(\"string\");", + " pm.expect(response.createdBy).to.be.a(\"string\");", + " pm.expect(response.memberId).to.be.a(\"string\");", + " }", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{M2M_TOKEN}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"{{memberHandle}}\",\n\t\"roleId\": \"{{COPILOT_RESOURCE_ROLE_ID}}\"\n}" + }, + "url": { + "raw": "{{URL}}/resources", + "host": [ + "{{URL}}" + ], + "path": [ + "resources" + ] + } + }, + "response": [] + }, + { + "name": "create resource with all kinds of invalid token", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " const response = pm.response.json()", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "{{jwtToken}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"heffan\",\n\t\"roleId\": \"{{COPILOT_RESOURCE_ROLE_ID}}\"\n}" + }, + "url": { + "raw": "{{URL}}/resources", + "host": [ + "{{URL}}" + ], + "path": [ + "resources" + ] + } + }, + "response": [] + }, + { + "name": "create resource with all kinds of invalid request body", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " const response = pm.response.json()", + " pm.expect(response.message).to.includes(iterationData.get('message'))", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{admin_token}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"{{required_field_1}}\": \"{{CHALLENGE_ID}}\",\n\t\"{{required_field_2}}\": \"{{memberHandle}}\",\n\t\"{{required_field_3}}\": \"{{COPILOT_RESOURCE_ROLE_ID}}\"\n}" + }, + "url": { + "raw": "{{URL}}/resources", + "host": [ + "{{URL}}" + ], + "path": [ + "resources" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "get resources", + "item": [ + { + "name": "get resources by required parameter only", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});", + "pm.test(\"A list of resources should be returned\", () => {", + " const responseJson = pm.response.json();", + " pm.expect(responseJson.length > 0);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "", + "type": "text", + "value": "", + "disabled": true + } + ], + "url": { + "raw": "{{URL}}/resources?{{required_field_1}}={{CHALLENGE_ID}}&{{required_field_2}}={{memberId}}&{{required_field_3}}={{memberHandle}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resources" + ], + "query": [ + { + "key": "{{required_field_1}}", + "value": "{{CHALLENGE_ID}}" + }, + { + "key": "{{required_field_2}}", + "value": "{{memberId}}" + }, + { + "key": "{{required_field_3}}", + "value": "{{memberHandle}}" + } + ] + } + }, + "response": [] + }, + { + "name": "get resources with all parameters", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "", + "value": "", + "type": "text", + "disabled": true + } + ], + "url": { + "raw": "{{URL}}/resources?challengeId={{CHALLENGE_ID}}&page={{page}}&perPage={{perPage}}&memberId={{memberId}}&memberHandle={{memberHandle}}&roleId={{COPILOT_RESOURCE_ROLE_ID}}&sortBy={{sortBy}}&sortOrder={{sortOrder}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resources" + ], + "query": [ + { + "key": "challengeId", + "value": "{{CHALLENGE_ID}}" + }, + { + "key": "page", + "value": "{{page}}" + }, + { + "key": "perPage", + "value": "{{perPage}}" + }, + { + "key": "memberId", + "value": "{{memberId}}" + }, + { + "key": "memberHandle", + "value": "{{memberHandle}}" + }, + { + "key": "roleId", + "value": "{{COPILOT_RESOURCE_ROLE_ID}}" + }, + { + "key": "sortBy", + "value": "{{sortBy}}" + }, + { + "key": "sortOrder", + "value": "{{sortOrder}}" + } + ] + } + }, + "response": [] + }, + { + "name": "get resources with all kinds of invalid parameter", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " const response = pm.response.json()", + " pm.expect(response.message).to.eq(iterationData.get('message'))", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "", + "type": "text", + "value": "", + "disabled": true + } + ], + "url": { + "raw": "{{URL}}/resources?{{required_field_1}}={{CHALLENGE_ID}}&page={{page}}&perPage={{perPage}}&{{required_field_2}}={{memberId}}&{{required_field_3}}={{memberHandle}}&roleId={{COPILOT_RESOURCE_ROLE_ID}}&sortBy={{sortBy}}&sortOrder={{sortOrder}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resources" + ], + "query": [ + { + "key": "{{required_field_1}}", + "value": "{{CHALLENGE_ID}}" + }, + { + "key": "page", + "value": "{{page}}" + }, + { + "key": "perPage", + "value": "{{perPage}}" + }, + { + "key": "{{required_field_2}}", + "value": "{{memberId}}" + }, + { + "key": "{{required_field_3}}", + "value": "{{memberHandle}}" + }, + { + "key": "roleId", + "value": "{{COPILOT_RESOURCE_ROLE_ID}}" + }, + { + "key": "sortBy", + "value": "{{sortBy}}" + }, + { + "key": "sortOrder", + "value": "{{sortOrder}}" + }, + { + "key": "", + "value": "", + "disabled": true + } + ] + } + }, + "response": [] + } + ] + }, + { + "name": "list challenge by member", + "item": [ + { + "name": "get challenges by member with different users", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + " const iterationData = pm.iterationData", + " const memberId = iterationData.get('memberId')", + " const response = pm.response.json()", + " if (memberId == 'not_exist_user') {", + " // result should be empty", + " pm.expect(response.length).to.eq(0)", + " } else {", + " // result should not be empty", + " pm.expect(response.length).to.gt(0)", + " }", + " ", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "{{jwtToken}}", + "type": "text" + }, + { + "key": "", + "value": "", + "type": "text", + "disabled": true + }, + { + "key": "", + "value": "", + "type": "text", + "disabled": true + } + ], + "url": { + "raw": "{{URL}}/resources/{{memberId}}/challenges", + "host": [ + "{{URL}}" + ], + "path": [ + "resources", + "{{memberId}}", + "challenges" + ] + } + }, + "response": [] + }, + { + "name": "get challenges by member with resource role", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + " const iterationData = pm.iterationData", + " const memberId = iterationData.get('memberId')", + " const response = pm.response.json()", + " if (memberId == 'not_exist_user') {", + " // result should be empty", + " pm.expect(response.length).to.eq(0)", + " } else {", + " // result should be a list", + " pm.expect(response.length).to.gte(0)", + " }", + " ", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{admin_token}}" + }, + { + "key": "", + "type": "text", + "value": "", + "disabled": true + }, + { + "key": "", + "type": "text", + "value": "", + "disabled": true + } + ], + "url": { + "raw": "{{URL}}/resources/{{memberId}}/challenges?resourceRoleId={{COPILOT_RESOURCE_ROLE_ID}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resources", + "{{memberId}}", + "challenges" + ], + "query": [ + { + "key": "resourceRoleId", + "value": "{{COPILOT_RESOURCE_ROLE_ID}}" + } + ] + } + }, + "response": [] + }, + { + "name": "get challenges by member with all kinds of invalid token", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " const response = pm.response.json()", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Authorization", + "type": "text", + "value": "{{jwtToken}}" + }, + { + "key": "", + "type": "text", + "value": "", + "disabled": true + }, + { + "key": "", + "type": "text", + "value": "", + "disabled": true + } + ], + "url": { + "raw": "{{URL}}/resources/{{memberId}}/challenges", + "host": [ + "{{URL}}" + ], + "path": [ + "resources", + "{{memberId}}", + "challenges" + ] + } + }, + "response": [] + }, + { + "name": "get challenges by member with all kinds of invalid parameter", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " const response = pm.response.json()", + " pm.expect(response.message).to.eq(iterationData.get('message'))", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{admin_token}}" + }, + { + "key": "", + "type": "text", + "value": "", + "disabled": true + }, + { + "key": "", + "type": "text", + "value": "", + "disabled": true + } + ], + "url": { + "raw": "{{URL}}/resources/{{memberId}}/challenges?resourceRoleId={{COPILOT_RESOURCE_ROLE_ID}}&{{invalid}}={{invalid}}", + "host": [ + "{{URL}}" + ], + "path": [ + "resources", + "{{memberId}}", + "challenges" + ], + "query": [ + { + "key": "resourceRoleId", + "value": "{{COPILOT_RESOURCE_ROLE_ID}}" + }, + { + "key": "{{invalid}}", + "value": "{{invalid}}" + } + ] + } + }, + "response": [] + } + ] + }, + { + "name": "delete resource", + "item": [ + { + "name": "delete resource with all kinds of invalid token", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " const response = pm.response.json()", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "DELETE", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "{{jwtToken}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"denis\",\n\t\"roleId\": \"{{COPILOT_RESOURCE_ROLE_ID}}\"\n}" + }, + "url": { + "raw": "{{URL}}/resources", + "host": [ + "{{URL}}" + ], + "path": [ + "resources" + ] + } + }, + "response": [] + }, + { + "name": "delete resource with all kinds of invalid parameter", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const iterationData = pm.iterationData", + "const httpCode = iterationData.get('httpCode')", + "pm.test(`Status code is ${httpCode}`, function () {", + " pm.response.to.have.status(httpCode);", + " const response = pm.response.json()", + " pm.expect(response.message).to.eq(iterationData.get('message'))", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "DELETE", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{admin_token}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"{{required_field_1}}\": \"{{CHALLENGE_ID}}\",\n\t\"{{required_field_2}}\": \"{{memberHandle}}\",\n\t\"{{required_field_3}}\": \"{{COPILOT_RESOURCE_ROLE_ID}}\"\n}" + }, + "url": { + "raw": "{{URL}}/resources", + "host": [ + "{{URL}}" + ], + "path": [ + "resources" + ] + } + }, + "response": [] + }, + { + "name": "delete resource with admin", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "DELETE", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{admin_token}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"TonyJ\",\n\t\"roleId\": \"{{COPILOT_RESOURCE_ROLE_ID}}\"\n}" + }, + "url": { + "raw": "{{URL}}/resources", + "host": [ + "{{URL}}" + ], + "path": [ + "resources" + ] + } + }, + "response": [] + }, + { + "name": "delete resource with m2m", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "DELETE", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + }, + { + "key": "Authorization", + "type": "text", + "value": "Bearer {{M2M_TOKEN}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"challengeId\": \"{{CHALLENGE_ID}}\",\n\t\"memberHandle\": \"ghostar\",\n\t\"roleId\": \"{{COPILOT_RESOURCE_ROLE_ID}}\"\n}" + }, + "url": { + "raw": "{{URL}}/resources", + "host": [ + "{{URL}}" + ], + "path": [ + "resources" + ] + } + }, + "response": [] + } + ] + } + ] + } + ] +} diff --git a/test/postman/resource-api.postman_environment.json b/test/postman/resource-api.postman_environment.json new file mode 100644 index 0000000..e91d6c8 --- /dev/null +++ b/test/postman/resource-api.postman_environment.json @@ -0,0 +1,383 @@ +{ + "_": { + "postman_variable_scope": "environment", + "postman_exported_at": "2021-06-30T14:04:02.209Z", + "postman_exported_using": "Newman/5.2.4" + }, + "id": "8972a3df-731f-4475-b089-ccbb28735083", + "name": "resource-api", + "values": [ + { + "type": "any", + "value": "https://api.topcoder-dev.com/v5", + "key": "URL" + }, + { + "type": "any", + "value": "1d3b9aef-8266-47b4-970c-09ca53519560", + "key": "CHALLENGE_ID" + }, + { + "type": "any", + "value": "11111111-ce7d-4521-8501-b8132b1c0391", + "key": "CHALLENGE_NOT_FOUND_ID" + }, + { + "type": "any", + "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJDb25uZWN0IFN1cHBvcnQiLCJ0ZXN0Um9sZSIsImFhYSIsInRvbnlfdGVzdF8xIiwiQ29ubmVjdCBNYW5hZ2VyIiwiQ29ubmVjdCBBZG1pbiIsImNvcGlsb3QiLCJDb25uZWN0IENvcGlsb3QgTWFuYWdlciIsIlRvcGNvZGVyIFVzZXIiLCJhZG1pbmlzdHJhdG9yIiwidS1iYWhuIiwiYm9va2luZ21hbmFnZXIiXSwiaXNzIjoiaHR0cHM6Ly9hcGkudG9wY29kZXItZGV2LmNvbSIsImhhbmRsZSI6IlRvbnlKIiwiZXhwIjoxNjI1MDYyMTM4LCJ1c2VySWQiOiI4NTQ3ODk5IiwiaWF0IjoxNjI1MDYxNTM4LCJlbWFpbCI6ImFqZWZ0c0B0b3Bjb2Rlci5jb20iLCJqdGkiOiJhOTIyMmIyNC02OGM1LTQ5NDUtYmQ0Yy1kZDQwN2QzNGZjZDkifQ.DIZF1CDMJHugQ6s4ombCmPMe6A26JrSNpue3RXhBvQU", + "key": "admin_token" + }, + { + "type": "any", + "value": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ik5VSkZORGd4UlRVME5EWTBOVVkzTlRkR05qTXlRamxETmpOQk5UYzVRVUV3UlRFeU56TTJRUSJ9.eyJpc3MiOiJodHRwczovL3RvcGNvZGVyLWRldi5hdXRoMC5jb20vIiwic3ViIjoiakdJZjJwZDNmNDRCMWpxdk9haTMwQklLVFphbllCZlVAY2xpZW50cyIsImF1ZCI6Imh0dHBzOi8vbTJtLnRvcGNvZGVyLWRldi5jb20vIiwiaWF0IjoxNjI1MDYxNTM2LCJleHAiOjE2MjUxNDc5MzYsImF6cCI6ImpHSWYycGQzZjQ0QjFqcXZPYWkzMEJJS1RaYW5ZQmZVIiwic2NvcGUiOiJ1cGRhdGU6dXNlcl9wcm9maWxlcyB3cml0ZTp1c2VyX3Byb2ZpbGVzIGNyZWF0ZTpjb25uZWN0X3Byb2plY3QgYWxsOmNoYWxsZW5nZXMgcmVhZDpjaGFsbGVuZ2VzIHdyaXRlOmNoYWxsZW5nZXMgYWxsOmdyb3VwcyB3cml0ZTpncm91cHMgcmVhZDpncm91cHMgdXBkYXRlOnN1Ym1pc3Npb24gcmVhZDpzdWJtaXNzaW9uIGRlbGV0ZTpzdWJtaXNzaW9uIGNyZWF0ZTpzdWJtaXNzaW9uIGFsbDpzdWJtaXNzaW9uIHVwZGF0ZTpyZXZpZXdfdHlwZSByZWFkOnJldmlld190eXBlIGRlbGV0ZTpyZXZpZXdfdHlwZSBhbGw6cmV2aWV3X3R5cGUgdXBkYXRlOnJldmlld19zdW1tYXRpb24gcmVhZDpyZXZpZXdfc3VtbWF0aW9uIGRlbGV0ZTpyZXZpZXdfc3VtbWF0aW9uIGNyZWF0ZTpyZXZpZXdfc3VtbWF0aW9uIGFsbDpyZXZpZXdfc3VtbWF0aW9uIHVwZGF0ZTpyZXZpZXcgcmVhZDpyZXZpZXcgZGVsZXRlOnJldmlldyBjcmVhdGU6cmV2aWV3IGFsbDpyZXZpZXcgcmVhZDpwcm9qZWN0IGFsbDpjb25uZWN0X3Byb2plY3QgcmVhZDpidXNfdG9waWNzIHdyaXRlOmJ1c19hcGkgcmVhZDplbWFpbF90ZW1wbGF0ZXMgcmVhZDp1c2VyX3Byb2ZpbGVzIHJlYWQ6cm9sZXMgcmVhZDpwcm9qZWN0LXVzZXIgcmVhZDpwcm9qZWN0LXBlcm1pc3Npb24gcmVhZDpyZXNvdXJjZXMgd3JpdGU6cmVzb3VyY2VzIGRlbGV0ZTpyZXNvdXJjZXMgdXBkYXRlOnJlc291cmNlcyBhbGw6cmVzb3VyY2VzIHJlYWQ6dGVybXMgYWxsOnRlcm1zIGFsbDpwcm9qZWN0cyByZWFkOnByb2plY3RzIGFsbDpzY2hlZHVsZXMgcmVhZDpzY2hlZHVsZXMgY3JlYXRlOnNjaGVkdWxlcyB1cGRhdGU6c2NoZWR1bGVzIGRlbGV0ZTpzY2hlZHVsZXMgcmVhZDpwcm9qZWN0LWJpbGxpbmctYWNjb3VudC1kZXRhaWxzIiwiZ3R5IjoiY2xpZW50LWNyZWRlbnRpYWxzIn0.SqkSb8F6Te0b1ypDdh4__LfW9-b3N9KlgOZ5rrlXR3ZTDEAt4ENoajOJIG4xxIwGnKF8djMS8mk1EgW2e7bGKj1ZWdpSK5gANmLgQFlw_51essK_u8LYS_WvL7IFC4WGBEvh0zMtDvqRK3LUI4ijW48IfKRMSKodXUpkz5XZ5Pw1AQNcekML6Y56Aei488uGccJH5a4eEQxXk6eikwSjg6x2d1NxAdOm6NCos7qaCpgF_KpdcMEIb9Tfc0W6T0nf2FnR_MMzdlu_5BusaSAiWrpzt5eL2ueDf4U2Yvu8X_dyqxKgL9I13FfhaU6F3ZuTMbYHS8uOPw56t1Eq48jmLg", + "key": "M2M_TOKEN" + }, + { + "type": "any", + "value": "cf430147-674b-4efa-9546-0873edfb8923", + "key": "COPILOT_RESOURCE_ROLE_ID" + }, + { + "type": "any", + "value": "", + "key": "OBSERVER_RESOURCE_ROLE_ID" + }, + { + "type": "any", + "value": "", + "key": "SUBMITTER_RESOURCE_ROLE_ID" + }, + { + "type": "any", + "value": "", + "key": "REVIEWER_RESOURCE_ROLE_ID" + }, + { + "type": "any", + "value": "fe6d0a58-ce7d-4521-8501-b8132b1c0392", + "key": "TEST_CHALLENGE_ID1" + }, + { + "type": "any", + "value": "fe6d0a58-ce7d-4521-8501-b8132b1c0393", + "key": "TEST_CHALLENGE_ID2" + }, + { + "type": "any", + "value": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "key": "PHASE_ID" + }, + { + "type": "any", + "value": "c744c91d-f4e7-4ffa-9342-389e079c8d95", + "key": "DEPENDENCY_ID_1" + }, + { + "type": "any", + "value": "91991730-bb35-4fe8-8dec-06a51f97ec24", + "key": "DEPENDENCY_ID_2" + }, + { + "type": "any", + "value": "e84fa230-c70b-4c96-a923-bc867bb2bb25", + "key": "COPILOT_RESOURCE_ROLE_ID_0" + }, + { + "type": "any", + "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJDb25uZWN0IENvcGlsb3QiLCJjb3BpbG90IiwiVG9wY29kZXIgVXNlciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoiVENDb25uQ29waWxvdCIsImV4cCI6MTYyNTA2MjE0MiwidXNlcklkIjoiNDAxNTg5OTQiLCJpYXQiOjE2MjUwNjE1NDIsImVtYWlsIjoidG9wY29kZXJjb25uZWN0K0NvcGlsb3RAZ21haWwuY29tIiwianRpIjoiYWYxOWI2ZGItMTg2OC00NWZlLWFmMGQtNGJjZGRiYTAyMjEwIn0.oTcs59IPZtVrdfKqbj7Im2iLhMFlUSYnDiJ4UW-zAm8", + "key": "copilot_token" + }, + { + "type": "any", + "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJjb3BpbG90Il0sImlzcyI6Imh0dHBzOi8vYXBpLnRvcGNvZGVyLWRldi5jb20iLCJoYW5kbGUiOiJhcmdvbGl0ZSIsImV4cCI6MTYyNTA2MjE0NSwidXNlcklkIjoiMjg3NjE0IiwiaWF0IjoxNjI1MDYxNTQ1LCJlbWFpbCI6ImVtYWlsQGRvbWFpbi5jb20ueiIsImp0aSI6IjhiN2EyYmZlLTMwN2MtNDllMy05Y2VlLWRlZWE2MjM0YmY1YSJ9.Sfb5377JM7MiE-pn4Z0Y21pz1UP0gOa2mweiiMOlkwg", + "key": "user_token" + }, + { + "type": "any", + "value": { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "mess", + "CHALLENGE_ID": "11111111-ce7d-4521-8501-b8132b1c0391", + "httpCode": 404, + "message": "Challenge of id 11111111-ce7d-4521-8501-b8132b1c0391 is not found." + }, + "key": "0" + }, + { + "type": "any", + "value": { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "mess", + "COPILOT_RESOURCE_ROLE_ID": "11111111-ce7d-4521-8501-b8132b1c0391", + "httpCode": 400, + "message": "No resource role found with id: 11111111-ce7d-4521-8501-b8132b1c0391." + }, + "key": "1" + }, + { + "type": "any", + "value": { + "required_field_1": "challengeId_not_provided", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "mess", + "httpCode": 400, + "message": "\"challengeId\" is required" + }, + "key": "2" + }, + { + "type": "any", + "value": { + "required_field_1": "challengeId", + "required_field_2": "memberHandle_not_provided", + "required_field_3": "roleId", + "memberHandle": "mess", + "httpCode": 400, + "message": "\"memberHandle\" is required" + }, + "key": "3" + }, + { + "type": "any", + "value": { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId_not_provided", + "memberHandle": "mess", + "httpCode": 400, + "message": "\"roleId\" is required" + }, + "key": "4" + }, + { + "type": "any", + "value": { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "CHALLENGE_ID": "", + "memberHandle": "mess", + "httpCode": 400, + "message": "\"challengeId\" is not allowed to be empty" + }, + "key": "5" + }, + { + "type": "any", + "value": { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "", + "httpCode": 400, + "message": "\"memberHandle\" is not allowed to be empty" + }, + "key": "6" + }, + { + "type": "any", + "value": "43a30cd9-07b0-467c-82c9-f0457c5e7819", + "key": "DEPENDENCY_ID_3" + }, + { + "type": "any", + "value": "91991730-bb35-4fe8-8dec-06a51f97ec24", + "key": "DEPENDENCY_ID_4" + }, + { + "type": "any", + "value": { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "COPILOT_RESOURCE_ROLE_ID": "", + "memberHandle": "mess", + "httpCode": 400, + "message": "\"roleId\" is not allowed to be empty" + }, + "key": "7" + }, + { + "type": "any", + "value": { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": 1, + "perPage": 10, + "memberId": "", + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"memberId\" is not allowed to be empty" + }, + "key": "8" + }, + { + "type": "any", + "value": { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"memberHandle\" is not allowed to be empty" + }, + "key": "9" + }, + { + "type": "any", + "value": { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"sortBy\" is not allowed to be empty" + }, + "key": "10" + }, + { + "type": "any", + "value": { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberId", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"sortBy\" must be one of [memberHandle, created]" + }, + "key": "11" + }, + { + "type": "any", + "value": { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "", + "httpCode": 400, + "message": "\"sortOrder\" is not allowed to be empty" + }, + "key": "12" + }, + { + "type": "any", + "value": { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "invalid", + "httpCode": 400, + "message": "\"sortOrder\" must be one of [desc, asc]" + }, + "key": "13" + }, + { + "type": "any", + "value": { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "CHALLENGE_ID": "123", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"challengeId\" must be a valid GUID" + }, + "key": "14" + }, + { + "type": "any", + "value": { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "CHALLENGE_ID": "11111111-ce7d-4521-8501-b8132b1c0391", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 404, + "message": "Challenge ID 11111111-ce7d-4521-8501-b8132b1c0391 not found" + }, + "key": "15" + }, + { + "type": "any", + "value": { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "COPILOT_RESOURCE_ROLE_ID": "", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"roleId\" is not allowed to be empty" + }, + "key": "16" + }, + { + "type": "any", + "value": { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "COPILOT_RESOURCE_ROLE_ID": "123", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"roleId\" must be a valid GUID" + }, + "key": "17" + } + ], + "_postman_variable_scope": "environment", + "_postman_exported_at": "2021-06-30T14:04:08.744Z", + "_postman_exported_using": "Newman/5.2.4" +} \ No newline at end of file diff --git a/test/postman/testData/resource-role-phase-dependency/create-dependency-with-invalid-data.json b/test/postman/testData/resource-role-phase-dependency/create-dependency-with-invalid-data.json new file mode 100644 index 0000000..22f8b78 --- /dev/null +++ b/test/postman/testData/resource-role-phase-dependency/create-dependency-with-invalid-data.json @@ -0,0 +1,59 @@ +[ + { + "required_field_1": "phaseId", + "required_field_2": "resourceRoleId", + "required_field_3": "phaseState", + "phaseId": "", + "COPILOT_RESOURCE_ROLE_ID": "", + "phaseState": true, + "httpCode": 400, + "message": "\"phaseId\" is not allowed to be empty" + }, + { + "required_field_1": "phaseId", + "required_field_2": "resourceRoleId", + "required_field_3": "phaseState", + "phaseId": "not_guid", + "phaseState": true, + "httpCode": 400, + "message": "\"phaseId\" must be a valid GUID" + }, + { + "required_field_1": "phaseIdNotProvided", + "required_field_2": "resourceRoleId", + "required_field_3": "phaseState", + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "phaseState": true, + "httpCode": 400, + "message": "\"phaseId\" is required" + }, + { + "required_field_1": "phaseId", + "required_field_2": "resourceRoleId", + "required_field_3": "phaseStateNotProvided", + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "phaseState": true, + "httpCode": 400, + "message": "\"phaseState\" is required" + }, + { + "required_field_1": "phaseId", + "required_field_2": "resourceRoleId", + "required_field_3": "phaseState", + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "COPILOT_RESOURCE_ROLE_ID": "not a guid", + "phaseState": true, + "httpCode": 400, + "message": "\"resourceRoleId\" must be a valid GUID" + }, + { + "required_field_1": "phaseId", + "required_field_2": "resourceRoleId", + "required_field_3": "phaseState", + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "COPILOT_RESOURCE_ROLE_ID": "", + "phaseState": true, + "httpCode": 400, + "message": "\"resourceRoleId\" is not allowed to be empty" + } +] \ No newline at end of file diff --git a/test/postman/testData/resource-role-phase-dependency/create-dependency-with-invalid-tokens.json b/test/postman/testData/resource-role-phase-dependency/create-dependency-with-invalid-tokens.json new file mode 100644 index 0000000..3f9931d --- /dev/null +++ b/test/postman/testData/resource-role-phase-dependency/create-dependency-with-invalid-tokens.json @@ -0,0 +1,27 @@ +[ + { + "jwtToken": "Bearer invalid", + "httpCode": 401, + "message": "Invalid Token." + }, + { + "jwtToken": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiQ29ubmVjdCBTdXBwb3J0IiwiYWRtaW5pc3RyYXRvciIsInRlc3RSb2xlIiwiYWFhIiwidG9ueV90ZXN0XzEiLCJDb25uZWN0IE1hbmFnZXIiLCJDb25uZWN0IEFkbWluIiwiY29waWxvdCIsIkNvbm5lY3QgQ29waWxvdCBNYW5hZ2VyIl0sImlzcyI6Imh0dHBzOi8vYXBpLnRvcGNvZGVyLWRldi5jb20iLCJoYW5kbGUiOiJUb255SiIsImV4cCI6MTU1MTA2MzIxMSwidXNlcklkIjoiODU0Nzg5OSIsImlhdCI6MTU1MTA1MzIxMSwiZW1haWwiOiJ0amVmdHMrZml4QHRvcGNvZGVyLmNvbSIsImp0aSI6ImY5NGQxZTI2LTNkMGUtNDZjYS04MTE1LTg3NTQ1NDRhMDhmMSJ9.97-pjuSGGqDAqK2FG2yi_3nmzB7ZMXQwtG0bi8_PlKk", + "httpCode": 401, + "message": "Failed to authenticate token." + }, + { + "jwtToken": "Bearer {{copilot_token}}", + "httpCode": 403, + "message": "You are not allowed to perform this action!" + }, + { + "jwtToken": "Bearer {{user_token}}", + "httpCode": 403, + "message": "You are not allowed to perform this action!" + }, + { + "jwtToken": "", + "httpCode": 401, + "message": "No token provided." + } +] diff --git a/test/postman/testData/resource-role-phase-dependency/create-dependency.json b/test/postman/testData/resource-role-phase-dependency/create-dependency.json new file mode 100644 index 0000000..4469b8f --- /dev/null +++ b/test/postman/testData/resource-role-phase-dependency/create-dependency.json @@ -0,0 +1,14 @@ +[ + { + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "phaseState": true, + "httpCode": 200, + "idLabel": "DEPENDENCY_ID_3" + }, + { + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "phaseState": false, + "httpCode": 200, + "idLabel": "DEPENDENCY_ID_4" + } +] \ No newline at end of file diff --git a/test/postman/testData/resource-role-phase-dependency/delete-dependency-with-invalid-tokens.json b/test/postman/testData/resource-role-phase-dependency/delete-dependency-with-invalid-tokens.json new file mode 100644 index 0000000..75af002 --- /dev/null +++ b/test/postman/testData/resource-role-phase-dependency/delete-dependency-with-invalid-tokens.json @@ -0,0 +1,26 @@ +[ + { + "jwtToken": "Bearer invalid", + "httpCode": 401, + "message": "Invalid Token." + }, + { + "jwtToken": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiQ29ubmVjdCBTdXBwb3J0IiwiYWRtaW5pc3RyYXRvciIsInRlc3RSb2xlIiwiYWFhIiwidG9ueV90ZXN0XzEiLCJDb25uZWN0IE1hbmFnZXIiLCJDb25uZWN0IEFkbWluIiwiY29waWxvdCIsIkNvbm5lY3QgQ29waWxvdCBNYW5hZ2VyIl0sImlzcyI6Imh0dHBzOi8vYXBpLnRvcGNvZGVyLWRldi5jb20iLCJoYW5kbGUiOiJUb255SiIsImV4cCI6MTU1MTA2MzIxMSwidXNlcklkIjoiODU0Nzg5OSIsImlhdCI6MTU1MTA1MzIxMSwiZW1haWwiOiJ0amVmdHMrZml4QHRvcGNvZGVyLmNvbSIsImp0aSI6ImY5NGQxZTI2LTNkMGUtNDZjYS04MTE1LTg3NTQ1NDRhMDhmMSJ9.97-pjuSGGqDAqK2FG2yi_3nmzB7ZMXQwtG0bi8_PlKk", + "httpCode": 401, + "message": "Failed to authenticate token." + }, + { + "jwtToken": "Bearer {{copilot_token}}", + "httpCode": 403, + "message": "You are not allowed to perform this action!" + }, + { + "jwtToken": "Bearer {{user_token}}", + "httpCode": 403, + "message": "You are not allowed to perform this action!" + }, + { + "httpCode": 401, + "message": "No token provided." + } +] \ No newline at end of file diff --git a/test/postman/testData/resource-role-phase-dependency/get-dependencies-with-invalid-data.json b/test/postman/testData/resource-role-phase-dependency/get-dependencies-with-invalid-data.json new file mode 100644 index 0000000..b566912 --- /dev/null +++ b/test/postman/testData/resource-role-phase-dependency/get-dependencies-with-invalid-data.json @@ -0,0 +1,34 @@ +[ + { + "phaseId": "", + "phaseState": true, + "httpCode": 400, + "message": "\"phaseId\" is not allowed to be empty" + }, + { + "phaseId": "not_guid", + "phaseState": true, + "httpCode": 400, + "message": "\"phaseId\" must be a valid GUID" + }, + { + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "phaseState": 123, + "httpCode": 400, + "message": "\"phaseState\" must be a boolean" + }, + { + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "COPILOT_RESOURCE_ROLE_ID": "not a guid", + "phaseState": true, + "httpCode": 400, + "message": "\"resourceRoleId\" must be a valid GUID" + }, + { + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "COPILOT_RESOURCE_ROLE_ID": "", + "phaseState": true, + "httpCode": 400, + "message": "\"resourceRoleId\" is not allowed to be empty" + } +] \ No newline at end of file diff --git a/test/postman/testData/resource-role-phase-dependency/get-dependency-with-invalid-tokens.json b/test/postman/testData/resource-role-phase-dependency/get-dependency-with-invalid-tokens.json new file mode 100644 index 0000000..3f9931d --- /dev/null +++ b/test/postman/testData/resource-role-phase-dependency/get-dependency-with-invalid-tokens.json @@ -0,0 +1,27 @@ +[ + { + "jwtToken": "Bearer invalid", + "httpCode": 401, + "message": "Invalid Token." + }, + { + "jwtToken": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiQ29ubmVjdCBTdXBwb3J0IiwiYWRtaW5pc3RyYXRvciIsInRlc3RSb2xlIiwiYWFhIiwidG9ueV90ZXN0XzEiLCJDb25uZWN0IE1hbmFnZXIiLCJDb25uZWN0IEFkbWluIiwiY29waWxvdCIsIkNvbm5lY3QgQ29waWxvdCBNYW5hZ2VyIl0sImlzcyI6Imh0dHBzOi8vYXBpLnRvcGNvZGVyLWRldi5jb20iLCJoYW5kbGUiOiJUb255SiIsImV4cCI6MTU1MTA2MzIxMSwidXNlcklkIjoiODU0Nzg5OSIsImlhdCI6MTU1MTA1MzIxMSwiZW1haWwiOiJ0amVmdHMrZml4QHRvcGNvZGVyLmNvbSIsImp0aSI6ImY5NGQxZTI2LTNkMGUtNDZjYS04MTE1LTg3NTQ1NDRhMDhmMSJ9.97-pjuSGGqDAqK2FG2yi_3nmzB7ZMXQwtG0bi8_PlKk", + "httpCode": 401, + "message": "Failed to authenticate token." + }, + { + "jwtToken": "Bearer {{copilot_token}}", + "httpCode": 403, + "message": "You are not allowed to perform this action!" + }, + { + "jwtToken": "Bearer {{user_token}}", + "httpCode": 403, + "message": "You are not allowed to perform this action!" + }, + { + "jwtToken": "", + "httpCode": 401, + "message": "No token provided." + } +] diff --git a/test/postman/testData/resource-role-phase-dependency/update-dependency-with-invalid-data.json b/test/postman/testData/resource-role-phase-dependency/update-dependency-with-invalid-data.json new file mode 100644 index 0000000..22f8b78 --- /dev/null +++ b/test/postman/testData/resource-role-phase-dependency/update-dependency-with-invalid-data.json @@ -0,0 +1,59 @@ +[ + { + "required_field_1": "phaseId", + "required_field_2": "resourceRoleId", + "required_field_3": "phaseState", + "phaseId": "", + "COPILOT_RESOURCE_ROLE_ID": "", + "phaseState": true, + "httpCode": 400, + "message": "\"phaseId\" is not allowed to be empty" + }, + { + "required_field_1": "phaseId", + "required_field_2": "resourceRoleId", + "required_field_3": "phaseState", + "phaseId": "not_guid", + "phaseState": true, + "httpCode": 400, + "message": "\"phaseId\" must be a valid GUID" + }, + { + "required_field_1": "phaseIdNotProvided", + "required_field_2": "resourceRoleId", + "required_field_3": "phaseState", + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "phaseState": true, + "httpCode": 400, + "message": "\"phaseId\" is required" + }, + { + "required_field_1": "phaseId", + "required_field_2": "resourceRoleId", + "required_field_3": "phaseStateNotProvided", + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "phaseState": true, + "httpCode": 400, + "message": "\"phaseState\" is required" + }, + { + "required_field_1": "phaseId", + "required_field_2": "resourceRoleId", + "required_field_3": "phaseState", + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "COPILOT_RESOURCE_ROLE_ID": "not a guid", + "phaseState": true, + "httpCode": 400, + "message": "\"resourceRoleId\" must be a valid GUID" + }, + { + "required_field_1": "phaseId", + "required_field_2": "resourceRoleId", + "required_field_3": "phaseState", + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "COPILOT_RESOURCE_ROLE_ID": "", + "phaseState": true, + "httpCode": 400, + "message": "\"resourceRoleId\" is not allowed to be empty" + } +] \ No newline at end of file diff --git a/test/postman/testData/resource-role-phase-dependency/update-dependency-with-invalid-tokens.json b/test/postman/testData/resource-role-phase-dependency/update-dependency-with-invalid-tokens.json new file mode 100644 index 0000000..3f9931d --- /dev/null +++ b/test/postman/testData/resource-role-phase-dependency/update-dependency-with-invalid-tokens.json @@ -0,0 +1,27 @@ +[ + { + "jwtToken": "Bearer invalid", + "httpCode": 401, + "message": "Invalid Token." + }, + { + "jwtToken": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiQ29ubmVjdCBTdXBwb3J0IiwiYWRtaW5pc3RyYXRvciIsInRlc3RSb2xlIiwiYWFhIiwidG9ueV90ZXN0XzEiLCJDb25uZWN0IE1hbmFnZXIiLCJDb25uZWN0IEFkbWluIiwiY29waWxvdCIsIkNvbm5lY3QgQ29waWxvdCBNYW5hZ2VyIl0sImlzcyI6Imh0dHBzOi8vYXBpLnRvcGNvZGVyLWRldi5jb20iLCJoYW5kbGUiOiJUb255SiIsImV4cCI6MTU1MTA2MzIxMSwidXNlcklkIjoiODU0Nzg5OSIsImlhdCI6MTU1MTA1MzIxMSwiZW1haWwiOiJ0amVmdHMrZml4QHRvcGNvZGVyLmNvbSIsImp0aSI6ImY5NGQxZTI2LTNkMGUtNDZjYS04MTE1LTg3NTQ1NDRhMDhmMSJ9.97-pjuSGGqDAqK2FG2yi_3nmzB7ZMXQwtG0bi8_PlKk", + "httpCode": 401, + "message": "Failed to authenticate token." + }, + { + "jwtToken": "Bearer {{copilot_token}}", + "httpCode": 403, + "message": "You are not allowed to perform this action!" + }, + { + "jwtToken": "Bearer {{user_token}}", + "httpCode": 403, + "message": "You are not allowed to perform this action!" + }, + { + "jwtToken": "", + "httpCode": 401, + "message": "No token provided." + } +] diff --git a/test/postman/testData/resource-role-phase-dependency/update-dependency.json b/test/postman/testData/resource-role-phase-dependency/update-dependency.json new file mode 100644 index 0000000..6eea897 --- /dev/null +++ b/test/postman/testData/resource-role-phase-dependency/update-dependency.json @@ -0,0 +1,12 @@ +[ + { + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "phaseState": true, + "httpCode": 200 + }, + { + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "phaseState": false, + "httpCode": 200 + } +] \ No newline at end of file diff --git a/test/postman/testData/resource-role/create-resource-role-by-admin.json b/test/postman/testData/resource-role/create-resource-role-by-admin.json new file mode 100644 index 0000000..5e3123f --- /dev/null +++ b/test/postman/testData/resource-role/create-resource-role-by-admin.json @@ -0,0 +1,58 @@ +[ + { + "name": "POSTMANE2E-co-pilot", + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-Observer", + "fullReadAccess": true, + "fullWriteAccess": true, + "isActive": false, + "selfObtainable": false, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-submitter", + "fullReadAccess": true, + "fullWriteAccess": true, + "isActive": true, + "selfObtainable": true, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-reviewer", + "fullReadAccess": false, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false, + "httpCode": 200 + }, + { + "invalid": "invalid", + "fullReadAccess": true, + "fullWriteAccess": false, + "selfObtainable": false, + "isActive": 5, + "httpCode": 400 + }, + { + "name": "POSTMANE2E-failure-test", + "fullReadAccess": true, + "fullWriteAccess": false, + "selfObtainable": false, + "isActive": 5, + "httpCode": 400 + }, + { + "name": "POSTMANE2E-submitter", + "fullReadAccess": true, + "fullWriteAccess": true, + "isActive": true, + "selfObtainable": true, + "httpCode": 409 + } +] diff --git a/test/postman/testData/resource-role/create-resource-role-by-m2m.json b/test/postman/testData/resource-role/create-resource-role-by-m2m.json new file mode 100644 index 0000000..fcf816e --- /dev/null +++ b/test/postman/testData/resource-role/create-resource-role-by-m2m.json @@ -0,0 +1,55 @@ +[ + { + "name": "POSTMANE2E-co-pilot-m2m", + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-Observer-m2m", + "fullReadAccess": true, + "fullWriteAccess": true, + "isActive": false, + "selfObtainable": false, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-submitter-m2m", + "fullReadAccess": true, + "fullWriteAccess": true, + "isActive": true, + "selfObtainable": true, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-reviewer-m2m", + "fullReadAccess": false, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false, + "httpCode": 200 + }, + { + "invalid": "invalid-m2m", + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": true, + "httpCode": 400 + }, + { + "name": "POSTMANE2E-failure-test-m2m", + "fullReadAccess": true, + "fullWriteAccess": false, + "httpCode": 400 + }, + { + "name": "POSTMANE2E-submitter-m2m", + "fullReadAccess": true, + "fullWriteAccess": true, + "isActive": true, + "selfObtainable": true, + "httpCode": 409 + } +] \ No newline at end of file diff --git a/test/postman/testData/resource-role/create-resource-role-with-invalid-data.json b/test/postman/testData/resource-role/create-resource-role-with-invalid-data.json new file mode 100644 index 0000000..9a05fba --- /dev/null +++ b/test/postman/testData/resource-role/create-resource-role-with-invalid-data.json @@ -0,0 +1,79 @@ +[ + { + "name": "", + "fullReadAccess": true, + "fullWriteAccess": false, + "required_field_1": "isActive", + "required_field_2": "selfObtainable", + "isActive": true, + "selfObtainable": false, + "httpCode": 400, + "message": "\"name\" is not allowed to be empty" + }, + { + "name": "POSTMANE2E-co-pilot", + "fullReadAccess": true, + "fullWriteAccess": false, + "required_field_1": "isActive", + "required_field_2": "selfObtainableNotProvided", + "isActive": true, + "selfObtainable": false, + "httpCode": 400, + "message": "\"selfObtainable\" is required" + }, + { + "name": "POSTMANE2E-co-pilot", + "fullReadAccess": true, + "fullWriteAccess": false, + "required_field_1": "isActiveNotProvided", + "required_field_2": "selfObtainable", + "isActive": true, + "selfObtainable": true, + "httpCode": 400, + "message": "\"isActive\" is required" + }, + { + "name": "POSTMANE2E-co-pilot", + "fullReadAccess": "123", + "fullWriteAccess": false, + "required_field_1": "isActive", + "required_field_2": "selfObtainable", + "isActive": true, + "selfObtainable": false, + "httpCode": 400, + "message": "\"fullReadAccess\" must be a boolean" + }, + { + "name": "POSTMANE2E-Observer", + "fullReadAccess": true, + "fullWriteAccess": "123", + "required_field_1": "isActive", + "required_field_2": "selfObtainable", + "isActive": false, + "selfObtainable": false, + "httpCode": 400, + "message": "\"fullWriteAccess\" must be a boolean" + }, + { + "name": "POSTMANE2E-submitter", + "fullReadAccess": true, + "fullWriteAccess": true, + "required_field_1": "isActive", + "required_field_2": "selfObtainable", + "isActive": "123", + "selfObtainable": true, + "httpCode": 400, + "message": "\"isActive\" must be a boolean" + }, + { + "name": "POSTMANE2E-reviewer", + "fullReadAccess": false, + "fullWriteAccess": false, + "required_field_1": "isActive", + "required_field_2": "selfObtainable", + "isActive": true, + "selfObtainable": "123", + "httpCode": 400, + "message": "\"selfObtainable\" must be a boolean" + } +] \ No newline at end of file diff --git a/test/postman/testData/resource-role/create-resource-role-with-invalid-tokens.json b/test/postman/testData/resource-role/create-resource-role-with-invalid-tokens.json new file mode 100644 index 0000000..3f9931d --- /dev/null +++ b/test/postman/testData/resource-role/create-resource-role-with-invalid-tokens.json @@ -0,0 +1,27 @@ +[ + { + "jwtToken": "Bearer invalid", + "httpCode": 401, + "message": "Invalid Token." + }, + { + "jwtToken": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiQ29ubmVjdCBTdXBwb3J0IiwiYWRtaW5pc3RyYXRvciIsInRlc3RSb2xlIiwiYWFhIiwidG9ueV90ZXN0XzEiLCJDb25uZWN0IE1hbmFnZXIiLCJDb25uZWN0IEFkbWluIiwiY29waWxvdCIsIkNvbm5lY3QgQ29waWxvdCBNYW5hZ2VyIl0sImlzcyI6Imh0dHBzOi8vYXBpLnRvcGNvZGVyLWRldi5jb20iLCJoYW5kbGUiOiJUb255SiIsImV4cCI6MTU1MTA2MzIxMSwidXNlcklkIjoiODU0Nzg5OSIsImlhdCI6MTU1MTA1MzIxMSwiZW1haWwiOiJ0amVmdHMrZml4QHRvcGNvZGVyLmNvbSIsImp0aSI6ImY5NGQxZTI2LTNkMGUtNDZjYS04MTE1LTg3NTQ1NDRhMDhmMSJ9.97-pjuSGGqDAqK2FG2yi_3nmzB7ZMXQwtG0bi8_PlKk", + "httpCode": 401, + "message": "Failed to authenticate token." + }, + { + "jwtToken": "Bearer {{copilot_token}}", + "httpCode": 403, + "message": "You are not allowed to perform this action!" + }, + { + "jwtToken": "Bearer {{user_token}}", + "httpCode": 403, + "message": "You are not allowed to perform this action!" + }, + { + "jwtToken": "", + "httpCode": 401, + "message": "No token provided." + } +] diff --git a/test/postman/testData/resource-role/get-resource-role-with-invalid-data.json b/test/postman/testData/resource-role/get-resource-role-with-invalid-data.json new file mode 100644 index 0000000..00181e7 --- /dev/null +++ b/test/postman/testData/resource-role/get-resource-role-with-invalid-data.json @@ -0,0 +1,79 @@ +[ + { + "name": "", + "legacyId": 1, + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false, + "invalid": "", + "httpCode": 400, + "message": "\"name\" is not allowed to be empty" + }, + { + "name": "POSTMANE2E-test-copilot", + "legacyId": "", + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false, + "invalid": "", + "httpCode": 400, + "message": "\"legacyId\" must be a number" + }, + { + "name": "POSTMANE2E-test-copilot", + "legacyId": 1, + "fullReadAccess": 123, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false, + "invalid": "", + "httpCode": 400, + "message": "\"fullReadAccess\" must be a boolean" + }, + { + "name": "POSTMANE2E-test-copilot", + "legacyId": 1, + "fullReadAccess": true, + "fullWriteAccess": 123, + "isActive": true, + "selfObtainable": false, + "invalid": "", + "httpCode": 400, + "message": "\"fullWriteAccess\" must be a boolean" + }, + { + "name": "POSTMANE2E-test-copilot", + "legacyId": 1, + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": 123, + "selfObtainable": false, + "invalid": "", + "httpCode": 400, + "message": "\"isActive\" must be a boolean" + }, + { + "name": "POSTMANE2E-test-copilot", + "legacyId": 1, + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": 123, + "invalid": "", + "httpCode": 400, + "message": "\"selfObtainable\" must be a boolean" + }, + { + "name": "POSTMANE2E-test-copilot", + "legacyId": 1, + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false, + "invalid": "invalid", + "httpCode": 400, + "message": "\"invalid\" is not allowed" + } +] \ No newline at end of file diff --git a/test/postman/testData/resource-role/update-resource-role-by-admin.json b/test/postman/testData/resource-role/update-resource-role-by-admin.json new file mode 100644 index 0000000..acab0d5 --- /dev/null +++ b/test/postman/testData/resource-role/update-resource-role-by-admin.json @@ -0,0 +1,48 @@ +[ + { + "name": "POSTMANE2E-UPDATE_CO-PILOT-admin", + "fullReadAccess": true, + "fullWriteAccess": true, + "isActive": true, + "selfObtainable": false, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-UPDATE_OBSERVER-admin", + "fullReadAccess": true, + "fullWriteAccess": true, + "isActive": false, + "selfObtainable": false, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-UPDATE_SUBMITTER-admin", + "fullReadAccess": true, + "fullWriteAccess": true, + "isActive": true, + "selfObtainable": true, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-UPDATE_REVIEWER-admin", + "fullReadAccess": false, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-UPDATE_REVIEWER-admin1", + "isActive": true, + "selfObtainable": false, + "httpCode": 400 + }, + { + "name": "POSTMANE2E-SUBMITTER", + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false, + "httpCode": 409 + } +] \ No newline at end of file diff --git a/test/postman/testData/resource-role/update-resource-role-by-m2m.json b/test/postman/testData/resource-role/update-resource-role-by-m2m.json new file mode 100644 index 0000000..d251464 --- /dev/null +++ b/test/postman/testData/resource-role/update-resource-role-by-m2m.json @@ -0,0 +1,48 @@ +[ + { + "name": "POSTMANE2E-UPDATE_CO-PILOT-m2m", + "fullReadAccess": true, + "fullWriteAccess": true, + "isActive": true, + "selfObtainable": false, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-UPDATE_OBSERVER-m2m", + "fullReadAccess": true, + "fullWriteAccess": true, + "isActive": false, + "selfObtainable": false, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-UPDATE_SUBMITTER-m2m", + "fullReadAccess": true, + "fullWriteAccess": true, + "isActive": true, + "selfObtainable": true, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-UPDATE_REVIEWER-m2m", + "fullReadAccess": false, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-UPDATE_REVIEWER-m2m1", + "isActive": true, + "selfObtainable": false, + "httpCode": 400 + }, + { + "name": "POSTMANE2E-SUBMITTER", + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false, + "httpCode": 409 + } +] \ No newline at end of file diff --git a/test/postman/testData/resource-role/update-resource-role-with-invalid-data.json b/test/postman/testData/resource-role/update-resource-role-with-invalid-data.json new file mode 100644 index 0000000..ab0c78b --- /dev/null +++ b/test/postman/testData/resource-role/update-resource-role-with-invalid-data.json @@ -0,0 +1,79 @@ +[ + { + "name": "", + "fullReadAccess": true, + "fullWriteAccess": false, + "required_field_1": "isActive", + "required_field_2": "selfObtainable", + "isActive": true, + "selfObtainable": false, + "httpCode": 400, + "message": "\"name\" is not allowed to be empty" + }, + { + "name": "POSTMANE2E-update-co-pilot", + "fullReadAccess": true, + "fullWriteAccess": false, + "required_field_1": "isActive", + "required_field_2": "selfObtainableNotProvided", + "isActive": true, + "selfObtainable": false, + "httpCode": 400, + "message": "\"selfObtainable\" is required" + }, + { + "name": "POSTMANE2E-update-co-pilot", + "fullReadAccess": true, + "fullWriteAccess": false, + "required_field_1": "isActiveNotProvided", + "required_field_2": "selfObtainable", + "isActive": true, + "selfObtainable": true, + "httpCode": 400, + "message": "\"isActive\" is required" + }, + { + "name": "POSTMANE2E-update-co-pilot", + "fullReadAccess": "123", + "fullWriteAccess": false, + "required_field_1": "isActive", + "required_field_2": "selfObtainable", + "isActive": true, + "selfObtainable": false, + "httpCode": 400, + "message": "\"fullReadAccess\" must be a boolean" + }, + { + "name": "POSTMANE2E-Observer", + "fullReadAccess": true, + "fullWriteAccess": "123", + "required_field_1": "isActive", + "required_field_2": "selfObtainable", + "isActive": false, + "selfObtainable": false, + "httpCode": 400, + "message": "\"fullWriteAccess\" must be a boolean" + }, + { + "name": "POSTMANE2E-update-submitter", + "fullReadAccess": true, + "fullWriteAccess": true, + "required_field_1": "isActive", + "required_field_2": "selfObtainable", + "isActive": "123", + "selfObtainable": true, + "httpCode": 400, + "message": "\"isActive\" must be a boolean" + }, + { + "name": "POSTMANE2E-update-reviewer", + "fullReadAccess": false, + "fullWriteAccess": false, + "required_field_1": "isActive", + "required_field_2": "selfObtainable", + "isActive": true, + "selfObtainable": "123", + "httpCode": 400, + "message": "\"selfObtainable\" must be a boolean" + } +] \ No newline at end of file diff --git a/test/postman/testData/resource-role/update-resource-role-with-invalid-tokens.json b/test/postman/testData/resource-role/update-resource-role-with-invalid-tokens.json new file mode 100644 index 0000000..3f9931d --- /dev/null +++ b/test/postman/testData/resource-role/update-resource-role-with-invalid-tokens.json @@ -0,0 +1,27 @@ +[ + { + "jwtToken": "Bearer invalid", + "httpCode": 401, + "message": "Invalid Token." + }, + { + "jwtToken": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiQ29ubmVjdCBTdXBwb3J0IiwiYWRtaW5pc3RyYXRvciIsInRlc3RSb2xlIiwiYWFhIiwidG9ueV90ZXN0XzEiLCJDb25uZWN0IE1hbmFnZXIiLCJDb25uZWN0IEFkbWluIiwiY29waWxvdCIsIkNvbm5lY3QgQ29waWxvdCBNYW5hZ2VyIl0sImlzcyI6Imh0dHBzOi8vYXBpLnRvcGNvZGVyLWRldi5jb20iLCJoYW5kbGUiOiJUb255SiIsImV4cCI6MTU1MTA2MzIxMSwidXNlcklkIjoiODU0Nzg5OSIsImlhdCI6MTU1MTA1MzIxMSwiZW1haWwiOiJ0amVmdHMrZml4QHRvcGNvZGVyLmNvbSIsImp0aSI6ImY5NGQxZTI2LTNkMGUtNDZjYS04MTE1LTg3NTQ1NDRhMDhmMSJ9.97-pjuSGGqDAqK2FG2yi_3nmzB7ZMXQwtG0bi8_PlKk", + "httpCode": 401, + "message": "Failed to authenticate token." + }, + { + "jwtToken": "Bearer {{copilot_token}}", + "httpCode": 403, + "message": "You are not allowed to perform this action!" + }, + { + "jwtToken": "Bearer {{user_token}}", + "httpCode": 403, + "message": "You are not allowed to perform this action!" + }, + { + "jwtToken": "", + "httpCode": 401, + "message": "No token provided." + } +] diff --git a/test/postman/testData/resource/create-resource-by-admin.json b/test/postman/testData/resource/create-resource-by-admin.json new file mode 100644 index 0000000..41ab013 --- /dev/null +++ b/test/postman/testData/resource/create-resource-by-admin.json @@ -0,0 +1,18 @@ +[ + { + "memberHandle": "HoHoSKY", + "httpCode": 200 + }, + { + "memberHandle": "mess", + "httpCode": 200 + }, + { + "memberHandle": "x", + "httpCode": 200 + }, + { + "memberHandle": "TonyJ", + "httpCode": 200 + } +] \ No newline at end of file diff --git a/test/postman/testData/resource/create-resource-by-m2m.json b/test/postman/testData/resource/create-resource-by-m2m.json new file mode 100644 index 0000000..6c7dbc3 --- /dev/null +++ b/test/postman/testData/resource/create-resource-by-m2m.json @@ -0,0 +1,18 @@ +[ + { + "memberHandle": "iamtong", + "httpCode": 200 + }, + { + "memberHandle": "jack", + "httpCode": 200 + }, + { + "memberHandle": "onsky", + "httpCode": 200 + }, + { + "memberHandle": "ghostar", + "httpCode": 200 + } +] \ No newline at end of file diff --git a/test/postman/testData/resource/create-resource-with-invalid-data.json b/test/postman/testData/resource/create-resource-with-invalid-data.json new file mode 100644 index 0000000..49ec7f7 --- /dev/null +++ b/test/postman/testData/resource/create-resource-with-invalid-data.json @@ -0,0 +1,104 @@ +[ + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "heffan", + "CHALLENGE_ID": "", + "httpCode": 400, + "message": "\"challengeId\" is not allowed to be empty" + }, + { + "required_field_1": "challengeId_not_provided", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "heffan", + "httpCode": 400, + "message": "\"challengeId\" is required" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "heffan", + "CHALLENGE_ID": "123", + "httpCode": 400, + "message": "\"challengeId\" must be a valid GUID" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "heffan", + "CHALLENGE_ID": "11111111-ce7d-4521-8501-b8132b1c0391", + "httpCode": 404, + "message": "Challenge of id 11111111-ce7d-4521-8501-b8132b1c0391 is not found." + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "", + "httpCode": 400, + "message": "\"memberHandle\" is not allowed to be empty" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle_not_provided", + "required_field_3": "roleId", + "memberHandle": "heffan", + "httpCode": 400, + "message": "\"memberHandle\" is required" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "some_not_exist_handle", + "httpCode": 400, + "message": "User with handle: some_not_exist_handle doesn't exist" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "heffan", + "COPILOT_RESOURCE_ROLE_ID": "", + "httpCode": 400, + "message": "\"roleId\" is not allowed to be empty" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId_not_provided", + "memberHandle": "heffan", + "httpCode": 400, + "message": "\"roleId\" is required" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "heffan", + "COPILOT_RESOURCE_ROLE_ID": "123", + "httpCode": 400, + "message": "\"roleId\" must be a valid GUID" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "heffan", + "COPILOT_RESOURCE_ROLE_ID": "11111111-ce7d-4521-8501-b8132b1c0771", + "httpCode": 400, + "message": "No resource role found with id: 11111111-ce7d-4521-8501-b8132b1c0771." + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "ghostar", + "httpCode": 409, + "message": "User ghostar already has resource with roleId:" + } +] diff --git a/test/postman/testData/resource/create-resource-with-invalid-tokens.json b/test/postman/testData/resource/create-resource-with-invalid-tokens.json new file mode 100644 index 0000000..0628a63 --- /dev/null +++ b/test/postman/testData/resource/create-resource-with-invalid-tokens.json @@ -0,0 +1,22 @@ +[ + { + "jwtToken": "Bearer invalid", + "httpCode": 401, + "message": "Invalid Token." + }, + { + "jwtToken": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiQ29ubmVjdCBTdXBwb3J0IiwiYWRtaW5pc3RyYXRvciIsInRlc3RSb2xlIiwiYWFhIiwidG9ueV90ZXN0XzEiLCJDb25uZWN0IE1hbmFnZXIiLCJDb25uZWN0IEFkbWluIiwiY29waWxvdCIsIkNvbm5lY3QgQ29waWxvdCBNYW5hZ2VyIl0sImlzcyI6Imh0dHBzOi8vYXBpLnRvcGNvZGVyLWRldi5jb20iLCJoYW5kbGUiOiJUb255SiIsImV4cCI6MTU1MTA2MzIxMSwidXNlcklkIjoiODU0Nzg5OSIsImlhdCI6MTU1MTA1MzIxMSwiZW1haWwiOiJ0amVmdHMrZml4QHRvcGNvZGVyLmNvbSIsImp0aSI6ImY5NGQxZTI2LTNkMGUtNDZjYS04MTE1LTg3NTQ1NDRhMDhmMSJ9.97-pjuSGGqDAqK2FG2yi_3nmzB7ZMXQwtG0bi8_PlKk", + "httpCode": 401, + "message": "Failed to authenticate token." + }, + { + "jwtToken": "Bearer {{user_token}}", + "httpCode": 403, + "message": "Only M2M, admin or user with full access role can perform this action" + }, + { + "jwtToken": "", + "httpCode": 401, + "message": "No token provided." + } +] diff --git a/test/postman/testData/resource/delete-resource-with-invalid-parameter.json b/test/postman/testData/resource/delete-resource-with-invalid-parameter.json new file mode 100644 index 0000000..dd92fce --- /dev/null +++ b/test/postman/testData/resource/delete-resource-with-invalid-parameter.json @@ -0,0 +1,70 @@ +[ + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "mess", + "CHALLENGE_ID": "11111111-ce7d-4521-8501-b8132b1c0391", + "httpCode": 404, + "message": "Challenge of id 11111111-ce7d-4521-8501-b8132b1c0391 is not found." + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "mess", + "COPILOT_RESOURCE_ROLE_ID": "11111111-ce7d-4521-8501-b8132b1c0391", + "httpCode": 400, + "message": "No resource role found with id: 11111111-ce7d-4521-8501-b8132b1c0391." + }, + { + "required_field_1": "challengeId_not_provided", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "mess", + "httpCode": 400, + "message": "\"challengeId\" is required" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle_not_provided", + "required_field_3": "roleId", + "memberHandle": "mess", + "httpCode": 400, + "message": "\"memberHandle\" is required" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId_not_provided", + "memberHandle": "mess", + "httpCode": 400, + "message": "\"roleId\" is required" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "CHALLENGE_ID": "", + "memberHandle": "mess", + "httpCode": 400, + "message": "\"challengeId\" is not allowed to be empty" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "", + "httpCode": 400, + "message": "\"memberHandle\" is not allowed to be empty" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "COPILOT_RESOURCE_ROLE_ID": "", + "memberHandle": "mess", + "httpCode": 400, + "message": "\"roleId\" is not allowed to be empty" + } +] diff --git a/test/postman/testData/resource/delete-resource-with-invalid-tokens.json b/test/postman/testData/resource/delete-resource-with-invalid-tokens.json new file mode 100644 index 0000000..32f548a --- /dev/null +++ b/test/postman/testData/resource/delete-resource-with-invalid-tokens.json @@ -0,0 +1,14 @@ +[ + { + "jwtToken": "Bearer invalid", + "httpCode": 401 + }, + { + "jwtToken": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiQ29ubmVjdCBTdXBwb3J0IiwiYWRtaW5pc3RyYXRvciIsInRlc3RSb2xlIiwiYWFhIiwidG9ueV90ZXN0XzEiLCJDb25uZWN0IE1hbmFnZXIiLCJDb25uZWN0IEFkbWluIiwiY29waWxvdCIsIkNvbm5lY3QgQ29waWxvdCBNYW5hZ2VyIl0sImlzcyI6Imh0dHBzOi8vYXBpLnRvcGNvZGVyLWRldi5jb20iLCJoYW5kbGUiOiJUb255SiIsImV4cCI6MTU1MTA2MzIxMSwidXNlcklkIjoiODU0Nzg5OSIsImlhdCI6MTU1MTA1MzIxMSwiZW1haWwiOiJ0amVmdHMrZml4QHRvcGNvZGVyLmNvbSIsImp0aSI6ImY5NGQxZTI2LTNkMGUtNDZjYS04MTE1LTg3NTQ1NDRhMDhmMSJ9.97-pjuSGGqDAqK2FG2yi_3nmzB7ZMXQwtG0bi8_PlKk", + "httpCode": 401 + }, + { + "jwtToken": "", + "httpCode": 401 + } +] diff --git a/test/postman/testData/resource/get-resources-by-member-with-different-users.json b/test/postman/testData/resource/get-resources-by-member-with-different-users.json new file mode 100644 index 0000000..a00e295 --- /dev/null +++ b/test/postman/testData/resource/get-resources-by-member-with-different-users.json @@ -0,0 +1,18 @@ +[ + { + "jwtToken": "Bearer {{user_token}}", + "memberId": "16096823" + }, + { + "jwtToken": "Bearer {{copilot_token}}", + "memberId": "16096823" + }, + { + "jwtToken": "Bearer {{admin_token}}", + "memberId": "16096823" + }, + { + "jwtToken": "Bearer {{M2M_TOKEN}}", + "memberId": "not_exist_user" + } +] \ No newline at end of file diff --git a/test/postman/testData/resource/get-resources-by-member-with-invalid-parameter.json b/test/postman/testData/resource/get-resources-by-member-with-invalid-parameter.json new file mode 100644 index 0000000..9e4420d --- /dev/null +++ b/test/postman/testData/resource/get-resources-by-member-with-invalid-parameter.json @@ -0,0 +1,19 @@ +[ + { + "COPILOT_RESOURCE_ROLE_ID": "", + "invalid": "", + "httpCode": 400, + "message": "\"resourceRoleId\" is not allowed to be empty" + }, + { + "COPILOT_RESOURCE_ROLE_ID": "11111", + "invalid": "", + "httpCode": 400, + "message": "\"resourceRoleId\" must be a valid GUID" + }, + { + "invalid": "invalid", + "httpCode": 400, + "message": "\"invalid\" is not allowed" + } +] \ No newline at end of file diff --git a/test/postman/testData/resource/get-resources-by-member-with-invalid-tokens.json b/test/postman/testData/resource/get-resources-by-member-with-invalid-tokens.json new file mode 100644 index 0000000..d584dde --- /dev/null +++ b/test/postman/testData/resource/get-resources-by-member-with-invalid-tokens.json @@ -0,0 +1,19 @@ +[ + { + "jwtToken": "Bearer invalid", + "memberId": "16096823", + "httpCode": 401, + "message": "Invalid Token." + }, + { + "jwtToken": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiQ29ubmVjdCBTdXBwb3J0IiwiYWRtaW5pc3RyYXRvciIsInRlc3RSb2xlIiwiYWFhIiwidG9ueV90ZXN0XzEiLCJDb25uZWN0IE1hbmFnZXIiLCJDb25uZWN0IEFkbWluIiwiY29waWxvdCIsIkNvbm5lY3QgQ29waWxvdCBNYW5hZ2VyIl0sImlzcyI6Imh0dHBzOi8vYXBpLnRvcGNvZGVyLWRldi5jb20iLCJoYW5kbGUiOiJUb255SiIsImV4cCI6MTU1MTA2MzIxMSwidXNlcklkIjoiODU0Nzg5OSIsImlhdCI6MTU1MTA1MzIxMSwiZW1haWwiOiJ0amVmdHMrZml4QHRvcGNvZGVyLmNvbSIsImp0aSI6ImY5NGQxZTI2LTNkMGUtNDZjYS04MTE1LTg3NTQ1NDRhMDhmMSJ9.97-pjuSGGqDAqK2FG2yi_3nmzB7ZMXQwtG0bi8_PlKk", + "memberId": "16096823", + "httpCode": 401, + "message": "Failed to authenticate token." + }, + { + "memberId": "16096823", + "httpCode": 401, + "message": "No token provided." + } +] \ No newline at end of file diff --git a/test/postman/testData/resource/get-resources-by-member-with-resource-role.json b/test/postman/testData/resource/get-resources-by-member-with-resource-role.json new file mode 100644 index 0000000..cbc555d --- /dev/null +++ b/test/postman/testData/resource/get-resources-by-member-with-resource-role.json @@ -0,0 +1,14 @@ +[ + { + "memberId": "16096823" + }, + { + "memberId": "16096823" + }, + { + "memberId": "16096823" + }, + { + "memberId": "not_exist_user" + } +] \ No newline at end of file diff --git a/test/postman/testData/resource/get-resources-with-all-parameters.json b/test/postman/testData/resource/get-resources-with-all-parameters.json new file mode 100644 index 0000000..1c11ebe --- /dev/null +++ b/test/postman/testData/resource/get-resources-with-all-parameters.json @@ -0,0 +1,26 @@ +[ + { + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc" + }, + { + "page": 2, + "perPage": 4, + "memberId": 105878, + "memberHandle": "x", + "sortBy": "memberHandle", + "sortOrder": "desc" + }, + { + "page": 1, + "perPage": 10, + "memberId": 111036, + "memberHandle": "jack", + "sortBy": "memberHandle", + "sortOrder": "asc" + } +] \ No newline at end of file diff --git a/test/postman/testData/resource/get-resources-with-invalid-data.json b/test/postman/testData/resource/get-resources-with-invalid-data.json new file mode 100644 index 0000000..cf78f51 --- /dev/null +++ b/test/postman/testData/resource/get-resources-with-invalid-data.json @@ -0,0 +1,242 @@ +[ + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "CHALLENGE_ID": "", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"challengeId\" is not allowed to be empty" + }, + { + "required_field_1": "challengeId_not_provided", + "required_field_2": "memberId_not_provided", + "required_field_3": "memberHandle_not_provided", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "At least one of the following parameters is required: [challengeId, memberId, memberHandle]" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": -1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"page\" must be larger than or equal to 1" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": 0, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"page\" must be larger than or equal to 1" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": "", + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"page\" must be a number" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": 1, + "perPage": -1, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"perPage\" must be larger than or equal to 1" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": 1, + "perPage": 0, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "invalid": "", + "httpCode": 400, + "message": "\"perPage\" must be larger than or equal to 1" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": 1, + "perPage": "", + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"perPage\" must be a number" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": 1, + "perPage": 10, + "memberId": "", + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"memberId\" is not allowed to be empty" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"memberHandle\" is not allowed to be empty" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"sortBy\" is not allowed to be empty" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberId", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"sortBy\" must be one of [memberHandle, created]" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "", + "httpCode": 400, + "message": "\"sortOrder\" is not allowed to be empty" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "invalid", + "httpCode": 400, + "message": "\"sortOrder\" must be one of [desc, asc]" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "CHALLENGE_ID": "123", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"challengeId\" must be a valid GUID" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "CHALLENGE_ID": "11111111-ce7d-4521-8501-b8132b1c0391", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 404, + "message": "Challenge ID 11111111-ce7d-4521-8501-b8132b1c0391 not found" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "COPILOT_RESOURCE_ROLE_ID": "", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"roleId\" is not allowed to be empty" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "COPILOT_RESOURCE_ROLE_ID": "123", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"roleId\" must be a valid GUID" + } +] \ No newline at end of file diff --git a/test/postman/testData/resource/get-resources-with-required-parameter.json b/test/postman/testData/resource/get-resources-with-required-parameter.json new file mode 100644 index 0000000..7403d8a --- /dev/null +++ b/test/postman/testData/resource/get-resources-with-required-parameter.json @@ -0,0 +1,30 @@ +[ + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "memberId": 305384, + "memberHandle": "mess" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId_only_challengeId_provided", + "required_field_3": "memberHandle_only_challengeId_provided", + "memberId": 305384, + "memberHandle": "mess" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle_is_not_provided", + "memberId": 305384, + "memberHandle": "mess" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId_is_not_provided", + "required_field_3": "memberHandle", + "memberId": 305384, + "memberHandle": "mess" + } +] \ No newline at end of file diff --git a/test/unit/createResource.test.js b/test/unit/createResource.test.js index a24dc5b..26708d3 100644 --- a/test/unit/createResource.test.js +++ b/test/unit/createResource.test.js @@ -3,15 +3,23 @@ */ const _ = require('lodash') +const config = require('config') const should = require('should') +const { v4: uuid } = require('uuid') +const helper = require('../../src/common/helper') const service = require('../../src/services/ResourceService') const ResourceRolePhaseDependencyService = require('../../src/services/ResourceRolePhaseDependencyService') +const ResourceRoleService = require('../../src/services/ResourceRoleService') const { requestBody, user } = require('../common/testData') const { assertValidationError, assertError, assertResource, getRoleIds, clearDependencies } = require('../common/testHelper') const challengeId1 = 'fe6d0a58-ce7d-4521-8501-b8132b1c0391' const challengeId2 = 'fe6d0a58-ce7d-4521-8501-b8132b1c0392' const challengeId3 = 'fe6d0a58-ce7d-4521-8501-b8132b1c0393' +const phaseId1 = 'ad123e44-c6c4-4cb3-8c60-e0339e1eaa3e' +const phaseId2 = 'ad123e44-c6c4-4cb3-8c60-e0339e1eaa40' +const phaseId3 = 'ad123e44-c6c4-4cb3-8c60-e0339e1eaa41' +const phaseId4 = 'ad123e44-c6c4-4cb3-8c60-e0339e1eaa42' const challengeNotFoundId = '11111111-ce7d-4521-8501-b8132b1c0391' const resources = requestBody.resources @@ -33,199 +41,325 @@ module.exports = describe('Create resource', () => { dependency = records[0] }) - it('create resource - wrong phase state', async () => { - await ResourceRolePhaseDependencyService.updateDependency(dependency.id, { - phaseId: dependency.phaseId, - resourceRoleId: dependency.resourceRoleId, - phaseState: false + describe('create resource - wrong phase cases', async () => { + before(async () => { + await ResourceRoleService.updateResourceRole(copilotRoleId, { + name: 'co-pilot', + isActive: true, + selfObtainable: true + }) }) - try { - const entity = resources.createBody('HoHoSKY', copilotRoleId, challengeId1) - await service.createResource(user.admin, entity) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.name, 'BadRequestError') - assertError(err, `Phase ${dependency.phaseId} should not be open`) - } - }) - it('create resource by admin', async () => { - await ResourceRolePhaseDependencyService.updateDependency(dependency.id, { - phaseId: dependency.phaseId, - resourceRoleId: dependency.resourceRoleId, - phaseState: true + after(async () => { + await ResourceRoleService.updateResourceRole(copilotRoleId, { + name: 'co-pilot', + isActive: true, + selfObtainable: false + }) }) - const entity = resources.createBody('HoHoSKY', copilotRoleId, challengeId1) - const ret = await service.createResource(user.admin, entity) - should.equal(ret.roleId, entity.roleId) - should.equal(ret.memberHandle.toLowerCase(), entity.memberHandle.toLowerCase()) - await assertResource(ret.id, ret) - // remove the dependencies so that below tests will not have these limitations - await clearDependencies() - }) + it('create resource - wrong phase state 1', async () => { + await ResourceRolePhaseDependencyService.updateDependency(dependency.id, { + phaseId: dependency.phaseId, + resourceRoleId: dependency.resourceRoleId, + phaseState: false + }) + try { + const entity = resources.createBody('HoHoSKY', copilotRoleId, challengeId1) + await service.createResource(user.hohosky, entity) + throw new Error('should not throw error here') + } catch (err) { + should.equal(err.name, 'BadRequestError') + assertError(err, `Phase ${dependency.phaseId} should not be open`) + } + }) - it('create another resource for user hohosky', async () => { - const entity = resources.createBody('HoHoSKY', reviewerRoleId, challengeId1) - const ret = await service.createResource(user.admin, entity) - should.equal(ret.roleId, entity.roleId) - should.equal(ret.memberHandle.toLowerCase(), entity.memberHandle.toLowerCase()) - await assertResource(ret.id, ret) - }) + it('create resource - wrong phase state 2', async () => { + await ResourceRolePhaseDependencyService.updateDependency(dependency.id, { + phaseId: phaseId1, + resourceRoleId: dependency.resourceRoleId, + phaseState: true + }) + try { + const entity = resources.createBody('HoHoSKY', copilotRoleId, challengeId1) + await service.createResource(user.hohosky, entity) + throw new Error('should not throw error here') + } catch (err) { + should.equal(err.name, 'BadRequestError') + assertError(err, `Phase ${phaseId1} should be open`) + } + }) - it('create resource by user', async () => { - const entity = resources.createBody('denis', submitterRoleId, challengeId1) - const ret = await service.createResource(user.hohosky, entity) - should.equal(ret.roleId, entity.roleId) - should.equal(ret.memberHandle.toLowerCase(), entity.memberHandle.toLowerCase()) - await assertResource(ret.id, ret) - }) + it('create resource - wrong phase state 3', async () => { + await ResourceRolePhaseDependencyService.updateDependency(dependency.id, { + phaseId: phaseId2, + resourceRoleId: dependency.resourceRoleId, + phaseState: true + }) + try { + const entity = resources.createBody('HoHoSKY', copilotRoleId, challengeId1) + await service.createResource(user.hohosky, entity) + throw new Error('should not throw error here') + } catch (err) { + should.equal(err.name, 'BadRequestError') + assertError(err, `Phase ${phaseId2} should be open`) + } + }) - it('failure - create self obtainable resource for other user by normal user forbidden', async () => { - const entity = resources.createBody('lars2520', submitterRoleId, challengeId1) - try { - await service.createResource(user.denis, entity) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.name, 'ForbiddenError') - assertError(err, `Only M2M, admin or user with full access role can perform this action`) - } + it('create resource - wrong phase state 4', async () => { + await ResourceRolePhaseDependencyService.updateDependency(dependency.id, { + phaseId: phaseId3, + resourceRoleId: dependency.resourceRoleId, + phaseState: true + }) + try { + const entity = resources.createBody('HoHoSKY', copilotRoleId, challengeId1) + await service.createResource(user.hohosky, entity) + throw new Error('should not throw error here') + } catch (err) { + should.equal(err.name, 'BadRequestError') + assertError(err, `Phase ${phaseId3} should be open`) + } + }) }) - it('create self obtainable resource by user itself', async () => { - const entity = resources.createBody('lars2520', submitterRoleId, challengeId1) - const ret = await service.createResource(user.lars2520, entity) - should.equal(ret.roleId, entity.roleId) - should.equal(ret.memberHandle.toLowerCase(), entity.memberHandle.toLowerCase()) - await assertResource(ret.id, ret) - }) + describe('create resource - other cases', async () => { + it('create resource - task already assign', async () => { + const resourceId = uuid() + await helper.getOSClient().create({ + index: config.OS.OS_INDEX, + id: resourceId, + body: { + id: resourceId, + challengeId: challengeId2, + memberId: 16096823, + memberHandle: 'hohosky', + roleId: config.SUBMITTER_RESOURCE_ROLE_ID + }, + refresh: 'true' + }) + try { + const entity = resources.createBody('hohosky', config.SUBMITTER_RESOURCE_ROLE_ID, challengeId2) + await service.createResource(user.hohosky, entity) + throw new Error('should not throw error here') + } catch (err) { + should.equal(err.name, 'ConflictError') + assertError(err, 'The Task is already assigned') + } finally { + await helper.getOSClient().delete({ + index: config.OS.OS_INDEX, + id: resourceId, + refresh: 'true' + }) + } + }) - it('failure - create non self obtainable resource by normal user forbidden', async () => { - const entity = resources.createBody('lars2520', copilotRoleId, challengeId1) - try { - await service.createResource(user.lars2520, entity) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.name, 'ForbiddenError') - assertError(err, `Only M2M, admin or user with full access role can perform this action`) - } - }) + it('create resource by admin', async () => { + await ResourceRolePhaseDependencyService.updateDependency(dependency.id, { + phaseId: dependency.phaseId, + resourceRoleId: dependency.resourceRoleId, + phaseState: true + }) + const entity = resources.createBody('HoHoSKY', copilotRoleId, challengeId1) + const ret = await service.createResource(user.admin, entity) + should.equal(ret.roleId, entity.roleId) + should.equal(ret.memberHandle.toLowerCase(), entity.memberHandle.toLowerCase()) + await assertResource(ret.id, ret) + }) - it('create resource using m2m token', async () => { - const entity = resources.createBody('ghostar', submitterRoleId, challengeId1) - const ret = await service.createResource(user.m2m, entity) - should.equal(ret.roleId, entity.roleId) - should.equal(ret.memberHandle.toLowerCase(), entity.memberHandle.toLowerCase()) - await assertResource(ret.id, ret) - }) + it('failure - create duplicate resource 1', async () => { + const entity = resources.createBody('hohosky', copilotRoleId, challengeId1) + try { + await service.createResource(user.hohosky, entity) + throw new Error('should not throw error here') + } catch (err) { + should.equal(err.name, 'ConflictError') + assertError(err, `User hohosky already has resource with roleId: ${copilotRoleId} in challenge: ${challengeId1}`) + } + }) - it('create resource for user ghostar 1', async () => { - const entity = resources.createBody('ghostar', reviewerRoleId, challengeId2) - const ret = await service.createResource(user.m2m, entity) - should.equal(ret.roleId, entity.roleId) - should.equal(ret.memberHandle.toLowerCase(), entity.memberHandle.toLowerCase()) - await assertResource(ret.id, ret) - }) + it('failure - create duplicate resource 2', async () => { + await ResourceRolePhaseDependencyService.updateDependency(dependency.id, { + phaseId: phaseId4, + resourceRoleId: dependency.resourceRoleId, + phaseState: true + }) - it('create resource for user ghostar 2', async () => { - const entity = resources.createBody('ghostar', reviewerRoleId, challengeId3) - const ret = await service.createResource(user.m2m, entity) - should.equal(ret.roleId, entity.roleId) - should.equal(ret.memberHandle.toLowerCase(), entity.memberHandle.toLowerCase()) - await assertResource(ret.id, ret) - }) + const entity = resources.createBody('hohosky', copilotRoleId, challengeId1) + try { + await service.createResource(user.hohosky, entity) + throw new Error('should not throw error here') + } catch (err) { + should.equal(err.name, 'ConflictError') + assertError(err, `User hohosky already has resource with roleId: ${copilotRoleId} in challenge: ${challengeId1}`) + } - it('failure - create resource using inactive role', async () => { - const entity = resources.createBody('ghostar', observerRoleId, challengeId1) - try { - await service.createResource(user.m2m, entity) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.name, 'BadRequestError') - assertError(err, `Resource role with id: ${observerRoleId} is inactive, please use an active one.`) - } - }) + // remove the dependencies so that below tests will not have these limitations + await clearDependencies() + }) - it('failure - create resource using non-existed role', async () => { - const entity = resources.createBody('ghostar', challengeId1, challengeId1) - try { - await service.createResource(user.m2m, entity) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.name, 'BadRequestError') - assertError(err, `No resource role found with id: ${challengeId1}.`) - } - }) + it('create another resource for user hohosky', async () => { + const entity = resources.createBody('HoHoSKY', reviewerRoleId, challengeId1) + const ret = await service.createResource(user.admin, entity) + should.equal(ret.roleId, entity.roleId) + should.equal(ret.memberHandle.toLowerCase(), entity.memberHandle.toLowerCase()) + await assertResource(ret.id, ret) + }) - it(`failure - create resource member doesn't exist`, async () => { - const entity = resources.createBody('123abcx', observerRoleId, challengeId1) - try { - await service.createResource(user.m2m, entity) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.name, 'BadRequestError') - assertError(err, `User with handle: 123abcx doesn't exist`) - } - }) + it('create resource by user', async () => { + const entity = resources.createBody('denis', submitterRoleId, challengeId1) + const ret = await service.createResource(user.hohosky, entity) + should.equal(ret.roleId, entity.roleId) + should.equal(ret.memberHandle.toLowerCase(), entity.memberHandle.toLowerCase()) + await assertResource(ret.id, ret) + }) - let { stringFields, requiredFields, testBody } = resources + it('failure - create self obtainable resource for other user by normal user forbidden', async () => { + const entity = resources.createBody('lars2520', config.SUBMITTER_RESOURCE_ROLE_ID, challengeId2) + try { + await service.createResource(user.denis, entity) + throw new Error('should not throw error here') + } catch (err) { + should.equal(err.name, 'ForbiddenError') + assertError(err, `Only M2M, admin or user with full access role can perform this action`) + } + }) - it(`test invalid parameters, challengeId must be UUID`, async () => { - try { - let entity = _.cloneDeep(testBody) - entity.challengeId = 'invalid' - await service.createResource(user.m2m, entity) - throw new Error('should not throw error here') - } catch (err) { - assertValidationError(err, '"challengeId" must be a valid GUID') - } - }) + it('failure - create resource when user has not yet agreed terms', async () => { + const entity = resources.createBody('lars2520', config.SUBMITTER_RESOURCE_ROLE_ID, challengeId1) + try { + await service.createResource(user.admin, entity) + throw new Error('should not throw error here') + } catch (err) { + should.equal(err.name, 'ForbiddenError') + assertError(err, 'The user has not yet agreed to the following terms: [term_title]') + } + }) + + it('create self obtainable resource by user itself', async () => { + const entity = resources.createBody('lars2520', submitterRoleId, challengeId1) + const ret = await service.createResource(user.lars2520, entity) + should.equal(ret.roleId, entity.roleId) + should.equal(ret.memberHandle.toLowerCase(), entity.memberHandle.toLowerCase()) + await assertResource(ret.id, ret) + }) - for (const stringField of stringFields) { - it(`test invalid parameters, invalid string type field ${stringField}`, async () => { - let entity = _.cloneDeep(testBody) - _.set(entity, stringField, 123) + it('failure - create non self obtainable resource by normal user forbidden', async () => { + const entity = resources.createBody('lars2520', copilotRoleId, challengeId1) + try { + await service.createResource(user.lars2520, entity) + throw new Error('should not throw error here') + } catch (err) { + should.equal(err.name, 'ForbiddenError') + assertError(err, `Only M2M, admin or user with full access role can perform this action`) + } + }) + + it('create resource using m2m token', async () => { + const entity = resources.createBody('ghostar', submitterRoleId, challengeId1) + const ret = await service.createResource(user.m2m, entity) + should.equal(ret.roleId, entity.roleId) + should.equal(ret.memberHandle.toLowerCase(), entity.memberHandle.toLowerCase()) + await assertResource(ret.id, ret) + }) + + it('create resource for user ghostar 1', async () => { + const entity = resources.createBody('ghostar', reviewerRoleId, challengeId2) + const ret = await service.createResource(user.m2m, entity) + should.equal(ret.roleId, entity.roleId) + should.equal(ret.memberHandle.toLowerCase(), entity.memberHandle.toLowerCase()) + await assertResource(ret.id, ret) + }) + + it('create resource for user ghostar 2', async () => { + const entity = resources.createBody('ghostar', reviewerRoleId, challengeId3) + const ret = await service.createResource(user.m2m, entity) + should.equal(ret.roleId, entity.roleId) + should.equal(ret.memberHandle.toLowerCase(), entity.memberHandle.toLowerCase()) + await assertResource(ret.id, ret) + }) + + it('failure - create resource using inactive role', async () => { + const entity = resources.createBody('ghostar', observerRoleId, challengeId1) + try { + await service.createResource(user.m2m, entity) + throw new Error('should not throw error here') + } catch (err) { + should.equal(err.name, 'BadRequestError') + assertError(err, `Resource role with id: ${observerRoleId} is inactive, please use an active one.`) + } + }) + + it('failure - create resource using non-existed role', async () => { + const entity = resources.createBody('ghostar', challengeId1, challengeId1) + try { + await service.createResource(user.m2m, entity) + throw new Error('should not throw error here') + } catch (err) { + should.equal(err.name, 'BadRequestError') + assertError(err, `No resource role found with id: ${challengeId1}.`) + } + }) + + it(`failure - create resource member doesn't exist`, async () => { + const entity = resources.createBody('123abcx', observerRoleId, challengeId1) try { await service.createResource(user.m2m, entity) throw new Error('should not throw error here') } catch (err) { - assertValidationError(err, `"${stringField}" must be a string`) + should.equal(err.name, 'BadRequestError') + assertError(err, `User with handle: 123abcx doesn't exist`) } }) - } - for (const requiredField of requiredFields) { - it(`test invalid parameters, required field ${requiredField} is missing`, async () => { - let entity = _.cloneDeep(testBody) - entity = _.omit(entity, requiredField) + let { stringFields, requiredFields, testBody } = resources + + it(`test invalid parameters, challengeId must be UUID`, async () => { try { + let entity = _.cloneDeep(testBody) + entity.challengeId = 'invalid' await service.createResource(user.m2m, entity) throw new Error('should not throw error here') } catch (err) { - assertValidationError(err, `"${requiredField}" is required`) + assertValidationError(err, '"challengeId" must be a valid GUID') } }) - } - it('failure - create resource for non-existed challenge', async () => { - const entity = resources.createBody('ghostar', observerRoleId, challengeNotFoundId) - try { - await service.createResource(user.m2m, entity) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.status, 404) - should.equal(err.response.body.message, `Challenge with id: ${challengeNotFoundId} doesn't exist.`) + for (const stringField of stringFields) { + it(`test invalid parameters, invalid string type field ${stringField}`, async () => { + let entity = _.cloneDeep(testBody) + _.set(entity, stringField, 123) + try { + await service.createResource(user.m2m, entity) + throw new Error('should not throw error here') + } catch (err) { + assertValidationError(err, `"${stringField}" must be a string`) + } + }) } - }) - it('failure - create duplicate resource', async () => { - const entity = resources.createBody('hohosky', copilotRoleId, challengeId1) - try { - await service.createResource(user.m2m, entity) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.name, 'ConflictError') - assertError(err, `User hohosky already has resource with roleId: ${copilotRoleId} in challenge: ${challengeId1}`) + for (const requiredField of requiredFields) { + it(`test invalid parameters, required field ${requiredField} is missing`, async () => { + let entity = _.cloneDeep(testBody) + entity = _.omit(entity, requiredField) + try { + await service.createResource(user.m2m, entity) + throw new Error('should not throw error here') + } catch (err) { + assertValidationError(err, `"${requiredField}" is required`) + } + }) } + + it('failure - create resource for non-existed challenge', async () => { + const entity = resources.createBody('ghostar', observerRoleId, challengeNotFoundId) + try { + await service.createResource(user.m2m, entity) + throw new Error('should not throw error here') + } catch (err) { + should.equal(err.status, 404) + should.equal(err.response.body.message, `Challenge with id: ${challengeNotFoundId} doesn't exist.`) + } + }) }) }) diff --git a/test/unit/createResourceRole.test.js b/test/unit/createResourceRole.test.js index 177d6e7..ee9a476 100644 --- a/test/unit/createResourceRole.test.js +++ b/test/unit/createResourceRole.test.js @@ -5,6 +5,7 @@ const _ = require('lodash') const should = require('should') const service = require('../../src/services/ResourceRoleService') +const helper = require('../../src/common/helper') const { requestBody } = require('../common/testData') const { assertValidationError, assertError, assertResourceRole } = require('../common/testHelper') @@ -12,25 +13,27 @@ const resourceRoles = requestBody.resourceRoles module.exports = describe('Create resource role', () => { it('create active full-access resource role', async () => { - const entity = resourceRoles.createBody('co-pilot', true, true, false) + const entity = resourceRoles.createBody('co-pilot', true, true, true, false) const ret = await service.createResourceRole(entity) await assertResourceRole(ret.id, entity) }) it('create inactive full-access resource role', async () => { - const entity = resourceRoles.createBody('Observer', true, false, false) + const entity = resourceRoles.createBody('Observer', true, false, false, false) const ret = await service.createResourceRole(entity) await assertResourceRole(ret.id, entity) + const resourceRole = await helper.getById('ResourceRole', ret.id) + await helper.update(resourceRole, { legacyId: 1 }) }) it('create active not full-access resource role', async () => { - const entity = resourceRoles.createBody('submitter', false, true, true) + const entity = resourceRoles.createBody('submitter', false, true, true, true) const ret = await service.createResourceRole(entity) await assertResourceRole(ret.id, entity) }) it('create reviewer resource role', async () => { - const entity = resourceRoles.createBody('reviewer', false, true, false) + const entity = resourceRoles.createBody('reviewer', false, true, true, false) const ret = await service.createResourceRole(entity) await assertResourceRole(ret.id, entity) }) @@ -77,7 +80,7 @@ module.exports = describe('Create resource role', () => { } it(`failure - create duplicate resource role`, async () => { - const entity = resourceRoles.createBody('SUBMITTER', false, true, true) + const entity = resourceRoles.createBody('SUBMITTER', false, true, true, true) try { await service.createResourceRole(entity) throw new Error('should not throw error here') diff --git a/test/unit/createResourceRolePhaseDependency.test.js b/test/unit/createResourceRolePhaseDependency.test.js index 3652dbe..6710456 100644 --- a/test/unit/createResourceRolePhaseDependency.test.js +++ b/test/unit/createResourceRolePhaseDependency.test.js @@ -13,11 +13,13 @@ const dependencies = requestBody.resourceRolePhaseDependencies module.exports = describe('Create resource role phase dependency', () => { let copilotRoleId let submitterRoleId + let observerRoleId before(async () => { const ret = await getRoleIds() copilotRoleId = ret.copilotRoleId submitterRoleId = ret.submitterRoleId + observerRoleId = ret.observerRoleId }) it('create copilot dependency', async () => { @@ -32,6 +34,17 @@ module.exports = describe('Create resource role phase dependency', () => { await assertResourceRolePhaseDependency(ret.id, entity) }) + it('create dependency - resource role is inactive', async () => { + try { + const entity = dependencies.createBody(dependencies.testBody.phaseId, observerRoleId, true) + await service.createDependency(entity) + throw new Error('should not throw error here') + } catch (err) { + should.equal(err.name, 'BadRequestError') + should.equal(err.message, `Resource role with id: ${observerRoleId} is inactive`) + } + }) + it('create dependency - phaseId not found', async () => { try { const entity = dependencies.createBody(submitterRoleId, submitterRoleId, false) diff --git a/test/unit/deleteResource.test.js b/test/unit/deleteResource.test.js index f47799e..beacf8a 100644 --- a/test/unit/deleteResource.test.js +++ b/test/unit/deleteResource.test.js @@ -32,7 +32,7 @@ module.exports = describe('Delete resource', () => { throw new Error('should not throw error here') } catch (err) { should.equal(err.name, 'BadRequestError') - assertError(err, `User hohosky doesn't have resource with roleId: ${observerRoleId} in challenge ${challengeId}`) + assertError(err, `User HoHosky doesn't have resource with roleId: ${observerRoleId} in challenge ${challengeId}`) } }) diff --git a/test/unit/edgeCasesForResourceService.test.js b/test/unit/edgeCasesForResourceService.test.js new file mode 100644 index 0000000..5fcc064 --- /dev/null +++ b/test/unit/edgeCasesForResourceService.test.js @@ -0,0 +1,49 @@ +/** + * Unit test of ResourceService - edge cases. + */ + +const config = require('config') +const should = require('should') +const helper = require('../../src/common/helper') +const service = require('../../src/services/ResourceService') +const { user } = require('../common/testData') + +const challengeId = 'fe6d0a58-ce7d-4521-8501-b8132b1c0391' + +module.exports = describe('Edge cases for resource service', () => { + before(async () => { + try { + await helper.getOSClient().indices.delete({ index: config.OS.OS_INDEX }) + } catch (err) { + // ignore + } + }) + + after(async () => { + const body = { mappings: {} } + body.mappings['_doc'] = { + properties: { + id: { type: 'keyword' } + } + } + + try { + await helper.getOSClient().indices.create({ + index: config.OS.OS_INDEX, + body + }) + } catch (err) { + // ignore + } + }) + + it('get resources by admin - OS is fresh', async () => { + const result = await service.getResources(user.admin, challengeId) + should.equal(result.total, 0) + }) + + it('get challenges hohosky can access - OS is fresh', async () => { + const ret = await service.listChallengesByMember('16096823', {}) + should.equal(ret.data.length, 0) + }) +}) diff --git a/test/unit/getResourceRoles.test.js b/test/unit/getResourceRoles.test.js index 4e9f33e..82c008e 100644 --- a/test/unit/getResourceRoles.test.js +++ b/test/unit/getResourceRoles.test.js @@ -7,6 +7,8 @@ const service = require('../../src/services/ResourceRoleService') const { assertValidationError, assertResourceRole } = require('../common/testHelper') module.exports = describe('Get resource role', () => { + let inactiveId + it('get all resource roles', async () => { const records = await service.getResourceRoles({}) should.equal(records.length, 4) @@ -29,6 +31,25 @@ module.exports = describe('Get resource role', () => { should.equal(records.length, 1) should.equal(records[0].isActive, false) await assertResourceRole(records[0].id, records[0]) + inactiveId = records[0].id + }) + + it('search resource roles with filter', async () => { + const records = await service.getResourceRoles({ + name: 'Observer', + id: inactiveId, + legacyId: 1, + selfObtainable: false, + fullReadAccess: true, + fullWriteAccess: false + }) + should.equal(records.length, 1) + should.equal(records[0].id, inactiveId) + should.equal(records[0].name, 'Observer') + should.equal(records[0].fullReadAccess, true) + should.equal(records[0].fullWriteAccess, false) + should.equal(records[0].selfObtainable, false) + should.equal(records[0].legacyId, 1) }) it('test invalid parameters, invalid boolean path parameter isActive ', async () => { diff --git a/test/unit/getResources.test.js b/test/unit/getResources.test.js index 16385a7..78ca110 100644 --- a/test/unit/getResources.test.js +++ b/test/unit/getResources.test.js @@ -44,7 +44,11 @@ module.exports = describe('Get resources', () => { if (entity.roleId === reviewerRoleId) { hasReviewerRole = true } + should.equal(expected.rating, 2000) } else { + if (entity.memberHandle.toLowerCase() === 'denis') { + should.equal(expected.rating, 0) + } should.equal(entity.roleId, submitterRoleId) } should.exist(expected.created) @@ -55,9 +59,9 @@ module.exports = describe('Get resources', () => { it('get resources by admin', async () => { hasCopilotRole = false hasReviewerRole = false - const records = await service.getResources(user.admin, challengeId) - should.equal(records.length, 5) - for (const record of records) { + const result = await service.getResources(user.admin, challengeId) + should.equal(result.total, 5) + for (const record of result.data) { await assertResource(record.id, record) } // user hohosky should have two resources @@ -68,9 +72,9 @@ module.exports = describe('Get resources', () => { it('get resources by user has full-access permission', async () => { hasCopilotRole = false hasReviewerRole = false - const records = await service.getResources(user.hohosky, challengeId) - should.equal(records.length, 5) - for (const record of records) { + const result = await service.getResources(user.hohosky, challengeId) + should.equal(result.total, 5) + for (const record of result.data) { await assertResource(record.id, record) } // user hohosky should have two resources @@ -78,12 +82,18 @@ module.exports = describe('Get resources', () => { should.equal(hasReviewerRole, true) }) + it(`get resources using user without permission`, async () => { + const result = await service.getResources(user.denis, challengeId) + should.equal(result.total, 1) + should.equal(result.data[0].memberHandle, 'denis') + }) + it('get resources using m2m token', async () => { hasCopilotRole = false hasReviewerRole = false - const records = await service.getResources(user.m2m, challengeId) - should.equal(records.length, 5) - for (const record of records) { + const result = await service.getResources(user.m2m, challengeId) + should.equal(result.total, 5) + for (const record of result.data) { await assertResource(record.id, record) } // user hohosky should have two resources @@ -91,22 +101,29 @@ module.exports = describe('Get resources', () => { should.equal(hasReviewerRole, true) }) - it(`test invalid parameter, challengeId must be UUID`, async () => { - try { - await service.getResources(user.m2m, 'invalid') - throw new Error('should not throw error here') - } catch (err) { - assertValidationError(err, `"challengeId" must be a valid GUID`) + it('get resources with role id using m2m token', async () => { + hasCopilotRole = false + hasReviewerRole = false + const result = await service.getResources(user.m2m, challengeId, copilotRoleId) + should.equal(result.total, 1) + for (const record of result.data) { + await assertResource(record.id, record) } + // user hohosky should have copilot role + should.equal(hasCopilotRole, true) }) - it(`failure - get resources using user without permission`, async () => { + it('get resources without user login', async () => { + const result = await service.getResources(null, challengeId) + should.equal(result.total, 0) + }) + + it(`test invalid parameter, challengeId must be UUID`, async () => { try { - await service.getResources(user.denis, challengeId) + await service.getResources(user.m2m, 'invalid') throw new Error('should not throw error here') } catch (err) { - should.equal(err.name, 'ForbiddenError') - assertError(err, `Only M2M, admin or user with full access role can perform this action`) + assertValidationError(err, `"challengeId" must be a valid GUID`) } }) @@ -115,8 +132,8 @@ module.exports = describe('Get resources', () => { await service.getResources(user.m2m, challengeNotFoundId) throw new Error('should not throw error here') } catch (err) { - should.equal(err.status, 404) - should.equal(err.response.body.message, `Challenge with id: ${challengeNotFoundId} doesn't exist.`) + should.equal(err.name, 'NotFoundError') + assertError(err, `Challenge ID ${challengeNotFoundId} not found`) } }) }) diff --git a/test/unit/listChallengesByMember.test.js b/test/unit/listChallengesByMember.test.js index ad226c3..b7b1917 100644 --- a/test/unit/listChallengesByMember.test.js +++ b/test/unit/listChallengesByMember.test.js @@ -4,7 +4,7 @@ const should = require('should') const service = require('../../src/services/ResourceService') -const { assertValidationError, assertError, getRoleIds } = require('../common/testHelper') +const { assertValidationError, getRoleIds } = require('../common/testHelper') const challengeId1 = 'fe6d0a58-ce7d-4521-8501-b8132b1c0391' const challengeId2 = 'fe6d0a58-ce7d-4521-8501-b8132b1c0392' @@ -23,78 +23,59 @@ module.exports = describe('List challenges by member', () => { }) it('get challenges hohosky can access', async () => { - const ret = await service.listChallengesByMember(16096823, {}) - should.equal(ret.length, 1) - should.equal(ret[0], challengeId1) + const ret = await service.listChallengesByMember('16096823', {}) + should.equal(ret.data.length, 1) + should.equal(ret.data[0], challengeId1) }) it('get challenges ghostar can access', async () => { - const ret = await service.listChallengesByMember(151743, {}) - should.equal(ret.length, 3) - should.equal(ret.includes(challengeId1), true) - should.equal(ret.includes(challengeId2), true) - should.equal(ret.includes(challengeId3), true) + const ret = await service.listChallengesByMember('151743', {}) + should.equal(ret.data.length, 3) + should.equal(ret.data.includes(challengeId1), true) + should.equal(ret.data.includes(challengeId2), true) + should.equal(ret.data.includes(challengeId3), true) }) it('get challenges ghostar can access with filter 1', async () => { - const ret = await service.listChallengesByMember(151743, { resourceRoleId: submitterRoleId }) - should.equal(ret.length, 1) - should.equal(ret[0], challengeId1) + const ret = await service.listChallengesByMember('151743', { resourceRoleId: submitterRoleId }) + should.equal(ret.data.length, 1) + should.equal(ret.data[0], challengeId1) }) it('get challenges ghostar can access with filter 2', async () => { - const ret = await service.listChallengesByMember(151743, { resourceRoleId: reviewerRoleId }) - should.equal(ret.length, 2) - should.equal(ret.includes(challengeId2), true) - should.equal(ret.includes(challengeId3), true) + const ret = await service.listChallengesByMember('151743', { resourceRoleId: reviewerRoleId }) + should.equal(ret.data.length, 2) + should.equal(ret.data.includes(challengeId2), true) + should.equal(ret.data.includes(challengeId3), true) }) it('get challenges ghostar can access with filter 3', async () => { - const ret = await service.listChallengesByMember(151743, { resourceRoleId: observerRoleId }) - should.equal(ret.length, 0) + const ret = await service.listChallengesByMember('151743', { resourceRoleId: observerRoleId }) + should.equal(ret.data.length, 0) }) - it('failure - get challenges by non existed user', async () => { - try { - await service.listChallengesByMember(111111111, {}) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.name, 'BadRequestError') - assertError(err, `User with id: 111111111 doesn't exist`) - } - }) - - it(`failure - get challenges for user with invalid filter, role doesn't exist`, async () => { - try { - await service.listChallengesByMember(151743, { resourceRoleId: challengeId1 }) - throw new Error('should not throw error here') - } catch (err) { - should.equal(err.name, 'BadRequestError') - assertError(err, `No resource role found with id: ${challengeId1}.`) - } + it('get challenges by non existed user', async () => { + const ret = await service.listChallengesByMember('111111111', {}) + should.equal(ret.data.length, 0) }) - it(`test invalid parameters, memberId should be number`, async () => { - try { - await service.listChallengesByMember('invalid', {}) - throw new Error('should not throw error here') - } catch (err) { - assertValidationError(err, `"memberId" must be a number`) - } + it(`get challenges for user with non existed role`, async () => { + const ret = await service.listChallengesByMember('151743', { resourceRoleId: challengeId1 }) + should.equal(ret.data.length, 0) }) - it(`test invalid parameters, memberId should be positive number`, async () => { + it(`test invalid parameters, memberId must be a string`, async () => { try { await service.listChallengesByMember(-1, {}) throw new Error('should not throw error here') } catch (err) { - assertValidationError(err, `"memberId" must be a positive number`) + assertValidationError(err, `"memberId" must be a string`) } }) it(`test invalid parameters, resourceRoleId should be UUID`, async () => { try { - await service.listChallengesByMember(151743, { resourceRoleId: 'invalid' }) + await service.listChallengesByMember('151743', { resourceRoleId: 'invalid' }) throw new Error('should not throw error here') } catch (err) { assertValidationError(err, `"resourceRoleId" must be a valid GUID`) diff --git a/test/unit/test.js b/test/unit/test.js index fd53173..8242fbf 100644 --- a/test/unit/test.js +++ b/test/unit/test.js @@ -58,6 +58,10 @@ describe('Topcoder - Challenge Resource API Unit Test', () => { for (const d of dependencies) { await d.delete() } + const staties = await helper.scan('MemberStats') + for (const s of staties) { + await s.delete() + } } before(async () => { @@ -81,6 +85,20 @@ describe('Topcoder - Challenge Resource API Unit Test', () => { testHelper.initLogs(errorLogs) await initDB() + await testHelper.initES() + + await helper.create('MemberStats', { + userId: '16096823', + handle: 'hohosky', + handleLower: 'hohosky', + maxRating: { rating: 2000 } + }) + + await helper.create('MemberStats', { + userId: '251280', + handle: 'denis', + handleLower: 'denis' + }) }) after(async () => { @@ -93,6 +111,7 @@ describe('Topcoder - Challenge Resource API Unit Test', () => { logger.debug = debug await initDB() + await testHelper.initES() }) describe('ResourceRoleService Unit Test', () => { @@ -109,6 +128,18 @@ describe('Topcoder - Challenge Resource API Unit Test', () => { }) describe('ResourceService Unit Test', () => { + before(async () => { + await helper.create('ResourceRole', { + id: config.SUBMITTER_RESOURCE_ROLE_ID, + name: 'dummy_submitter', + fullReadAccess: false, + fullWriteAccess: true, + isActive: true, + selfObtainable: true, + nameLower: 'dummy_submitter' + }) + }) + require('./edgeCasesForResourceService.test') require('./createResource.test') require('./getResources.test') require('./listChallengesByMember.test') diff --git a/test/unit/updateResourceRole.test.js b/test/unit/updateResourceRole.test.js index 0938be4..8a45634 100644 --- a/test/unit/updateResourceRole.test.js +++ b/test/unit/updateResourceRole.test.js @@ -19,14 +19,14 @@ module.exports = describe('Update resource role', () => { }) it('update resource role', async () => { - const entity = resourceRoles.createBody('co-pilot', false, false, true) + const entity = resourceRoles.createBody('co-pilot', false, false, false, true) const ret = await service.updateResourceRole(copilotRoleId, entity) should.equal(copilotRoleId, ret.id) await assertResourceRole(ret.id, entity) }) it('update resource role again', async () => { - const entity = resourceRoles.createBody('CO-PILOT', true, true, false) + const entity = resourceRoles.createBody('CO-PILOT', true, true, true, false) const ret = await service.updateResourceRole(copilotRoleId, entity) should.equal(copilotRoleId, ret.id) await assertResourceRole(ret.id, entity) @@ -93,7 +93,7 @@ module.exports = describe('Update resource role', () => { }) it(`failure - update resource role name duplication`, async () => { - const entity = resourceRoles.createBody('SUBMITTER', false, true, true) + const entity = resourceRoles.createBody('SUBMITTER', false, true, true, true) try { await service.updateResourceRole(copilotRoleId, entity) throw new Error('should not throw error here') diff --git a/test/unit/updateResourceRolePhaseDependency.test.js b/test/unit/updateResourceRolePhaseDependency.test.js index 9769914..23001f2 100644 --- a/test/unit/updateResourceRolePhaseDependency.test.js +++ b/test/unit/updateResourceRolePhaseDependency.test.js @@ -13,16 +13,24 @@ const dependencies = requestBody.resourceRolePhaseDependencies module.exports = describe('Update resource role phase dependency', () => { let dependency let copilotRoleId + let reviewerRoleId before(async () => { const ret = await getRoleIds() copilotRoleId = ret.copilotRoleId + reviewerRoleId = ret.reviewerRoleId const submitterRoleId = ret.submitterRoleId const records = await service.getDependencies({ resourceRoleId: submitterRoleId }) dependency = records[0] }) it('update dependency', async () => { + const entity = dependencies.createBody(dependency.phaseId, reviewerRoleId, true) + const ret = await service.updateDependency(dependency.id, entity) + await assertResourceRolePhaseDependency(ret.id, entity) + }) + + it('update dependency again', async () => { const entity = dependencies.createBody(dependency.phaseId, dependency.resourceRoleId, true) const ret = await service.updateDependency(dependency.id, entity) await assertResourceRolePhaseDependency(ret.id, entity) diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..b6a0e4c --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4890 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" + integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== + dependencies: + "@babel/highlight" "^7.22.5" + +"@babel/generator@^7.22.5", "@babel/generator@^7.4.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.5.tgz#1e7bf768688acfb05cf30b2369ef855e82d984f7" + integrity sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA== + dependencies: + "@babel/types" "^7.22.5" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-environment-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" + integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== + +"@babel/helper-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== + dependencies: + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz#88cf11050edb95ed08d596f7a044462189127a08" + integrity sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== + +"@babel/highlight@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" + integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.22.5", "@babel/parser@^7.4.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.5.tgz#721fd042f3ce1896238cf1b341c77eb7dee7dbea" + integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q== + +"@babel/template@^7.22.5", "@babel/template@^7.4.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/traverse@^7.4.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.5.tgz#44bd276690db6f4940fdb84e1cb4abd2f729ccd1" + integrity sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.22.5", "@babel/types@^7.4.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" + integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + to-fast-properties "^2.0.0" + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@dabh/diagnostics@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" + integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== + dependencies: + colorspace "1.1.x" + enabled "2.0.x" + kuler "^2.0.0" + +"@hapi/hoek@^9.0.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@opensearch-project/opensearch@^2.11.0": + version "2.11.0" + resolved "https://registry.yarnpkg.com/@opensearch-project/opensearch/-/opensearch-2.11.0.tgz#e5539b49d9ccbc746d023f4f5f89b64501332d16" + integrity sha512-G+SZwtWRDv90IrtTSNnCt0MQjHVyqrcIXcpwN68vjHnfbun2+RHn+ux4K7dnG+s/KwWzVKIpPFoRjg2gfFX0Mw== + dependencies: + aws4 "^1.11.0" + debug "^4.3.1" + hpagent "^1.2.0" + json11 "^1.1.2" + ms "^2.1.3" + secure-json-parse "^2.4.0" + +"@postman/form-data@~3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@postman/form-data/-/form-data-3.1.1.tgz#d0446d0d3639a291f5e800e89fa1d0d3723f9414" + integrity sha512-vjh8Q2a8S6UCm/KKs31XFJqEEgmbjBmpPNVV2eVav6905wyFAwaUOBGA1NPBI4ERH9MMZc6w0umFgM6WbEPMdg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +"@postman/tunnel-agent@^0.6.3": + version "0.6.3" + resolved "https://registry.yarnpkg.com/@postman/tunnel-agent/-/tunnel-agent-0.6.3.tgz#23048d8d8618d453c571f03189e944afdc2292b7" + integrity sha512-k57fzmAZ2PJGxfOA4SGR05ejorHbVAa/84Hxh/2nAztjNXc4ZjOm9NUIk6/Z6LCrBvJZqjRZbN8e/nROVUPVdg== + dependencies: + safe-buffer "^5.0.1" + +"@sideway/address@^4.1.3": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" + integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/express-jwt@0.0.42": + version "0.0.42" + resolved "https://registry.yarnpkg.com/@types/express-jwt/-/express-jwt-0.0.42.tgz#4f04e1fadf9d18725950dc041808a4a4adf7f5ae" + integrity sha512-WszgUddvM1t5dPpJ3LhWNH8kfNN8GPIBrAGxgIYXVCEGx6Bx4A036aAuf/r5WH9DIEdlmp7gHOYvSM6U87B0ag== + dependencies: + "@types/express" "*" + "@types/express-unless" "*" + +"@types/express-serve-static-core@^4.17.33": + version "4.17.35" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz#c95dd4424f0d32e525d23812aa8ab8e4d3906c4f" + integrity sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express-unless@*": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/express-unless/-/express-unless-2.0.1.tgz#7d5728315caf95a315a6bcc19ac99f6a8becbe49" + integrity sha512-PJLiNw03EjkWDkQbhNjIXXDLObC3eMQhFASDV+WakFbT8eL7YdjlbV6MXd3Av5Lejq499d6pFuV1jyK+EHyG3Q== + dependencies: + express-unless "*" + +"@types/express@*": + version "4.17.17" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" + integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/http-errors@*": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.1.tgz#20172f9578b225f6c7da63446f56d4ce108d5a65" + integrity sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ== + +"@types/mime@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + +"@types/node@*": + version "20.3.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.3.tgz#329842940042d2b280897150e023e604d11657d6" + integrity sha512-wheIYdr4NYML61AjC8MKj/2jrR/kDQri/CIpVoZwldwhnIrD/j9jIU5bJ8yBKuB2VhpFV7Ab6G2XkBjv9r9Zzw== + +"@types/node@11.11.0": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.0.tgz#070e9ce7c90e727aca0e0c14e470f9a93ffe9390" + integrity sha512-D5Rt+HXgEywr3RQJcGlZUCTCx1qVbCZpVk3/tOOA6spLNZdGm8BU+zRgdRYDoF1pO3RuXLxADzMrF903JlQXqg== + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/send@*": + version "0.17.1" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.1.tgz#ed4932b8a2a805f1fe362a70f4e62d0ac994e301" + integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-static@*": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.2.tgz#3e5419ecd1e40e7405d34093f10befb43f63381a" + integrity sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw== + dependencies: + "@types/http-errors" "*" + "@types/mime" "*" + "@types/node" "*" + +"@types/triple-beam@^1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.2.tgz#38ecb64f01aa0d02b7c8f4222d7c38af6316fef8" + integrity sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g== + +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-jsx@^5.0.0: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^6.0.2: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ajv-keywords@^3.0.0: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.0.1, ajv@^6.12.3, ajv@^6.5.0: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== + +ansi-regex@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" + integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== + +ansi-regex@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +append-transform@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab" + integrity sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw== + dependencies: + default-require-extensions "^2.0.0" + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-includes@^3.0.3, array-includes@^3.1.1: + version "3.1.6" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + is-string "^1.0.7" + +asap@^2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +async@3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9" + integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g== + +async@^3.2.3: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +aws-sdk@2.395.0: + version "2.395.0" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.395.0.tgz#637e5fa06d69bfb923b17bde24a8bd2a74dedab3" + integrity sha512-ldTTjctniZT4E2lq2z3D8Y2u+vpkp+laoEnDkXgjKXTKbiJ0QEtfWsUdx/IQ7awCt8stoxyqZK47DJOxIbRNoA== + dependencies: + buffer "4.9.1" + events "1.1.1" + ieee754 "1.1.8" + jmespath "0.15.0" + querystring "0.2.0" + sax "1.2.1" + url "0.10.3" + uuid "3.3.2" + xml2js "0.4.19" + +aws-sdk@^2.466.0: + version "2.1409.0" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1409.0.tgz#bae5f1f4e4825e1e3319abd4abb5571201128a60" + integrity sha512-4tg4lkvqRQs/39Z/wp+WBcNwDv17zwErlwotIxkHg7kCybVD78mC0sTrjcBbRK01kOsgiS/NCImIWj6C8KsMzw== + dependencies: + buffer "4.9.2" + events "1.1.1" + ieee754 "1.1.13" + jmespath "0.16.0" + querystring "0.2.0" + sax "1.2.1" + url "0.10.3" + util "^0.12.4" + uuid "8.0.0" + xml2js "0.5.0" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + +aws4@1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + +aws4@^1.11.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.13.1.tgz#bb5f8b8a20739f6ae1caeaf7eea2c7913df8048e" + integrity sha512-u5w79Rd7SU4JaIlA/zFqG+gOiuq25q5VLyZ8E+ijJeILuTxVzZgp2CaGw/UTw6pXYN9XMO9yiqj/nEHmhTG5CA== + +aws4@^1.8.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== + +axios@^0.19.0: + version "0.19.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27" + integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA== + dependencies: + follow-redirects "1.5.10" + +axios@^0.21.1: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g== + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-runtime@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.6.1.tgz#788b94b6f634e25b91bd6c5df72d467457afb000" + integrity sha512-5pdhO3jaxqh9L42oBfbrqy58swDhciM47sRGoODURdRxwfiqttEvK87LX27W/PYY6f4cJt2mEdyoLcr/+cM/iw== + dependencies: + core-js "^2.1.0" + +backoff@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f" + integrity sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA== + dependencies: + precond "0.2" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.0.2, base64-js@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + +bluebird@^2.6.2: + version "2.11.0" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" + integrity sha512-UfFSr22dmHPQqPP9XWHRhq+gWnHCYguQGkXQlbyPtW5qTnhFWA8/iXg765tH0cAjy7l/zPJ1aBTO0g5XgA7kvQ== + +bluebird@^3.5.1: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +body-parser@^1.15.1: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brotli@~1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/brotli/-/brotli-1.3.3.tgz#7365d8cc00f12cf765d2b2c898716bcf4b604d48" + integrity sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg== + dependencies: + base64-js "^1.1.2" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== + +buffer@4.9.1: + version "4.9.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + integrity sha512-DNK4ruAqtyHaN8Zne7PkBTO+dD1Lr0YfTduMqlIyjvQIoztBkUxrvL+hKeLW8NXFKHOq/2upkxuoS9znQ9bW9A== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +buffer@4.9.2: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +bunyan@^1.8.12: + version "1.8.15" + resolved "https://registry.yarnpkg.com/bunyan/-/bunyan-1.8.15.tgz#8ce34ca908a17d0776576ca1b2f6cbd916e93b46" + integrity sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig== + optionalDependencies: + dtrace-provider "~0.8" + moment "^2.19.3" + mv "~2" + safe-json-stringify "~1" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +caching-transform@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-3.0.2.tgz#601d46b91eca87687a281e71cef99791b0efca70" + integrity sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w== + dependencies: + hasha "^3.0.0" + make-dir "^2.0.0" + package-hash "^3.0.0" + write-file-atomic "^2.4.2" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + integrity sha512-UJiE1otjXPF5/x+T3zTnSFiTOEmJoGTD9HmBoxnCUwho61a2eSNn/VwtwuIBDAo2SEOv1AJ7ARI5gCmohFLu/g== + dependencies: + callsites "^0.2.0" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + integrity sha512-Zv4Dns9IbXXmPkgRRUjAaJQgfN4xX5p6+RQFhWUqscdvvK2xK/ZL8b3IXIJsj+4sD+f24NwnWy2BY8AJ82JB0A== + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +chai@^4.1.2: + version "4.3.7" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" + integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^4.1.2" + get-func-name "^2.0.0" + loupe "^2.3.1" + pathval "^1.1.1" + type-detect "^4.0.5" + +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.1.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chardet@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-1.4.0.tgz#278748f260219990fb2167dbfb1b253ca26b41ea" + integrity sha512-NpwMDdSIprbYx1CLnfbxEIarI0Z+s9MssEgggMNheGM+WD68yOhV7IEA/3r6tr0yTRgQD0HuZJDw32s99i6L+A== + +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + integrity sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg== + +charset@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/charset/-/charset-1.0.1.tgz#8d59546c355be61049a8fa9164747793319852bd" + integrity sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg== + +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== + +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== + dependencies: + restore-cursor "^2.0.0" + +cli-progress@3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-3.10.0.tgz#63fd9d6343c598c93542fdfa3563a8b59887d78a" + integrity sha512-kLORQrhYCAtUPLZxqsAt2YJGOvRdt34+O6jl5cQGb7iF3dM55FQZlTR+rQyIK9JUcO9bBMwZsTlND+3dmFU2Cw== + dependencies: + string-width "^4.2.0" + +cli-table3@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.1.tgz#36ce9b7af4847f288d3cdd081fbd09bf7bd237b8" + integrity sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA== + dependencies: + string-width "^4.2.0" + optionalDependencies: + colors "1.4.0" + +cli-width@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +codependency@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/codependency/-/codependency-0.1.4.tgz#d1763ab7264bd70c91d9626e98862d3792bf8d4a" + integrity sha512-26yAvd3+17xSfDADtnzpnL5GK+8+x4QeZ3DegekkHyno6LWeHqXuSU7q8w/IrAur7SY6ISPApOWtWTfuIF0Xpg== + dependencies: + semver "5.0.1" + +color-convert@^1.9.0, color-convert@^1.9.3: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.6.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.1.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + +colors@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +colorspace@1.1.x: + version "1.1.4" + resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" + integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== + dependencies: + color "^3.1.3" + text-hex "1.0.x" + +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@2.15.1: + version "2.15.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" + integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== + +commander@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +commander@^2.20.3: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +component-emitter@^1.2.0, component-emitter@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +config@^3.0.1, config@^3.3.6: + version "3.3.9" + resolved "https://registry.yarnpkg.com/config/-/config-3.3.9.tgz#27fae95b43e0e1d5723e54143c090954d8e49572" + integrity sha512-G17nfe+cY7kR0wVpc49NCYvNtelm/pPy8czHoFkAgtV1lkmcp7DHtWCdDu+C9Z7gb2WVqa9Tm3uF9aKaPbCfhg== + dependencies: + json5 "^2.2.3" + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha512-OKZnPGeMQy2RPaUIBPFFd71iNf4791H12MCRuVQDnzGRwCYNYmTDy5pdafo2SLAcEMKzTOQnLWG4QdcjeJUMEg== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^1.6.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +cookiejar@^2.1.0, cookiejar@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" + integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== + +core-js@^2.1.0: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cors@^2.7.1: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cp-file@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-6.2.0.tgz#40d5ea4a1def2a9acdd07ba5c0b0246ef73dc10d" + integrity sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA== + dependencies: + graceful-fs "^4.1.2" + make-dir "^2.0.0" + nested-error-stacks "^2.0.0" + pify "^4.0.1" + safe-buffer "^5.0.1" + +cross-spawn@^4: + version "4.0.2" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" + integrity sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA== + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cssfilter@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae" + integrity sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw== + +csv-parse@4.16.3: + version "4.16.3" + resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-4.16.3.tgz#7ca624d517212ebc520a36873c3478fa66efbaf7" + integrity sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg== + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + +debug-log@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" + integrity sha512-gV/pe1YIaKNgLYnd1g9VNW80tcb7oV5qvNUxG7NM8rbDpnl6RGunzlAtlGSb0wEs3nesu2vHNiX9TSsZ+Y+RjA== + +debug@2.6.9, debug@^2.2.0, debug@^2.6.8: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@3.1.0, debug@=3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +debug@^3.1.0, debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.3.1: + version "4.3.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== + dependencies: + ms "2.1.2" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +deep-eql@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" + integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== + dependencies: + type-detect "^4.0.0" + +deep-equal@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + integrity sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw== + +deep-equal@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +default-require-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7" + integrity sha512-B0n2zDIXpzLzKeoEozorDSa1cHc1t0NjmxP0zuAxbizNU2MBqYJJKYXrrFdKuQliojXynrxgd7l4ahfg/+aA5g== + dependencies: + strip-bom "^3.0.0" + +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +deglob@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/deglob/-/deglob-2.1.1.tgz#d268e168727799862e8eac07042e165957c1f3be" + integrity sha512-2kjwuGGonL7gWE1XU4Fv79+vVzpoQCl0V+boMwWtOQJV2AGDabCwez++nB1Nli/8BabAfZQ/UuHPlp6AymKdWw== + dependencies: + find-root "^1.0.0" + glob "^7.0.5" + ignore "^3.0.9" + pkg-config "^1.1.0" + run-parallel "^1.1.2" + uniq "^1.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +dezalgo@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81" + integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig== + dependencies: + asap "^2.0.0" + wrappy "1" + +diff@3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha512-lsGyRuYr4/PIB0txi+Fy2xOMI2dGaTguCaotzFGkVZuKR5usKfcRWIFKNM3QNrU7hh/+w2bwTW+ZeXPK5l8uVg== + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +dtrace-provider@~0.8: + version "0.8.8" + resolved "https://registry.yarnpkg.com/dtrace-provider/-/dtrace-provider-0.8.8.tgz#2996d5490c37e1347be263b423ed7b297fb0d97e" + integrity sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg== + dependencies: + nan "^2.14.0" + +dynamoose@^1.7.2: + version "1.11.1" + resolved "https://registry.yarnpkg.com/dynamoose/-/dynamoose-1.11.1.tgz#6b9a0356b5a9a9dda8a042ee5e8caf60ba659705" + integrity sha512-73T0GOeSh2FQDdK5V+cN9yowFU4uVt2OsOvknCB4Xdb+nSL/hBaecPY/meJaWZApVx73Hl1DcBSCGp/VWMvfRA== + dependencies: + "@types/node" "11.11.0" + aws-sdk "2.395.0" + debug "4.1.1" + deep-equal "1.0.1" + hooks "0.3.2" + object-path "0.11.4" + q "1.5.1" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +enabled@2.0.x: + version "2.0.0" + resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.21.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" + integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== + dependencies: + array-buffer-byte-length "^1.0.0" + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.2.0" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + 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-typed-array "^1.1.10" + is-weakref "^1.0.2" + object-inspect "^1.12.3" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.9" + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es6-error@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +eslint-config-standard-jsx@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-6.0.2.tgz#90c9aa16ac2c4f8970c13fc7efc608bacd02da70" + integrity sha512-D+YWAoXw+2GIdbMBRAzWwr1ZtvnSf4n4yL0gKGg7ShUOGXkSOLerI17K4F6LdQMJPNMoWYqepzQD/fKY+tXNSg== + +eslint-config-standard@12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz#638b4c65db0bd5a41319f96bba1f15ddad2107d9" + integrity sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ== + +eslint-import-resolver-node@^0.3.1: + version "0.3.7" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" + integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== + dependencies: + debug "^3.2.7" + is-core-module "^2.11.0" + resolve "^1.22.1" + +eslint-module-utils@^2.2.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== + dependencies: + debug "^3.2.7" + +eslint-plugin-es@^1.3.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz#12acae0f4953e76ba444bfd1b2271081ac620998" + integrity sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA== + dependencies: + eslint-utils "^1.4.2" + regexpp "^2.0.1" + +eslint-plugin-import@~2.14.0: + version "2.14.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz#6b17626d2e3e6ad52cfce8807a845d15e22111a8" + integrity sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g== + dependencies: + contains-path "^0.1.0" + debug "^2.6.8" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.1" + eslint-module-utils "^2.2.0" + has "^1.0.1" + lodash "^4.17.4" + minimatch "^3.0.3" + read-pkg-up "^2.0.0" + resolve "^1.6.0" + +eslint-plugin-node@~7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz#a6e054e50199b2edd85518b89b4e7b323c9f36db" + integrity sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw== + dependencies: + eslint-plugin-es "^1.3.1" + eslint-utils "^1.3.1" + ignore "^4.0.2" + minimatch "^3.0.4" + resolve "^1.8.1" + semver "^5.5.0" + +eslint-plugin-promise@~4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz#2d074b653f35a23d1ba89d8e976a985117d1c6a2" + integrity sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg== + +eslint-plugin-react@~7.11.1: + version "7.11.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz#c01a7af6f17519457d6116aa94fc6d2ccad5443c" + integrity sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw== + dependencies: + array-includes "^3.0.3" + doctrine "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.0.1" + prop-types "^15.6.2" + +eslint-plugin-standard@~4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.2.tgz#021211a9f077e63a6847e7bb9ab4247327ac8e0c" + integrity sha512-nKptN8l7jksXkwFk++PhJB3cCDTcXOEyhISIN86Ue2feJ1LFyY3PrY3/xT2keXlJSY5bpmbiTG0f885/YKAvTA== + +eslint-scope@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.3.1, eslint-utils@^1.4.2: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint@~5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.4.0.tgz#d068ec03006bb9e06b429dc85f7e46c1b69fac62" + integrity sha512-UIpL91XGex3qtL6qwyCQJar2j3osKxK9e3ano3OcGEIRM4oWIpCkDg9x95AXEC2wMs7PnxzOkPZ2gq+tsMS9yg== + dependencies: + ajv "^6.5.0" + babel-code-frame "^6.26.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^3.1.0" + doctrine "^2.1.0" + eslint-scope "^4.0.0" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^4.0.0" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.7.0" + ignore "^4.0.2" + imurmurhash "^0.1.4" + inquirer "^5.2.0" + is-resolvable "^1.1.0" + js-yaml "^3.11.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.5" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + pluralize "^7.0.0" + progress "^2.0.0" + regexpp "^2.0.0" + require-uncached "^1.0.3" + semver "^5.5.0" + strip-ansi "^4.0.0" + strip-json-comments "^2.0.1" + table "^4.0.3" + text-table "^0.2.0" + +espree@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-4.1.0.tgz#728d5451e0fd156c04384a7ad89ed51ff54eb25f" + integrity sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w== + dependencies: + acorn "^6.0.2" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.0.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eventemitter3@4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + integrity sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw== + +express-interceptor@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/express-interceptor/-/express-interceptor-1.2.0.tgz#33460a8e11dce7e5a022caf555d377e45ddb822a" + integrity sha512-fCbcJv8ZwabDg0M/3PmHUxfr/WKHGMpAicR9TfGdhANV4M1GBDSrBTenHIK3aegyRN5S6eDwlvyNFiLynnc19w== + dependencies: + debug "^2.2.0" + +express-unless@*: + version "2.1.3" + resolved "https://registry.yarnpkg.com/express-unless/-/express-unless-2.1.3.tgz#f951c6cca52a24da3de32d42cfd4db57bc0f9a2e" + integrity sha512-wj4tLMyCVYuIIKHGt0FhCtIViBcwzWejX0EjNxveAa6dG+0XBCQhMbx+PnkLkFCxLC69qoFrxds4pIyL88inaQ== + +express@^4.16.4: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend@^3.0.0, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +faker@5.5.3: + version "5.5.3" + resolved "https://registry.yarnpkg.com/faker/-/faker-5.5.3.tgz#c57974ee484431b25205c2c8dc09fda861e51e0e" + integrity sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g== + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-safe-stringify@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +fecha@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" + integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + integrity sha512-uXP/zGzxxFvFfcZGgBIwotm+Tdc55ddPAzF7iHshP4YGaXMww7rSF9peD9D1sui5ebONg5UobsZv+FfgEpGv/w== + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + +file-type@3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" + integrity sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA== + +filesize@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.0.1.tgz#f850b509909c7c86f7e450ea19006c31c2ed3d2f" + integrity sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg== + +filesize@8.0.7: + version "8.0.7" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" + integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-root@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +flat-cache@^1.2.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" + integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg== + dependencies: + circular-json "^0.3.1" + graceful-fs "^4.1.2" + rimraf "~2.6.2" + write "^0.2.1" + +flatted@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" + integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== + +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== + +follow-redirects@1.5.10: + version "1.5.10" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== + dependencies: + debug "=3.1.0" + +follow-redirects@^1.14.0: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +foreground-child@^1.5.6: + version "1.5.6" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9" + integrity sha512-3TOY+4TKV0Ml83PXJQY+JFQaHNV38lzQDIzzXYg1kWdBLenGgoZhAs0CKgzI31vi2pWEpQMq/Yi4bpKwCPkw7g== + dependencies: + cross-spawn "^4" + signal-exit "^3.0.0" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + +form-data@^2.3.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" + integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +formidable@^1.2.0: + version "1.2.6" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.6.tgz#d2a51d60162bbc9b4a055d8457a7c75315d1a168" + integrity sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ== + +formidable@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-2.1.2.tgz#fa973a2bec150e4ce7cac15589d7a25fc30ebd89" + integrity sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g== + dependencies: + dezalgo "^1.0.4" + hexoid "^1.0.0" + once "^1.4.0" + qs "^6.11.0" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== + +functions-have-names@^1.2.2, functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" + +get-parameter-names@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/get-parameter-names/-/get-parameter-names-0.3.0.tgz#2d2237cd592e6c5b859ab2efdab435f008e5bb97" + integrity sha512-KkR1dX7U1TynXFkqveVE/XoRn9qRAsM2q4Eu2WsGTFzoaSdnNQEfxbcK+LMv8DcFoQQT9BFjNL+bf9ZyTLkWpg== + +get-stdin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" + integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + +glob@7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^6.0.1: + version "6.0.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" + integrity sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A== + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.5, glob@^7.1.2, glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0, globals@^11.7.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +handlebars@4.5.3: + version "4.5.3" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.3.tgz#5cf75bd8714f7605713511a56be7c349becb0482" + integrity sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA== + dependencies: + neo-async "^2.6.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + +handlebars@4.7.7, handlebars@^4.7.7: + version "4.7.7" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" + integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.0" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== + dependencies: + ansi-regex "^2.0.0" + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.1, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hasha@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-3.0.0.tgz#52a32fab8569d41ca69a61ff1a214f8eb7c8bd39" + integrity sha512-w0Kz8lJFBoyaurBiNrIvxPqr/gJ6fOfSkpAPOepN3oECqGJag37xPbOv57izi/KP8auHgNYxn5fXtAb+1LsJ6w== + dependencies: + is-stream "^1.0.1" + +he@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + integrity sha512-z/GDPjlRMNOa2XJiB4em8wJpuuBfrFOlYKTZxtpkdr1uPdibHI8rYA3MY0KDObpVyaes0e/aunid/t88ZI2EKA== + +hexoid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hexoid/-/hexoid-1.0.0.tgz#ad10c6573fb907de23d9ec63a711267d9dc9bc18" + integrity sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g== + +hoek@5.x.x: + version "5.0.4" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-5.0.4.tgz#0f7fa270a1cafeb364a4b2ddfaa33f864e4157da" + integrity sha512-Alr4ZQgoMlnere5FZJsIyfIjORBqZll5POhDsF4q64dPuJR6rNxXdDxtHSQq8OXRurhmx+PWYEE8bXRROY8h0w== + +hoek@6.x.x: + version "6.1.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-6.1.3.tgz#73b7d33952e01fe27a38b0457294b79dd8da242c" + integrity sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ== + +hooks@0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/hooks/-/hooks-0.3.2.tgz#a31f060c2026cea6cf1ca3eb178430e718e1c4a3" + integrity sha512-TqeFzUf12rSzcbm5lUls81jimUC8TmXZ4ANPxxeeMou09hrjBcHYhAQ0WgyN5YqNCXOzz7L6xVNl/+ctFuSeOw== + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +hpagent@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/hpagent/-/hpagent-1.2.0.tgz#0ae417895430eb3770c03443456b8d90ca464903" + integrity sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +http-aws-es@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/http-aws-es/-/http-aws-es-6.0.0.tgz#1528978d2bee718b8732dcdced0856efa747aeff" + integrity sha512-g+qp7J110/m4aHrR3iit4akAlnW0UljZ6oTq/rCcbsI8KP9x+95vqUtx49M2XQ2JMpwJio3B6gDYx+E8WDxqiA== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-json-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/http-json-response/-/http-json-response-1.0.1.tgz#af24363ce94c72aadeefcc7aae1f27468ecf4b72" + integrity sha512-xZ0qvl+Vt8pSOyWZ+39aNHdRlrL4rDB1OKsTqKnHSYIi0BJNQ6UNXfkAC0b+aGj5k1jDr1ZRdpuIVGC5GrMwww== + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +http-reasons@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/http-reasons/-/http-reasons-0.1.0.tgz#a953ca670078669dde142ce899401b9d6e85d3b4" + integrity sha512-P6kYh0lKZ+y29T2Gqz+RlC9WBLhKe8kDmcJ+A+611jFfxdPsbMRQ5aNmFRM3lENqFkK+HTTL+tlQviAiv0AbLQ== + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +http-signature@~1.3.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9" + integrity sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw== + dependencies: + assert-plus "^1.0.0" + jsprim "^2.0.2" + sshpk "^1.14.1" + +http-status-codes@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/http-status-codes/-/http-status-codes-1.4.0.tgz#6e4c15d16ff3a9e2df03b89f3a55e1aae05fb477" + integrity sha512-JrT3ua+WgH8zBD3HEJYbeEgnuQaAnUeRRko/YojPAJjGmIfGD3KPU/asLdsLwKjfxOmQe5nXMQ0pt/7MyapVbQ== + +httpntlm@1.7.7: + version "1.7.7" + resolved "https://registry.yarnpkg.com/httpntlm/-/httpntlm-1.7.7.tgz#51b914f18e5de2868d4bfe50aeecdb1db23218a1" + integrity sha512-Pv2Rvrz8H0qv1Dne5mAdZ9JegG1uc6Vu5lwLflIY6s8RKHdZQbW39L4dYswSgqMDT0pkJILUTKjeyU0VPNRZjA== + dependencies: + httpreq ">=0.4.22" + underscore "~1.12.1" + +httpreq@>=0.4.22: + version "0.5.2" + resolved "https://registry.yarnpkg.com/httpreq/-/httpreq-0.5.2.tgz#be6777292fa1038d7771d7c01d9a5e1219de951c" + integrity sha512-2Jm+x9WkExDOeFRrdBCBSpLPT5SokTcRHkunV3pjKmX/cx6av8zQ0WtHUMDrYb6O4hBFzNU6sxJEypvRUVYKnw== + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +iconv-lite@0.4.24, iconv-lite@^0.4.17: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ieee754@1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +ieee754@1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" + integrity sha512-/aoyv2Nt7mGLnCAWzE0C1WH9Xd8ZsqR0f4Pjwxputi1JNm01+InyAYQotF4N+ulEIjbEsJo22NOHr+U/XEZ1Pw== + +ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^3.0.9: + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== + +ignore@^4.0.2: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inquirer@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-5.2.0.tgz#db350c2b73daca77ff1243962e9f22f099685726" + integrity sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ== + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.1.0" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^5.5.2" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + dependencies: + get-intrinsic "^1.2.0" + has "^1.0.3" + side-channel "^1.0.4" + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.11.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-regex@^1.0.4, is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-resolvable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isemail@3.x.x: + version "3.2.0" + resolved "https://registry.yarnpkg.com/isemail/-/isemail-3.2.0.tgz#59310a021931a9fb06bbb51e155ce0b3f236832c" + integrity sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg== + dependencies: + punycode "2.x.x" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + +istanbul-lib-coverage@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" + integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== + +istanbul-lib-hook@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz#c95695f383d4f8f60df1f04252a9550e15b5b133" + integrity sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA== + dependencies: + append-transform "^1.0.0" + +istanbul-lib-instrument@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" + integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== + dependencies: + "@babel/generator" "^7.4.0" + "@babel/parser" "^7.4.3" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + istanbul-lib-coverage "^2.0.5" + semver "^6.0.0" + +istanbul-lib-report@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" + integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== + dependencies: + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + supports-color "^6.1.0" + +istanbul-lib-source-maps@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" + integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + rimraf "^2.6.3" + source-map "^0.6.1" + +istanbul-reports@^2.2.4: + version "2.2.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.7.tgz#5d939f6237d7b48393cc0959eab40cd4fd056931" + integrity sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg== + dependencies: + html-escaper "^2.0.0" + +jmespath@0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" + integrity sha512-+kHj8HXArPfpPEKGLZ+kB5ONRTCiGQXo8RQYL0hH8t6pWXUBBK5KkkQmTNOwKK4LEsd0yTsgtjJVm4UBSZea4w== + +jmespath@0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.16.0.tgz#b15b0a85dfd4d930d43e69ed605943c802785076" + integrity sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw== + +joi@^13.4.0: + version "13.7.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-13.7.0.tgz#cfd85ebfe67e8a1900432400b4d03bbd93fb879f" + integrity sha512-xuY5VkHfeOYK3Hdi91ulocfuFopwgbSORmIwzcwHKESQhC7w1kD5jaVSPnqDxS2I8t3RZ9omCKAxNwXN5zG1/Q== + dependencies: + hoek "5.x.x" + isemail "3.x.x" + topo "3.x.x" + +joi@^14.0.0: + version "14.3.1" + resolved "https://registry.yarnpkg.com/joi/-/joi-14.3.1.tgz#164a262ec0b855466e0c35eea2a885ae8b6c703c" + integrity sha512-LQDdM+pkOrpAn4Lp+neNIFV3axv1Vna3j38bisbQhETPMANYRbFJFUyOZcOClYvM/hppMhGWuKSFEK9vjrB+bQ== + dependencies: + hoek "6.x.x" + isemail "3.x.x" + topo "3.x.x" + +joi@^17.4.0: + version "17.9.2" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.9.2.tgz#8b2e4724188369f55451aebd1d0b1d9482470690" + integrity sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + +js-sha512@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha512/-/js-sha512-0.8.0.tgz#dd22db8d02756faccf19f218e3ed61ec8249f7d4" + integrity sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg== + +js-yaml@^3.11.0, js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json-stringify-safe@5.0.1, json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +json11@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/json11/-/json11-1.1.2.tgz#35ffd3ee5073b0cc09ef826b0a0dc005ebef2b5b" + integrity sha512-5r1RHT1/Gr/jsI/XZZj/P6F11BKM8xvTaftRuiLkQI9Z2PFDukM82Ysxw8yDszb3NJP/NKnRlSGmhUdG99rlBw== + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonwebtoken@^8.5.1: + version "8.5.1" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" + integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== + dependencies: + jws "^3.2.2" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + semver "^5.6.0" + +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +jsprim@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-2.0.2.tgz#77ca23dbcd4135cd364800d22ff82c2185803d4d" + integrity sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +jsx-ast-utils@^2.0.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz#1114a4c1209481db06c690c2b4f488cc665f657e" + integrity sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w== + dependencies: + array-includes "^3.1.1" + object.assign "^4.1.0" + +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jwks-rsa@^1.6.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/jwks-rsa/-/jwks-rsa-1.12.3.tgz#40232f85d16734cb82837f38bb3e350a34435400" + integrity sha512-cFipFDeYYaO9FhhYJcZWX/IyZgc0+g316rcHnDpT2dNRNIE/lMOmWKKqp09TkJoYlNFzrEVODsR4GgXJMgWhnA== + dependencies: + "@types/express-jwt" "0.0.42" + axios "^0.21.1" + debug "^4.1.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + jsonwebtoken "^8.5.1" + limiter "^1.1.5" + lru-memoizer "^2.1.2" + ms "^2.1.2" + proxy-from-env "^1.1.0" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +limiter@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.5.tgz#8f92a25b3b16c6131293a0cc834b4a838a2aa7c2" + integrity sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA== + +liquid-json@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/liquid-json/-/liquid-json-0.3.1.tgz#9155a18136d8a6b2615e5f16f9a2448ab6b50eea" + integrity sha512-wUayTU8MS827Dam6MxgD72Ui+KOSF+u/eIqpatOtjnvgJ0+mnDq33uC2M7J0tPK+upe/DpUAuK4JUU89iBoNKQ== + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ== + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== + +lodash.flattendeep@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" + integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ== + +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== + +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== + +lodash@4.17.15: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +lodash@4.17.21, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +logform@^2.3.2, logform@^2.4.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.5.1.tgz#44c77c34becd71b3a42a3970c77929e52c6ed48b" + integrity sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg== + dependencies: + "@colors/colors" "1.5.0" + "@types/triple-beam" "^1.3.2" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^2.3.1" + triple-beam "^1.3.0" + +loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loupe@^2.3.1: + version "2.3.6" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" + integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== + dependencies: + get-func-name "^2.0.0" + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lru-cache@~4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" + integrity sha512-uQw9OqphAGiZhkuPlpFGmdTU2tEuhxTourM/19qGJrxBPHAr/f8BT1a0i/lOclESnGatdJG/UCkP9kZB/Lh1iw== + dependencies: + pseudomap "^1.0.1" + yallist "^2.0.0" + +lru-memoizer@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/lru-memoizer/-/lru-memoizer-2.2.0.tgz#b9d90c91637b4b1a423ef76f3156566691293df8" + integrity sha512-QfOZ6jNkxCcM/BkIPnFsqDhtrazLRsghi9mBwFAzol5GCvj4EkFT899Za3+QwikCg5sRX8JstioBDwOxEyzaNw== + dependencies: + lodash.clonedeep "^4.5.0" + lru-cache "~4.0.0" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-source-map@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" + integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== + dependencies: + source-map "^0.6.1" + +methods@^1.1.1, methods@^1.1.2, methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +millisecond@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/millisecond/-/millisecond-0.1.2.tgz#6cc5ad386241cab8e78aff964f87028eec92dac5" + integrity sha512-BJ8XtxY+woL+5TkP6uS6XvOArm0JVrX2otkgtWZseHpIax0oOOPW3cnwhOjRqbEJg7YRO/BDF7fO/PTWNT3T9Q== + +mime-db@1.51.0: + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-format@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mime-format/-/mime-format-2.0.1.tgz#1274876d58bc803332427a515f5f7036e07b9413" + integrity sha512-XxU3ngPbEnrYnNbIX+lYSaYg0M01v6p2ntd2YaFksTu0vayaw5OJvbdRyWs07EYRlLED5qadUZ+xo+XhOvFhwg== + dependencies: + charset "^1.0.0" + +mime-types@2.1.34: + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== + dependencies: + mime-db "1.51.0" + +mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0, mime@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +"minimatch@2 || 3", minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q== + +minimist@^1.1.0, minimist@^1.2.5, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw== + +mkdirp@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA== + dependencies: + minimist "0.0.8" + +mkdirp@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mocha-prepare@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/mocha-prepare/-/mocha-prepare-0.1.0.tgz#5513227681222e4349481ee4e462472f31c6bb82" + integrity sha512-ZSa/Zq+CQv9ZS7kfgsB3iRbfM4WBLn+Oy3EHDp3IXxbUVmVrcu+cs2YOELH77Gj3amkHjhCpM5CAZHV6jz6scg== + +mocha@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" + integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ== + dependencies: + browser-stdout "1.3.1" + commander "2.15.1" + debug "3.1.0" + diff "3.5.0" + escape-string-regexp "1.0.5" + glob "7.1.2" + growl "1.10.5" + he "1.1.1" + minimatch "3.0.4" + mkdirp "0.5.1" + supports-color "5.4.0" + +moment@^2.19.3: + version "2.29.4" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" + integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.1.1, ms@^2.1.2, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== + +mv@~2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/mv/-/mv-2.1.1.tgz#ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2" + integrity sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg== + dependencies: + mkdirp "~0.5.1" + ncp "~2.0.0" + rimraf "~2.4.0" + +nan@^2.14.0: + version "2.17.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" + integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +ncp@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" + integrity sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +nested-error-stacks@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz#26c8a3cee6cc05fbcf1e333cd2fc3e003326c0b5" + integrity sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw== + +newman-reporter-html@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/newman-reporter-html/-/newman-reporter-html-1.0.5.tgz#8f35a4984e0f19aaeec5e052a2aacc7e7c227b8d" + integrity sha512-Kz8ejzJqDaasyqNuP8F7bBYzsts7JP3wBfdRQDOYPCUchVQF63KsbxtxbGadyzOeXcZsXs6YT3pe4FFlN51jcw== + dependencies: + filesize "6.0.1" + handlebars "4.5.3" + lodash "4.17.15" + pretty-ms "5.1.0" + +newman@^5.2.3: + version "5.3.2" + resolved "https://registry.yarnpkg.com/newman/-/newman-5.3.2.tgz#1dfe94c9558210165697381b9dfce2c382c69d45" + integrity sha512-cWy8pV0iwvMOZLTw3hkAHcwo2ZA0GKkXm8oUMn1Ltii3ZI2nKpnrg9QGdIT0hGHChRkX6prY5e3Aar7uykMGNg== + dependencies: + async "3.2.3" + chardet "1.4.0" + cli-progress "3.10.0" + cli-table3 "0.6.1" + colors "1.4.0" + commander "7.2.0" + csv-parse "4.16.3" + eventemitter3 "4.0.7" + filesize "8.0.7" + lodash "4.17.21" + mkdirp "1.0.4" + postman-collection "4.1.1" + postman-collection-transformer "4.1.6" + postman-request "2.88.1-postman.31" + postman-runtime "7.29.0" + pretty-ms "7.0.1" + semver "7.3.5" + serialised-error "1.1.3" + tough-cookie "3.0.1" + word-wrap "1.2.3" + xmlbuilder "15.1.1" + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +nock@^10.0.6: + version "10.0.6" + resolved "https://registry.yarnpkg.com/nock/-/nock-10.0.6.tgz#e6d90ee7a68b8cfc2ab7f6127e7d99aa7d13d111" + integrity sha512-b47OWj1qf/LqSQYnmokNWM8D88KvUl2y7jT0567NB3ZBAZFz2bWp2PC81Xn7u8F2/vJxzkzNZybnemeFa7AZ2w== + dependencies: + chai "^4.1.2" + debug "^4.1.0" + deep-equal "^1.0.0" + json-stringify-safe "^5.0.1" + lodash "^4.17.5" + mkdirp "^0.5.0" + propagate "^1.0.0" + qs "^6.5.1" + semver "^5.5.0" + +node-oauth1@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/node-oauth1/-/node-oauth1-1.3.0.tgz#736d29f3c5fce2713ce1552c8beccb2a60df7b6f" + integrity sha512-0yggixNfrA1KcBwvh/Hy2xAS1Wfs9dcg6TdFf2zN7gilcAigMdrtZ4ybrBSXBgLvGDw9V1p2MRnGBMq7XjTWLg== + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +nyc@^14.0.0: + version "14.1.1" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-14.1.1.tgz#151d64a6a9f9f5908a1b73233931e4a0a3075eeb" + integrity sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw== + dependencies: + archy "^1.0.0" + caching-transform "^3.0.2" + convert-source-map "^1.6.0" + cp-file "^6.2.0" + find-cache-dir "^2.1.0" + find-up "^3.0.0" + foreground-child "^1.5.6" + glob "^7.1.3" + istanbul-lib-coverage "^2.0.5" + istanbul-lib-hook "^2.0.7" + istanbul-lib-instrument "^3.3.0" + istanbul-lib-report "^2.0.8" + istanbul-lib-source-maps "^3.0.6" + istanbul-reports "^2.2.4" + js-yaml "^3.13.1" + make-dir "^2.1.0" + merge-source-map "^1.1.0" + resolve-from "^4.0.0" + rimraf "^2.6.3" + signal-exit "^3.0.2" + spawn-wrap "^1.4.2" + test-exclude "^5.2.3" + uuid "^3.3.2" + yargs "^13.2.2" + yargs-parser "^13.0.0" + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-hash@^1.1.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" + integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== + +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-path@0.11.4: + version "0.11.4" + resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.4.tgz#370ae752fbf37de3ea70a861c23bba8915691949" + integrity sha512-ICbQN+aw/eAASDtaC7+SJXSAruz7fvvNjxMFfS3mTdvZaaiuuw81XXYu+9CSJeUVrS3YpRhTr862YGywMQUOWg== + +object.assign@^4.1.0, object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== + dependencies: + fn.name "1.x.x" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== + dependencies: + mimic-fn "^1.0.0" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g== + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.2: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +os-homedir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-3.0.0.tgz#50183f2d36c9e3e528ea0a8605dff57ce976f88e" + integrity sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA== + dependencies: + graceful-fs "^4.1.15" + hasha "^3.0.0" + lodash.flattendeep "^4.4.0" + release-zalgo "^1.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-ms@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.1.0.tgz#348565a753d4391fa524029956b172cb7753097d" + integrity sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA== + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== + +path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ== + dependencies: + pify "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +performance-now@2.1.0, performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pkg-conf@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.1.0.tgz#2126514ca6f2abfebd168596df18ba57867f0058" + integrity sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g== + dependencies: + find-up "^2.0.0" + load-json-file "^4.0.0" + +pkg-config@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pkg-config/-/pkg-config-1.1.1.tgz#557ef22d73da3c8837107766c52eadabde298fe4" + integrity sha512-ft/WI9YK6FuTuw4Ql+QUaNXtm/ASQNqDUUsZEgFZKyFpW6amyP8Gx01xrRs8KdiNbbqXfYxkOXplpq1euWbOjw== + dependencies: + debug-log "^1.0.0" + find-root "^1.0.0" + xtend "^4.0.1" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pluralize@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== + +postman-collection-transformer@4.1.6: + version "4.1.6" + resolved "https://registry.yarnpkg.com/postman-collection-transformer/-/postman-collection-transformer-4.1.6.tgz#2eecfb1a4e490fd698a1c915e0458731bdf9c5d3" + integrity sha512-xvdQb6sZoWcG9xZXUPSuxocjcd6WCZlINlGGiuHdSfxhgiwQhj9qhF0JRFbagZ8xB0+pYUairD5MiCENc6DEVA== + dependencies: + commander "8.3.0" + inherits "2.0.4" + lodash "4.17.21" + semver "7.3.5" + strip-json-comments "3.1.1" + +postman-collection@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/postman-collection/-/postman-collection-4.1.1.tgz#aba50dfca3c3ce6881b9598958c6a52eec3959d9" + integrity sha512-ODpJtlf8r99DMcTU7gFmi/yvQYckFzcuE6zL/fWnyrFT34ugdCBFlX+DN7M+AnP6lmR822fv5s60H4DnL4+fAg== + dependencies: + faker "5.5.3" + file-type "3.9.0" + http-reasons "0.1.0" + iconv-lite "0.6.3" + liquid-json "0.3.1" + lodash "4.17.21" + mime-format "2.0.1" + mime-types "2.1.34" + postman-url-encoder "3.0.5" + semver "7.3.5" + uuid "8.3.2" + +postman-request@2.88.1-postman.31: + version "2.88.1-postman.31" + resolved "https://registry.yarnpkg.com/postman-request/-/postman-request-2.88.1-postman.31.tgz#965a9ac3e6a504c55ab673898f081d76c12b7559" + integrity sha512-OJbYqP7ItxQ84yHyuNpDywCZB0HYbpHJisMQ9lb1cSL3N5H3Td6a2+3l/a74UMd3u82BiGC5yQyYmdOIETP/nQ== + dependencies: + "@postman/form-data" "~3.1.1" + "@postman/tunnel-agent" "^0.6.3" + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + brotli "~1.3.2" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + har-validator "~5.1.3" + http-signature "~1.3.1" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + stream-length "^1.0.2" + tough-cookie "~2.5.0" + uuid "^3.3.2" + +postman-runtime@7.29.0: + version "7.29.0" + resolved "https://registry.yarnpkg.com/postman-runtime/-/postman-runtime-7.29.0.tgz#ccc63f23d8f20918bf0fb667a59153503fa90de9" + integrity sha512-eXxHREE/fUpohkGPRgBY1YccSGx9cyW3mtGiPyIE4zD5fYzasgBHqW6kbEND3Xrd3yf/uht/YI1H8O7J1+A1+w== + dependencies: + async "3.2.3" + aws4 "1.11.0" + handlebars "4.7.7" + httpntlm "1.7.7" + js-sha512 "0.8.0" + lodash "4.17.21" + mime-types "2.1.34" + node-oauth1 "1.3.0" + performance-now "2.1.0" + postman-collection "4.1.1" + postman-request "2.88.1-postman.31" + postman-sandbox "4.0.6" + postman-url-encoder "3.0.5" + serialised-error "1.1.3" + tough-cookie "3.0.1" + uuid "8.3.2" + +postman-sandbox@4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/postman-sandbox/-/postman-sandbox-4.0.6.tgz#cc9453578f7320ae7c5061111157b9c81822830a" + integrity sha512-PPRanSNEE4zy3kO7CeSBHmAfJnGdD9ecHY/Mjh26CQuZZarGkNO8c0U/n+xX3+5M1BRNc82UYq6YCtdsSDqcng== + dependencies: + lodash "4.17.21" + teleport-javascript "1.0.0" + uvm "2.0.2" + +postman-url-encoder@3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/postman-url-encoder/-/postman-url-encoder-3.0.5.tgz#af2efee3bb7644e2b059d8a78bc8070fae0467a5" + integrity sha512-jOrdVvzUXBC7C+9gkIkpDJ3HIxOHTIqjpQ4C1EMt1ZGeMvSEpbFCKq23DEfgsj46vMnDgyQf+1ZLp2Wm+bKSsA== + dependencies: + punycode "^2.1.1" + +precond@0.2: + version "0.2.3" + resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac" + integrity sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + +pretty-ms@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-5.1.0.tgz#b906bdd1ec9e9799995c372e2b1c34f073f95384" + integrity sha512-4gaK1skD2gwscCfkswYQRmddUb2GJZtzDGRjHWadVHtK/DIKFufa12MvES6/xu1tVbUYeia5bmLcwJtZJQUqnw== + dependencies: + parse-ms "^2.1.0" + +pretty-ms@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-7.0.1.tgz#7d903eaab281f7d8e03c66f867e239dc32fb73e8" + integrity sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q== + dependencies: + parse-ms "^2.1.0" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +prop-types@^15.6.2: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +propagate@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/propagate/-/propagate-1.0.0.tgz#00c2daeedda20e87e3782b344adba1cddd6ad709" + integrity sha512-T/rqCJJaIPYObiLSmaDsIf4PGA7y+pkgYFHmwoXQyOHiDDSO1YCxcztNiRBmV4EZha4QIbID3vQIHkqKu5k0Xg== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +pseudomap@^1.0.1, pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== + +psl@^1.1.28: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== + +punycode@2.x.x, punycode@^2.1.0, punycode@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +q@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +qs@^6.11.0, qs@^6.5.1: + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + dependencies: + side-channel "^1.0.4" + +qs@~6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +r7insight_node@^1.8.4: + version "1.8.4" + resolved "https://registry.yarnpkg.com/r7insight_node/-/r7insight_node-1.8.4.tgz#875633032137545b3cc7c80763baf09f6ba66801" + integrity sha512-6cQrzLkaOxdv/SRFXWRJjgFr8a3nXUOT/4IMFuBv+mWzBnu5DJl+HzONAsWYvclrlZnvfa54PaIPqPuPRSlbrQ== + dependencies: + babel-runtime "6.6.1" + codependency "0.1.4" + json-stringify-safe "5.0.1" + lodash "4.17.15" + reconnect-core "1.3.0" + semver "5.1.0" + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w== + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== + dependencies: + find-up "^3.0.0" + read-pkg "^3.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA== + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +readable-stream@^2.3.5: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +reconnect-core@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/reconnect-core/-/reconnect-core-1.3.0.tgz#fbae52919a7877d844e3246d01a2f26701c833c8" + integrity sha512-+gLKwmyRf2tjl6bLR03DoeWELzyN6LW9Xgr3vh7NXHHwPi0JC0N2TwPyf90oUEBkCRcD+bgQ+s3HORoG3nwHDg== + dependencies: + backoff "~2.5.0" + +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3: + version "1.5.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + functions-have-names "^1.2.3" + +regexpp@^2.0.0, regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +release-zalgo@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" + integrity sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA== + dependencies: + es6-error "^4.0.1" + +request@^2.88.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +require-uncached@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + integrity sha512-Xct+41K3twrbBHdxAgMoOS+cNcoqIjfM2/VxBF4LL2hVph7YsF8VSKyQ3BDFZwEVbok9yeDl2le/qo0S77WG2w== + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + integrity sha512-kT10v4dhrlLNcnO084hEjvXCI1wUG9qZLoz2RogxqDQQYy7IxjI/iMUkOtQTNEh6rzHxvdQWHsJyel1pKOVCxg== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.10.0, resolve@^1.22.1, resolve@^1.6.0, resolve@^1.8.1: + version "1.22.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + dependencies: + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +rimraf@^2.6.2, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@~2.4.0: + version "2.4.5" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.4.5.tgz#ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da" + integrity sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ== + dependencies: + glob "^6.0.1" + +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +run-async@^2.2.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^5.5.2: + version "5.5.12" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc" + integrity sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw== + dependencies: + symbol-observable "1.0.1" + +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-json-stringify@~1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz#356e44bc98f1f93ce45df14bcd7c01cda86e0afd" + integrity sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg== + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +safe-stable-stringify@^2.3.1: + version "2.4.3" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" + integrity sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA== + +sax@>=0.6.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +secure-json-parse@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-2.7.0.tgz#5a5f9cd6ae47df23dba3151edd06855d47e09862" + integrity sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw== + +"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.1.tgz#9fb3f4004f900d83c47968fe42f7583e05832cc9" + integrity sha512-Ne6/HdGZvvpXBdjW3o8J0pvxC2jnmVNBK7MKkMgsOBfrsIdTXfA5x+H9DUbQ2xzyvnLv0A0v9x8R4B40xNZIRQ== + +semver@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.1.0.tgz#85f2cf8550465c4df000cf7d86f6b054106ab9e5" + integrity sha512-sfKXKhcz5XVyfUZa2V4RbjK0xjOJCMLNF9H4p4v0UCo9wNHM/lH9RDuyDbGEtxWLMDlPBc8xI7AbbVLKXty+rQ== + +semver@7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +semver@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.8: + version "7.5.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" + integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== + dependencies: + lru-cache "^6.0.0" + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialised-error@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/serialised-error/-/serialised-error-1.1.3.tgz#8a4c466b29c26ff11016eaf1b5fa2b87ca4cd8b5" + integrity sha512-vybp3GItaR1ZtO2nxZZo8eOo7fnVaNtP3XE2vJKgzkKR2bagCkdJ1EpYYhEMd3qu/80DwQk9KjsNSxE3fXWq0g== + dependencies: + object-hash "^1.1.2" + stack-trace "0.0.9" + uuid "^3.0.0" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + +should-equal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-2.0.0.tgz#6072cf83047360867e68e98b09d71143d04ee0c3" + integrity sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA== + dependencies: + should-type "^1.4.0" + +should-format@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/should-format/-/should-format-3.0.3.tgz#9bfc8f74fa39205c53d38c34d717303e277124f1" + integrity sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q== + dependencies: + should-type "^1.3.0" + should-type-adaptors "^1.0.1" + +should-type-adaptors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz#401e7f33b5533033944d5cd8bf2b65027792e27a" + integrity sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA== + dependencies: + should-type "^1.3.0" + should-util "^1.0.0" + +should-type@^1.3.0, should-type@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/should-type/-/should-type-1.4.0.tgz#0756d8ce846dfd09843a6947719dfa0d4cff5cf3" + integrity sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ== + +should-util@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/should-util/-/should-util-1.0.1.tgz#fb0d71338f532a3a149213639e2d32cbea8bcb28" + integrity sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g== + +should@^13.2.3: + version "13.2.3" + resolved "https://registry.yarnpkg.com/should/-/should-13.2.3.tgz#96d8e5acf3e97b49d89b51feaa5ae8d07ef58f10" + integrity sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ== + dependencies: + should-equal "^2.0.0" + should-format "^3.0.3" + should-type "^1.4.0" + should-type-adaptors "^1.0.1" + should-util "^1.0.0" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + +slice-ansi@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== + dependencies: + is-fullwidth-code-point "^2.0.0" + +source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spawn-wrap@^1.4.2: + version "1.4.3" + resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.4.3.tgz#81b7670e170cca247d80bf5faf0cfb713bdcf848" + integrity sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw== + dependencies: + foreground-child "^1.5.6" + mkdirp "^0.5.0" + os-homedir "^1.0.1" + rimraf "^2.6.2" + signal-exit "^3.0.2" + which "^1.3.0" + +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.13" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" + integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +sshpk@^1.14.1, sshpk@^1.7.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +stack-trace@0.0.9: + version "0.0.9" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" + integrity sha512-vjUc6sfgtgY0dxCdnc40mK6Oftjo9+2K8H/NG81TMhgL392FtiPA9tn9RLyTxXmTLPJPjF3VyzFp6bsWFLisMQ== + +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== + +standard-engine@~9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-9.0.0.tgz#d3a3d74c4c1b91f51a1e66362465261ca7610316" + integrity sha512-ZfNfCWZ2Xq67VNvKMPiVMKHnMdvxYzvZkf1AH8/cw2NLDBm5LRsxMqvEJpsjLI/dUosZ3Z1d6JlHDp5rAvvk2w== + dependencies: + deglob "^2.1.0" + get-stdin "^6.0.0" + minimist "^1.1.0" + pkg-conf "^2.0.0" + +standard@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/standard/-/standard-12.0.1.tgz#0fc5a8aa6c34c546c5562aae644242b24dae2e61" + integrity sha512-UqdHjh87OG2gUrNCSM4QRLF5n9h3TFPwrCNyVlkqu31Hej0L/rc8hzKqVvkb2W3x0WMq7PzZdkLfEcBhVOR6lg== + dependencies: + eslint "~5.4.0" + eslint-config-standard "12.0.0" + eslint-config-standard-jsx "6.0.2" + eslint-plugin-import "~2.14.0" + eslint-plugin-node "~7.0.1" + eslint-plugin-promise "~4.0.0" + eslint-plugin-react "~7.11.1" + eslint-plugin-standard "~4.0.0" + standard-engine "~9.0.0" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +stream-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stream-length/-/stream-length-1.0.2.tgz#8277f3cbee49a4daabcfdb4e2f4a9b5e9f2c9f00" + integrity sha512-aI+qKFiwoDV4rsXiS7WRoCt+v2RX1nUj17+KJC5r2gfh5xoSJIfP6Y3Do/HtvesFcTSWthIuJ3l1cvKQY/+nZg== + dependencies: + bluebird "^2.6.2" + +string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-json-comments@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +superagent@^3.8.3: + version "3.8.3" + resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.8.3.tgz#460ea0dbdb7d5b11bc4f78deba565f86a178e128" + integrity sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA== + dependencies: + component-emitter "^1.2.0" + cookiejar "^2.1.0" + debug "^3.1.0" + extend "^3.0.0" + form-data "^2.3.1" + formidable "^1.2.0" + methods "^1.1.1" + mime "^1.4.1" + qs "^6.5.1" + readable-stream "^2.3.5" + +superagent@^8.0.9: + version "8.0.9" + resolved "https://registry.yarnpkg.com/superagent/-/superagent-8.0.9.tgz#2c6fda6fadb40516515f93e9098c0eb1602e0535" + integrity sha512-4C7Bh5pyHTvU33KpZgwrNKh/VQnvgtCSqPRfJAUdmrtSYePVzVg4E4OzsrbkhJj9O7SO6Bnv75K/F8XVZT8YHA== + dependencies: + component-emitter "^1.3.0" + cookiejar "^2.1.4" + debug "^4.3.4" + fast-safe-stringify "^2.1.1" + form-data "^4.0.0" + formidable "^2.1.2" + methods "^1.1.2" + mime "2.6.0" + qs "^6.11.0" + semver "^7.3.8" + +supports-color@5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" + integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w== + dependencies: + has-flag "^3.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +swagger-ui-dist@>=4.11.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/swagger-ui-dist/-/swagger-ui-dist-5.1.0.tgz#b01b3be06bebb2566b2df586c1632d502ec792ad" + integrity sha512-c1KmAjuVODxw+vwkNLALQZrgdlBAuBbr2xSPfYrJgseEi7gFKcTvShysPmyuDI4kcUa1+5rFpjWvXdusKY74mg== + +swagger-ui-express@^4.1.3: + version "4.6.3" + resolved "https://registry.yarnpkg.com/swagger-ui-express/-/swagger-ui-express-4.6.3.tgz#870d0892654fe80e6970a2d680e22521acd2dc19" + integrity sha512-CDje4PndhTD2HkgyKH3pab+LKspDeB/NhPN2OF1j+piYIamQqBYwAXWESOT1Yju2xFg51bRW9sUng2WxDjzArw== + dependencies: + swagger-ui-dist ">=4.11.0" + +symbol-observable@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" + integrity sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw== + +table@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc" + integrity sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg== + dependencies: + ajv "^6.0.1" + ajv-keywords "^3.0.0" + chalk "^2.1.0" + lodash "^4.17.4" + slice-ansi "1.0.0" + string-width "^2.1.1" + +tc-api-testing-lib@topcoder-platform/api-automated-testing.git: + version "1.0.0" + resolved "https://codeload.github.com/topcoder-platform/api-automated-testing/tar.gz/4a2a7a1b5461672bf6efbad4c2d186e33ec81269" + dependencies: + axios "^0.21.1" + config "^3.3.6" + handlebars "^4.7.7" + joi "^17.4.0" + lodash "^4.17.21" + newman "^5.2.3" + newman-reporter-html "^1.0.5" + tc-core-library-js appirio-tech/tc-core-library-js.git#v2.6.4 + winston "^3.3.3" + +tc-bus-api-wrapper@topcoder-platform/tc-bus-api-wrapper.git: + version "1.2.0" + resolved "https://codeload.github.com/topcoder-platform/tc-bus-api-wrapper/tar.gz/f8cbd335a0e0b4d6edd7cae859473593271fd97f" + dependencies: + joi "^13.4.0" + lodash "^4.17.15" + superagent "^3.8.3" + tc-core-library-js appirio-tech/tc-core-library-js.git#v2.6.4 + +tc-core-library-js@appirio-tech/tc-core-library-js.git#v2.6.4: + version "2.4.1" + resolved "https://codeload.github.com/appirio-tech/tc-core-library-js/tar.gz/df0b36c51cf80918194cbff777214b3c0cf5a151" + dependencies: + axios "^0.19.0" + bunyan "^1.8.12" + jsonwebtoken "^8.5.1" + jwks-rsa "^1.6.0" + lodash "^4.17.15" + millisecond "^0.1.2" + r7insight_node "^1.8.4" + request "^2.88.0" + +tc-core-library-js@appirio-tech/tc-core-library-js.git#v2.6.6: + version "2.4.1" + resolved "https://codeload.github.com/appirio-tech/tc-core-library-js/tar.gz/c4ab01f468a98dc7e22f188a176794b5ea4f2f9d" + dependencies: + axios "^0.19.0" + bunyan "^1.8.12" + jsonwebtoken "^8.5.1" + jwks-rsa "^1.6.0" + lodash "^4.17.15" + millisecond "^0.1.2" + r7insight_node "^1.8.4" + request "^2.88.0" + +teleport-javascript@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/teleport-javascript/-/teleport-javascript-1.0.0.tgz#c9397fad598d662027e4d3a5fa7e7da1c8361547" + integrity sha512-j1llvWVFyEn/6XIFDfX5LAU43DXe0GCt3NfXDwJ8XpRRMkS+i50SAkonAONBy+vxwPFBd50MFU8a2uj8R/ccLg== + +test-exclude@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" + integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + read-pkg-up "^4.0.0" + require-main-filename "^2.0.0" + +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +topo@3.x.x: + version "3.0.3" + resolved "https://registry.yarnpkg.com/topo/-/topo-3.0.3.tgz#d5a67fb2e69307ebeeb08402ec2a2a6f5f7ad95c" + integrity sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ== + dependencies: + hoek "6.x.x" + +tough-cookie@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" + integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== + dependencies: + ip-regex "^2.1.0" + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +triple-beam@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" + integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + +type-detect@^4.0.0, type-detect@^4.0.5: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +uglify-js@^3.1.4: + version "3.17.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" + integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +underscore@~1.12.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e" + integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw== + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" + integrity sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ== + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util@^0.12.4: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + +uuid@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.0.0.tgz#bc6ccf91b5ff0ac07bbcdbf1c7c4e150db4dbb6c" + integrity sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw== + +uuid@8.3.2, uuid@^8.3.0: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +uuid@^3.0.0, uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uvm@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/uvm/-/uvm-2.0.2.tgz#45fbef1b360cd462cb1a886ea8b4a882562c4aab" + integrity sha512-Ra+aPiS5GXAbwXmyNExqdS42sTqmmx4XWEDF8uJlsTfOkKf9Rd9xNgav1Yckv4HfVEZg4iOFODWHFYuJ+9Fzfg== + dependencies: + flatted "3.1.1" + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-module@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== + +which-typed-array@^1.1.2, which-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + +which@^1.2.9, which@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +winston-transport@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.5.0.tgz#6e7b0dd04d393171ed5e4e4905db265f7ab384fa" + integrity sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q== + dependencies: + logform "^2.3.2" + readable-stream "^3.6.0" + triple-beam "^1.3.0" + +winston@^3.2.1, winston@^3.3.3: + version "3.9.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.9.0.tgz#2bbdeb8167a75fac6d9a0c6d002890cd908016c2" + integrity sha512-jW51iW/X95BCW6MMtZWr2jKQBP4hV5bIDq9QrIjfDk6Q9QuxvTKEAlpUNAzP+HYHFFCeENhph16s0zEunu4uuQ== + dependencies: + "@colors/colors" "1.5.0" + "@dabh/diagnostics" "^2.0.2" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.4.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + safe-stable-stringify "^2.3.1" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.5.0" + +word-wrap@1.2.3, word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw== + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^2.4.2: + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + integrity sha512-CJ17OoULEKXpA5pef3qLj5AxTJ6mSt7g84he2WIskKwqFO4T97d5V7Tadl0DYDk7qyUOQD5WlUlOMChaYrhxeA== + dependencies: + mkdirp "^0.5.1" + +xml2js@0.4.19: + version "0.4.19" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" + integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== + dependencies: + sax ">=0.6.0" + xmlbuilder "~9.0.1" + +xml2js@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.5.0.tgz#d9440631fbb2ed800203fad106f2724f62c493b7" + integrity sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@15.1.1: + version "15.1.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" + integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +xmlbuilder@~9.0.1: + version "9.0.7" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + integrity sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ== + +xss@^1.0.7: + version "1.0.14" + resolved "https://registry.yarnpkg.com/xss/-/xss-1.0.14.tgz#4f3efbde75ad0d82e9921cc3c95e6590dd336694" + integrity sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw== + dependencies: + commander "^2.20.3" + cssfilter "0.0.10" + +xtend@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +yallist@^2.0.0, yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yamljs@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/yamljs/-/yamljs-0.3.0.tgz#dc060bf267447b39f7304e9b2bfbe8b5a7ddb03b" + integrity sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ== + dependencies: + argparse "^1.0.7" + glob "^7.0.5" + +yargs-parser@^13.0.0, yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@^13.2.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.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 "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2"