diff --git a/.gitignore b/.gitignore index ccff80b404..6e81cd0216 100644 --- a/.gitignore +++ b/.gitignore @@ -19,4 +19,8 @@ services/updater_writer/updater/test_assets/testi.bak services/updater_writer/updater/test_assets/011120775.json services/updater_writer/updater/test_assets/014272112.json services/updater_writer/updater/test_assets/014441008.json -services/updater_writer/updater/test_assets/meta.json \ No newline at end of file +services/updater_writer/updater/test_assets/meta.json +services/updater_scheduler/all_student_numbers.txt +services/updater_scheduler/debug.log +services/updater_scheduler/active_student_numbers.txt +services/oodikone2-backend/debug.log \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index b0843e6472..01df78a99e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -58,3 +58,6 @@ jobs: after_script: - docker-compose logs + +after_failure: + - "curl -X POST -H 'Content-type: application/json' --data '{\"text\":\"Buildi on paskana! STOP AND FIX tai tulee kenkää! https://travis-ci.org/UniversityOfHelsinkiCS/oodikone\"}' https://hooks.slack.com/services/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" diff --git a/cypress.json b/cypress.json index bd6993488a..21395d72c1 100644 --- a/cypress.json +++ b/cypress.json @@ -1,9 +1,9 @@ { - "projectId": "c8bfes", - "defaultCommandTimeout": 120000, - "execTimeout": 120000, - "taskTimeout": 120000, - "pageLoadTimeout": 120000, - "requestTimeout": 120000, - "responseTimeout": 120000 + "projectId": "c3jsph", + "defaultCommandTimeout": 60000, + "execTimeout": 60000, + "taskTimeout": 60000, + "pageLoadTimeout": 60000, + "requestTimeout": 60000, + "responseTimeout": 60000 } diff --git a/cypress/integration/Population_statistics.js b/cypress/integration/Population_statistics.js index bdb1179d0d..e8d8a25ea0 100644 --- a/cypress/integration/Population_statistics.js +++ b/cypress/integration/Population_statistics.js @@ -109,8 +109,8 @@ describe('Population Statistics tests', () => { cy.contains("Matematiikan didaktiikka").siblings().eq(2).should("have.text", '9') }) - cy.get(".refresh").eq(1).click() cy.contains("Courses of Population").parentsUntil(".ui.segment").parent().within(() => { + cy.get(".refresh").click() cy.contains("number at least").siblings().within(() => cy.get("input").clear().type("0")) cy.contains("Matematiikan didaktiikka").siblings().eq(2).should("have.text", '1') }) diff --git a/docker-compose.lateste2e.production.yml b/docker-compose.lateste2e.production.yml index 3a5744a4d2..52c4c2f9ff 100644 --- a/docker-compose.lateste2e.production.yml +++ b/docker-compose.lateste2e.production.yml @@ -1,6 +1,13 @@ version: '3' services: + nats: + image: nats-streaming + command: -cid updaterNATS + expose: + - "4222" + container_name: nats + analytics_db: image: postgres:9.6.3 ports: @@ -66,12 +73,14 @@ services: backend: image: toska/oodikone2-backend:latest build: - context: services/oodikone2-backend + context: services/backend + dockerfile: oodikone2-backend/Dockerfile restart: unless-stopped ports: - "8080:8080" - "9229:9229" environment: + WAIT_HOSTS: redis:6379,db:5432,nats:4222 REDIS: redis DB_URL: postgres://postgres@db:5432/tkt_oodi TEST_DB: postgres://postgres@db:5432/tkt_oodi_test @@ -79,9 +88,12 @@ services: TOKEN_SECRET: IWannaBeTheVeryBest OODILEARN_URL: http://oodilearn:5000 USERSERVICE_URL: http://userservice:4567 + USAGESERVICE_URL: http://usageservice:545 USERSERVICE_SECRET: Luukk4inenApprov3dVitunMinttuSalainenAvain666NurmivaaraPJ2019 USAGESERVICE_SECRET: Luukk4inenApprov3dVitunMinttuSalainenAvain666NurmivaaraPJ2019 ANALYTICS_ADMINER_URL: http://localhost:5050/?pgsql=analytics_db&username=postgres + ANALYTICS_URL: http://analytics:4568 + NATS_URI: nats://nats:4222 container_name: backend entrypoint: 'node --inspect=0.0.0.0:9229 --max_old_space_size=4096 index.js' depends_on: @@ -98,6 +110,7 @@ services: ports: - "5000:5000" environment: + WAIT_HOSTS: user_db:5432 BACKEND_ADDR: backend ADMINER_URL: http://localhost:5050/?pgsql=db&username=postgres container_name: frontend @@ -110,6 +123,7 @@ services: ports: - 4567:4567 environment: + - WAIT_HOSTS=user_db:5432 - DB_URL=postgres://postgres@user_db:5432/user_db - TEST_DB=postgres://postgres@user_db:5432/user_db_test - SECRET=Luukk4inenApprov3dVitunMinttuSalainenAvain666NurmivaaraPJ2019 @@ -118,6 +132,33 @@ services: - user_db container_name: userservice + usageservice: + image: toska/oodikone2-usageservice:latest + build: + context: services/oodikone2-usageservice + restart: unless-stopped + ports: + - 545:545 + environment: + - WAIT_HOSTS=usage_db:5432 + - PORT=545 + - DB_URL=postgres://postgres@usage_db:5432/usage_db + - SECRET=Luukk4inenApprov3dVitunMinttuSalainenAvain666NurmivaaraPJ2019 + depends_on: + - usage_db + container_name: usageservice + + usage_db: + image: postgres:9.6.3 + ports: + - "5424:5432" + volumes: + - ./usage_pgdata:/var/lib/postgresql/data + container_name: oodi_usage_db + environment: + - POSTGRES_USER=postgres + - POSTGRES_DB=usage_db + analytics: image: toska/oodikone2-analytics:latest build: @@ -126,6 +167,7 @@ services: ports: - 4568:4568 environment: + - WAIT_HOSTS=analytics_db:5432,analytics_redis:6379 - REDIS=analytics_redis - DB_URL=postgres://postgres@analytics_db:5432/analytics_db - TEST_DB=postgres://postgres@analytics_db:5432/analytics_db_test diff --git a/docker-compose.lateste2e.yml b/docker-compose.lateste2e.yml index a369610075..c01ef8c4d9 100644 --- a/docker-compose.lateste2e.yml +++ b/docker-compose.lateste2e.yml @@ -1,6 +1,13 @@ version: '3' services: + nats: + image: nats-streaming + command: -cid updaterNATS + expose: + - "4222" + container_name: nats + analytics_db: image: postgres:9.6.3 ports: @@ -66,22 +73,27 @@ services: backend: image: toska/oodikone2-backend:staging build: - context: services/oodikone2-backend + context: services/backend + dockerfile: oodikone2-backend/Dockerfile restart: unless-stopped ports: - "8080:8080" - "9229:9229" environment: + WAIT_HOSTS: redis:6379,db:5432,nats:4222 REDIS: redis DB_URL: postgres://postgres@db:5432/tkt_oodi TEST_DB: postgres://postgres@db:5432/tkt_oodi_test - FRONT_URL: http://localhost:1337 + FRONT_URL: http://localhost:1337/staging TOKEN_SECRET: IWannaBeTheVeryBest OODILEARN_URL: http://oodilearn:5000 USERSERVICE_URL: http://userservice:4567 + USAGESERVICE_URL: http://usageservice:545 USERSERVICE_SECRET: Luukk4inenApprov3dVitunMinttuSalainenAvain666NurmivaaraPJ2019 USAGESERVICE_SECRET: Luukk4inenApprov3dVitunMinttuSalainenAvain666NurmivaaraPJ2019 ANALYTICS_ADMINER_URL: http://localhost:5050/?pgsql=analytics_db&username=postgres + ANALYTICS_URL: http://analytics:4568 + NATS_URI: nats://nats:4222 container_name: backend entrypoint: 'node --inspect=0.0.0.0:9229 --max_old_space_size=4096 index.js' depends_on: @@ -98,6 +110,7 @@ services: ports: - "5000:5000" environment: + WAIT_HOSTS: user_db:5432 BACKEND_ADDR: backend ADMINER_URL: http://localhost:5050/?pgsql=db&username=postgres container_name: frontend @@ -110,6 +123,7 @@ services: ports: - 4567:4567 environment: + - WAIT_HOSTS=user_db:5432 - DB_URL=postgres://postgres@user_db:5432/user_db - TEST_DB=postgres://postgres@user_db:5432/user_db_test - SECRET=Luukk4inenApprov3dVitunMinttuSalainenAvain666NurmivaaraPJ2019 @@ -118,6 +132,33 @@ services: - user_db container_name: userservice + usageservice: + image: toska/oodikone2-usageservice:staging + build: + context: services/oodikone2-usageservice + restart: unless-stopped + ports: + - 545:545 + environment: + - WAIT_HOSTS=usage_db:5432 + - PORT=545 + - DB_URL=postgres://postgres@usage_db:5432/usage_db + - SECRET=Luukk4inenApprov3dVitunMinttuSalainenAvain666NurmivaaraPJ2019 + depends_on: + - usage_db + container_name: usageservice + + usage_db: + image: postgres:9.6.3 + ports: + - "5424:5432" + volumes: + - ./usage_pgdata:/var/lib/postgresql/data + container_name: oodi_usage_db + environment: + - POSTGRES_USER=postgres + - POSTGRES_DB=usage_db + analytics: image: toska/oodikone2-analytics:staging build: @@ -126,6 +167,7 @@ services: ports: - 4568:4568 environment: + - WAIT_HOSTS=analytics_db:5432,analytics_redis:6379 - REDIS=analytics_redis - DB_URL=postgres://postgres@analytics_db:5432/analytics_db - TEST_DB=postgres://postgres@analytics_db:5432/analytics_db_test diff --git a/docker-compose.yml b/docker-compose.yml index 8a6199be0f..1f0c1123f5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -102,14 +102,16 @@ services: backend: build: - context: services/oodikone2-backend + context: services/backend + dockerfile: oodikone2-backend/Dockerfile args: NODE_ENV: 'development' - command: ['sh', '-c', 'cp -r /usr/src/cache/node_modules/. /usr/src/app/node_modules/ && npm run dev'] + command: ['sh', '-c', 'cp -r /usr/src/cache/node_modules/. /usr/src/app/node_modules/ && /wait && npm run dev'] restart: unless-stopped ports: - "8080:8080" environment: + WAIT_HOSTS: redis:6379,db:5432,nats:4222 REDIS: redis DB_URL: postgres://postgres@db:5432/tkt_oodi TEST_DB: postgres://postgres@db:5432/tkt_oodi_test @@ -121,21 +123,23 @@ services: USERSERVICE_SECRET: Luukk4inenApprov3dVitunMinttuSalainenAvain666NurmivaaraPJ2019 USAGESERVICE_SECRET: Luukk4inenApprov3dVitunMinttuSalainenAvain666NurmivaaraPJ2019 ANALYTICS_URL: http://analytics:4568 + NATS_URI: nats://nats:4222 volumes: - - ./services/oodikone2-backend/:/usr/src/app - - ./shared/models:/usr/src/app/src/models - - ./shared/migrations:/usr/src/app/src/database/migrations + - ./services/backend/oodikone2-backend/:/usr/src/app + - ./services/backend/shared/models:/usr/src/app/src/models + - ./services/backend/shared/migrations:/usr/src/app/src/database/migrations container_name: backend depends_on: - db - redis + - nats frontend: build: context: services/oodikone2-frontend args: NODE_ENV: 'development' - command: ['sh', '-c', 'cp -r /usr/src/cache/node_modules/. /usr/src/app/node_modules/ && npm run docker'] + command: ['sh', '-c', 'cp -r /usr/src/cache/node_modules/. /usr/src/app/node_modules/ && /wait && npm run docker'] restart: unless-stopped ports: - "8081:8081" @@ -171,17 +175,18 @@ services: context: services/oodikone2-userservice args: NODE_ENV: 'development' - command: ['sh', '-c', 'cp -r /usr/src/cache/node_modules/. /usr/src/app/node_modules/ && npm run dev'] + command: ['sh', '-c', 'cp -r /usr/src/cache/node_modules/. /usr/src/app/node_modules/ && /wait && npm run dev'] restart: unless-stopped volumes: - ./services/oodikone2-userservice/:/usr/src/app ports: - 4567:4567 environment: - - DB_URL=postgres://postgres@user_db:5432/user_db - - TEST_DB=postgres://postgres@user_db:5432/user_db_test - - SECRET=Luukk4inenApprov3dVitunMinttuSalainenAvain666NurmivaaraPJ2019 - - TOKEN_SECRET=IWannaBeTheVeryBest + WAIT_HOSTS: user_db:5432 + DB_URL: postgres://postgres@user_db:5432/user_db + TEST_DB: postgres://postgres@user_db:5432/user_db_test + SECRET: Luukk4inenApprov3dVitunMinttuSalainenAvain666NurmivaaraPJ2019 + TOKEN_SECRET: IWannaBeTheVeryBest depends_on: - user_db container_name: userservice @@ -191,16 +196,19 @@ services: context: services/oodikone2-usageservice args: NODE_ENV: 'development' - command: ['sh', '-c', 'cp -r /usr/src/cache/node_modules/. /usr/src/app/node_modules/ && npm run dev'] + command: ['sh', '-c', 'cp -r /usr/src/cache/node_modules/. /usr/src/app/node_modules/ && /wait && npm run dev'] restart: unless-stopped ports: - 545:545 environment: - - PORT=545 - - DB_URL=postgres://postgres@usage_db:5432/usage_db - - SECRET=Luukk4inenApprov3dVitunMinttuSalainenAvain666NurmivaaraPJ2019 + WAIT_HOSTS: usage_db:5432 + PORT: '545' + DB_URL: postgres://postgres@usage_db:5432/usage_db + SECRET: Luukk4inenApprov3dVitunMinttuSalainenAvain666NurmivaaraPJ2019 volumes: - ./services/oodikone2-usageservice/:/usr/src/app + depends_on: + - usage_db container_name: usageservice updater_api: @@ -208,36 +216,70 @@ services: context: services/updater_api args: NODE_ENV: 'development' - command: ['sh', '-c', 'cp -r /usr/src/cache/node_modules/. /usr/src/app/node_modules/ && npm run dev'] + command: ['sh', '-c', 'cp -r /usr/src/cache/node_modules/. /usr/src/app/node_modules/ && /wait && npm run dev'] restart: unless-stopped volumes: - ./services/updater_api/:/usr/src/app depends_on: - nats environment: + - WAIT_HOSTS=nats:4222 - NATS_URI=nats://nats:4222 - OODI_ADDR=https://oodikone.cs.helsinki.fi/oodi - TOKEN=toskab1gs8cret5 + container_name: updater_api updater_writer: build: - context: services/updater_writer + context: services/backend + dockerfile: updater_writer/Dockerfile args: NODE_ENV: 'development' - command: ['sh', '-c', 'cp -r /usr/src/cache/node_modules/. /usr/src/app/node_modules/ && npm run dev'] + command: ['sh', '-c', 'cp -r /usr/src/cache/node_modules/. /usr/src/app/node_modules/ && /wait && npm run dev'] restart: unless-stopped volumes: - - ./services/updater_writer/:/usr/src/app - - ./shared/models:/usr/src/app/models - - ./shared/migrations:/usr/src/app/database/migrations + - ./services/backend/updater_writer/:/usr/src/app + - ./services/backend/shared/models:/usr/src/app/models + - ./services/backend/shared/migrations:/usr/src/app/database/migrations depends_on: - nats - db environment: + WAIT_HOSTS: nats:4222,db:5432 NATS_URI: nats://nats:4222 DB_URL: postgres://postgres@db:5432/tkt_oodi TEST_DB: postgres://postgres@db:5432/tkt_oodi_test TEST_DB_SCHEMA: updater_test + container_name: updater_writer + + # scheduler_mongo: + # image: mongo + # restart: unless-stopped + # volumes: + # - ./mongodata:/data/db + # expose: + # - "27017" + # container_name: scheduler_db + + # updater_scheduler: + # build: + # context: services/updater_scheduler + # args: + # NODE_ENV: 'development' + # command: ['sh', '-c', 'cp -r /usr/src/cache/node_modules/. /usr/src/app/node_modules/ && /wait && npm run dev'] + # restart: unless-stopped + # volumes: + # - ./services/updater_scheduler/:/usr/src/app + # depends_on: + # - nats + # - scheduler_mongo + # environment: + # - WAIT_HOSTS=nats:4222,scheduler_mongo:27017 + # - NATS_URI=nats://nats:4222 + # - MONGO_URI=mongodb://scheduler_mongo:27017 + # - STUDENT_NUMBERS=./all_student_numbers.txt + # - ACTIVE_STUDENTS=./active_student_numbers.txt + # container_name: updater_scheduler analytics: @@ -245,16 +287,17 @@ services: context: services/oodikone2-analytics args: NODE_ENV: 'development' - command: ['sh', '-c', 'cp -r /usr/src/cache/node_modules/. /usr/src/app/node_modules/ && npm run dev'] + command: ['sh', '-c', 'cp -r /usr/src/cache/node_modules/. /usr/src/app/node_modules/ && /wait && npm run dev'] restart: unless-stopped volumes: - ./services/oodikone2-analytics/:/usr/src/app ports: - 4568:4568 environment: - - REDIS=analytics_redis - - DB_URL=postgres://postgres@analytics_db:5432/analytics_db - - TEST_DB=postgres://postgres@analytics_db:5432/analytics_db_test + WAIT_HOSTS: analytics_db:5432,analytics_redis:6379 + REDIS: analytics_redis + DB_URL: postgres://postgres@analytics_db:5432/analytics_db + TEST_DB: postgres://postgres@analytics_db:5432/analytics_db_test depends_on: - analytics_db - analytics_redis diff --git a/package.json b/package.json index 0ac6ceecb9..9d6a044dff 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "scripts": { "cypress:open": "CYPRESS_baseUrl=http://localhost:8081 cypress open", "cypress:run": "CYPRESS_baseUrl=http://localhost:8081 cypress run --config video=false -P ./", - "cypress:record": "cypress run --config videoUploadOnPasses=false -P ./", + "cypress:record": "cypress run --config videoUploadOnPasses=false --record -P ./", "concurrently": "concurrently", "test": "./run_all_tests.sh", "test_services": "./run_service_tests.sh" diff --git a/run_service_tests.sh b/run_service_tests.sh index 8e8000f2a0..57a8b89e75 100755 --- a/run_service_tests.sh +++ b/run_service_tests.sh @@ -2,9 +2,9 @@ # stop on first error set -e -npm run --prefix services/oodikone2-backend test_docker -npm test --prefix services/oodikone2-analytics -npm run --prefix services/oodikone2-userservice test_docker -npm test --prefix services/oodikone2-usageservice -npm run --prefix services/oodikone2-frontend test_docker - +docker-compose exec -T backend npm test +docker-compose exec -T userservice npm test +docker-compose exec -T frontend npm test +docker-compose exec -T analytics npm test +docker-compose exec -T usageservice npm test +# docker-compose exec -T updater_writer npm test diff --git a/scripts.sh b/scripts.sh index e42cdbd6f9..69827ae8a8 100644 --- a/scripts.sh +++ b/scripts.sh @@ -190,4 +190,6 @@ run_e2e_setup () { db_anon_setup_full echo "Restarting Docker backend containers to run migrations, etc." docker-compose -f $1 restart backend userservice + echo "Restarting Docker nginx because it has old backend IP otherwise" + docker-compose -f $1 restart nginx } diff --git a/services/backend/.dockerignore b/services/backend/.dockerignore new file mode 100644 index 0000000000..12341f7598 --- /dev/null +++ b/services/backend/.dockerignore @@ -0,0 +1,5 @@ +**/node_modules +updater_writer/**/models +updater_writer/**/migrations +oodikone2-backend/**/models +oodikone2-backend/**/migrations diff --git a/services/oodikone2-backend/.eslintignore b/services/backend/oodikone2-backend/.eslintignore similarity index 100% rename from services/oodikone2-backend/.eslintignore rename to services/backend/oodikone2-backend/.eslintignore diff --git a/services/oodikone2-backend/.eslintrc.json b/services/backend/oodikone2-backend/.eslintrc.json similarity index 100% rename from services/oodikone2-backend/.eslintrc.json rename to services/backend/oodikone2-backend/.eslintrc.json diff --git a/services/oodikone2-backend/.gitignore b/services/backend/oodikone2-backend/.gitignore similarity index 90% rename from services/oodikone2-backend/.gitignore rename to services/backend/oodikone2-backend/.gitignore index 85dc103d47..4ab7937eb8 100644 --- a/services/oodikone2-backend/.gitignore +++ b/services/backend/oodikone2-backend/.gitignore @@ -13,3 +13,6 @@ npm-debug.log studentnumbers.txt studentnumbers*.txt src/anonymized_API + +models +migrations diff --git a/services/backend/oodikone2-backend/Dockerfile b/services/backend/oodikone2-backend/Dockerfile new file mode 100644 index 0000000000..a2c90e953a --- /dev/null +++ b/services/backend/oodikone2-backend/Dockerfile @@ -0,0 +1,20 @@ +FROM node:10 + +COPY ./oodikone2-backend /usr/src/app +COPY ./shared/models /usr/src/app/src/models +COPY ./shared/migrations /usr/src/app/src/database/migrations +WORKDIR /usr/src/app +RUN npm ci + +COPY ./oodikone2-backend/package.json /usr/src/cache/package.json +COPY ./oodikone2-backend/package-lock.json /usr/src/cache/package-lock.json + +ARG NODE_ENV=production +ENV NODE_ENV=${NODE_ENV} +RUN if [ "${NODE_ENV}" != "production" ]; then cp -r /usr/src/app/node_modules /usr/src/cache/node_modules; fi + +ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.5.0/wait /wait +RUN chmod +x /wait + +EXPOSE 8080 +CMD /wait && npm start diff --git a/services/oodikone2-backend/README.md b/services/backend/oodikone2-backend/README.md similarity index 100% rename from services/oodikone2-backend/README.md rename to services/backend/oodikone2-backend/README.md diff --git a/services/oodikone2-backend/assets/toska.png b/services/backend/oodikone2-backend/assets/toska.png similarity index 100% rename from services/oodikone2-backend/assets/toska.png rename to services/backend/oodikone2-backend/assets/toska.png diff --git a/services/oodikone2-backend/enableUser.rest b/services/backend/oodikone2-backend/enableUser.rest similarity index 100% rename from services/oodikone2-backend/enableUser.rest rename to services/backend/oodikone2-backend/enableUser.rest diff --git a/services/oodikone2-backend/index.js b/services/backend/oodikone2-backend/index.js similarity index 100% rename from services/oodikone2-backend/index.js rename to services/backend/oodikone2-backend/index.js diff --git a/services/oodikone2-backend/package-lock.json b/services/backend/oodikone2-backend/package-lock.json similarity index 87% rename from services/oodikone2-backend/package-lock.json rename to services/backend/oodikone2-backend/package-lock.json index 5e660b65c5..7bc24d2139 100644 --- a/services/oodikone2-backend/package-lock.json +++ b/services/backend/oodikone2-backend/package-lock.json @@ -81,22 +81,22 @@ } }, "@babel/core": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.2.2.tgz", - "integrity": "sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.4.tgz", + "integrity": "sha512-lQgGX3FPRgbz2SKmhMtYgJvVzGZrmjaF4apZ2bLwofAKiSjxU0drPh4S/VasyYXwaTs+A1gvQ45BN8SQJzHsQQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.2.2", - "@babel/helpers": "^7.2.0", - "@babel/parser": "^7.2.2", - "@babel/template": "^7.2.2", - "@babel/traverse": "^7.2.2", - "@babel/types": "^7.2.2", + "@babel/generator": "^7.4.4", + "@babel/helpers": "^7.4.4", + "@babel/parser": "^7.4.4", + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4", "convert-source-map": "^1.1.0", "debug": "^4.1.0", "json5": "^2.1.0", - "lodash": "^4.17.10", + "lodash": "^4.17.11", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" @@ -112,14 +112,14 @@ } }, "@babel/generator": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.2.tgz", - "integrity": "sha512-f3QCuPppXxtZOEm5GWPra/uYUjmNQlu9pbAD8D/9jze4pTY83rTtB1igTBSwvkeNlC5gR24zFFkz+2WHLFQhqQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", + "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", "dev": true, "requires": { - "@babel/types": "^7.3.2", + "@babel/types": "^7.4.4", "jsesc": "^2.5.1", - "lodash": "^4.17.10", + "lodash": "^4.17.11", "source-map": "^0.5.0", "trim-right": "^1.0.1" } @@ -145,12 +145,12 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", - "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", + "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.0.0" + "@babel/types": "^7.4.4" } }, "@babel/highlight": { @@ -165,47 +165,47 @@ } }, "@babel/parser": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.2.tgz", - "integrity": "sha512-QzNUC2RO1gadg+fs21fi0Uu0OuGNzRKEmgCxoLNzbCdoprLwjfmZwzUrpUNfJPaVRwBpDY47A17yYEGWyRelnQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.4.tgz", + "integrity": "sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==", "dev": true }, "@babel/template": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", - "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", + "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.2.2", - "@babel/types": "^7.2.2" + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" } }, "@babel/traverse": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz", - "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.4.tgz", + "integrity": "sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.2.2", + "@babel/generator": "^7.4.4", "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.0.0", - "@babel/parser": "^7.2.3", - "@babel/types": "^7.2.2", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.10" + "lodash": "^4.17.11" } }, "@babel/types": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.2.tgz", - "integrity": "sha512-3Y6H8xlUlpbGR+XvawiH0UXehqydTmNmEpozWcXymqwcrwYAl5KMvKtQ+TF6f6E08V6Jur7v/ykdDSF+WDEIXQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", "dev": true, "requires": { "esutils": "^2.0.2", - "lodash": "^4.17.10", + "lodash": "^4.17.11", "to-fast-properties": "^2.0.0" } }, @@ -239,9 +239,9 @@ } }, "globals": { - "version": "11.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", - "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, "has-flag": { @@ -284,9 +284,9 @@ "dev": true }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true }, "supports-color": { @@ -363,14 +363,14 @@ } }, "@babel/helpers": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.3.1.tgz", - "integrity": "sha512-Q82R3jKsVpUV99mgX50gOPCWwco9Ec5Iln/8Vyu4osNIOQgSrd9RFrQeUvmvddFNoLwMyOUWU+5ckioEKpDoGA==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.4.tgz", + "integrity": "sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==", "dev": true, "requires": { - "@babel/template": "^7.1.2", - "@babel/traverse": "^7.1.5", - "@babel/types": "^7.3.0" + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" }, "dependencies": { "@babel/code-frame": { @@ -383,14 +383,14 @@ } }, "@babel/generator": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.2.tgz", - "integrity": "sha512-f3QCuPppXxtZOEm5GWPra/uYUjmNQlu9pbAD8D/9jze4pTY83rTtB1igTBSwvkeNlC5gR24zFFkz+2WHLFQhqQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", + "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", "dev": true, "requires": { - "@babel/types": "^7.3.2", + "@babel/types": "^7.4.4", "jsesc": "^2.5.1", - "lodash": "^4.17.10", + "lodash": "^4.17.11", "source-map": "^0.5.0", "trim-right": "^1.0.1" } @@ -416,12 +416,12 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", - "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", + "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.0.0" + "@babel/types": "^7.4.4" } }, "@babel/highlight": { @@ -436,47 +436,47 @@ } }, "@babel/parser": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.2.tgz", - "integrity": "sha512-QzNUC2RO1gadg+fs21fi0Uu0OuGNzRKEmgCxoLNzbCdoprLwjfmZwzUrpUNfJPaVRwBpDY47A17yYEGWyRelnQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.4.tgz", + "integrity": "sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==", "dev": true }, "@babel/template": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", - "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", + "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.2.2", - "@babel/types": "^7.2.2" + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" } }, "@babel/traverse": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz", - "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.4.tgz", + "integrity": "sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.2.2", + "@babel/generator": "^7.4.4", "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.0.0", - "@babel/parser": "^7.2.3", - "@babel/types": "^7.2.2", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.10" + "lodash": "^4.17.11" } }, "@babel/types": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.2.tgz", - "integrity": "sha512-3Y6H8xlUlpbGR+XvawiH0UXehqydTmNmEpozWcXymqwcrwYAl5KMvKtQ+TF6f6E08V6Jur7v/ykdDSF+WDEIXQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", "dev": true, "requires": { "esutils": "^2.0.2", - "lodash": "^4.17.10", + "lodash": "^4.17.11", "to-fast-properties": "^2.0.0" } }, @@ -510,9 +510,9 @@ } }, "globals": { - "version": "11.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", - "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, "has-flag": { @@ -582,15 +582,1071 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "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.1.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.1.6.tgz", + "integrity": "sha512-dWP6LJm9nKT6ALaa+bnL247GHHMWir3vSlZ2+IHgHgktZQx0L3Uvq2uAWcuzIe+fujRsYWBW2q622C5UvGK9iQ==", + "dev": true + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", + "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/template": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz", + "integrity": "sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "lodash": "^4.2.0" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + } + } + }, + "@babel/traverse": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz", + "integrity": "sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/generator": "7.0.0-beta.44", + "@babel/helper-function-name": "7.0.0-beta.44", + "@babel/helper-split-export-declaration": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "debug": "^3.1.0", + "globals": "^11.1.0", + "invariant": "^2.2.0", + "lodash": "^4.2.0" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + }, + "debug": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", + "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", + "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz", + "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.2.0", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@cnakazawa/watch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", + "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "@concordance/react": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@concordance/react/-/react-1.0.0.tgz", + "integrity": "sha512-htrsRaQX8Iixlsek8zQU7tE8wcsTQJ5UhZkSPEA8slCDAisKpC/2VgU/ucPn32M5/LjGGXRaUEKvEw1Wiuu4zQ==", + "dev": true, + "requires": { + "arrify": "^1.0.1" + } + }, + "@jest/console": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.7.1.tgz", + "integrity": "sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg==", + "dev": true, + "requires": { + "@jest/source-map": "^24.3.0", + "chalk": "^2.0.1", + "slash": "^2.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" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@jest/core": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.8.0.tgz", + "integrity": "sha512-R9rhAJwCBQzaRnrRgAdVfnglUuATXdwTRsYqs6NMdVcAl5euG8LtWDe+fVkN27YfKVBW61IojVsXKaOmSnqd/A==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/reporters": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-changed-files": "^24.8.0", + "jest-config": "^24.8.0", + "jest-haste-map": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-resolve-dependencies": "^24.8.0", + "jest-runner": "^24.8.0", + "jest-runtime": "^24.8.0", + "jest-snapshot": "^24.8.0", + "jest-util": "^24.8.0", + "jest-validate": "^24.8.0", + "jest-watcher": "^24.8.0", + "micromatch": "^3.1.10", + "p-each-series": "^1.0.0", + "pirates": "^4.0.1", + "realpath-native": "^1.1.0", + "rimraf": "^2.5.4", + "strip-ansi": "^5.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 + }, + "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" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.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" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "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": "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" + } + } + } + }, + "@jest/environment": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.8.0.tgz", + "integrity": "sha512-vlGt2HLg7qM+vtBrSkjDxk9K0YtRBi7HfRFaDxoRtyi+DyVChzhF20duvpdAnKVBV6W5tym8jm0U9EfXbDk1tw==", + "dev": true, + "requires": { + "@jest/fake-timers": "^24.8.0", + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "jest-mock": "^24.8.0" + } + }, + "@jest/fake-timers": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.8.0.tgz", + "integrity": "sha512-2M4d5MufVXwi6VzZhJ9f5S/wU4ud2ck0kxPof1Iz3zWx6Y+V2eJrES9jEktB6O3o/oEyk+il/uNu9PvASjWXQw==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-mock": "^24.8.0" + } + }, + "@jest/reporters": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.8.0.tgz", + "integrity": "sha512-eZ9TyUYpyIIXfYCrw0UHUWUvE35vx5I92HGMgS93Pv7du+GHIzl+/vh8Qj9MCWFK/4TqyttVBPakWMOfZRIfxw==", + "dev": true, + "requires": { + "@jest/environment": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-lib-coverage": "^2.0.2", + "istanbul-lib-instrument": "^3.0.1", + "istanbul-lib-report": "^2.0.4", + "istanbul-lib-source-maps": "^3.0.1", + "istanbul-reports": "^2.1.1", + "jest-haste-map": "^24.8.0", + "jest-resolve": "^24.8.0", + "jest-runtime": "^24.8.0", + "jest-util": "^24.8.0", + "jest-worker": "^24.6.0", + "node-notifier": "^5.2.1", + "slash": "^2.0.0", + "source-map": "^0.6.0", + "string-length": "^2.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" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "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 + }, + "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" + } + } + } + }, + "@jest/source-map": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.3.0.tgz", + "integrity": "sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "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 + } + } + }, + "@jest/test-result": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.8.0.tgz", + "integrity": "sha512-+YdLlxwizlfqkFDh7Mc7ONPQAhA4YylU1s529vVM1rsf67vGZH/2GGm5uO8QzPeVyaVMobCQ7FTxl38QrKRlng==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/types": "^24.8.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@jest/test-sequencer": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.8.0.tgz", + "integrity": "sha512-OzL/2yHyPdCHXEzhoBuq37CE99nkme15eHkAzXRVqthreWZamEMA0WoetwstsQBCXABhczpK03JNbc4L01vvLg==", + "dev": true, + "requires": { + "@jest/test-result": "^24.8.0", + "jest-haste-map": "^24.8.0", + "jest-runner": "^24.8.0", + "jest-runtime": "^24.8.0" + } + }, + "@jest/transform": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.8.0.tgz", + "integrity": "sha512-xBMfFUP7TortCs0O+Xtez2W7Zu1PLH9bvJgtraN1CDST6LBM/eTOZ9SfwS/lvV8yOfcDpFmwf9bq5cYbXvqsvA==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^24.8.0", + "babel-plugin-istanbul": "^5.1.0", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.15", + "jest-haste-map": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-util": "^24.8.0", + "micromatch": "^3.1.10", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "2.4.1" + }, + "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" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.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" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "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 }, "supports-color": { @@ -601,117 +1657,29 @@ "requires": { "has-flag": "^3.0.0" } - } - } - }, - "@babel/parser": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.1.6.tgz", - "integrity": "sha512-dWP6LJm9nKT6ALaa+bnL247GHHMWir3vSlZ2+IHgHgktZQx0L3Uvq2uAWcuzIe+fujRsYWBW2q622C5UvGK9iQ==", - "dev": true - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", - "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/template": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz", - "integrity": "sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.44", - "@babel/types": "7.0.0-beta.44", - "babylon": "7.0.0-beta.44", - "lodash": "^4.2.0" - }, - "dependencies": { - "babylon": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", - "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", - "dev": true - } - } - }, - "@babel/traverse": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz", - "integrity": "sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.44", - "@babel/generator": "7.0.0-beta.44", - "@babel/helper-function-name": "7.0.0-beta.44", - "@babel/helper-split-export-declaration": "7.0.0-beta.44", - "@babel/types": "7.0.0-beta.44", - "babylon": "7.0.0-beta.44", - "debug": "^3.1.0", - "globals": "^11.1.0", - "invariant": "^2.2.0", - "lodash": "^4.2.0" - }, - "dependencies": { - "babylon": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", - "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", - "dev": true }, - "debug": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", - "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "write-file-atomic": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", + "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", "dev": true, "requires": { - "ms": "^2.1.1" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } - }, - "globals": { - "version": "11.7.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", - "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz", - "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.2.0", - "to-fast-properties": "^2.0.0" - }, - "dependencies": { - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true } } }, - "@concordance/react": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@concordance/react/-/react-1.0.0.tgz", - "integrity": "sha512-htrsRaQX8Iixlsek8zQU7tE8wcsTQJ5UhZkSPEA8slCDAisKpC/2VgU/ucPn32M5/LjGGXRaUEKvEw1Wiuu4zQ==", + "@jest/types": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.8.0.tgz", + "integrity": "sha512-g17UxVr2YfBtaMUxn9u/4+siG1ptg9IGYAYwvpwn61nBg779RXnjE/m7CxYcIzEt0AbHZZAHSEZNhkE2WxURVg==", "dev": true, "requires": { - "arrify": "^1.0.1" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^12.0.9" } }, "@ladjs/time-require": { @@ -760,11 +1728,165 @@ } } }, + "@types/babel__core": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.1.tgz", + "integrity": "sha512-+hjBtgcFPYyCTo0A15+nxrCVJL7aC6Acg87TXd5OW3QhHswdrOLoles+ldL2Uk8q++7yIfl4tURtztccdeeyOw==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + }, + "dependencies": { + "@babel/types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@types/babel__generator": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.0.2.tgz", + "integrity": "sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@types/babel__template": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", + "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@types/babel__traverse": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.6.tgz", + "integrity": "sha512-XYVgHF2sQ0YblLRMLNPB3CkFMewzFmlDsH/TneZFHUXDlABQgh88uOxuez7ZcXxayLFrqLwtDH1t+FmlFwNZxw==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", + "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", + "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, "@types/node": { "version": "11.13.4", "resolved": "https://registry.npmjs.org/@types/node/-/node-11.13.4.tgz", "integrity": "sha512-+rabAZZ3Yn7tF/XPGHupKIL5EcAbrLxnTr/hgQICxbeuAfWtT0UZSfULE+ndusckBItcv4o6ZeOJplQikVcLvQ==" }, + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true + }, + "@types/yargs": { + "version": "12.0.12", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz", + "integrity": "sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw==", + "dev": true + }, "abab": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", @@ -793,9 +1915,9 @@ "dev": true }, "acorn-globals": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.0.tgz", - "integrity": "sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", + "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", "dev": true, "requires": { "acorn": "^6.0.1", @@ -803,9 +1925,9 @@ }, "dependencies": { "acorn": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.0.tgz", - "integrity": "sha512-MW/FjM+IvU9CgBzjO3UIPCE2pyEwUsoFl+VGdczOPEdxfGFjuKny/gN54mOuX7Qxmb9Rg9MCn2oKiSUeW+pjrw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", "dev": true } } @@ -889,15 +2011,6 @@ "normalize-path": "^2.0.0" } }, - "append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", - "dev": true, - "requires": { - "default-require-extensions": "^2.0.0" - } - }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -1484,13 +2597,16 @@ } }, "babel-jest": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.1.0.tgz", - "integrity": "sha512-MLcagnVrO9ybQGLEfZUqnOzv36iQzU7Bj4elm39vCukumLVSfoX+tRy3/jW7lUKc7XdpRmB/jech6L/UCsSZjw==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.8.0.tgz", + "integrity": "sha512-+5/kaZt4I9efoXzPlZASyK/lN9qdRKmmUav9smVc0ruPQD7IsfucQ87gpOE8mn2jbDuS6M/YOW6n3v9ZoIfgnw==", "dev": true, "requires": { + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "@types/babel__core": "^7.1.0", "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.1.0", + "babel-preset-jest": "^24.6.0", "chalk": "^2.4.2", "slash": "^2.0.0" }, @@ -1572,14 +2688,14 @@ } }, "babel-plugin-istanbul": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.0.tgz", - "integrity": "sha512-CLoXPRSUWiR8yao8bShqZUIC6qLfZVVY3X1wj+QPNXu0wfmrRRfarh1LYy+dYMVI+bDj0ghy3tuqFFRFZmL1Nw==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.4.tgz", + "integrity": "sha512-dySz4VJMH+dpndj0wjJ8JPs/7i1TdSPb1nRrn56/92pKOF9VKC1FMFJmMXjzlGGusnCAqujP6PBCiKq0sVA+YQ==", "dev": true, "requires": { "find-up": "^3.0.0", - "istanbul-lib-instrument": "^3.0.0", - "test-exclude": "^5.0.0" + "istanbul-lib-instrument": "^3.3.0", + "test-exclude": "^5.2.3" }, "dependencies": { "find-up": { @@ -1602,9 +2718,9 @@ } }, "p-limit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", - "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", + "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" @@ -1622,10 +2738,13 @@ } }, "babel-plugin-jest-hoist": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.1.0.tgz", - "integrity": "sha512-gljYrZz8w1b6fJzKcsfKsipSru2DU2DmQ39aB6nV3xQ0DDv3zpIzKGortA5gknrhNnPN8DweaEgrnZdmbGmhnw==", - "dev": true + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz", + "integrity": "sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w==", + "dev": true, + "requires": { + "@types/babel__traverse": "^7.0.6" + } }, "babel-plugin-syntax-async-functions": { "version": "6.13.0", @@ -1761,13 +2880,13 @@ } }, "babel-preset-jest": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.1.0.tgz", - "integrity": "sha512-FfNLDxFWsNX9lUmtwY7NheGlANnagvxq8LZdl5PKnVG3umP+S/g0XbVBfwtA4Ai3Ri/IMkWabBz3Tyk9wdspcw==", + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz", + "integrity": "sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw==", "dev": true, "requires": { "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.1.0" + "babel-plugin-jest-hoist": "^24.6.0" } }, "babel-register": { @@ -2316,12 +3435,12 @@ } }, "capture-exit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", - "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", "dev": true, "requires": { - "rsvp": "^3.3.3" + "rsvp": "^4.8.4" } }, "capture-stack-trace": { @@ -2657,9 +3776,9 @@ } }, "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", "dev": true, "optional": true }, @@ -2675,12 +3794,6 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "compare-versions": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.4.0.tgz", - "integrity": "sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg==", - "dev": true - }, "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", @@ -2858,9 +3971,9 @@ "dev": true }, "cssstyle": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.1.1.tgz", - "integrity": "sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.2.tgz", + "integrity": "sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==", "dev": true, "requires": { "cssom": "0.3.x" @@ -2969,15 +4082,6 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, - "default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", - "dev": true, - "requires": { - "strip-bom": "^3.0.0" - } - }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -3099,9 +4203,9 @@ } }, "diff-sequences": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.0.0.tgz", - "integrity": "sha512-46OkIuVGBBnrC0soO/4LHu5LHGHx0uhP65OVz8XOrAJpqiCB2aVIuESvjI1F9oqebuvY8lekS1pt6TN7vt7qsw==", + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.3.0.tgz", + "integrity": "sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw==", "dev": true }, "doctrine": { @@ -3269,9 +4373,9 @@ "dev": true }, "escodegen": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz", - "integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", + "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", "dev": true, "requires": { "esprima": "^3.1.3", @@ -3439,9 +4543,9 @@ "dev": true }, "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -3584,13 +4688,10 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "exec-sh": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", - "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", - "dev": true, - "requires": { - "merge": "^1.2.0" - } + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz", + "integrity": "sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==", + "dev": true }, "execa": { "version": "0.7.0", @@ -3644,16 +4745,17 @@ "optional": true }, "expect": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.1.0.tgz", - "integrity": "sha512-lVcAPhaYkQcIyMS+F8RVwzbm1jro20IG8OkvxQ6f1JfqhVZyyudCwYogQ7wnktlf14iF3ii7ArIUO/mqvrW9Gw==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.8.0.tgz", + "integrity": "sha512-/zYvP8iMDrzaaxHVa724eJBCKqSHmO0FA7EDkBiRHxg6OipmMn1fN+C8T9L9K8yr7UONkOifu6+LLH+z76CnaA==", "dev": true, "requires": { + "@jest/types": "^24.8.0", "ansi-styles": "^3.2.0", - "jest-get-type": "^24.0.0", - "jest-matcher-utils": "^24.0.0", - "jest-message-util": "^24.0.0", - "jest-regex-util": "^24.0.0" + "jest-get-type": "^24.8.0", + "jest-matcher-utils": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-regex-util": "^24.3.0" }, "dependencies": { "ansi-styles": { @@ -3854,16 +4956,6 @@ "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", "dev": true }, - "fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", - "dev": true, - "requires": { - "glob": "^7.0.3", - "minimatch": "^3.0.3" - } - }, "fill-range": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", @@ -4017,14 +5109,14 @@ "dev": true }, "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", "dev": true, "optional": true, "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" }, "dependencies": { "abbrev": { @@ -4036,8 +5128,7 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "aproba": { "version": "1.2.0", @@ -4046,7 +5137,7 @@ "optional": true }, "are-we-there-yet": { - "version": "1.1.4", + "version": "1.1.5", "bundled": true, "dev": true, "optional": true, @@ -4058,21 +5149,19 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "chownr": { - "version": "1.0.1", + "version": "1.1.1", "bundled": true, "dev": true, "optional": true @@ -4080,20 +5169,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -4102,16 +5188,16 @@ "optional": true }, "debug": { - "version": "2.6.9", + "version": "4.1.1", "bundled": true, "dev": true, "optional": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "deep-extend": { - "version": "0.5.1", + "version": "0.6.0", "bundled": true, "dev": true, "optional": true @@ -4160,7 +5246,7 @@ } }, "glob": { - "version": "7.1.2", + "version": "7.1.3", "bundled": true, "dev": true, "optional": true, @@ -4180,12 +5266,12 @@ "optional": true }, "iconv-lite": { - "version": "0.4.21", + "version": "0.4.24", "bundled": true, "dev": true, "optional": true, "requires": { - "safer-buffer": "^2.1.0" + "safer-buffer": ">= 2.1.2 < 3" } }, "ignore-walk": { @@ -4210,8 +5296,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -4223,7 +5308,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -4238,7 +5322,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -4246,21 +5329,19 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { - "version": "2.2.4", + "version": "2.3.5", "bundled": true, "dev": true, - "optional": true, "requires": { - "safe-buffer": "^5.1.1", + "safe-buffer": "^5.1.2", "yallist": "^3.0.0" } }, "minizlib": { - "version": "1.1.0", + "version": "1.2.1", "bundled": true, "dev": true, "optional": true, @@ -4272,41 +5353,40 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } }, "ms": { - "version": "2.0.0", + "version": "2.1.1", "bundled": true, "dev": true, "optional": true }, "needle": { - "version": "2.2.0", + "version": "2.3.0", "bundled": true, "dev": true, "optional": true, "requires": { - "debug": "^2.1.2", + "debug": "^4.1.0", "iconv-lite": "^0.4.4", "sax": "^1.2.4" } }, "node-pre-gyp": { - "version": "0.10.0", + "version": "0.12.0", "bundled": true, "dev": true, "optional": true, "requires": { "detect-libc": "^1.0.2", "mkdirp": "^0.5.1", - "needle": "^2.2.0", + "needle": "^2.2.1", "nopt": "^4.0.1", "npm-packlist": "^1.1.6", "npmlog": "^4.0.2", - "rc": "^1.1.7", + "rc": "^1.2.7", "rimraf": "^2.6.1", "semver": "^5.3.0", "tar": "^4" @@ -4323,13 +5403,13 @@ } }, "npm-bundled": { - "version": "1.0.3", + "version": "1.0.6", "bundled": true, "dev": true, "optional": true }, "npm-packlist": { - "version": "1.1.10", + "version": "1.4.1", "bundled": true, "dev": true, "optional": true, @@ -4353,8 +5433,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -4366,7 +5445,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -4406,12 +5484,12 @@ "optional": true }, "rc": { - "version": "1.2.7", + "version": "1.2.8", "bundled": true, "dev": true, "optional": true, "requires": { - "deep-extend": "^0.5.1", + "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" @@ -4441,19 +5519,18 @@ } }, "rimraf": { - "version": "2.6.2", + "version": "2.6.3", "bundled": true, "dev": true, "optional": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "safe-buffer": { - "version": "5.1.1", + "version": "5.1.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -4468,7 +5545,7 @@ "optional": true }, "semver": { - "version": "5.5.0", + "version": "5.7.0", "bundled": true, "dev": true, "optional": true @@ -4489,7 +5566,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -4509,7 +5585,6 @@ "version": "3.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -4521,17 +5596,17 @@ "optional": true }, "tar": { - "version": "4.4.1", + "version": "4.4.8", "bundled": true, "dev": true, "optional": true, "requires": { - "chownr": "^1.0.1", + "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", + "safe-buffer": "^5.1.2", "yallist": "^3.0.2" } }, @@ -4542,25 +5617,23 @@ "optional": true }, "wide-align": { - "version": "1.1.2", + "version": "1.1.3", "bundled": true, "dev": true, "optional": true, "requires": { - "string-width": "^1.0.2" + "string-width": "^1.0.2 || 2" } }, "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "yallist": { - "version": "3.0.2", + "version": "3.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true } } }, @@ -4749,6 +5822,11 @@ } } }, + "google-protobuf": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.7.1.tgz", + "integrity": "sha512-6fvlUey6cNKtWSEn1bt4CT4wc2EID1fVluHS1dOnqIlxyIu3cBid2BvWE8Rwl6wN+hRTgiAKhfyydAGV/weZYQ==" + }, "got": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", @@ -4781,26 +5859,17 @@ "dev": true }, "handlebars": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.0.tgz", - "integrity": "sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", "dev": true, "requires": { - "async": "^2.5.0", + "neo-async": "^2.6.0", "optimist": "^0.6.1", "source-map": "^0.6.1", "uglify-js": "^3.1.4" }, "dependencies": { - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "dev": true, - "requires": { - "lodash": "^4.17.10" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -5516,91 +6585,25 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, - "istanbul-api": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.0.tgz", - "integrity": "sha512-+Ygg4t1StoiNlBGc6x0f8q/Bv26FbZqP/+jegzfNpU7Q8o+4ZRoJxJPhBkgE/UonpAjtxnE4zCZIyJX+MwLRMQ==", - "dev": true, - "requires": { - "async": "^2.6.1", - "compare-versions": "^3.2.1", - "fileset": "^2.0.3", - "istanbul-lib-coverage": "^2.0.3", - "istanbul-lib-hook": "^2.0.3", - "istanbul-lib-instrument": "^3.1.0", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.2", - "istanbul-reports": "^2.1.0", - "js-yaml": "^3.12.0", - "make-dir": "^1.3.0", - "minimatch": "^3.0.4", - "once": "^1.4.0" - }, - "dependencies": { - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "dev": true, - "requires": { - "lodash": "^4.17.10" - } - }, - "js-yaml": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", - "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, "istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", + "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.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.3.tgz", - "integrity": "sha512-CLmEqwEhuCYtGcpNVJjLV1DQyVnIqavMLFHV/DP+np/g3qvdxu3gsPqYoJMXm15sN84xOlckFB3VNvRbf5yEgA==", - "dev": true, - "requires": { - "append-transform": "^1.0.0" - } - }, "istanbul-lib-instrument": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz", - "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==", + "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.0.0", - "@babel/parser": "^7.0.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "istanbul-lib-coverage": "^2.0.3", - "semver": "^5.5.0" + "@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": { "@babel/code-frame": { @@ -5613,14 +6616,14 @@ } }, "@babel/generator": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.2.tgz", - "integrity": "sha512-f3QCuPppXxtZOEm5GWPra/uYUjmNQlu9pbAD8D/9jze4pTY83rTtB1igTBSwvkeNlC5gR24zFFkz+2WHLFQhqQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", + "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", "dev": true, "requires": { - "@babel/types": "^7.3.2", + "@babel/types": "^7.4.4", "jsesc": "^2.5.1", - "lodash": "^4.17.10", + "lodash": "^4.17.11", "source-map": "^0.5.0", "trim-right": "^1.0.1" } @@ -5646,12 +6649,12 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", - "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", + "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.0.0" + "@babel/types": "^7.4.4" } }, "@babel/highlight": { @@ -5665,58 +6668,48 @@ "js-tokens": "^4.0.0" } }, + "@babel/parser": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.4.tgz", + "integrity": "sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==", + "dev": true + }, "@babel/template": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", - "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", + "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.2.2", - "@babel/types": "^7.2.2" - }, - "dependencies": { - "@babel/parser": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.2.tgz", - "integrity": "sha512-QzNUC2RO1gadg+fs21fi0Uu0OuGNzRKEmgCxoLNzbCdoprLwjfmZwzUrpUNfJPaVRwBpDY47A17yYEGWyRelnQ==", - "dev": true - } + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" } }, "@babel/traverse": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz", - "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.4.tgz", + "integrity": "sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.2.2", + "@babel/generator": "^7.4.4", "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.0.0", - "@babel/parser": "^7.2.3", - "@babel/types": "^7.2.2", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.10" - }, - "dependencies": { - "@babel/parser": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.2.tgz", - "integrity": "sha512-QzNUC2RO1gadg+fs21fi0Uu0OuGNzRKEmgCxoLNzbCdoprLwjfmZwzUrpUNfJPaVRwBpDY47A17yYEGWyRelnQ==", - "dev": true - } + "lodash": "^4.17.11" } }, "@babel/types": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.2.tgz", - "integrity": "sha512-3Y6H8xlUlpbGR+XvawiH0UXehqydTmNmEpozWcXymqwcrwYAl5KMvKtQ+TF6f6E08V6Jur7v/ykdDSF+WDEIXQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", "dev": true, "requires": { "esutils": "^2.0.2", - "lodash": "^4.17.10", + "lodash": "^4.17.11", "to-fast-properties": "^2.0.0" } }, @@ -5750,9 +6743,9 @@ } }, "globals": { - "version": "11.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", - "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, "has-flag": { @@ -5780,9 +6773,9 @@ "dev": true }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", "dev": true }, "supports-color": { @@ -5803,14 +6796,14 @@ } }, "istanbul-lib-report": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.4.tgz", - "integrity": "sha512-sOiLZLAWpA0+3b5w5/dq0cjm2rrNdAfHWaGhmn7XEFW6X++IV9Ohn+pnELAl9K3rfpaeBfbmH9JU5sejacdLeA==", + "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.3", - "make-dir": "^1.3.0", - "supports-color": "^6.0.0" + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" }, "dependencies": { "has-flag": { @@ -5820,18 +6813,25 @@ "dev": true }, "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "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": "^3.0.0" + "pify": "^4.0.1", + "semver": "^5.6.0" } }, "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true }, "supports-color": { @@ -5846,15 +6846,15 @@ } }, "istanbul-lib-source-maps": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.2.tgz", - "integrity": "sha512-JX4v0CiKTGp9fZPmoxpu9YEkPbEqCqBbO3403VabKjH+NRXo72HafD5UgnjTEqHL2SAjaZK1XDuDOkn6I5QVfQ==", + "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.3", - "make-dir": "^1.3.0", - "rimraf": "^2.6.2", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", "source-map": "^0.6.1" }, "dependencies": { @@ -5867,13 +6867,28 @@ "ms": "^2.1.1" } }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "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": "^3.0.0" + "pify": "^4.0.1", + "semver": "^5.6.0" } }, "ms": { @@ -5883,9 +6898,24 @@ "dev": true }, "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true }, "source-map": { @@ -5897,12 +6927,12 @@ } }, "istanbul-reports": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.1.0.tgz", - "integrity": "sha512-azQdSX+dtTtkQEfqq20ICxWi6eOHXyHIgMFw1VOOVi8iIPWeCWRgCyFh/CsBKIhcgskMI8ExXmU7rjXTRCIJ+A==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.4.tgz", + "integrity": "sha512-QCHGyZEK0bfi9GR215QSm+NJwFKEShbtc7tfbUdLAEzn3kKhLDDZqvljn8rPZM9v8CEOhzL1nlYoO4r1ryl67w==", "dev": true, "requires": { - "handlebars": "^4.0.11" + "handlebars": "^4.1.2" } }, "jest": { @@ -5915,12 +6945,6 @@ "jest-cli": "^24.1.0" }, "dependencies": { - "ansi-regex": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", - "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", - "dev": true - }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -5971,6 +6995,18 @@ } } }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -6235,49 +7271,130 @@ "dev": true }, "jest-cli": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.1.0.tgz", - "integrity": "sha512-U/iyWPwOI0T1CIxVLtk/2uviOTJ/OiSWJSe8qt6X1VkbbgP+nrtLJlmT9lPBe4lK78VNFJtrJ7pttcNv/s7yCw==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.8.0.tgz", + "integrity": "sha512-+p6J00jSMPQ116ZLlHJJvdf8wbjNbZdeSX9ptfHX06/MSNaXmKihQzx5vQcw0q2G6JsdVkUIdWbOWtSnaYs3yA==", "dev": true, "requires": { - "ansi-escapes": "^3.0.0", + "@jest/core": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", "chalk": "^2.0.1", "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.1.15", "import-local": "^2.0.0", "is-ci": "^2.0.0", - "istanbul-api": "^2.0.8", - "istanbul-lib-coverage": "^2.0.2", - "istanbul-lib-instrument": "^3.0.1", - "istanbul-lib-source-maps": "^3.0.1", - "jest-changed-files": "^24.0.0", - "jest-config": "^24.1.0", - "jest-environment-jsdom": "^24.0.0", - "jest-get-type": "^24.0.0", - "jest-haste-map": "^24.0.0", - "jest-message-util": "^24.0.0", - "jest-regex-util": "^24.0.0", - "jest-resolve-dependencies": "^24.1.0", - "jest-runner": "^24.1.0", - "jest-runtime": "^24.1.0", - "jest-snapshot": "^24.1.0", - "jest-util": "^24.0.0", - "jest-validate": "^24.0.0", - "jest-watcher": "^24.0.0", - "jest-worker": "^24.0.0", - "micromatch": "^3.1.10", - "node-notifier": "^5.2.1", - "p-each-series": "^1.0.0", - "pirates": "^4.0.0", + "jest-config": "^24.8.0", + "jest-util": "^24.8.0", + "jest-validate": "^24.8.0", "prompts": "^2.0.1", - "realpath-native": "^1.0.0", - "rimraf": "^2.5.4", - "slash": "^2.0.0", - "string-length": "^2.0.0", - "strip-ansi": "^5.0.0", - "which": "^1.2.12", + "realpath-native": "^1.1.0", "yargs": "^12.0.2" + }, + "dependencies": { + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "jest-config": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.8.0.tgz", + "integrity": "sha512-Czl3Nn2uEzVGsOeaewGWoDPD8GStxCpAe0zOYs2x2l0fZAgPbCr3uwUkgNKV3LwE13VXythM946cd5rdGkkBZw==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^24.8.0", + "@jest/types": "^24.8.0", + "babel-jest": "^24.8.0", + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^24.8.0", + "jest-environment-node": "^24.8.0", + "jest-get-type": "^24.8.0", + "jest-jasmine2": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.8.0", + "jest-util": "^24.8.0", + "jest-validate": "^24.8.0", + "micromatch": "^3.1.10", + "pretty-format": "^24.8.0", + "realpath-native": "^1.1.0" + } + }, + "jest-util": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.8.0.tgz", + "integrity": "sha512-DYZeE+XyAnbNt0BG1OQqKy/4GVLPtzwGx5tsnDrFcax36rVE3lTA5fbvgmbVPUZf9w77AJ8otqR4VBbfFJkUZA==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/fake-timers": "^24.8.0", + "@jest/source-map": "^24.3.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + } + }, + "jest-validate": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.8.0.tgz", + "integrity": "sha512-+/N7VOEMW1Vzsrk3UWBDYTExTPwf68tavEPKDnJzrC6UlHtUDU/fuEdXqFoHzv9XnQ+zW6X3qMZhJ3YexfeLDA==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "camelcase": "^5.0.0", + "chalk": "^2.0.1", + "jest-get-type": "^24.8.0", + "leven": "^2.1.0", + "pretty-format": "^24.8.0" + } + }, + "prompts": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.0.4.tgz", + "integrity": "sha512-HTzM3UWp/99A0gk51gAegwo1QRYA7xjcZufMNe33rCclFszUYAuHe1fIN/3ZmiHeGPkUsNaRyQm1hHOfM0PKxA==", + "dev": true, + "requires": { + "kleur": "^3.0.2", + "sisteransi": "^1.0.0" + } + }, + "realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + } } }, "kind-of": { @@ -6344,20 +7461,23 @@ "find-up": "^3.0.0" } }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, "slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true }, - "strip-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", - "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", - "dev": true, - "requires": { - "ansi-regex": "^4.0.0" - } + "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 }, "supports-color": { "version": "5.5.0", @@ -6371,11 +7491,12 @@ } }, "jest-changed-files": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.0.0.tgz", - "integrity": "sha512-nnuU510R9U+UX0WNb5XFEcsrMqriSiRLeO9KWDFgPrpToaQm60prfQYpxsXigdClpvNot5bekDY440x9dNGnsQ==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.8.0.tgz", + "integrity": "sha512-qgANC1Yrivsq+UrLXsvJefBKVoCsKB0Hv+mBb6NMjjZ90wwxCDmU3hsCXBya30cH+LnPYjwgcU65i6yJ5Nfuug==", "dev": true, "requires": { + "@jest/types": "^24.8.0", "execa": "^1.0.0", "throat": "^4.0.0" }, @@ -6418,34 +7539,36 @@ } }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true } } }, "jest-config": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.1.0.tgz", - "integrity": "sha512-FbbRzRqtFC6eGjG5VwsbW4E5dW3zqJKLWYiZWhB0/4E5fgsMw8GODLbGSrY5t17kKOtCWb/Z7nsIThRoDpuVyg==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.8.0.tgz", + "integrity": "sha512-Czl3Nn2uEzVGsOeaewGWoDPD8GStxCpAe0zOYs2x2l0fZAgPbCr3uwUkgNKV3LwE13VXythM946cd5rdGkkBZw==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "babel-jest": "^24.1.0", + "@jest/test-sequencer": "^24.8.0", + "@jest/types": "^24.8.0", + "babel-jest": "^24.8.0", "chalk": "^2.0.1", "glob": "^7.1.1", - "jest-environment-jsdom": "^24.0.0", - "jest-environment-node": "^24.0.0", - "jest-get-type": "^24.0.0", - "jest-jasmine2": "^24.1.0", - "jest-regex-util": "^24.0.0", - "jest-resolve": "^24.1.0", - "jest-util": "^24.0.0", - "jest-validate": "^24.0.0", + "jest-environment-jsdom": "^24.8.0", + "jest-environment-node": "^24.8.0", + "jest-get-type": "^24.8.0", + "jest-jasmine2": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.8.0", + "jest-util": "^24.8.0", + "jest-validate": "^24.8.0", "micromatch": "^3.1.10", - "pretty-format": "^24.0.0", - "realpath-native": "^1.0.2" + "pretty-format": "^24.8.0", + "realpath-native": "^1.1.0" }, "dependencies": { "ansi-styles": { @@ -6760,15 +7883,15 @@ } }, "jest-diff": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.0.0.tgz", - "integrity": "sha512-XY5wMpRaTsuMoU+1/B2zQSKQ9RdE9gsLkGydx3nvApeyPijLA8GtEvIcPwISRCer+VDf9W1mStTYYq6fPt8ryA==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.8.0.tgz", + "integrity": "sha512-wxetCEl49zUpJ/bvUmIFjd/o52J+yWcoc5ZyPq4/W1LUKGEhRYDIbP1KcF6t+PvqNrGAFk4/JhtxDq/Nnzs66g==", "dev": true, "requires": { "chalk": "^2.0.1", - "diff-sequences": "^24.0.0", - "jest-get-type": "^24.0.0", - "pretty-format": "^24.0.0" + "diff-sequences": "^24.3.0", + "jest-get-type": "^24.8.0", + "pretty-format": "^24.8.0" }, "dependencies": { "ansi-styles": { @@ -6809,24 +7932,25 @@ } }, "jest-docblock": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.0.0.tgz", - "integrity": "sha512-KfAKZ4SN7CFOZpWg4i7g7MSlY0M+mq7K0aMqENaG2vHuhC9fc3vkpU/iNN9sOus7v3h3Y48uEjqz3+Gdn2iptA==", + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.3.0.tgz", + "integrity": "sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg==", "dev": true, "requires": { "detect-newline": "^2.1.0" } }, "jest-each": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.0.0.tgz", - "integrity": "sha512-gFcbY4Cu55yxExXMkjrnLXov3bWO3dbPAW7HXb31h/DNWdNc/6X8MtxGff8nh3/MjkF9DpVqnj0KsPKuPK0cpA==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.8.0.tgz", + "integrity": "sha512-NrwK9gaL5+XgrgoCsd9svsoWdVkK4gnvyhcpzd6m487tXHqIdYeykgq3MKI1u4I+5Zf0tofr70at9dWJDeb+BA==", "dev": true, "requires": { + "@jest/types": "^24.8.0", "chalk": "^2.0.1", - "jest-get-type": "^24.0.0", - "jest-util": "^24.0.0", - "pretty-format": "^24.0.0" + "jest-get-type": "^24.8.0", + "jest-util": "^24.8.0", + "pretty-format": "^24.8.0" }, "dependencies": { "ansi-styles": { @@ -6867,48 +7991,68 @@ } }, "jest-environment-jsdom": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.0.0.tgz", - "integrity": "sha512-1YNp7xtxajTRaxbylDc2pWvFnfDTH5BJJGyVzyGAKNt/lEULohwEV9zFqTgG4bXRcq7xzdd+sGFws+LxThXXOw==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.8.0.tgz", + "integrity": "sha512-qbvgLmR7PpwjoFjM/sbuqHJt/NCkviuq9vus9NBn/76hhSidO+Z6Bn9tU8friecegbJL8gzZQEMZBQlFWDCwAQ==", "dev": true, "requires": { - "jest-mock": "^24.0.0", - "jest-util": "^24.0.0", + "@jest/environment": "^24.8.0", + "@jest/fake-timers": "^24.8.0", + "@jest/types": "^24.8.0", + "jest-mock": "^24.8.0", + "jest-util": "^24.8.0", "jsdom": "^11.5.1" } }, "jest-environment-node": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.0.0.tgz", - "integrity": "sha512-62fOFcaEdU0VLaq8JL90TqwI7hLn0cOKOl8vY2n477vRkCJRojiRRtJVRzzCcgFvs6gqU97DNqX5R0BrBP6Rxg==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.8.0.tgz", + "integrity": "sha512-vIGUEScd1cdDgR6sqn2M08sJTRLQp6Dk/eIkCeO4PFHxZMOgy+uYLPMC4ix3PEfM5Au/x3uQ/5Tl0DpXXZsJ/Q==", "dev": true, "requires": { - "jest-mock": "^24.0.0", - "jest-util": "^24.0.0" + "@jest/environment": "^24.8.0", + "@jest/fake-timers": "^24.8.0", + "@jest/types": "^24.8.0", + "jest-mock": "^24.8.0", + "jest-util": "^24.8.0" } }, "jest-get-type": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.0.0.tgz", - "integrity": "sha512-z6/Eyf6s9ZDGz7eOvl+fzpuJmN9i0KyTt1no37/dHu8galssxz5ZEgnc1KaV8R31q1khxyhB4ui/X5ZjjPk77w==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.8.0.tgz", + "integrity": "sha512-RR4fo8jEmMD9zSz2nLbs2j0zvPpk/KCEz3a62jJWbd2ayNo0cb+KFRxPHVhE4ZmgGJEQp0fosmNz84IfqM8cMQ==", "dev": true }, "jest-haste-map": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.0.0.tgz", - "integrity": "sha512-CcViJyUo41IQqttLxXVdI41YErkzBKbE6cS6dRAploCeutePYfUimWd3C9rQEWhX0YBOQzvNsC0O9nYxK2nnxQ==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.8.0.tgz", + "integrity": "sha512-ZBPRGHdPt1rHajWelXdqygIDpJx8u3xOoLyUBWRW28r3tagrgoepPrzAozW7kW9HrQfhvmiv1tncsxqHJO1onQ==", "dev": true, "requires": { + "@jest/types": "^24.8.0", + "anymatch": "^2.0.0", "fb-watchman": "^2.0.0", + "fsevents": "^1.2.7", "graceful-fs": "^4.1.15", "invariant": "^2.2.4", - "jest-serializer": "^24.0.0", - "jest-util": "^24.0.0", - "jest-worker": "^24.0.0", + "jest-serializer": "^24.4.0", + "jest-util": "^24.8.0", + "jest-worker": "^24.6.0", "micromatch": "^3.1.10", - "sane": "^3.0.0" + "sane": "^4.0.3", + "walker": "^1.0.7" }, "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -7201,22 +8345,26 @@ } }, "jest-jasmine2": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.1.0.tgz", - "integrity": "sha512-H+o76SdSNyCh9fM5K8upK45YTo/DiFx5w2YAzblQebSQmukDcoVBVeXynyr7DDnxh+0NTHYRCLwJVf3tC518wg==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.8.0.tgz", + "integrity": "sha512-cEky88npEE5LKd5jPpTdDCLvKkdyklnaRycBXL6GNmpxe41F0WN44+i7lpQKa/hcbXaQ+rc9RMaM4dsebrYong==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", + "@jest/environment": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", "chalk": "^2.0.1", "co": "^4.6.0", - "expect": "^24.1.0", + "expect": "^24.8.0", "is-generator-fn": "^2.0.0", - "jest-each": "^24.0.0", - "jest-matcher-utils": "^24.0.0", - "jest-message-util": "^24.0.0", - "jest-snapshot": "^24.1.0", - "jest-util": "^24.0.0", - "pretty-format": "^24.0.0", + "jest-each": "^24.8.0", + "jest-matcher-utils": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-runtime": "^24.8.0", + "jest-snapshot": "^24.8.0", + "jest-util": "^24.8.0", + "pretty-format": "^24.8.0", "throat": "^4.0.0" }, "dependencies": { @@ -7230,14 +8378,14 @@ } }, "@babel/generator": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.2.tgz", - "integrity": "sha512-f3QCuPppXxtZOEm5GWPra/uYUjmNQlu9pbAD8D/9jze4pTY83rTtB1igTBSwvkeNlC5gR24zFFkz+2WHLFQhqQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", + "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", "dev": true, "requires": { - "@babel/types": "^7.3.2", + "@babel/types": "^7.4.4", "jsesc": "^2.5.1", - "lodash": "^4.17.10", + "lodash": "^4.17.11", "source-map": "^0.5.0", "trim-right": "^1.0.1" } @@ -7263,12 +8411,12 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", - "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", + "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.0.0" + "@babel/types": "^7.4.4" } }, "@babel/highlight": { @@ -7283,47 +8431,47 @@ } }, "@babel/parser": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.2.tgz", - "integrity": "sha512-QzNUC2RO1gadg+fs21fi0Uu0OuGNzRKEmgCxoLNzbCdoprLwjfmZwzUrpUNfJPaVRwBpDY47A17yYEGWyRelnQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.4.tgz", + "integrity": "sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==", "dev": true }, "@babel/template": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", - "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", + "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.2.2", - "@babel/types": "^7.2.2" + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" } }, "@babel/traverse": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz", - "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.4.tgz", + "integrity": "sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.2.2", + "@babel/generator": "^7.4.4", "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.0.0", - "@babel/parser": "^7.2.3", - "@babel/types": "^7.2.2", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.10" + "lodash": "^4.17.11" } }, "@babel/types": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.2.tgz", - "integrity": "sha512-3Y6H8xlUlpbGR+XvawiH0UXehqydTmNmEpozWcXymqwcrwYAl5KMvKtQ+TF6f6E08V6Jur7v/ykdDSF+WDEIXQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", "dev": true, "requires": { "esutils": "^2.0.2", - "lodash": "^4.17.10", + "lodash": "^4.17.11", "to-fast-properties": "^2.0.0" } }, @@ -7357,9 +8505,9 @@ } }, "globals": { - "version": "11.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", - "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, "has-flag": { @@ -7369,9 +8517,9 @@ "dev": true }, "is-generator-fn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.0.0.tgz", - "integrity": "sha512-elzyIdM7iKoFHzcrndIqjYomImhxrFRnGP3galODoII4TB9gI7mZ+FnlLQmmjf27SxHS2gKEeyhX5/+YRS6H9g==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true }, "js-tokens": { @@ -7410,24 +8558,24 @@ } }, "jest-leak-detector": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.0.0.tgz", - "integrity": "sha512-ZYHJYFeibxfsDSKowjDP332pStuiFT2xfc5R67Rjm/l+HFJWJgNIOCOlQGeXLCtyUn3A23+VVDdiCcnB6dTTrg==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.8.0.tgz", + "integrity": "sha512-cG0yRSK8A831LN8lIHxI3AblB40uhv0z+SsQdW3GoMMVcK+sJwrIIyax5tu3eHHNJ8Fu6IMDpnLda2jhn2pD/g==", "dev": true, "requires": { - "pretty-format": "^24.0.0" + "pretty-format": "^24.8.0" } }, "jest-matcher-utils": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.0.0.tgz", - "integrity": "sha512-LQTDmO+aWRz1Tf9HJg+HlPHhDh1E1c65kVwRFo5mwCVp5aQDzlkz4+vCvXhOKFjitV2f0kMdHxnODrXVoi+rlA==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.8.0.tgz", + "integrity": "sha512-lex1yASY51FvUuHgm0GOVj7DCYEouWSlIYmCW7APSqB9v8mXmKSn5+sWVF0MhuASG0bnYY106/49JU1FZNl5hw==", "dev": true, "requires": { "chalk": "^2.0.1", - "jest-diff": "^24.0.0", - "jest-get-type": "^24.0.0", - "pretty-format": "^24.0.0" + "jest-diff": "^24.8.0", + "jest-get-type": "^24.8.0", + "pretty-format": "^24.8.0" }, "dependencies": { "ansi-styles": { @@ -7468,12 +8616,15 @@ } }, "jest-message-util": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.0.0.tgz", - "integrity": "sha512-J9ROJIwz/IeC+eV1XSwnRK4oAwPuhmxEyYx1+K5UI+pIYwFZDSrfZaiWTdq0d2xYFw4Xiu+0KQWsdsQpgJMf3Q==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.8.0.tgz", + "integrity": "sha512-p2k71rf/b6ns8btdB0uVdljWo9h0ovpnEe05ZKWceQGfXYr4KkzgKo3PBi8wdnd9OtNh46VpNIJynUn/3MKm1g==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "@types/stack-utils": "^1.0.1", "chalk": "^2.0.1", "micromatch": "^3.1.10", "slash": "^2.0.0", @@ -7824,26 +8975,37 @@ } }, "jest-mock": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.0.0.tgz", - "integrity": "sha512-sQp0Hu5fcf5NZEh1U9eIW2qD0BwJZjb63Yqd98PQJFvf/zzUTBoUAwv/Dc/HFeNHIw1f3hl/48vNn+j3STaI7A==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.8.0.tgz", + "integrity": "sha512-6kWugwjGjJw+ZkK4mDa0Df3sDlUTsV47MSrT0nGQ0RBWJbpODDQ8MHDVtGtUYBne3IwZUhtB7elxHspU79WH3A==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0" + } + }, + "jest-pnp-resolver": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", + "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", "dev": true }, "jest-regex-util": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.0.0.tgz", - "integrity": "sha512-Jv/uOTCuC+PY7WpJl2mpoI+WbY2ut73qwwO9ByJJNwOCwr1qWhEW2Lyi2S9ZewUdJqeVpEBisdEVZSI+Zxo58Q==", + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.3.0.tgz", + "integrity": "sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg==", "dev": true }, "jest-resolve": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.1.0.tgz", - "integrity": "sha512-TPiAIVp3TG6zAxH28u/6eogbwrvZjBMWroSLBDkwkHKrqxB/RIdwkWDye4uqPlZIXWIaHtifY3L0/eO5Z0f2wg==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz", + "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==", "dev": true, "requires": { + "@jest/types": "^24.8.0", "browser-resolve": "^1.11.3", "chalk": "^2.0.1", - "realpath-native": "^1.0.0" + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" }, "dependencies": { "ansi-styles": { @@ -7884,33 +9046,39 @@ } }, "jest-resolve-dependencies": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.1.0.tgz", - "integrity": "sha512-2VwPsjd3kRPu7qe2cpytAgowCObk5AKeizfXuuiwgm1a9sijJDZe8Kh1sFj6FKvSaNEfCPlBVkZEJa2482m/Uw==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.8.0.tgz", + "integrity": "sha512-hyK1qfIf/krV+fSNyhyJeq3elVMhK9Eijlwy+j5jqmZ9QsxwKBiP6qukQxaHtK8k6zql/KYWwCTQ+fDGTIJauw==", "dev": true, "requires": { - "jest-regex-util": "^24.0.0", - "jest-snapshot": "^24.1.0" + "@jest/types": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-snapshot": "^24.8.0" } }, "jest-runner": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.1.0.tgz", - "integrity": "sha512-CDGOkT3AIFl16BLL/OdbtYgYvbAprwJ+ExKuLZmGSCSldwsuU2dEGauqkpvd9nphVdAnJUcP12e/EIlnTX0QXg==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.8.0.tgz", + "integrity": "sha512-utFqC5BaA3JmznbissSs95X1ZF+d+4WuOWwpM9+Ak356YtMhHE/GXUondZdcyAAOTBEsRGAgH/0TwLzfI9h7ow==", "dev": true, "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", "chalk": "^2.4.2", "exit": "^0.1.2", "graceful-fs": "^4.1.15", - "jest-config": "^24.1.0", - "jest-docblock": "^24.0.0", - "jest-haste-map": "^24.0.0", - "jest-jasmine2": "^24.1.0", - "jest-leak-detector": "^24.0.0", - "jest-message-util": "^24.0.0", - "jest-runtime": "^24.1.0", - "jest-util": "^24.0.0", - "jest-worker": "^24.0.0", + "jest-config": "^24.8.0", + "jest-docblock": "^24.3.0", + "jest-haste-map": "^24.8.0", + "jest-jasmine2": "^24.8.0", + "jest-leak-detector": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-resolve": "^24.8.0", + "jest-runtime": "^24.8.0", + "jest-util": "^24.8.0", + "jest-worker": "^24.6.0", "source-map-support": "^0.5.6", "throat": "^4.0.0" }, @@ -7954,9 +9122,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", - "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -7975,251 +9143,60 @@ } }, "jest-runtime": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.1.0.tgz", - "integrity": "sha512-59/BY6OCuTXxGeDhEMU7+N33dpMQyXq7MLK07cNSIY/QYt2QZgJ7Tjx+rykBI0skAoigFl0A5tmT8UdwX92YuQ==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.8.0.tgz", + "integrity": "sha512-Mq0aIXhvO/3bX44ccT+czU1/57IgOMyy80oM0XR/nyD5zgBcesF84BPabZi39pJVA6UXw+fY2Q1N+4BiVUBWOA==", "dev": true, "requires": { - "@babel/core": "^7.1.0", - "babel-plugin-istanbul": "^5.1.0", + "@jest/console": "^24.7.1", + "@jest/environment": "^24.8.0", + "@jest/source-map": "^24.3.0", + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "@types/yargs": "^12.0.2", "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", "exit": "^0.1.2", - "fast-json-stable-stringify": "^2.0.0", "glob": "^7.1.3", "graceful-fs": "^4.1.15", - "jest-config": "^24.1.0", - "jest-haste-map": "^24.0.0", - "jest-message-util": "^24.0.0", - "jest-regex-util": "^24.0.0", - "jest-resolve": "^24.1.0", - "jest-snapshot": "^24.1.0", - "jest-util": "^24.0.0", - "jest-validate": "^24.0.0", - "micromatch": "^3.1.10", - "realpath-native": "^1.0.0", + "jest-config": "^24.8.0", + "jest-haste-map": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-mock": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.8.0", + "jest-snapshot": "^24.8.0", + "jest-util": "^24.8.0", + "jest-validate": "^24.8.0", + "realpath-native": "^1.1.0", "slash": "^2.0.0", "strip-bom": "^3.0.0", - "write-file-atomic": "2.4.1", "yargs": "^12.0.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" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.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" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "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" } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "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": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -8242,88 +9219,6 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, "slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", @@ -8338,52 +9233,43 @@ "requires": { "has-flag": "^3.0.0" } - }, - "write-file-atomic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", - "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } } } }, "jest-serializer": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.0.0.tgz", - "integrity": "sha512-9FKxQyrFgHtx3ozU+1a8v938ILBE7S8Ko3uiAVjT8Yfi2o91j/fj81jacCQZ/Ihjiff/VsUCXVgQ+iF1XdImOw==", + "version": "24.4.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.4.0.tgz", + "integrity": "sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q==", "dev": true }, "jest-snapshot": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.1.0.tgz", - "integrity": "sha512-th6TDfFqEmXvuViacU1ikD7xFb7lQsPn2rJl7OEmnfIVpnrx3QNY2t3PE88meeg0u/mQ0nkyvmC05PBqO4USFA==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.8.0.tgz", + "integrity": "sha512-5ehtWoc8oU9/cAPe6fez6QofVJLBKyqkY2+TlKTOf0VllBB/mqUNdARdcjlZrs9F1Cv+/HKoCS/BknT0+tmfPg==", "dev": true, "requires": { "@babel/types": "^7.0.0", + "@jest/types": "^24.8.0", "chalk": "^2.0.1", - "jest-diff": "^24.0.0", - "jest-matcher-utils": "^24.0.0", - "jest-message-util": "^24.0.0", - "jest-resolve": "^24.1.0", + "expect": "^24.8.0", + "jest-diff": "^24.8.0", + "jest-matcher-utils": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-resolve": "^24.8.0", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "pretty-format": "^24.0.0", + "pretty-format": "^24.8.0", "semver": "^5.5.0" }, "dependencies": { "@babel/types": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.2.tgz", - "integrity": "sha512-3Y6H8xlUlpbGR+XvawiH0UXehqydTmNmEpozWcXymqwcrwYAl5KMvKtQ+TF6f6E08V6Jur7v/ykdDSF+WDEIXQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", "dev": true, "requires": { "esutils": "^2.0.2", - "lodash": "^4.17.10", + "lodash": "^4.17.11", "to-fast-properties": "^2.0.0" } }, @@ -8414,9 +9300,9 @@ "dev": true }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true }, "supports-color": { @@ -8437,16 +9323,20 @@ } }, "jest-util": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.0.0.tgz", - "integrity": "sha512-QxsALc4wguYS7cfjdQSOr5HTkmjzkHgmZvIDkcmPfl1ib8PNV8QUWLwbKefCudWS0PRKioV+VbQ0oCUPC691fQ==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.8.0.tgz", + "integrity": "sha512-DYZeE+XyAnbNt0BG1OQqKy/4GVLPtzwGx5tsnDrFcax36rVE3lTA5fbvgmbVPUZf9w77AJ8otqR4VBbfFJkUZA==", "dev": true, "requires": { + "@jest/console": "^24.7.1", + "@jest/fake-timers": "^24.8.0", + "@jest/source-map": "^24.3.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", "callsites": "^3.0.0", "chalk": "^2.0.1", "graceful-fs": "^4.1.15", "is-ci": "^2.0.0", - "jest-message-util": "^24.0.0", "mkdirp": "^0.5.1", "slash": "^2.0.0", "source-map": "^0.6.0" @@ -8462,9 +9352,9 @@ } }, "callsites": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", - "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, "chalk": { @@ -8529,16 +9419,17 @@ } }, "jest-validate": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.0.0.tgz", - "integrity": "sha512-vMrKrTOP4BBFIeOWsjpsDgVXATxCspC9S1gqvbJ3Tnn/b9ACsJmteYeVx9830UMV28Cob1RX55x96Qq3Tfad4g==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.8.0.tgz", + "integrity": "sha512-+/N7VOEMW1Vzsrk3UWBDYTExTPwf68tavEPKDnJzrC6UlHtUDU/fuEdXqFoHzv9XnQ+zW6X3qMZhJ3YexfeLDA==", "dev": true, "requires": { + "@jest/types": "^24.8.0", "camelcase": "^5.0.0", "chalk": "^2.0.1", - "jest-get-type": "^24.0.0", + "jest-get-type": "^24.8.0", "leven": "^2.1.0", - "pretty-format": "^24.0.0" + "pretty-format": "^24.8.0" }, "dependencies": { "ansi-styles": { @@ -8551,9 +9442,9 @@ } }, "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "chalk": { @@ -8585,14 +9476,17 @@ } }, "jest-watcher": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.0.0.tgz", - "integrity": "sha512-GxkW2QrZ4YxmW1GUWER05McjVDunBlKMFfExu+VsGmXJmpej1saTEKvONdx5RJBlVdpPI5x6E3+EDQSIGgl53g==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.8.0.tgz", + "integrity": "sha512-SBjwHt5NedQoVu54M5GEx7cl7IGEFFznvd/HNT8ier7cCAx/Qgu9ZMlaTQkvK22G1YOpcWBLQPFSImmxdn3DAw==", "dev": true, "requires": { + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "@types/yargs": "^12.0.9", "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", - "jest-util": "^24.0.0", + "jest-util": "^24.8.0", "string-length": "^2.0.0" }, "dependencies": { @@ -8634,9 +9528,9 @@ } }, "jest-worker": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.0.0.tgz", - "integrity": "sha512-s64/OThpfQvoCeHG963MiEZOAAxu8kHsaL/rCMF7lpdzo7vgF0CtPml9hfguOMgykgH/eOm4jFP4ibfHLruytg==", + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.6.0.tgz", + "integrity": "sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ==", "dev": true, "requires": { "merge-stream": "^1.0.1", @@ -8843,9 +9737,9 @@ } }, "kleur": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.2.tgz", - "integrity": "sha512-3h7B2WRT5LNXOtQiAaWonilegHcPSf9nLVXlSTci8lu1dZUuui61+EsPEZqSVxY7rXYmB2DVKMQILxaO5WL61Q==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, "kuler": { @@ -9174,14 +10068,22 @@ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "mem": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz", - "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==", + "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": "^1.0.0", + "mimic-fn": "^2.0.0", "p-is-promise": "^2.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + } } }, "meow": { @@ -9292,12 +10194,6 @@ } } }, - "merge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", - "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", - "dev": true - }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -9474,9 +10370,9 @@ "dev": true }, "nan": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", - "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", + "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", "dev": true, "optional": true }, @@ -9525,6 +10421,15 @@ "integrity": "sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA==", "optional": true }, + "nats": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/nats/-/nats-1.2.10.tgz", + "integrity": "sha512-0FQMINZbyRkFMRbrpc6+IkKMQ+Zi2Ibr4YPhoEBlbP0Gw3ta23e/GB+LvXNqnV3htOPJNJ54+ToMI43BCYATGQ==", + "requires": { + "nuid": "^1.0.0", + "ts-nkeys": "^1.0.8" + } + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -9536,6 +10441,12 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, "nested-error-stacks": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", @@ -9616,6 +10527,16 @@ "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", "dev": true }, + "node-nats-streaming": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/node-nats-streaming/-/node-nats-streaming-0.2.2.tgz", + "integrity": "sha512-G/c9uq5AzznLaL10OB1ObZteCQxygGiSz33vyX4CSRUOB/pJhLzcoLsqW8+FqZ+lcOExyKshK/JLh4rBjl1qbg==", + "requires": { + "google-protobuf": "^3.7.1", + "nats": "^1.2.4", + "nuid": "^1.1.0" + } + }, "node-notifier": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz", @@ -9630,9 +10551,9 @@ }, "dependencies": { "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true } } @@ -10158,15 +11079,20 @@ "set-blocking": "~2.0.0" } }, + "nuid": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/nuid/-/nuid-1.1.0.tgz", + "integrity": "sha512-C/JdZ6PtCqKsCEs4ni76nhBsdmuQgLAT/CTLNprkcLViDAnkk7qx5sSA8PVC2vmSsdBlSsFuGb52v6pwn1oaeg==" + }, "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=" }, "nwsapi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.0.tgz", - "integrity": "sha512-ZG3bLAvdHmhIjaQ/Db1qvBxsGvFMLIRpQszyqbg31VJ53UP++uZX1/gf3Ut96pdwN9AuDwlMqIYLm0UPCdUeHg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", + "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", "dev": true }, "nyc": { @@ -11518,9 +12444,9 @@ } }, "object-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", - "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, "object-visit": { @@ -11744,9 +12670,9 @@ } }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true } } @@ -11779,9 +12705,9 @@ "dev": true }, "p-is-promise": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz", - "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==", + "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": { @@ -12019,9 +12945,9 @@ } }, "pirates": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.0.tgz", - "integrity": "sha512-8t5BsXy1LUIjn3WWOlOuFDuKswhQb/tkak641lvBgmPOBUQHXveORtlMCp6OdPV1dtuTaEahKA8VNz6uLfKBtA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", "dev": true, "requires": { "node-modules-regexp": "^1.0.0" @@ -12187,19 +13113,21 @@ "dev": true }, "pretty-format": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.0.0.tgz", - "integrity": "sha512-LszZaKG665djUcqg5ZQq+XzezHLKrxsA86ZABTozp+oNhkdqa+tG2dX4qa6ERl5c/sRDrAa3lHmwnvKoP+OG/g==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.8.0.tgz", + "integrity": "sha512-P952T7dkrDEplsR+TuY7q3VXDae5Sr7zmQb12JU/NDQa/3CH7/QW0yvqLcGN6jL+zQFKaoJcPc+yJxMTGmosqw==", "dev": true, "requires": { + "@jest/types": "^24.8.0", "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0" + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" }, "dependencies": { "ansi-regex": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", - "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", + "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": { @@ -12248,16 +13176,6 @@ "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", "dev": true }, - "prompts": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.0.2.tgz", - "integrity": "sha512-Pc/c53d2WZHJWZr78/BhZ5eHsdQtltbyBjHoA4T0cs/4yKJqCcoOHrq2SNKwtspVE0C+ebqAR5u0/mXwrHaADQ==", - "dev": true, - "requires": { - "kleur": "^3.0.2", - "sisteransi": "^1.0.0" - } - }, "propagate": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/propagate/-/propagate-1.0.0.tgz", @@ -12415,6 +13333,12 @@ } } }, + "react-is": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", + "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "dev": true + }, "read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", @@ -12496,9 +13420,9 @@ } }, "realpath-native": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.2.tgz", - "integrity": "sha512-+S3zTvVt9yTntFrBpm7TQmQ3tzpCrnA1a/y+3cUHAc9ZR6aIjG0WNLR+Rj79QpJktY+VeW/TQtFlQ1bzsehI8g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", "dev": true, "requires": { "util.promisify": "^1.0.0" @@ -12721,23 +13645,23 @@ } }, "request-promise-core": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", - "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", + "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", "dev": true, "requires": { - "lodash": "^4.13.1" + "lodash": "^4.17.11" } }, "request-promise-native": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", - "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", + "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", "dev": true, "requires": { - "request-promise-core": "1.1.1", - "stealthy-require": "^1.1.0", - "tough-cookie": ">=2.3.3" + "request-promise-core": "1.1.2", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" } }, "require-directory": { @@ -12747,9 +13671,9 @@ "dev": true }, "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "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-precompiled": { @@ -12777,9 +13701,9 @@ } }, "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz", + "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -12845,9 +13769,9 @@ } }, "rsvp": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", - "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.4.tgz", + "integrity": "sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA==", "dev": true }, "run-async": { @@ -12888,21 +13812,20 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sane": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-3.1.0.tgz", - "integrity": "sha512-G5GClRRxT1cELXfdAq7UKtUsv8q/ZC5k8lQGmjEm4HcAl3HzBy68iglyNCmw4+0tiXPCBZntslHlRhbnsSws+Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", "dev": true, "requires": { + "@cnakazawa/watch": "^1.0.3", "anymatch": "^2.0.0", - "capture-exit": "^1.2.0", - "exec-sh": "^0.2.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", "execa": "^1.0.0", "fb-watchman": "^2.0.0", - "fsevents": "^1.2.3", "micromatch": "^3.1.4", "minimist": "^1.1.1", - "walker": "~1.0.5", - "watch": "~0.18.0" + "walker": "~1.0.5" }, "dependencies": { "anymatch": { @@ -13227,9 +14150,9 @@ } }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true } } @@ -14047,15 +14970,15 @@ } }, "test-exclude": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.1.0.tgz", - "integrity": "sha512-gwf0S2fFsANC55fSeSqpb8BYk6w3FDvwZxfNjeF6FRgvFa43r+7wRiA/Q0IxoRU37wB/LE8IQ4221BsNucTaCA==", + "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": { - "arrify": "^1.0.1", + "glob": "^7.1.3", "minimatch": "^3.0.4", "read-pkg-up": "^4.0.0", - "require-main-filename": "^1.0.1" + "require-main-filename": "^2.0.0" }, "dependencies": { "find-up": { @@ -14067,6 +14990,20 @@ "locate-path": "^3.0.0" } }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -14090,9 +15027,9 @@ } }, "p-limit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", - "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", + "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" @@ -14328,6 +15265,21 @@ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, + "ts-nkeys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/ts-nkeys/-/ts-nkeys-1.0.12.tgz", + "integrity": "sha512-5TgA+wbfxTy/9pdSuAhvneuL65KKoI7phonzNQH2UhnorAQAWehUwHNLEuli596wu/Fxh0SAhMeKZVLNx4s7Ow==", + "requires": { + "tweetnacl": "^1.0.1" + }, + "dependencies": { + "tweetnacl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.1.tgz", + "integrity": "sha512-kcoMoKTPYnoeS50tzoqjPY3Uv9axeuuFAZY9M/9zFnhoVvRfxz9K29IMPD7jGmt2c8SW7i3gT9WqDl2+nV7p4A==" + } + } + }, "tslib": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", @@ -14373,13 +15325,13 @@ } }, "uglify-js": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", - "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.12.tgz", + "integrity": "sha512-KeQesOpPiZNgVwJj8Ge3P4JYbQHUdZzpx6Fahy6eKAYRSV4zhVmLXoC+JtOeYxcHCHTve8RG1ZGdTvpeOUM26Q==", "dev": true, "optional": true, "requires": { - "commander": "~2.17.1", + "commander": "~2.20.0", "source-map": "~0.6.1" }, "dependencies": { @@ -14686,24 +15638,6 @@ "makeerror": "1.0.x" } }, - "watch": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", - "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", - "dev": true, - "requires": { - "exec-sh": "^0.2.0", - "minimist": "^1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", @@ -15065,9 +15999,9 @@ } }, "p-limit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", - "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", + "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" @@ -15081,6 +16015,12 @@ "requires": { "p-limit": "^2.0.0" } + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true } } }, @@ -15095,9 +16035,9 @@ }, "dependencies": { "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true } } diff --git a/services/oodikone2-backend/package.json b/services/backend/oodikone2-backend/package.json similarity index 98% rename from services/oodikone2-backend/package.json rename to services/backend/oodikone2-backend/package.json index 260ba46b75..2e1abfbecb 100644 --- a/services/oodikone2-backend/package.json +++ b/services/backend/oodikone2-backend/package.json @@ -50,6 +50,7 @@ "mkdirp": "^0.5.1", "moment": "^2.22.2", "morgan": "^1.9.1", + "node-nats-streaming": "^0.2.2", "nodemailer": "^4.7.0", "pg": "^7.7.1", "raven": "^2.6.3", diff --git a/services/oodikone2-backend/requests/courses_yearly.rest b/services/backend/oodikone2-backend/requests/courses_yearly.rest similarity index 100% rename from services/oodikone2-backend/requests/courses_yearly.rest rename to services/backend/oodikone2-backend/requests/courses_yearly.rest diff --git a/services/oodikone2-backend/requests/get_all_duplicate_codes.rest b/services/backend/oodikone2-backend/requests/get_all_duplicate_codes.rest similarity index 100% rename from services/oodikone2-backend/requests/get_all_duplicate_codes.rest rename to services/backend/oodikone2-backend/requests/get_all_duplicate_codes.rest diff --git a/services/oodikone2-backend/requests/get_duplicate_codes.rest b/services/backend/oodikone2-backend/requests/get_duplicate_codes.rest similarity index 100% rename from services/oodikone2-backend/requests/get_duplicate_codes.rest rename to services/backend/oodikone2-backend/requests/get_duplicate_codes.rest diff --git a/services/oodikone2-backend/requests/get_mandatory_courses.rest b/services/backend/oodikone2-backend/requests/get_mandatory_courses.rest similarity index 100% rename from services/oodikone2-backend/requests/get_mandatory_courses.rest rename to services/backend/oodikone2-backend/requests/get_mandatory_courses.rest diff --git a/services/oodikone2-backend/requests/get_student.rest b/services/backend/oodikone2-backend/requests/get_student.rest similarity index 100% rename from services/oodikone2-backend/requests/get_student.rest rename to services/backend/oodikone2-backend/requests/get_student.rest diff --git a/services/oodikone2-backend/requests/login.rest b/services/backend/oodikone2-backend/requests/login.rest similarity index 100% rename from services/oodikone2-backend/requests/login.rest rename to services/backend/oodikone2-backend/requests/login.rest diff --git a/services/oodikone2-backend/requests/population_statistics.rest b/services/backend/oodikone2-backend/requests/population_statistics.rest similarity index 100% rename from services/oodikone2-backend/requests/population_statistics.rest rename to services/backend/oodikone2-backend/requests/population_statistics.rest diff --git a/services/oodikone2-backend/requests/post_duplicate_codes.rest b/services/backend/oodikone2-backend/requests/post_duplicate_codes.rest similarity index 100% rename from services/oodikone2-backend/requests/post_duplicate_codes.rest rename to services/backend/oodikone2-backend/requests/post_duplicate_codes.rest diff --git a/services/oodikone2-backend/requests/remove_duplicate_code.rest b/services/backend/oodikone2-backend/requests/remove_duplicate_code.rest similarity index 100% rename from services/oodikone2-backend/requests/remove_duplicate_code.rest rename to services/backend/oodikone2-backend/requests/remove_duplicate_code.rest diff --git a/services/oodikone2-backend/requests/update.rest b/services/backend/oodikone2-backend/requests/update.rest similarity index 100% rename from services/oodikone2-backend/requests/update.rest rename to services/backend/oodikone2-backend/requests/update.rest diff --git a/services/oodikone2-backend/rest/newUser.rest b/services/backend/oodikone2-backend/rest/newUser.rest similarity index 100% rename from services/oodikone2-backend/rest/newUser.rest rename to services/backend/oodikone2-backend/rest/newUser.rest diff --git a/services/oodikone2-backend/scripts/create_course_groups_kayttis.js b/services/backend/oodikone2-backend/scripts/create_course_groups_kayttis.js similarity index 100% rename from services/oodikone2-backend/scripts/create_course_groups_kayttis.js rename to services/backend/oodikone2-backend/scripts/create_course_groups_kayttis.js diff --git a/services/oodikone2-backend/scripts/create_defa_report.js b/services/backend/oodikone2-backend/scripts/create_defa_report.js similarity index 100% rename from services/oodikone2-backend/scripts/create_defa_report.js rename to services/backend/oodikone2-backend/scripts/create_defa_report.js diff --git a/services/oodikone2-backend/scripts/force_sync_database.js b/services/backend/oodikone2-backend/scripts/force_sync_database.js similarity index 100% rename from services/oodikone2-backend/scripts/force_sync_database.js rename to services/backend/oodikone2-backend/scripts/force_sync_database.js diff --git a/services/oodikone2-backend/scripts/refresh_studyright_associations.js b/services/backend/oodikone2-backend/scripts/refresh_studyright_associations.js similarity index 100% rename from services/oodikone2-backend/scripts/refresh_studyright_associations.js rename to services/backend/oodikone2-backend/scripts/refresh_studyright_associations.js diff --git a/services/oodikone2-backend/scripts/seed_migrations.js b/services/backend/oodikone2-backend/scripts/seed_migrations.js similarity index 100% rename from services/oodikone2-backend/scripts/seed_migrations.js rename to services/backend/oodikone2-backend/scripts/seed_migrations.js diff --git a/services/oodikone2-backend/scripts/update_max_attainment_dates.js b/services/backend/oodikone2-backend/scripts/update_max_attainment_dates.js similarity index 100% rename from services/oodikone2-backend/scripts/update_max_attainment_dates.js rename to services/backend/oodikone2-backend/scripts/update_max_attainment_dates.js diff --git a/services/oodikone2-backend/scripts/update_students_not_modified_since.js b/services/backend/oodikone2-backend/scripts/update_students_not_modified_since.js similarity index 100% rename from services/oodikone2-backend/scripts/update_students_not_modified_since.js rename to services/backend/oodikone2-backend/scripts/update_students_not_modified_since.js diff --git a/services/oodikone2-backend/scripts/update_top_teachers.js b/services/backend/oodikone2-backend/scripts/update_top_teachers.js similarity index 100% rename from services/oodikone2-backend/scripts/update_top_teachers.js rename to services/backend/oodikone2-backend/scripts/update_top_teachers.js diff --git a/services/oodikone2-backend/src/anonymizer/anonDisciplines.js b/services/backend/oodikone2-backend/src/anonymizer/anonDisciplines.js similarity index 100% rename from services/oodikone2-backend/src/anonymizer/anonDisciplines.js rename to services/backend/oodikone2-backend/src/anonymizer/anonDisciplines.js diff --git a/services/oodikone2-backend/src/anonymizer/anonStudyRights.js b/services/backend/oodikone2-backend/src/anonymizer/anonStudyRights.js similarity index 100% rename from services/oodikone2-backend/src/anonymizer/anonStudyRights.js rename to services/backend/oodikone2-backend/src/anonymizer/anonStudyRights.js diff --git a/services/oodikone2-backend/src/anonymizer/anon_oodi_interface.js b/services/backend/oodikone2-backend/src/anonymizer/anon_oodi_interface.js similarity index 100% rename from services/oodikone2-backend/src/anonymizer/anon_oodi_interface.js rename to services/backend/oodikone2-backend/src/anonymizer/anon_oodi_interface.js diff --git a/services/oodikone2-backend/src/anonymizer/anonymizer.js b/services/backend/oodikone2-backend/src/anonymizer/anonymizer.js similarity index 100% rename from services/oodikone2-backend/src/anonymizer/anonymizer.js rename to services/backend/oodikone2-backend/src/anonymizer/anonymizer.js diff --git a/services/oodikone2-backend/src/app.js b/services/backend/oodikone2-backend/src/app.js similarity index 94% rename from services/oodikone2-backend/src/app.js rename to services/backend/oodikone2-backend/src/app.js index 002d8a64d0..4fc6abfeca 100644 --- a/services/oodikone2-backend/src/app.js +++ b/services/backend/oodikone2-backend/src/app.js @@ -4,9 +4,12 @@ const bodyParser = require('body-parser') const Raven = require('raven') const conf = require('./conf-backend') const routes = require('./routes') +const { StartNats } = require('./events') const { PORT } = conf const app = express() +StartNats() + Raven.config(process.env.SENTRY_ADDR, { captureUnhandledRejections: true }).install() app.use(cors({ credentials: true, origin: conf.frontend_addr })) diff --git a/services/oodikone2-backend/src/conf-backend.js b/services/backend/oodikone2-backend/src/conf-backend.js similarity index 100% rename from services/oodikone2-backend/src/conf-backend.js rename to services/backend/oodikone2-backend/src/conf-backend.js diff --git a/services/oodikone2-backend/src/database/connection.js b/services/backend/oodikone2-backend/src/database/connection.js similarity index 100% rename from services/oodikone2-backend/src/database/connection.js rename to services/backend/oodikone2-backend/src/database/connection.js diff --git a/services/oodikone2-backend/src/database/seed_migrations.js b/services/backend/oodikone2-backend/src/database/seed_migrations.js similarity index 100% rename from services/oodikone2-backend/src/database/seed_migrations.js rename to services/backend/oodikone2-backend/src/database/seed_migrations.js diff --git a/services/backend/oodikone2-backend/src/events.js b/services/backend/oodikone2-backend/src/events.js new file mode 100644 index 0000000000..949333574f --- /dev/null +++ b/services/backend/oodikone2-backend/src/events.js @@ -0,0 +1,116 @@ +var stan = require('node-nats-streaming').connect( + 'updaterNATS', + process.env.HOSTNAME, + process.env.NATS_URI +) + +const { refreshAssociationsInRedis } = require('./services/studyrights') +const { getAllProgrammes } = require('./services/studyrights') +const { productivityStatsForStudytrack, throughputStatsForStudytrack } = require('./services/studytrack') +const { setProductivity, setThroughput, patchProductivity, patchThroughput } = require('./services/analyticsService') + +const taskStatuses = { } +const handleMessage = (asyncHandlerFunction) => async (msg) => { + if (taskStatuses[msg.getSubject()]) + return + stan.publish('status', msg.getSubject()+'_'+msg.getData()+':RECEIVED', (err) => { + if(err) { + console.log('publish failed', err) + } + }) + taskStatuses[msg.getSubject()] = true + const success = await asyncHandlerFunction(msg) + taskStatuses[msg.getSubject()] = false + stan.publish('status', msg.getSubject()+'_'+msg.getData()+(success ? ':DONE' : ':ERRORED'), (err) => { + if(err) { + console.log('publish failed', err) + } + }) + msg.ack() +} + +const StartNats = () => { + console.log(`STARTING WITH ${process.env.HOSTNAME} as id`) + var opts = stan.subscriptionOptions() + opts.setManualAckMode(true) + // opts.setAckWait(6*60*60*1000) + // opts.setDeliverAllAvailable() + // opts.setDurableName('durable') + opts.setMaxInFlight(1) + stan.on('connect', async function() { + stan.subscribe('RefreshStudyrightAssociations', opts).on('message', handleMessage(async () => { + try { + await refreshAssociationsInRedis() + } catch (e) { + console.error(e) + return false + } + return true + })) + stan.subscribe('RefreshOverview', opts).on('message', handleMessage(async () => { + try { + console.log('RefreshOverview starting') + const codes = (await getAllProgrammes()).map(p => p.code) + + let ready = 0 + for(const code of codes) { + try { + await patchThroughput({ [code]: { status: 'RECALCULATING' } }) + const since = new Date().getFullYear() - 5 + const data = await throughputStatsForStudytrack( + code, + since + ) + await setThroughput( + data + ) + } catch (e) { + try { + await patchThroughput({ [code]: { status: 'RECALCULATION ERRORED' } }) + } catch (e) { + console.error( + e + ) + } + console.log( + `Failed to update throughput stats for code: ${code}, reason: ${ + e.message + }` + ) + } + try { + await patchProductivity({ [code]: { status: 'RECALCULATING' } }) + const since = '2017-08-01' + const data = await productivityStatsForStudytrack(code, since) + await setProductivity(data) + + } catch (e) { + try { + await patchProductivity({ + [code]: { status: 'RECALCULATION ERRORED' } + }) + } catch (e) { + console.error(e) + } + console.log(`Failed to update productivity stats for code: ${code}, reason: ${e.message}`) + } + ready += 1 + console.log( + `RefreshOverview ${ready}/${ + codes.length + } done` + ) + } + } catch (e) { + console.error(e) + return false + } + return true + })) + }) + return stan +} + +module.exports = { + StartNats +} diff --git a/services/oodikone2-backend/src/middleware/accesslogger.js b/services/backend/oodikone2-backend/src/middleware/accesslogger.js similarity index 100% rename from services/oodikone2-backend/src/middleware/accesslogger.js rename to services/backend/oodikone2-backend/src/middleware/accesslogger.js diff --git a/services/oodikone2-backend/src/middleware/auth.js b/services/backend/oodikone2-backend/src/middleware/auth.js similarity index 100% rename from services/oodikone2-backend/src/middleware/auth.js rename to services/backend/oodikone2-backend/src/middleware/auth.js diff --git a/services/oodikone2-backend/src/routes.js b/services/backend/oodikone2-backend/src/routes.js similarity index 100% rename from services/oodikone2-backend/src/routes.js rename to services/backend/oodikone2-backend/src/routes.js diff --git a/services/oodikone2-backend/src/routes/courseGroups.js b/services/backend/oodikone2-backend/src/routes/courseGroups.js similarity index 100% rename from services/oodikone2-backend/src/routes/courseGroups.js rename to services/backend/oodikone2-backend/src/routes/courseGroups.js diff --git a/services/oodikone2-backend/src/routes/courses.js b/services/backend/oodikone2-backend/src/routes/courses.js similarity index 100% rename from services/oodikone2-backend/src/routes/courses.js rename to services/backend/oodikone2-backend/src/routes/courses.js diff --git a/services/oodikone2-backend/src/routes/elementdetails.js b/services/backend/oodikone2-backend/src/routes/elementdetails.js similarity index 91% rename from services/oodikone2-backend/src/routes/elementdetails.js rename to services/backend/oodikone2-backend/src/routes/elementdetails.js index 3356c80390..b4545ac281 100644 --- a/services/oodikone2-backend/src/routes/elementdetails.js +++ b/services/backend/oodikone2-backend/src/routes/elementdetails.js @@ -46,13 +46,13 @@ router.get('/v2/studyprogrammes/:id/productivity', async (req, res) => { if (!data) { try { const since = '2017-08-01' - data = await productivityStatsForStudytrack(code, since) - setProductivity(data) + const stats = await productivityStatsForStudytrack(code, since) + data = await setProductivity(stats) } catch (e) { console.error(e) } } - return res.json({ ...data }) + return res.json(data) } else { res.status(422) } @@ -110,8 +110,8 @@ router.get('/v2/studyprogrammes/:id/throughput', async (req, res) => { if (!data) { try { const since = req.params.since ? req.params.since : new Date().getFullYear() - 5 - data = await throughputStatsForStudytrack(req.params.id, since) - setThroughput(data) + const result = await throughputStatsForStudytrack(req.params.id, since) + data = await setThroughput(result) } catch (e) { console.error(e) } @@ -128,10 +128,8 @@ router.get('/v2/studyprogrammes/throughput/recalculate', async (req, res) => { console.log('Throughput stats recalculation starting') const codes = code ? [code] : (await getAllProgrammes()).map(p => p.code) try { - await patchThroughput(codes.reduce((acc, c) => { - acc[c] = { status: 'RECALCULATING' } - return acc - }, {})) + const data = codes.reduce((acc, id) => ({ ...acc, [id]: { status: 'RECALCULATING' }}), {}) + await patchThroughput(data) res.status(200).end() } catch (e) { console.error(e) @@ -146,9 +144,7 @@ router.get('/v2/studyprogrammes/throughput/recalculate', async (req, res) => { await setThroughput(data) } catch (e) { try { - await patchThroughput({ - [code]: { status: 'RECALCULATION ERRORED' } - }) + await patchThroughput({ [code]: { status: 'RECALCULATION ERRORED' }}) } catch (e) { console.error(e) return diff --git a/services/oodikone2-backend/src/routes/language.js b/services/backend/oodikone2-backend/src/routes/language.js similarity index 100% rename from services/oodikone2-backend/src/routes/language.js rename to services/backend/oodikone2-backend/src/routes/language.js diff --git a/services/oodikone2-backend/src/routes/log.js b/services/backend/oodikone2-backend/src/routes/log.js similarity index 100% rename from services/oodikone2-backend/src/routes/log.js rename to services/backend/oodikone2-backend/src/routes/log.js diff --git a/services/oodikone2-backend/src/routes/login.js b/services/backend/oodikone2-backend/src/routes/login.js similarity index 100% rename from services/oodikone2-backend/src/routes/login.js rename to services/backend/oodikone2-backend/src/routes/login.js diff --git a/services/oodikone2-backend/src/routes/mandatorycourses.js b/services/backend/oodikone2-backend/src/routes/mandatorycourses.js similarity index 100% rename from services/oodikone2-backend/src/routes/mandatorycourses.js rename to services/backend/oodikone2-backend/src/routes/mandatorycourses.js diff --git a/services/oodikone2-backend/src/routes/oodi.js b/services/backend/oodikone2-backend/src/routes/oodi.js similarity index 100% rename from services/oodikone2-backend/src/routes/oodi.js rename to services/backend/oodikone2-backend/src/routes/oodi.js diff --git a/services/oodikone2-backend/src/routes/oodilearn.js b/services/backend/oodikone2-backend/src/routes/oodilearn.js similarity index 100% rename from services/oodikone2-backend/src/routes/oodilearn.js rename to services/backend/oodikone2-backend/src/routes/oodilearn.js diff --git a/services/oodikone2-backend/src/routes/ping.js b/services/backend/oodikone2-backend/src/routes/ping.js similarity index 100% rename from services/oodikone2-backend/src/routes/ping.js rename to services/backend/oodikone2-backend/src/routes/ping.js diff --git a/services/oodikone2-backend/src/routes/population.js b/services/backend/oodikone2-backend/src/routes/population.js similarity index 100% rename from services/oodikone2-backend/src/routes/population.js rename to services/backend/oodikone2-backend/src/routes/population.js diff --git a/services/oodikone2-backend/src/routes/providers.js b/services/backend/oodikone2-backend/src/routes/providers.js similarity index 100% rename from services/oodikone2-backend/src/routes/providers.js rename to services/backend/oodikone2-backend/src/routes/providers.js diff --git a/services/oodikone2-backend/src/routes/router.js b/services/backend/oodikone2-backend/src/routes/router.js similarity index 100% rename from services/oodikone2-backend/src/routes/router.js rename to services/backend/oodikone2-backend/src/routes/router.js diff --git a/services/oodikone2-backend/src/routes/semesters.js b/services/backend/oodikone2-backend/src/routes/semesters.js similarity index 100% rename from services/oodikone2-backend/src/routes/semesters.js rename to services/backend/oodikone2-backend/src/routes/semesters.js diff --git a/services/oodikone2-backend/src/routes/students.js b/services/backend/oodikone2-backend/src/routes/students.js similarity index 100% rename from services/oodikone2-backend/src/routes/students.js rename to services/backend/oodikone2-backend/src/routes/students.js diff --git a/services/oodikone2-backend/src/routes/tasks.js b/services/backend/oodikone2-backend/src/routes/tasks.js similarity index 100% rename from services/oodikone2-backend/src/routes/tasks.js rename to services/backend/oodikone2-backend/src/routes/tasks.js diff --git a/services/oodikone2-backend/src/routes/teachers.js b/services/backend/oodikone2-backend/src/routes/teachers.js similarity index 100% rename from services/oodikone2-backend/src/routes/teachers.js rename to services/backend/oodikone2-backend/src/routes/teachers.js diff --git a/services/oodikone2-backend/src/routes/usage.js b/services/backend/oodikone2-backend/src/routes/usage.js similarity index 100% rename from services/oodikone2-backend/src/routes/usage.js rename to services/backend/oodikone2-backend/src/routes/usage.js diff --git a/services/oodikone2-backend/src/routes/users.js b/services/backend/oodikone2-backend/src/routes/users.js similarity index 100% rename from services/oodikone2-backend/src/routes/users.js rename to services/backend/oodikone2-backend/src/routes/users.js diff --git a/services/oodikone2-backend/src/services/.DS_Store b/services/backend/oodikone2-backend/src/services/.DS_Store similarity index 100% rename from services/oodikone2-backend/src/services/.DS_Store rename to services/backend/oodikone2-backend/src/services/.DS_Store diff --git a/services/oodikone2-backend/src/services/analyticsService.js b/services/backend/oodikone2-backend/src/services/analyticsService.js similarity index 100% rename from services/oodikone2-backend/src/services/analyticsService.js rename to services/backend/oodikone2-backend/src/services/analyticsService.js diff --git a/services/oodikone2-backend/src/services/blacklist.js b/services/backend/oodikone2-backend/src/services/blacklist.js similarity index 100% rename from services/oodikone2-backend/src/services/blacklist.js rename to services/backend/oodikone2-backend/src/services/blacklist.js diff --git a/services/oodikone2-backend/src/services/courseGroups.js b/services/backend/oodikone2-backend/src/services/courseGroups.js similarity index 100% rename from services/oodikone2-backend/src/services/courseGroups.js rename to services/backend/oodikone2-backend/src/services/courseGroups.js diff --git a/services/oodikone2-backend/src/services/course_stats_counter.js b/services/backend/oodikone2-backend/src/services/course_stats_counter.js similarity index 100% rename from services/oodikone2-backend/src/services/course_stats_counter.js rename to services/backend/oodikone2-backend/src/services/course_stats_counter.js diff --git a/services/oodikone2-backend/src/services/course_stats_counter.test.js b/services/backend/oodikone2-backend/src/services/course_stats_counter.test.js similarity index 100% rename from services/oodikone2-backend/src/services/course_stats_counter.test.js rename to services/backend/oodikone2-backend/src/services/course_stats_counter.test.js diff --git a/services/oodikone2-backend/src/services/course_yearly_stats_counter.js b/services/backend/oodikone2-backend/src/services/course_yearly_stats_counter.js similarity index 100% rename from services/oodikone2-backend/src/services/course_yearly_stats_counter.js rename to services/backend/oodikone2-backend/src/services/course_yearly_stats_counter.js diff --git a/services/oodikone2-backend/src/services/course_yearly_stats_counter.test.js b/services/backend/oodikone2-backend/src/services/course_yearly_stats_counter.test.js similarity index 100% rename from services/oodikone2-backend/src/services/course_yearly_stats_counter.test.js rename to services/backend/oodikone2-backend/src/services/course_yearly_stats_counter.test.js diff --git a/services/oodikone2-backend/src/services/courses.js b/services/backend/oodikone2-backend/src/services/courses.js similarity index 97% rename from services/oodikone2-backend/src/services/courses.js rename to services/backend/oodikone2-backend/src/services/courses.js index dab294bbe5..2d8b3a84dd 100644 --- a/services/oodikone2-backend/src/services/courses.js +++ b/services/backend/oodikone2-backend/src/services/courses.js @@ -327,7 +327,7 @@ const yearlyStatsOf = async (code, year, separate, language) => { }, resultProgrammes) const alternatives = await getDuplicateCodes(code) - const codes = alternatives ? [code, ...Object.keys(alternatives.alt)] : [code] + const codes = alternatives ? alternatives : [code] const allInstances = await creditsOf(codes) const yearInst = allInstances .filter(inst => moment(new Date(inst.date)).isBetween(year.start + '-09-01', year.end + '-08-01')) @@ -403,11 +403,22 @@ const getMainCodes = () => { } const deleteDuplicateCode = async (code) => { - await CourseDuplicates.destroy({ - where: { - coursecode: code - } - }) + try { + await CourseDuplicates.destroy({ + where: { + coursecode: code + } + }) + await sequelize.query( + `DELETE FROM course_duplicates + WHERE groupid in ( SELECT groupid FROM course_duplicates + group by groupid + having count(*) = 1)`, + { type: sequelize.QueryTypes.BULKDELETE } + ) + } catch (e) { + console.error(e) + } } const getDuplicateCodesWithCourses = () => { @@ -558,7 +569,7 @@ const getAllDisciplines = () => Discipline.findAll() const alternativeCodes = async code => { const alternatives = await getDuplicateCodes(code) - return alternatives ? [code, ...Object.keys(alternatives.alt)] : [code] + return alternatives ? alternatives : [code] } const formatStudyrightElement = ({ code, element_detail }) => ({ diff --git a/services/oodikone2-backend/src/services/doo_api_database_updater/database_updater.js b/services/backend/oodikone2-backend/src/services/doo_api_database_updater/database_updater.js similarity index 100% rename from services/oodikone2-backend/src/services/doo_api_database_updater/database_updater.js rename to services/backend/oodikone2-backend/src/services/doo_api_database_updater/database_updater.js diff --git a/services/oodikone2-backend/src/services/doo_api_database_updater/database_updater.test.js b/services/backend/oodikone2-backend/src/services/doo_api_database_updater/database_updater.test.js similarity index 100% rename from services/oodikone2-backend/src/services/doo_api_database_updater/database_updater.test.js rename to services/backend/oodikone2-backend/src/services/doo_api_database_updater/database_updater.test.js diff --git a/services/oodikone2-backend/src/services/doo_api_database_updater/database_updater.test.sql b/services/backend/oodikone2-backend/src/services/doo_api_database_updater/database_updater.test.sql similarity index 100% rename from services/oodikone2-backend/src/services/doo_api_database_updater/database_updater.test.sql rename to services/backend/oodikone2-backend/src/services/doo_api_database_updater/database_updater.test.sql diff --git a/services/oodikone2-backend/src/services/doo_api_database_updater/db_studentnumbers_to_file.js b/services/backend/oodikone2-backend/src/services/doo_api_database_updater/db_studentnumbers_to_file.js similarity index 100% rename from services/oodikone2-backend/src/services/doo_api_database_updater/db_studentnumbers_to_file.js rename to services/backend/oodikone2-backend/src/services/doo_api_database_updater/db_studentnumbers_to_file.js diff --git a/services/oodikone2-backend/src/services/doo_api_database_updater/oodi_data_mapper.js b/services/backend/oodikone2-backend/src/services/doo_api_database_updater/oodi_data_mapper.js similarity index 100% rename from services/oodikone2-backend/src/services/doo_api_database_updater/oodi_data_mapper.js rename to services/backend/oodikone2-backend/src/services/doo_api_database_updater/oodi_data_mapper.js diff --git a/services/oodikone2-backend/src/services/doo_api_database_updater/oodi_data_mapper.test.js b/services/backend/oodikone2-backend/src/services/doo_api_database_updater/oodi_data_mapper.test.js similarity index 100% rename from services/oodikone2-backend/src/services/doo_api_database_updater/oodi_data_mapper.test.js rename to services/backend/oodikone2-backend/src/services/doo_api_database_updater/oodi_data_mapper.test.js diff --git a/services/oodikone2-backend/src/services/doo_api_database_updater/oodi_interface.js b/services/backend/oodikone2-backend/src/services/doo_api_database_updater/oodi_interface.js similarity index 100% rename from services/oodikone2-backend/src/services/doo_api_database_updater/oodi_interface.js rename to services/backend/oodikone2-backend/src/services/doo_api_database_updater/oodi_interface.js diff --git a/services/oodikone2-backend/src/services/doo_api_database_updater/run_updater.js b/services/backend/oodikone2-backend/src/services/doo_api_database_updater/run_updater.js similarity index 100% rename from services/oodikone2-backend/src/services/doo_api_database_updater/run_updater.js rename to services/backend/oodikone2-backend/src/services/doo_api_database_updater/run_updater.js diff --git a/services/oodikone2-backend/src/services/doo_api_database_updater/student_list_updater.js b/services/backend/oodikone2-backend/src/services/doo_api_database_updater/student_list_updater.js similarity index 100% rename from services/oodikone2-backend/src/services/doo_api_database_updater/student_list_updater.js rename to services/backend/oodikone2-backend/src/services/doo_api_database_updater/student_list_updater.js diff --git a/services/oodikone2-backend/src/services/doo_api_database_updater/update_attainment_dates.js b/services/backend/oodikone2-backend/src/services/doo_api_database_updater/update_attainment_dates.js similarity index 100% rename from services/oodikone2-backend/src/services/doo_api_database_updater/update_attainment_dates.js rename to services/backend/oodikone2-backend/src/services/doo_api_database_updater/update_attainment_dates.js diff --git a/services/oodikone2-backend/src/services/elementdetails.js b/services/backend/oodikone2-backend/src/services/elementdetails.js similarity index 100% rename from services/oodikone2-backend/src/services/elementdetails.js rename to services/backend/oodikone2-backend/src/services/elementdetails.js diff --git a/services/oodikone2-backend/src/services/filters.js b/services/backend/oodikone2-backend/src/services/filters.js similarity index 100% rename from services/oodikone2-backend/src/services/filters.js rename to services/backend/oodikone2-backend/src/services/filters.js diff --git a/services/oodikone2-backend/src/services/mailservice.js b/services/backend/oodikone2-backend/src/services/mailservice.js similarity index 100% rename from services/oodikone2-backend/src/services/mailservice.js rename to services/backend/oodikone2-backend/src/services/mailservice.js diff --git a/services/oodikone2-backend/src/services/mandatoryCourses.js b/services/backend/oodikone2-backend/src/services/mandatoryCourses.js similarity index 100% rename from services/oodikone2-backend/src/services/mandatoryCourses.js rename to services/backend/oodikone2-backend/src/services/mandatoryCourses.js diff --git a/services/oodikone2-backend/src/services/oodilearn.js b/services/backend/oodikone2-backend/src/services/oodilearn.js similarity index 100% rename from services/oodikone2-backend/src/services/oodilearn.js rename to services/backend/oodikone2-backend/src/services/oodilearn.js diff --git a/services/oodikone2-backend/src/services/oodilearn_interface.js b/services/backend/oodikone2-backend/src/services/oodilearn_interface.js similarity index 100% rename from services/oodikone2-backend/src/services/oodilearn_interface.js rename to services/backend/oodikone2-backend/src/services/oodilearn_interface.js diff --git a/services/oodikone2-backend/src/services/organisations.js b/services/backend/oodikone2-backend/src/services/organisations.js similarity index 100% rename from services/oodikone2-backend/src/services/organisations.js rename to services/backend/oodikone2-backend/src/services/organisations.js diff --git a/services/oodikone2-backend/src/services/populations.js b/services/backend/oodikone2-backend/src/services/populations.js similarity index 100% rename from services/oodikone2-backend/src/services/populations.js rename to services/backend/oodikone2-backend/src/services/populations.js diff --git a/services/oodikone2-backend/src/services/providers.js b/services/backend/oodikone2-backend/src/services/providers.js similarity index 100% rename from services/oodikone2-backend/src/services/providers.js rename to services/backend/oodikone2-backend/src/services/providers.js diff --git a/services/oodikone2-backend/src/services/redis.js b/services/backend/oodikone2-backend/src/services/redis.js similarity index 100% rename from services/oodikone2-backend/src/services/redis.js rename to services/backend/oodikone2-backend/src/services/redis.js diff --git a/services/oodikone2-backend/src/services/semesters.js b/services/backend/oodikone2-backend/src/services/semesters.js similarity index 100% rename from services/oodikone2-backend/src/services/semesters.js rename to services/backend/oodikone2-backend/src/services/semesters.js diff --git a/services/oodikone2-backend/src/services/students.js b/services/backend/oodikone2-backend/src/services/students.js similarity index 100% rename from services/oodikone2-backend/src/services/students.js rename to services/backend/oodikone2-backend/src/services/students.js diff --git a/services/oodikone2-backend/src/services/studyrights.js b/services/backend/oodikone2-backend/src/services/studyrights.js similarity index 100% rename from services/oodikone2-backend/src/services/studyrights.js rename to services/backend/oodikone2-backend/src/services/studyrights.js diff --git a/services/oodikone2-backend/src/services/studytrack.js b/services/backend/oodikone2-backend/src/services/studytrack.js similarity index 97% rename from services/oodikone2-backend/src/services/studytrack.js rename to services/backend/oodikone2-backend/src/services/studytrack.js index 3dc4e64e03..633e1fc977 100644 --- a/services/oodikone2-backend/src/services/studytrack.js +++ b/services/backend/oodikone2-backend/src/services/studytrack.js @@ -170,11 +170,9 @@ const productivityStatsForStudytrack = async (studytrack, since) => { promises ) return { - [studytrack]: { - lastUpdated: moment(), - status: null, - data: combineStatistics(creditStats, studyrightStats, thesisStats) - } + id: studytrack, + status: null, + data: combineStatistics(creditStats, studyrightStats, thesisStats) } } @@ -285,7 +283,7 @@ const throughputStatsForStudytrack = async (studytrack, since) => { thesisB: theses.BACHELOR || 0 } })) - return { [studytrack]: { lastUpdated: moment(), status: null, data: arr } } + return { id: studytrack, status: null, data: arr } } module.exports = { diff --git a/services/oodikone2-backend/src/services/studytrack.test.js b/services/backend/oodikone2-backend/src/services/studytrack.test.js similarity index 98% rename from services/oodikone2-backend/src/services/studytrack.test.js rename to services/backend/oodikone2-backend/src/services/studytrack.test.js index 5b9436fc3e..24e9a4aa7b 100644 --- a/services/oodikone2-backend/src/services/studytrack.test.js +++ b/services/backend/oodikone2-backend/src/services/studytrack.test.js @@ -170,14 +170,14 @@ test('combineStatistics returns correctly formatted array', () => { test('productivityStatsForStudytrack integrates', async () => { const stats = await productivityStatsForStudytrack(studytrack, '2001-01-01') - expect(stats[studytrack].data).toContainEqual({ + expect(stats.data).toContainEqual({ year: 2015, graduated: 0, bThesis: 0, mThesis: 1, credits: 40 }) - expect(stats[studytrack].data).toContainEqual({ + expect(stats.data).toContainEqual({ year: 2016, graduated: 1, mThesis: 0, diff --git a/services/oodikone2-backend/src/services/studytrack.test.sql b/services/backend/oodikone2-backend/src/services/studytrack.test.sql similarity index 100% rename from services/oodikone2-backend/src/services/studytrack.test.sql rename to services/backend/oodikone2-backend/src/services/studytrack.test.sql diff --git a/services/oodikone2-backend/src/services/tasks.js b/services/backend/oodikone2-backend/src/services/tasks.js similarity index 100% rename from services/oodikone2-backend/src/services/tasks.js rename to services/backend/oodikone2-backend/src/services/tasks.js diff --git a/services/oodikone2-backend/src/services/teachers.js b/services/backend/oodikone2-backend/src/services/teachers.js similarity index 100% rename from services/oodikone2-backend/src/services/teachers.js rename to services/backend/oodikone2-backend/src/services/teachers.js diff --git a/services/oodikone2-backend/src/services/teachers.test.js b/services/backend/oodikone2-backend/src/services/teachers.test.js similarity index 100% rename from services/oodikone2-backend/src/services/teachers.test.js rename to services/backend/oodikone2-backend/src/services/teachers.test.js diff --git a/services/oodikone2-backend/src/services/tester.js b/services/backend/oodikone2-backend/src/services/tester.js similarity index 100% rename from services/oodikone2-backend/src/services/tester.js rename to services/backend/oodikone2-backend/src/services/tester.js diff --git a/services/oodikone2-backend/src/services/thesis.js b/services/backend/oodikone2-backend/src/services/thesis.js similarity index 100% rename from services/oodikone2-backend/src/services/thesis.js rename to services/backend/oodikone2-backend/src/services/thesis.js diff --git a/services/oodikone2-backend/src/services/thesis.test.js b/services/backend/oodikone2-backend/src/services/thesis.test.js similarity index 100% rename from services/oodikone2-backend/src/services/thesis.test.js rename to services/backend/oodikone2-backend/src/services/thesis.test.js diff --git a/services/oodikone2-backend/src/services/topteachers.js b/services/backend/oodikone2-backend/src/services/topteachers.js similarity index 100% rename from services/oodikone2-backend/src/services/topteachers.js rename to services/backend/oodikone2-backend/src/services/topteachers.js diff --git a/services/oodikone2-backend/src/services/units.js b/services/backend/oodikone2-backend/src/services/units.js similarity index 100% rename from services/oodikone2-backend/src/services/units.js rename to services/backend/oodikone2-backend/src/services/units.js diff --git a/services/oodikone2-backend/src/services/usageService.js b/services/backend/oodikone2-backend/src/services/usageService.js similarity index 100% rename from services/oodikone2-backend/src/services/usageService.js rename to services/backend/oodikone2-backend/src/services/usageService.js diff --git a/services/oodikone2-backend/src/services/usageStatistics.js b/services/backend/oodikone2-backend/src/services/usageStatistics.js similarity index 100% rename from services/oodikone2-backend/src/services/usageStatistics.js rename to services/backend/oodikone2-backend/src/services/usageStatistics.js diff --git a/services/oodikone2-backend/src/services/userService.js b/services/backend/oodikone2-backend/src/services/userService.js similarity index 100% rename from services/oodikone2-backend/src/services/userService.js rename to services/backend/oodikone2-backend/src/services/userService.js diff --git a/services/oodikone2-backend/src/util/add_json_duplicates_to_redis.js b/services/backend/oodikone2-backend/src/util/add_json_duplicates_to_redis.js similarity index 100% rename from services/oodikone2-backend/src/util/add_json_duplicates_to_redis.js rename to services/backend/oodikone2-backend/src/util/add_json_duplicates_to_redis.js diff --git a/services/oodikone2-backend/src/util/index.js b/services/backend/oodikone2-backend/src/util/index.js similarity index 100% rename from services/oodikone2-backend/src/util/index.js rename to services/backend/oodikone2-backend/src/util/index.js diff --git a/services/oodikone2-backend/src/util/init_redis.js b/services/backend/oodikone2-backend/src/util/init_redis.js similarity index 100% rename from services/oodikone2-backend/src/util/init_redis.js rename to services/backend/oodikone2-backend/src/util/init_redis.js diff --git a/services/oodikone2-backend/src/util/logSaver.js b/services/backend/oodikone2-backend/src/util/logSaver.js similarity index 100% rename from services/oodikone2-backend/src/util/logSaver.js rename to services/backend/oodikone2-backend/src/util/logSaver.js diff --git a/services/oodikone2-backend/src/util/logger.js b/services/backend/oodikone2-backend/src/util/logger.js similarity index 100% rename from services/oodikone2-backend/src/util/logger.js rename to services/backend/oodikone2-backend/src/util/logger.js diff --git a/services/oodikone2-backend/src/util/map_course_codes.js b/services/backend/oodikone2-backend/src/util/map_course_codes.js similarity index 100% rename from services/oodikone2-backend/src/util/map_course_codes.js rename to services/backend/oodikone2-backend/src/util/map_course_codes.js diff --git a/services/oodikone2-backend/src/util/newToOld.json b/services/backend/oodikone2-backend/src/util/newToOld.json similarity index 100% rename from services/oodikone2-backend/src/util/newToOld.json rename to services/backend/oodikone2-backend/src/util/newToOld.json diff --git a/services/oodikone2-backend/src/util/oldToNew.json b/services/backend/oodikone2-backend/src/util/oldToNew.json similarity index 100% rename from services/oodikone2-backend/src/util/oldToNew.json rename to services/backend/oodikone2-backend/src/util/oldToNew.json diff --git a/services/oodikone2-backend/src/util/semester.js b/services/backend/oodikone2-backend/src/util/semester.js similarity index 100% rename from services/oodikone2-backend/src/util/semester.js rename to services/backend/oodikone2-backend/src/util/semester.js diff --git a/services/oodikone2-backend/src/util/taskpool.js b/services/backend/oodikone2-backend/src/util/taskpool.js similarity index 100% rename from services/oodikone2-backend/src/util/taskpool.js rename to services/backend/oodikone2-backend/src/util/taskpool.js diff --git a/services/oodikone2-backend/src/util/utils.js b/services/backend/oodikone2-backend/src/util/utils.js similarity index 100% rename from services/oodikone2-backend/src/util/utils.js rename to services/backend/oodikone2-backend/src/util/utils.js diff --git a/services/oodikone2-backend/test/endpoint/courses_test.js b/services/backend/oodikone2-backend/test/endpoint/courses_test.js similarity index 100% rename from services/oodikone2-backend/test/endpoint/courses_test.js rename to services/backend/oodikone2-backend/test/endpoint/courses_test.js diff --git a/services/oodikone2-backend/test/endpoint/department_test.js b/services/backend/oodikone2-backend/test/endpoint/department_test.js similarity index 100% rename from services/oodikone2-backend/test/endpoint/department_test.js rename to services/backend/oodikone2-backend/test/endpoint/department_test.js diff --git a/services/oodikone2-backend/test/endpoint/login_test.js b/services/backend/oodikone2-backend/test/endpoint/login_test.js similarity index 100% rename from services/oodikone2-backend/test/endpoint/login_test.js rename to services/backend/oodikone2-backend/test/endpoint/login_test.js diff --git a/services/oodikone2-backend/test/endpoint/student_test.js b/services/backend/oodikone2-backend/test/endpoint/student_test.js similarity index 100% rename from services/oodikone2-backend/test/endpoint/student_test.js rename to services/backend/oodikone2-backend/test/endpoint/student_test.js diff --git a/services/oodikone2-backend/test/endpoint/teacher_test.js b/services/backend/oodikone2-backend/test/endpoint/teacher_test.js similarity index 100% rename from services/oodikone2-backend/test/endpoint/teacher_test.js rename to services/backend/oodikone2-backend/test/endpoint/teacher_test.js diff --git a/services/oodikone2-backend/test/jest/globals.js b/services/backend/oodikone2-backend/test/jest/globals.js similarity index 100% rename from services/oodikone2-backend/test/jest/globals.js rename to services/backend/oodikone2-backend/test/jest/globals.js diff --git a/services/oodikone2-backend/test/jest/services/database_updater.test.js b/services/backend/oodikone2-backend/test/jest/services/database_updater.test.js similarity index 100% rename from services/oodikone2-backend/test/jest/services/database_updater.test.js rename to services/backend/oodikone2-backend/test/jest/services/database_updater.test.js diff --git a/services/oodikone2-backend/test/jest/services/population.test.js b/services/backend/oodikone2-backend/test/jest/services/population.test.js similarity index 100% rename from services/oodikone2-backend/test/jest/services/population.test.js rename to services/backend/oodikone2-backend/test/jest/services/population.test.js diff --git a/services/oodikone2-backend/test/jest/services/test_data.js b/services/backend/oodikone2-backend/test/jest/services/test_data.js similarity index 100% rename from services/oodikone2-backend/test/jest/services/test_data.js rename to services/backend/oodikone2-backend/test/jest/services/test_data.js diff --git a/services/oodikone2-backend/test/jest/utils/semester.test.js b/services/backend/oodikone2-backend/test/jest/utils/semester.test.js similarity index 100% rename from services/oodikone2-backend/test/jest/utils/semester.test.js rename to services/backend/oodikone2-backend/test/jest/utils/semester.test.js diff --git a/services/oodikone2-backend/test/performance/courseYearlyStats.js b/services/backend/oodikone2-backend/test/performance/courseYearlyStats.js similarity index 100% rename from services/oodikone2-backend/test/performance/courseYearlyStats.js rename to services/backend/oodikone2-backend/test/performance/courseYearlyStats.js diff --git a/services/oodikone2-backend/test/performance/stamper.js b/services/backend/oodikone2-backend/test/performance/stamper.js similarity index 100% rename from services/oodikone2-backend/test/performance/stamper.js rename to services/backend/oodikone2-backend/test/performance/stamper.js diff --git a/services/oodikone2-backend/test/supertests/api_spec.js b/services/backend/oodikone2-backend/test/supertests/api_spec.js similarity index 100% rename from services/oodikone2-backend/test/supertests/api_spec.js rename to services/backend/oodikone2-backend/test/supertests/api_spec.js diff --git a/services/oodikone2-backend/test/supertests/course_statistics_spec.js b/services/backend/oodikone2-backend/test/supertests/course_statistics_spec.js similarity index 100% rename from services/oodikone2-backend/test/supertests/course_statistics_spec.js rename to services/backend/oodikone2-backend/test/supertests/course_statistics_spec.js diff --git a/services/oodikone2-backend/test/supertests/population_statistics_spec.js b/services/backend/oodikone2-backend/test/supertests/population_statistics_spec.js similarity index 100% rename from services/oodikone2-backend/test/supertests/population_statistics_spec.js rename to services/backend/oodikone2-backend/test/supertests/population_statistics_spec.js diff --git a/services/oodikone2-backend/test/supertests/teacher_statistics_spec.js b/services/backend/oodikone2-backend/test/supertests/teacher_statistics_spec.js similarity index 100% rename from services/oodikone2-backend/test/supertests/teacher_statistics_spec.js rename to services/backend/oodikone2-backend/test/supertests/teacher_statistics_spec.js diff --git a/services/oodikone2-backend/test/utils.js b/services/backend/oodikone2-backend/test/utils.js similarity index 100% rename from services/oodikone2-backend/test/utils.js rename to services/backend/oodikone2-backend/test/utils.js diff --git a/services/oodikone2-backend/src/database/migrations/20180803_add_language_to_user.js b/services/backend/shared/migrations/20180803_add_language_to_user.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20180803_add_language_to_user.js rename to services/backend/shared/migrations/20180803_add_language_to_user.js diff --git a/services/oodikone2-backend/src/database/migrations/20180807_add_attainment_date_column.js b/services/backend/shared/migrations/20180807_add_attainment_date_column.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20180807_add_attainment_date_column.js rename to services/backend/shared/migrations/20180807_add_attainment_date_column.js diff --git a/services/oodikone2-backend/src/database/migrations/20180808_01_add_credit_ courseinstace_index.js b/services/backend/shared/migrations/20180808_01_add_credit_ courseinstace_index.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20180808_01_add_credit_ courseinstace_index.js rename to services/backend/shared/migrations/20180808_01_add_credit_ courseinstace_index.js diff --git a/services/oodikone2-backend/src/database/migrations/20180808_02_add_credit_course_column.js b/services/backend/shared/migrations/20180808_02_add_credit_course_column.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20180808_02_add_credit_course_column.js rename to services/backend/shared/migrations/20180808_02_add_credit_course_column.js diff --git a/services/oodikone2-backend/src/database/migrations/20180808_03_update_credit_attainment_and_course_values.js b/services/backend/shared/migrations/20180808_03_update_credit_attainment_and_course_values.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20180808_03_update_credit_attainment_and_course_values.js rename to services/backend/shared/migrations/20180808_03_update_credit_attainment_and_course_values.js diff --git a/services/oodikone2-backend/src/database/migrations/20180808_04_add_credit_course_index.js b/services/backend/shared/migrations/20180808_04_add_credit_course_index.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20180808_04_add_credit_course_index.js rename to services/backend/shared/migrations/20180808_04_add_credit_course_index.js diff --git a/services/oodikone2-backend/src/database/migrations/20180903_add_description_to_filters.js b/services/backend/shared/migrations/20180903_add_description_to_filters.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20180903_add_description_to_filters.js rename to services/backend/shared/migrations/20180903_add_description_to_filters.js diff --git a/services/oodikone2-backend/src/database/migrations/20180910_01_add_credit_attainment_date_index.js b/services/backend/shared/migrations/20180910_01_add_credit_attainment_date_index.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20180910_01_add_credit_attainment_date_index.js rename to services/backend/shared/migrations/20180910_01_add_credit_attainment_date_index.js diff --git a/services/oodikone2-backend/src/database/migrations/20180910_02_add_enrollment_studentnumber_index.js b/services/backend/shared/migrations/20180910_02_add_enrollment_studentnumber_index.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20180910_02_add_enrollment_studentnumber_index.js rename to services/backend/shared/migrations/20180910_02_add_enrollment_studentnumber_index.js diff --git a/services/oodikone2-backend/src/database/migrations/20180910_03_add_transfer_studentnumber_index.js b/services/backend/shared/migrations/20180910_03_add_transfer_studentnumber_index.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20180910_03_add_transfer_studentnumber_index.js rename to services/backend/shared/migrations/20180910_03_add_transfer_studentnumber_index.js diff --git a/services/oodikone2-backend/src/database/migrations/20180910_04_add_studyright_studentnumber_index.js b/services/backend/shared/migrations/20180910_04_add_studyright_studentnumber_index.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20180910_04_add_studyright_studentnumber_index.js rename to services/backend/shared/migrations/20180910_04_add_studyright_studentnumber_index.js diff --git a/services/oodikone2-backend/src/database/migrations/20180910_05_drop_courseinstance_columns.js b/services/backend/shared/migrations/20180910_05_drop_courseinstance_columns.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20180910_05_drop_courseinstance_columns.js rename to services/backend/shared/migrations/20180910_05_drop_courseinstance_columns.js diff --git a/services/oodikone2-backend/src/database/migrations/20180910_06_drop_courseinstance_and_teacher_tables.js b/services/backend/shared/migrations/20180910_06_drop_courseinstance_and_teacher_tables.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20180910_06_drop_courseinstance_and_teacher_tables.js rename to services/backend/shared/migrations/20180910_06_drop_courseinstance_and_teacher_tables.js diff --git a/services/oodikone2-backend/src/database/migrations/20180910_07_add_semester_enrollment_date_column.js b/services/backend/shared/migrations/20180910_07_add_semester_enrollment_date_column.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20180910_07_add_semester_enrollment_date_column.js rename to services/backend/shared/migrations/20180910_07_add_semester_enrollment_date_column.js diff --git a/services/oodikone2-backend/src/database/migrations/20180910_08_create_credit_teacher_table.js b/services/backend/shared/migrations/20180910_08_create_credit_teacher_table.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20180910_08_create_credit_teacher_table.js rename to services/backend/shared/migrations/20180910_08_create_credit_teacher_table.js diff --git a/services/oodikone2-backend/src/database/migrations/20180910_09_add_semester_code_fkey_to_credit.js b/services/backend/shared/migrations/20180910_09_add_semester_code_fkey_to_credit.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20180910_09_add_semester_code_fkey_to_credit.js rename to services/backend/shared/migrations/20180910_09_add_semester_code_fkey_to_credit.js diff --git a/services/oodikone2-backend/src/database/migrations/20180910_10_add_year_code_and_name_to_semester.js b/services/backend/shared/migrations/20180910_10_add_year_code_and_name_to_semester.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20180910_10_add_year_code_and_name_to_semester.js rename to services/backend/shared/migrations/20180910_10_add_year_code_and_name_to_semester.js diff --git a/services/oodikone2-backend/src/database/migrations/20180910_11_add_email_to_users.js b/services/backend/shared/migrations/20180910_11_add_email_to_users.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20180910_11_add_email_to_users.js rename to services/backend/shared/migrations/20180910_11_add_email_to_users.js diff --git a/services/oodikone2-backend/src/database/migrations/20180910_12_create_usage_stats_table.js b/services/backend/shared/migrations/20180910_12_create_usage_stats_table.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20180910_12_create_usage_stats_table.js rename to services/backend/shared/migrations/20180910_12_create_usage_stats_table.js diff --git a/services/oodikone2-backend/src/database/migrations/20180921_add_new_role_to_users.js b/services/backend/shared/migrations/20180921_add_new_role_to_users.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20180921_add_new_role_to_users.js rename to services/backend/shared/migrations/20180921_add_new_role_to_users.js diff --git a/services/oodikone2-backend/src/database/migrations/20180924_add_admin_to_database.js b/services/backend/shared/migrations/20180924_add_admin_to_database.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20180924_add_admin_to_database.js rename to services/backend/shared/migrations/20180924_add_admin_to_database.js diff --git a/services/oodikone2-backend/src/database/migrations/20181006_01_add_semester_code_to_missing_credits.js b/services/backend/shared/migrations/20181006_01_add_semester_code_to_missing_credits.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20181006_01_add_semester_code_to_missing_credits.js rename to services/backend/shared/migrations/20181006_01_add_semester_code_to_missing_credits.js diff --git a/services/oodikone2-backend/src/database/migrations/20181006_02_credit_semestercode_notnull.js b/services/backend/shared/migrations/20181006_02_credit_semestercode_notnull.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20181006_02_credit_semestercode_notnull.js rename to services/backend/shared/migrations/20181006_02_credit_semestercode_notnull.js diff --git a/services/oodikone2-backend/src/database/migrations/20181101_remove_duplicate_users.js b/services/backend/shared/migrations/20181101_remove_duplicate_users.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20181101_remove_duplicate_users.js rename to services/backend/shared/migrations/20181101_remove_duplicate_users.js diff --git a/services/oodikone2-backend/src/database/migrations/20181102_unique_username_constraint.js b/services/backend/shared/migrations/20181102_unique_username_constraint.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20181102_unique_username_constraint.js rename to services/backend/shared/migrations/20181102_unique_username_constraint.js diff --git a/services/oodikone2-backend/src/database/migrations/20181128_add_indexes.js b/services/backend/shared/migrations/20181128_add_indexes.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20181128_add_indexes.js rename to services/backend/shared/migrations/20181128_add_indexes.js diff --git a/services/oodikone2-backend/src/database/migrations/20181204_course_start_end_dates.js b/services/backend/shared/migrations/20181204_course_start_end_dates.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20181204_course_start_end_dates.js rename to services/backend/shared/migrations/20181204_course_start_end_dates.js diff --git a/services/oodikone2-backend/src/database/migrations/20181205_max_course_attainment_date.js b/services/backend/shared/migrations/20181205_max_course_attainment_date.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20181205_max_course_attainment_date.js rename to services/backend/shared/migrations/20181205_max_course_attainment_date.js diff --git a/services/oodikone2-backend/src/database/migrations/20181207_min_course_attainment_date.js b/services/backend/shared/migrations/20181207_min_course_attainment_date.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20181207_min_course_attainment_date.js rename to services/backend/shared/migrations/20181207_min_course_attainment_date.js diff --git a/services/oodikone2-backend/src/database/migrations/20182709_add_is_studymodule.js b/services/backend/shared/migrations/20182709_add_is_studymodule.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20182709_add_is_studymodule.js rename to services/backend/shared/migrations/20182709_add_is_studymodule.js diff --git a/services/oodikone2-backend/src/database/migrations/20190109_remove_users_from_database.js b/services/backend/shared/migrations/20190109_remove_users_from_database.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20190109_remove_users_from_database.js rename to services/backend/shared/migrations/20190109_remove_users_from_database.js diff --git a/services/oodikone2-backend/src/database/migrations/20190116_01_create_course_groups.js b/services/backend/shared/migrations/20190116_01_create_course_groups.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20190116_01_create_course_groups.js rename to services/backend/shared/migrations/20190116_01_create_course_groups.js diff --git a/services/oodikone2-backend/src/database/migrations/20190116_02_create_course_groups.js b/services/backend/shared/migrations/20190116_02_create_course_groups.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20190116_02_create_course_groups.js rename to services/backend/shared/migrations/20190116_02_create_course_groups.js diff --git a/services/oodikone2-backend/src/database/migrations/20190128_seed_teacher_course_groups.js b/services/backend/shared/migrations/20190128_seed_teacher_course_groups.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20190128_seed_teacher_course_groups.js rename to services/backend/shared/migrations/20190128_seed_teacher_course_groups.js diff --git a/services/oodikone2-backend/src/database/migrations/20190129_00_create_mandatory_courses_table.js b/services/backend/shared/migrations/20190129_00_create_mandatory_courses_table.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20190129_00_create_mandatory_courses_table.js rename to services/backend/shared/migrations/20190129_00_create_mandatory_courses_table.js diff --git a/services/oodikone2-backend/src/database/migrations/20190129_01_seed_medical_mandatory_courses.js b/services/backend/shared/migrations/20190129_01_seed_medical_mandatory_courses.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20190129_01_seed_medical_mandatory_courses.js rename to services/backend/shared/migrations/20190129_01_seed_medical_mandatory_courses.js diff --git a/services/oodikone2-backend/src/database/migrations/20190129_02_add_course_groups_programme.js b/services/backend/shared/migrations/20190129_02_add_course_groups_programme.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20190129_02_add_course_groups_programme.js rename to services/backend/shared/migrations/20190129_02_add_course_groups_programme.js diff --git a/services/oodikone2-backend/src/database/migrations/20190220_remove_duplicate_teachers.js b/services/backend/shared/migrations/20190220_remove_duplicate_teachers.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20190220_remove_duplicate_teachers.js rename to services/backend/shared/migrations/20190220_remove_duplicate_teachers.js diff --git a/services/oodikone2-backend/src/database/migrations/20190321_create_thesis_courses.js b/services/backend/shared/migrations/20190321_create_thesis_courses.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20190321_create_thesis_courses.js rename to services/backend/shared/migrations/20190321_create_thesis_courses.js diff --git a/services/oodikone2-backend/src/database/migrations/20190404_01_add_errordata_table.js b/services/backend/shared/migrations/20190404_01_add_errordata_table.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20190404_01_add_errordata_table.js rename to services/backend/shared/migrations/20190404_01_add_errordata_table.js diff --git a/services/oodikone2-backend/src/database/migrations/20190404_02_add_createdAt_updatedAt_to_errordata.js b/services/backend/shared/migrations/20190404_02_add_createdAt_updatedAt_to_errordata.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20190404_02_add_createdAt_updatedAt_to_errordata.js rename to services/backend/shared/migrations/20190404_02_add_createdAt_updatedAt_to_errordata.js diff --git a/services/oodikone2-backend/src/database/migrations/20190409_add_gender_info.js b/services/backend/shared/migrations/20190409_add_gender_info.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20190409_add_gender_info.js rename to services/backend/shared/migrations/20190409_add_gender_info.js diff --git a/services/oodikone2-backend/src/database/migrations/20190429_course_duplicates.js b/services/backend/shared/migrations/20190429_course_duplicates.js similarity index 100% rename from services/oodikone2-backend/src/database/migrations/20190429_course_duplicates.js rename to services/backend/shared/migrations/20190429_course_duplicates.js diff --git a/services/oodikone2-backend/src/models/index.js b/services/backend/shared/models/index.js similarity index 100% rename from services/oodikone2-backend/src/models/index.js rename to services/backend/shared/models/index.js diff --git a/services/oodikone2-backend/src/models/queries.js b/services/backend/shared/models/queries.js similarity index 100% rename from services/oodikone2-backend/src/models/queries.js rename to services/backend/shared/models/queries.js diff --git a/services/backend/updater_writer/.dockerignore b/services/backend/updater_writer/.dockerignore new file mode 100644 index 0000000000..3c3629e647 --- /dev/null +++ b/services/backend/updater_writer/.dockerignore @@ -0,0 +1 @@ +node_modules diff --git a/services/backend/updater_writer/.gitignore b/services/backend/updater_writer/.gitignore new file mode 100644 index 0000000000..8afa6668a6 --- /dev/null +++ b/services/backend/updater_writer/.gitignore @@ -0,0 +1,4 @@ +node_modules + +models +migrations diff --git a/services/backend/updater_writer/Dockerfile b/services/backend/updater_writer/Dockerfile new file mode 100644 index 0000000000..28bd635065 --- /dev/null +++ b/services/backend/updater_writer/Dockerfile @@ -0,0 +1,19 @@ +FROM node:10 + +COPY ./updater_writer /usr/src/app +COPY ./shared/models /usr/src/app/models +COPY ./shared/migrations /usr/src/app/database/migrations +WORKDIR /usr/src/app +RUN npm ci + +COPY ./updater_writer/package.json /usr/src/cache/package.json +COPY ./updater_writer/package-lock.json /usr/src/cache/package-lock.json + +ARG NODE_ENV=production +ENV NODE_ENV=${NODE_ENV} +RUN if [ "${NODE_ENV}" != "production" ]; then cp -r /usr/src/app/node_modules /usr/src/cache/node_modules; fi + +ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.5.0/wait /wait +RUN chmod +x /wait + +CMD /wait && npm start diff --git a/services/updater_writer/conf-backend.js b/services/backend/updater_writer/conf-backend.js similarity index 100% rename from services/updater_writer/conf-backend.js rename to services/backend/updater_writer/conf-backend.js diff --git a/services/updater_writer/database/connection.js b/services/backend/updater_writer/database/connection.js similarity index 100% rename from services/updater_writer/database/connection.js rename to services/backend/updater_writer/database/connection.js diff --git a/services/updater_writer/database/seed_migrations.js b/services/backend/updater_writer/database/seed_migrations.js similarity index 100% rename from services/updater_writer/database/seed_migrations.js rename to services/backend/updater_writer/database/seed_migrations.js diff --git a/services/updater_writer/index.js b/services/backend/updater_writer/index.js similarity index 54% rename from services/updater_writer/index.js rename to services/backend/updater_writer/index.js index 3d10907b66..33b77874d1 100644 --- a/services/updater_writer/index.js +++ b/services/backend/updater_writer/index.js @@ -1,29 +1,32 @@ const stan = require('node-nats-streaming').connect('updaterNATS', process.env.HOSTNAME, process.env.NATS_URI); -const { updateStudent } = require('./updater/database_updater') +const { updateStudent, updateMeta, updateAttainmentMeta } = require('./updater/database_updater') const fs = require('fs') console.log(`STARTING WITH ${process.env.HOSTNAME} as id`) const opts = stan.subscriptionOptions(); opts.setManualAckMode(true); -opts.setAckWait(15 * 1000); // 5min +opts.setAckWait(30 * 60 * 1000); // 1min opts.setDeliverAllAvailable() opts.setDurableName('durable') opts.setMaxInFlight(1) stan.on('connect', function () { const sub = stan.subscribe('UpdateWrite', 'updater.workers', opts) + const attSub = stan.subscribe('UpdateAttainmentDates', opts) sub.on('message', async (msg) => { const data = JSON.parse(msg.getData()) if (data.studentInfo) { - fs.writeFileSync(`./updater/test_assets/${data.studentInfo.studentnumber}.json`, JSON.stringify(data)) - console.log('student got') + await updateStudent(data) } else { - fs.writeFileSync(`./updater/test_assets/meta.json`, JSON.stringify(data)) - console.log('meta got') + await updateMeta(data) } - // await updateStudent(data) msg.ack() - }); + stan.publish('status', `${data.studentInfo ? data.studentInfo.studentnumber : 'meta'}:DONE`, (err) => { if (err) console.log(err) }) + }) + attSub.on('message', async (_) => { + await updateAttainmentMeta() + msg.ack() + }) }) \ No newline at end of file diff --git a/services/updater_writer/package-lock.json b/services/backend/updater_writer/package-lock.json similarity index 100% rename from services/updater_writer/package-lock.json rename to services/backend/updater_writer/package-lock.json diff --git a/services/updater_writer/package.json b/services/backend/updater_writer/package.json similarity index 83% rename from services/updater_writer/package.json rename to services/backend/updater_writer/package.json index 0963ea6c31..6d021e15a5 100644 --- a/services/updater_writer/package.json +++ b/services/backend/updater_writer/package.json @@ -5,7 +5,7 @@ "main": "index.js", "scripts": { "test": "NODE_ENV=test jest --runInBand --verbose", - "test_docker": "docker exec -t oodikone_updater_writer_1 /bin/bash -c 'npm test'", + "test_docker": "docker exec -t updater_writer /bin/bash -c 'npm test'", "start": "node index.js", "dev": "nodemon index.js" }, diff --git a/services/backend/updater_writer/updater/database_updater.js b/services/backend/updater_writer/updater/database_updater.js new file mode 100644 index 0000000000..958de8ef22 --- /dev/null +++ b/services/backend/updater_writer/updater/database_updater.js @@ -0,0 +1,120 @@ +const { sequelize, } = require('../database/connection') + +const { + Student, Credit, Course, CreditTeacher, Teacher, + Organisation, CourseRealisationType, + Semester, CreditType, CourseType, Discipline, + CourseDisciplines, SemesterEnrollment, Provider, + CourseProvider, Studyright, StudyrightExtent, + ElementDetails, StudyrightElement, Transfers +} = require('../models/index') +const { updateAttainmentDates } = require('./update_attainment_dates') + +const deleteStudentStudyrights = async (studentnumber, transaction) => { + await Studyright.destroy({ + where: { + student_studentnumber: studentnumber + } + }, { transaction }) + await StudyrightElement.destroy({ + where: { + studentnumber + } + }, { transaction }) +} + +const updateAttainments = (studyAttainments, transaction) => studyAttainments.map(async ({ credit, creditTeachers, teachers, course }) => { + try { + await Promise.all([ + Course.upsert(course, { transaction }), + Credit.upsert(credit, { transaction }), + ]) + const { disciplines, providers, courseproviders } = course + await Promise.all([ + disciplines && disciplines.length > 0 && Promise.all(disciplines.map(courseDiscipline => CourseDisciplines.upsert(courseDiscipline, { transaction }))), + providers.length > 0 && Promise.all(providers.map(provider => Provider.upsert(provider, { transaction }))), + courseproviders.length > 0 && Promise.all( courseproviders.map(courseProvider => CourseProvider.upsert(courseProvider, { transaction }))), + teachers.length > 0 && Promise.all(teachers.map(teacher => Teacher.upsert(teacher, { transaction }))), + creditTeachers.length > 0 && Promise.all(creditTeachers.map(cT => CreditTeacher.upsert(cT, { transaction }))) + ]) + } catch (e) { + console.log(e) + } +}) + +const updateStudyRights = (studyRights, transaction) => studyRights.map(async ({ studyRightExtent, studyright, elementDetails, studyRightElements, transfers }) => { + await Promise.all([ + StudyrightExtent.upsert(studyRightExtent, { transaction }), + Studyright.create(studyright, { transaction }) + ]) + return Promise.all([ + Promise.all(elementDetails.map(elementdetails => ElementDetails.upsert(elementdetails, { transaction }))), + Promise.all(studyRightElements.map(StudyRightElement => StudyrightElement.create(StudyRightElement, { transaction }))), + Promise.all(transfers.map(transfer => Transfers.upsert(transfer, { transaction }))) + ]) +}) + +const updateStudent = async (student) => { + const { studentInfo, studyAttainments, semesterEnrollments, studyRights } = student + const transaction = await sequelize.transaction() + try { + await deleteStudentStudyrights(studentInfo.studentnumber, transaction) // this needs to be done because Oodi just deletes deprecated studyrights from students ( big yikes ) + + await Student.upsert(studentInfo, { transaction }) + await Promise.all(semesterEnrollments.map(SE => SemesterEnrollment.upsert(SE, { transaction }))) + if (studyAttainments) await Promise.all(updateAttainments(studyAttainments, transaction)) + + if (studyRights) await Promise.all(updateStudyRights(studyRights, transaction)) + + await transaction.commit() + } catch (err) { + console.log(err) + await transaction.rollback() + } +} +const updateAttainmentMeta = async () => { + try { + await updateAttainmentDates() + } catch (err) { + console.log(err) + } +} + +const updateMeta = async ({ + faculties, courseRealisationsTypes, + semesters, creditTypeCodes, courseTypeCodes, + disciplines, +}) => { + const transaction = await sequelize.transaction() + + try { + await Promise.all([ + Promise.all(courseTypeCodes.map(cT => + CourseType.upsert(cT, { transaction }) + )), + Promise.all(faculties.map(org => + Organisation.upsert(org, { transaction }) + )), + Promise.all(courseRealisationsTypes.map(cR => + CourseRealisationType.upsert(cR, { transaction }) + )), + Promise.all(semesters.map(s => + Semester.upsert(s, { transaction }) + )), + Promise.all(creditTypeCodes.map(cTC => + CreditType.upsert(cTC, { transaction }) + )), + Promise.all(disciplines.map(d => + Discipline.upsert(d, { transaction }) + )), + ]) + await transaction.commit() + } catch (err) { + await transaction.rollback() + console.log(err) + } + +} +module.exports = { + updateStudent, updateMeta, updateAttainmentMeta +} \ No newline at end of file diff --git a/services/updater_writer/updater/database_updater.test.js b/services/backend/updater_writer/updater/database_updater.test.js similarity index 99% rename from services/updater_writer/updater/database_updater.test.js rename to services/backend/updater_writer/updater/database_updater.test.js index ca438c0d6f..a9b9d8d73a 100644 --- a/services/updater_writer/updater/database_updater.test.js +++ b/services/backend/updater_writer/updater/database_updater.test.js @@ -1,4 +1,4 @@ -const { updateStudent, updateMeta } = require('./database_updater') +const { updateStudent, updateMeta, updateAttainmentMeta } = require('./database_updater') const { Student, Credit, Course, Organisation, CourseRealisationType, Semester, CreditType, CourseType, @@ -22,6 +22,7 @@ describe('Updater works', () => { await updateStudent(students[0]) await updateStudent(students[1]) await updateStudent(students[2]) + await updateAttainmentMeta() }) afterAll(async () => { diff --git a/services/updater_writer/updater/test_assets/meta.js b/services/backend/updater_writer/updater/test_assets/meta.js similarity index 100% rename from services/updater_writer/updater/test_assets/meta.js rename to services/backend/updater_writer/updater/test_assets/meta.js diff --git a/services/updater_writer/updater/test_assets/test_students.js b/services/backend/updater_writer/updater/test_assets/test_students.js similarity index 100% rename from services/updater_writer/updater/test_assets/test_students.js rename to services/backend/updater_writer/updater/test_assets/test_students.js diff --git a/services/updater_writer/updater/update_attainment_dates.js b/services/backend/updater_writer/updater/update_attainment_dates.js similarity index 100% rename from services/updater_writer/updater/update_attainment_dates.js rename to services/backend/updater_writer/updater/update_attainment_dates.js diff --git a/services/oodikone2-analytics/.dockerignore b/services/oodikone2-analytics/.dockerignore index dbf0821315..3c3629e647 100644 --- a/services/oodikone2-analytics/.dockerignore +++ b/services/oodikone2-analytics/.dockerignore @@ -1 +1 @@ -node_modules/* \ No newline at end of file +node_modules diff --git a/services/oodikone2-analytics/Dockerfile b/services/oodikone2-analytics/Dockerfile index 551690db4d..60f28a3f6f 100644 --- a/services/oodikone2-analytics/Dockerfile +++ b/services/oodikone2-analytics/Dockerfile @@ -1,18 +1,18 @@ FROM node:10 -RUN mkdir /usr/src/cache -WORKDIR /usr/src/cache - -COPY package.json ./ -COPY package-lock.json ./ -RUN npm ci - COPY . /usr/src/app WORKDIR /usr/src/app +RUN npm ci + +COPY package.json /usr/src/cache/package.json +COPY package-lock.json /usr/src/cache/package-lock.json ARG NODE_ENV=production ENV NODE_ENV=${NODE_ENV} -RUN if [ "${NODE_ENV}" = "production" ]; then mv /usr/src/cache/node_modules /usr/src/app/node_modules; else cp -r /usr/src/cache/node_modules/. /usr/src/app/node_modules/; fi +RUN if [ "${NODE_ENV}" != "production" ]; then cp -r /usr/src/app/node_modules /usr/src/cache/node_modules; fi + +ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.5.0/wait /wait +RUN chmod +x /wait EXPOSE 4568 -CMD ["npm", "start"] +CMD /wait && npm start diff --git a/services/oodikone2-analytics/index.js b/services/oodikone2-analytics/index.js index 40ff4db72d..383c640cdf 100644 --- a/services/oodikone2-analytics/index.js +++ b/services/oodikone2-analytics/index.js @@ -1,7 +1,7 @@ const express = require('express') const _ = require('lodash') const morgan = require('morgan') -const { redisClient } = require('./src/services/redis') +const { Productivity, Throughput } = require('./src/models') const app = express() const port = 4568 @@ -12,57 +12,61 @@ app.use(morgan('tiny')) app.get('/ping', (req, res) => res.json({ message: 'pong'})) -const getCached = async (key) => { - try { - const cached = await redisClient.getAsync(key) - if (cached) return JSON.parse(cached) - } catch (e) { - console.error(e) - } - return null +const formatProductivity = stats => { + const { id, updatedAt: lastUpdated, data, status } = stats + return { [id] : { lastUpdated, data, status } } } -const setCached = async (key, data) => { - try { - await redisClient.setAsync(key, JSON.stringify(data)) - } catch (e) { - console.error(e) - } +const formatThroughput = stats => { + const { id, updatedAt: lastUpdated, data, status } = stats + return { [id] : { lastUpdated, data, status } } } app.get('/productivity/:id', async (req, res) => { const { id } = req.params - const data = await getCached('productivity') - if (data && data[id]) res.json({ [id]: data[id] }) - else res.json(null) + const result = await Productivity.findByPk(id) + if (!result) { + res.json(null) + } else { + res.json(formatProductivity(result)) + } }) + app.post('/productivity', async (req, res) => { - const data = await getCached('productivity') - await setCached('productivity', { ...data, ...req.body.data }) - res.status(200).end() + const { data } = req.body + const [saved] = await Productivity.upsert({ ...data, status: 'DONE' }, { returning: true }) + const result = formatProductivity(saved) + res.json(result) }) + app.patch('/productivity', async (req, res) => { - const data = await getCached('productivity') - await setCached('productivity', _.merge(data, req.body.data)) + for (let [id, data] of Object.entries(req.body.data)) { + await Productivity.upsert({ ...data, id }) + } res.status(200).end() }) app.get('/throughput/:id', async (req, res) => { const { id } = req.params - const data = await getCached('throughput') - if (data && data[id]) res.json({ [id]: data[id] }) - else res.json(null) + const result = await Throughput.findByPk(id) + if (!result) { + res.json(null) + } else { + res.json(formatThroughput(result)) + } }) + app.post('/throughput', async (req, res) => { - const data = await getCached('throughput') - const newdata = _.extend(data, req.body.data) - await setCached('throughput', newdata) - res.status(200).end() + const { data } = req.body + const [saved] = await Throughput.upsert({ ...data, status: 'DONE' }, { returning: true }) + const result = formatThroughput(saved) + res.json(result) }) + app.patch('/throughput', async (req, res) => { - const data = await getCached('throughput') - await setCached('throughput', _.merge(data, req.body.data)) + for (let [id, data] of Object.entries(req.body.data)) { + await Throughput.upsert({ ...data, id }) + } res.status(200).end() }) - app.listen(port, () => console.log(`Analytics listening on port ${port}!`)) diff --git a/services/oodikone2-analytics/package-lock.json b/services/oodikone2-analytics/package-lock.json index 30ded55441..e22850ea31 100644 --- a/services/oodikone2-analytics/package-lock.json +++ b/services/oodikone2-analytics/package-lock.json @@ -599,11 +599,6 @@ "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.1.tgz", "integrity": "sha512-ch5OQgvGDK2u8pSZeSYAQaV/lczImd7pMJ7BcEPXmnFVjy4yJIzP6CsODJUTH8mg1tyH1Z2abOiuJO3DjZ/GBw==" }, - "double-ended-queue": { - "version": "2.1.0-0", - "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", - "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=" - }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", @@ -2358,26 +2353,6 @@ "readable-stream": "^2.0.2" } }, - "redis": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz", - "integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==", - "requires": { - "double-ended-queue": "^2.1.0-0", - "redis-commands": "^1.2.0", - "redis-parser": "^2.6.0" - } - }, - "redis-commands": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.4.0.tgz", - "integrity": "sha512-cu8EF+MtkwI4DLIT0x9P8qNTLFhQD4jLfxLR0cCNkeGzs87FN6879JOJwNQR/1zD7aSYNbU0hgsV9zGY71Itvw==" - }, - "redis-parser": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz", - "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=" - }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", diff --git a/services/oodikone2-analytics/package.json b/services/oodikone2-analytics/package.json index a4cb44f60e..ad99773caf 100644 --- a/services/oodikone2-analytics/package.json +++ b/services/oodikone2-analytics/package.json @@ -25,7 +25,6 @@ "lodash": "^4.17.11", "morgan": "^1.9.1", "pg": "^7.9.0", - "redis": "^2.8.0", "sequelize": "^5.3.0", "umzug": "^2.2.0" }, diff --git a/services/oodikone2-analytics/src/conf.js b/services/oodikone2-analytics/src/conf.js index 102bc794ad..943d20aea5 100644 --- a/services/oodikone2-analytics/src/conf.js +++ b/services/oodikone2-analytics/src/conf.js @@ -1,6 +1,6 @@ require('dotenv').config() -const { NODE_ENV, REDIS } = process.env +const { NODE_ENV } = process.env const isTest = NODE_ENV === 'test' const isDev = NODE_ENV === 'dev' @@ -10,7 +10,6 @@ const DB_SCHEMA = isTest ? 'test' : (process.env.DB_SCHEMA || 'public') const DB_URL = process.env.DB_URL module.exports = { - REDIS, DB_URL, DB_SCHEMA, isTest, isDev, diff --git a/services/oodikone2-analytics/src/database/migrations/190514_00_init_database.js b/services/oodikone2-analytics/src/database/migrations/190514_00_init_database.js new file mode 100644 index 0000000000..8d442e5012 --- /dev/null +++ b/services/oodikone2-analytics/src/database/migrations/190514_00_init_database.js @@ -0,0 +1,27 @@ +module.exports = { + up: async (queryInterface, Sequelize) => { + await queryInterface.createTable('productivity', { + id: { + type: Sequelize.STRING, + primaryKey: true + }, + data: Sequelize.JSONB, + status: Sequelize.STRING, + createdAt: Sequelize.DATE, + updatedAt: Sequelize.DATE, + }) + await queryInterface.createTable('throughput', { + id: { + type: Sequelize.STRING, + primaryKey: true + }, + data: Sequelize.JSONB, + status: Sequelize.STRING, + createdAt: Sequelize.DATE, + updatedAt: Sequelize.DATE, + }) + }, + down: (queryInterface) => { + return null + } + } \ No newline at end of file diff --git a/services/oodikone2-analytics/src/models/index.js b/services/oodikone2-analytics/src/models/index.js new file mode 100644 index 0000000000..13ca1e14ef --- /dev/null +++ b/services/oodikone2-analytics/src/models/index.js @@ -0,0 +1,32 @@ + +const Sequelize = require('sequelize') +const { sequelize } = require('../database/connection') + +const Throughput = sequelize.define('throughput', { + id: { + type: Sequelize.STRING, + primaryKey: true + }, + data: Sequelize.JSONB, + status: Sequelize.STRING +},{ + timestamps: true, + tableName: 'throughput' +}) + +const Productivity = sequelize.define('productivity', { + id: { + type: Sequelize.STRING, + primaryKey: true + }, + data: Sequelize.JSONB, + status: Sequelize.STRING +},{ + timestamps: true, + tableName: 'productivity' +}) + +module.exports = { + Throughput, + Productivity +} \ No newline at end of file diff --git a/services/oodikone2-analytics/src/services/redis.js b/services/oodikone2-analytics/src/services/redis.js deleted file mode 100644 index 1102115fbd..0000000000 --- a/services/oodikone2-analytics/src/services/redis.js +++ /dev/null @@ -1,11 +0,0 @@ -const redis = require('redis') -const bluebird = require('bluebird') -const conf = require('../conf') - -bluebird.promisifyAll(redis.RedisClient.prototype) - -const redisClient = redis.createClient(6379, conf.REDIS) - -module.exports = { - redisClient -} \ No newline at end of file diff --git a/services/oodikone2-backend/.dockerignore b/services/oodikone2-backend/.dockerignore deleted file mode 100644 index dbf0821315..0000000000 --- a/services/oodikone2-backend/.dockerignore +++ /dev/null @@ -1 +0,0 @@ -node_modules/* \ No newline at end of file diff --git a/services/oodikone2-backend/Dockerfile b/services/oodikone2-backend/Dockerfile deleted file mode 100644 index 90b0e26e62..0000000000 --- a/services/oodikone2-backend/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -FROM node:10 - -RUN mkdir /usr/src/cache -WORKDIR /usr/src/cache - -COPY package.json ./ -COPY package-lock.json ./ -RUN npm ci - -COPY . /usr/src/app -WORKDIR /usr/src/app - -ARG NODE_ENV=production -ENV NODE_ENV=${NODE_ENV} -RUN if [ "${NODE_ENV}" = "production" ]; then mv /usr/src/cache/node_modules /usr/src/app/node_modules; else cp -r /usr/src/cache/node_modules/. /usr/src/app/node_modules/; fi - -EXPOSE 8080 -CMD ["npm", "start"] diff --git a/services/oodikone2-backend/src/database/data/medicalcodes.js b/services/oodikone2-backend/src/database/data/medicalcodes.js deleted file mode 100644 index d3c73b3634..0000000000 --- a/services/oodikone2-backend/src/database/data/medicalcodes.js +++ /dev/null @@ -1,78 +0,0 @@ -const codes = ['MED-11', - '375060', - 'DIGI-300', - 'MED-12', - '375005', - 'MED-13', - '375004', - '375002', - '375003', - 'KK-ENLAAK', - 'MED-21', - 'MED-222', - 'MED-262', - 'MED-27', - // 'MED-271', Ei löydy - // 'MED-272', - // 'MED-273', - '375009', - '375010', - '375011', - '375012', - '30259', - '375057', - '375050', - '375051', - 'KK-RULAAK', - 'KK-RUKIRJ', - 'MED-25', - 'MED-32', - '30243', - '375018', - 'MED-33', - 'MED-34', - 'MED-35', - 'MED-57', - 'MED-36', - 'MED-37', - 'MED-38', - 'MED-39', - 'MED-310', - 'MED-311', - 'MED-319', - 'MED-312', - 'MED-313', - 'MED-320', - 'MED-321', - 'MED-314', - 'MED-315', - 'MED-22', - 'MED-26', - 'MED-318', - 'MED-51', - '375031', - '375034', - 'MED-52', - 'MED-53', - '375054', - 'MED-54', - '375037', - '375038', - // 'MED-55', - 'MED-64', - 'MED-65', - // 'MED-66', - 'MED-67', - '30480', - // 'MED-61', - '30001', - 'MED-68', - 'MED-69', - 'MED-70', - 'MED-71', - 'MED-62', - 'MED-63', - 'MED-72' -] - -module.exports = codes.map(code => ({ course_code: code, studyprogramme_id: 'MH30_001' })) diff --git a/services/oodikone2-backend/src/database/data/teacher_course_groups.js b/services/oodikone2-backend/src/database/data/teacher_course_groups.js deleted file mode 100644 index 61361edd64..0000000000 --- a/services/oodikone2-backend/src/database/data/teacher_course_groups.js +++ /dev/null @@ -1,168 +0,0 @@ -module.exports = { - teacherStudyGroups: [ - { teacher_id: '109364', course_group_name: 'Suomen kieli ja kirjallisuus' }, - { teacher_id: '011665', course_group_name: 'Varhaiskasvatus (VO+VAKAMO)' }, - { teacher_id: '017715', course_group_name: 'Erityispedagogiikka' }, - { teacher_id: '036958', course_group_name: 'Kotitaloustiede' }, - { teacher_id: '107389', course_group_name: 'Biologia ja maantiede' }, - { teacher_id: '093264', course_group_name: 'Kotitaloustiede' }, - { teacher_id: '064846', course_group_name: 'Yleinen ja aikuiskasvatustiede' }, - { teacher_id: '054676', course_group_name: 'Kuvataide' }, - { teacher_id: '076503', course_group_name: 'Musiikki' }, - { teacher_id: '024119', course_group_name: 'Varhaiskasvatus (VO+VAKAMO)' }, - { teacher_id: '059839', course_group_name: 'Yleinen ja aikuiskasvatustiede' }, - { teacher_id: '025025', course_group_name: 'Kasvatustiede, yleinen didaktiikka' }, - { teacher_id: '034014', course_group_name: 'Biologia ja maantiede' }, - { teacher_id: '095584', course_group_name: 'Kasvatustiede, yleinen didaktiikka' }, - { teacher_id: '072513', course_group_name: 'Käsityötiede' }, - { teacher_id: '377364', course_group_name: 'Varhaiskasvatus (VO+VAKAMO)' }, - { teacher_id: '377361', course_group_name: 'Svenska studier' }, - { teacher_id: '019698', course_group_name: 'Suomen kieli ja kirjallisuus' }, - { teacher_id: '112310', course_group_name: 'Vieraat kielet' }, - { teacher_id: '010361', course_group_name: 'Yleinen ja aikuiskasvatustiede' }, - { teacher_id: '017692', course_group_name: 'Matematiikka' }, - { teacher_id: '010840', course_group_name: 'Suomen kieli ja kirjallisuus' }, - { teacher_id: '075974', course_group_name: 'Svenska studier' }, - { teacher_id: '039581', course_group_name: 'Vieraat kielet' }, - { teacher_id: '097401', course_group_name: 'Svenska studier' }, - { teacher_id: '085805', course_group_name: 'Kasvatustiede, yleinen didaktiikka' }, - { teacher_id: '014891', course_group_name: 'Yleinen ja aikuiskasvatustiede' }, - { teacher_id: '379590', course_group_name: 'Yleinen ja aikuiskasvatustiede' }, - { teacher_id: '019051', course_group_name: 'Erityispedagogiikka' }, - { teacher_id: '084849', course_group_name: 'Kotitaloustiede' }, - { teacher_id: '049186', course_group_name: 'Kasvatustiede, yleinen didaktiikka' }, - { teacher_id: '066227', course_group_name: 'Suomen kieli ja kirjallisuus' }, - { teacher_id: '021488', course_group_name: 'Kasvatustiede, yleinen didaktiikka' }, - { teacher_id: '060878', course_group_name: 'Biologia ja maantiede' }, - { teacher_id: '376834', course_group_name: 'Svenska studier' }, - { teacher_id: '015984', course_group_name: 'Kuvataide' }, - { teacher_id: '028213', course_group_name: 'Svenska studier' }, - { teacher_id: '127775', course_group_name: 'Varhaiskasvatus (VO+VAKAMO)' }, - { teacher_id: '110694', course_group_name: 'Käsityötiede' }, - { teacher_id: '032147', course_group_name: 'Kasvatuspsykologia' }, - { teacher_id: '045329', course_group_name: 'Käsityötiede' }, - { teacher_id: '040233', course_group_name: 'Käsityötiede' }, - { teacher_id: '128474', course_group_name: 'Kasvatuspsykologia' }, - { teacher_id: '128474', course_group_name: 'Erityispedagogiikka' }, - { teacher_id: '035533', course_group_name: 'Kotitaloustiede' }, - { teacher_id: '133416', course_group_name: 'Käsityötiede' }, - { teacher_id: '097410', course_group_name: 'Suomen kieli ja kirjallisuus' }, - { teacher_id: '053532', course_group_name: 'Erityispedagogiikka' }, - { teacher_id: '030408', course_group_name: 'Kotitaloustiede' }, - { teacher_id: '102226', course_group_name: 'Svenska studier' }, - { teacher_id: '029326', course_group_name: 'Kasvatustiede, yleinen didaktiikka' }, - { teacher_id: '019715', course_group_name: 'Matematiikka' }, - { teacher_id: '071473', course_group_name: 'Varhaiskasvatus (VO+VAKAMO)' }, - { teacher_id: '043392', course_group_name: 'Liikunta' }, - { teacher_id: '024056', course_group_name: 'Mediakasvatus' }, - { teacher_id: '055608', course_group_name: 'Fysiikka ja kemia' }, - { teacher_id: '054542', course_group_name: 'Käsityötiede' }, - { teacher_id: '046079', course_group_name: 'Matematiikka' }, - { teacher_id: '086409', course_group_name: 'Fysiikka ja kemia' }, - { teacher_id: '023165', course_group_name: 'Fysiikka ja kemia' }, - { teacher_id: '035696', course_group_name: 'Varhaiskasvatus (VO+VAKAMO)' }, - { teacher_id: '037452', course_group_name: 'Svenska studier' }, - { teacher_id: '017253', course_group_name: 'Historia ja yhteiskuntaoppi' }, - { teacher_id: '012926', course_group_name: 'Kasvatuspsykologia' }, - { teacher_id: '372082', course_group_name: 'Svenska studier' }, - { teacher_id: '068683', course_group_name: 'Kasvatustiede, yleinen didaktiikka' }, - { teacher_id: '026128', course_group_name: 'Kotitaloustiede' }, - { teacher_id: '046280', course_group_name: 'Kotitaloustiede' }, - { teacher_id: '070442', course_group_name: 'Svenska studier' }, - { teacher_id: '057119', course_group_name: 'Svenska studier' }, - { teacher_id: '039239', course_group_name: 'Varhaiskasvatus (VO+VAKAMO)' }, - { teacher_id: '049322', course_group_name: 'Varhaiskasvatus (VO+VAKAMO)' }, - { teacher_id: '065732', course_group_name: 'Kuvataide' }, - { teacher_id: '033901', course_group_name: 'Kasvatustiede, yleinen didaktiikka' }, - { teacher_id: '031001', course_group_name: 'Yleinen ja aikuiskasvatustiede' }, - { teacher_id: '017304', course_group_name: 'Kotitaloustiede' }, - { teacher_id: '013833', course_group_name: 'Yleinen ja aikuiskasvatustiede' }, - { teacher_id: '371711', course_group_name: 'Varhaiskasvatus (VO+VAKAMO)' }, - { teacher_id: '122760', course_group_name: 'Matematiikka' }, - { teacher_id: '122780', course_group_name: 'Musiikki' }, - { teacher_id: '066993', course_group_name: 'Kasvatuspsykologia' }, - { teacher_id: '068093', course_group_name: 'Käsityötiede' }, - { teacher_id: '029108', course_group_name: 'Historia ja yhteiskuntaoppi' }, - { teacher_id: '014754', course_group_name: 'Kotitaloustiede' }, - { teacher_id: '031809', course_group_name: 'Varhaiskasvatus (VO+VAKAMO)' }, - { teacher_id: '014324', course_group_name: 'Musiikki' }, - { teacher_id: '018718', course_group_name: 'Varhaiskasvatus (VO+VAKAMO)' }, - { teacher_id: '069120', course_group_name: 'Varhaiskasvatus (VO+VAKAMO)' }, - { teacher_id: '037209', course_group_name: 'Yleinen ja aikuiskasvatustiede' }, - { teacher_id: '014190', course_group_name: 'Historia ja yhteiskuntaoppi' }, - { teacher_id: '052873', course_group_name: 'Historia ja yhteiskuntaoppi' }, - { teacher_id: '015332', course_group_name: 'Svenska studier' }, - { teacher_id: '018390', course_group_name: 'Aikuisopetus' }, - { teacher_id: '016360', course_group_name: 'Svenska studier' }, - { teacher_id: '377362', course_group_name: 'Svenska studier' }, - { teacher_id: '022114', course_group_name: 'Yleinen ja aikuiskasvatustiede' }, - { teacher_id: '034437', course_group_name: 'Käsityötiede' }, - { teacher_id: '119830', course_group_name: 'Kotitaloustiede' }, - { teacher_id: '073544', course_group_name: 'Varhaiskasvatus (VO+VAKAMO)' }, - { teacher_id: '133609', course_group_name: 'Svenska studier' }, - { teacher_id: '054115', course_group_name: 'Kotitaloustiede' }, - { teacher_id: '028579', course_group_name: 'Erityispedagogiikka' }, - { teacher_id: '036559', course_group_name: 'Käsityötiede' }, - { teacher_id: '031422', course_group_name: 'Suomen kieli ja kirjallisuus' }, - { teacher_id: '036199', course_group_name: 'Erityispedagogiikka' }, - { teacher_id: '016739', course_group_name: 'Biologia ja maantiede' }, - { teacher_id: '083257', course_group_name: 'Erityispedagogiikka' }, - { teacher_id: '017863', course_group_name: 'Kasvatustiede, yleinen didaktiikka' }, - { teacher_id: '025374', course_group_name: 'Draama' }, - { teacher_id: '092845', course_group_name: 'Svenska studier' }, - { teacher_id: '082660', course_group_name: 'Svenska studier' }, - { teacher_id: '062427', course_group_name: 'Yleinen ja aikuiskasvatustiede' }, - { teacher_id: '014715', course_group_name: 'Biologia ja maantiede' }, - { teacher_id: '089822', course_group_name: 'Erityispedagogiikka' }, - { teacher_id: '373978', course_group_name: 'Varhaiskasvatus (VO+VAKAMO)' }, - { teacher_id: '029093', course_group_name: 'Liikunta' }, - { teacher_id: '083583', course_group_name: 'Yleinen ja aikuiskasvatustiede' }, - { teacher_id: '383380', course_group_name: 'Käsityötiede' }, - { teacher_id: '030708', course_group_name: 'Varhaiskasvatus (VO+VAKAMO)' }, - { teacher_id: '013815', course_group_name: 'Varhaiskasvatus (VO+VAKAMO)' }, - { teacher_id: '057321', course_group_name: 'Svenska studier' }, - { teacher_id: '357805', course_group_name: 'Svenska studier' }, - { teacher_id: '071551', course_group_name: 'Svenska studier' }, - { teacher_id: '121572', course_group_name: 'Kasvatuspsykologia' }, - { teacher_id: '110949', course_group_name: 'Svenska studier' }, - { teacher_id: '121401', course_group_name: 'Svenska studier' }, - { teacher_id: '116169', course_group_name: 'Matematiikka' }, - { teacher_id: '118399', course_group_name: 'Matematiikka' }, - { teacher_id: '092959', course_group_name: 'Yleinen ja aikuiskasvatustiede' }, - { teacher_id: '358382', course_group_name: 'Varhaiskasvatus (VO+VAKAMO)' }, - { teacher_id: '368691', course_group_name: 'Kasvatustiede, yleinen didaktiikka' }, - { teacher_id: '087652', course_group_name: 'Svenska studier' }, - { teacher_id: '097702', course_group_name: 'Svenska studier' }, - { teacher_id: '102190', course_group_name: 'Kasvatuspsykologia' }, - { teacher_id: '377363', course_group_name: 'Erityispedagogiikka' }, - { teacher_id: '113631', course_group_name: 'Svenska studier' }, - { teacher_id: '083933', course_group_name: 'Yleinen ja aikuiskasvatustiede' }, - { teacher_id: '103894', course_group_name: 'Fysiikka ja kemia' }, - { teacher_id: '131739', course_group_name: 'Svenska studier' }, - { teacher_id: '368413', course_group_name: 'Musiikki' }, - { teacher_id: '049660', course_group_name: 'Yleinen ja aikuiskasvatustiede' }, - { teacher_id: '057970', course_group_name: 'Yleinen ja aikuiskasvatustiede' }, - { teacher_id: '136379', course_group_name: 'Biologia ja maantiede' }, - { teacher_id: '072134', course_group_name: 'Biologia ja maantiede' }, - { teacher_id: '118043', course_group_name: 'Kasvatuspsykologia' }, - { teacher_id: '070816', course_group_name: 'Matematiikka' }, - { teacher_id: '082726', course_group_name: 'Yleinen ja aikuiskasvatustiede' }, - { teacher_id: '055608', course_group_name: 'Fysiikka ja kemia' }, - { teacher_id: '031753', course_group_name: 'Kasvatustiede, yleinen didaktiikka' }, - { teacher_id: '127305', course_group_name: 'Yleinen ja aikuiskasvatustiede' }, - { teacher_id: '128965', course_group_name: 'Yleinen ja aikuiskasvatustiede' }, - { teacher_id: '118202', course_group_name: 'Yleinen ja aikuiskasvatustiede' }, - { teacher_id: '054676', course_group_name: 'Kuvataide' }, - { teacher_id: '061929', course_group_name: 'Kotitaloustiede' }, - { teacher_id: '104847', course_group_name: 'Historia ja yhteiskuntaoppi' }, - { teacher_id: '359620', course_group_name: 'Varhaiskasvatus (VO+VAKAMO)' }, - { teacher_id: '135569', course_group_name: 'Käsityötiede' }, - { teacher_id: '120406', course_group_name: 'Käsityötiede' }, - { teacher_id: '114801', course_group_name: 'Musiikki' }, - { teacher_id: '126573', course_group_name: 'Fysiikka ja kemia' }, - { teacher_id: '065997', course_group_name: 'Kasvatuspsykologia' }, - { teacher_id: '049574', course_group_name: 'Kotitaloustiede' }, - { teacher_id: '126046', course_group_name: 'Yleinen ja aikuiskasvatustiede' }, - { teacher_id: '103788', course_group_name: 'Yleinen ja aikuiskasvatustiede' } - ] -} diff --git a/services/oodikone2-frontend/.dockerignore b/services/oodikone2-frontend/.dockerignore index 3659f1ad7d..f06235c460 100644 --- a/services/oodikone2-frontend/.dockerignore +++ b/services/oodikone2-frontend/.dockerignore @@ -1,2 +1,2 @@ -node_modules/* -dist/* +node_modules +dist diff --git a/services/oodikone2-frontend/Dockerfile b/services/oodikone2-frontend/Dockerfile index ae381dfefd..a58181e0fb 100644 --- a/services/oodikone2-frontend/Dockerfile +++ b/services/oodikone2-frontend/Dockerfile @@ -3,22 +3,21 @@ FROM node:10 ARG BASE_PATH ENV BASE_PATH=$BASE_PATH -RUN mkdir /usr/src/cache -WORKDIR /usr/src/cache - -COPY package.json ./ -COPY package-lock.json ./ -RUN npm ci - COPY . /usr/src/app WORKDIR /usr/src/app +RUN npm ci + +COPY package.json /usr/src/cache/package.json +COPY package-lock.json /usr/src/cache/package-lock.json ARG NODE_ENV=production ENV NODE_ENV=${NODE_ENV} -RUN if [ "${NODE_ENV}" = "production" ]; then mv /usr/src/cache/node_modules /usr/src/app/node_modules; else cp -r /usr/src/cache/node_modules/. /usr/src/app/node_modules/; fi +RUN if [ "${NODE_ENV}" != "production" ]; then cp -r /usr/src/app/node_modules /usr/src/cache/node_modules; fi + +RUN if [ "${NODE_ENV}" != "development" ]; then npm run dist && npm install -g serve; fi -RUN npm run dist -RUN npm install -g serve +ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.5.0/wait /wait +RUN chmod +x /wait EXPOSE 5000 -CMD ["serve", "-s", "-l", "5000", "dist"] +CMD /wait && serve -s -l 5000 dist diff --git a/services/oodikone2-frontend/src/components/CourseCodeMapper/courseCodeMapper.css b/services/oodikone2-frontend/src/components/CourseCodeMapper/courseCodeMapper.css deleted file mode 100644 index 06a4236e05..0000000000 --- a/services/oodikone2-frontend/src/components/CourseCodeMapper/courseCodeMapper.css +++ /dev/null @@ -1,3 +0,0 @@ -.button { - margin-top: 10px !important; -} diff --git a/services/oodikone2-frontend/src/components/CourseCodeMapper/index.jsx b/services/oodikone2-frontend/src/components/CourseCodeMapper/index.jsx index 7632abbe03..3ec26c5331 100644 --- a/services/oodikone2-frontend/src/components/CourseCodeMapper/index.jsx +++ b/services/oodikone2-frontend/src/components/CourseCodeMapper/index.jsx @@ -2,13 +2,15 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' import _ from 'lodash' import { connect } from 'react-redux' -import { Header, Button, Message, Table, Input, Segment, Icon, Loader, Label } from 'semantic-ui-react' +import { Button, Message, Table, Segment, Icon, Loader, Label, Grid } from 'semantic-ui-react' import { getDuplicates, addDuplicate, removeDuplicate } from '../../redux/coursecodeduplicates' import CourseSearch from '../CourseSearch' -import './courseCodeMapper.css' import { getTextIn } from '../../common' import { findCourses } from '../../redux/courses' +import { + getMandatoryCourses +} from '../../redux/populationMandatoryCourses' const { func, shape, string, objectOf, arrayOf, bool } = PropTypes @@ -16,13 +18,11 @@ class CourseCodeMapper extends Component { constructor(props) { super(props) props.getDuplicates(props.studyprogramme) + props.getMandatoryCourses(props.studyprogramme) } state = { - codeFilter: '', - nameFilter: '', - code1: '', - code2: '' + codes: {} } getName = (name) => { @@ -31,18 +31,15 @@ class CourseCodeMapper extends Component { } getTableRows = () => { - const { courseCodeDuplicates } = this.props - const { codeFilter, nameFilter } = this.state + const { courseCodeDuplicates, mandatoryCourses, findCoursesDispatch } = this.props const { data } = courseCodeDuplicates - const filteredKeys = Object.keys(data) - .filter(k => data[k].some(e => e.code.toLocaleLowerCase().includes(codeFilter.toLocaleLowerCase()))) - .filter(k => data[k].some(e => this.getName(e.name).toLocaleLowerCase().includes(nameFilter.toLocaleLowerCase()))) - const rows = filteredKeys.map((key) => { - const duplicates = _.sortBy(courseCodeDuplicates.data[key], ['code']) - const maincourse = duplicates.find(e => e.code === key) + const find = (query, language) => findCoursesDispatch(query, language) + const rows = mandatoryCourses.data.map((course) => { + const maincode = Object.keys(data).find(k => data[k].map(e => e.code).includes(course.code)) + const duplicates = maincode ? _.orderBy(data[maincode].filter(e => e.code !== course.code), ['code'], ['ASC']) : [] return ( -