diff --git a/README.md b/README.md
index 647f29f..70d9634 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,6 @@
## Dependencies
- Nodejs(v12+)
-- ElasticSearch
- Kafka
## Configuration
@@ -22,41 +21,10 @@ The following parameters can be set in config files or in env variables:
if provided, it can be either path to private key file or private key content
- `KAFKA_MESSAGE_ORIGINATOR`: The originator value for the kafka messages
- `KAFKA_GROUP_ID`: the Kafka group id
-- `topics.KAFKA_ERROR_TOPIC`: the error topic at which bus api will publish any errors
- `topics.TAAS_JOB_CREATE_TOPIC`: the create job entity Kafka message topic
- `topics.TAAS_JOB_UPDATE_TOPIC`: the update job entity Kafka message topic
-- `topics.TAAS_JOB_DELETE_TOPIC`: the delete job entity Kafka message topic
-- `topics.TAAS_JOB_CANDIDATE_CREATE_TOPIC`: the create job candidate entity Kafka message topic
- `topics.TAAS_JOB_CANDIDATE_UPDATE_TOPIC`: the update job candidate entity Kafka message topic
-- `topics.TAAS_JOB_CANDIDATE_DELETE_TOPIC`: the delete job candidate entity Kafka message topic
-- `topics.TAAS_RESOURCE_BOOKING_CREATE_TOPIC`: the create resource booking entity Kafka message topic
-- `topics.TAAS_RESOURCE_BOOKING_UPDATE_TOPIC`: the update resource booking entity Kafka message topic
-- `topics.TAAS_RESOURCE_BOOKING_DELETE_TOPIC`: the delete resource booking entity Kafka message topic
-- `topics.TAAS_WORK_PERIOD_CREATE_TOPIC`: the create work period entity Kafka message topic
-- `topics.TAAS_WORK_PERIOD_UPDATE_TOPIC`: the update work period entity Kafka message topic
-- `topics.TAAS_WORK_PERIOD_DELETE_TOPIC`: the delete work period entity Kafka message topic
-- `topics.TAAS_WORK_PERIOD_PAYMENT_CREATE_TOPIC`: the create work period payment entity Kafka message topic
-- `topics.TAAS_WORK_PERIOD_PAYMENT_UPDATE_TOPIC`: the update work period payment entity Kafka message topic
-- `topics.TAAS_INTERVIEW_REQUEST_TOPIC`: the request interview entity Kafka message topic
-- `topics.TAAS_INTERVIEW_UPDATE_TOPIC`: the update interview entity Kafka message topic
-- `topics.TAAS_INTERVIEW_BULK_UPDATE_TOPIC`: the bulk update interview entity Kafka message topic
-- `topics.TAAS_ROLE_CREATE_TOPIC`: the create role entity Kafka message topic
-- `topics.TAAS_ROLE_UPDATE_TOPIC`: the update role entity Kafka message topic
-- `topics.TAAS_ROLE_DELETE_TOPIC`: the delete role entity Kafka message topic
-- `topics.TAAS_ACTION_RETRY_TOPIC`: the retry process Kafka message topic
-- `MAX_RETRY`: maximum allowed retry count for failed operations for sending `taas.action.retry` message
-- `BASE_RETRY_DELAY`: base amount of retry delay (ms) for failed operations
-- `BUSAPI_URL`: Topcoder Bus API URL
-- `esConfig.HOST`: Elasticsearch host
-- `esConfig.AWS_REGION`: The Amazon region to use when using AWS Elasticsearch service
-- `esConfig.ELASTICCLOUD.id`: The elastic cloud id, if your elasticsearch instance is hosted on elastic cloud. DO NOT provide a value for ES_HOST if you are using this
-- `esConfig.ELASTICCLOUD.username`: The elastic cloud username for basic authentication. Provide this only if your elasticsearch instance is hosted on elastic cloud
-- `esConfig.ELASTICCLOUD.password`: The elastic cloud password for basic authentication. Provide this only if your elasticsearch instance is hosted on elastic cloud
-- `esConfig.ES_INDEX_JOB`: the index name for job
-- `esConfig.ES_INDEX_JOB_CANDIDATE`: the index name for job candidate
-- `esConfig.ES_INDEX_RESOURCE_BOOKING`: the index name for resource booking
-- `esConfig.ES_INDEX_ROLE`: the index name for role
-
+- `TAAS_API_URL`: the taas api url
- `auth0.AUTH0_URL`: Auth0 URL, used to get TC M2M token
- `auth0.AUTH0_AUDIENCE`: Auth0 audience, used to get TC M2M token
- `auth0.AUTH0_CLIENT_ID`: Auth0 client id, used to get TC M2M token
@@ -71,7 +39,7 @@ The following parameters can be set in config files or in env variables:
- `zapier.ZAPIER_JOB_CANDIDATE_SWITCH`: decides whether posting job candidate related message to zapier or not; possible values are `ON` and `OFF`, default is `OFF`
- `zapier.ZAPIER_JOB_CANDIDATE_WEBHOOK`: the remote zapier zap webhook url for posting job candidate related message
-## Local Kafka and ElasticSearch setup
+## Local Kafka setup
1. Navigate to the directory `local`
@@ -81,30 +49,21 @@ The following parameters can be set in config files or in env variables:
docker-compose up -d
```
-3. initialize Elasticsearch, create configured Elasticsearch index:
-
- ``` bash
- npm run delete-index # run this if you already created index
- npm run create-index
- ```
-
## Local deployment
-0. Make sure that Kafka and Elasticsearch is running as per instructions above.
-
-1. Make sure to use Node v12+ by command `node -v`. We recommend using [NVM](https://github.com/nvm-sh/nvm) to quickly switch to the right version:
+0. Make sure to use Node v12+ by command `node -v`. We recommend using [NVM](https://github.com/nvm-sh/nvm) to quickly switch to the right version:
```bash
nvm use
```
-2. From the project root directory, run the following command to install the dependencies
+1. From the project root directory, run the following command to install the dependencies
```bash
npm install
```
-3. To run linters if required
+2. To run linters if required
```bash
npm run lint
@@ -116,7 +75,7 @@ The following parameters can be set in config files or in env variables:
npm run lint:fix
```
-4. Local config
+3. Local config
In the `taas-es-processor` root directory create `.env` file with the next environment variables. Values for **Auth0 config** should be shared with you on the forum.
@@ -131,7 +90,7 @@ The following parameters can be set in config files or in env variables:
- Values from this file would be automatically used by many `npm` commands.
- ⚠️ Never commit this file or its copy to the repository!
-5. Start the processor and health check dropin
+4. Start the processor and health check dropin
```bash
npm start
@@ -145,7 +104,7 @@ To run the processor using docker, follow the below steps
2. Rename the file `sample.api.env` to `api.env`
-3. Set the required Kafka url and ElasticSearch host in the file `api.env`.
+3. Set the required Kafka url in the file `api.env`.
Note that you can also add other variables to `api.env`, with `=` format per line.
If using AWS ES you should add `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` variables as well.
@@ -158,20 +117,3 @@ To run the processor using docker, follow the below steps
```
5. When you are running the application for the first time, It will take some time initially to download the image and install the dependencies
-
-## Unit Tests and E2E Tests
-
-### Unit Tests
-- Run `npm run test` to execute unit tests.
-- Run `npm run test:cov` to execute unit tests and generate coverage report.
-
-### E2E Tests
-Before running e2e tests, make sure index are created and the processor app is not running. Existing documents will be remove
-from ES before and after tests.
-
-- RUN `npm run e2e` to execute e2e tests.
-- RUN `npm run e2e:cov` to execute e2e tests and generate coverage report.
-
-## Verification
-
-see [VERIFICATION.md](VERIFICATION.md)
diff --git a/VERIFICATION.md b/VERIFICATION.md
deleted file mode 100644
index d6696f1..0000000
--- a/VERIFICATION.md
+++ /dev/null
@@ -1,64 +0,0 @@
-# Verification
-
-## Create documents in ES
-
-- Run the following commands to create `Job`, `JobCandidate`, `Interview`, `ResourceBooking`, `WorkPeriod`, `WorkPeriodPayment`, `Role` documents in ES.
-
- ``` bash
- # for Job
- docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.job.create < test/messages/taas.job.create.event.json
- # for JobCandidate
- docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.jobcandidate.create < test/messages/taas.jobcandidate.create.event.json
- # for Interview
- docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.interview.requested < test/messages/taas.interview.requested.event.json
- # for ResourceBooking
- docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.resourcebooking.create < test/messages/taas.resourcebooking.create.event.json
- # for WorkPeriod
- docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.workperiod.create < test/messages/taas.workperiod.create.event.json
- # for WorkPeriodPayment
- docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.workperiodpayment.create < test/messages/taas.workperiodpayment.create.event.json
- # for Role
- docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.role.requested < test/messages/taas.role.create.event.json
- ```
-
-- Run `npm run view-data ` to see if documents were created.
-
-## Update documents in ES
-- Run the following commands to update `Job`, `JobCandidate`, `Interview`, `ResourceBooking`, `WorkPeriod`, `WorkPeriodPayment`, `Role` documents in ES.
-
- ``` bash
- # for Job
- docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.job.update < test/messages/taas.job.update.event.json
- # for JobCandidate
- docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.jobcandidate.update < test/messages/taas.jobcandidate.update.event.json
- # for Interview
- docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.interview.update < test/messages/taas.interview.update.event.json
- # for ResourceBooking
- docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.resourcebooking.update < test/messages/taas.resourcebooking.update.event.json
- # for WorkPeriod
- docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.workperiod.update < test/messages/taas.workperiod.update.event.json
- # for WorkPeriodPayment
- docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.workperiodpayment.update < test/messages/taas.workperiodpayment.update.event.json
- # for Role
- docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.role.update < test/messages/taas.role.update.event.json
- ```
-
-- Run `npm run view-data ` to see if documents were updated.
-
-## Delete documents in ES
-- Run the following commands to delete `Job`, `JobCandidate`, `ResourceBooking`, `WorkPeriod`, `Role` documents in ES.
-
- ``` bash
- # for Job
- docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.job.delete < test/messages/taas.job.delete.event.json
- # for JobCandidate
- docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.jobcandidate.delete < test/messages/taas.jobcandidate.delete.event.json
- # for ResourceBooking
- docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.resourcebooking.delete < test/messages/taas.resourcebooking.delete.event.json
- # for WorkPeriod
- docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.workperiod.delete < test/messages/taas.workperiod.delete.event.json
- # for Role
- docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.role.delete < test/messages/taas.role.delete.event.json
- ```
-
-- Run `npm run view-data ` to see if documents were deleted.
diff --git a/config/default.js b/config/default.js
index 059ecdc..a8dcf10 100644
--- a/config/default.js
+++ b/config/default.js
@@ -17,62 +17,14 @@ module.exports = {
// The originator value for the kafka messages
KAFKA_MESSAGE_ORIGINATOR: process.env.KAFKA_MESSAGE_ORIGINATOR || 'taas-es-processor',
+ TAAS_API_URL: process.env.TAAS_API_URL || 'https://api.topcoder-dev.com/v5',
+
topics: {
- // The error topic at which bus api will publish any errors
- KAFKA_ERROR_TOPIC: process.env.KAFKA_ERROR_TOPIC || 'common.error.reporting',
// topics for job service
TAAS_JOB_CREATE_TOPIC: process.env.TAAS_JOB_CREATE_TOPIC || 'taas.job.create',
TAAS_JOB_UPDATE_TOPIC: process.env.TAAS_JOB_UPDATE_TOPIC || 'taas.job.update',
- TAAS_JOB_DELETE_TOPIC: process.env.TAAS_JOB_DELETE_TOPIC || 'taas.job.delete',
// topics for jobcandidate service
- TAAS_JOB_CANDIDATE_CREATE_TOPIC: process.env.TAAS_JOB_CANDIDATE_CREATE_TOPIC || 'taas.jobcandidate.create',
- TAAS_JOB_CANDIDATE_UPDATE_TOPIC: process.env.TAAS_JOB_CANDIDATE_UPDATE_TOPIC || 'taas.jobcandidate.update',
- TAAS_JOB_CANDIDATE_DELETE_TOPIC: process.env.TAAS_JOB_CANDIDATE_DELETE_TOPIC || 'taas.jobcandidate.delete',
- // topics for resource booking service
- TAAS_RESOURCE_BOOKING_CREATE_TOPIC: process.env.TAAS_RESOURCE_BOOKING_CREATE_TOPIC || 'taas.resourcebooking.create',
- TAAS_RESOURCE_BOOKING_UPDATE_TOPIC: process.env.TAAS_RESOURCE_BOOKING_UPDATE_TOPIC || 'taas.resourcebooking.update',
- TAAS_RESOURCE_BOOKING_DELETE_TOPIC: process.env.TAAS_RESOURCE_BOOKING_DELETE_TOPIC || 'taas.resourcebooking.delete',
- // topics for work period service
- TAAS_WORK_PERIOD_CREATE_TOPIC: process.env.TAAS_WORK_PERIOD_CREATE_TOPIC || 'taas.workperiod.create',
- TAAS_WORK_PERIOD_UPDATE_TOPIC: process.env.TAAS_WORK_PERIOD_UPDATE_TOPIC || 'taas.workperiod.update',
- TAAS_WORK_PERIOD_DELETE_TOPIC: process.env.TAAS_WORK_PERIOD_DELETE_TOPIC || 'taas.workperiod.delete',
- // topics for work period payment service
- TAAS_WORK_PERIOD_PAYMENT_CREATE_TOPIC: process.env.TAAS_WORK_PERIOD_PAYMENT_CREATE_TOPIC || 'taas.workperiodpayment.create',
- TAAS_WORK_PERIOD_PAYMENT_UPDATE_TOPIC: process.env.TAAS_WORK_PERIOD_PAYMENT_UPDATE_TOPIC || 'taas.workperiodpayment.update',
- // topics for interview service
- TAAS_INTERVIEW_REQUEST_TOPIC: process.env.TAAS_INTERVIEW_REQUEST_TOPIC || 'taas.interview.requested',
- TAAS_INTERVIEW_UPDATE_TOPIC: process.env.TAAS_INTERVIEW_UPDATE_TOPIC || 'taas.interview.update',
- TAAS_INTERVIEW_BULK_UPDATE_TOPIC: process.env.TAAS_INTERVIEW_BULK_UPDATE_TOPIC || 'taas.interview.bulkUpdate',
- // topics for role service
- TAAS_ROLE_CREATE_TOPIC: process.env.TAAS_ROLE_CREATE_TOPIC || 'taas.role.requested',
- TAAS_ROLE_UPDATE_TOPIC: process.env.TAAS_ROLE_UPDATE_TOPIC || 'taas.role.update',
- TAAS_ROLE_DELETE_TOPIC: process.env.TAAS_ROLE_DELETE_TOPIC || 'taas.role.delete',
- // special kafka topics
- TAAS_ACTION_RETRY_TOPIC: process.env.TAAS_ACTION_RETRY_TOPIC || 'taas.action.retry'
-
- },
- // maximum allowed retry count for failed operations for sending `action.retry` message
- MAX_RETRY: process.env.MAX_RETRY || 3,
- // base amount of retry delay for failed operations
- BASE_RETRY_DELAY: process.env.BASE_RETRY_DELAY || 500,
- // Topcoder Bus API URL
- BUSAPI_URL: process.env.BUSAPI_URL || 'https://api.topcoder-dev.com/v5',
-
- esConfig: {
- HOST: process.env.ES_HOST || 'http://localhost:9200',
-
- ELASTICCLOUD: {
- id: process.env.ELASTICCLOUD_ID,
- username: process.env.ELASTICCLOUD_USERNAME,
- password: process.env.ELASTICCLOUD_PASSWORD
- },
-
- AWS_REGION: process.env.AWS_REGION || 'us-east-1', // AWS Region to be used if we use AWS ES
-
- ES_INDEX_JOB: process.env.ES_INDEX_JOB || 'job',
- ES_INDEX_JOB_CANDIDATE: process.env.ES_INDEX_JOB_CANDIDATE || 'job_candidate',
- ES_INDEX_RESOURCE_BOOKING: process.env.ES_INDEX_RESOURCE_BOOKING || 'resource_booking',
- ES_INDEX_ROLE: process.env.ES_INDEX_ROLE || 'role'
+ TAAS_JOB_CANDIDATE_UPDATE_TOPIC: process.env.TAAS_JOB_CANDIDATE_UPDATE_TOPIC || 'taas.jobcandidate.update'
},
auth0: {
diff --git a/config/test.js b/config/test.js
deleted file mode 100644
index c5b51db..0000000
--- a/config/test.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/**
- * The default configuration file.
- */
-
-module.exports = {
- zapier: {
- ZAPIER_SWITCH: process.env.ZAPIER_SWITCH || 'ON',
- ZAPIER_JOB_CANDIDATE_SWITCH: process.env.ZAPIER_JOB_CANDIDATE_SWITCH || 'ON'
- },
- // don't retry actions during tests because tests for now don't expect it and should be updated first
- MAX_RETRY: 0
-}
diff --git a/local/docker-compose.yml b/local/docker-compose.yml
index 936f378..8e00830 100644
--- a/local/docker-compose.yml
+++ b/local/docker-compose.yml
@@ -12,12 +12,5 @@ services:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: localhost
- KAFKA_CREATE_TOPICS: "taas.job.create:1:1,taas.jobcandidate.create:1:1,taas.interview.requested:1:1,taas.resourcebooking.create:1:1,taas.workperiod.create:1:1,taas.workperiodpayment.create:1:1,taas.job.update:1:1,taas.jobcandidate.update:1:1,taas.interview.update:1:1,taas.interview.bulkUpdate:1:1,taas.resourcebooking.update:1:1,taas.workperiod.update:1:1,taas.workperiodpayment.update:1:1,taas.job.delete:1:1,taas.jobcandidate.delete:1:1,taas.resourcebooking.delete:1:1,taas.workperiod.delete:1:1"
+ KAFKA_CREATE_TOPICS: "taas.job.create:1:1,taas.job.update:1:1,taas.jobcandidate.update:1:1"
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
- esearch:
- image: elasticsearch:7.7.1
- container_name: taas-es-processor_es
- ports:
- - "9200:9200"
- environment:
- - discovery.type=single-node
diff --git a/package-lock.json b/package-lock.json
index fec285f..39f9593 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -4,177 +4,6 @@
"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.5.0",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.0.tgz",
- "integrity": "sha512-1TTVrt7J9rcG5PMjvO7VEG3FrEoEJNHxumRq66GemPmzboLWtIjjcJgk8rokuAS7IiRSpgVSu5Vb9lc99iJkOA==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.5.0",
- "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.5.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz",
- "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.0",
- "esutils": "^2.0.2",
- "js-tokens": "^4.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "@babel/parser": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.0.tgz",
- "integrity": "sha512-I5nW8AhGpOXGCCNYGc+p7ExQIBxRFnS2fd/d862bNOKvmoEPjYPcfIjsfdy0ujagYOIYPczKgD9l3FsgTkAzKA==",
- "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.5.0",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.0.tgz",
- "integrity": "sha512-SnA9aLbyOCcnnbQEGwdfBggnc142h/rbqqsXcaATj2hZcegCl903pUD/lfpsNBlBSuWow/YDfRyJuWi2EPR5cg==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "@babel/generator": "^7.5.0",
- "@babel/helper-function-name": "^7.1.0",
- "@babel/helper-split-export-declaration": "^7.4.4",
- "@babel/parser": "^7.5.0",
- "@babel/types": "^7.5.0",
- "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"
- }
- }
- }
- },
- "@babel/types": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.0.tgz",
- "integrity": "sha512-UFpDVqRABKsW01bvw7/wSUe56uy6RXM5+VJibVVAybDGxEW25jdwiFJEf7ASvSaC7sN7rbE/l3cLp2izav+CtQ==",
- "dev": true,
- "requires": {
- "esutils": "^2.0.2",
- "lodash": "^4.17.11",
- "to-fast-properties": "^2.0.0"
- }
- },
- "@elastic/elasticsearch": {
- "version": "7.9.1",
- "resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-7.9.1.tgz",
- "integrity": "sha512-NfPADbm9tRK/4ohpm9+aBtJ8WPKQqQaReyBKT225pi2oKQO1IzRlfM+OPplAvbhoH1efrSj1NKk27L+4BCrzXQ==",
- "requires": {
- "debug": "^4.1.1",
- "decompress-response": "^4.2.0",
- "ms": "^2.1.1",
- "pump": "^3.0.0",
- "secure-json-parse": "^2.1.0"
- },
- "dependencies": {
- "debug": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
- "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
- "requires": {
- "ms": "2.1.2"
- }
- }
- }
- },
"@hapi/address": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.0.0.tgz",
@@ -222,41 +51,6 @@
"integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
"dev": true
},
- "@sinonjs/commons": {
- "version": "1.8.3",
- "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
- "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==",
- "dev": true,
- "requires": {
- "type-detect": "4.0.8"
- }
- },
- "@sinonjs/fake-timers": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.0.4.tgz",
- "integrity": "sha512-fW3SzjLF0sjI0x1Opc7cUG4J/Nr4U0TXPNnKNAgrxA4xXsQNk6nypZK0yJg5FNw5cCo2yC/ZMdaVhDTKeeF6zg==",
- "dev": true,
- "requires": {
- "@sinonjs/commons": "^1.7.0"
- }
- },
- "@sinonjs/samsam": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.1.tgz",
- "integrity": "sha512-zJ+xzDBMETj/kFkagaZBG4G8e80Et182r6xpCzpubS7cavdTLwBKtCU3sgmPvZDC0u41gd87atcoUxcmiamBgw==",
- "dev": true,
- "requires": {
- "@sinonjs/commons": "^1.6.0",
- "lodash.get": "^4.4.2",
- "type-detect": "^4.0.8"
- }
- },
- "@sinonjs/text-encoding": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz",
- "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==",
- "dev": true
- },
"@szmarczak/http-timer": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
@@ -271,79 +65,6 @@
"resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
"integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw=="
},
- "@topcoder-platform/topcoder-bus-api-wrapper": {
- "version": "github:topcoder-platform/tc-bus-api-wrapper#f8cbd335a0e0b4d6edd7cae859473593271fd97f",
- "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.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "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"
- }
- }
- }
- },
"@types/bluebird": {
"version": "3.5.0",
"resolved": "https://registry.npm.taobao.org/@types/bluebird/download/@types/bluebird-3.5.0.tgz",
@@ -538,12 +259,6 @@
}
}
},
- "ansi-colors": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
- "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
- "dev": true
- },
"ansi-escapes": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
@@ -572,21 +287,6 @@
"picomatch": "^2.0.4"
}
},
- "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.npm.taobao.org/archy/download/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",
@@ -645,22 +345,6 @@
"resolved": "https://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz",
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
},
- "aws-sdk": {
- "version": "2.488.0",
- "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.488.0.tgz",
- "integrity": "sha512-9AP48tyF1E5+x1CKeiRlj0Sv1YF7KI0BdSW9JP8x3ClhPWNUHjDYNH2OwsALuG1BloeY2ZigYqfI2fB7g3rNHQ==",
- "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"
- }
- },
"aws-sign2": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
@@ -719,11 +403,6 @@
"resolved": "https://registry.npm.taobao.org/balanced-match/download/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",
@@ -893,22 +572,6 @@
"fill-range": "^7.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.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"
- }
- },
"buffer-crc32": {
"version": "0.2.13",
"resolved": "https://registry.npm.taobao.org/buffer-crc32/download/buffer-crc32-0.2.13.tgz",
@@ -967,18 +630,6 @@
}
}
},
- "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.npm.taobao.org/caller-path/download/caller-path-0.1.0.tgz",
@@ -1073,34 +724,6 @@
"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"
- },
- "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-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"
- }
- }
- }
- },
"clone-response": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
@@ -1118,12 +741,6 @@
}
}
},
- "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",
@@ -1197,16 +814,11 @@
"delayed-stream": "~1.0.0"
}
},
- "commondir": {
- "version": "1.0.1",
- "resolved": "https://registry.npm.taobao.org/commondir/download/commondir-1.0.1.tgz",
- "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
- "dev": true
- },
"component-emitter": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
- "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
+ "dev": true
},
"concat-map": {
"version": "0.0.1",
@@ -1288,15 +900,6 @@
"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.4.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
@@ -1310,7 +913,8 @@
"cookiejar": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz",
- "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA=="
+ "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==",
+ "dev": true
},
"core-js": {
"version": "2.6.12",
@@ -1322,71 +926,6 @@
"resolved": "https://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
- "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"
- }
- },
- "cross-env": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
- "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
- "dev": true,
- "requires": {
- "cross-spawn": "^7.0.1"
- },
- "dependencies": {
- "cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dev": true,
- "requires": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- }
- },
- "path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true
- },
- "shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "requires": {
- "shebang-regex": "^3.0.0"
- }
- },
- "shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true
- },
- "which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- }
- }
- },
"cross-spawn": {
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
@@ -1435,20 +974,6 @@
"integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=",
"dev": true
},
- "decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
- "dev": true
- },
- "decompress-response": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz",
- "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==",
- "requires": {
- "mimic-response": "^2.0.0"
- }
- },
"deep-extend": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
@@ -1461,15 +986,6 @@
"integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
"dev": true
},
- "default-require-extensions": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/default-require-extensions/download/default-require-extensions-2.0.0.tgz",
- "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=",
- "dev": true,
- "requires": {
- "strip-bom": "^3.0.0"
- }
- },
"defer-to-connect": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
@@ -1532,12 +1048,6 @@
"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",
@@ -1621,6 +1131,7 @@
"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"
}
@@ -1672,12 +1183,6 @@
"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-goat": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
@@ -2138,26 +1643,6 @@
"resolved": "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz",
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
},
- "events": {
- "version": "1.1.1",
- "resolved": "https://registry.npm.taobao.org/events/download/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.17.1",
"resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
@@ -2285,41 +1770,12 @@
"unpipe": "~1.0.0"
}
},
- "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"
- }
- },
"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": "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"
- }
- },
- "flat": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz",
- "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==",
- "dev": true,
- "requires": {
- "is-buffer": "~2.0.3"
- }
- },
"flat-cache": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz",
@@ -2355,28 +1811,6 @@
}
}
},
- "foreground-child": {
- "version": "1.5.6",
- "resolved": "https://registry.npm.taobao.org/foreground-child/download/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",
@@ -2386,6 +1820,7 @@
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.0.tgz",
"integrity": "sha512-WXieX3G/8side6VIqx44ablyULoGruSde5PNTxoUyo5CeyAMX6nVWUd0rgist/EuX655cjhUhTo1Fo3tRYqbcA==",
+ "dev": true,
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.6",
@@ -2395,7 +1830,8 @@
"formidable": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz",
- "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg=="
+ "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==",
+ "dev": true
},
"forwarded": {
"version": "0.1.2",
@@ -2432,12 +1868,6 @@
"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-parameter-names": {
"version": "0.3.0",
"resolved": "https://registry.npm.taobao.org/get-parameter-names/download/get-parameter-names-0.3.0.tgz",
@@ -2546,12 +1976,6 @@
"integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==",
"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",
@@ -2620,15 +2044,6 @@
"integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
"dev": true
},
- "hasha": {
- "version": "3.0.0",
- "resolved": "https://registry.npm.taobao.org/hasha/download/hasha-3.0.0.tgz",
- "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=",
- "dev": true,
- "requires": {
- "is-stream": "^1.0.1"
- }
- },
"hashring": {
"version": "3.2.0",
"resolved": "https://registry.npm.taobao.org/hashring/download/hashring-3.2.0.tgz",
@@ -2638,29 +2053,12 @@
"simple-lru-cache": "0.0.x"
}
},
- "he": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
- "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
- "dev": true
- },
- "hoek": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/hoek/-/hoek-5.0.4.tgz",
- "integrity": "sha512-Alr4ZQgoMlnere5FZJsIyfIjORBqZll5POhDsF4q64dPuJR6rNxXdDxtHSQq8OXRurhmx+PWYEE8bXRROY8h0w=="
- },
"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-cache-semantics": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
@@ -2736,11 +2134,6 @@
"safer-buffer": ">= 2.1.2 < 3"
}
},
- "ieee754": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz",
- "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q="
- },
"ignore": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
@@ -2852,12 +2245,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",
@@ -2877,12 +2264,6 @@
"binary-extensions": "^2.0.0"
}
},
- "is-buffer": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
- "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
- "dev": true
- },
"is-callable": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
@@ -3010,21 +2391,6 @@
"resolved": "https://registry.npm.taobao.org/isarray/download/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.npm.taobao.org/isexe/download/isexe-2.0.0.tgz",
@@ -3036,120 +2402,6 @@
"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.2.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz",
- "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==",
- "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"
- }
- },
- "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.npm.taobao.org/jmespath/download/jmespath-0.15.0.tgz",
- "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc="
- },
- "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"
- }
- },
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -3171,12 +2423,6 @@
"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-buffer": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
@@ -3256,12 +2502,6 @@
"object.assign": "^4.1.0"
}
},
- "just-extend": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz",
- "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==",
- "dev": true
- },
"jwa": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
@@ -3334,15 +2574,6 @@
"package-json": "^6.3.0"
}
},
- "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.npm.taobao.org/levn/download/levn-0.3.0.tgz?cache=0&sync_timestamp=1585966057564&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flevn%2Fdownload%2Flevn-0.3.0.tgz",
@@ -3378,16 +2609,6 @@
}
}
},
- "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"
- }
- },
"lodash": {
"version": "4.17.20",
"resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.20.tgz?cache=0&sync_timestamp=1597336224062&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.20.tgz",
@@ -3398,18 +2619,6 @@
"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.npm.taobao.org/lodash.flattendeep/download/lodash.flattendeep-4.4.0.tgz",
- "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=",
- "dev": true
- },
- "lodash.get": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
- "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
- "dev": true
- },
"lodash.includes": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
@@ -3445,46 +2654,6 @@
"resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
"integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
},
- "log-symbols": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
- "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
- "dev": true,
- "requires": {
- "chalk": "^2.4.2"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
"logform": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz",
@@ -3517,16 +2686,6 @@
"integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
"dev": true
},
- "lru-cache": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
- "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
- "dev": true,
- "requires": {
- "pseudomap": "^1.0.2",
- "yallist": "^2.1.2"
- }
- },
"lru-memoizer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.1.2.tgz",
@@ -3547,63 +2706,16 @@
}
}
},
- "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"
- }
- },
- "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.npm.taobao.org/media-typer/download/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"
- }
- },
"merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npm.taobao.org/merge-descriptors/download/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.npm.taobao.org/methods/download/methods-1.1.2.tgz",
@@ -3632,17 +2744,6 @@
"mime-db": "1.40.0"
}
},
- "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
- },
- "mimic-response": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
- "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA=="
- },
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
@@ -3664,145 +2765,6 @@
"minimist": "^1.2.5"
}
},
- "mocha": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz",
- "integrity": "sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==",
- "dev": true,
- "requires": {
- "ansi-colors": "3.2.3",
- "browser-stdout": "1.3.1",
- "chokidar": "3.3.0",
- "debug": "3.2.6",
- "diff": "3.5.0",
- "escape-string-regexp": "1.0.5",
- "find-up": "3.0.0",
- "glob": "7.1.3",
- "growl": "1.10.5",
- "he": "1.2.0",
- "js-yaml": "3.13.1",
- "log-symbols": "3.0.0",
- "minimatch": "3.0.4",
- "mkdirp": "0.5.5",
- "ms": "2.1.1",
- "node-environment-flags": "1.0.6",
- "object.assign": "4.1.0",
- "strip-json-comments": "2.0.1",
- "supports-color": "6.0.0",
- "which": "1.3.1",
- "wide-align": "1.1.3",
- "yargs": "13.3.2",
- "yargs-parser": "13.1.2",
- "yargs-unparser": "1.6.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
- },
- "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"
- }
- },
- "cliui": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
- "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
- "dev": true,
- "requires": {
- "string-width": "^3.1.0",
- "strip-ansi": "^5.2.0",
- "wrap-ansi": "^5.1.0"
- }
- },
- "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"
- }
- },
- "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
- },
- "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"
- }
- },
- "supports-color": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
- "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- },
- "wrap-ansi": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
- "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.0",
- "string-width": "^3.0.0",
- "strip-ansi": "^5.0.0"
- }
- },
- "yargs": {
- "version": "13.3.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
- "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
- "dev": true,
- "requires": {
- "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"
- }
- }
- }
- },
- "mocha-prepare": {
- "version": "0.1.0",
- "resolved": "https://registry.npm.taobao.org/mocha-prepare/download/mocha-prepare-0.1.0.tgz",
- "integrity": "sha1-VRMidoEiLkNJSB7k5GJHLzHGu4I=",
- "dev": true
- },
"moment": {
"version": "2.29.1",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
@@ -3883,12 +2845,6 @@
"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-simple-logger": {
"version": "1.0.1",
"resolved": "https://registry.npm.taobao.org/nice-simple-logger/download/nice-simple-logger-1.0.1.tgz",
@@ -3903,45 +2859,6 @@
"integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
"dev": true
},
- "nise": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/nise/-/nise-5.0.1.tgz",
- "integrity": "sha512-U6qdfulSDpEgx3WSoeMlKZ6hGaTMKtyW7CY3bjj0MK3uzHvmugyteB2zyHQRRvi5I91oErSUR595s7htS6IYRQ==",
- "dev": true,
- "requires": {
- "@sinonjs/commons": "^1.7.0",
- "@sinonjs/fake-timers": "^6.0.0",
- "@sinonjs/text-encoding": "^0.7.1",
- "just-extend": "^4.0.2",
- "path-to-regexp": "^1.7.0"
- },
- "dependencies": {
- "@sinonjs/fake-timers": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz",
- "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==",
- "dev": true,
- "requires": {
- "@sinonjs/commons": "^1.7.0"
- }
- },
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
- "dev": true
- },
- "path-to-regexp": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
- "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
- "dev": true,
- "requires": {
- "isarray": "0.0.1"
- }
- }
- }
- },
"no-kafka": {
"version": "3.4.3",
"resolved": "https://registry.npm.taobao.org/no-kafka/download/no-kafka-3.4.3.tgz",
@@ -3966,39 +2883,6 @@
}
}
},
- "nock": {
- "version": "12.0.3",
- "resolved": "https://registry.npmjs.org/nock/-/nock-12.0.3.tgz",
- "integrity": "sha512-QNb/j8kbFnKCiyqi9C5DD0jH/FubFGj5rt9NQFONXwQm3IPB0CULECg/eS3AU1KgZb/6SwUa4/DTRKhVxkGABw==",
- "dev": true,
- "requires": {
- "debug": "^4.1.0",
- "json-stringify-safe": "^5.0.1",
- "lodash": "^4.17.13",
- "propagate": "^2.0.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"
- }
- }
- }
- },
- "node-environment-flags": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz",
- "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==",
- "dev": true,
- "requires": {
- "object.getownpropertydescriptors": "^2.0.3",
- "semver": "^5.7.0"
- }
- },
"nodemon": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz",
@@ -4076,54 +2960,6 @@
"integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==",
"dev": true
},
- "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.1",
- "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz",
- "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==",
- "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"
- }
- },
"oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
@@ -4135,12 +2971,6 @@
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"dev": true
},
- "object-inspect": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
- "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==",
- "dev": true
- },
"object-keys": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
@@ -4159,69 +2989,6 @@
"object-keys": "^1.0.11"
}
},
- "object.getownpropertydescriptors": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz",
- "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1"
- },
- "dependencies": {
- "es-abstract": {
- "version": "1.17.5",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz",
- "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==",
- "dev": true,
- "requires": {
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1",
- "is-callable": "^1.1.5",
- "is-regex": "^1.0.5",
- "object-inspect": "^1.7.0",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.0",
- "string.prototype.trimleft": "^2.1.1",
- "string.prototype.trimright": "^2.1.1"
- }
- },
- "es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "dev": true,
- "requires": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- }
- },
- "has-symbols": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
- "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
- "dev": true
- },
- "is-callable": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
- "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==",
- "dev": true
- },
- "is-regex": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
- "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
- "dev": true,
- "requires": {
- "has": "^1.0.3"
- }
- }
- }
- },
"on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz",
@@ -4282,23 +3049,6 @@
}
}
},
- "os-homedir": {
- "version": "1.0.2",
- "resolved": "https://registry.npm.taobao.org/os-homedir/download/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.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz",
@@ -4311,60 +3061,6 @@
"integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
"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": "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
- },
- "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"
- }
- },
"package-json": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
@@ -4434,23 +3130,6 @@
"resolved": "https://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz?cache=0&sync_timestamp=1601400247487&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-to-regexp%2Fdownload%2Fpath-to-regexp-0.1.7.tgz",
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
},
- "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"
- },
- "dependencies": {
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
- "dev": true
- }
- }
- },
"performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
@@ -4462,12 +3141,6 @@
"integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
"dev": true
},
- "pify": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
- "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
- "dev": true
- },
"pkg-conf": {
"version": "2.1.0",
"resolved": "https://registry.npm.taobao.org/pkg-conf/download/pkg-conf-2.1.0.tgz",
@@ -4534,15 +3207,6 @@
"xtend": "^4.0.1"
}
},
- "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"
- }
- },
"pluralize": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
@@ -4588,12 +3252,6 @@
"react-is": "^16.8.1"
}
},
- "propagate": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz",
- "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==",
- "dev": true
- },
"protocol-buffers-schema": {
"version": "3.4.0",
"resolved": "https://registry.npm.taobao.org/protocol-buffers-schema/download/protocol-buffers-schema-3.4.0.tgz",
@@ -4633,16 +3291,12 @@
"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.npm.taobao.org/punycode/download/punycode-1.3.2.tgz",
- "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
- },
"pupa": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz",
@@ -4657,11 +3311,6 @@
"resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
"integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
},
- "querystring": {
- "version": "0.2.0",
- "resolved": "https://registry.npm.taobao.org/querystring/download/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",
@@ -4721,27 +3370,6 @@
"integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==",
"dev": true
},
- "read-pkg": {
- "version": "3.0.0",
- "resolved": "https://registry.npm.taobao.org/read-pkg/download/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"
- }
- },
"readable-stream": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
@@ -4793,15 +3421,6 @@
"rc": "^1.2.8"
}
},
- "release-zalgo": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/release-zalgo/download/release-zalgo-1.0.0.tgz",
- "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=",
- "dev": true,
- "requires": {
- "es6-error": "^4.0.1"
- }
- },
"request": {
"version": "2.88.2",
"resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
@@ -4846,18 +3465,6 @@
}
}
},
- "require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npm.taobao.org/require-directory/download/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.npm.taobao.org/require-uncached/download/require-uncached-1.0.3.tgz",
@@ -4885,12 +3492,6 @@
"path-parse": "^1.0.6"
}
},
- "resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "dev": true
- },
"responselike": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
@@ -4959,16 +3560,6 @@
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
- "sax": {
- "version": "1.2.1",
- "resolved": "https://registry.npm.taobao.org/sax/download/sax-1.2.1.tgz",
- "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o="
- },
- "secure-json-parse": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.1.0.tgz",
- "integrity": "sha512-GckO+MS/wT4UogDyoI/H/S1L0MCcKS1XX/vp48wfmU7Nw4woBmb8mIpu4zPBQjKlRT88/bt9xdoV4111jPpNJA=="
- },
"semver": {
"version": "5.7.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
@@ -5029,12 +3620,6 @@
"send": "0.17.1"
}
},
- "set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
- "dev": true
- },
"setprototypeof": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
@@ -5055,60 +3640,6 @@
"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.npm.taobao.org/should-format/download/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.npm.taobao.org/should-type/download/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.1",
- "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz",
- "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==",
- "dev": true
- },
"signal-exit": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
@@ -5128,43 +3659,6 @@
"is-arrayish": "^0.3.1"
}
},
- "sinon": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/sinon/-/sinon-10.0.1.tgz",
- "integrity": "sha512-1rf86mvW4Mt7JitEIgmNaLXaWnrWd/UrVKZZlL+kbeOujXVf9fmC4kQEQ/YeHoiIA23PLNngYWK+dngIx/AumA==",
- "dev": true,
- "requires": {
- "@sinonjs/commons": "^1.8.1",
- "@sinonjs/fake-timers": "^7.0.4",
- "@sinonjs/samsam": "^6.0.1",
- "diff": "^4.0.2",
- "nise": "^5.0.1",
- "supports-color": "^7.1.0"
- },
- "dependencies": {
- "diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "dev": true
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
"slice-ansi": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
@@ -5174,26 +3668,6 @@
"is-fullwidth-code-point": "^2.0.0"
}
},
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npm.taobao.org/source-map/download/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"
- }
- },
"spdx-correct": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
@@ -5314,260 +3788,6 @@
}
}
},
- "string.prototype.trimend": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
- "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.5"
- },
- "dependencies": {
- "es-abstract": {
- "version": "1.17.5",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz",
- "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==",
- "dev": true,
- "requires": {
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1",
- "is-callable": "^1.1.5",
- "is-regex": "^1.0.5",
- "object-inspect": "^1.7.0",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.0",
- "string.prototype.trimleft": "^2.1.1",
- "string.prototype.trimright": "^2.1.1"
- }
- },
- "es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "dev": true,
- "requires": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- }
- },
- "has-symbols": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
- "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
- "dev": true
- },
- "is-callable": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
- "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==",
- "dev": true
- },
- "is-regex": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
- "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
- "dev": true,
- "requires": {
- "has": "^1.0.3"
- }
- }
- }
- },
- "string.prototype.trimleft": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz",
- "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.5",
- "string.prototype.trimstart": "^1.0.0"
- },
- "dependencies": {
- "es-abstract": {
- "version": "1.17.5",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz",
- "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==",
- "dev": true,
- "requires": {
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1",
- "is-callable": "^1.1.5",
- "is-regex": "^1.0.5",
- "object-inspect": "^1.7.0",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.0",
- "string.prototype.trimleft": "^2.1.1",
- "string.prototype.trimright": "^2.1.1"
- }
- },
- "es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "dev": true,
- "requires": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- }
- },
- "has-symbols": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
- "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
- "dev": true
- },
- "is-callable": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
- "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==",
- "dev": true
- },
- "is-regex": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
- "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
- "dev": true,
- "requires": {
- "has": "^1.0.3"
- }
- }
- }
- },
- "string.prototype.trimright": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz",
- "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.5",
- "string.prototype.trimend": "^1.0.0"
- },
- "dependencies": {
- "es-abstract": {
- "version": "1.17.5",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz",
- "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==",
- "dev": true,
- "requires": {
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1",
- "is-callable": "^1.1.5",
- "is-regex": "^1.0.5",
- "object-inspect": "^1.7.0",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.0",
- "string.prototype.trimleft": "^2.1.1",
- "string.prototype.trimright": "^2.1.1"
- }
- },
- "es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "dev": true,
- "requires": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- }
- },
- "has-symbols": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
- "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
- "dev": true
- },
- "is-callable": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
- "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==",
- "dev": true
- },
- "is-regex": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
- "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
- "dev": true,
- "requires": {
- "has": "^1.0.3"
- }
- }
- }
- },
- "string.prototype.trimstart": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
- "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.5"
- },
- "dependencies": {
- "es-abstract": {
- "version": "1.17.5",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz",
- "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==",
- "dev": true,
- "requires": {
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1",
- "is-callable": "^1.1.5",
- "is-regex": "^1.0.5",
- "object-inspect": "^1.7.0",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.0",
- "string.prototype.trimleft": "^2.1.1",
- "string.prototype.trimright": "^2.1.1"
- }
- },
- "es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "dev": true,
- "requires": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- }
- },
- "has-symbols": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
- "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
- "dev": true
- },
- "is-callable": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
- "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==",
- "dev": true
- },
- "is-regex": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
- "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
- "dev": true,
- "requires": {
- "has": "^1.0.3"
- }
- }
- }
- },
"string_decoder": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz",
@@ -5597,12 +3817,6 @@
"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.npm.taobao.org/strip-json-comments/download/strip-json-comments-2.0.1.tgz",
@@ -5729,18 +3943,6 @@
"integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==",
"dev": true
},
- "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"
- }
- },
"text-hex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
@@ -5767,12 +3969,6 @@
"os-tmpdir": "~1.0.2"
}
},
- "to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-2.0.0.tgz",
- "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
- "dev": true
- },
"to-readable-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
@@ -5801,21 +3997,6 @@
"express": "^4.16.3"
}
},
- "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"
- },
- "dependencies": {
- "hoek": {
- "version": "6.1.3",
- "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.1.3.tgz",
- "integrity": "sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ=="
- }
- }
- },
"touch": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
@@ -5841,12 +4022,6 @@
}
}
},
- "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",
@@ -5879,12 +4054,6 @@
"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-fest": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
@@ -6025,15 +4194,6 @@
}
}
},
- "url": {
- "version": "0.10.3",
- "resolved": "https://registry.npm.taobao.org/url/download/url-0.10.3.tgz",
- "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=",
- "requires": {
- "punycode": "1.3.2",
- "querystring": "0.2.0"
- }
- },
"url-parse-lax": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
@@ -6092,21 +4252,6 @@
"isexe": "^2.0.0"
}
},
- "which-module": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/which-module/download/which-module-2.0.0.tgz",
- "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
- "dev": true
- },
- "wide-align": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
- "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
- "dev": true,
- "requires": {
- "string-width": "^1.0.2 || 2"
- }
- },
"widest-line": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
@@ -6205,38 +4350,6 @@
}
}
},
- "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"
- }
- }
- }
- },
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz",
@@ -6251,17 +4364,6 @@
"mkdirp": "^0.5.1"
}
},
- "write-file-atomic": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz",
- "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.11",
- "imurmurhash": "^0.1.4",
- "signal-exit": "^3.0.2"
- }
- },
"wrr-pool": {
"version": "1.1.4",
"resolved": "https://registry.npm.taobao.org/wrr-pool/download/wrr-pool-1.1.4.tgz",
@@ -6276,181 +4378,16 @@
"integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
"dev": true
},
- "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.npm.taobao.org/xmlbuilder/download/xmlbuilder-9.0.7.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fxmlbuilder%2Fdownload%2Fxmlbuilder-9.0.7.tgz",
- "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0="
- },
"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.npm.taobao.org/yallist/download/yallist-2.1.2.tgz",
"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
- },
- "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
- },
- "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"
- }
- },
- "yargs-unparser": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
- "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
- "dev": true,
- "requires": {
- "flat": "^4.1.0",
- "lodash": "^4.17.15",
- "yargs": "^13.3.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
- },
- "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"
- }
- },
- "cliui": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
- "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
- "dev": true,
- "requires": {
- "string-width": "^3.1.0",
- "strip-ansi": "^5.2.0",
- "wrap-ansi": "^5.1.0"
- }
- },
- "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"
- }
- },
- "wrap-ansi": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
- "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.0",
- "string-width": "^3.0.0",
- "strip-ansi": "^5.0.0"
- }
- },
- "yargs": {
- "version": "13.3.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
- "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
- "dev": true,
- "requires": {
- "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"
- }
- }
- }
}
}
}
diff --git a/package.json b/package.json
index 77228e9..0a2eb85 100644
--- a/package.json
+++ b/package.json
@@ -7,36 +7,19 @@
"start": "node src/app.js",
"dev": "nodemon src/app.js",
"lint": "standard",
- "lint:fix": "standard --fix",
- "create-index": "node src/scripts/createIndex.js",
- "delete-index": "node src/scripts/deleteIndex.js",
- "view-data": "node src/scripts/view-data.js",
- "test": "cross-env NODE_ENV=test mocha test/unit/test.js --require test/unit/prepare.js --timeout 20000 --exit",
- "test:cov": "cross-env NODE_ENV=test nyc --reporter=html --reporter=text mocha test/unit/test.js --require test/unit/prepare.js --timeout 20000 --exit",
- "e2e": "cross-env NODE_ENV=test mocha test/e2e/test.js --timeout 20000 --exit",
- "e2e:cov": "cross-env NODE_ENV=test nyc --reporter=html --reporter=text mocha test/e2e/test.js --timeout 20000 --exit"
+ "lint:fix": "standard --fix"
},
"author": "TCSCODER",
"license": "none",
"devDependencies": {
- "cross-env": "^7.0.3",
- "mocha": "^7.1.2",
- "mocha-prepare": "^0.1.0",
- "nock": "^12.0.3",
"nodemon": "^2.0.7",
- "nyc": "^14.1.1",
- "should": "^13.2.3",
- "sinon": "^10.0.1",
"standard": "^12.0.1",
"stringcase": "^4.3.1",
"superagent": "^5.1.0"
},
"dependencies": {
- "@elastic/elasticsearch": "^7.9.1",
"@hapi/joi": "^15.1.0",
- "@topcoder-platform/topcoder-bus-api-wrapper": "github:topcoder-platform/tc-bus-api-wrapper",
"async-mutex": "^0.2.4",
- "aws-sdk": "^2.476.0",
"bluebird": "^3.5.5",
"config": "^3.1.0",
"dotenv": "^10.0.0",
@@ -49,17 +32,5 @@
},
"engines": {
"node": "8.x"
- },
- "standard": {
- "env": [
- "mocha"
- ]
- },
- "nyc": {
- "exclude": [
- "test/common/*.js",
- "test/unit/*.js",
- "test/e2e/*.js"
- ]
}
}
diff --git a/src/app.js b/src/app.js
index 534b155..555218d 100644
--- a/src/app.js
+++ b/src/app.js
@@ -11,12 +11,6 @@ const logger = require('./common/logger')
const helper = require('./common/helper')
const JobProcessorService = require('./services/JobProcessorService')
const JobCandidateProcessorService = require('./services/JobCandidateProcessorService')
-// const ResourceBookingProcessorService = require('./services/ResourceBookingProcessorService')
-// const WorkPeriodProcessorService = require('./services/WorkPeriodProcessorService')
-// const InterviewProcessorService = require('./services/InterviewProcessorService')
-// const WorkPeriodPaymentProcessorService = require('./services/WorkPeriodPaymentProcessorService')
-// const RoleProcessorService = require('./services/RoleProcessorService')
-const ActionProcessorService = require('./services/ActionProcessorService')
const Mutex = require('async-mutex').Mutex
const events = require('events')
@@ -34,32 +28,7 @@ const topicServiceMapping = {
// job
[config.topics.TAAS_JOB_CREATE_TOPIC]: JobProcessorService.processCreate,
[config.topics.TAAS_JOB_UPDATE_TOPIC]: JobProcessorService.processUpdate,
- // [config.topics.TAAS_JOB_DELETE_TOPIC]: JobProcessorService.processDelete,
- // job candidate
- // [config.topics.TAAS_JOB_CANDIDATE_CREATE_TOPIC]: JobCandidateProcessorService.processCreate,
- [config.topics.TAAS_JOB_CANDIDATE_UPDATE_TOPIC]: JobCandidateProcessorService.processUpdate,
- // [config.topics.TAAS_JOB_CANDIDATE_DELETE_TOPIC]: JobCandidateProcessorService.processDelete,
- // resource booking
- // [config.topics.TAAS_RESOURCE_BOOKING_CREATE_TOPIC]: ResourceBookingProcessorService.processCreate,
- // [config.topics.TAAS_RESOURCE_BOOKING_UPDATE_TOPIC]: ResourceBookingProcessorService.processUpdate,
- // [config.topics.TAAS_RESOURCE_BOOKING_DELETE_TOPIC]: ResourceBookingProcessorService.processDelete,
- // work period
- // [config.topics.TAAS_WORK_PERIOD_CREATE_TOPIC]: WorkPeriodProcessorService.processCreate,
- // [config.topics.TAAS_WORK_PERIOD_UPDATE_TOPIC]: WorkPeriodProcessorService.processUpdate,
- // [config.topics.TAAS_WORK_PERIOD_DELETE_TOPIC]: WorkPeriodProcessorService.processDelete,
- // work period payment
- // [config.topics.TAAS_WORK_PERIOD_PAYMENT_CREATE_TOPIC]: WorkPeriodPaymentProcessorService.processCreate,
- // [config.topics.TAAS_WORK_PERIOD_PAYMENT_UPDATE_TOPIC]: WorkPeriodPaymentProcessorService.processUpdate,
- // interview
- // [config.topics.TAAS_INTERVIEW_REQUEST_TOPIC]: InterviewProcessorService.processRequestInterview,
- // [config.topics.TAAS_INTERVIEW_UPDATE_TOPIC]: InterviewProcessorService.processUpdateInterview,
- // [config.topics.TAAS_INTERVIEW_BULK_UPDATE_TOPIC]: InterviewProcessorService.processBulkUpdateInterviews,
- // role
- // [config.topics.TAAS_ROLE_CREATE_TOPIC]: RoleProcessorService.processCreate,
- // [config.topics.TAAS_ROLE_UPDATE_TOPIC]: RoleProcessorService.processUpdate,
- // [config.topics.TAAS_ROLE_DELETE_TOPIC]: RoleProcessorService.processDelete,
- // action
- [config.topics.TAAS_ACTION_RETRY_TOPIC]: ActionProcessorService.processRetry
+ [config.topics.TAAS_JOB_CANDIDATE_UPDATE_TOPIC]: JobCandidateProcessorService.processUpdate
}
// Start kafka consumer
@@ -124,7 +93,6 @@ const dataHandler = (messageSet, topic, partition) => Promise.each(messageSet, a
} catch (err) {
logger.logFullError(err, { component: 'app' })
} finally {
- helper.checkEsMutexRelease(transactionId)
localLogger.debug(`Commiting offset after processing message with count ${messageCount}`)
// Commit offset regardless of error
diff --git a/src/bootstrap.js b/src/bootstrap.js
index 0d46bf7..6929d7f 100644
--- a/src/bootstrap.js
+++ b/src/bootstrap.js
@@ -1,29 +1,18 @@
const Joi = require('@hapi/joi')
const config = require('config')
-const _ = require('lodash')
-const { Interview } = require('../src/common/constants')
const constants = require('./common/constants')
-const allowedXAITemplates = _.values(Interview.XaiTemplate)
-const allowedInterviewStatuses = _.values(Interview.Status)
-
global.Promise = require('bluebird')
Joi.rateType = () => Joi.string().valid('hourly', 'daily', 'weekly', 'monthly', 'annual')
Joi.jobStatus = () => Joi.string().valid('sourcing', 'in-review', 'assigned', 'closed', 'cancelled')
-Joi.resourceBookingStatus = () => Joi.string().valid('placed', 'closed', 'cancelled')
Joi.jobCandidateStatus = () => Joi.string().valid('open', 'placed', 'selected', 'client rejected - screening', 'client rejected - interview', 'rejected - other', 'cancelled', 'interview', 'topcoder-rejected', 'applied', 'rejected-pre-screen', 'skills-test', 'skills-test', 'phone-screen', 'job-closed', 'offered', 'withdrawn', 'withdrawn-prescreen')
Joi.workload = () => Joi.string().valid('full-time', 'fractional')
Joi.title = () => Joi.string().max(128)
-Joi.paymentStatus = () => Joi.string().valid('pending', 'in-progress', 'partially-completed', 'completed', 'failed', 'no-days')
-Joi.xaiTemplate = () => Joi.string().valid(...allowedXAITemplates)
-Joi.interviewStatus = () => Joi.string().valid(...allowedInterviewStatuses)
-Joi.workPeriodPaymentStatus = () => Joi.string().valid('completed', 'scheduled', 'in-progress', 'failed', 'cancelled')
// Empty string is not allowed by Joi by default and must be enabled with allow('').
// See https://joi.dev/api/?v=17.3.0#string fro details why it's like this.
// In many cases we would like to allow empty string to make it easier to create UI for editing data.
Joi.stringAllowEmpty = () => Joi.string().allow('')
-Joi.smallint = () => Joi.number().min(-32768).max(32767)
const zapierSwitch = Joi.string().label('ZAPIER_SWITCH').valid(...Object.values(constants.Zapier.Switch))
diff --git a/src/common/constants.js b/src/common/constants.js
index c2a154a..cc54bdf 100644
--- a/src/common/constants.js
+++ b/src/common/constants.js
@@ -3,8 +3,6 @@
*/
module.exports = {
- // possible values: wait_for, true, false
- esRefreshOption: 'wait_for',
Zapier: {
Switch: {
ON: 'ON',
@@ -16,19 +14,5 @@ module.exports = {
JobCandidateCreate: 'jobcandidate:create',
JobCandidateUpdate: 'jobcandidate:update'
}
- },
- Interview: {
- Status: {
- Scheduling: 'Scheduling',
- Scheduled: 'Scheduled',
- RequestedForReschedule: 'Requested for reschedule',
- Rescheduled: 'Rescheduled',
- Completed: 'Completed',
- Cancelled: 'Cancelled'
- },
- XaiTemplate: {
- '30MinInterview': 'interview-30',
- '60MinInterview': 'interview-60'
- }
}
}
diff --git a/src/common/errors.js b/src/common/errors.js
deleted file mode 100644
index 1fee2b6..0000000
--- a/src/common/errors.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * This file defines application errors
- */
-const util = require('util')
-
-/**
- * Helper function to create generic error object with http status code
- * @param {String} name the error name
- * @param {Number} statusCode the http status code
- * @returns {Function} the error constructor
- * @private
- */
-function createError (name, statusCode) {
- /**
- * The error constructor
- * @param {String} message the error message
- * @param {String} [cause] the error cause
- * @constructor
- */
- function ErrorCtor (message, cause) {
- Error.call(this)
- Error.captureStackTrace(this)
- this.message = message || name
- this.cause = cause
- this.httpStatus = statusCode
- }
-
- util.inherits(ErrorCtor, Error)
- ErrorCtor.prototype.name = name
- return ErrorCtor
-}
-
-module.exports = {
- BadRequestError: createError('BadRequestError', 400),
- UnauthorizedError: createError('UnauthorizedError', 401),
- ForbiddenError: createError('ForbiddenError', 403),
- NotFoundError: createError('NotFoundError', 404),
- ConflictError: createError('ConflictError', 409),
- InternalServerError: createError('InternalServerError', 500)
-}
diff --git a/src/common/helper.js b/src/common/helper.js
index 78f78a0..cc8633c 100644
--- a/src/common/helper.js
+++ b/src/common/helper.js
@@ -2,26 +2,13 @@
* Contains generic helper methods
*/
-const AWS = require('aws-sdk')
const config = require('config')
const request = require('superagent')
const logger = require('./logger')
-const errors = require('./errors')
-const elasticsearch = require('@elastic/elasticsearch')
const _ = require('lodash')
-const { Mutex } = require('async-mutex')
const m2mAuth = require('tc-core-library-js').auth.m2m
-const busApi = require('@topcoder-platform/topcoder-bus-api-wrapper')
-AWS.config.region = config.esConfig.AWS_REGION
-
-// Elasticsearch client
-let esClient
-let transactionId
let m2m
-// Mutex to ensure that only one elasticsearch action is carried out at any given time
-const esClientMutex = new Mutex()
-const mutexReleaseMap = {}
/**
* Get Kafka options
@@ -35,128 +22,6 @@ function getKafkaOptions () {
return options
}
-/**
- * Get ES Client
- * @return {Object} Elasticsearch Client Instance
- */
-function getESClient () {
- if (esClient) {
- return esClient
- }
- const host = config.esConfig.HOST
- const cloudId = config.esConfig.ELASTICCLOUD.id
-
- if (cloudId) {
- // Elastic Cloud configuration
- esClient = new elasticsearch.Client({
- cloud: {
- id: cloudId
- },
- auth: {
- username: config.esConfig.ELASTICCLOUD.username,
- password: config.esConfig.ELASTICCLOUD.password
- }
- })
- } else {
- esClient = new elasticsearch.Client({
- node: host
- })
- }
-
- // Patch the transport to enable mutex
- esClient.transport.originalRequest = esClient.transport.request
- esClient.transport.request = async (params) => {
- const tId = _.get(params.querystring, 'transactionId')
- params.querystring = _.omit(params.querystring, 'transactionId')
- if (!tId || tId !== transactionId) {
- const release = await esClientMutex.acquire()
- mutexReleaseMap[tId || 'noTransaction'] = release
- transactionId = tId
- }
- try {
- return await esClient.transport.originalRequest(params)
- } finally {
- if (params.method !== 'GET' || !tId) {
- const release = mutexReleaseMap[tId || 'noTransaction']
- delete mutexReleaseMap[tId || 'noTransaction']
- transactionId = undefined
- if (release) {
- release()
- }
- }
- }
- }
-
- // create document or catch conflict error
- esClient.createExtra = async function (data) {
- try {
- await esClient.create(data)
- } catch (err) {
- if (err.statusCode === 409) {
- throw new errors.ConflictError(`id: ${data.id} "${data.index}" already exists`)
- }
- throw err
- }
- }
-
- // update document or catch not found error
- esClient.updateExtra = async function (data) {
- try {
- await esClient.update(data)
- } catch (err) {
- if (err.statusCode === 404) {
- throw new errors.NotFoundError(`id: ${data.id} "${data.index}" not found`)
- }
- throw err
- }
- }
-
- // get document or catch not found error
- esClient.getExtra = async function (data) {
- let doc
-
- try {
- doc = await esClient.getSource(data)
- } catch (err) {
- if (err.statusCode === 404) {
- throw new errors.NotFoundError(`id: ${data.id} "${data.index}" not found`)
- }
- throw err
- }
-
- return doc
- }
-
- // delete document or catch not found error
- esClient.deleteExtra = async function (data) {
- try {
- await esClient.delete(data)
- } catch (err) {
- if (err.statusCode === 404) {
- throw new errors.NotFoundError(`id: ${data.id} "${data.index}" not found`)
- }
- throw err
- }
- }
-
- return esClient
-}
-
-/**
- * Ensure the esClient mutex is released
- * @param {String} tId transactionId
- */
-function checkEsMutexRelease (tId) {
- if (tId === transactionId) {
- const release = mutexReleaseMap[tId]
- delete mutexReleaseMap[tId]
- transactionId = undefined
- if (release) {
- release()
- }
- }
-}
-
/*
* Function to get M2M token
* @returns {Promise}
@@ -180,68 +45,24 @@ async function postMessageViaWebhook (webhook, message) {
await request.post(webhook).send(message)
}
-let busApiClient
-
-/**
- * Get bus api client.
- *
- * @returns {Object} the bus api client
- */
-function getBusApiClient () {
- if (busApiClient) {
- return busApiClient
- }
- busApiClient = busApi(
- _.assign(_.pick(config.auth0, [
- 'AUTH0_URL',
- 'AUTH0_AUDIENCE',
- 'TOKEN_CACHE_TIME',
- 'AUTH0_CLIENT_ID',
- 'AUTH0_CLIENT_SECRET',
- 'AUTH0_PROXY_SERVER_URL'
- ]), _.pick(config, 'BUSAPI_URL'),
- _.pick(config.topics, 'KAFKA_ERROR_TOPIC'))
-
- )
- return busApiClient
-}
-
-/**
- * Send Kafka event message
- * @param {String} topic the topic name
- * @param {Object} payload the payload
- */
-async function postEvent (topic, payload) {
- logger.debug({ component: 'helper', context: 'postEvent', message: `Posting event to Kafka topic ${topic}, ${JSON.stringify(payload)}` })
-
- const client = getBusApiClient()
- const message = {
- topic,
- originator: config.KAFKA_MESSAGE_ORIGINATOR,
- timestamp: new Date().toISOString(),
- 'mime-type': 'application/json',
- payload
- }
- await client.postEvent(message)
-}
-
/**
- * Sleep for a given number of milliseconds.
+ * Get job by jobId
*
- * @param {Number} milliseconds the sleep time
+ * @param {String} jobId jobId
* @returns {undefined}
*/
-async function sleep (milliseconds) {
- return new Promise((resolve) => setTimeout(resolve, milliseconds))
+async function getJobById (jobId) {
+ logger.debug({ component: 'helper', context: 'getJobById', message: `jobId: ${jobId}` })
+
+ const token = await getM2MToken()
+ const { body: job } = await request.get(`${config.TAAS_API_URL}/jobs/${jobId}`)
+ .set('Authorization', `Bearer ${token}`)
+ return job
}
module.exports = {
- sleep,
getKafkaOptions,
- getESClient,
- checkEsMutexRelease,
+ getJobById,
getM2MToken,
- postMessageViaWebhook,
- getBusApiClient,
- postEvent
+ postMessageViaWebhook
}
diff --git a/src/scripts/createIndex.js b/src/scripts/createIndex.js
deleted file mode 100644
index 7eb7620..0000000
--- a/src/scripts/createIndex.js
+++ /dev/null
@@ -1,246 +0,0 @@
-/**
- * Create index in Elasticsearch
- */
-
-const config = require('config')
-const logger = require('../common/logger')
-const helper = require('../common/helper')
-
-async function createIndex () {
- const esClient = helper.getESClient()
-
- const indices = [
- {
- index: config.get('esConfig.ES_INDEX_JOB'),
- body: {
- mappings: {
- properties: {
- projectId: { type: 'integer' },
- externalId: { type: 'keyword' },
- description: { type: 'text' },
- title: { type: 'text' },
- startDate: { type: 'date' },
- duration: { type: 'integer' },
- numPositions: { type: 'integer' },
- resourceType: { type: 'keyword' },
- rateType: { type: 'keyword' },
- workload: { type: 'keyword' },
- skills: { type: 'keyword' },
- roles: { type: 'keyword' },
- status: { type: 'keyword' },
- isApplicationPageActive: { type: 'boolean' },
- minSalary: { type: 'integer' },
- maxSalary: { type: 'integer' },
- hoursPerWeek: { type: 'integer' },
- jobLocation: { type: 'keyword' },
- jobTimezone: { type: 'keyword' },
- currency: { type: 'keyword' },
- roleIds: { type: 'keyword' },
- createdAt: { type: 'date' },
- createdBy: { type: 'keyword' },
- updatedAt: { type: 'date' },
- updatedBy: { type: 'keyword' }
- }
- }
- }
- },
- {
- index: config.get('esConfig.ES_INDEX_JOB_CANDIDATE'),
- body: {
- mappings: {
- properties: {
- jobId: { type: 'keyword' },
- userId: { type: 'keyword' },
- status: { type: 'keyword' },
- viewedByCustomer: { type: 'boolean' },
- externalId: { type: 'keyword' },
- resume: { type: 'text' },
- remark: { type: 'keyword' },
- interviews: {
- type: 'nested',
- properties: {
- id: { type: 'keyword' },
- xaiId: { type: 'keyword' },
- jobCandidateId: { type: 'keyword' },
- calendarEventId: { type: 'keyword' },
- templateUrl: { type: 'keyword' },
- templateId: { type: 'keyword' },
- templateType: { type: 'keyword' },
- title: { type: 'keyword' },
- locationDetails: { type: 'keyword' },
- duration: { type: 'integer' },
- startTimestamp: { type: 'date' },
- endTimestamp: { type: 'date' },
- hostName: { type: 'keyword' },
- hostEmail: { type: 'keyword' },
- guestNames: { type: 'keyword' },
- guestEmails: { type: 'keyword' },
- round: { type: 'integer' },
- status: { type: 'keyword' },
- rescheduleUrl: { type: 'keyword' },
- createdAt: { type: 'date' },
- createdBy: { type: 'keyword' },
- updatedAt: { type: 'date' },
- updatedBy: { type: 'keyword' },
- deletedAt: { type: 'date' }
- }
- },
- createdAt: { type: 'date' },
- createdBy: { type: 'keyword' },
- updatedAt: { type: 'date' },
- updatedBy: { type: 'keyword' }
- }
- }
- }
- },
- {
- index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'),
- body: {
- mappings: {
- properties: {
- projectId: { type: 'integer' },
- userId: { type: 'keyword' },
- jobId: { type: 'keyword' },
- status: { type: 'keyword' },
- startDate: { type: 'date', format: 'yyyy-MM-dd' },
- endDate: { type: 'date', format: 'yyyy-MM-dd' },
- sendWeeklySurvey: { type: 'boolean' },
- memberRate: { type: 'float' },
- customerRate: { type: 'float' },
- rateType: { type: 'keyword' },
- billingAccountId: { type: 'integer', null_value: 0 },
- workPeriods: {
- type: 'nested',
- properties: {
- id: { type: 'keyword' },
- resourceBookingId: { type: 'keyword' },
- userHandle: { type: 'keyword',
- normalizer: 'lowercaseNormalizer' },
- projectId: { type: 'integer' },
- userId: { type: 'keyword' },
- sentSurvey: { type: 'boolean' },
- sentSurveyError: {
- type: 'nested',
- properties: {
- errorCode: { type: 'integer' },
- errorMessage: { type: 'keyword' }
- }
- },
- startDate: { type: 'date', format: 'yyyy-MM-dd' },
- endDate: { type: 'date', format: 'yyyy-MM-dd' },
- daysWorked: { type: 'integer' },
- daysPaid: { type: 'integer' },
- paymentTotal: { type: 'float' },
- paymentStatus: { type: 'keyword' },
- payments: {
- type: 'nested',
- properties: {
- id: { type: 'keyword' },
- workPeriodId: { type: 'keyword' },
- challengeId: { type: 'keyword' },
- memberRate: { type: 'float' },
- customerRate: { type: 'float' },
- days: { type: 'integer' },
- amount: { type: 'float' },
- status: { type: 'keyword' },
- statusDetails: {
- type: 'nested',
- properties: {
- errorMessage: { type: 'text' },
- errorCode: { type: 'integer' },
- retry: { type: 'integer' },
- step: { type: 'keyword' },
- challengeId: { type: 'keyword' }
- }
- },
- billingAccountId: { type: 'integer' },
- createdAt: { type: 'date' },
- createdBy: { type: 'keyword' },
- updatedAt: { type: 'date' },
- updatedBy: { type: 'keyword' }
- }
- },
- createdAt: { type: 'date' },
- createdBy: { type: 'keyword' },
- updatedAt: { type: 'date' },
- updatedBy: { type: 'keyword' }
- }
- },
- createdAt: { type: 'date' },
- createdBy: { type: 'keyword' },
- updatedAt: { type: 'date' },
- updatedBy: { type: 'keyword' }
- }
- }
- }
- },
- { index: config.get('esConfig.ES_INDEX_ROLE'),
- body: {
- mappings: {
- properties: {
- name: { type: 'keyword',
- normalizer: 'lowercaseNormalizer' },
- description: { type: 'keyword' },
- listOfSkills: { type: 'keyword',
- normalizer: 'lowercaseNormalizer' },
- rates: {
- properties: {
- global: { type: 'integer' },
- inCountry: { type: 'integer' },
- offShore: { type: 'integer' },
- rate30Global: { type: 'integer' },
- rate30InCountry: { type: 'integer' },
- rate30OffShore: { type: 'integer' },
- rate20Global: { type: 'integer' },
- rate20InCountry: { type: 'integer' },
- rate20OffShore: { type: 'integer' }
- }
- },
- numberOfMembers: { type: 'integer' },
- numberOfMembersAvailable: { type: 'integer' },
- imageUrl: { type: 'keyword' },
- timeToCandidate: { type: 'integer' },
- timeToInterview: { type: 'integer' },
- createdAt: { type: 'date' },
- createdBy: { type: 'keyword' },
- updatedAt: { type: 'date' },
- updatedBy: { type: 'keyword' }
- }
- }
- }
- }
- ]
-
- for (const index of indices) {
- await esClient.indices.create({ index: index.index })
- await esClient.indices.close({ index: index.index })
- await esClient.indices.putSettings({
- index: index.index,
- body: {
- settings: {
- analysis: {
- normalizer: {
- lowercaseNormalizer: {
- filter: ['lowercase']
- }
- }
- }
- }
- }
- })
- await esClient.indices.open({ index: index.index })
- await esClient.indices.putMapping({
- index: index.index,
- body: {
- properties: index.body.mappings.properties
- }
- })
- logger.info({ component: 'createIndex', message: `ES Index ${index.index} creation succeeded!` })
- }
- process.exit(0)
-}
-
-createIndex().catch((err) => {
- logger.logFullError(err, { component: 'createIndex' })
- process.exit(1)
-})
diff --git a/src/scripts/deleteIndex.js b/src/scripts/deleteIndex.js
deleted file mode 100644
index 84e15bc..0000000
--- a/src/scripts/deleteIndex.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * Delete index in Elasticsearch
- */
-
-const config = require('config')
-const logger = require('../common/logger')
-const helper = require('../common/helper')
-
-async function deleteIndex () {
- logger.info({ component: 'deleteIndex', message: 'ES Index deletion started!' })
- const esClient = helper.getESClient()
- const indices = [config.get('esConfig.ES_INDEX_JOB'),
- config.get('esConfig.ES_INDEX_JOB_CANDIDATE'),
- config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'),
- config.get('esConfig.ES_INDEX_ROLE')]
- for (const index of indices) {
- await esClient.indices.delete({
- index
- })
- logger.info({ component: 'deleteIndex', message: `ES Index ${index} deletion succeeded!` })
- }
- process.exit(0)
-}
-deleteIndex().catch((err) => {
- logger.logFullError(err, { component: 'deleteIndex' })
- process.exit(1)
-})
diff --git a/src/scripts/view-data.js b/src/scripts/view-data.js
deleted file mode 100644
index c422c0c..0000000
--- a/src/scripts/view-data.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * View ES data.
- */
-
-const helper = require('../common/helper')
-const logger = require('../common/logger')
-const config = require('config')
-
-const esClient = helper.getESClient()
-
-const modelIndexMapping = {
- Job: 'ES_INDEX_JOB',
- JobCandidate: 'ES_INDEX_JOB_CANDIDATE',
- ResourceBooking: 'ES_INDEX_RESOURCE_BOOKING',
- Role: 'ES_INDEX_ROLE'
-}
-
-async function showESData () {
- if (process.argv.length < 3) {
- throw new Error('You must specify a model name. Usage: npm run view-data [modelName]')
- }
- const modelName = process.argv[2]
- if (!modelIndexMapping[modelName]) {
- throw new Error(`Model name must be one of ${Object.keys(modelIndexMapping)}`)
- }
- const result = await esClient.search({
- index: config.get(`esConfig.${modelIndexMapping[modelName]}`)
- })
- return result.body.hits.hits.map((doc) => doc._source)
-}
-
-showESData()
- .then(result => {
- console.log(
- JSON.stringify(result, null, 2)
- )
- process.exit()
- })
- .catch(err => {
- logger.logFullError(err, { component: 'view-data' })
- process.exit(1)
- })
diff --git a/src/services/ActionProcessorService.js b/src/services/ActionProcessorService.js
deleted file mode 100644
index 662b0c7..0000000
--- a/src/services/ActionProcessorService.js
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * Action Processor Service
- */
-
-const Joi = require('@hapi/joi')
-const logger = require('../common/logger')
-const helper = require('../common/helper')
-const config = require('config')
-
-const localLogger = {
- debug: ({ context, message }) => logger.debug({ component: 'ActionProcessorService', context, message })
-}
-
-/**
- * Process retry operation message
- * @param {Object} message the kafka message
- * @param {String} transactionId
- */
-async function processRetry (message, transactionId) {
- if (message.originator !== config.KAFKA_MESSAGE_ORIGINATOR) {
- localLogger.debug({ context: 'processRetry', message: `originator: ${message.originator} does not match with ${config.KAFKA_MESSAGE_ORIGINATOR} - ignored` })
- return
- }
- const { topicServiceMapping } = require('../app')
- const retry = message.payload.retry
- message.topic = message.payload.originalTopic
- message.payload = message.payload.originalPayload
- await topicServiceMapping[message.topic](message, transactionId, { retry })
-}
-
-processRetry.schema = {
- message: Joi.object().keys({
- topic: Joi.string().required(),
- originator: Joi.string().required(),
- timestamp: Joi.date().required(),
- 'mime-type': Joi.string().required(),
- payload: Joi.object().keys({
- originalTopic: Joi.string().required(),
- originalPayload: Joi.object().required(),
- retry: Joi.number().integer().min(1).required()
- }).required()
- }).required(),
- transactionId: Joi.string().required()
-}
-
-/**
- * Analyzes the failed process and sends it to bus api to be received again.
- * @param {String} originalTopic the failed topic name
- * @param {Object} originalPayload the payload
- * @param {Number} retry how many times has it been retried
- *
- * @returns {Promise|null} returns Promise which would be resolved when retry event sent to Kafka,
- * or `null` if it would not be scheduled
- */
-function scheduleRetry (originalTopic, originalPayload, retry) {
- retry = retry + 1
- if (retry > config.MAX_RETRY) {
- localLogger.debug({ context: 'scheduleRetry', message: `retry: ${retry} for topic: ${originalTopic} id: ${originalPayload.id} exceeds the max retry: ${config.MAX_RETRY} - ignored` })
- return
- }
-
- localLogger.debug({ context: 'scheduleRetry', message: `retry: ${retry} for topic: ${originalTopic} id: ${originalPayload.id}` })
-
- const payload = {
- originalTopic,
- originalPayload,
- retry
- }
-
- return helper.sleep(2 ** retry * config.BASE_RETRY_DELAY).then(() =>
- helper.postEvent(config.topics.TAAS_ACTION_RETRY_TOPIC, payload)
- )
-}
-
-module.exports = {
- processRetry
-}
-
-logger.buildService(module.exports, 'ActionProcessorService')
-
-// we don't want to wrap this method into service wrappers
-// because it would transform this method to `async` while we want to keep it sync
-module.exports.scheduleRetry = scheduleRetry
diff --git a/src/services/InterviewProcessorService.js b/src/services/InterviewProcessorService.js
deleted file mode 100644
index 3af01a8..0000000
--- a/src/services/InterviewProcessorService.js
+++ /dev/null
@@ -1,202 +0,0 @@
-/**
- * Interview Processor Service
- */
-
-const Joi = require('@hapi/joi')
-const _ = require('lodash')
-const logger = require('../common/logger')
-const helper = require('../common/helper')
-const constants = require('../common/constants')
-const config = require('config')
-
-const esClient = helper.getESClient()
-
-/**
- * Updates jobCandidate via a painless script
- *
- * @param {String} jobCandidateId job candidate id
- * @param {String} script script definition
- * @param {String} transactionId transaction id
- */
-async function updateJobCandidateViaScript (jobCandidateId, script, transactionId) {
- await esClient.updateExtra({
- index: config.get('esConfig.ES_INDEX_JOB_CANDIDATE'),
- id: jobCandidateId,
- transactionId,
- body: { script },
- refresh: constants.esRefreshOption
- })
-}
-
-/**
- * Process request interview entity message.
- * Creates an interview record under jobCandidate.
- *
- * @param {Object} message the kafka message
- * @param {String} transactionId
- */
-async function processRequestInterview (message, transactionId) {
- const interview = message.payload
- // add interview in collection if there's already an existing collection
- // or initiate a new one with this interview
- const script = {
- source: `
- ctx._source.containsKey("interviews")
- ? ctx._source.interviews.add(params.interview)
- : ctx._source.interviews = [params.interview]
- `,
- params: { interview }
- }
- await updateJobCandidateViaScript(interview.jobCandidateId, script, transactionId)
-}
-
-processRequestInterview.schema = {
- message: Joi.object().keys({
- topic: Joi.string().required(),
- originator: Joi.string().required(),
- timestamp: Joi.date().required(),
- 'mime-type': Joi.string().required(),
- key: Joi.string().allow(null),
- payload: Joi.object().keys({
- id: Joi.string().uuid().required(),
- xaiId: Joi.string().allow(null),
- jobCandidateId: Joi.string().uuid().required(),
- calendarEventId: Joi.string().allow(null),
- templateUrl: Joi.xaiTemplate().required(),
- templateId: Joi.string().allow(null),
- templateType: Joi.string().allow(null),
- title: Joi.string().allow(null),
- locationDetails: Joi.string().allow(null),
- round: Joi.number().integer().positive().required(),
- duration: Joi.number().integer().positive().required(),
- startTimestamp: Joi.date().allow(null),
- endTimestamp: Joi.date().allow(null),
- hostName: Joi.string().required(),
- hostEmail: Joi.string().email().required(),
- guestNames: Joi.array().items(Joi.string()).allow(null),
- guestEmails: Joi.array().items(Joi.string().email()).allow(null),
- status: Joi.interviewStatus().required(),
- rescheduleUrl: Joi.string().allow(null),
- createdAt: Joi.date().required(),
- createdBy: Joi.string().uuid().required(),
- updatedAt: Joi.date().allow(null),
- updatedBy: Joi.string().uuid().allow(null),
- deletedAt: Joi.date().allow(null)
- }).required()
- }).required(),
- transactionId: Joi.string().required()
-}
-
-/**
- * Process update interview entity message
- * Updates the interview record under jobCandidate.
- *
- * @param {Object} message the kafka message
- * @param {String} transactionId
- */
-async function processUpdateInterview (message, transactionId) {
- const interview = message.payload
- // if there's an interview with this id,
- // update it with the payload
- const script = {
- source: `
- if (ctx._source.containsKey("interviews")) {
- def target = ctx._source.interviews.find(i -> i.id == params.interview.id);
- if (target != null) {
- for (prop in params.interview.entrySet()) {
- target[prop.getKey()] = prop.getValue()
- }
- }
- }
- `,
- params: { interview }
- }
- await updateJobCandidateViaScript(interview.jobCandidateId, script, transactionId)
-}
-
-processUpdateInterview.schema = processRequestInterview.schema
-
-/**
- * Process bulk (partially) update interviews entity message.
- * Currently supports status, updatedAt and updatedBy fields.
- * Update Joi schema to allow more fields.
- * (implementation should already handle new fields - just updating Joi schema should be enough)
- *
- * payload format:
- * {
- * "jobCandidateId": {
- * "interviewId": { ...fields },
- * "interviewId2": { ...fields },
- * ...
- * },
- * "jobCandidateId2": { // like above... },
- * ...
- * }
- *
- * @param {Object} message the kafka message
- * @param {String} transactionId
- */
-async function processBulkUpdateInterviews (message, transactionId) {
- const jobCandidates = message.payload
- // script to update & params
- const script = {
- source: `
- def completedInterviews = params.jobCandidates[ctx._id];
- for (interview in completedInterviews.entrySet()) {
- def interviewId = interview.getKey();
- def affectedFields = interview.getValue();
- def target = ctx._source.interviews.find(i -> i.id == interviewId);
- if (target != null) {
- for (field in affectedFields.entrySet()) {
- target[field.getKey()] = field.getValue();
- }
- }
- }
- `,
- params: { jobCandidates }
- }
- // update interviews
- await esClient.updateByQuery({
- index: config.get('esConfig.ES_INDEX_JOB_CANDIDATE'),
- transactionId,
- body: {
- script,
- query: {
- ids: {
- values: _.keys(jobCandidates)
- }
- }
- },
- refresh: true
- })
-}
-
-processBulkUpdateInterviews.schema = {
- message: Joi.object().keys({
- topic: Joi.string().required(),
- originator: Joi.string().required(),
- timestamp: Joi.date().required(),
- 'mime-type': Joi.string().required(),
- key: Joi.string().allow(null),
- payload: Joi.object().pattern(
- Joi.string().uuid(), // key - jobCandidateId
- Joi.object().pattern(
- Joi.string().uuid(), // inner key - interviewId
- Joi.object().keys({
- status: Joi.interviewStatus(),
- updatedAt: Joi.date(),
- updatedBy: Joi.string().uuid()
- }) // inner value - affected fields of interview
- ) // value - object containing interviews
- ).min(1) // at least one key - i.e. don't allow empty object
- }).required(),
- transactionId: Joi.string().required()
-}
-
-module.exports = {
- processRequestInterview,
- processUpdateInterview,
- processBulkUpdateInterviews
-}
-
-logger.buildService(module.exports, 'InterviewProcessorService')
diff --git a/src/services/JobCandidateProcessorService.js b/src/services/JobCandidateProcessorService.js
index 3f25882..c392d42 100644
--- a/src/services/JobCandidateProcessorService.js
+++ b/src/services/JobCandidateProcessorService.js
@@ -8,8 +8,6 @@ const helper = require('../common/helper')
const constants = require('../common/constants')
const config = require('config')
-const esClient = helper.getESClient()
-
const localLogger = {
debug: ({ context, message }) => logger.debug({ component: 'JobCandidateProcessorService', context, message })
}
@@ -20,28 +18,21 @@ const localLogger = {
* @param {Object} message the message object
* @returns {undefined}
*/
-async function updateCandidateStatus ({ type, payload, previousData }) {
- // if (previousData.status === payload.status) {
- // localLogger.debug({ context: 'updateCandidateStatus', message: `jobCandidate is already in status: ${payload.status}` })
- // return
- // }
+async function updateCandidateStatus ({ type, payload }) {
// if (!['rejected', 'shortlist',].includes(payload.status)) {
if (!['client rejected - screening', 'client rejected - interview', 'interview', 'selected', 'withdrawn', 'withdrawn-prescreen'].includes(payload.status)) {
localLogger.debug({ context: 'updateCandidateStatus', message: `not interested status: ${payload.status}` })
return
}
- const { body: jobCandidate } = await esClient.getSource({
- index: config.get('esConfig.ES_INDEX_JOB_CANDIDATE'),
- id: payload.id
- })
+ const jobCandidate = payload
+
if (!jobCandidate.externalId) {
localLogger.debug({ context: 'updateCandidateStatus', message: `id: ${jobCandidate.id} candidate without externalId - ignored` })
return
}
- const { body: job } = await esClient.getSource({
- index: config.get('esConfig.ES_INDEX_JOB'),
- id: jobCandidate.jobId
- })
+
+ const job = await helper.getJobById(jobCandidate.jobId)
+
const message = {
type,
status: jobCandidate.status,
@@ -57,35 +48,33 @@ async function updateCandidateStatus ({ type, payload, previousData }) {
* @param {Object} message the message object
* @returns {undefined}
*/
-async function postMessageToZapier ({ type, payload, previousData }) {
+async function postMessageToZapier ({ type, payload }) {
if (config.zapier.ZAPIER_JOB_CANDIDATE_SWITCH === constants.Zapier.Switch.OFF) {
localLogger.debug({ context: 'postMessageToZapier', message: 'Zapier Switch off via config, no messages sent' })
return
}
if (type === constants.Zapier.MessageType.JobCandidateUpdate) {
- await updateCandidateStatus({ type, payload, previousData })
+ await updateCandidateStatus({ type, payload })
return
}
throw new Error(`unrecognized message type: ${type}`)
}
/**
- * Process create entity message
+ * Process update entity message
* @param {Object} message the kafka message
* @param {String} transactionId
*/
-async function processCreate (message, transactionId) {
- const jobcandidate = message.payload
- await esClient.createExtra({
- index: config.get('esConfig.ES_INDEX_JOB_CANDIDATE'),
- id: jobcandidate.id,
- transactionId,
- body: jobcandidate,
- refresh: constants.esRefreshOption
+async function processUpdate (message, transactionId) {
+ const data = message.payload
+
+ await postMessageToZapier({
+ type: constants.Zapier.MessageType.JobCandidateUpdate,
+ payload: data
})
}
-processCreate.schema = {
+processUpdate.schema = {
message: Joi.object()
.keys({
topic: Joi.string().required(),
@@ -114,70 +103,8 @@ processCreate.schema = {
transactionId: Joi.string().required()
}
-/**
- * Process update entity message
- * @param {Object} message the kafka message
- * @param {String} transactionId
- */
-async function processUpdate (message, transactionId) {
- const data = message.payload
- // save previous data for Zapier logic
- // NOTE: ideally if we update Kafka event message to have both: pervious and updated value so we don't have to request it again
- const { body: previousData } = await esClient.getExtra({
- index: config.get('esConfig.ES_INDEX_JOB_CANDIDATE'),
- id: data.id
- })
- // await esClient.updateExtra({
- // index: config.get('esConfig.ES_INDEX_JOB_CANDIDATE'),
- // id: data.id,
- // transactionId,
- // body: {
- // doc: data
- // },
- // refresh: constants.esRefreshOption
- // })
- await postMessageToZapier({
- type: constants.Zapier.MessageType.JobCandidateUpdate,
- payload: data,
- previousData
- })
-}
-
-processUpdate.schema = processCreate.schema
-
-/**
- * Process delete entity message
- * @param {Object} message the kafka message
- * @param {String} transactionId
- */
-async function processDelete (message, transactionId) {
- const id = message.payload.id
- await esClient.deleteExtra({
- index: config.get('esConfig.ES_INDEX_JOB_CANDIDATE'),
- id,
- transactionId,
- refresh: constants.esRefreshOption
- })
-}
-
-processDelete.schema = {
- message: Joi.object().keys({
- topic: Joi.string().required(),
- originator: Joi.string().required(),
- timestamp: Joi.date().required(),
- 'mime-type': Joi.string().required(),
- key: Joi.string().allow(null),
- payload: Joi.object().keys({
- id: Joi.string().uuid().required()
- }).required()
- }).required(),
- transactionId: Joi.string().required()
-}
-
module.exports = {
- // processCreate,
processUpdate
- // processDelete
}
logger.buildService(module.exports, 'JobCandidateProcessorService')
diff --git a/src/services/JobProcessorService.js b/src/services/JobProcessorService.js
index a1e6388..02f3b1d 100644
--- a/src/services/JobProcessorService.js
+++ b/src/services/JobProcessorService.js
@@ -8,8 +8,6 @@ const helper = require('../common/helper')
const constants = require('../common/constants')
const config = require('config')
-const esClient = helper.getESClient()
-
const localLogger = {
debug: ({ context, message }) => logger.debug({ component: 'JobProcessorService', context, message })
}
@@ -46,13 +44,6 @@ async function postMessageToZapier ({ type, payload }) {
*/
async function processCreate (message, transactionId) {
const job = message.payload
- // await esClient.createExtra({
- // index: config.get('esConfig.ES_INDEX_JOB'),
- // id: job.id,
- // transactionId,
- // body: job,
- // refresh: constants.esRefreshOption
- // })
await postMessageToZapier({
type: constants.Zapier.MessageType.JobCreate,
payload: job
@@ -110,15 +101,6 @@ processCreate.schema = {
*/
async function processUpdate (message, transactionId) {
const data = message.payload
- // await esClient.updateExtra({
- // index: config.get('esConfig.ES_INDEX_JOB'),
- // id: data.id,
- // transactionId,
- // body: {
- // doc: data
- // },
- // refresh: constants.esRefreshOption
- // })
await postMessageToZapier({
type: constants.Zapier.MessageType.JobUpdate,
payload: data
@@ -127,39 +109,9 @@ async function processUpdate (message, transactionId) {
processUpdate.schema = processCreate.schema
-/**
- * Process delete entity message
- * @param {Object} message the kafka message
- * @param {String} transactionId
- */
-async function processDelete (message, transactionId) {
- const id = message.payload.id
- await esClient.deleteExtra({
- index: config.get('esConfig.ES_INDEX_JOB'),
- id,
- transactionId,
- refresh: constants.esRefreshOption
- })
-}
-
-processDelete.schema = {
- message: Joi.object().keys({
- topic: Joi.string().required(),
- originator: Joi.string().required(),
- timestamp: Joi.date().required(),
- 'mime-type': Joi.string().required(),
- key: Joi.string().allow(null),
- payload: Joi.object().keys({
- id: Joi.string().uuid().required()
- }).required()
- }).required(),
- transactionId: Joi.string().required()
-}
-
module.exports = {
processCreate,
- processUpdate,
- processDelete
+ processUpdate
}
logger.buildService(module.exports, 'JobProcessorService')
diff --git a/src/services/ResourceBookingProcessorService.js b/src/services/ResourceBookingProcessorService.js
deleted file mode 100644
index f81c231..0000000
--- a/src/services/ResourceBookingProcessorService.js
+++ /dev/null
@@ -1,113 +0,0 @@
-/**
- * ResourceBooking Processor Service
- */
-
-const Joi = require('@hapi/joi')
-const logger = require('../common/logger')
-const helper = require('../common/helper')
-const constants = require('../common/constants')
-const config = require('config')
-
-const esClient = helper.getESClient()
-
-/**
- * Process create entity message
- * @param {Object} message the kafka message
- * @param {String} transactionId
- */
-async function processCreate (message, transactionId) {
- const resourcebooking = message.payload
- await esClient.createExtra({
- index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'),
- id: resourcebooking.id,
- transactionId,
- body: resourcebooking,
- refresh: constants.esRefreshOption
- })
-}
-
-processCreate.schema = {
- message: Joi.object().keys({
- topic: Joi.string().required(),
- originator: Joi.string().required(),
- timestamp: Joi.date().required(),
- 'mime-type': Joi.string().required(),
- key: Joi.string().allow(null),
- payload: Joi.object().keys({
- id: Joi.string().uuid().required(),
- projectId: Joi.number().integer().required(),
- userId: Joi.string().uuid().required(),
- sendWeeklySurvey: Joi.boolean().required(),
- jobId: Joi.string().uuid().allow(null),
- startDate: Joi.string().regex(/^(19|20)\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$/).allow(null),
- endDate: Joi.string().regex(/^(19|20)\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$/).allow(null),
- memberRate: Joi.number().allow(null),
- customerRate: Joi.number().allow(null),
- rateType: Joi.rateType().required(),
- createdAt: Joi.date().required(),
- createdBy: Joi.string().uuid().required(),
- updatedAt: Joi.date().allow(null),
- updatedBy: Joi.string().uuid().allow(null),
- status: Joi.resourceBookingStatus().required(),
- billingAccountId: Joi.number().allow(null)
- }).required()
- }).required(),
- transactionId: Joi.string().required()
-}
-
-/**
- * Process update entity message
- * @param {Object} message the kafka message
- * @param {String} transactionId
- */
-async function processUpdate (message, transactionId) {
- const data = message.payload
- await esClient.updateExtra({
- index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'),
- id: data.id,
- transactionId,
- body: {
- doc: data
- },
- refresh: constants.esRefreshOption
- })
-}
-
-processUpdate.schema = processCreate.schema
-
-/**
- * Process delete entity message
- * @param {Object} message the kafka message
- * @param {String} transactionId
- */
-async function processDelete (message, transactionId) {
- const id = message.payload.id
- await esClient.deleteExtra({
- index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'),
- id,
- transactionId,
- refresh: constants.esRefreshOption
- })
-}
-
-processDelete.schema = {
- message: Joi.object().keys({
- topic: Joi.string().required(),
- originator: Joi.string().required(),
- timestamp: Joi.date().required(),
- 'mime-type': Joi.string().required(),
- key: Joi.string().allow(null),
- payload: Joi.object().keys({
- id: Joi.string().uuid().required()
- }).required()
- }).required(),
- transactionId: Joi.string().required()
-}
-
-module.exports = {
- processCreate,
- processUpdate,
- processDelete
-}
-
-logger.buildService(module.exports, 'ResourceBookingProcessorService')
diff --git a/src/services/RoleProcessorService.js b/src/services/RoleProcessorService.js
deleted file mode 100644
index 3ab5976..0000000
--- a/src/services/RoleProcessorService.js
+++ /dev/null
@@ -1,124 +0,0 @@
-/**
- * Role Processor Service
- */
-
-const Joi = require('@hapi/joi')
-const logger = require('../common/logger')
-const helper = require('../common/helper')
-const constants = require('../common/constants')
-const config = require('config')
-
-const esClient = helper.getESClient()
-
-/**
- * Process create entity message
- * @param {Object} message the kafka message
- * @param {String} transactionId
- */
-async function processCreate (message, transactionId) {
- const role = message.payload
- await esClient.createExtra({
- index: config.get('esConfig.ES_INDEX_ROLE'),
- id: role.id,
- transactionId,
- body: role,
- refresh: constants.esRefreshOption
- })
-}
-
-processCreate.schema = {
- message: Joi.object().keys({
- topic: Joi.string().required(),
- originator: Joi.string().required(),
- timestamp: Joi.date().required(),
- 'mime-type': Joi.string().required(),
- key: Joi.string().allow(null),
- payload: Joi.object().keys({
- id: Joi.string().uuid().required(),
- name: Joi.string().max(50).required(),
- description: Joi.string().max(1000).allow(null),
- listOfSkills: Joi.array().items(Joi.string().max(50).required()).allow(null),
- rates: Joi.array().items(Joi.object().keys({
- global: Joi.smallint().required(),
- inCountry: Joi.smallint().required(),
- offShore: Joi.smallint().required(),
- niche: Joi.smallint().allow(null),
- rate30Global: Joi.smallint().allow(null),
- rate30Niche: Joi.smallint().allow(null),
- rate30InCountry: Joi.smallint().allow(null),
- rate30OffShore: Joi.smallint().allow(null),
- rate20Global: Joi.smallint().allow(null),
- rate20Niche: Joi.smallint().allow(null),
- rate20InCountry: Joi.smallint().allow(null),
- rate20OffShore: Joi.smallint().allow(null)
- }).required()).required(),
- numberOfMembers: Joi.number().allow(null),
- numberOfMembersAvailable: Joi.smallint().allow(null),
- imageUrl: Joi.string().uri().max(255).allow(null),
- timeToCandidate: Joi.smallint().allow(null),
- timeToInterview: Joi.smallint().allow(null),
- createdAt: Joi.date().required(),
- createdBy: Joi.string().uuid().required(),
- updatedAt: Joi.date().allow(null),
- updatedBy: Joi.string().uuid().allow(null)
- }).required()
- }).required(),
- transactionId: Joi.string().required()
-}
-
-/**
- * Process update entity message
- * @param {Object} message the kafka message
- * @param {String} transactionId
- */
-async function processUpdate (message, transactionId) {
- const data = message.payload
- await esClient.updateExtra({
- index: config.get('esConfig.ES_INDEX_ROLE'),
- id: data.id,
- transactionId,
- body: {
- doc: data
- },
- refresh: constants.esRefreshOption
- })
-}
-
-processUpdate.schema = processCreate.schema
-
-/**
- * Process delete entity message
- * @param {Object} message the kafka message
- * @param {String} transactionId
- */
-async function processDelete (message, transactionId) {
- const id = message.payload.id
- await esClient.deleteExtra({
- index: config.get('esConfig.ES_INDEX_ROLE'),
- id,
- transactionId,
- refresh: constants.esRefreshOption
- })
-}
-
-processDelete.schema = {
- message: Joi.object().keys({
- topic: Joi.string().required(),
- originator: Joi.string().required(),
- timestamp: Joi.date().required(),
- 'mime-type': Joi.string().required(),
- key: Joi.string().allow(null),
- payload: Joi.object().keys({
- id: Joi.string().uuid().required()
- }).required()
- }).required(),
- transactionId: Joi.string().required()
-}
-
-module.exports = {
- processCreate,
- processUpdate,
- processDelete
-}
-
-logger.buildService(module.exports, 'RoleProcessorService')
diff --git a/src/services/WorkPeriodPaymentProcessorService.js b/src/services/WorkPeriodPaymentProcessorService.js
deleted file mode 100644
index 709f94d..0000000
--- a/src/services/WorkPeriodPaymentProcessorService.js
+++ /dev/null
@@ -1,131 +0,0 @@
-/**
- * WorkPeriodPayment Processor Service
- */
-
-const Joi = require('@hapi/joi')
-const config = require('config')
-const logger = require('../common/logger')
-const helper = require('../common/helper')
-const constants = require('../common/constants')
-
-const esClient = helper.getESClient()
-
-/**
- * Process create entity message
- * @param {Object} message the kafka message
- * @param {String} transactionId
- */
-async function processCreate (message, transactionId) {
- const workPeriodPayment = message.payload
- // find related resourceBooking
- const resourceBooking = await esClient.search({
- index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'),
- body: {
- query: {
- nested: {
- path: 'workPeriods',
- query: {
- match: { 'workPeriods.id': workPeriodPayment.workPeriodId }
- }
- }
- }
- }
- })
- if (!resourceBooking.body.hits.total.value) {
- throw new Error(`id: ${workPeriodPayment.workPeriodId} "WorkPeriod" not found`)
- }
- await esClient.update({
- index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'),
- id: resourceBooking.body.hits.hits[0]._id,
- transactionId,
- body: {
- script: {
- lang: 'painless',
- source: 'def wp = ctx._source.workPeriods.find(workPeriod -> workPeriod.id == params.workPeriodPayment.workPeriodId); if(!wp.containsKey("payments") || wp.payments == null){wp["payments"]=[]}wp.payments.add(params.workPeriodPayment)',
- params: { workPeriodPayment }
- }
- },
- refresh: constants.esRefreshOption
- })
-}
-
-processCreate.schema = {
- message: Joi.object().keys({
- topic: Joi.string().required(),
- originator: Joi.string().required(),
- timestamp: Joi.date().required(),
- 'mime-type': Joi.string().required(),
- key: Joi.string().allow(null),
- payload: Joi.object().keys({
- id: Joi.string().uuid().required(),
- workPeriodId: Joi.string().uuid().required(),
- challengeId: Joi.string().uuid().allow(null),
- memberRate: Joi.number().required(),
- customerRate: Joi.number().allow(null),
- days: Joi.number().integer().min(0).max(10).required(),
- amount: Joi.number().greater(0).allow(null),
- status: Joi.workPeriodPaymentStatus().required(),
- billingAccountId: Joi.number().allow(null),
- statusDetails: Joi.object().keys({
- errorMessage: Joi.string().required(),
- errorCode: Joi.number().integer().allow(null),
- retry: Joi.number().integer().allow(null),
- step: Joi.string().allow(null),
- challengeId: Joi.string().uuid().allow(null)
- }).unknown(true).allow(null),
- createdAt: Joi.date().required(),
- createdBy: Joi.string().uuid().required(),
- updatedAt: Joi.date().allow(null),
- updatedBy: Joi.string().uuid().allow(null)
- }).required()
- }).required(),
- transactionId: Joi.string().required()
-}
-
-/**
- * Process update entity message
- * @param {Object} message the kafka message
- * @param {String} transactionId
- */
-async function processUpdate (message, transactionId) {
- const data = message.payload
- // find workPeriodPayment in it's parent ResourceBooking
- const resourceBooking = await esClient.search({
- index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'),
- body: {
- query: {
- nested: {
- path: 'workPeriods.payments',
- query: {
- match: { 'workPeriods.payments.id': data.id }
- }
- }
- }
- }
- })
- if (!resourceBooking.body.hits.total.value) {
- throw new Error(`id: ${data.id} "WorkPeriodPayment" not found`)
- }
- await esClient.update({
- index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'),
- id: resourceBooking.body.hits.hits[0]._id,
- transactionId,
- body: {
- script: {
- lang: 'painless',
- source: 'def wp = ctx._source.workPeriods.find(workPeriod -> workPeriod.id == params.data.workPeriodId); wp.payments.removeIf(payment -> payment.id == params.data.id); wp.payments.add(params.data)',
- params: { data }
- }
- },
- refresh: constants.esRefreshOption
- })
-}
-
-processUpdate.schema = processCreate.schema
-
-module.exports = {
- processCreate,
- processUpdate
-}
-
-logger.buildService(module.exports, 'WorkPeriodPaymentProcessorService')
diff --git a/src/services/WorkPeriodProcessorService.js b/src/services/WorkPeriodProcessorService.js
deleted file mode 100644
index 89129a9..0000000
--- a/src/services/WorkPeriodProcessorService.js
+++ /dev/null
@@ -1,200 +0,0 @@
-/**
- * WorkPeriod Processor Service
- */
-
-const Joi = require('@hapi/joi')
-const logger = require('../common/logger')
-const helper = require('../common/helper')
-const constants = require('../common/constants')
-const config = require('config')
-const esClient = helper.getESClient()
-const ActionProcessorService = require('../services/ActionProcessorService')
-
-/**
- * Process create entity message
- * @param {Object} message the kafka message
- * @param {String} transactionId
- * @param {Object} options
- */
-async function processCreate (message, transactionId, options) {
- const workPeriod = message.payload
- // Find related resourceBooking
- let resourceBooking
- try {
- resourceBooking = await esClient.getExtra({
- index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'),
- transactionId,
- id: workPeriod.resourceBookingId
- })
- } catch (err) {
- // if resource booking was not found, it may be because
- // it has not yet been created. We should send a retry request.
- if (err.httpStatus === 404) {
- const schedulePromise = ActionProcessorService.scheduleRetry(message.topic, workPeriod, options.retry)
- if (schedulePromise) {
- // as retry was scheduled, log this error as warning
- logger.logFullWarning(err, { component: 'WorkPeriodProcessorService', context: 'processCreate' })
- } else {
- // as retry was not scheduled, then log this error as error
- logger.logFullError(err, { component: 'WorkPeriodProcessorService', context: 'processCreate' })
- }
- return
- } else {
- throw err
- }
- }
- await esClient.update({
- index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'),
- id: resourceBooking.body.id,
- transactionId,
- body: {
- script: {
- lang: 'painless',
- source: 'if(!ctx._source.containsKey("workPeriods") || ctx._source.workPeriods == null){ctx._source["workPeriods"]=[]}ctx._source.workPeriods.add(params.workPeriod)',
- params: { workPeriod }
- }
- },
- refresh: constants.esRefreshOption
- })
-}
-
-processCreate.schema = {
- message: Joi.object().keys({
- topic: Joi.string().required(),
- originator: Joi.string().required(),
- timestamp: Joi.date().required(),
- 'mime-type': Joi.string().required(),
- key: Joi.string().allow(null),
- payload: Joi.object().keys({
- id: Joi.string().uuid().required(),
- resourceBookingId: Joi.string().uuid().required(),
- userHandle: Joi.string().required(),
- projectId: Joi.number().integer().required(),
- startDate: Joi.string().required(),
- endDate: Joi.string().required(),
- sentSurvey: Joi.boolean().required(),
- sentSurveyError: Joi.object().keys({
- errorCode: Joi.number().integer().min(0),
- errorMessage: Joi.string()
- }).allow(null),
- daysWorked: Joi.number().integer().min(0).max(10).required(),
- daysPaid: Joi.number().integer().min(0).max(10).required(),
- paymentTotal: Joi.number().min(0).required(),
- paymentStatus: Joi.paymentStatus().required(),
- createdAt: Joi.date().required(),
- createdBy: Joi.string().uuid().required(),
- updatedAt: Joi.date().allow(null),
- updatedBy: Joi.string().uuid().allow(null)
- }).required()
- }).required(),
- transactionId: Joi.string().required(),
- options: Joi.object().keys({
- retry: Joi.number().integer().min(0).default(0)
- }).default({
- retry: 0
- })
-}
-
-/**
- * Process update entity message
- * @param {Object} message the kafka message
- * @param {String} transactionId
- */
-async function processUpdate (message, transactionId) {
- const data = message.payload
- // find workPeriod in it's parent ResourceBooking
- const resourceBooking = await esClient.search({
- index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'),
- transactionId,
- body: {
- query: {
- nested: {
- path: 'workPeriods',
- query: {
- match: { 'workPeriods.id': data.id }
- }
- }
- }
- }
- })
- if (!resourceBooking.body.hits.total.value) {
- throw new Error(`id: ${data.id} "WorkPeriod" not found`)
- }
- await esClient.update({
- index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'),
- id: resourceBooking.body.hits.hits[0]._id,
- transactionId,
- body: {
- script: {
- lang: 'painless',
- source: 'def wp = ctx._source.workPeriods.find(workPeriod -> workPeriod.id == params.data.id); ctx._source.workPeriods.removeIf(workPeriod -> workPeriod.id == params.data.id); params.data.payments = wp.payments; ctx._source.workPeriods.add(params.data)',
- params: { data }
- }
- },
- refresh: constants.esRefreshOption
- })
-}
-
-processUpdate.schema = processCreate.schema
-
-/**
- * Process delete entity message
- * @param {Object} message the kafka message
- * @param {String} transactionId
- */
-async function processDelete (message, transactionId) {
- const data = message.payload
- // Find related ResourceBooking
- const resourceBooking = await esClient.search({
- index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'),
- transactionId,
- body: {
- query: {
- nested: {
- path: 'workPeriods',
- query: {
- match: { 'workPeriods.id': data.id }
- }
- }
- }
- }
- })
- if (!resourceBooking.body.hits.total.value) {
- throw new Error(`id: ${data.id} "WorkPeriod" not found`)
- }
- await esClient.update({
- index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'),
- id: resourceBooking.body.hits.hits[0]._id,
- transactionId,
- body: {
- script: {
- lang: 'painless',
- source: 'ctx._source.workPeriods.removeIf(workPeriod -> workPeriod.id == params.data.id)',
- params: { data }
- }
- },
- refresh: constants.esRefreshOption
- })
-}
-
-processDelete.schema = {
- message: Joi.object().keys({
- topic: Joi.string().required(),
- originator: Joi.string().required(),
- timestamp: Joi.date().required(),
- 'mime-type': Joi.string().required(),
- key: Joi.string().allow(null),
- payload: Joi.object().keys({
- id: Joi.string().uuid().required()
- }).required()
- }).required(),
- transactionId: Joi.string().required()
-}
-
-module.exports = {
- processCreate,
- processUpdate,
- processDelete
-}
-
-logger.buildService(module.exports, 'WorkPeriodProcessorService')
diff --git a/test/common/testData.js b/test/common/testData.js
deleted file mode 100644
index 47a0dd1..0000000
--- a/test/common/testData.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Data for tests.
- */
-const messages = {
- Job: {
- create: { topic: 'taas.job.create', message: require('../messages/taas.job.create.event.json') },
- update: { topic: 'taas.job.update', message: require('../messages/taas.job.update.event.json') },
- delete: { topic: 'taas.job.delete', message: require('../messages/taas.job.delete.event.json') }
- },
- JobCandidate: {
- create: { topic: 'taas.jobcandidate.create', message: require('../messages/taas.jobcandidate.create.event.json') },
- update: { topic: 'taas.jobcandidate.update', message: require('../messages/taas.jobcandidate.update.event.json') },
- delete: { topic: 'taas.jobcandidate.delete', message: require('../messages/taas.jobcandidate.delete.event.json') }
- },
- ResourceBooking: {
- create: { topic: 'taas.resourcebooking.create', message: require('../messages/taas.resourcebooking.create.event.json') },
- update: { topic: 'taas.resourcebooking.update', message: require('../messages/taas.resourcebooking.update.event.json') },
- delete: { topic: 'taas.resourcebooking.delete', message: require('../messages/taas.resourcebooking.delete.event.json') }
- },
- WorkPeriod: {
- create: { topic: 'taas.workperiod.create', message: require('../messages/taas.workperiod.create.event.json') },
- update: { topic: 'taas.workperiod.update', message: require('../messages/taas.workperiod.update.event.json') },
- delete: { topic: 'taas.workperiod.delete', message: require('../messages/taas.workperiod.delete.event.json') }
- },
- WorkPeriodPayment: {
- create: { topic: 'taas.workperiodpayment.create', message: require('../messages/taas.workperiodpayment.create.event.json') },
- update: { topic: 'taas.workperiodpayment.update', message: require('../messages/taas.workperiodpayment.update.event.json') }
- },
- Role: {
- create: { topic: 'taas.role.requested', message: require('../messages/taas.role.create.event.json') },
- update: { topic: 'taas.role.update', message: require('../messages/taas.role.update.event.json') },
- delete: { topic: 'taas.role.delete', message: require('../messages/taas.role.delete.event .json') }
- },
- messageInvalid: '{ "topic": "taas.job.create", }'
-}
-
-// used in unit tests to mock es storage
-const esStorage = { content: {} }
-
-module.exports = {
- messages,
- esStorage
-}
diff --git a/test/common/testHelper.js b/test/common/testHelper.js
deleted file mode 100644
index 6410492..0000000
--- a/test/common/testHelper.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * Contains generic helper methods for test
- */
-const Kafka = require('no-kafka')
-const _ = require('lodash')
-const config = require('config')
-const helper = require('../../src/common/helper')
-
-let producer
-const esClient = helper.getESClient()
-
-/**
- * Send message
- * @param testMessage the test message
- * @param topic the topic name; optional
- */
-async function sendMessage (testMessage, topic) {
- if (!producer) {
- producer = new Kafka.Producer(helper.getKafkaOptions())
- await producer.init()
- }
- await producer.send({
- topic: topic || testMessage.topic,
- message: {
- value: (typeof testMessage) === 'string' ? testMessage : JSON.stringify(testMessage)
- }
- })
-}
-
-/**
- * Delete all documents in ES.
- *
- * @returns {undefined}
- */
-async function clearES () {
- for (const index of Object.values(_.pick(config.esConfig, ['ES_INDEX_JOB', 'ES_INDEX_JOB_CANDIDATE', 'ES_INDEX_RESOURCE_BOOKING']))) {
- await esClient.deleteByQuery({
- index,
- body: {
- query: {
- match_all: {}
- }
- },
- refresh: true
- })
- }
-}
-
-module.exports = {
- sendMessage,
- clearES,
- esClient
-}
diff --git a/test/e2e/test.js b/test/e2e/test.js
deleted file mode 100644
index 020b060..0000000
--- a/test/e2e/test.js
+++ /dev/null
@@ -1,287 +0,0 @@
-/**
- * E2E test of the Taas ES Processor.
- */
-
-const config = require('config')
-const stringcase = require('stringcase')
-const app = require('../../src/app')
-const request = require('superagent')
-const should = require('should')
-const logger = require('../../src/common/logger')
-const testData = require('../common/testData')
-const testHelper = require('../common/testHelper')
-const _ = require('lodash')
-
-describe('Taas ES Processor E2E Test', () => {
- let infoLogs = []
- let errorLogs = []
- let debugLogs = []
- const info = logger.info
- const error = logger.error
- const debug = logger.debug
- const waitForMessageHandled = () => new Promise((resolve) => {
- app.eventEmitter.once('end_handling_message', () => resolve())
- })
- before(async () => {
- // inject logger with log collector
- logger.info = (message) => {
- infoLogs.push(message.message || message)
- info(message)
- }
- logger.debug = (message) => {
- debugLogs.push(message.message || message)
- debug(message)
- }
- logger.error = (message) => {
- errorLogs.push(message.message || message)
- error(message)
- }
- await app.initConsumer()
- })
-
- after(async () => {
- // restore logger
- logger.error = error
- logger.info = info
- logger.debug = debug
-
- await testHelper.clearES()
- })
-
- beforeEach(async () => {
- // clear logs
- infoLogs = []
- debugLogs = []
- errorLogs = []
- await testHelper.clearES()
- })
- describe('General Logic Tests', () => {
- it('Should setup healthcheck with check on kafka connection', async () => {
- const healthcheckEndpoint = `http://localhost:${config.PORT}/health`
- const result = await request.get(healthcheckEndpoint)
- should.equal(result.status, 200)
- should.deepEqual(result.body, { checksRun: 1 })
- })
-
- it('Should handle invalid json message', async () => {
- await testHelper.sendMessage(testData.messages.messageInvalid, config.topics.TAAS_JOB_CREATE_TOPIC)
- await waitForMessageHandled()
- errorLogs[0].should.match(/Invalid message JSON/)
- })
-
- it('Should handle incorrect topic field message', async () => {
- await testHelper.sendMessage(testData.messages.Job.create.message, config.topics.TAAS_JOB_UPDATE_TOPIC)
- await waitForMessageHandled()
- should.equal(errorLogs[0], `The message topic ${testData.messages.Job.create.topic} doesn't match the Kafka topic ${config.topics.TAAS_JOB_UPDATE_TOPIC}.`)
- })
- })
- describe('Job, JobCandidate, ResourceBooking tests', () => {
- for (const [index, model] of [
- [config.esConfig.ES_INDEX_JOB, 'Job'],
- [config.esConfig.ES_INDEX_JOB_CANDIDATE, 'JobCandidate'],
- [config.esConfig.ES_INDEX_RESOURCE_BOOKING, 'ResourceBooking']
- ]) {
- const modelInSpaceCase = stringcase.spacecase(model)
-
- it(`Should handle ${modelInSpaceCase} creation message`, async () => {
- await testHelper.sendMessage(testData.messages[model].create.message)
- await waitForMessageHandled()
- const doc = await testHelper.esClient.get({
- index,
- id: testData.messages[model].create.message.payload.id
- })
- should.deepEqual(doc.body._source, testData.messages[model].create.message.payload, ['id'])
- })
-
- it(`Should handle ${modelInSpaceCase} updating message`, async () => {
- await testHelper.esClient.create({
- index,
- id: testData.messages[model].create.message.payload.id,
- body: testData.messages[model].create.message.payload,
- refresh: 'true'
- })
- await testHelper.sendMessage(testData.messages[model].update.message)
- await waitForMessageHandled()
- const doc = await testHelper.esClient.get({
- index,
- id: testData.messages[model].update.message.payload.id
- })
- should.deepEqual(doc.body._source, testData.messages[model].update.message.payload)
- })
-
- it(`Should handle ${modelInSpaceCase} deletion message`, async () => {
- await testHelper.esClient.create({
- index,
- id: testData.messages[model].create.message.payload.id,
- body: testData.messages[model].create.message.payload,
- refresh: 'true'
- })
- await testHelper.sendMessage(testData.messages[model].delete.message)
- await waitForMessageHandled()
- const doc = await testHelper.esClient.get({
- index,
- id: testData.messages[model].delete.message.payload.id
- }).catch(err => {
- if (err.statusCode === 404) {
- return
- }
- throw err
- })
- should.not.exist(doc)
- })
-
- it(`Failure - creation message - ${modelInSpaceCase} already exists`, async () => {
- await testHelper.esClient.create({
- index,
- id: testData.messages[model].create.message.payload.id,
- body: testData.messages[model].create.message.payload,
- refresh: 'true'
- })
- await testHelper.sendMessage(testData.messages[model].create.message)
- await waitForMessageHandled()
- should.equal(errorLogs[0], `id: ${testData.messages[model].create.message.payload.id} "${index}" already exists`)
- })
-
- it(`Failure - updating message - ${modelInSpaceCase} not found`, async () => {
- await testHelper.sendMessage(testData.messages[model].update.message)
- await waitForMessageHandled()
- should.equal(errorLogs[0], `id: ${testData.messages[model].update.message.payload.id} "${index}" not found`)
- })
-
- it(`Failure - deletion message - ${modelInSpaceCase} not found`, async () => {
- await testHelper.sendMessage(testData.messages[model].delete.message)
- await waitForMessageHandled()
- should.equal(errorLogs[0], `id: ${testData.messages[model].delete.message.payload.id} "${index}" not found`)
- })
- }
- })
- describe('Nested WorkPeriod tests', () => {
- const index = config.esConfig.ES_INDEX_RESOURCE_BOOKING
- const model = 'WorkPeriod'
- const parentModel = 'ResourceBooking'
- const nestedName = 'workPeriods'
- const modelInSpaceCase = stringcase.spacecase(model)
-
- it(`Should handle ${modelInSpaceCase} creation message`, async () => {
- await testHelper.esClient.create({
- index,
- id: testData.messages[parentModel].create.message.payload.id,
- body: testData.messages[parentModel].create.message.payload,
- refresh: 'true'
- })
- await testHelper.sendMessage(testData.messages[model].create.message)
- await waitForMessageHandled()
- const doc = await testHelper.esClient.get({
- index,
- id: testData.messages[parentModel].create.message.payload.id
- })
- should.deepEqual(doc.body._source,
- _.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].create.message.payload] }))
- })
-
- it(`Should handle ${modelInSpaceCase} updating message`, async () => {
- await testHelper.esClient.create({
- index,
- id: testData.messages[parentModel].create.message.payload.id,
- body: _.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].create.message.payload] }),
- refresh: 'true'
- })
- await testHelper.sendMessage(testData.messages[model].update.message)
- await waitForMessageHandled()
- const doc = await testHelper.esClient.get({
- index,
- id: testData.messages[parentModel].create.message.payload.id
- })
- should.deepEqual(doc.body._source,
- _.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].update.message.payload] }))
- })
-
- it(`Should handle ${modelInSpaceCase} deletion message`, async () => {
- await testHelper.esClient.create({
- index,
- id: testData.messages[parentModel].create.message.payload.id,
- body: _.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].create.message.payload] }),
- refresh: 'true'
- })
- await testHelper.sendMessage(testData.messages[model].delete.message)
- await waitForMessageHandled()
- const doc = await testHelper.esClient.get({
- index,
- id: testData.messages[parentModel].create.message.payload.id
- })
- should.deepEqual(doc.body._source,
- _.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [] }))
- })
-
- it(`Failure - creation message - ${modelInSpaceCase} not found`, async () => {
- await testHelper.sendMessage(testData.messages[model].create.message)
- await waitForMessageHandled()
- should.equal(errorLogs[0], `id: ${testData.messages[parentModel].create.message.payload.id} "${index}" not found`)
- })
-
- it(`Failure - updating message - ${modelInSpaceCase} not found`, async () => {
- await testHelper.sendMessage(testData.messages[model].update.message)
- await waitForMessageHandled()
- should.equal(errorLogs[0], `id: ${testData.messages[model].update.message.payload.id} "${model}" not found`)
- })
-
- it(`Failure - deletion message - ${modelInSpaceCase} not found`, async () => {
- await testHelper.sendMessage(testData.messages[model].delete.message)
- await waitForMessageHandled()
- should.equal(errorLogs[0], `id: ${testData.messages[model].delete.message.payload.id} "${model}" not found`)
- })
- })
- describe('Nested WorkPeriodPayment tests', () => {
- const index = config.esConfig.ES_INDEX_RESOURCE_BOOKING
- const model = 'WorkPeriodPayment'
- const parentModel = 'WorkPeriod'
- const rootModel = 'ResourceBooking'
- const nestedName = 'payments'
- const parentNestedName = 'workPeriods'
- const modelInSpaceCase = stringcase.spacecase(model)
-
- it(`Should handle ${modelInSpaceCase} creation message`, async () => {
- await testHelper.esClient.create({
- index,
- id: testData.messages[rootModel].create.message.payload.id,
- body: _.assign(testData.messages[rootModel].create.message.payload, { [parentNestedName]: [testData.messages[parentModel].create.message.payload] }),
- refresh: 'true'
- })
- await testHelper.sendMessage(testData.messages[model].create.message)
- await waitForMessageHandled()
- const doc = await testHelper.esClient.get({
- index,
- id: testData.messages[rootModel].create.message.payload.id
- })
- should.deepEqual(doc.body._source, _.assign(testData.messages[rootModel].create.message.payload, { [parentNestedName]: [_.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].create.message.payload] })] }))
- })
-
- it(`Should handle ${modelInSpaceCase} updating message`, async () => {
- await testHelper.esClient.create({
- index,
- id: testData.messages[rootModel].create.message.payload.id,
- body: _.assign(testData.messages[rootModel].create.message.payload, { [parentNestedName]: [_.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].create.message.payload] })] }),
- refresh: 'true'
- })
- await testHelper.sendMessage(testData.messages[model].update.message)
- await waitForMessageHandled()
- const doc = await testHelper.esClient.get({
- index,
- id: testData.messages[rootModel].create.message.payload.id
- })
- should.deepEqual(doc.body._source, _.assign(testData.messages[rootModel].create.message.payload, { [parentNestedName]: [_.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].update.message.payload] })] }))
- })
-
- it(`Failure - creation message - ${modelInSpaceCase} not found`, async () => {
- await testHelper.sendMessage(testData.messages[model].create.message)
- await waitForMessageHandled()
- should.equal(errorLogs[0], `id: ${testData.messages[parentModel].create.message.payload.id} "${parentModel}" not found`)
- })
-
- it(`Failure - updating message - ${modelInSpaceCase} not found`, async () => {
- await testHelper.sendMessage(testData.messages[model].update.message)
- await waitForMessageHandled()
- should.equal(errorLogs[0], `id: ${testData.messages[model].update.message.payload.id} "${model}" not found`)
- })
- })
-})
diff --git a/test/messages/taas.job.create.event.json b/test/messages/taas.job.create.event.json
deleted file mode 100644
index 0813259..0000000
--- a/test/messages/taas.job.create.event.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "topic": "taas.job.create",
- "originator": "taas-api",
- "timestamp": "2020-11-05T19:00:17.563Z",
- "mime-type": "application/json",
- "payload": {
- "title": "Job Title",
- "projectId": 21,
- "externalId": "1212",
- "description": "Dummy Description",
- "startDate": "2020-09-27T04:17:23.131Z",
- "duration": 17,
- "numPositions": 13,
- "resourceType": "Dummy Resource Type",
- "rateType": "hourly",
- "skills": [
- "56fdc405-eccc-4189-9e83-c78abf844f50",
- "f91ae184-aba2-4485-a8cb-9336988c05ab",
- "edfc7b4f-636f-44bd-96fc-949ffc58e38b",
- "4ca63bb6-f515-4ab0-a6bc-c2d8531e084f",
- "ee03c041-d53b-4c08-b7d9-80d7461da3e4"
- ],
- "id": "ffbc24f7-301e-48d3-bf01-c056916056a2",
- "createdAt": "2020-11-05T19:00:16.268Z",
- "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a",
- "status": "sourcing",
- "isApplicationPageActive": false,
- "minSalary": 100,
- "maxSalary": 200,
- "hoursPerWeek": 20,
- "jobLocation": "Any location",
- "jobTimezone": "GMT",
- "currency": "USD",
- "roleIds": [
- "e7b7e818-40d4-4102-b486-09bdd21400b8"
- ]
- }
-}
\ No newline at end of file
diff --git a/test/messages/taas.job.delete.event.json b/test/messages/taas.job.delete.event.json
deleted file mode 100644
index 9ad9844..0000000
--- a/test/messages/taas.job.delete.event.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "topic": "taas.job.delete",
- "originator": "taas-api",
- "timestamp": "2020-11-05T19:00:19.035Z",
- "mime-type": "application/json",
- "payload": {
- "id": "ffbc24f7-301e-48d3-bf01-c056916056a2"
- }
-}
\ No newline at end of file
diff --git a/test/messages/taas.job.update.event.json b/test/messages/taas.job.update.event.json
deleted file mode 100644
index 56a7b0d..0000000
--- a/test/messages/taas.job.update.event.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "topic": "taas.job.update",
- "originator": "taas-api",
- "timestamp": "2020-11-05T19:00:19.015Z",
- "mime-type": "application/json",
- "payload": {
- "id": "ffbc24f7-301e-48d3-bf01-c056916056a2",
- "title": "Job Title Updated",
- "projectId": 21,
- "externalId": "1212",
- "description": "Dummy Description",
- "startDate": "2020-09-27T04:17:23.131Z",
- "duration": 19,
- "numPositions": 13,
- "resourceType": "Dummy Resource Type",
- "rateType": "hourly",
- "skills": [
- "3fa85f64-5717-4562-b3fc-2c963f66afa6",
- "cc41ddc4-cacc-4570-9bdb-1229c12b9784"
- ],
- "status": "sourcing",
- "updatedAt": "2020-11-05T19:00:17.612Z",
- "updatedBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a",
- "createdAt": "2020-11-05T19:00:16.268Z",
- "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a",
- "isApplicationPageActive": false,
- "minSalary": 100,
- "maxSalary": 200,
- "hoursPerWeek": 20,
- "jobLocation": "Any location",
- "jobTimezone": "GMT",
- "currency": "USD",
- "roleIds": [
- "e7b7e818-40d4-4102-b486-09bdd21400b8"
- ]
- }
-}
\ No newline at end of file
diff --git a/test/messages/taas.jobcandidate.create.event.json b/test/messages/taas.jobcandidate.create.event.json
deleted file mode 100644
index 28ba870..0000000
--- a/test/messages/taas.jobcandidate.create.event.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "topic": "taas.jobcandidate.create",
- "originator": "taas-api",
- "timestamp": "2020-11-05T19:00:21.597Z",
- "mime-type": "application/json",
- "payload": {
- "jobId": "ffbc24f7-301e-48d3-bf01-c056916056a2",
- "userId": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a",
- "id": "0cb99adb-8bcd-4952-9203-9867dd45ef6f",
- "createdAt": "2020-11-05T19:00:19.052Z",
- "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a",
- "status": "open",
- "remark": "excellent"
- }
-}
\ No newline at end of file
diff --git a/test/messages/taas.jobcandidate.delete.event.json b/test/messages/taas.jobcandidate.delete.event.json
deleted file mode 100644
index 0aa13d5..0000000
--- a/test/messages/taas.jobcandidate.delete.event.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "topic": "taas.jobcandidate.delete",
- "originator": "taas-api",
- "timestamp": "2020-11-05T19:00:23.021Z",
- "mime-type": "application/json",
- "payload": {
- "id": "0cb99adb-8bcd-4952-9203-9867dd45ef6f"
- }
-}
\ No newline at end of file
diff --git a/test/messages/taas.jobcandidate.update.event.json b/test/messages/taas.jobcandidate.update.event.json
deleted file mode 100644
index cc6e506..0000000
--- a/test/messages/taas.jobcandidate.update.event.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "topic": "taas.jobcandidate.update",
- "originator": "taas-api",
- "timestamp": "2020-11-05T19:00:23.003Z",
- "mime-type": "application/json",
- "payload": {
- "id": "0cb99adb-8bcd-4952-9203-9867dd45ef6f",
- "jobId": "ffbc24f7-301e-48d3-bf01-c056916056a2",
- "userId": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a",
- "status": "selected",
- "remark": "excellent",
- "updatedAt": "2020-11-05T19:00:21.625Z",
- "updatedBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a",
- "createdAt": "2020-11-05T19:00:16.268Z",
- "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a"
- }
-}
\ No newline at end of file
diff --git a/test/messages/taas.resourcebooking.create.event.json b/test/messages/taas.resourcebooking.create.event.json
deleted file mode 100644
index 2d7fd00..0000000
--- a/test/messages/taas.resourcebooking.create.event.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "topic": "taas.resourcebooking.create",
- "originator": "taas-api",
- "timestamp": "2020-11-05T19:00:25.038Z",
- "mime-type": "application/json",
- "payload": {
- "projectId": 21,
- "userId": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a",
- "jobId": "ffbc24f7-301e-48d3-bf01-c056916056a2",
- "startDate": "2020-09-27",
- "endDate": "2020-09-27",
- "memberRate": 13.23,
- "customerRate": 13,
- "rateType": "hourly",
- "id": "60d97713-8621-476e-b006-7cb9589c7777",
- "createdAt": "2020-11-05T19:00:23.036Z",
- "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a",
- "status": "placed",
- "billingAccountId": 80000071
- }
-}
\ No newline at end of file
diff --git a/test/messages/taas.resourcebooking.delete.event.json b/test/messages/taas.resourcebooking.delete.event.json
deleted file mode 100644
index 644037e..0000000
--- a/test/messages/taas.resourcebooking.delete.event.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "topic": "taas.resourcebooking.delete",
- "originator": "taas-api",
- "timestamp": "2020-11-05T19:00:26.433Z",
- "mime-type": "application/json",
- "payload": {
- "id": "60d97713-8621-476e-b006-7cb9589c7777"
- }
-}
\ No newline at end of file
diff --git a/test/messages/taas.resourcebooking.update.event.json b/test/messages/taas.resourcebooking.update.event.json
deleted file mode 100644
index 036b6c6..0000000
--- a/test/messages/taas.resourcebooking.update.event.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "topic": "taas.resourcebooking.update",
- "originator": "taas-api",
- "timestamp": "2020-11-05T19:00:26.407Z",
- "mime-type": "application/json",
- "payload": {
- "id": "60d97713-8621-476e-b006-7cb9589c7777",
- "projectId": 21,
- "userId": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a",
- "jobId": "ffbc24f7-301e-48d3-bf01-c056916056a2",
- "startDate": "2020-09-27",
- "endDate": "2020-09-27",
- "memberRate": 13.23,
- "customerRate": 13,
- "rateType": "hourly",
- "status": "placed",
- "billingAccountId": 80000071,
- "updatedAt": "2020-11-05T19:00:25.062Z",
- "updatedBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a",
- "createdAt": "2020-11-05T19:00:16.268Z",
- "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a"
- }
-}
\ No newline at end of file
diff --git a/test/messages/taas.role.create.event.json b/test/messages/taas.role.create.event.json
deleted file mode 100644
index a45b6a8..0000000
--- a/test/messages/taas.role.create.event.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "topic": "taas.role.requested",
- "originator": "taas-api",
- "timestamp": "2021-05-27T21:43:09.388Z",
- "mime-type": "application/json",
- "payload": {
- "name": "Salesforce Developer",
- "description": "A Salesforce developer is a programmer who builds Salesforce applications across various PaaS (Platform as a Service) platforms.",
- "listOfSkills": [
- "Docker",
- ".NET",
- "appcelerator",
- "Flux"
- ],
- "rates": [
- {
- "global": 50,
- "inCountry": 20,
- "offShore": 10,
- "rate30Global": 20,
- "rate30InCountry": 15,
- "rate30OffShore": 35,
- "rate20Global": 20,
- "rate20InCountry": 15,
- "rate20OffShore": 35
- },
- {
- "global": 25,
- "inCountry": 15,
- "offShore": 5,
- "rate30Global": 20,
- "rate30InCountry": 15,
- "rate30OffShore": 35,
- "rate20Global": 20,
- "rate20InCountry": 15,
- "rate20OffShore": 35
- }
- ],
- "numberOfMembers": 10,
- "numberOfMembersAvailable": 6,
- "imageUrl": "http: //images.topcoder.com/member",
- "timeToCandidate": 105,
- "timeToInterview": 100,
- "id": "e7b7e818-40d4-4102-b486-09bdd21400b8",
- "createdBy": "00000000-0000-0000-0000-000000000000",
- "updatedAt": "2021-05-27T21:43:09.342Z",
- "createdAt": "2021-05-27T21:43:09.342Z",
- "updatedBy": null
- }
-}
\ No newline at end of file
diff --git a/test/messages/taas.role.delete.event .json b/test/messages/taas.role.delete.event .json
deleted file mode 100644
index 3bd7c32..0000000
--- a/test/messages/taas.role.delete.event .json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "topic": "taas.role.delete",
- "originator": "taas-api",
- "timestamp": "2021-05-27T21:45:09.388Z",
- "mime-type": "application/json",
- "payload": {
- "id": "e7b7e818-40d4-4102-b486-09bdd21400b8"
- }
-}
\ No newline at end of file
diff --git a/test/messages/taas.role.update.event.json b/test/messages/taas.role.update.event.json
deleted file mode 100644
index 5c2a482..0000000
--- a/test/messages/taas.role.update.event.json
+++ /dev/null
@@ -1,48 +0,0 @@
-{
- "topic": "taas.role.update",
- "originator": "taas-api",
- "timestamp": "2021-05-27T21:44:09.388Z",
- "mime-type": "application/json",
- "payload": {
- "name": "Salesforce Developer",
- "description": "A Salesforce developer is a programmer who builds Salesforce applications across various PaaS (Platform as a Service) platforms.",
- "listOfSkills": [
- "Docker",
- ".NET"
- ],
- "rates": [
- {
- "global": 50,
- "inCountry": 20,
- "offShore": 10,
- "rate30Global": 20,
- "rate30InCountry": 15,
- "rate30OffShore": 35,
- "rate20Global": 20,
- "rate20InCountry": 15,
- "rate20OffShore": 35
- },
- {
- "global": 25,
- "inCountry": 15,
- "offShore": 5,
- "rate30Global": 20,
- "rate30InCountry": 15,
- "rate30OffShore": 35,
- "rate20Global": 20,
- "rate20InCountry": 15,
- "rate20OffShore": 35
- }
- ],
- "numberOfMembers": 10,
- "numberOfMembersAvailable": 6,
- "imageUrl": "http: //images.topcoder.com/member",
- "timeToCandidate": 105,
- "timeToInterview": 100,
- "id": "e7b7e818-40d4-4102-b486-09bdd21400b8",
- "createdBy": "00000000-0000-0000-0000-000000000000",
- "updatedAt": "2021-05-27T21:43:09.342Z",
- "createdAt": "2021-05-27T21:43:09.342Z",
- "updatedBy": "00000000-0000-0000-0000-000000000000"
- }
-}
\ No newline at end of file
diff --git a/test/messages/taas.workperiod.create.event.json b/test/messages/taas.workperiod.create.event.json
deleted file mode 100644
index eb26743..0000000
--- a/test/messages/taas.workperiod.create.event.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "topic": "taas.workperiod.create",
- "originator": "taas-api",
- "timestamp": "2021-03-30T20:24:17.555Z",
- "mime-type": "application/json",
- "payload": {
- "resourceBookingId": "60d97713-8621-476e-b006-7cb9589c7777",
- "startDate": "2021-03-14",
- "endDate": "2021-03-20",
- "daysWorked": 3,
- "memberRate": 13.13,
- "customerRate": 13.13,
- "paymentStatus": "cancelled",
- "projectId": 111,
- "userHandle": "pshah_manager",
- "id": "926040c4-1709-4de2-b2b6-52adf6e5e72d",
- "createdBy": "00000000-0000-0000-0000-000000000000",
- "updatedAt": "2021-03-30T20:24:17.541Z",
- "createdAt": "2021-03-30T20:24:17.541Z",
- "updatedBy": null
- }
-}
\ No newline at end of file
diff --git a/test/messages/taas.workperiod.delete.event.json b/test/messages/taas.workperiod.delete.event.json
deleted file mode 100644
index 3b3207c..0000000
--- a/test/messages/taas.workperiod.delete.event.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "topic": "taas.workperiod.delete",
- "originator": "taas-api",
- "timestamp": "2021-03-30T20:13:58.491Z",
- "mime-type": "application/json",
- "payload": {
- "id": "926040c4-1709-4de2-b2b6-52adf6e5e72d"
- }
-}
\ No newline at end of file
diff --git a/test/messages/taas.workperiod.update.event.json b/test/messages/taas.workperiod.update.event.json
deleted file mode 100644
index e8798dd..0000000
--- a/test/messages/taas.workperiod.update.event.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "topic": "taas.workperiod.update",
- "originator": "taas-api",
- "timestamp": "2021-03-30T20:13:53.179Z",
- "mime-type": "application/json",
- "payload": {
- "resourceBookingId": "60d97713-8621-476e-b006-7cb9589c7777",
- "startDate": "2021-03-21",
- "endDate": "2021-03-28",
- "daysWorked": 4,
- "memberRate": 13.13,
- "customerRate": 13.13,
- "paymentStatus": "cancelled",
- "projectId": 111,
- "userHandle": "pshah_manager",
- "id": "926040c4-1709-4de2-b2b6-52adf6e5e72d",
- "createdBy": "00000000-0000-0000-0000-000000000000",
- "updatedAt": "2021-03-30T20:24:17.541Z",
- "createdAt": "2021-03-30T20:24:17.541Z",
- "updatedBy": "00000000-0000-0000-0000-000000000000"
- }
-}
\ No newline at end of file
diff --git a/test/messages/taas.workperiodpayment.create.event.json b/test/messages/taas.workperiodpayment.create.event.json
deleted file mode 100644
index 1ecbc84..0000000
--- a/test/messages/taas.workperiodpayment.create.event.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "topic": "taas.workperiodpayment.create",
- "originator": "taas-api",
- "timestamp": "2021-04-09T20:10:33.770Z",
- "mime-type": "application/json",
- "payload": {
- "challengeId": "00000000-0000-0000-0000-000000000000",
- "workPeriodId": "926040c4-1709-4de2-b2b6-52adf6e5e72d",
- "amount": 600,
- "status": "completed",
- "id": "09c80ee6-21be-45a4-9c3c-7ec4c75ece79",
- "billingAccountId": 80000071,
- "createdBy": "57646ff9-1cd3-4d3c-88ba-eb09a395366c",
- "updatedAt": "2021-04-09T20:10:33.755Z",
- "createdAt": "2021-04-09T20:10:33.755Z",
- "updatedBy": null
- }
-}
\ No newline at end of file
diff --git a/test/messages/taas.workperiodpayment.update.event.json b/test/messages/taas.workperiodpayment.update.event.json
deleted file mode 100644
index ea1e859..0000000
--- a/test/messages/taas.workperiodpayment.update.event.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "topic": "taas.workperiodpayment.update",
- "originator": "taas-api",
- "timestamp": "2021-04-09T20:12:26.994Z",
- "mime-type": "application/json",
- "payload": {
- "id": "09c80ee6-21be-45a4-9c3c-7ec4c75ece79",
- "workPeriodId": "926040c4-1709-4de2-b2b6-52adf6e5e72d",
- "challengeId": "00000000-0000-0000-0000-000000000000",
- "amount": 1600,
- "status": "completed",
- "billingAccountId": 80000071,
- "createdBy": "57646ff9-1cd3-4d3c-88ba-eb09a395366c",
- "updatedBy": "57646ff9-1cd3-4d3c-88ba-eb09a395366c",
- "createdAt": "2021-04-09T20:10:33.755Z",
- "updatedAt": "2021-04-09T20:12:26.966Z"
- }
-}
\ No newline at end of file
diff --git a/test/unit/prepare.js b/test/unit/prepare.js
deleted file mode 100644
index f7966ed..0000000
--- a/test/unit/prepare.js
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Setting up Mock for all tests
- */
-
-require('../../src/bootstrap')
-
-const _ = require('lodash')
-const nock = require('nock')
-const prepare = require('mocha-prepare')
-const testData = require('../common/testData')
-
-// low-budget function to extract document id from uri
-const idFromUri = (uri) => _.last(uri.split('/')).split('?')[0]
-
-prepare(function (done) {
- // called before loading of test cases
- nock(/.com|localhost/)
- .persist()
- .put(uri => uri.includes('_create'))
- .query(true)
- .reply((uri, body) => {
- const id = idFromUri(uri)
- if (testData.esStorage.content[id]) {
- return [409]
- } else {
- testData.esStorage.content[id] = body
- return [200]
- }
- })
- .post(uri => uri.includes('_update'))
- .query(true)
- .reply((uri, body) => {
- const id = idFromUri(uri)
- if (testData.esStorage.content[id]) {
- _.assign(testData.esStorage.content[id], body.doc)
- return [200]
- } else {
- return [404]
- }
- })
- .delete(() => true)
- .query(true)
- .reply(uri => {
- const id = idFromUri(uri)
- if (testData.esStorage.content[id]) {
- _.unset(testData.esStorage.content, id)
- return [204]
- } else {
- return [404]
- }
- })
- .get(uri => uri.includes('_source'))
- .query(true)
- .reply(uri => {
- const id = idFromUri(uri)
- if (testData.esStorage.content[id]) {
- return [200, testData.esStorage.content[id]]
- } else {
- return [404]
- }
- })
- .post(uri => uri.includes('_search'))
- .query(true)
- .reply(uri => {
- if (Object.keys(testData.esStorage.content).length > 0) {
- return [200, {
- hits: {
- total: {
- value: 1
- },
- hits: [{
- _source: testData.esStorage.content[Object.keys(testData.esStorage.content)[0]]
- }]
- }
- } ]
- } else {
- return [200, {
- hits: {
- total: {
- value: 0
- },
- hits: []
- }
- } ]
- }
- })
- done()
-}, function (done) {
- nock.cleanAll()
- done()
-})
diff --git a/test/unit/test.js b/test/unit/test.js
deleted file mode 100644
index b89a18c..0000000
--- a/test/unit/test.js
+++ /dev/null
@@ -1,428 +0,0 @@
-/**
- * Mocha tests of the UBahn ES Processor.
- */
-
-const _ = require('lodash')
-const should = require('should')
-const config = require('config')
-const stringcase = require('stringcase')
-const testData = require('../common/testData')
-const testHelper = require('../common/testHelper')
-const sinon = require('sinon')
-const logger = require('../../src/common/logger')
-const helper = require('../../src/common/helper')
-const constants = require('../../src/common/constants')
-const services = {
- JobProcessorService: require('../../src/services/JobProcessorService'),
- JobCandidateProcessorService: require('../../src/services/JobCandidateProcessorService'),
- ResourceBookingProcessorService: require('../../src/services/ResourceBookingProcessorService'),
- WorkPeriodProcessorService: require('../../src/services/WorkPeriodProcessorService'),
- WorkPeriodPaymentProcessorService: require('../../src/services/WorkPeriodPaymentProcessorService'),
- ActionProcessorService: require('../../src/services/ActionProcessorService')
-}
-
-// random transaction id here
-const transactionId = '2023692c-a9d3-4250-86c4-b83f381a5d03'
-
-describe('General Logic Tests', () => {
- let sandbox
-
- before(() => {
- // mock helper methods
- sandbox = sinon.createSandbox()
- sandbox.stub(helper, 'postMessageViaWebhook').callsFake((webhook, message) => {
- logger.debug({ component: 'helper', context: 'postMessageToZapier (stub)', message: `message: ${JSON.stringify({ webhook, message })}` })
- })
- sandbox.stub(helper, 'getM2MToken').callsFake(() => {
- const token = 'dummy-token'
- logger.debug({ component: 'helper', context: 'getM2MToken (stub)', message: token })
- return token
- })
- })
-
- beforeEach(() => {
- // clear es storage
- testData.esStorage.content = {}
- })
-
- after(() => {
- // clear es storage
- testData.esStorage.content = {}
-
- sandbox.restore()
- })
- describe('Job, JobCandidate, ResourceBooking tests', () => {
- for (const [index, model] of [
- [config.esConfig.ES_INDEX_JOB, 'Job'],
- [config.esConfig.ES_INDEX_JOB_CANDIDATE, 'JobCandidate'],
- [config.esConfig.ES_INDEX_RESOURCE_BOOKING, 'ResourceBooking']
- ]) {
- const modelInSpaceCase = stringcase.spacecase(model)
- it(`processCreate - ${modelInSpaceCase} success`, async () => {
- await services[`${model}ProcessorService`].processCreate(testData.messages[model].create.message, transactionId)
- should.deepEqual(
- testData.esStorage.content[testData.messages[model].create.message.payload.id],
- testData.messages[model].create.message.payload
- )
- })
-
- it(`processUpdate - ${modelInSpaceCase} success`, async () => {
- await testHelper.esClient.create({
- index,
- id: testData.messages[model].create.message.payload.id,
- body: testData.messages[model].create.message.payload,
- refresh: 'true'
- })
- await services[`${model}ProcessorService`].processUpdate(testData.messages[model].update.message, transactionId)
- should.deepEqual(
- testData.esStorage.content[testData.messages[model].create.message.payload.id],
- testData.messages[model].update.message.payload
- )
- })
-
- it(`processDelete - ${modelInSpaceCase} success`, async () => {
- await testHelper.esClient.create({
- index,
- id: testData.messages[model].create.message.payload.id,
- body: testData.messages[model].create.message.payload,
- refresh: 'true'
- })
- await services[`${model}ProcessorService`].processDelete(testData.messages[model].delete.message, transactionId)
- should.not.exist(testData.esStorage.content[testData.messages[model].create.message.payload.id])
- })
-
- it(`Failure - processCreate - ${modelInSpaceCase} already exists`, async () => {
- await testHelper.esClient.create({
- index,
- id: testData.messages[model].create.message.payload.id,
- body: testData.messages[model].create.message.payload,
- refresh: 'true'
- })
- try {
- await services[`${model}ProcessorService`].processCreate(testData.messages[model].create.message, transactionId)
- throw new Error()
- } catch (err) {
- should.equal(err.message, `id: ${testData.messages[model].create.message.payload.id} "${index}" already exists`)
- }
- })
-
- it(`Failure - processUpdate - ${modelInSpaceCase} not found`, async () => {
- try {
- await services[`${model}ProcessorService`].processUpdate(testData.messages[model].update.message, transactionId)
- throw new Error()
- } catch (err) {
- should.equal(err.message, `id: ${testData.messages[model].update.message.payload.id} "${index}" not found`)
- }
- })
-
- it(`Failure - processDelete - ${modelInSpaceCase} not found`, async () => {
- try {
- await services[`${model}ProcessorService`].processDelete(testData.messages[model].delete.message, transactionId)
- throw new Error()
- } catch (err) {
- should.equal(err.message, `id: ${testData.messages[model].delete.message.payload.id} "${index}" not found`)
- }
- })
- }
- })
- describe('Nested WorkPeriod tests', () => {
- const index = config.esConfig.ES_INDEX_RESOURCE_BOOKING
- const model = 'WorkPeriod'
- const parentModel = 'ResourceBooking'
- const nestedName = 'workPeriods'
- const modelInSpaceCase = stringcase.spacecase(model)
- it(`processCreate - ${modelInSpaceCase} success`, async () => {
- await testHelper.esClient.create({
- index,
- id: testData.messages[parentModel].create.message.payload.id,
- body: testData.messages[parentModel].create.message.payload,
- refresh: 'true'
- })
- await services[`${model}ProcessorService`].processCreate(testData.messages[model].create.message, transactionId)
- should.deepEqual(
- testData.esStorage.content[testData.messages[parentModel].create.message.payload.id],
- _.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].create.message.payload] })
- )
- })
-
- it(`processUpdate - ${modelInSpaceCase} success`, async () => {
- await testHelper.esClient.create({
- index,
- id: testData.messages[parentModel].create.message.payload.id,
- body: _.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].create.message.payload] }),
- refresh: 'true'
- })
- await services[`${model}ProcessorService`].processUpdate(testData.messages[model].update.message, transactionId)
- should.deepEqual(
- testData.esStorage.content[testData.messages[parentModel].create.message.payload.id],
- _.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].update.message.payload] })
- )
- })
-
- it(`processDelete - ${modelInSpaceCase} success`, async () => {
- await testHelper.esClient.create({
- index,
- id: testData.messages[parentModel].create.message.payload.id,
- body: _.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].create.message.payload] }),
- refresh: 'true'
- })
- await services[`${model}ProcessorService`].processDelete(testData.messages[model].delete.message, transactionId)
- should.deepEqual(
- testData.esStorage.content[testData.messages[parentModel].create.message.payload.id],
- _.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [] })
- )
- })
- it(`Failure - processCreate - ${modelInSpaceCase} not found`, async () => {
- const processCreateStub = sandbox.stub(services.ActionProcessorService, 'processCreate').callsFake(() => {})
- await services[`${model}ProcessorService`].processCreate(testData.messages[model].create.message, transactionId)
- should.equal(processCreateStub.getCall(0).args[0], testData.messages[model].create.topic)
- })
-
- it(`Failure - processUpdate - ${modelInSpaceCase} not found`, async () => {
- try {
- await services[`${model}ProcessorService`].processUpdate(testData.messages[model].update.message, transactionId)
- throw new Error()
- } catch (err) {
- should.equal(err.message, `id: ${testData.messages[model].update.message.payload.id} "${model}" not found`)
- }
- })
-
- it(`Failure - processDelete - ${modelInSpaceCase} not found`, async () => {
- try {
- await services[`${model}ProcessorService`].processDelete(testData.messages[model].delete.message, transactionId)
- throw new Error()
- } catch (err) {
- should.equal(err.message, `id: ${testData.messages[model].delete.message.payload.id} "${model}" not found`)
- }
- })
- })
- describe('Nested WorkPeriodPayment tests', () => {
- const index = config.esConfig.ES_INDEX_RESOURCE_BOOKING
- const model = 'WorkPeriodPayment'
- const parentModel = 'WorkPeriod'
- const rootModel = 'ResourceBooking'
- const nestedName = 'payments'
- const parentNestedName = 'workPeriods'
- const modelInSpaceCase = stringcase.spacecase(model)
- it(`processCreate - ${modelInSpaceCase} success`, async () => {
- await testHelper.esClient.create({
- index,
- id: testData.messages[rootModel].create.message.payload.id,
- body: _.assign(testData.messages[rootModel].create.message.payload, { [parentNestedName]: [testData.messages[parentModel].create.message.payload] }),
- refresh: 'true'
- })
- await services[`${model}ProcessorService`].processCreate(testData.messages[model].create.message, transactionId)
- should.deepEqual(
- testData.esStorage.content[testData.messages[rootModel].create.message.payload.id],
- _.assign(testData.messages[rootModel].create.message.payload, { [parentNestedName]: [_.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].create.message.payload] })] })
- )
- })
-
- it(`processUpdate - ${modelInSpaceCase} success`, async () => {
- await testHelper.esClient.create({
- index,
- id: testData.messages[rootModel].create.message.payload.id,
- body: _.assign(testData.messages[rootModel].create.message.payload, { [parentNestedName]: [_.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].create.message.payload] })] }),
- refresh: 'true'
- })
- await services[`${model}ProcessorService`].processUpdate(testData.messages[model].update.message, transactionId)
- should.deepEqual(
- testData.esStorage.content[testData.messages[rootModel].create.message.payload.id],
- _.assign(testData.messages[rootModel].create.message.payload, { [parentNestedName]: [_.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].update.message.payload] })] })
- )
- })
-
- it(`Failure - processCreate - ${modelInSpaceCase} not found`, async () => {
- try {
- await services[`${model}ProcessorService`].processCreate(testData.messages[model].create.message, transactionId)
- throw new Error()
- } catch (err) {
- should.equal(err.message, `id: ${testData.messages[parentModel].create.message.payload.id} "${parentModel}" not found`)
- }
- })
-
- it(`Failure - processUpdate - ${modelInSpaceCase} not found`, async () => {
- try {
- await services[`${model}ProcessorService`].processUpdate(testData.messages[model].update.message, transactionId)
- throw new Error()
- } catch (err) {
- should.equal(err.message, `id: ${testData.messages[model].update.message.payload.id} "${model}" not found`)
- }
- })
- })
-})
-
-describe('Zapier Logic Tests', () => {
- let sandbox
-
- beforeEach(() => {
- // clear es storage
- testData.esStorage.content = {}
-
- // mock helper methods
- sandbox = sinon.createSandbox()
- sandbox.stub(helper, 'postMessageViaWebhook').callsFake((webhook, message) => {
- logger.debug({ component: 'helper', context: 'postMessageToZapier (stub)', message: `message: ${JSON.stringify({ webhook, message })}` })
- })
- sandbox.stub(helper, 'getM2MToken').callsFake(() => {
- const token = 'dummy-token'
- logger.debug({ component: 'helper', context: 'getM2MToken (stub)', message: token })
- return token
- })
- })
-
- afterEach(() => {
- // clear es storage
- testData.esStorage.content = {}
-
- // reset mocked methods
- sandbox.restore()
- })
-
- it('should have Zapier switched ON during testing Zapier logic', () => {
- // to enable Job Candidates Zapier logic
- should.equal(config.zapier.ZAPIER_JOB_CANDIDATE_SWITCH, constants.Zapier.Switch.ON)
- // to enable Jobs Zapier logic
- should.equal(config.zapier.ZAPIER_SWITCH, constants.Zapier.Switch.ON)
- })
-
- describe('Job Candidate Update', () => {
- it('should post to Zapier if status is changed to "client rejected - screening"', async () => {
- const previousData = _.assign({}, testData.messages.JobCandidate.create.message.payload, { status: 'open', externalId: '123' })
- const updateMessage = _.assign({}, testData.messages.JobCandidate.update.message, {
- payload: _.assign({}, testData.messages.JobCandidate.update.message.payload, { status: 'client rejected - screening', externalId: '123' })
- })
-
- await testHelper.esClient.create({
- index: config.esConfig.ES_INDEX_JOB,
- id: previousData.id,
- body: previousData,
- refresh: 'true'
- })
- await testHelper.esClient.create({
- index: config.esConfig.ES_INDEX_JOB_CANDIDATE,
- id: testData.messages.Job.create.message.payload.id,
- body: testData.messages.Job.create.message.payload,
- refresh: 'true'
- })
- await services[`JobCandidateProcessorService`].processUpdate(updateMessage, transactionId)
-
- helper.postMessageViaWebhook.callCount.should.equal(1)
- })
-
- it('should post to Zapier if status is changed to "interview"', async () => {
- const previousData = _.assign({}, testData.messages.JobCandidate.create.message.payload, { status: 'open', externalId: '123' })
- const updateMessage = _.assign({}, testData.messages.JobCandidate.update.message, {
- payload: _.assign({}, testData.messages.JobCandidate.update.message.payload, { status: 'interview', externalId: '123' })
- })
-
- await testHelper.esClient.create({
- index: config.esConfig.ES_INDEX_JOB,
- id: previousData.id,
- body: previousData,
- refresh: 'true'
- })
- await testHelper.esClient.create({
- index: config.esConfig.ES_INDEX_JOB_CANDIDATE,
- id: testData.messages.Job.create.message.payload.id,
- body: testData.messages.Job.create.message.payload,
- refresh: 'true'
- })
- await services[`JobCandidateProcessorService`].processUpdate(updateMessage, transactionId)
-
- helper.postMessageViaWebhook.callCount.should.equal(1)
- })
-
- it('should not post to Zapier if status was already "client rejected - screening"', async () => {
- const previousData = _.assign({}, testData.messages.JobCandidate.create.message.payload, { status: 'client rejected - screening', externalId: '123' })
- const updateMessage = _.assign({}, testData.messages.JobCandidate.update.message, {
- payload: _.assign({}, testData.messages.JobCandidate.update.message.payload, { status: 'client rejected - screening', externalId: '123' })
- })
-
- await testHelper.esClient.create({
- index: config.esConfig.ES_INDEX_JOB,
- id: previousData.id,
- body: previousData,
- refresh: 'true'
- })
- await testHelper.esClient.create({
- index: config.esConfig.ES_INDEX_JOB_CANDIDATE,
- id: testData.messages.Job.create.message.payload.id,
- body: testData.messages.Job.create.message.payload,
- refresh: 'true'
- })
- await services[`JobCandidateProcessorService`].processUpdate(updateMessage, transactionId)
-
- helper.postMessageViaWebhook.callCount.should.equal(0)
- })
-
- it('should not post to Zapier if status was already "interview"', async () => {
- const previousData = _.assign({}, testData.messages.JobCandidate.create.message.payload, { status: 'interview', externalId: '123' })
- const updateMessage = _.assign({}, testData.messages.JobCandidate.update.message, {
- payload: _.assign({}, testData.messages.JobCandidate.update.message.payload, { status: 'interview', externalId: '123' })
- })
-
- await testHelper.esClient.create({
- index: config.esConfig.ES_INDEX_JOB,
- id: previousData.id,
- body: previousData,
- refresh: 'true'
- })
- await testHelper.esClient.create({
- index: config.esConfig.ES_INDEX_JOB_CANDIDATE,
- id: testData.messages.Job.create.message.payload.id,
- body: testData.messages.Job.create.message.payload,
- refresh: 'true'
- })
- await services[`JobCandidateProcessorService`].processUpdate(updateMessage, transactionId)
-
- helper.postMessageViaWebhook.callCount.should.equal(0)
- })
-
- it('should not post to Zapier if status is changed to "placed" (not "rejected" or "shortlist")', async () => {
- const previousData = _.assign({}, testData.messages.JobCandidate.create.message.payload, { status: 'open', externalId: '123' })
- const updateMessage = _.assign({}, testData.messages.JobCandidate.update.message, {
- payload: _.assign({}, testData.messages.JobCandidate.update.message.payload, { status: 'placed', externalId: '123' })
- })
-
- await testHelper.esClient.create({
- index: config.esConfig.ES_INDEX_JOB,
- id: previousData.id,
- body: previousData,
- refresh: 'true'
- })
- await testHelper.esClient.create({
- index: config.esConfig.ES_INDEX_JOB_CANDIDATE,
- id: testData.messages.Job.create.message.payload.id,
- body: testData.messages.Job.create.message.payload,
- refresh: 'true'
- })
- await services[`JobCandidateProcessorService`].processUpdate(updateMessage, transactionId)
-
- helper.postMessageViaWebhook.callCount.should.equal(0)
- })
-
- it('should not post to Zapier if status is changed to "topcoder-rejected" (not "rejected" or "shortlist")', async () => {
- const previousData = _.assign({}, testData.messages.JobCandidate.create.message.payload, { status: 'open', externalId: '123' })
- const updateMessage = _.assign({}, testData.messages.JobCandidate.update.message, {
- payload: _.assign({}, testData.messages.JobCandidate.update.message.payload, { status: 'topcoder-rejected', externalId: '123' })
- })
-
- await testHelper.esClient.create({
- index: config.esConfig.ES_INDEX_JOB,
- id: previousData.id,
- body: previousData,
- refresh: 'true'
- })
- await testHelper.esClient.create({
- index: config.esConfig.ES_INDEX_JOB_CANDIDATE,
- id: testData.messages.Job.create.message.payload.id,
- body: testData.messages.Job.create.message.payload,
- refresh: 'true'
- })
- await services[`JobCandidateProcessorService`].processUpdate(updateMessage, transactionId)
-
- helper.postMessageViaWebhook.callCount.should.equal(0)
- })
- })
-})